<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Hacker News Personal Blogs 2015 | Top 100 Blogs</title><link>https://hn-blogs.kronis.dev/feed-top100.xml</link><description>A collection of blog posts from users of Hacker News, based on RSS feeds.</description><language>en-US</language><lastBuildDate>Sat, 13 Jun 2026 04:03:20 GMT</lastBuildDate><generator>rfeed v1.1.1</generator><docs>https://github.com/svpino/rfeed/blob/master/README.md</docs><item><title>My top 10 Postgres features and tips for 2016</title><link>/2015/12/29/My-top-10-Postgres-features-and-tips-for-2016/</link><description>&lt;p&gt;I find during the holiday season many pick up &lt;a href="http://www.amazon.com/Hard-Thing-About-Things-Building/dp/0062273205/ref=sr_1_1?ie=UTF8&amp;amp;qid=1451407536&amp;amp;sr=8-1&amp;amp;keywords=hard+thing+about&amp;amp;tag=mypred-20"&gt;new books&lt;/a&gt;, learn a &lt;a href="http://crystal-lang.org/"&gt;new language&lt;/a&gt;, or brush up on some other skill in general. Here&amp;rsquo;s my contribution to hopefully giving you a few new things to learn about Postgres and ideally utilize in the new year. It&amp;rsquo;s not in a top 10 list as much as 10 tips and tricks you should be aware of as when you need them they become incredibly handy. But, first a shameless plug if you find any of the following helpful, consider subscribing to &lt;a href="http://www.postgresweekly.com"&gt;Postgres weekly&lt;/a&gt; a weekly newsletter with interesting Postgres content.&lt;/p&gt;
&lt;h3 id="1-ctes---common-table-expressions"&gt;
&lt;div&gt;
1. CTEs - Common Table Expressions
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;CTEs allow you to do crazy awesome things like recursive queries but even the most simple form of them I don&amp;rsquo;t go a day without using. Think of a CTE or commonly known as with clause as a view inside the time that query is running. This lets you more easily create readable query. Any query that&amp;rsquo;s constructed that&amp;rsquo;s even &lt;a href="/2013/11/18/best-postgres-feature-youre-not-using/"&gt;100 lines long&lt;/a&gt;, but with 4-5 CTEs is undoubtedly going to be easier for someone new to come in and understand than a 20 line query that does the same thing. A few people like writing SQL, but no one likes reading someone else&amp;rsquo;s so do them a favor and read up on CTEs.&lt;/p&gt;
&lt;h3 id="2-setup-a-psqlrc"&gt;
&lt;div&gt;
2. Setup a .psqlrc
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;You setup a bashrc, vimrc, etc. Why not do the same for Postgres. Some of the great things you can do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Setup pretty formatting by default with &lt;code&gt;\x auto&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Set nulls to actually look like something &lt;code&gt;\pset null ¤&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Turn timing on by default &lt;code&gt;\timing on&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Customize your prompt &lt;code&gt;\set PROMPT1 '%[%033[33;1m%]%x%[%033[0m%]%[%033[1m%]%/%[%033[0m%]%R%# '&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Save commonly run queries that you can run by name&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s an example of my own &lt;code&gt;psqlrc&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\set QUIET 1
\pset null '¤'
-- Customize prompts
\set PROMPT1 '%[%033[1m%][%/] # '
\set PROMPT2 '... # '
-- Show how long each query takes to execute
\timing
-- Use best available output format
\x auto
\set VERBOSITY verbose
\set HISTFILE ~/.psql_history- :DBNAME
\set HISTCONTROL ignoredups
\set COMP_KEYWORD_CASE upper
\unset QUIET
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="3-pg_stat_statements-for-where-to-index"&gt;
&lt;div&gt;
3. pg_stat_statements for where to index
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pg_stat_statements&lt;/code&gt; is probably the single most valuable tool for improving performance on your database. Once enabled (with &lt;code&gt;create extension pg_stat_statements&lt;/code&gt;) it automatically records all queries run against your database and records often and how long they took. This allows you to then go and find areas you can optimize to get overall time back with one simple query:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT
(total_time / 1000 / 60) as total_minutes,
(total_time/calls) as average_time,
query
FROM pg_stat_statements
ORDER BY 1 DESC
LIMIT 100;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Yes, there is some performance cost to leaving this always on, but it&amp;rsquo;s pretty small. I&amp;rsquo;ve found it&amp;rsquo;s far more useful to be on and get major performance wins vs. the small cost of it always recording.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You can read much more on Postgres performance on a &lt;a href="http://www.craigkerstiens.com/2013/01/10/more-on-postgres-performance/"&gt;previous post&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="4-slow-down-with-etl-use-fdws"&gt;
&lt;div&gt;
4. Slow down with ETL, use FDWs
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If you have a lot of &lt;em&gt;microservices&lt;/em&gt; or different apps then you likely have a lot of different databases backing them. The default for about anything you want to do is do create some data warehouse and ETL it all together. This often goes a bit too far to the extreme of aggregating &lt;strong&gt;everything&lt;/strong&gt; together.&lt;/p&gt;
&lt;p&gt;For the times you just need to pull something together once or on rare occasion &lt;a href="http://www.craigkerstiens.com/2013/08/05/a-look-at-FDWs/"&gt;foreign data wrappers&lt;/a&gt; will let you query from one Postgres database to another, or potentially from Postgres to anything else such as &lt;a href="https://github.com/citusdata/mongo_fdw"&gt;Mongo&lt;/a&gt; or Redis.&lt;/p&gt;
&lt;h3 id="5-array-and-array_agg"&gt;
&lt;div&gt;
5. array and array_agg
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s little chance if you&amp;rsquo;re building an app you&amp;rsquo;re not using arrays somewhere within it. There&amp;rsquo;s no reason you shouldn&amp;rsquo;t be doing the same within your database as well. Arrays can be just another datatype within Postgres and have some great use cases like tags for blog posts directly in a single column.&lt;/p&gt;
&lt;p&gt;But, even if you&amp;rsquo;re not using arrays as a datatype there&amp;rsquo;s often a time when you want to rollup something like an array in a query then comma separate it. Something similar to the following could allow you to easily roll up a comma separated list of projects per user:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT
users.email,
array_to_string(array_agg(projects.name), ',')) as projects
FROM
projects,
tasks,
users
WHERE projects.id = tasks.project_id
AND tasks.due_at &amp;gt; tasks.completed_at
AND tasks.due_at &amp;gt; now()
AND users.id = projects.user_id
GROUP BY
users.email
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="6-use-materialized-views-cautiously"&gt;
&lt;div&gt;
6. Use materialized views cautiously
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re not familiar with materialized view they&amp;rsquo;re a query that has been actually created as a table. So it&amp;rsquo;s a materialized or basically snapshotted version of some query or &amp;ldquo;view&amp;rdquo;. In their initial version materialized versions, which were long requested in Postgres, were entirely unusuable because when you it was a locking transaction which could hold up other reads and acticities avainst that view.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;ve since gotten much better, but there&amp;rsquo;s no tooling for refreshing them out of the box. This means you have to setup some scheduler job or cron job to regularly refresh your materialized views. If you&amp;rsquo;re building some reporting or BI app you may undoubtedly need them, but their usability could still be advanced so that Postgres knew how to more automatically refresh them.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you&amp;rsquo;re on Postgres 9.3, the above caveats about preventing reads still does exist&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="7-window-functions"&gt;
&lt;div&gt;
7. Window functions
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Window functions are perhaps still one of the more complex things of SQL to understand. In short they let you order the results of a query, then compute something from one row to the next, something generally hard to do without procedural SQL. You can do some very basic things with them such as rank where &lt;a href="http://postgresguide.com/sql/window.html"&gt;each result appears&lt;/a&gt; ordered by some value, or something more complex like compute &lt;a href="http://www.craigkerstiens.com/2014/02/26/Tracking-MoM-growth-in-SQL/"&gt;MoM growth directly in SQL&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="8-a-simpler-method-for-pivot-tables"&gt;
&lt;div&gt;
8. A simpler method for pivot tables
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Table_func is often referenced as the way to compute a pivot table in Postgres. Sadly though it&amp;rsquo;s pretty difficult to use, and the more basic method would be to just do it with raw SQL. This will get much better with &lt;a href="http://www.craigkerstiens.com/2015/12/27/postgres-9-5-feature-rundown/"&gt;Postgres 9.5&lt;/a&gt;, but until then something where you sum up each condition where it&amp;rsquo;s true or false and then totals is much simpler to reason about:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;select date,
sum(case when type = 'OSX' then val end) as osx,
sum(case when type = 'Windows' then val end) as windows,
sum(case when type = 'Linux' then val end) as linux
from daily_visits_per_os
group by date
order by date
limit 4;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Example query courtesy of &lt;a href="http://www.twitter.com/tapoueh"&gt;Dimitri Fontaine&lt;/a&gt; and &lt;a href="http://tapoueh.org/blog/2013/07/04-Simple-case-for-pivoting"&gt;his blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="9-postgis"&gt;
&lt;div&gt;
9. PostGIS
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Sadly on this one I&amp;rsquo;m far from an expert. PostGIS is arguably the best option of any GIS database options. The fact that you get all of the standard Postgres benefits with it makes it even more powerful–a great example of this is GiST indexes which came to Postgres in recent years and offers great performance gains for PostGIS.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re doing something with geospatial data and need something more than the easy to use &lt;code&gt;earth_distance&lt;/code&gt; extension then crack open PostGIS.&lt;/p&gt;
&lt;h3 id="10-jsonb"&gt;
&lt;div&gt;
10. JSONB
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I almost debated leaving this one off the list, ever since Postgres 9.2 JSON has been at least one of the marquees in each Postgres release. JSON arrived with much hype, and JSONB fulfilled on the initial hype of Postgres starting to truly compete as a document database. JSONB only continues to become more powerful with &lt;a href="http://www.craigkerstiens.com/2015/12/08/massive-json/"&gt;better libraries&lt;/a&gt; for taking advantage of it, and it&amp;rsquo;s &lt;a href="https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.5#JSONB-modifying_operators_and_functions"&gt;functions improving&lt;/a&gt; with each release.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re doing anything with JSON or playing with another document database and ignoring JSONB you&amp;rsquo;re missing out, of course don&amp;rsquo;t forget the GIN and GiST indexes to really get the benefits of it.&lt;/p&gt;
&lt;h3 id="the-year-ahead"&gt;
&lt;div&gt;
The year ahead
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Postgres 9.5/9.6 should continue to improve and bring many new features in the years ahead, what&amp;rsquo;s your preference for something that doesn&amp;rsquo;t exist yet but you do want to see land in Postgres. Let me know &lt;a href="http://www.twitter.com/craigkerstiens"&gt;@craigkerstiens&lt;/a&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Tue, 29 Dec 2015 22:55:56 GMT</pubDate><guid isPermaLink="true">/2015/12/29/My-top-10-Postgres-features-and-tips-for-2016/</guid></item><item><title>searchcode server</title><link>https://boyter.org/2015/12/searchcode-server/</link><description>&lt;p&gt;A month or so ago I started collection emails on searchcode.com to determine if there was enough interest in a downloadable version of searchcode. The results were overwhelmingly positive. The email list grew far beyond what I would have expected, and this was in the first month. As such I have been working in this downloadable version of searchcode which will probably be called searchcode server.&lt;/p&gt;
&lt;p&gt;Progress has been reasonably straight forward consider that searchcode.com is written using mostly Python and searchcode server is mostly Java. The main reason for choosing Java is that I really wanted searchcode server to be a self contained application which could be downloaded and run without the configuration and setup of additional services.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 29 Dec 2015 04:17:42 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/12/searchcode-server/</guid></item><item><title>Kettle, my personal dashboard app</title><link>https://benovermyer.com/blog/2015/12/kettle-my-personal-dashboard-app/</link><description>&lt;p&gt;Not too long ago, I got fed up with having to use a ton of different apps to do various things online. Also, having to deal with apps that almost-but-not-quite fit the bill for what I was trying to do was a bit frustrating. So, I set out to write my own personal dashboard web app to handle… well, everything. I'm calling it Kettle, mostly because that was the first noun that popped into my head that sounded vaguely appropriate. Does it make sense? Not really. It just sounds right, much like J.R.R. Tolkien loved the sound of the phrase “cellar door.” At the time of this posting, I've just finished the first iteration of the note-taking part of the app. It doesn't yet allow searching or deleting notes, but other than that, it's perfectly usable. You can check it out at the &lt;a href="https://github.com/BenOvermyer/kettle-dashboard" rel="external"&gt;Kettle repository on GitHub&lt;/a&gt;.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Tue, 29 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/12/kettle-my-personal-dashboard-app/</guid></item><item><title>App Use: Chordion</title><link>https://rjp.is/blogging/posts/app-use-chordion-2/</link><description>Chordion is a combination arpeggiator / drum sequencer that supposedly &amp;ldquo;is a fun new way to make music on the iPad.&amp;rdquo;
I think I&amp;rsquo;ve proven their &amp;ldquo;never hit a wrong note!&amp;rdquo; wrong.
Maybe a few more practice runs will help.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Mon, 28 Dec 2015 16:34:20 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-chordion-2/</guid></item><item><title>Postgres 9.5 - The feature rundown</title><link>/2015/12/27/Postgres-9.5-The-feature-rundown/</link><description>&lt;p&gt;The headline of Postgres 9.5 is undoubtedly: Insert&amp;hellip; on conflict do nothing/update or more commonly known as Upsert or Merge. This removes one of the last remaining features which other databases had over Postgres. Sure we&amp;rsquo;ll take a look at it, but first let&amp;rsquo;s browse through some of the other features you can look forward to when Postgres 9.5 lands:&lt;/p&gt;
&lt;h3 id="grouping-sets-cube-rollup"&gt;
&lt;div&gt;
Grouping sets, cube, rollup
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Pivoting in Postgres has &lt;a href="http://www.craigkerstiens.com/2013/06/27/Pivoting-in-Postgres/"&gt;sort of been possible&lt;/a&gt; as has rolling up data, but it required you to know what those values and what you were projecting to, to be known. With the new functionality to allow you to group various sets together rollups as you&amp;rsquo;d normally expect to do in something like Excel become trivial.&lt;/p&gt;
&lt;p&gt;So now instead you simply add the grouping type just as you would on a normal group by:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT department, role, gender, count(*)
FROM employees
GROUP BY your_grouping_type_here;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By simply selecting the type of rollup you want to do Postgres will do the hard work for you. Let&amp;rsquo;s take a look at the given example of department, role, gender:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grouping sets&lt;/code&gt; will project out the count for each specific key. As a result you&amp;rsquo;d get each department key, with other keys as null, and the count for each that met that department.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cube&lt;/code&gt; will give you the same values as above, but also the rollups of every individual combination. So in addition to the total for each department, you&amp;rsquo;d get breakups by the department and gender, and department and role, and department and role and gender.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rollup&lt;/code&gt; will give you a slightly similar version to cube but only give you the detailed groupings in the order they&amp;rsquo;re presented. So if you specified &lt;code&gt;roll (department, role, gender)&lt;/code&gt; you&amp;rsquo;d have no rollup for department and gender alone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Check the what&amp;rsquo;s new wiki for a bit more clarity on &lt;a href="https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.5#GROUPING_SETS.2C_CUBE_and_ROLLUP"&gt;examples and output&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="import-foreign--schemas"&gt;
&lt;div&gt;
Import foreign schemas
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I only use foreign tables about once a month, but when I do use them they&amp;rsquo;ve inevitably saved many hours of creating a one off ETL process. Even still the effort to setup new foreign tables has shown a bit of their infancy in Postgres. Now once you&amp;rsquo;ve setup your foreign database, you can import the schema, either all of it or specific tables you prefer.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s as simple as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IMPORT FOREIGN SCHEMA public
FROM SERVER some_other_db INTO reference_to_other_db;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="pg_rewind"&gt;
&lt;div&gt;
pg_rewind
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re managing your own Postgres instance for some reason and running HA, pg_rewind could become especially handy. Typically to spin up replication you have to first download the physical, also known as base, backup. Then you have to replay the Write-Ahead-Log or WAL–so it&amp;rsquo;s up to date then you actually flip on replication.&lt;/p&gt;
&lt;p&gt;Typically with databases when you fail over you shoot the other node in the head or &lt;a href="https://en.wikipedia.org/wiki/STONITH"&gt;STONITH&lt;/a&gt;. This means just get rid of it, completely throw it out. This is still a good practice, so bring it offline, make it inactive, but from there now you could then flip it into a mode and use pg_rewind. This could save you pulling down lots and lots of data to get a replica back up once you have failed over.&lt;/p&gt;
&lt;h3 id="upsert"&gt;
&lt;div&gt;
Upsert
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Upsert of course will be the highlight of Postgres 9.5. I already talked about it some when &lt;a href="http://www.craigkerstiens.com/2015/05/08/upsert-lands-in-postgres-9.5/"&gt;it initially landed&lt;/a&gt;. The short of it is, if you&amp;rsquo;re inserting a record and there&amp;rsquo;s a conflict, you can choose to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do nothing&lt;/li&gt;
&lt;li&gt;Do some form of update&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Essentially this will let you have the typically experience of create or update that most frameworks provide but without a potential race condition of incorrect data.&lt;/p&gt;
&lt;h3 id="jsonb-pretty"&gt;
&lt;div&gt;
JSONB pretty
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s a few updates &lt;a href="https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.5#JSONB-modifying_operators_and_functions"&gt;to JSONB&lt;/a&gt;. The one I&amp;rsquo;m most excited about is making JSONB output in psql read much more legibly.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve got a JSONB field just give it a try with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT jsonb_pretty(jsonb_column)
FROM foo;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="give-it-a-try"&gt;
&lt;div&gt;
Give it a try
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Just in time for the new year &lt;a href="http://www.postgresql.org/about/news/1631/"&gt;the RC is ready&lt;/a&gt; and you can get hands on with it. Give it a try, and if there&amp;rsquo;s more you&amp;rsquo;d like to hear about Postgres please feel free to drop me a note &lt;a href="mailto:craig.kerstiens@gmail.com"&gt;craig.kerstiens@gmail.com&lt;/a&gt;.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Sun, 27 Dec 2015 22:55:56 GMT</pubDate><guid isPermaLink="true">/2015/12/27/Postgres-9.5-The-feature-rundown/</guid></item><item><title>Going from blog posts to full launches</title><link>/2015/12/26/Going-from-blog-posts-to-full-launches/</link><description>&lt;p&gt;I recall extremely early stage where you&amp;rsquo;d build a feature, realize it was awesome, then the next day write a blog post for it. At some point you start to move from that to more coordinated launches. A larger coordinated launch allows you to reach a bigger audience, can lead to bigger deals, and help expand your overall market. But perhaps more importantly by the time you hit full launch you&amp;rsquo;ve message tested and ensured it&amp;rsquo;s going to resonate in the way you expect.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The process itself will both help amplify and validate/refine your message&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is often a more gradual process than a sudden single change, you&amp;rsquo;ll introduce new parts of this in time. And for many what an entire launch process looks like comes by trial an error, to help shorten that learning curve here&amp;rsquo;s key areas I pay attention for a launch and process followed by a rough timeline.&lt;/p&gt;
&lt;h3 id="product-first"&gt;
&lt;div&gt;
Product first
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Making sure the product is in the right shape is key to any big launch. You don&amp;rsquo;t get a second shot and if the product isn&amp;rsquo;t in shape customers often won&amp;rsquo;t take a second look at it later. For this reason I strongly prefer to have your product locked and loaded before you even start talking launch times, or at least be in the bug clean up phase. This means you&amp;rsquo;ve built a feature, validated with alpha users or private beta, and are ready to open it up to the world.&lt;/p&gt;
&lt;p&gt;If you have to set a launch date without the product or feature being already done allow padding. Sometimes it&amp;rsquo;s good for the team to know the padding, sometimes it isn&amp;rsquo;t. When you have extra time it&amp;rsquo;s not uncommon for your development to magically consume exactly that amount of time and still result in a small scramble towards the end.&lt;/p&gt;
&lt;p&gt;A good driver I&amp;rsquo;ve found is needing to have it fully like to demo a few weeks out from the launch itself, such as during &lt;a href=""&gt;analyst pre-briefings&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="crafting-your-message"&gt;
&lt;div&gt;
Crafting your message
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Every launch is an opportunity to tell your core message and value prop. If you miss this opportunity for focusing on a single narrow feature you&amp;rsquo;ve missed the biggest opportunity you had in a launch. You can&amp;rsquo;t relaunch your full product every time though–you do need some big improvements or feature that you can highlight, but you should still hit your core message.&lt;/p&gt;
&lt;p&gt;First you should know that your feature solves some specific problem, you should know this from the alpha/beta testing and if it doesn&amp;rsquo;t solve this problem &lt;a href="/2014/08/13/when-to-ship-when-to-kill/"&gt;you&amp;rsquo;re not ready to launch&lt;/a&gt;. Yes, some people will launch a product before the product is completely there–this is common in a marketing driven company as opposed to a product/engineering driven company.&lt;/p&gt;
&lt;p&gt;Your message should lead with the problem you&amp;rsquo;re solving, not the laundry list of features. The best launches lead with some broader thematic message, even better if it&amp;rsquo;s an altruistic world changing one. A rough example of this:&lt;/p&gt;
&lt;p&gt;To the point to the product, and probably over generalized as boring:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connectify brings a new way of taking your dumb devices at home and turning them into intelligent connected devices.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In contrast, broad thematic message, followed lightly by the product.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We live in a connected world, and with new connected devices there&amp;rsquo;s the opportunity not just give you more data but help you improve how you live your life. Connectify helps you at bringing the devices that matter together with ease.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="testing-your-message"&gt;
&lt;div&gt;
Testing your message
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;You should treat your message just like a product, testing it gradually along the way. Once you&amp;rsquo;ve got some initial framing of it, test it internally, then with friendly customers or community members. Leading up to the launch I usually have a timeline and get all the content and communication rolling about 3 weeks out. I&amp;rsquo;ll give a bit of a timeline below but first some more around message testing&lt;/p&gt;
&lt;h4 id="analysts"&gt;
&lt;div&gt;
Analysts
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;If you regularly use &lt;a href="/2015/07/25/A-guide-to-analyst-relations-for-startups/"&gt;any analysts&lt;/a&gt; you should absolutely use them to help with a launch. Several weeks out is a great time to test key messages with them, get feedback, and if you&amp;rsquo;re lucky you may even get them to provide a quote for the launch.&lt;/p&gt;
&lt;p&gt;Keep in mind here a inquiry is an opportunity to test your message and get feedback. You should talk roughly half of the time here, they should be talking the other half. In contrast briefings before launch you should have your message fully baked and should simply be pitching your message and possibly demo-ing.&lt;/p&gt;
&lt;h4 id="friendlies"&gt;
&lt;div&gt;
Friendlies
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;This may be more contentious, but at least at early stage sharing drafts with friendly community members is a great way to get feedback and refine your message. Here you should be especially concious of the request of their time and expect to have some delay before they get back to you. Being top secret about your message ahead of time won&amp;rsquo;t add much value to it being a home run, where as better ensuring it resonates will help it to be more successful.&lt;/p&gt;
&lt;h4 id="customers"&gt;
&lt;div&gt;
Customers
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Customers I call out as a separate bucket. Customers have less incentive to leak your news than friendlies, but also fall somewhere on the other spectrum of analysts. A key piece about customers is there is an opportunity for them to be a launch partner. And so on to that topic:&lt;/p&gt;
&lt;h3 id="launch-partners"&gt;
&lt;div&gt;
Launch partners
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Press and others like seeing and knowing you have external validation. Similarly many see the benefit of being part of a launch, after all it&amp;rsquo;s more free press for them. For a launch partner there are various levels, though for most providing some quote is a pretty common level.&lt;/p&gt;
&lt;p&gt;The best way to do this is talk to them about what they like about the feature/product and take a first stab at the quote for them from their feedback. Some may very much want to wordsmith their own which is fine, but minimizing the work required of them while–trying to hit something they&amp;rsquo;d say as well–as a message that flows can best be done by you taking a first pass.&lt;/p&gt;
&lt;p&gt;Further there&amp;rsquo;s varying levels of value with quotes and references. In descending order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Customers&lt;/li&gt;
&lt;li&gt;Analysts&lt;/li&gt;
&lt;li&gt;Community Members&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="the-other-details"&gt;
&lt;div&gt;
The other details
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;During launch week I mostly want to be dotting i&amp;rsquo;s and crossing t&amp;rsquo;s, meaning: I want the product done. I want documentation done. I want the blog post finalized. I want to be in the mode of send internal announcements, prep internal teams, talk to media.&lt;/p&gt;
&lt;h4 id="prepping-internal-teams"&gt;
&lt;div&gt;
Prepping internal teams
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Obviously the engineering and product people involved will be in the loop. But you need to notify many others some of which should have been in the loop already, some less so:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support - There&amp;rsquo;s a new product surface area, support should be top of your list so they can field the tickets and questions that come in&lt;/li&gt;
&lt;li&gt;Sales - Even if there is no price change or impact, new features allow sales to communicate value to customers&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="timeline"&gt;
&lt;div&gt;
Timeline
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Finally what&amp;rsquo;s the end to end timeline look like with all the little details. Here&amp;rsquo;s a rough one that&amp;rsquo;s fully built out. IF you&amp;rsquo;re smaller and don&amp;rsquo;t have a regular cadence of analysts in hand then just expect that doesn&amp;rsquo;t apply. IF your support team is the product and engineers maybe that&amp;rsquo;s lighter weight. Basically feel free to take out parts, but expect your process to grow to something of this size.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 weeks out - Outline of blog post with key messages&lt;/li&gt;
&lt;li&gt;Test that outline internally&lt;/li&gt;
&lt;li&gt;3 weeks out - Start to get a rough draft in place&lt;/li&gt;
&lt;li&gt;3 weeks out - Share internally and with friendlies. At this point you&amp;rsquo;re explicitely looking for message feedback. Tell people to not waste time on nitpicks of words or grammar, it will be 98% re-written by the time you&amp;rsquo;re done&lt;/li&gt;
&lt;li&gt;2.5 weeks out - Analyst inquiries for message testing&lt;/li&gt;
&lt;li&gt;2.5 weeks out - Start putting together product demo&lt;/li&gt;
&lt;li&gt;2 weeks out - Start putting together documentation&lt;/li&gt;
&lt;li&gt;2 weeks out - Start nailing down blog post for final messages&lt;/li&gt;
&lt;li&gt;1 weeks out - Start to put final touches on blog post for grammar&lt;/li&gt;
&lt;li&gt;1 week out - Analyst briefings&lt;/li&gt;
&lt;li&gt;1 week out - Update support&lt;/li&gt;
&lt;li&gt;3-5 days out - Stage blog post&lt;/li&gt;
&lt;li&gt;3-5 days out - Stage new documentation&lt;/li&gt;
&lt;li&gt;2-4 days out - Make sure PRs are ready or feature flags, in short the switch is there or live but not public&lt;/li&gt;
&lt;li&gt;1-3 days out - Update sales&lt;/li&gt;
&lt;li&gt;1-3 days out - Interall communication to all@&lt;/li&gt;
&lt;li&gt;1-3 days out - Media briefings&lt;/li&gt;
&lt;li&gt;LAUNCH DAY - Sit in a room and watch all the things, engage with twitter/HN/etc.&lt;/li&gt;
&lt;/ul&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Sat, 26 Dec 2015 22:55:56 GMT</pubDate><guid isPermaLink="true">/2015/12/26/Going-from-blog-posts-to-full-launches/</guid></item><item><title>App Use: Keezy Drummer</title><link>https://rjp.is/blogging/posts/app-use-keezy-drummer-2/</link><description>A quick noodle with Keezy Drummer recorded into the Zoom H4n, exported to Fission, then piped through Audio Hijack with the right channel duplicated into the left before saving to MP3.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 17:47:08 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-keezy-drummer-2/</guid></item><item><title>Janathon, Dryathlon, Jamathon</title><link>https://rjp.is/blogging/posts/janathon-dryathon-jamathon-2-2/</link><description>And a partridge in a pear tree. Signed up for Janathon (updates will probably be here).
Signed up for Dryathlon (Sponsor me!).
Decided to do an ad-hoc Jamathon (&amp;ldquo;Make and upload some musical output every day using one or two mobile apps&amp;rdquo;).
(Yes, I&amp;rsquo;m going to be insufferable all month.)</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 16:04:49 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-dryathon-jamathon-2-2/</guid></item><item><title>App Use: Audioshare</title><link>https://rjp.is/blogging/posts/app-use-audioshare-2/</link><description>Not strictly a music-making app, [Audioshare] gets used for almost all of the things I upload to Soundcloud.
But since I managed to accidentally make some &amp;ldquo;music&amp;rdquo; with it, I might as well blog about it (and steal the description from Soundcloud).
There I was, playing something I&amp;rsquo;d just made in Soundscaper through Audioshare via Audiobus into Gliderverb when I had the urge to record what was happening since it was sounding ok.</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 13:36:41 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-audioshare-2/</guid></item><item><title>App Use: TC-Performer</title><link>https://rjp.is/blogging/posts/app-use-tc-performer-2/</link><description>Like a 2D theremin on acid, TC-Performer has a bunch of instruments (all digitally synthed by TC-11 - which is on the wishlist) controlled by multi-touch, movement, etc.
Bit tricky to do coherent tunes but excellent for making this kind of swoopy droney chimey kind of space music.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 13:33:27 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-tc-performer-2/</guid></item><item><title>App Use: Poly</title><link>https://rjp.is/blogging/posts/app-use-poly-2/</link><description>Some learning-curve twiddling with Poly. Should be good for generating driving rhythms as underlying texture.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 13:29:35 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-poly-2/</guid></item><item><title>App Use: Fieldscaper</title><link>https://rjp.is/blogging/posts/app-use-fieldscaper-2/</link><description>Recorded 1:45 of tap filling a bath using Fieldscaper. Chopped out a decent 45s segment and mangled it three different ways to make a kind of weird Dr Who 1970s sci-fi noisefest.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 13:25:31 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-fieldscaper-2/</guid></item><item><title>Insomniac Art</title><link>https://rjp.is/blogging/posts/insomniac-art-2/</link><description>Or &amp;ldquo;half an hour spent twiddling with various graphics apps on an iPhone whilst unable to sleep&amp;rdquo;.
(Lots of 512x512 images make this a big post.)
The original image Southwark Park, 2015-12-19, near the south-east gate, looking south-west.
Waterlogue &amp;ldquo;Vibrant, medium, Auto&amp;rdquo;.
BLACK &amp;ldquo;P400, Tura expired 2002&amp;rdquo;
BLACK plus Waterlogue Combination of the last two.
Decim8 These were all done via the random settings button.
Etchings plus Union plus Pixlr Etchings was used to create a few variants of the BLACK version which where then combined in Union before being tweaked in Pixlr.</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 13:06:09 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/insomniac-art-2/</guid></item><item><title>Pi-Hole for Ubuntu 14.04</title><link>https://boyter.org/2015/12/pi-hole-ubuntu-14-04/</link><description>&lt;p&gt;Because of the fact that I personally work for an ad supported company and that searchcode.com is currently supported via third party advertising I tend to keep an eye on the state of ad blockers on the web.&lt;/p&gt;
&lt;p&gt;Most people probably know about adblockplus and other browser extensions however there are other ways to block ad&amp;rsquo;s on ones network. One that I had previously read about was setting up your own Bind9 server on a server and adding custom rules to block them at a DNS level. Other the last week I had been playing around with this but since I am not a bind expert I was unable to get it working in a satisfactory way.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sat, 26 Dec 2015 04:24:32 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/12/pi-hole-ubuntu-14-04/</guid></item><item><title>Shine a Spotlight On Those Photos</title><link>https://blog.nawaz.org/posts/2015/Dec/shine-a-spotlight-on-those-photos/</link><description>&lt;p&gt;A nearby photography club has annual county wide competitions. The judges
select their favorite photos and display them in a mall for a&amp;nbsp;month.&lt;/p&gt;
&lt;p&gt;Several years ago, I took a friend to the mall to show him the
photos. We had only a few minutes until closing time, and they …&lt;/p&gt;</description><author>Beetle Space</author><pubDate>Thu, 24 Dec 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.nawaz.org/posts/2015/Dec/shine-a-spotlight-on-those-photos/</guid></item><item><title>App Use: Soundscaper</title><link>https://rjp.is/blogging/posts/app-use-soundscaper-2/</link><description>The samples from Disquiet Junto 0207 soundscaped using the excellent SoundScaper (mostly) controlled by a KORG nanoKONTROL2.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Wed, 23 Dec 2015 11:30:52 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-soundscaper-2/</guid></item><item><title>App Use: Phase Rings, Dedalus</title><link>https://rjp.is/blogging/posts/app-use-phase-rings-dedalus-2/</link><description>A simple bit of noodling in Phase Rings (I think it was a Mixolydian scale but I can&amp;rsquo;t remember now - Always Takes Notes At The Time, Kids) through Dedalus for some texture.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Wed, 23 Dec 2015 11:25:31 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-phase-rings-dedalus-2/</guid></item><item><title>App Use: Patterning, Dedalus</title><link>https://rjp.is/blogging/posts/app-use-patterning-dedalus-2/</link><description>A simple drum loop in Patterning filtered through Dedalus whilst I scrub through the various options to see what kind of aural mess I can make (hint: &amp;ldquo;A big one&amp;rdquo;). Good learning experience though.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Wed, 23 Dec 2015 11:18:45 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-patterning-dedalus-2/</guid></item><item><title>Luigi review</title><link>https://bytepawn.com/luigi.html</link><description>&lt;p&gt;I review Luigi, an execution framework for writing data pipes in Python code. It supports task-task dependencies, it has a simple central scheduler with an HTTP API and an extensive library of helpers for building data pipes for Hadoop, AWS, Mysql etc. It was written by Spotify for internal use and open sourced in 2012. A number of companies use it, such as Foursquare, Stripe, Asana.&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Tue, 22 Dec 2015 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/luigi.html</guid></item><item><title>Cargo Cult Data</title><link>https://bytepawn.com/cargo-cult-data.html</link><description>&lt;p&gt;Cargo cult data is when you're collecting and looking at data when making decisions, but you're only following the forms and outside appearances of scientific investigation and missing the essentials, so it doesn't work. &lt;br /&gt;&lt;br /&gt;&lt;img alt="Cargo cult data" src="/images/cargo_cult_data.jpg" style="width: 400px;" /&gt;&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Tue, 22 Dec 2015 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/cargo-cult-data.html</guid></item><item><title>Disquiet Junto #207</title><link>https://rjp.is/blogging/posts/disquiet-junto-207-2/</link><description>Screenshots of my effort for the Disquiet Junto #207 challenge.
&amp;ldquo;M1 arpeggiated&amp;rdquo; - the underlying heavy drums &amp;ldquo;M2 bowed&amp;rdquo; - the gentle machine-like throbbing &amp;ldquo;M3 bowed&amp;rdquo; - the occasional background swell &amp;ldquo;M1 taped&amp;rdquo; - the initial drum-style intro &amp;ldquo;M2 arpeggiated&amp;rdquo; - extra texture &amp;ldquo;M3 shuffled&amp;rdquo; - the rolling trill (cf 2:40, 3:35)</description><author>infrequent oscillations</author><pubDate>Mon, 21 Dec 2015 14:30:15 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/disquiet-junto-207-2/</guid></item><item><title>App Use: Samplr #2, Addictive Synth</title><link>https://rjp.is/blogging/posts/app-use-samplr-2-addictive-synth-2/</link><description>App Use, Track 3 is more experimentation with Samplr.
&amp;ldquo;Sherlock Holmes and the Voice Of Terror&amp;rdquo; provided the samples, Fission chopped them up, and Addictive Synth provided the arpeggiation samples.
This was pretty tricky. (There was an earlier attempt at this but it was a fair old disaster. Even more repetitive and far too &amp;ldquo;chunky&amp;rdquo;.)
It took many attempts to get the first sample working right - Samplr loops the sample when recording in Tape Mode and cutting it off whilst keeping within the beat of a bar was a nightmare.</description><author>infrequent oscillations</author><pubDate>Fri, 18 Dec 2015 14:05:27 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-samplr-2-addictive-synth-2/</guid></item><item><title>App Use: Portable Dandy, Loopy</title><link>https://rjp.is/blogging/posts/app-use-portable-dandy-loopr-2/</link><description>Portable Dandy is a collection of samples you play in a virtual tape loop with a trio of effects. Quite fun but it has a proper problem as you can hear in thesoundtestroom review - certain sample and effect combinations will trigger horrible glitching.
In an attempt to avoid this horror, I recorded the samples into [LPR][Loopy] and then sequenced them there.
Where I discovered that Loopy is a right old bugger to work for this kind of thing.</description><author>infrequent oscillations</author><pubDate>Fri, 18 Dec 2015 13:48:46 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-portable-dandy-loopr-2/</guid></item><item><title>App Use: Samplr, #1</title><link>https://rjp.is/blogging/posts/app-1-samplr-2/</link><description>Samplr is a wizard&amp;rsquo;s toolbox of magical sound manipulation. In the hands of a master, it can produce some good stuff - &amp;ldquo;Do It Again&amp;rdquo;, &amp;ldquo;jamming with Samplr&amp;rdquo;, &amp;ldquo;SAMPLR - have some fun&amp;rdquo;.
In the hands of a bumbling amateur, it makes &amp;hellip; something?
App Use, Track 1 is just a bunch of stock Samplr samples being randomly noodled through the various modes to see how it all works. It works as a mostly ambient track, I think.</description><author>infrequent oscillations</author><pubDate>Fri, 18 Dec 2015 13:23:42 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-1-samplr-2/</guid></item><item><title>Pay Down Mortgage or Invest?</title><link>https://blog.nawaz.org/posts/2015/Dec/pay-down-mortgage-or-invest/</link><description>&lt;p&gt;The following scenarios are ones many of us run in&amp;nbsp;to:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;strong&gt;Lumped Sum:&lt;/strong&gt; I suddenly got $30,000. Should I put the money
towards my mortgage, or should I invest&amp;nbsp;it?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Periodic Payments:&lt;/strong&gt; After all my monthly bills, I have $500 left
over. Should I put it all towards my …&lt;/li&gt;&lt;/ol&gt;</description><author>Beetle Space</author><pubDate>Fri, 18 Dec 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.nawaz.org/posts/2015/Dec/pay-down-mortgage-or-invest/</guid></item><item><title>Ok, ok, I have a problem</title><link>https://rjp.is/blogging/posts/ok-ok-i-have-a-problem-2/</link><description>I already had a bunch of apps for making noises/musics but #november lead to - let&amp;rsquo;s be honest - a splurge.
Which means it&amp;rsquo;s intervention time.
The rule I&amp;rsquo;m not allowed to buy any more music/noise apps until I&amp;rsquo;ve made (and posted) something which each one. Since some of them are essentially filters or DAWs, combinations are allowed but should be minimal.
Previously created content does not count for the purposes of this intervention.</description><author>infrequent oscillations</author><pubDate>Thu, 17 Dec 2015 00:07:17 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/ok-ok-i-have-a-problem-2/</guid></item><item><title>2016 Adventures</title><link>https://rjp.is/blogging/posts/2016-adventures-2/</link><description>Things for 2016 {Preliminary list - will repost on 2016-01-01}
(Stretch goals / PBs) [Caveats / Requirements]
&amp;ldquo;unsupported&amp;rdquo; means carrying everything from the start - no refuelling from shops. Only rest stops are allowed.
Movementercisers Janathon Juneathon Survive a full 6 hour race [with at least 42km] (no walking) (&amp;ldquo;unsupported&amp;rdquo;) Run more than 45km (48km) (50km) (56km) (no walking) (&amp;ldquo;unsupported&amp;rdquo;) Finish an official marathon (5:15) (5:00) (4:45) Half PB (2:00) (1:55) (1:50) 10km PB (50:00) (47:30) (45:00) Walk BAR-KNG at least twice (9:45) (9:30) [at least once &amp;ldquo;unsupported&amp;rdquo;] Walk SGR-KNG (15:00) (&amp;ldquo;unsupported&amp;rdquo;) Run BAR-KNG (6:30) (6:00) 7 more parkruns (+3 new places) All of Regents Park 10km series RBR ranking under 16 (15) (14) Randomerisers inktober blogtober noisevember</description><author>infrequent oscillations</author><pubDate>Tue, 15 Dec 2015 15:29:00 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/2016-adventures-2/</guid></item><item><title>iSCSI SCSI-ID / Serial Persistence</title><link>https://smcleod.net/2015/12/iscsi-scsi-id-/-serial-persistence/</link><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;&amp;ldquo;Having a SCSI ID is a f*cking idiotic thing to do.&amp;rdquo;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://yarchive.net/comp/linux/scsi_ids.html"&gt;- Linus Torvalds&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;hellip;and after the amount of time I&amp;rsquo;ve wasted getting XenServer to play nicely with LIO iSCSI failover I tend to agree.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://smcleod.net//img/san/sr_fail.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;One oddity of Xen / XenServer&amp;rsquo;s storage subsystem is that it identifies iSCSI storage repositories via a calculated SCSI ID rather than the iSCSI Serial - which would be the sane thing to do.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Mon, 14 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/12/iscsi-scsi-id-/-serial-persistence/</guid></item><item><title>Tutorial: Dealing with Disk Space Errors in Linux</title><link>https://benovermyer.com/blog/2015/12/tutorial-dealing-with-disk-space-errors-in-linux/</link><description>&lt;p&gt;If you're seeing errors on a server (say, npm complaining about an ENOSPC error, or apt failing to install something) that suggest the hard disk is full, use this guide to resolve the issue.&lt;/p&gt;
&lt;h1 id="troubleshooting"&gt;Troubleshooting&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;All of the following commands assume you are logged in as a sudo user on a Linux machine. Some of the commands, like &lt;code&gt;df -hT&lt;/code&gt;, won't work exactly as advertised on something like, say, Solaris.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="checking-disk-space"&gt;Checking disk space&lt;/h2&gt;
&lt;p&gt;First, check the amount of available disk space.&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;df -hT&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If one of the available drives (such as &lt;code&gt;/dev/xvda1&lt;/code&gt;) shows as 100% full, then you'll need to clear some space. The first place to look is &lt;code&gt;/var/log/&lt;/code&gt;, especially if nginx is writing log files to disk. Clear out all old logs (anything with a .gz file extension is fair game for deletion). If that doesn't free up enough space, the next place to check is the application directory for whatever app is on the server. If there are more than 3 releases on the server, you can safely delete the oldest ones (until you have at least 2 remaining). You can also remove all the files in &lt;code&gt;/tmp/&lt;/code&gt;, although that should be a last resort.&lt;/p&gt;
&lt;h2 id="checking-inode-usage"&gt;Checking inode usage&lt;/h2&gt;
&lt;p&gt;If you've confirmed that the hard drive isn't full (or cleared enough space that it isn't), and you're still seeing “disk is full” type errors, then you almost certainly have too few inodes available on the server. This means, basically, that there are too many files on the server.&lt;/p&gt;
&lt;h3 id="checking-inode-usage-1"&gt;Checking inode usage&lt;/h3&gt;
&lt;p&gt;Run the following command to check inode usage:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;df -i&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You'll see something like the following:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;Filesystem     Inodes IUsed IFree IUse% Mounted on&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;udev             121K   409  120K    1% /dev&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;tmpfs            125K   479  124K    1% /run&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;/dev/vda1        1.9M  237K  1.7M   13% /&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;tmpfs            125K     2  125K    1% /dev/shm&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;tmpfs            125K     3  125K    1% /run/lock&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;tmpfs            125K    15  125K    1% /sys/fs/cgroup&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;tmpfs            125K     4  125K    1% /run/user/1000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;IUse%&lt;/code&gt; column is the one you're interested in. If &lt;code&gt;IUse%&lt;/code&gt; is at or near 100%, then you have an inode usage problem.&lt;/p&gt;
&lt;h3 id="delete-old-kernels"&gt;Delete old kernels&lt;/h3&gt;
&lt;p&gt;Often, you can free up a ton of inodes if you delete old kernels. This is done with a pretty simple command:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;sudo apt-get autoremove -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Try that first. If that doesn't remove the old kernels, &lt;a href="http://markmcb.com/2013/02/04/cleanup-unused-linux-kernels-in-ubuntu/" rel="external"&gt;this page&lt;/a&gt; may help.&lt;/p&gt;
&lt;h3 id="script-to-check-for-directories-with-lots-of-files"&gt;Script to check for directories with lots of files&lt;/h3&gt;
&lt;p&gt;This script will help find directories with large numbers of files. Put the following into a file &lt;code&gt;list-files.sh&lt;/code&gt; in your home directory:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# count_em - count files in all subdirectories under current directory.&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;echo 'echo $(ls -a &amp;quot;$1&amp;quot; | wc -l) $1' &amp;gt;/tmp/count_em_$&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;chmod 700 /tmp/count_em_$&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;find . -mount -type d -print0 | xargs -0 -n1 /tmp/count_em_$ | sort -n&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then make the file executable:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;chmod +x ./list-files.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, go to the root directory on the server and run the script:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;cd /&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;~/list-files.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It may take a couple minutes to run, but it will present you with a list of all the directories with a number of files next to each, sorted in ascending order of number of files. Take a look at each of the high ones; that might give you an idea of what you need to clean up.&lt;/p&gt;
&lt;h3 id="some-notes-about-good-files-to-delete"&gt;Some notes about good files to delete&lt;/h3&gt;
&lt;p&gt;Log files are safe to delete. So are old releases. Also check the &lt;code&gt;/tmp/&lt;/code&gt; directory; it can often be a hiding place for tons of files.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Thu, 10 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/12/tutorial-dealing-with-disk-space-errors-in-linux/</guid></item><item><title>Postgres and Node - Hands on using Postgres as a Document Store with MassiveJS</title><link>/2015/12/08/Postgres-and-Node-Hands-on-using-Postgres-as-a-Document-Store-with-MassiveJS/</link><description>&lt;p&gt;JSONB in Postgres is absolutely awesome, but it&amp;rsquo;s taken a little while for libraries to come around to make it as useful as would be ideal. For those not following along with Postgres lately, here&amp;rsquo;s the quick catchup for it as a NoSQL database.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In Postgres 8.3 over 5 years ago Postgres received &lt;a href="http://www.craigkerstiens.com/2013/07/03/hstore-vs-json/"&gt;hstore a key/value&lt;/a&gt; store directly in Postgres. It&amp;rsquo;s big limitation was it was only for text&lt;/li&gt;
&lt;li&gt;In the years after it got GIN and GiST indexes to make queries over hstore extremely fast indexing the entire collection&lt;/li&gt;
&lt;li&gt;In Postgres 9.2 we got JSON&amp;hellip; sort of. Really this way only text validation, but allowed us to create some &lt;a href="http://www.craigkerstiens.com/2013/05/29/postgres-indexes-expression-or-functional-indexes/"&gt;functional indexes&lt;/a&gt; which were still nice.&lt;/li&gt;
&lt;li&gt;In Postgres 9.4 we got JSONB - the B stands for Better according to &lt;a href="http://www.twitter.com/leinweber"&gt;@leinweber&lt;/a&gt;. Essentially this is a full binary JSON on disk, which can perform as fast as other NoSQL databases using JSON.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is all great, but when it comes to using JSON you need a library that plays well here. As you might have guessed it from &lt;a href="http://www.craigkerstiens.com/2015/11/30/massive-node-postgres-an-overview-and-intro/"&gt;my previous post this is where MassiveJS comes in&lt;/a&gt;. Most ORMs take a more legacy approach to &lt;a href="http://www.craigkerstiens.com/2014/01/24/rethinking-limits-on-relational/"&gt;how they work with the database&lt;/a&gt;, in contrast the other side of the world believes in document only storage way is the future. In contrast Postgres believes there is a time and place for everything, just like Massive, except it believes Postgres is the path &lt;a href="http://www.craigkerstiens.com/2012/04/30/why-postgres/"&gt;just as I do&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Alright, enough context, let&amp;rsquo;s take a look.&lt;/p&gt;
&lt;h3 id="getting-all-setup"&gt;
&lt;div&gt;
Getting all setup
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;First go ahead and create a database, let&amp;rsquo;s call it massive, and then let&amp;rsquo;s connect to it and create our example table:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ createdb massive
$ psql massive
# create table posts (id serial primary key, body jsonb);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now that we&amp;rsquo;ve got our database setup let&amp;rsquo;s seed it with some data. If you want you can simple hop over to the github repo and pull it down then run &lt;code&gt;node load_json.js&lt;/code&gt; to load the example data. A quick look at it, given an &lt;code&gt;example.json&lt;/code&gt; file we&amp;rsquo;re going to iterate over it. For each record in there, we&amp;rsquo;re going to call saveDoc. Based on our table which has a unique id key and a body jsonb field it&amp;rsquo;ll simply save our JSON document into that table:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var parsedJSON = require('./example.json');
for(i = 0; i &amp;lt; parsedJSON.posts.length; i++) {
db.saveDoc(&amp;quot;posts&amp;quot;, parsedJSON.posts[1], function(err,res){});
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;If you want to just take a look at this &lt;a href="https://github.com/craigkerstiens/json_node_example"&gt;github repo&lt;/a&gt;, once you create a database you can run &lt;code&gt;node load_json.js&lt;/code&gt; to seed it.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="why-json-at-all"&gt;
&lt;div&gt;
Why JSON at all?
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;JSON data is all over the place, in many cases it&amp;rsquo;s fast and flexible and allows you to move more quickly. Yes, much of the time normalizing your data can be useful, but there is something to be said for expediency saving some data and querying across it. Querying across some giant document also used to be much more expensive, but now with JSONB and it&amp;rsquo;s indexes that can be extremely fast.&lt;/p&gt;
&lt;h3 id="querying"&gt;
&lt;div&gt;
Querying
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;So how do we go about querying? Well it&amp;rsquo;s pretty simple with Massive, they provide a nice &lt;code&gt;findDoc&lt;/code&gt; function to let you just search for contents of a specific key within the document. Let&amp;rsquo;s say I wanted to pull back all posts that are in the Postgres category, well it&amp;rsquo;s as simple as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;db.posts.findDoc({title : 'Postgres'}, function(err,docs){
console.log(docs);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The real beauty of this is if you added a GIN index (which will index the entire document) this query will be &lt;a href="http://obartunov.livejournal.com/175235.html"&gt;quite performant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Just make sure to add your GIN index&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE INDEX idx_posts ON posts USING GIN(body jsonb_path_ops);
CREATE INDEX idx_posts_search ON posts USING GIN(search);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But even better, with Massive it&amp;rsquo;ll automatically add these for you if you just start saving docs. It will automatically create the table and appropriate indexes, just doing the correct thing out of the box.&lt;/p&gt;
&lt;h3 id="full-text-and-json"&gt;
&lt;div&gt;
Full text and JSON
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Cool, so you can do an exact look up. Which is great when you&amp;rsquo;re matching a category&amp;hellip; which could be easily normalized. It&amp;rsquo;s great when you&amp;rsquo;re matching numbers, which also could likely reside in their own column. But what about when you&amp;rsquo;re searching over a large document, or a set of keys within some document which may require several joins, or indeterminate data structure, well you may want to search for the presence of that string at all. As you may have guessed this is quite trivial.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;db.posts.searchDoc({
keys : [&amp;quot;title&amp;quot;, &amp;quot;category&amp;quot;],
term : [&amp;quot;Postgres&amp;quot;]
}, function(err,docs){
console.log(docs);
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hopefully it&amp;rsquo;s pretty straight forward, but to be very clear. Call out the document table you want to search, then the keys you&amp;rsquo;ll want to include in the search, then the term. This will search for any place the contents that string are found in matching values for those keys.&lt;/p&gt;
&lt;p&gt;Which will nicely yield the expected documents:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ { link: 'http://www.craigkerstiens.com/2015/05/08/upsert-lands-in-postgres-9.5/',
title: 'Upsert Lands in PostgreSQL 9.5 – a First Look',
category: 'Postgres',
comments: [ [Object] ],
id: 2 },
{ link: 'http://www.craigkerstiens.com/2015/11/30/massive-node-postgres-an-overview-and-intro/',
title: 'Node, Postgres, MassiveJS - a Better Database Experience',
id: 3 } ]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="in-conclusion"&gt;
&lt;div&gt;
In conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;While Massive isn&amp;rsquo;t perfect, its approach to storing queries in files, using the schema vs. having to define your models in code and the database, and it&amp;rsquo;s smooth document integration makes it a real contender as a better database library when working with Node. Give it a try and let me know your thoughts.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Tue, 08 Dec 2015 22:55:56 GMT</pubDate><guid isPermaLink="true">/2015/12/08/Postgres-and-Node-Hands-on-using-Postgres-as-a-Document-Store-with-MassiveJS/</guid></item><item><title>Apple Pay</title><link>https://rjp.is/blogging/posts/apple-pay-2/</link><description>http://time.com/money/4139330/apple-pay-unused/
Survey: Only 20% of those that can use Apple Pay have used it
Trustev surveyed 1,000 consumers who owned Apple Pay-compatible iPhones about their Apple Pay habits. (The iPhone 6, iPhone 6 Plus, iPhone 6s, and iPhone 6s Plus support Apple Pay, while older iPhones do not.) It found that about 80% had not used Apple Pay even once. Of the 20% who had, most (56%) only used it about once a week.</description><author>infrequent oscillations</author><pubDate>Tue, 08 Dec 2015 14:03:28 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/apple-pay-2/</guid></item><item><title>#noisevember</title><link>https://rjp.is/blogging/posts/noisevember-2/</link><description>The output In reverse order; unless otherwise indicated, things were created on iOS and recorded over Audiobus to Audioshare before exporting to Soundcloud.
https://soundcloud.com/zimpenfish/tidal-noisevember (Tidal through Audacity) https://soundcloud.com/zimpenfish/much-indulgent-very-soundscape (SoundScaper) https://soundcloud.com/zimpenfish/just-beatwave-drums (Beatwave) https://soundcloud.com/zimpenfish/coconut-latte (Figure); https://soundcloud.com/zimpenfish/finsbury-park-bonus (Figure) https://soundcloud.com/zimpenfish/beyond-mere-indulgence (SoundScaper) https://soundcloud.com/zimpenfish/more-self-indulgence (FieldScaper) created from https://soundcloud.com/zimpenfish/before-self-indulgence (PixiTracker) https://soundcloud.com/zimpenfish/i-honestly-have-no-idea (Fieldscaper) https://soundcloud.com/zimpenfish/bass-player-mangled (Fieldscaper, creating from a recording of someone practicing a bass riff in the office kitchen) https://soundcloud.com/zimpenfish/mildly-delayed (SoundScaper, using one of the Bitwiz library tracks) https://soundcloud.</description><author>infrequent oscillations</author><pubDate>Mon, 07 Dec 2015 14:50:26 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/noisevember-2/</guid></item><item><title>Study Notes In The Information Age</title><link>https://blog.nawaz.org/posts/2015/Dec/study-notes-in-the-information-age/</link><description>&lt;p&gt;It has been a long time since I was a college student. In those days I
took all my notes in the classroom with a notebook. One notebook for
each&amp;nbsp;course.&lt;/p&gt;
&lt;p&gt;Looking back at the experience, this had some down&amp;nbsp;sides:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Some of what I wrote down was &amp;#8220;useless&amp;#8221;. Things …&lt;/li&gt;&lt;/ol&gt;</description><author>Beetle Space</author><pubDate>Sun, 06 Dec 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.nawaz.org/posts/2015/Dec/study-notes-in-the-information-age/</guid></item><item><title>Node, Postgres, MassiveJS - A better database experience</title><link>/2015/11/30/Node-Postgres-MassiveJS-A-better-database-experience/</link><description>&lt;p&gt;First some background–I&amp;rsquo;ve always had a bit of a love hate relationship with ORMs. ORMs are great for basic crud applications, which inevitably happens at some point for an app. The main two problems I have with ORMs is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;They treat all databases as equal (yes, this is a little overgeneralized but typically true). They claim to do this for database portability, but in reality an app still can&amp;rsquo;t just up and move from one to another.&lt;/li&gt;
&lt;li&gt;They don&amp;rsquo;t handle complex queries well at all. As someone that sees SQL as a very powerful language, taking away all the power just leaves me with pain.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Of course these aren&amp;rsquo;t the &lt;a href="https://kev.inburke.com/kevin/faster-correct-database-queries/"&gt;only issues&lt;/a&gt; with them, just the two ones I personally run into over and over.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In some playing with Node I was optimistic to explore &lt;a href="http://massive-js.readthedocs.org"&gt;Massive.JS&lt;/a&gt; as it seems to buck the trend of just imitating all other ORMs. My initial results–it makes me want to do more with Node just for this library. After all the power of a language is the ecosystem of libraries around it, not just the core language. So let&amp;rsquo;s take a quick tour through with a few highlights of what makes it really great.&lt;/p&gt;
&lt;h3 id="getting-setup"&gt;
&lt;div&gt;
Getting setup
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Without further adieu here&amp;rsquo;s a quick tour around it.&lt;/p&gt;
&lt;p&gt;First let&amp;rsquo;s pull down the example database from &lt;a href="http://postgresguide.com/setup/example.html"&gt;PostgresGuide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Then let&amp;rsquo;s setup out Node app:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ npm init
$ npm install massive --save
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="connecting-and-querying"&gt;
&lt;div&gt;
Connecting and querying
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Now let&amp;rsquo;s try to connect and say query a user from within our database. Create the following as an &lt;code&gt;index.js&lt;/code&gt; file, then run with &lt;code&gt;node index.js&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var massive = require(&amp;quot;massive&amp;quot;);
var connectionString = &amp;quot;postgres://ckerstiens:@localhost/example&amp;quot;;
var db = massive.connectSync({connectionString : connectionString});
db.users.find(1, function(err,res){
console.log(res);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Upon first run if you&amp;rsquo;re like me and use the &lt;a href="http://postgresguide.com/setup/example.html"&gt;PostgresGuide example database&lt;/a&gt; (which I now need to go back and tidy up), you&amp;rsquo;ll get the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;db.users.find(1, function(err,res){
^
TypeError: Cannot read property 'find' of undefined
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I can&amp;rsquo;t describe how awesome it is to see this. What&amp;rsquo;s happening is when Massive loads up it&amp;rsquo;s connecting to your database, checking what tables you have. In this case though because we don&amp;rsquo;t have a proper primary key defined it doesn&amp;rsquo;t load them. It could treat id as some magical field of course like Rails used to and ignore the need for an index, but instead it not only encourages a good database design but requires it.&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s go back and create our index in our database:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ psql example
$ alter table users add primary key (id);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alright now let&amp;rsquo;s run our script again with &lt;code&gt;node index.js&lt;/code&gt; and see what we have:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{ id: 1,
email: 'john.doe@gmail.com',
created_at: Thu Sep 24 2015 03:42:52 GMT-0700 (PDT),
deleted_at: null }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Perfect! Now we&amp;rsquo;re all connected and it even queried our database for us. Now let&amp;rsquo;s take a few more look at some of the operators.&lt;/p&gt;
&lt;h3 id="running-an-arbitrary-query"&gt;
&lt;div&gt;
Running an arbitrary query
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;db.run&lt;/code&gt; will let me run any arbritrary SQL. An example such as &lt;code&gt;db.run(&amp;quot;select 'hello'&amp;quot;)&lt;/code&gt; will produce [ { &amp;lsquo;?column?&amp;rsquo;: &amp;lsquo;hello&amp;rsquo; } ].&lt;/p&gt;
&lt;p&gt;This makes it nice and easier for us to break out of the standard ORM model and just run SQL.&lt;/p&gt;
&lt;h3 id="find-for-quick-look-ups"&gt;
&lt;div&gt;
Find for quick look ups
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Similar to so many other database tools &lt;code&gt;find&lt;/code&gt; will offer you the most common quick look ups:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ db.users.find({email: 'jane.doe@gmail.com'}, function(err, res){console.log(res)});
$ db.users.find({'created_at &amp;gt;': '2015-09-24'}, function(err, res){console.log(res)});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And of course there&amp;rsquo;s a where operator for multiple conditions.&lt;/p&gt;
&lt;h3 id="structuring-queries-in-your-application"&gt;
&lt;div&gt;
Structuring queries in your application
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;While in the next post I&amp;rsquo;ll dig in deep to JSON, this is perhaps my favorite feature of Massive&amp;hellip; It&amp;rsquo;s design for pulling out queries into individudal SQL files. Simply create a &lt;code&gt;db&lt;/code&gt; folder and put your SQL in there. Let&amp;rsquo;s take the most basic example of our user email lookup and put it in &lt;code&gt;user_lookup.sql&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT *
FROM users
WHERE email = $1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now back in our application we can run this and pass in a parameter to it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;db.user_lookup(['jane.doe@gmail.com'], function(err,res){
console.log(res);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This separation of our queries from our code makes it easier to track them, view diffs, and even more so &lt;a href="http://www.craigkerstiens.com/2012/11/17/how-i-write-sql/"&gt;create very readable SQL&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="up-next"&gt;
&lt;div&gt;
Up next
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;So sure, you can connect to a database, you can query some things. There were a couple of small but more novel things that we blew through in here. First is the fact I didn&amp;rsquo;t have to define all my schema, it just knew it as &lt;a href="http://www.craigkerstiens.com/2014/01/24/rethinking-limits-on-relational/"&gt;it really should&lt;/a&gt;. The separation of SQL queries you&amp;rsquo;ll custom write into files is simple, but will make for much more maintainable applications over the long term. And best of all is the JSON support, which I&amp;rsquo;ll get to soon&amp;hellip;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Mon, 30 Nov 2015 22:55:56 GMT</pubDate><guid isPermaLink="true">/2015/11/30/Node-Postgres-MassiveJS-A-better-database-experience/</guid></item><item><title>Quick update, and Hugo</title><link>https://benovermyer.com/blog/2015/11/quick-update-and-hugo/</link><description>&lt;p&gt;Well, it's been about two months since my last post, which ironically was about my intention to write more frequently. To be fair, I wrote in my journal a number of times between then and now, but this is my first public post since then. Today I discovered a Go-based static site generator called &lt;a href="http://www.gohugo.io/" rel="external"&gt;Hugo&lt;/a&gt; that fascinates me with its speed and usability. I'm going to try using it to replace the current structure and content of &lt;a href="http://benovermyer.com" rel="external"&gt;benovermyer.com&lt;/a&gt;.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Mon, 30 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/11/quick-update-and-hugo/</guid></item><item><title>Documentation has a Cost and a Value</title><link>https://cmdev.com/blog/2015-11-28-documentationcostvsvalue/</link><description>The cost of documentation is proportional to change frequency and distance from the code</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Sat, 28 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-28-documentationcostvsvalue/</guid></item><item><title>Build vs. Buy, Part 5</title><link>https://cmdev.com/blog/2015-11-20-buildvsbuy5/</link><description>Buy for parity, build for advantage</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Fri, 20 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-20-buildvsbuy5/</guid></item><item><title>White Chocolate Protein Flapjacks</title><link>https://rjp.is/blogging/posts/white-chocolate-protein-flapjacks-2/</link><description>Almost entirely a recipe I got from @chrismusther. Specific ingredients I used linked in [brackets].
Ingredients 75g Scottish Oats [Sainsbury&amp;rsquo;s] 75g Flax (Milled) [Linwoods Organic] 120g Whey Protein [Precision Engineered, Banana] 1 Apple (large) [Sainsbury&amp;rsquo;s 5 for £1] 300ml Apple Juice [Sainsbury&amp;rsquo;s Basics] 50g Mixed Fruit [Sainsbury&amp;rsquo;s Basics Dried] 30g Morello Cherries [Sainsbury&amp;rsquo;s Taste The Difference - Alternative] 20g Currants [Whitworths Juicy] 100g White Chocolate Chips [Sainsbury&amp;rsquo;s Cook&amp;rsquo;s] Method Put the oats, flax, whey protein, and chocolate chips into a bowl and mix loosely by hand to ensure a diverse community Grease up your silicon baking tray - 8&amp;quot; square is my preference Preheat your oven to about 150º / 305ºF / Gas Mark 2 Chop the apple as finely as you want the bits in your flapjacks but no finer than your sanity can allow Put the apple chunks, apple juice, and various fruits into a pan - precise ordering is irrelevant here Apply strong heat until the apple chunks go soft but before the juice really starts evaporating Pour the hot steaming fruit cocktail onto the aforementioned diverse oaty-flaxy-chocolatey-protein community and stir slowly but thoroughly This will create an astonishingly sticky mess that smells amazing - RESIST ALL TEMPTATION TO MASH YOUR FACE IN IT Carefully spoon the sticky mess into your baking tray, evening it out as much as you can (good luck with that) Place baking tray in oven and relax for 25-30 minutes until the top is firm Remove your delicious goodness from the oven and leave to cool before enjoying with a nice cup of tea Nutrition Based on the specific ingredients I used, MyFitnessPal reckons a 1/16th slice contains -</description><author>infrequent oscillations</author><pubDate>Thu, 19 Nov 2015 09:45:25 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/white-chocolate-protein-flapjacks-2/</guid></item><item><title>Build vs. Buy, Part 4</title><link>https://cmdev.com/blog/2015-11-19-buildvsbuy4/</link><description>Customization and programmability of commerical and bespoke software</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Thu, 19 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-19-buildvsbuy4/</guid></item><item><title>Why does the theatre cost ALL MY MONEY?</title><link>https://rjp.is/blogging/posts/why-does-the-theatre-cost-all-my-money-2/</link><description>In which we learn about the cost of theatre productions.</description><author>infrequent oscillations</author><pubDate>Wed, 18 Nov 2015 14:26:08 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/why-does-the-theatre-cost-all-my-money-2/</guid></item><item><title>Build Vs. Buy, Part 3</title><link>https://cmdev.com/blog/2015-11-18-buildvsbuy3/</link><description>Polist and quality comparisons in vendor vs in-house software</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Wed, 18 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-18-buildvsbuy3/</guid></item><item><title>Build Vs. Buy, Part 2.</title><link>https://cmdev.com/blog/2015-11-17-buildvsbuy2/</link><description>Upgrades and feature creep in commercial software</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Tue, 17 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-17-buildvsbuy2/</guid></item><item><title>Build vs. Buy -- Responding to All-or-Nothing Approaches</title><link>https://cmdev.com/blog/2015-11-16-buildvsbuy1/</link><description>Technology, cost, and quality in deciding build vs buy</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Mon, 16 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-16-buildvsbuy1/</guid></item><item><title>Continuous Integration, Misapplied</title><link>https://cmdev.com/blog/2015-11-15-continuousintegrationmisapplied/</link><description>Putting together an continuous-integration-style automated build and deploy halfway through the project is exponentially more effort than starting off with one. At some point in the project, it may even be that the effort outweighs the gain.</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Sun, 15 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-15-continuousintegrationmisapplied/</guid></item><item><title>LiveReload for Chrome extensions with Gulp</title><link>https://www.seanw.org/blog/livereload-for-chrome-extensions/</link><description>LiveReload is a fantastic feature to add to your development workflow to increase your productivity. The general idea is that when a change occurs to a file that makes up your app, your app is automatically rebuilt and the app restarts itself. This saves you from manually rebuilding and restarting your app each time you make a change and generally makes development much more pleasant.
There are LiveReload implementations available for many languages and frameworks such as tiny-lr which can be used with Gulp for web development.</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Sun, 15 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/livereload-for-chrome-extensions/</guid></item><item><title>HTTP/2 and SSL</title><link>https://rjp.is/blogging/posts/http-2-and-ssl-2/</link><description>rjp.is is now HTTPS-only; and also supports HTTP/2 [FAQ] for future proofing.
Here&amp;rsquo;s an owl to compensate for the entertainment-free nature of this post.</description><author>infrequent oscillations</author><pubDate>Fri, 13 Nov 2015 15:58:53 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/http-2-and-ssl-2/</guid></item><item><title>Fix Played Tracks with Empty Playcount in iTunes</title><link>https://donatstudios.com/iTunesPlaycountZeroFix</link><description>&lt;p&gt;I have a quite large iTunes library, and I’m rather anal about keeping my metadata clean and up to date.  In an earlier release of iTunes 12 there was a bug. Every so often after a song played, the Play Count would fail to increment, but the Last Played would update.&lt;/p&gt;
&lt;p&gt;Searching my library, I found 74 tracks that had this issue.&lt;/p&gt;
&lt;p&gt;I found this irritating and inaccurate, so I set forth finding a way to correct it.&lt;/p&gt;
&lt;p&gt;I wrote the following simple AppleScript to set the playcount of such tracks to 1.&lt;/p&gt;
&lt;p&gt;All you need to do is either paste the following into the 'Script Editor' or &lt;a href="https://cdn.rawgit.com/donatj/12b86fc65982e29f20a2/raw/3fd49e20267caf34d1ac60b62f2114a2ac57839c/FixITunesPlayedCount.applescript"&gt;download&lt;/a&gt; it and run it.  See video below if you need help running it once it’s open.&lt;/p&gt;
&lt;video controls="controls" loop="loop" preload="auto" style="display: block; margin: 0 auto;"&gt;
      &lt;source src="https://donatstudios.com/assets/60/fixitunes.mp4" type="video/mp4" /&gt;
      &lt;p&gt;To view this video please enable JavaScript and upgrade to a web browser that &lt;a href="https://videojs.com/html5-video-support/" target="_blank"&gt;supports HTML5 video&lt;/a&gt;&lt;/p&gt;
&lt;/video&gt;</description><author>Donat Studios</author><pubDate>Thu, 12 Nov 2015 05:50:58 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/iTunesPlaycountZeroFix</guid></item><item><title>How to cluster and failover (almost) anything - An intro to Pacemaker and Corosync</title><link>https://smcleod.net/2015/11/how-to-cluster-and-failover-almost-anything-an-intro-to-pacemaker-and-corosync/</link><description>&lt;h2 id="slides"&gt;Slides&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://media.githubusercontent.com/media/sammcj/smcleod_files/refs/heads/master/slides/cluster_anything.pdf"&gt;&lt;img alt="Click to Start Slides" src="https://smcleod.net//img/san/cluster_anything_screenshot.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="failover-demo"&gt;Failover Demo&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/sammcj/review/133110890/6f4900c090"&gt;&lt;img alt="Click to Start Failover Video" src="https://smcleod.net//img/san/lcmcpcmk.png" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Mon, 09 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/11/how-to-cluster-and-failover-almost-anything-an-intro-to-pacemaker-and-corosync/</guid></item><item><title>Tiny Keep (#blogtober 31)</title><link>https://rjp.is/blogging/posts/tiny-keep-blogtober-31-2/</link><description>THE END.
Tiny Keep has the distinction of being the last. But sadly not the best.
This is actual a fair reflection of me this evening.
They&amp;rsquo;ve bizarrely decided to use normal* console controls - left stick does movement, right stick controls the camera. This makes it nigh-on impossible to control reliably, especially when you get to combat later.
Managed to set myself and a bunch of enemies on fire. Oops.</description><author>infrequent oscillations</author><pubDate>Sun, 01 Nov 2015 01:08:55 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/tiny-keep-blogtober-31-2/</guid></item><item><title>No Brakes Valet (#blogtober 30)</title><link>https://rjp.is/blogging/posts/no-brakes-valet-blogtober-30-2/</link><description>Despite the name, you do have brakes. I didn&amp;rsquo;t realise this for quite a few games&amp;hellip;
Easy enough - park the cars in the parking bays.
Er, yeah.
Don&amp;rsquo;t ram the explosives truck with another vehicle, btw.
I cannot even.</description><author>infrequent oscillations</author><pubDate>Sat, 31 Oct 2015 01:55:00 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/no-brakes-valet-blogtober-30-2/</guid></item><item><title>searchcode local</title><link>https://boyter.org/2015/10/searchcode-local/</link><description>&lt;p&gt;I am going to copy the searchcode pitch itself below quickly before explaining it a bit further.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;searchcode offers powerful code search over billions of lines of open source code. Imagine what it could do with your private repositories.&lt;/p&gt;
&lt;p&gt;There have been requests to offer a downloadable version of searchcode. Given enough interest a downloadable hostable version of searchcode will be offered. Register your email below to register your interest.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 30 Oct 2015 09:56:37 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/10/searchcode-local/</guid></item><item><title>Hatoful Boyfriend (#blogtober 29)</title><link>https://rjp.is/blogging/posts/hatoful-boyfriend-blogtober-29-2/</link><description>I&amp;rsquo;m a girl. At a school for pigeons.
My best friend is a rock dove.
Here&amp;rsquo;s my teacher. He&amp;rsquo;s a quail. OBVIOUSLY.
Apparently I live in a cave.
This might be a side plot about pudding. Or it might be just another thing which is making my brain bleed out.
Oh ho ho, REFERENCES.
&amp;ldquo;RAGE VOLTAGE&amp;rdquo; is an excellent metaphor but everyone knows that it&amp;rsquo;s really Amps that do the damage.</description><author>infrequent oscillations</author><pubDate>Thu, 29 Oct 2015 22:44:47 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/hatoful-boyfriend-blogtober-29-2/</guid></item><item><title>Why Docker?</title><link>https://www.brightball.com/articles/why-docker</link><description>Containers are not a new thing, but implementing them was always a little more complicated than it needed to be. Docker made great leaps in simplification of containers and set the world on fire from there. Let’s look at why.</description><author>Brightball Articles</author><pubDate>Thu, 29 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/why-docker</guid></item><item><title>Qora (#blogtober 28)</title><link>https://rjp.is/blogging/posts/qora-blogtober-28-2-2/</link><description>Qora is a bit Sword &amp;amp; Sworcery but chunkier.
(Excuse the window decorations - I&amp;rsquo;m having to do this in a coffee shop without FRAPS because Spectre is going to make me too sad to play any games when I eventually get home after TWO DAMN HOURS of RELENTLESS DRIVEL.)
I&amp;rsquo;d like to point out here is that there&amp;rsquo;s no voice acting (rapidly becoming a pet hate of mine) in Qora - which means you can have lots of nice lovely textual conversations.</description><author>infrequent oscillations</author><pubDate>Wed, 28 Oct 2015 21:46:15 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/qora-blogtober-28-2-2/</guid></item><item><title>Prison Architect (#blogtober 27)</title><link>https://rjp.is/blogging/posts/prison-architect-blogtober-27-2/</link><description>I went into Prison Architect expecting a subtle, brooding, sneaky moral choice experience much like Papers Please (highly recommended, btw) &amp;hellip; and was promptly set about the head by a two by four as the first mission was to build an execution chamber and then execute someone.
Way to go with the subtle and brooding there, champ.
It&amp;rsquo;s just grim.
But hey ho, maybe that&amp;rsquo;s just the first &amp;ldquo;shocker&amp;rdquo; mission to loosen you up for some lovely subtle &amp;hellip; what&amp;rsquo;s that?</description><author>infrequent oscillations</author><pubDate>Wed, 28 Oct 2015 02:07:09 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/prison-architect-blogtober-27-2/</guid></item><item><title>Amnesia (#blogtober 26)</title><link>https://rjp.is/blogging/posts/amnesia-blogtober-26-2/</link><description>Finally getting around to Amnesia and &amp;hellip; meh. Games with voice acting really grind my weasels. It&amp;rsquo;s just such a waste of resources and effort and then all your dialog has to be plotted for voice and BLEUGH.
It actually took a while to get to this point - it turns out that you need to turn off &amp;ldquo;Display Scaling for High DPI&amp;rdquo; or the screen will be zoomed and the mouse will jank about like Keith Richards double teaming meth with crack.</description><author>infrequent oscillations</author><pubDate>Mon, 26 Oct 2015 23:42:14 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/amnesia-blogtober-26-2/</guid></item><item><title>The Long Dark (alpha) (#blogtober 25)</title><link>https://rjp.is/blogging/posts/the-long-dark-alpha-blogtober-25-2/</link><description>The Long Dark is like a first-person Don&amp;rsquo;t Starve - except prettier and more difficult.
This is the only game I&amp;rsquo;ve seen which lets you pick metric (correct!) and 24 hour clock (correct!).
Confusingly, even though the &amp;ldquo;Feels Like&amp;rdquo; went from -20º to -15º whilst I was playing, my temperature was heading downwards faster than everyone&amp;rsquo;s favourite* blue team.
I do like a realistic inventory, though.
You get some good scenery.</description><author>infrequent oscillations</author><pubDate>Mon, 26 Oct 2015 01:00:11 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/the-long-dark-alpha-blogtober-25-2/</guid></item><item><title>Gravity Ghost (#blogtober 24)</title><link>https://rjp.is/blogging/posts/gravity-ghost-blogtober-24-2/</link><description>Like one of those old Flash games where you had to propel your penguin between a bunch of planets to hit the black hole1, you have to leave one planet, get the star, and go through the door.
This is why I keep my hair violently short - I&amp;rsquo;m fed up of being harassed by animal spirits for free rides.
My luscious locks have snared me a space bunny!</description><author>infrequent oscillations</author><pubDate>Sat, 24 Oct 2015 23:26:26 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/gravity-ghost-blogtober-24-2/</guid></item><item><title>A Wizard's Lizard (#blogtober 23)</title><link>https://rjp.is/blogging/posts/a-wizards-lizard-blogtober-23-2/</link><description>A Wizard&amp;rsquo;s Lizard – which sounds like a dirty, dirty euphemism – seems to be heavily inspired by another game. See if you can guess which one.
PLOT.
This screen, dark though it may be, contains all the clues you need to know about which game heavily influenced this one.
It all seems to have gone a bit Dark Souls here - I died and now I&amp;rsquo;m unhollow? Or hollow-but-angel?</description><author>infrequent oscillations</author><pubDate>Fri, 23 Oct 2015 22:48:08 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/a-wizards-lizard-blogtober-23-2/</guid></item><item><title>Antichamber (#blogtober 22)</title><link>https://rjp.is/blogging/posts/antichamber-blogtober-22-2/</link><description>There&amp;rsquo;s probably some trick to Antichamber that I&amp;rsquo;m missing because the only non-obvious puzzle part I managed to figure out were the dreamcatchers and even then the wall had to hint heavily at it.
Which is a shame because it looks lovely. Probably one for the philosophy students.</description><author>infrequent oscillations</author><pubDate>Thu, 22 Oct 2015 22:25:07 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/antichamber-blogtober-22-2/</guid></item><item><title>The Adventures of Van Helsing (#blogtober 21)</title><link>https://rjp.is/blogging/posts/the-adventures-of-van-helsing-blogtober-21-2/</link><description>Abysmal. Awful. Arse. Atrocious.
I&amp;rsquo;m beginning to associate cut scenes and voice acting with games that should be put into the bin before they&amp;rsquo;re even made.
Also - picking 1440x480 as my screen resolution and only offering 1366x768 as the best option (&amp;ldquo;This change will take effect when the game restarts&amp;rdquo;) is a guaranteed deletion. Sorry chaps, you got one chance and you blew it.</description><author>infrequent oscillations</author><pubDate>Wed, 21 Oct 2015 22:07:44 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/the-adventures-of-van-helsing-blogtober-21-2/</guid></item><item><title>Naissancee (#blogtober 20)</title><link>https://rjp.is/blogging/posts/naisancee-blogtober-20-2/</link><description>Naissancee is lovely in a style sense but since I&amp;rsquo;ve already lost the tutorial droid within the first 5 minutes, got stuck in a room I can&amp;rsquo;t get out of without dying -and- being returned to a point two steps before a level load, I&amp;rsquo;m not going to bother playing it any more. Just enjoy the pictures.</description><author>infrequent oscillations</author><pubDate>Tue, 20 Oct 2015 21:51:59 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/naisancee-blogtober-20-2/</guid></item><item><title>Crawl (#blogtober 19)</title><link>https://rjp.is/blogging/posts/crawl-blogtober-19-2/</link><description>I -think- Crawl is some kind of retro-styled take on Dark Souls but &amp;hellip; I didn&amp;rsquo;t really have much of a clue what was going on. Maybe with more reading of instructions and tips it would make sense.
Everyone worships Teok, right?
Pretty sure I&amp;rsquo;ve just had my innards tenderised here.
It does have a nifty death animation.
And then there&amp;rsquo;s something about upgrading monsters based on how much wrath you have?</description><author>infrequent oscillations</author><pubDate>Mon, 19 Oct 2015 21:11:10 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/crawl-blogtober-19-2/</guid></item><item><title>RocketsRocketsRockets (#blogtober 18)</title><link>https://rjp.is/blogging/posts/rocketsrocketsrockets-blogtober-18-2/</link><description>The visuals are nice but it zooms in and out like a pumping weasel is at the controls and seriously - if I&amp;rsquo;m a rocket ship, left means &amp;ldquo;turn left&amp;rdquo;, it NEVER means &amp;ldquo;fly left&amp;rdquo;. Shame, really, because the visuals are lovely.</description><author>infrequent oscillations</author><pubDate>Sun, 18 Oct 2015 20:42:36 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/rocketsrocketsrockets-blogtober-18-2/</guid></item><item><title>Capsule (#blogtober 17)</title><link>https://rjp.is/blogging/posts/capsule-blogtober-17-2/</link><description>Capsule might be a contender for peak game of #blogtober. Atmosphere (literally), tension, and an actual story conveyed by recovered emails rather than garish cutscenes, uncanny valley facial animation, and terrible dialog.
You have to get your capsule to the next waypoint without running out of oxygen or power because bad things happen when you run out of either.
Your only help is a sonar ping that will (slowly) identify what&amp;rsquo;s around you.</description><author>infrequent oscillations</author><pubDate>Sat, 17 Oct 2015 21:29:00 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/capsule-blogtober-17-2/</guid></item><item><title>Human Resource Machine (#blogtober 16)</title><link>https://rjp.is/blogging/posts/human-resource-machine-blogtober-16-2/</link><description>TL;DR: GLORIOUS. Buy it now. Even if you don&amp;rsquo;t like the game, Tomorrow Corporation deserve all the money they can get to keep making lovely sweet games for ME.
I&amp;rsquo;m more than reasonably sure this is going to be Peak Game for #blogtober. After the surprising depth of Little Inferno, Human Resource Machine was a no-brainer pre-order and here it is.
I think the third one bears a striking resemblance to my current form.</description><author>infrequent oscillations</author><pubDate>Sat, 17 Oct 2015 00:05:18 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/human-resource-machine-blogtober-16-2/</guid></item><item><title>A Virus Named Tom (#blogtober 15)</title><link>https://rjp.is/blogging/posts/a-virus-named-tom-blogtober-15-2/</link><description>Remember Pipe Mania? Well, A Virus Named Tom is basically a tarted up Pipe Mania with a plot.
See? Plot.
I&amp;rsquo;m stuck here because all the &amp;ldquo;encrypted&amp;rdquo; (aka &amp;ldquo;hidden&amp;rdquo;) tiles are straight pieces and I can&amp;rsquo;t figure out how everything connects up. Plus the rotation of the pieces is done by dragging the little robot around the border and trust me, that gets pretty old pretty damned fast as a control mechanic.</description><author>infrequent oscillations</author><pubDate>Thu, 15 Oct 2015 22:28:41 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/a-virus-named-tom-blogtober-15-2/</guid></item><item><title>Monitoring with Bosun</title><link>https://www.brightball.com/articles/monitoring-with-bosun</link><description>Bosun is a monitoring and alerting system developed by the good folks at Stack Exchange, then open sourced for the rest of us. It’s written in Go, meaning its monitoring agents can run anywhere that Go can drop a binary… which is just about everywhere. So what exactly does it do and how does it compare to the likes of New Relic, CloudWatch, Nagios, Splunk Cloud, Server Density, and other monitoring tools?</description><author>Brightball Articles</author><pubDate>Thu, 15 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/monitoring-with-bosun</guid></item><item><title>Dustforce (#blogtober 14)</title><link>https://rjp.is/blogging/posts/dustforce-blogtober-14-2/</link><description>You have to sweep up leaves. Sadly without actually using your brush - a simple run through is sufficient to magically displace them into a nether dimension.
The jumping and controls are horribly floaty and syrupy and laggy and ugh.
AND it not only doesn&amp;rsquo;t have controller support by default, it let me accidentally assign the same joypad button (&amp;ldquo;pad0_dir2&amp;rdquo; is also a tremendously horribly label) to two different directions.</description><author>infrequent oscillations</author><pubDate>Thu, 15 Oct 2015 00:40:01 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/dustforce-blogtober-14-2/</guid></item><item><title>Torchlight (#blogtober 13)</title><link>https://rjp.is/blogging/posts/torchlight-blogtober-13-2/</link><description>A hacky-slashy adventure RPG - kinda like Geneforge but with 90% of the budget spent on 3D modelling and voice actors instead of plot and story.
Although it does have a rudimentary plot.
It does look awfully pretty - but I can see myself playing Geneforge in preference to this just because it&amp;rsquo;s much more satisfying than this melange of mishmash.</description><author>infrequent oscillations</author><pubDate>Wed, 14 Oct 2015 00:50:36 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/torchlight-blogtober-13-2/</guid></item><item><title>Mirror Moon (blogtober #12)</title><link>https://rjp.is/blogging/posts/mirror-moon-blogtober-12-2/</link><description>Baffling space exploratory puzzle something something.
Possibly the tiniest minimalist title screen yet.
Looking a bit like a low rent NES-inspired Elite Dangerous here.
That&amp;rsquo;s quickly dispelled once you arrive on the first planet.
Except I can&amp;rsquo;t really say anything about the next few screenshots since it&amp;rsquo;s probably spoilery. (I will say that I had to resort to walkthroughs because they do a bloody awful job of letting you know what you&amp;rsquo;re supposed to be doing.</description><author>infrequent oscillations</author><pubDate>Mon, 12 Oct 2015 23:32:54 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/mirror-moon-blogtober-12-2/</guid></item><item><title>How to get better at software development?</title><link>https://captnemo.in/blog/2015/10/12/get-better-at-software-development/</link><description>&lt;p&gt;I often get a lot of queries from people asking me about how to get started with software development, and how to get better at it. My replies are almost reaching stock-level worthy of copy-paste now, so I thought I might as well write about it publicly.&lt;/p&gt;

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

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

&lt;p&gt;&lt;strong&gt;Thanks&lt;/strong&gt; to &lt;a href="https://shashankmehta.in"&gt;Shashank Mehta&lt;/a&gt; for discussing these ideas
with me and helping me frame this post.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Mon, 12 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/10/12/get-better-at-software-development/</guid></item><item><title>Titan Attacks (#blogtober 11)</title><link>https://rjp.is/blogging/posts/titan-attacks-blogtober-11-2/</link><description>Basically a fancy Space Invaders with upgradable weapons and savable hostages a la Defender.
They&amp;rsquo;re confused. Points win prizes, not perfection. Silly aliens.</description><author>infrequent oscillations</author><pubDate>Sun, 11 Oct 2015 18:56:33 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/titan-attacks-blogtober-11-2/</guid></item><item><title>The Floor Is Jelly (blogtober #10)</title><link>https://rjp.is/blogging/posts/the-floor-is-jelly-blogtober-10-2/</link><description>Puts me in mind of a weird cross between the creature innards levels of Loco Roco and Bugaboo The Flea.
Simple - just bounce your way around the jelly floors to reach the curtains (or lift, later.)
This is a cute level - to reach the curtains, you need to properly trampoline yourself with good timing to get a super jump. Just in case the player hasn&amp;rsquo;t realised this is possible, the little frog on the right is demonstrating.</description><author>infrequent oscillations</author><pubDate>Sun, 11 Oct 2015 00:19:24 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/the-floor-is-jelly-blogtober-10-2/</guid></item><item><title>Spy Chameleon (#blogtober 9)</title><link>https://rjp.is/blogging/posts/spy-chameleon-blogtober-9-2-2/</link><description>The screenshots tell pretty much the whole story and I&amp;rsquo;ve got to get up early.
Enjoy.</description><author>infrequent oscillations</author><pubDate>Sat, 10 Oct 2015 00:30:52 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/spy-chameleon-blogtober-9-2-2/</guid></item><item><title>FEZ (#blogtober 8)</title><link>https://rjp.is/blogging/posts/fez-blogtober-8-2/</link><description>One of the big indies that I&amp;rsquo;ve somehow managed to avoid playing until now.
I wonder if she has any kerosene
Geezer has some cracking industrial strength drugs, it seems.
Um, Lament Configuration, anyone? &amp;ldquo;We have such cubes to show you.&amp;rdquo; &amp;ldquo;This will seem like a memory of 2D!&amp;rdquo; etc. etc.
Then the titular headwear arrives from the Lament giant Devil Square and Gomez can move 2D-wise through 3D. (It&amp;rsquo;ll make sense when you play the game.</description><author>infrequent oscillations</author><pubDate>Fri, 09 Oct 2015 00:52:12 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/fez-blogtober-8-2/</guid></item><item><title>HEAVY BULLETS (#blogtober 7)</title><link>https://rjp.is/blogging/posts/heavy-bullets-blogtober-7-2/</link><description>HEAVY BULLETS (or &amp;ldquo;superneonshootybang&amp;rdquo; as I&amp;rsquo;m now going to call it) is kinda DOOMy but with a twist - you have a revolver, 6 bullets, and the only reloads you get are when you retrieve the ones you&amp;rsquo;ve shot.
There&amp;rsquo;s some plot about something going horribly wrong, yada yada.
Amusingly, the graffiti seems to be from a random selection of anti-corporate &amp;amp; anti-rich slogans.
All the neon lushness makes me happy.</description><author>infrequent oscillations</author><pubDate>Wed, 07 Oct 2015 23:20:15 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/heavy-bullets-blogtober-7-2/</guid></item><item><title>SAN Intro</title><link>https://smcleod.net/2015/10/san-intro/</link><description>&lt;div style="padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
        
        
      &lt;/div&gt;</description><author>smcleod.net</author><pubDate>Wed, 07 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/10/san-intro/</guid></item><item><title>Point Perfect (#blogtober 6)</title><link>https://rjp.is/blogging/posts/point-perfect-blogtober-6-2/</link><description>Ever wanted to fly a mouse cursor into space? Defeat hordes of alien creatures in a series of mini-games? Can you drag-n-drop the alien scum into the bin of destiny?
Then Point Perfect is for you.
You get three rounds of silliness - lowest score ignored - and they all revolve around manipulating your mouse cursor spaceship.
You have no weapons - obvs, you&amp;rsquo;re flying a mouse cursor - and the only way to eliminate aliens is to highlight one (or more if you&amp;rsquo;re nimble) with your targeting skills and let the orbital laser take them out for you.</description><author>infrequent oscillations</author><pubDate>Wed, 07 Oct 2015 00:56:06 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/point-perfect-blogtober-6-2/</guid></item><item><title>The Organ Trail (blogtober #5)</title><link>https://rjp.is/blogging/posts/the-organ-trail-blogtober-5/</link><description>No prizes for guessing what game this is parodying&amp;hellip;
And the intro is pitch perfect.
Yes, he&amp;rsquo;s managed to break his arm driving a car down the road. Damn trails.
Once you&amp;rsquo;re passed the intro (and gunfighting with HORRIFYINGLY BAD CONTROLS), you get to visit some cities&amp;hellip;
And yes, you have to contend with zombies stupid pop culture green monsters who bite the living. Apart from that, it&amp;rsquo;s your bog-standard Oregon Trail-alike (with HORRIFYINGLY BAD SHOOTING CONTROLS.</description><author>infrequent oscillations</author><pubDate>Mon, 05 Oct 2015 19:55:33 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/the-organ-trail-blogtober-5/</guid></item><item><title>Race The Sun (#blogtober 4)</title><link>https://rjp.is/blogging/posts/race-the-sun-blogtober-4-2/</link><description>Did you play 3D Deathchase as a child? But now you have a hankering after a thoroughly modern version to replicate that nauseating motion sickness?
Welcome to [Race The Sun].
Ok, that&amp;rsquo;s the title screen and looks nothing like 3D Deathchase. Once you get going, however, &amp;hellip;
You have to avoid the things and pick up the other things and there&amp;rsquo;s moving things and jumpy things and you just keep going until you splatter your intestines over something or the sun goes down.</description><author>infrequent oscillations</author><pubDate>Sun, 04 Oct 2015 18:55:46 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/race-the-sun-blogtober-4-2/</guid></item><item><title>Geneforge (#blogtober 3)</title><link>https://rjp.is/blogging/posts/geneforge-blogtober-3-2/</link><description>After reading the excellent blog of Jeff Vogel for many years, I eventually got around to buying The Geneforge Saga from GOG.
It&amp;rsquo;s a charmingly old-worlde rustic RPG from the days when graphics cards cost as much as a small van and CPUs were the size of a small van.
Fancy splash screen and astonishingly green menu screen for your edification.
Before you start, you have to do the obligatory &amp;ldquo;assign points to categories&amp;rdquo; character creation screen.</description><author>infrequent oscillations</author><pubDate>Sun, 04 Oct 2015 00:21:40 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/geneforge-blogtober-3-2/</guid></item><item><title>Seeding a sharing-economy or platform company</title><link>/2015/10/02/Seeding-a-sharing-economy-or-platform-company/</link><description>&lt;p&gt;These days if you&amp;rsquo;re creating a company you likely hope to accomplish more with less people, two ways of doing this fall to: The sharing economy and creating a platform. It&amp;rsquo;s easy to see the case for this when you have such &lt;a href="http://graphics.wsj.com/billion-dollar-club/"&gt;unicorns&lt;/a&gt; like AirBnB or Uber. The opportunity for each of those to compete against hotel chains or taxi services which each need to manage their own inventory is incredibly exciting and revolutionary. In a similar fashion platforms can offer much the same, Heroku&amp;rsquo;s platform and marketplace made it easier than ever for developers to click a button and get everything they needed years ago. It&amp;rsquo;s not just their code, it&amp;rsquo;s everything from &lt;a href="https://www.heroku.com/postgres"&gt;Postgres&lt;/a&gt; to Mongo to &lt;a href="https://elements.heroku.com/addons#logging"&gt;Logging&lt;/a&gt;. Or take the app store as example. Smart phones weren&amp;rsquo;t a new thing when the iPhone came out, but it was only the saviest of users that had apps installed on their windows smartphone or blackberry. The app store made the iPhone different than any other phone by allowing others to build and improve it, turning the iPhone not into a phone but a platform.&lt;/p&gt;
&lt;p&gt;Platforms and the sharing economy both let you get further than having to take on the costs of offering the equivilent all on your own. And while a great idea to venture into one of these two areas, starting them isn&amp;rsquo;t as trivial as simply deciding to. For both of these you have issues with having a two sided market, first you have to convince the providers to come along, then the customers or vice versa. As a result of this two sided market issue the easiest way to actually start is by bootstrapping it yourself – or faking it til you make it.&lt;/p&gt;
&lt;p&gt;What are some good examples of faking this? I&amp;rsquo;m sure you can probably find some good stories going back about AirBnB or Uber, but let&amp;rsquo;s assume times were different then. Let&amp;rsquo;s take a look at a very recent example: &lt;a href="http://techcrunch.com/2015/08/26/lugg-an-app-for-on-demand-short-distance-moves-raises-3-8-million/"&gt;Lugg&lt;/a&gt; which just launched in the latest batch of YC. Lugg is Uber for moving essentially, allowing you to on-demand request furniture moved from one place to another. Early on Lugg built their app, then waited for requests to come in, then the founders got in a truck and moved the furniture themselves. As a customer the founders are likely providing a great experience, without ever having to tip their hat at the ways their hacking the impression of being a large well oiled machine.&lt;/p&gt;
&lt;p&gt;But what about a platform? Slack continues to grow like wildfire as the new medium for communication. These days there&amp;rsquo;s endless integrations for slack, and I expect they&amp;rsquo;ll continue to expand what a platform for communication looks like. But a year ago they were quite a ways from having people show up at their door to add an integration. Sure there were people using them, but to expect github/trello/asana to immediately build an integration for every new flavor of the week tool would be crazy. Yet, without these integrations slack wouldn&amp;rsquo;t be nearly as useful as it is today–and probably wouldn&amp;rsquo;t have seen the growth it&amp;rsquo;s seen. In the early days of a platform the easiest way to get these integrations and partners in place is to show up and build the work yourself. Slack carried the weight early of building these integrations, much as Heroku add-ons showed up at partners offices and help write the code to get them as a provider in the marketplace. And while both Slack and Heroku are larger companies now, it still holds true for smaller ones starting today. &lt;a href="https://www.blockspring.com/"&gt;Blockspring&lt;/a&gt;, a company which aims to make web services available through spreadsheets, had to do very much the same thing building their initial integrations themselves. Now with their rapidly growing user base and already large collection of APIs they may be able to shift the model, but early on that wasn&amp;rsquo;t so much an option.&lt;/p&gt;
&lt;p&gt;If you want to build a platform, start by creating the impression of one while still carrying the load yourself. Yes, move to a true platform as soon as you can, but don&amp;rsquo;t wait for others to show up before you go that route.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Fri, 02 Oct 2015 23:55:56 GMT</pubDate><guid isPermaLink="true">/2015/10/02/Seeding-a-sharing-economy-or-platform-company/</guid></item><item><title>The Bridge (#blogtober 2)</title><link>https://rjp.is/blogging/posts/the-bridge-blogtober-2-2/</link><description>Day two brings The Bridge which brings the lovely charcoal sketch aesthetic to a world of Escher-like puzzles. There&amp;rsquo;s also a Braid-alike &amp;ldquo;turn back time&amp;rdquo; mechanic but I don&amp;rsquo;t know if it becomes relevant to later puzzles or is just a &amp;ldquo;BIG WHOOPSIE UNDO&amp;rdquo; button.
Our hero has fallen asleep under an apple tree. You can see where this is going&amp;hellip;
After a mini-tutorial on the controls (which also serves to wake him up), you trudge off to find his house.</description><author>infrequent oscillations</author><pubDate>Fri, 02 Oct 2015 23:43:01 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/the-bridge-blogtober-2-2/</guid></item><item><title>#blogtober</title><link>https://rjp.is/blogging/posts/dungeon-souls-2/</link><description>Or &amp;ldquo;let&amp;rsquo;s try #septemblog again&amp;rdquo;. For each day in #blogtober, I&amp;rsquo;m supposed to be playing one of my many unplayed games that I&amp;rsquo;ve accumulated through things like Humble Bundle.
First up is Dungeon Souls - a &amp;ldquo;2-D top-down hack n&amp;rsquo; slash/RPG game&amp;rdquo;. (Not sure why FRAPS isn&amp;rsquo;t capturing the full glory of the title screen there.)
Which is exactly what it says on the tin - you pick your bog-standard class of RPG adventurer,</description><author>infrequent oscillations</author><pubDate>Thu, 01 Oct 2015 23:50:42 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/dungeon-souls-2/</guid></item><item><title>Replacing Junos Pulse with OpenConnect</title><link>https://smcleod.net/2015/09/replacing-junos-pulse-with-openconnect/</link><description>&lt;p&gt;In an attempt to avoid using the Juniper Pulse (Now Pulse Secure) VPN client we tried OpenConnect but found that DNS did not work correctly when connected to the VPN.
This bug has now been resolved recently but has not made it&amp;rsquo;s way into a new build, in fact there have been no releases for 6 months.&lt;/p&gt;
&lt;p&gt;Luckily the OpenConnect was not too difficult to build from source.&lt;/p&gt;
&lt;h2 id="build-openconnect-on-osx"&gt;Build OpenConnect on OSX&lt;/h2&gt;
&lt;h3 id="remove-old-openconnect-and-install-deps"&gt;Remove old openconnect and install deps&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew remove openconnect
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install libxml2 lzlib openssl libtool libevent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="build-openconnect"&gt;Build openconnect&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget git.infradead.org/users/dwmw2/openconnect.git/snapshot/0f1ec30d17aa674142552e275bf3fac30d891b39.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar zxvf 0f1ec30d17aa674142552e275bf3fac30d891b39.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; openconnect-0f1ec30
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LIBTOOLIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;glibtoolize ./autogen.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/opt/gettext/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="to-connect"&gt;To connect&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo openconnect --juniper -u myusername www.myserver.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;re comfortable with allowing admin users to run openconnect without entering a sudo password, add the following using &lt;code&gt;sudo visudo&lt;/code&gt;:&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Tue, 22 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/09/replacing-junos-pulse-with-openconnect/</guid></item><item><title>Taking up the writing habit again</title><link>https://benovermyer.com/blog/2015/09/taking-up-the-writing-habit-again/</link><description>&lt;p&gt;A few days ago, I migrated all of my blog posts from my last primary blog on WordPress.com to this blog. In the process, I read over a lot of old posts. I noticed something interesting: back in 2007 and 2008, I was writing blog posts with fair regularity. Now, it's a rarity. The blog posts back then were fairly journal-like in character. They told a story of what I was working on, how I felt on certain subjects, and described some of my adventures in games I was playing at the time. The blog posts I wrote in the recent past trend towards the same thing when they're more frequent. When I choose to try and write something &lt;em&gt;useful&lt;/em&gt;, like the Laravel on Docker post, it takes a lot longer, a lot more effort, and is a lot more intimidating to start on. So as I sit here sipping on my orange pekoe black tea, listening to relaxing acoustic guitar, and writing these words, I'm thinking that I should allow myself to write journal-style posts again. This, if for no other reason than to ingrain that old writing habit. It'll be easier to write the big, important stuff if the simple stuff - the writing - comes naturally, right?&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sat, 19 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/09/taking-up-the-writing-habit-again/</guid></item><item><title>Heroku Data Links with Postgres and Redis</title><link>https://www.brightball.com/articles/heroku-data-links-with-postgres-and-redis</link><description>PostgreSQL has a great feature called Foreign Data Wrappers (FDW) that allows it to connect directly to outside systems. Although the setup can be a little complicated, once it’s available you can run queries with joins or subqueries against them, insert data, create views, etc. Heroku has dramatically simplified the process of using FDW with PostgreSQL and Redis thanks to Data Links. Let’s try it out.</description><author>Brightball Articles</author><pubDate>Wed, 16 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/heroku-data-links-with-postgres-and-redis</guid></item><item><title>SSD Storage - Two Months In Production</title><link>https://smcleod.net/2015/09/ssd-storage-two-months-in-production/</link><description>&lt;p&gt;Over the last two months I&amp;rsquo;ve been running selected IO intensive servers off the the SSD storage cluster, these hosts include (among others) our:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primary Puppetmaster&lt;/li&gt;
&lt;li&gt;Gitlab server&lt;/li&gt;
&lt;li&gt;Redmine app and database servers&lt;/li&gt;
&lt;li&gt;Nagios servers&lt;/li&gt;
&lt;li&gt;Several Docker database host servers&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reliability"&gt;Reliability&lt;/h3&gt;
&lt;p&gt;We haven&amp;rsquo;t had any software or hardware failures since commissioning the storage units.&lt;/p&gt;
&lt;p&gt;During this time we have had 3 disk failures on our HP StoreVirtual SANs that have required us to call the supporting vendor and replace failed disks.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Sun, 13 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/09/ssd-storage-two-months-in-production/</guid></item><item><title>Get Going with Laravel on Docker</title><link>https://benovermyer.com/blog/2015/09/get-going-with-laravel-on-docker/</link><description>&lt;p&gt;&lt;em&gt;This post was updated May 14th, 2016 to significantly rework the tutorial.&lt;/em&gt; Docker is slowly taking over the world of web infrastructure. It makes working with multiple different services easy, and the problem of “works in dev, not in prod” goes away, since you have the same environment on your local machine as you do in the production infra. It also makes things like trying out web apps without deploying them to servers really easy. Ever wanted to just check out a personal demo of, say, WordPress or Ghost? Docker makes that simple. Docker can be intimidating to start out with. It's a complex beast, but once you've gotten it set up a couple times, it'll become second nature. This article will walk through the entire process of having a completely new and fresh Mac OS X environment all the way to running Docker container with your own Laravel application. It's a long tutorial, so grab a big mug of coffee and put on your favorite track and let's get to work. &lt;em&gt;Note: This tutorial is for OS X. A lot of the pre-req stuff is different for Windows, so if you're running that OS, you might be better off using Docker Toolbox. Until the new Docker App comes out, anyway.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="prerequisites"&gt;Prerequisites&lt;/h1&gt;
&lt;p&gt;The first step is getting some basic tools installed. OS X comes with git and Ruby installed, but we need to make a slight adjustment to our Ruby environment, and we'll need Homebrew to install some other things.&lt;/p&gt;
&lt;h2 id="homebrew"&gt;Homebrew&lt;/h2&gt;
&lt;p&gt;Let's start with Homebrew. Paste this into a terminal prompt:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;ruby -e &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Running that will install Homebrew. Next, we'll need Homebrew Cask:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;brew install caskroom/cask/brew-cask&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is used to install binary applications that otherwise you'd use a GUI for.&lt;/p&gt;
&lt;h2 id="virtualbox"&gt;Virtualbox&lt;/h2&gt;
&lt;p&gt;Let's install this via Homebrew Cask to make things easy.&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;brew cask install virtualbox&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="enter-docker"&gt;Enter Docker&lt;/h1&gt;
&lt;p&gt;Now we get to the meat of it - installing Docker and the other tools necessary to work with containers. We're going to be using a wrapper called dinghy for this. You could use the official &lt;a href="https://www.docker.com/toolbox" rel="external"&gt;Docker Toolbox&lt;/a&gt;, but the default VM that it provides, boot2docker, relies on vboxfs, which makes real-time updates (like &lt;code&gt;gulp watch&lt;/code&gt;) really slow.&lt;/p&gt;
&lt;h2 id="install-docker-toolbox"&gt;Install Docker Toolbox&lt;/h2&gt;
&lt;p&gt;When I originally wrote this post, Docker Toolbox made some questionable assumptions about how people were using Docker for development. Those have now been corrected, and it's safe to go ahead and install Docker Toolbox. You can get that here: &lt;a href="https://www.docker.com/products/docker-toolbox" rel="external"&gt;https://www.docker.com/products/docker-toolbox&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="docker-is-installed-now-what"&gt;Docker is installed! Now what?&lt;/h2&gt;
&lt;p&gt;Now everything is all set up and ready to get container-ing. In the next section, we'll create a basic Laravel app to get a proper Docker workflow going.&lt;/p&gt;
&lt;h1 id="gettingsetupforlaravel"&gt;Getting set up for Laravel&lt;/h1&gt;
&lt;p&gt;For this tutorial, we're going to use the Laravel framework. This will demonstrate how to use multiple containers while not requiring us to write a ton of code to get started.&lt;/p&gt;
&lt;h2 id="install-composer"&gt;Install Composer&lt;/h2&gt;
&lt;p&gt;PHP is installed by default with OS X, but you're going to need Composer also. Thankfully, it's a quick install:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make sure that composer is in your PATH in your bash/zsh profile. Look for this line: &lt;code&gt;~/.composer/vendor/bin&lt;/code&gt; If it's nowhere in the file, you'll need to add something like this near the bottom of the file:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;export PATH=&amp;quot;$PATH:~/.composer/vendor/bin&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="install-the-laravel-cli-tool"&gt;Install the Laravel CLI tool&lt;/h2&gt;
&lt;p&gt;This tool makes starting new Laravel projects much easier and faster:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;composer global require laravel/installer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="start-a-new-laravel-project"&gt;Start a new Laravel project&lt;/h2&gt;
&lt;p&gt;In a directory that makes sense for you (I use &lt;code&gt;~/Source/&lt;/code&gt; for my code projects), run this shell command:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;laravel new docker-app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will create a new Laravel project called “docker-app” in a new docker-app directory. You're now ready to Docker-ize this app!&lt;/p&gt;
&lt;h1 id="dockerize"&gt;Docker-ize!&lt;/h1&gt;
&lt;p&gt;The next step is to create four files that we'll use to describe our container environment. These files are &lt;code&gt;nginx-vhost.conf&lt;/code&gt;, &lt;code&gt;supervisord.conf&lt;/code&gt;, &lt;code&gt;Dockerfile&lt;/code&gt;, and &lt;code&gt;docker-compose.yml&lt;/code&gt;. Each of these is at the root of your project. The contents of each file is as follows:&lt;/p&gt;
&lt;h2 id="nginx-vhost-conf"&gt;nginx-vhost.conf&lt;/h2&gt;
&lt;p&gt;We're using nginx as the web server for this app. We could use Apache, but for this exercise, we'll stick with nginx. The below file configures the virtualhost that will expose our Laravel app to the container.&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;server {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; listen 80;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; listen [::]:80 default ipv6only=on;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; root /srv/www/public;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; index index.php;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; # Disable sendfile as per https://docs.vagrantup.com/v2/synced-folders/virtualbox.html&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; sendfile off;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; # Add stdout logging&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; error_log /dev/stdout info;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; access_log /dev/stdout;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; location / {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; try_files $uri $uri/ /index.php$is_args$args;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; location ~ .php$ {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; try_files $uri =404;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; fastcgi_split_path_info ^(.+.php)(/.+)$;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; fastcgi_pass unix:/var/run/php5-fpm.sock;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; fastcgi_param SCRIPT_NAME $fastcgi_script_name;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; fastcgi_index index.php;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; include fastcgi_params;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; location ~* .(jpg|jpeg|gif|png|css|js|ico|xml)$ {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; expires 5d;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; # deny access to . files, for security&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; location ~ /. {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; log_not_found off;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; deny all;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="supervisord-conf"&gt;supervisord.conf&lt;/h2&gt;
&lt;p&gt;We're using Supervisor to run nginx and PHP-FPM. It makes things a little cleaner and easier. Below is the config file for Supervisor.&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;[supervisord]&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;nodaemon=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;[program:php5-fpm]&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;command=/usr/sbin/php5-fpm&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;autostart=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;autorestart=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;priority=5&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;[program:nginx]&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;command=/usr/sbin/nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;autostart=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;autorestart=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;priority=10&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;stdout_events_enabled=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;stderr_events_enabled=true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="dockerfile"&gt;Dockerfile&lt;/h2&gt;
&lt;p&gt;For a guide to the syntax you see below, check out the &lt;a href="https://docs.docker.com/reference/builder/" rel="external"&gt;official Docker documentation for Dockerfiles&lt;/a&gt;.&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;FROM ubuntu:14.04&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;ENV DEBIAN_FRONTEND noninteractive&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get update -y&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get install -y software-properties-common&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN add-apt-repository ppa:nginx/development&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get update -y&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get upgrade -y&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get install -y supervisor nginx php5-fpm php5-cli php5-curl php5-gd php5-mysql php5-memcached php5-mcrypt&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Clean up to reduce container size&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get remove --purge -y software-properties-common&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get autoremove -y&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get clean&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get autoclean&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN echo -n &amp;gt; /var/lib/apt/extended_states&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN rm -rf /var/lib/apt/lists/*&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN rm -rf /usr/share/man/??&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN rm -rf /usr/share/man/??_*&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Configure php-fpm to not run as a daemon&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN sed -e 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN sed -e 's/;listen.owner/listen.owner/' -i /etc/php5/fpm/pool.d/www.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN sed -e 's/;listen.group/listen.group/' -i /etc/php5/fpm/pool.d/www.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Configure nginx to not run as a daemon&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN echo &amp;quot;daemon off;&amp;quot; &amp;gt;&amp;gt; /etc/nginx/nginx.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# This next line lets nginx write to your working directory&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN usermod -u 1000 www-data&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Configure nginx virtualhost&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN rm -Rf /etc/nginx/conf.d/*&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN rm -Rf /etc/nginx/sites-available/default&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;ADD ./nginx-vhost.conf /etc/nginx/sites-available/default.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Add the application code into the container&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;ADD . /srv/www&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Configure Supervisor&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;ADD ./supervisord.conf /etc/supervisor/conf.d/supervisor.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Fix permissions&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN chown -Rf www-data:www-data /srv/www/&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Set our working directory&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;WORKDIR /srv/www&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Expose Ports&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;EXPOSE 80&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# And finally, run the command to kickstart everything&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;CMD [&amp;quot;/usr/bin/supervisord&amp;quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above file is telling Docker how to build the container. It includes nginx and PHP-FPM, but it leaves database and cache store to other containers. The container's main job is to serve the Laravel application at &lt;code&gt;/srv/www&lt;/code&gt; in the container on port 80 using nginx and PHP-FPM.&lt;/p&gt;
&lt;h2 id="docker-compose-yml"&gt;docker-compose.yml&lt;/h2&gt;
&lt;p&gt;This file is what Docker Compose will use to build our stack and link up the containers the app needs to function. It defines three containers - web, db, and cache. The “volumes” part of the web container's definition here will map your source code directory on your host to the container's app directory, which will let you update your container by editing files on your host without having to rebuild the container. Under the db container, you'll see the “environment” section. This is a list of environment variables that will be set in the MySQL container. The two blank ones will use the environment variable of the same name on your host to set them inside the container, which is far more secure than putting these values into version control! Just make sure that you set them! That'll happen in your bash/zsh profile, with lines like this:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;export MYSQL_ROOT_PASSWORD=supersecurepassword1&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;export MYSQL_PASSWORD=anothersecurepassword2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alright. Without further ado, here's the &lt;code&gt;docker-compose.yml&lt;/code&gt; file:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;web:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; build: .&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; ports:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; - &amp;quot;8080:80&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; volumes:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; - .:/srv/www&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; links:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; - db&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; - cache&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;db:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; image: mysql:5.6&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; environment:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;  MYSQL_ROOT_PASSWORD:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;  MYSQL_DATABASE: dockerapp&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;  MYSQL_USER: dockerapp&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;  MYSQL_PASSWORD:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;cache:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; image: memcached:latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="configure-your-laravel-app"&gt;Configure your Laravel app&lt;/h1&gt;
&lt;p&gt;Laravel 5.0 and later uses a &lt;code&gt;.env&lt;/code&gt; file to configure the app. This is where you'll give your app the settings it needs to talk to the other services (in this case, memcached and MySQL).&lt;/p&gt;
&lt;h2 id="env"&gt;.env&lt;/h2&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;APP_ENV=local&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;APP_DEBUG=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;APP_KEY=dhBKg8eSVZ3tH5yuz6z40j13X13YWTJf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;DB_HOST=db&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;DB_DATABASE=dockerapp&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;DB_USERNAME=dockerapp&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;DB_PASSWORD=anothersecurepassword2&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;CACHE_DRIVER=memcached&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;SESSION_DRIVER=memcached&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;QUEUE_DRIVER=sync&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MEMCACHED_HOST=cache&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MAIL_DRIVER=smtp&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MAIL_HOST=mailtrap.io&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MAIL_PORT=2525&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MAIL_USERNAME=null&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MAIL_PASSWORD=null&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MAIL_ENCRYPTION=null&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="run-your-new-application-container"&gt;Run your new application container&lt;/h1&gt;
&lt;p&gt;Alright, we're just about ready for the finale. First we need to run Docker Compose against our app to get it running.&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;docker-compose build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will build your container and fetch the other two from Docker Hub. It shouldn't take too long - the longest part will be downloading mysql and memcached containers. Then, put your containers online:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;docker-compose up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now try visiting &lt;a href="http://192.168.99.100:8080" rel="external"&gt;http://192.168.99.100:8080&lt;/a&gt; in your browser of choice. You might have to change the IP address to match that of your Docker machine (&lt;code&gt;docker-machine ip default&lt;/code&gt; will give you that). You should see the Laravel welcome screen, and your work here is complete. &lt;em&gt;Note: don't worry that your command prompt didn't come back. This runs in the foreground, so you'll need to use a new tab in your terminal app for other things. Or, you can use the daemon mode instead:&lt;/em&gt;&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;docker-compose up -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Congratulations, you're now working with Docker!&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Fri, 11 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/09/get-going-with-laravel-on-docker/</guid></item><item><title>Go Forth and Search</title><link>https://boyter.org/2015/09/search/</link><description>&lt;p&gt;A very fast update. At the request of the excellent &lt;a href="https://github.com/larsbrinkhoff"&gt;Lars Brinkhoff&lt;/a&gt; via GitHub I have added in the language Forth to be one of the supported languages inside searchcode.&lt;/p&gt;
&lt;p&gt;An example search which shows this working would be the following &lt;a href="https://searchcode.com/?q=forth&amp;amp;loc=0&amp;amp;loc2=10000&amp;amp;lan=181"&gt;https://searchcode.com/?q=forth&amp;amp;loc=0&amp;amp;loc2=10000&amp;amp;lan=181&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I had to solve a number of interesting problems inside searchcode to support this change. For pragmatic reasons the way searchcode identifies what language any piece of code is written in is to run it though CLOC (Count Lines Of Code). Written in perl it does a reasonably good job of pulling out metadata for any given piece of code. However since my perl ability is poor at best submitting a patch to support forth was not going to be an option.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 03 Sep 2015 01:25:18 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/09/search/</guid></item><item><title>Exporting Documents from KnowledgeTree 3.7.0.2</title><link>https://boyter.org/2015/09/exporting-documents-knowledgetree-3-7-0-2/</link><description>&lt;p&gt;I was recently tasked with exporting a large collection of documents from KnowledgeTree (KT) for a client. The collection was too large to use the download all functionality and too wide to attempt to export each folder individually.&lt;/p&gt;
&lt;p&gt;I had played around with the WebDav connection that KT provides but it either didn&amp;rsquo;t work or was designed deliberately to not allow exporting of the documents.&lt;/p&gt;
&lt;p&gt;I looked at where the documents were  stored on disk but KT stores them as numbered files in numbered directories sans extension or folder information.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 02 Sep 2015 01:13:04 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/09/exporting-documents-knowledgetree-3-7-0-2/</guid></item><item><title>OS X Software Update Channels For Betas</title><link>https://smcleod.net/2015/09/os-x-software-update-channels-for-betas/</link><description>&lt;h3 id="set-update-channel-to-receive-developer-beta-update"&gt;Set update channel to receive developer beta update&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo softwareupdate --set-catalog https://swscan.apple.com/content/catalogs/others/index-10.11seed-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="set-update-channel-to-receive-public-beta-update"&gt;Set update channel to receive public beta update&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo softwareupdate --set-catalog https://swscan.apple.com/content/catalogs/others/index-10.11beta-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="list-available-updates"&gt;List available updates&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo softwareupdate --list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="set-update-channel-to-receive-default-stable-updates"&gt;Set update channel to receive default, stable updates&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo softwareupdate --clear-catalog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="show-current-settings"&gt;Show current settings&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;defaults &lt;span class="nb"&gt;read&lt;/span&gt; /Library/Preferences/com.apple.SoftwareUpdate.plist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="write-setting-manually"&gt;Write setting manually&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;defaults write /Library/Preferences/com.apple.SoftwareUpdate CatalogURL https://swscan.apple.com/content/catalogs/others/index-10.11beta-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><author>smcleod.net</author><pubDate>Tue, 01 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/09/os-x-software-update-channels-for-betas/</guid></item><item><title>Decoding CAPTCHA's Handbook</title><link>https://boyter.org/2015/08/decoding-captchas-handbook/</link><description>&lt;p&gt;Some time ago I wrote an article about &lt;a href="http://www.boyter.org/decoding-captchas/"&gt;Decoding CAPTCHA&amp;rsquo;s&lt;/a&gt; which has become what appears to be the first resource most people encounter when searching for information in the decoding CAPTCHA space.&lt;/p&gt;
&lt;p&gt;I had continued to write about CAPTCHA&amp;rsquo;s over the years with posts scattered around the web. A while ago I started to consolidate all of my content on this blog and realised that I had considerably more CAPTCHA related articles then I thought. Some were in an unfinished or unpublished state. I had considered posting them all online but instead decided to polish it all up into a much better resource and publish it as a book.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 26 Aug 2015 01:49:31 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/08/decoding-captchas-handbook/</guid></item><item><title>Zero Downtime Deployment with AWS ECS and ELB</title><link>https://www.brightball.com/articles/zero-downtime-deployment-with-aws-ecs-and-elb</link><description>As development teams push farther toward continuous delivery, deploying updates to an application without disruption to users is constantly becoming a more sought-after practice. Amazon’s EC2 Container Service helps to make that easier than ever with tight Elastic Load Balancer integration.</description><author>Brightball Articles</author><pubDate>Tue, 25 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/zero-downtime-deployment-with-aws-ecs-and-elb</guid></item><item><title>Running three hours of Ruby tests in under three minutes</title><link>https://boyter.org/2015/08/running-hours-ruby-tests-minutes/</link><description>&lt;p&gt;Recently the very cool hard working developers working on Stripe released a post about how they modified their build/test pipeline to reduce their test suite runtime from 3 hours to about 3 minutes.&lt;/p&gt;
&lt;p&gt;The article is very &lt;a href="https://stripe.com/blog/distributed-ruby-testing"&gt;much worth reading&lt;/a&gt;, as is the discussions that have come around it including those on &lt;a href="https://news.ycombinator.com/item?id=10055342"&gt;Hacker News&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A few key takeaways,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For dynamic languages such as Ruby or Python consider forking to run tests in parallel&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 18 Aug 2015 11:18:47 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/08/running-hours-ruby-tests-minutes/</guid></item><item><title>The Four Character Group Archetype</title><link>https://tiltingatwindmills.dev/the-four-c-archetype/</link><description>I've noticed that when a work of fiction focuses on a group of four characters,
the roles those characters play within the group fall into a…</description><author>Tilting at Windmills</author><pubDate>Sat, 15 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/the-four-c-archetype/</guid></item><item><title>How to Use Heroku PGBackups</title><link>https://www.brightball.com/articles/how-to-use-heroku-pgbackups</link><description>Backing up your data is one of the most critical activities for your application. Heroku PGBackups makes the entire experience pretty simple but comes with a lot of flexibility too, with a number of options for smooth restoration.</description><author>Brightball Articles</author><pubDate>Tue, 11 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/how-to-use-heroku-pgbackups</guid></item><item><title>A Culture of Quality</title><link>https://boyter.org/2015/08/culture-quality/</link><description>&lt;p&gt;The best working environment I had the pleasure to work in had a strong emphasis on testing and software quality in general. Product teams were encouraged to spend extra time ensuring that everything worked over shipping before it was ready. The transformation it went through was incredible. Having come from a culture very much wild west through to where it was. An example of the advantages this brought was that before adopting this culture website launches were a traumatic event. Teams would block out 48 hours stretches and work solid fixing bugs at go live. Very stressful for all involved and not a healthy working environment. Contrast to where things ended up where several websites were launched on the same afternoon without a hitch. Very impressive considering the scale of the websites being dealt with (several million uniques a day).&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 10 Aug 2015 11:17:33 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/08/culture-quality/</guid></item><item><title>C# as a Language from old Google+ Post</title><link>https://boyter.org/2015/08/c-language-google-post/</link><description>&lt;p&gt;The more I use C# as a language for writing things the more I am convinced that its approach really is the best language approach out there.&lt;/p&gt;
&lt;p&gt;The unit test support is excellent which allows development speed to be just as fast as any dynamic language (Python, PHP, Perl).&lt;/p&gt;
&lt;p&gt;The static typing catches so many issues before you get to runtime and allows sweeping changes without breaking things.&lt;/p&gt;
&lt;p&gt;Unlike Java it has the var keyword (saves time and improves readability) and so many more useful functions which yes you can replicate but are just built in and work correctly.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 06 Aug 2015 01:37:38 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/08/c-language-google-post/</guid></item><item><title>Making army lists in Age of Sigmar</title><link>https://benovermyer.com/blog/2015/08/making-army-lists-in-age-of-sigmar/</link><description>&lt;p&gt;Making an army list in Age of Sigmar is an unusual process for those of us used to the traditional Games Workshop methods. In Warhammer Fantasy you decided on a points value, an army, and then tried to match a unit selection based on force organization rules and a balanced strategy to defeat as many types of opponents as possible. Those opponents would most often be similarly organized. In Age of Sigmar, however, there are only two ways to build for “strength:” by sheer force of numbers, or by maximizing keyword synergies. The sheer-force-of-numbers (a.k.a. pay-to-win) approach will not win you any friends, and may get you banned from games. The keyword synergy approach, though, is as yet an undiscovered country. Everyone is starting to pick up on the idea that you can take certain units to play on their collective strengths. As the community finds its feet in this new game, strong strategies are bound to come out.&lt;/p&gt;
&lt;p&gt;For example, the Dark Elf Cold One Knights are somewhat lackluster by themselves. However, in the presence of a Dreadlord on Cold One they (and Cold One Chariots) reroll charge rolls and add 1 to Wound rolls for one of their attacks. It's combinations like this that will define Age of Sigmar army lists. While you can make all kinds of interesting setups, it's this system that's going to draw the tactical minds out of its players. I'm reminded heavily of Magic: the Gathering or Hearthstone here. Both of those games encourage players to build winning strategies on specific synergistic themes that amplify their benefits, while not discouraging taking completely odd selections for flavor or for backup strategies. For my part, I intend on running a lot of Dark Elves (or Exiles, as they're now called) as the core of my first army. There's a lot to love there.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Mon, 03 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/08/making-army-lists-in-age-of-sigmar/</guid></item><item><title>Unit Tests Manage Complexity</title><link>https://cmdev.com/blog/2015-08-02-unittestsmanagecomplexity/</link><description>Unit testing is more than a design tool, not just a practice that enhances quality, it is a tool for managing complexity.</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Sun, 02 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-08-02-unittestsmanagecomplexity/</guid></item><item><title>Implementing AES</title><link>https://nindalf.com/posts/implementing-aes/</link><description>This article explains how to implement the Advanced Encryption Standard (AES) algorithm</description><author>Krishna's blog</author><pubDate>Thu, 30 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nindalf.com/posts/implementing-aes/</guid></item><item><title>A/B Testing</title><link>https://boyter.org/2015/07/ab-testing/</link><description>&lt;p&gt;A/B testing is testing the comparison of two outputs where a single unit has changed. It is commonly used when when trying to increase conversion rates for online websites. Also known as split testing an example would be trying to increase user clicks on a specific button on a website. You may have a theory that red buttons work better then green. You would try out both against real users and see which one performs better.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 27 Jul 2015 11:11:59 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/ab-testing/</guid></item><item><title>A guide to analyst relations for startups</title><link>/2015/07/25/A-guide-to-analyst-relations-for-startups/</link><description>&lt;p&gt;When it comes to go to market and marketing there&amp;rsquo;s lots of pieces in a toolchest that all work together. One that comes a bit later, but if used properly (much like a &lt;a href="/2015/07/21/An-intro-PR-guide-for-startups/"&gt;PR agency&lt;/a&gt;) can be valuable is industry analysts. And while working with a PR agency can quickly start to become clear. How to work with analysts so it is productive on both sides can take a bit longer to figure out, or at least it did for me. Even before you do start working with them there&amp;rsquo;s the question of if or when should you. Here&amp;rsquo;s hoping this primer makes it a bit faster and easier for others.&lt;/p&gt;
&lt;h3 id="what-is-an-analyst"&gt;
&lt;div&gt;
What is an analyst
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Apologies to all analysts, but of all parts of this post I might butcher this one&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Analysts talk to a lot of companies, both the ones making products as well as the ones purchasing them. I&amp;rsquo;m not actually sure what the spread is I&amp;rsquo;d guess 80-20. A large output of this and other activities is creating various reports and rankings. Gartner&amp;rsquo;s Magic Quadrant is probably the most well known industry ranking. Much of what they create isn&amp;rsquo;t freely available for consumption so you likely don&amp;rsquo;t see the sheer volume of insights they put out.&lt;/p&gt;
&lt;h3 id="why-would-you-engage-with-an-analyst"&gt;
&lt;div&gt;
Why would you engage with an analyst
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;So what do they do for you? There’s really two major buckets:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Help with sales/marketing&lt;/strong&gt; - Given they&amp;rsquo;re informing and influencing buying decisions of businesses they can be one more person on your side. If a launch in Techcrunch makes business foo aware of product bar, then an analyst report or ranking can help sway a decision on whether to try bar vs. baz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Consulting&lt;/strong&gt; - The other major opportunity is for the analyst to give some form of guidance. In a larger company when you already have an established product they should absolutely be part of your launch process (more on that in a future post). They&amp;rsquo;re actively following your market and space, hopefully just as you are to some extent. They can offer an outside perspective and help with broad areas of focus and messaging.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;More&lt;/em&gt; - In reality it’s as clean cut as above. They may be able to introduce you to good candidates for hiring. They may be able to introduce you to a large company interested in acquiring some capability which you have. They may be able to connect you with investors. All of these things can and do happen, but the above buckets typically are the primary drivers.&lt;/p&gt;
&lt;h3 id="when"&gt;
&lt;div&gt;
When?
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;First, engaging with analysts should always come after you have some confidence in the product, after you&amp;rsquo;ve started some marketing drumbeat, and after sales. In short don&amp;rsquo;t be in a huge rush here, you&amp;rsquo;ll get there, but don&amp;rsquo;t be in too big of a rush. As you start to get some attention and momentum it&amp;rsquo;s just as likely they&amp;rsquo;ll engage with you first as you reaching out. Also, marketing != sales, more on that in a future post.&lt;/p&gt;
&lt;p&gt;But, let&amp;rsquo;s assume you&amp;rsquo;ve got a product &lt;strong&gt;which targets business&lt;/strong&gt; (&lt;em&gt;Analysts aren&amp;rsquo;t just for tech companies, though you’ll see the benefit here sooner if you’re say a database company than a HR product&lt;/em&gt;). Let’s also assume you&amp;rsquo;ve got some sales and have some &lt;a href="/2015/07/21/An-intro-PR-guide-for-startups/"&gt;good launches under your belt&lt;/a&gt;. As it starts to come up in sales calls if you&amp;rsquo;re in any industry reports or rankings that may be an indicator, if you&amp;rsquo;re hearing about other competitors having more validation in such reports. As a general rule of thumb once you&amp;rsquo;ve got inhouse PR they should be able to help guide and steer to the right time.&lt;/p&gt;
&lt;h3 id="so-how-do-you-engage-with-an-analyst"&gt;
&lt;div&gt;
So how do you engage with an analyst
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re engaging in some form of report or article, that should start to be pretty self explanatory. They&amp;rsquo;ll send you a questionnaire, you fill it out. You go back and forth a little bit.&lt;/p&gt;
&lt;p&gt;However, the majority of my interactions aren&amp;rsquo;t on those articles and reports, for ever one time I fill out lots of questions to help some report or ranking I have 20 calls with an analyst.&lt;/p&gt;
&lt;p&gt;There are two primary calls you can have, an inquiry and a briefing.&lt;/p&gt;
&lt;h4 id="inquiries"&gt;
&lt;div&gt;
Inquiries
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Inquiry is just a fancy word for consulting call. An inquiry you will always be paying for.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A small detour here. The regularity and consistency in which you engage with an analyst makes a difference. They&amp;rsquo;re also people at the end of the day, so while firms have certain styles it&amp;rsquo;s even further multiplied by being very people driven. In your interactions you&amp;rsquo;ll have a different rapport with different people, it&amp;rsquo;s at a minimum important to be aware of this.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So back to an inquiry. Within an inquiry your goal is to pull back the curtain and give some backstage insights into what you&amp;rsquo;re doing and where you&amp;rsquo;re headed. This is typically under NDA and trust the NDA of an analyst. It&amp;rsquo;s worthwhile to be as candid as you can here, yes it feels weird, but you&amp;rsquo;ll get the most value. They&amp;rsquo;re not like that of a reporter looking for a scoop (not that you can&amp;rsquo;t trust reporters, just know if you say it, it&amp;rsquo;s on record). You don&amp;rsquo;t have to relish the entire call to one area, but areas of coverage are often:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upcoming products and major releases you’re working on&lt;/li&gt;
&lt;li&gt;Broader strategy and roadmap&lt;/li&gt;
&lt;li&gt;Get input on what they&amp;rsquo;re seeing and hearing from customers&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="briefings"&gt;
&lt;div&gt;
Briefings
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;The other type of call we have is a briefing. This is a little similar to that of a press briefing. You&amp;rsquo;ll get on the call, and walk through some upcoming launch or just give an update on your company and progress. The latter is more common if they&amp;rsquo;re unfamiliar with you or your product.&lt;/p&gt;
&lt;p&gt;Analyst briefings are good to do earlier than your press briefings, compared to press they&amp;rsquo;re like a bike with training wheels. It&amp;rsquo;s best if you still maintain your balance–the ride will be smoother, but there&amp;rsquo;s a little less risk of completely toppling over. One key difference is you often have a powerpoint deck you get to walk through during an analyst briefing. I&amp;rsquo;ve found this is helpful for pacing and key messages, I used to be skeptical, but now very much feel it&amp;rsquo;s always worth doing.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pro-tip: You can create a deck and use it for press too, no they won&amp;rsquo;t want to get on a gotomeeting, but you can send it over so they have more content later. BUT, more importantly you can also walk through it on your own screen if it helps with pacing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Within a briefing you&amp;rsquo;ll have some ability to ask them questions at points. Does this resonate? Are you hearing similar? What are you seeing in the market? Don&amp;rsquo;t turn it into an inquiry, but knowing the parts that hit home for them allow you to refine your pitch for the next call.&lt;/p&gt;
&lt;h4 id="engaging---the-tactical-parts"&gt;
&lt;div&gt;
Engaging - the tactical parts
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;&amp;ldquo;Analysts are pretty much paid to talk and write&amp;rdquo; - &lt;a href="http://www.twitter.com/cote"&gt;@cote&lt;/a&gt;. So expect that often when you occupy their time there&amp;rsquo;s a price to it. In terms of finding them it should be pretty easy, to know the list of ones in your space, you may see them quoted or reference in various media outlets. You may just naturally crop up in a report.&lt;/p&gt;
&lt;p&gt;If you create a regular relationship with them you&amp;rsquo;ll have some contract of hours over the course of a quarter or year. At an early stage company this is often owned and manage by whomever runs your PR from an internal perspective.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;
&lt;div&gt;
Conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re about to engage with analysts for the first time or haven’t figured out how to get the most out of your interactions I hope the broad overview is helpful. If there&amp;rsquo;s some glaring parts you feel I&amp;rsquo;ve missed let me know &lt;a href="http://www.twitter.com/craigkerstiens"&gt;@craigkerstiens&lt;/a&gt;. And for further reading/watching I’d encourage checking out the great talk from &lt;a href="http://www.twitter.com/cote"&gt;@cote&lt;/a&gt; in the &lt;a href="http://www.heavybit.com/library/video/2014-01-21-michael-cote"&gt;Heavybit library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As far as take-aways and a recap:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Don&amp;rsquo;t be too eager to jump in with analysts. They can absolutely provide value, but you have to put some time in before it really starts to pay off. It&amp;rsquo;s not an overnight change and takes building a rapport with them.&lt;/li&gt;
&lt;li&gt;At the same time, analysts can be useful in many B2B areas not just tech ones.&lt;/li&gt;
&lt;li&gt;When in an inquiry be open and as transparent as possible.&lt;/li&gt;
&lt;li&gt;Powerpoint/Keynote/Google presentations are useful in briefings, even if it&amp;rsquo;s just for you to follow along.&lt;/li&gt;
&lt;/ol&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Sat, 25 Jul 2015 23:55:56 GMT</pubDate><guid isPermaLink="true">/2015/07/25/A-guide-to-analyst-relations-for-startups/</guid></item><item><title>iSCSI Benchmarking</title><link>https://smcleod.net/2015/07/iscsi-benchmarking/</link><description>&lt;p&gt;The following are benchmarks from our testings of our iSCSI SSD storage.&lt;/p&gt;
&lt;h3 id="67300-read-iops-on-a-vm-on-iscsi"&gt;67,300 read IOP/s on a VM on iSCSI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;(Disk -&amp;gt; LVM -&amp;gt; MDADM -&amp;gt; DRBD -&amp;gt; iSCSI target -&amp;gt; Network -&amp;gt; XenServer iSCSI Client -&amp;gt; VM)&lt;/li&gt;
&lt;li&gt;Per VM and scales to 1,000,000 IOP/s total&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@dev-samm:/mnt/pmt1 &lt;span class="m"&gt;128&lt;/span&gt; &lt;span class="c1"&gt;# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=4k --iodepth=128 --size=2G --readwrite=read&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;test: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;read, &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4K-4K/4K-4K, &lt;span class="nv"&gt;ioengine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libaio, &lt;span class="nv"&gt;iodepth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;128&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2.0.8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Starting &lt;span class="m"&gt;1&lt;/span&gt; process
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bs: &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;R&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;55.6% &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;262.1M/0K /s&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;67.3K/0  iops&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;eta 00m:04s&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="38500-random-4k-write-iops-on-a-vm-on-iscsi"&gt;38,500 random 4k write IOP/s on a VM on iSCSI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;(Disk -&amp;gt; LVM -&amp;gt; MDADM -&amp;gt; DRBD -&amp;gt; iSCSI target -&amp;gt; Network -&amp;gt; XenServer iSCSI Client -&amp;gt; VM)&lt;/li&gt;
&lt;li&gt;Per VM and scales to 700,000 IOP/s total&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@dev-samm:/mnt/pmt1 &lt;span class="c1"&gt;# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=4k --iodepth=128 --size=2G --readwrite=randwrite&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;test: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;randwrite, &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4K-4K/4K-4K, &lt;span class="nv"&gt;ioengine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libaio, &lt;span class="nv"&gt;iodepth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;128&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2.0.8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Starting &lt;span class="m"&gt;1&lt;/span&gt; process
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bs: &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;w&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;26.3% &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;0K/150.2M /s&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; /38.5K iops&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;eta 00m:14s&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="raw-device-latency-on-storage-units"&gt;Raw device latency on storage units&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Intel DC3600 1.2T PCIe NVMe&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@s1-san6:/proc  &lt;span class="c1"&gt;# ioping /dev/nvme0n1p1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/nvme0n1p1 &lt;span class="o"&gt;(&lt;/span&gt;device 1.1 TiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;104&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/nvme0n1p1 &lt;span class="o"&gt;(&lt;/span&gt;device 1.1 TiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;83&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/nvme0n1p1 &lt;span class="o"&gt;(&lt;/span&gt;device 1.1 TiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;51&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/nvme0n1p1 &lt;span class="o"&gt;(&lt;/span&gt;device 1.1 TiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;71&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;SanDisk SDSSDXPS960G SATA&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@pm-san5:/proc  &lt;span class="c1"&gt;# ioping /dev/sdc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdc &lt;span class="o"&gt;(&lt;/span&gt;device 894.3 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.2 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdc &lt;span class="o"&gt;(&lt;/span&gt;device 894.3 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.1 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdc &lt;span class="o"&gt;(&lt;/span&gt;device 894.3 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.1 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdc &lt;span class="o"&gt;(&lt;/span&gt;device 894.3 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.1 ms
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Micron_M600_MTFDDAK1T0MBF SATA&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@pm-san5:/proc  &lt;span class="c1"&gt;# ioping /dev/sdf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdf &lt;span class="o"&gt;(&lt;/span&gt;device 953.9 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;157&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdf &lt;span class="o"&gt;(&lt;/span&gt;device 953.9 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;190&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdf &lt;span class="o"&gt;(&lt;/span&gt;device 953.9 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;65&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdf &lt;span class="o"&gt;(&lt;/span&gt;device 953.9 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;181&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;```&lt;/span&gt;shell
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## Latency on the a VM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="o"&gt;(&lt;/span&gt;Disk -&amp;gt; LVM -&amp;gt; MDADM -&amp;gt; DRBD -&amp;gt; iSCSI target -&amp;gt; Network -&amp;gt; XenServer iSCSI Client -&amp;gt; VM&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;```&lt;/span&gt;shell
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@dev-samm:/mnt &lt;span class="m"&gt;127&lt;/span&gt; &lt;span class="c1"&gt;# ioping pmt1/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt1/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdb1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.6 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt1/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdb1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.7 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt1/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdb1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.7 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--- pmt1/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdb1&lt;span class="o"&gt;)&lt;/span&gt; ioping statistics ---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt; requests completed in 2159.1 ms, &lt;span class="m"&gt;1508&lt;/span&gt; iops, 5.9 mb/s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;min/avg/max/mdev &lt;span class="o"&gt;=&lt;/span&gt; 0.6/0.7/0.7/0.1 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@dev-samm:/mnt  &lt;span class="c1"&gt;# ioping pmt2/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt2/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdc1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.6 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt2/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdc1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.8 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--- pmt2/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdc1&lt;span class="o"&gt;)&lt;/span&gt; ioping statistics ---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt; requests completed in 1658.4 ms, &lt;span class="m"&gt;1470&lt;/span&gt; iops, 5.7 mb/s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;min/avg/max/mdev &lt;span class="o"&gt;=&lt;/span&gt; 0.6/0.7/0.8/0.1 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@dev-samm:/mnt  &lt;span class="c1"&gt;# ioping pmt3/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt3/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvde1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.6 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt3/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvde1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.9 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt3/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvde1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.9 ms
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://smcleod.net/images/san/lcmcpcmk.png" /&gt;&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Fri, 24 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/07/iscsi-benchmarking/</guid></item><item><title>A guide to PR for startups</title><link>/2015/07/21/An-intro-PR-guide-for-startups/</link><description>&lt;p&gt;You&amp;rsquo;ve built your product and you&amp;rsquo;re now ready for your first major launch. Or you&amp;rsquo;ve been through a launch or two, but are looking to scale the process as you&amp;rsquo;re doing more launches and announcements. You really have two options: do it &lt;a href="http://jasonlbaptiste.com/featured-articles/how-i-pitched-techcrunch-and-13-ways-to-get-press-when-you-launch-your-startup/"&gt;all on your own&lt;/a&gt;, or work with a PR agency. One frequent crossroad is that you&amp;rsquo;re not at the point of a full time PR person, but unsure what a PR agency can offer you; and, further what&amp;rsquo;s the best way to work with them so you&amp;rsquo;re getting the maximum value.&lt;/p&gt;
&lt;p&gt;As I&amp;rsquo;ve talked to more startups lately, it&amp;rsquo;s become clear that effectively working with PR teams and the media is mostly learned by doing. Because there&amp;rsquo;s not much guidance out there, here&amp;rsquo;s an attempt at some basic guidelines.&lt;/p&gt;
&lt;h3 id="on-pr"&gt;
&lt;div&gt;
On PR
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;First there&amp;rsquo;s two types here and they&amp;rsquo;re not mutually exclusive. In-house PR is a full time person or team that works within your company, here you&amp;rsquo;ll often have a pretty different experience. From my experience, in-house PR people tend to understand a company message and vision because they are living and breathing your company values every day.&lt;/p&gt;
&lt;p&gt;The other alternative is hiring a PR agency. An agency will have several (sometimes hundreds!) of clients. The relationship that you’ll have with an agency is much different than in-house. You&amp;rsquo;ll use them just like you would a consultant or contractor. Most startups end up with the agency approach first, because of the perception of “more people working for a cheaper cost than hiring in-house.” However, it&amp;rsquo;s of note an agency doesn&amp;rsquo;t alleviate you of doing work, nor should you want them to handle all parts of it.&lt;/p&gt;
&lt;h4 id="messaging"&gt;
&lt;div&gt;
Messaging
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;An agency may offer to help with messaging, but take this somewhat lightly. I don&amp;rsquo;t doubt that some are very good at it, but in most cases I&amp;rsquo;ve found they don&amp;rsquo;t have the same amount of customer interaction as you as a founder or early employee would. Further, your vision of impact to the market and direction may be more distant than theirs. You should expect to own your messaging, just like you own your product.&lt;/p&gt;
&lt;p&gt;Where they can heavily help is providing a lot of structured frameworks for helping you get to your messaging. Some pretty basic templates of standard questions for customers and partners can go along way in helping you actually uncover what they feel your value is.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;On your key messaging/value prop, there&amp;rsquo;s two pieces I&amp;rsquo;ll drop in here. While I&amp;rsquo;d love to write another long post on it, I wonder when I&amp;rsquo;ll actually get it out. So the first is pitch the problem you&amp;rsquo;re trying to solve–&lt;a href="http://500hats.typepad.com/500blogs/2009/08/your-solution-is-not-my-problem.html"&gt;Dave McClure&lt;/a&gt; talks about this as well as anyone. The second is don&amp;rsquo;t pitch features, pitch the use cases and solutions. Pitch what&amp;rsquo;s possible&lt;/em&gt;&lt;/p&gt;
&lt;h4 id="pitching"&gt;
&lt;div&gt;
Pitching
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;This is the number one area I&amp;rsquo;ve found that having PR makes a huge difference. In the world of reporting, different reporters have different beats (areas of coverage), styles, outreach preferences, and most importantly, different relationships with companies and people. Knowing &lt;em&gt;all&lt;/em&gt; of this and how to pitch a story to them is key. Yes you can spend hours researching and creating a perfect story just for them, and do that again, and again and hopefully land some coverage. But I&amp;rsquo;d argue a bit: that&amp;rsquo;s not the best use of your time.&lt;/p&gt;
&lt;p&gt;With a good PR person or agency you&amp;rsquo;ll be able to strike a mix of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Here&amp;rsquo;s the outlets I want to be in and why (have a good reason for why).&lt;/li&gt;
&lt;li&gt;Understanding the audience and readership.&lt;/li&gt;
&lt;li&gt;What outlets you feel like your key customers are reading, and validate this with the agency.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From there, if you&amp;rsquo;ve found a good agency they already have relationships with your key journalists / publications. So if you have a compelling product, you just need to give them the right messaging of the particular launch or news.&lt;/p&gt;
&lt;h4 id="what-else-to-expect-from-your-agency"&gt;
&lt;div&gt;
What else to expect from your agency
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;A surprise for some is how the whole process works. The agency is going to be there on the phone with you. You&amp;rsquo;re not going to hang out over beers while pitching being chummy. The reporter is listening to multiple other pitches, it&amp;rsquo;s likely they had one right before you and right after. The agency is there listening, helping keep time and track of conversation for reporter fact-checking after the interview.&lt;/p&gt;
&lt;p&gt;Hopefully they&amp;rsquo;re also keeping notes. They should be able to provide you with some high level notes of what message resonated with each reporter and what didn&amp;rsquo;t, what you covered, and what they asked. This is especially useful for future interactions.&lt;/p&gt;
&lt;p&gt;Similarly you should get a briefing 1 pager ahead of time. You should be able to skim this, you don&amp;rsquo;t have to memorize. But it&amp;rsquo;ll include key things about recent articles written by the reporter, their beat, topics to dive into and ones to stay away from. If you can connect the dots, those notes from an initial call start to feed into the 1 pagers for future calls.&lt;/p&gt;
&lt;h3 id="onto-the-briefing"&gt;
&lt;div&gt;
Onto the briefing
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Of course it&amp;rsquo;s important to land the briefing in the first place, but just as important is getting it right. Coming into it, the reporter will have already gotten the high level pitch&amp;hellip; It&amp;rsquo;s why they took the call. You&amp;rsquo;ll get a mixed bag of those that are open to teeing up the opportunity to those that want to get right to the news. Roll with what they prefer, but also don&amp;rsquo;t be afraid of trying to hit some of your key points.&lt;/p&gt;
&lt;h4 id="have-your-key-messages-ready"&gt;
&lt;div&gt;
Have your key messages ready
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Sound bites help hugely here. Analogies, customer references, whatever you want to hit. Have it ready. Also if you&amp;rsquo;ve got a great sound bite that helps tell the story, it can make the reporter&amp;rsquo;s job easier. Just don&amp;rsquo;t swing too far into happy go lucky marketing land. It’s important to remember that you’re talking to a person. Have a conversation - don’t talk at them.&lt;/p&gt;
&lt;h4 id="go-slow"&gt;
&lt;div&gt;
Go slow
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;It may seem obvious when you think about it, but as you&amp;rsquo;re talking the reporter is writing. Or at least you hope they are. Some do it by hand and type up notes late, some type right then and there. When you hear a pause it doesn&amp;rsquo;t always mean to keep going and it seldom means hurry up. Become extra comfortable with pauses. Check in if you&amp;rsquo;re going to fast, if they&amp;rsquo;re following, if they have any questions. I&amp;rsquo;ve had people bring me in a beer before because I&amp;rsquo;d had multiple cups of coffee through a few pitches, and they were trying to slow me down a bit. Know your pace, and then slow it down.&lt;/p&gt;
&lt;h4 id="questions"&gt;
&lt;div&gt;
Questions
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;It&amp;rsquo;s okay if they don&amp;rsquo;t have a lot of questions, they may not. They may have none at all. Yes, pause, and give them a chance, or even ask if they have any. But don&amp;rsquo;t stress too much if they have no questions.&lt;/p&gt;
&lt;p&gt;On the flip side of that - you’re PR person should have prepared a list of questions for you beforehand that the reporter could possibly throw your way. Be sure you’ve thought through and practiced all the Q&amp;amp;A scenarios before the interview so you aren’t caught off-guard when you’re in front of the reporter.&lt;/p&gt;
&lt;h3 id="in-conclusion"&gt;
&lt;div&gt;
In conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If it&amp;rsquo;s your first go around, don&amp;rsquo;t stress too much. Have the headlines you want in your mind and key messages, or better yet write them out. &lt;em&gt;Personally I write key things on a whiteboard nice and large before I&amp;rsquo;m on the call&lt;/em&gt;. Finally once you&amp;rsquo;re all done, enjoy reading the coverage. &lt;strong&gt;But you&amp;rsquo;re not all done&lt;/strong&gt; after you get some coverage look back, run a retrospective just like you would for a software project. What worked well, why did or didn&amp;rsquo;t something work. What can you improve next time.&lt;/p&gt;
&lt;p&gt;*Full disclosure, this is based across interactions with a small sample size of different PR agencies and individuals. Mileage may differ heavily from PR firm to PR firm, but hopefully the above provides at least some roadmap for more clarity vs. flying blind. As always if you&amp;rsquo;ve got feedback/questions, feel free to let me know &lt;a href="http://www.twitter.com/craigkerstiens"&gt;@craigkerstiens&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Finally a special thanks to &lt;a href="http://www.twitter.com/pavtalk"&gt;Paul Katsen&lt;/a&gt; for much of the inspiration on creating this post and to he and &lt;a href="http://www.twitter.com"&gt;Katie Boysen&lt;/a&gt; for review&lt;/em&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Tue, 21 Jul 2015 23:55:56 GMT</pubDate><guid isPermaLink="true">/2015/07/21/An-intro-PR-guide-for-startups/</guid></item><item><title>Five ways to avoid and control flaky tests</title><link>https://boyter.org/2015/07/ways-avoid-control-flaky-tests/</link><description>&lt;p&gt;Having a reliable test suite should always be the goal in software development. After all if you can&amp;rsquo;t trust the tests then why bother running them at all? This is especially important in a shared coding environment and when running through Continuous Integration (CI).&lt;/p&gt;
&lt;p&gt;1 - Test in Isolation&lt;/p&gt;
&lt;p&gt;It may seem obvious but writing focused tests which do a single thing is one of the most effective ways to avoid them being flaky. Tests which do multiple things increases the chance for failure and can make the tests non deterministic. Always remember to test features and issues in isolation.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 21 Jul 2015 11:09:42 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/ways-avoid-control-flaky-tests/</guid></item><item><title>Delayed Serial STONITH</title><link>https://smcleod.net/2015/07/delayed-serial-stonith/</link><description>&lt;p&gt;A modified version of &lt;a href="http://www.scl.co.uk/rcd_serial/README.rcd_serial"&gt;John Sutton&amp;rsquo;s&lt;/a&gt; rcd_serial cable coupled with our Supermicro reset switch hijacker:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://smcleod.net//img/san/rcd_serial.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;This works with the rcd_serial fence agent &lt;a href="https://github.com/ClusterLabs/fence-agents/tree/master/agents/rcd_serial"&gt;plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Reasons &lt;code&gt;rcd_serial&lt;/code&gt; makes for a very good &lt;a href="https://en.wikipedia.org/wiki/STONITH"&gt;STONITH&lt;/a&gt; mechanism:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It has no dependency on power state.&lt;/li&gt;
&lt;li&gt;It has no dependency on network state.&lt;/li&gt;
&lt;li&gt;It has no dependency on node operational state.&lt;/li&gt;
&lt;li&gt;It has no dependency on external hardware.&lt;/li&gt;
&lt;li&gt;It costs less that $5 + time to build.&lt;/li&gt;
&lt;li&gt;It is incredibly simple and reliable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Essentially the most common STONITH agent type in use is probably those that control UPS / PDUs, while this sounds like a good idea in theory there are a number of issues with relying on a UPS / PDU:&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Tue, 21 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/07/delayed-serial-stonith/</guid></item><item><title>Why Does Software Contain Bugs?</title><link>https://boyter.org/2015/07/software-bugs/</link><description>&lt;p&gt;&amp;ldquo;Why does all software contain bugs?&amp;rdquo; this was a question recently asked of me. My response at the time was because all software is not perfect, but is this true?&lt;/p&gt;
&lt;p&gt;Lets take a very simple example.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    public class Hello {
        public static void main(String[] args) {
            System.out.println(&amp;quot;Hello World!&amp;quot;);
        }
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above example is arguably the simplest program that can be written using Java. It also happens to be the first program usually written by any Java programmer. It simply print outs the text &amp;ldquo;Hello World!&amp;rdquo; when it is run. Surely this program is so simple that it is perfect and therefore bug free?&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 20 Jul 2015 11:06:50 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/software-bugs/</guid></item><item><title>No such thing as "real programming"</title><link>https://www.brightball.com/articles/no-such-thing-as-real-programming</link><description>I read an article earlier today called The self-hating Web Developer that I found on Hacker News and it bothered me. It resonated with me as something that I professionally internalized over my career but it bothered me because Joseph encountered personal financial difficulty for both himself and his family due to the struggle. For that reason (and insomnia), I feel compelled to write this as reference to refer to for anybody else who may be struggling with the same thing.</description><author>Brightball Articles</author><pubDate>Mon, 20 Jul 2015 04:34:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/no-such-thing-as-real-programming</guid></item><item><title>HillHacks 2015</title><link>https://captnemo.in/blog/2015/07/20/hillhacks/</link><description>&lt;p&gt;A little while back, I came across &lt;a href="https://hillhacks.in" title="hacking and making in the Himalayas"&gt;HillHacks&lt;/a&gt;, a conference in Dharamshala about “hacking and making in the Himalayas”. I was instantly hooked. It took a lot of scheduling troubles, but I decided to stay for the entire unconference, which started at 23rd May.&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;If this blog post interests you, be sure to check out &lt;a href="https://hackbeach.in" title="HackBeach wiki page"&gt;hackbeach&lt;/a&gt; as well. We are doing a mini-conference around November in Kovalam.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Mon, 20 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/07/20/hillhacks/</guid></item><item><title>Age of Sigmar breaks Warhammer Fantasy, but it's worth it</title><link>https://benovermyer.com/blog/2015/07/age-of-sigmar-breaks-warhammer-fantasy-but-its-worth-it/</link><description>&lt;p&gt;Age of Sigmar grabbed the Warhammer Fantasy rulebook, tore it apart, and threw the remains into the fire. I love the game that came out of that, even if there are some significant negatives to this event.&lt;/p&gt;
&lt;h1 id="from-simulationist-roots-to-casual-narratives"&gt;From simulationist roots to casual narratives&lt;/h1&gt;
&lt;p&gt;Warhammer Fantasy has long been the strategy-heavy cousin to the tactical-heavy Warhammer 40,000. The rules up until this point focused on maneuver and regiments, positioning and thinking ahead. Warhammer 40,000, on the other hand, has always been about skirmishes and characterful, tight battles. Where Fantasy relied on its movement trays and slower pace, 40k allowed for a lot of narrative to come through the gameplay. Age of Sigmar one-ups 40k in this regard. Yes, Age of Sigmar has a lot of holes in the rules. Someone who delights in using rules-as-written against his opponent is going to have a field day with Sigmar. But that's not what this iteration of the game is about. Age of Sigmar seeks to bring casual gaming to the fore. The rules explicitly encourage, via its Most Important Rule, house-ruling and collaborating with your opponent to set up the battle.&lt;/p&gt;
&lt;h1 id="play-any-army-you-come-up-with"&gt;Play any army you come up with&lt;/h1&gt;
&lt;p&gt;One of my favorite things about the rules is its encouragement of creativity in army building. There are no points or required force organization. While this can obviously be abused by asocial types, for those of us that enjoy narrative battles, it's a godsend. I can mix Seraphons (Lizardmen) in with Stormcast Eternals and Exile Aelfs (Dark Elves), and that's perfectly legitimate. If I really wanted to, the rules allow me to field Chaos Warriors alongside Sylvaneth (Dryads) and Duardin (Dwarfs). I can't imagine the scenario where that would make lore sense, but you could do it. All of this makes for some fantastic battle and lore possibilities.&lt;/p&gt;
&lt;h1 id="my-god-it-s-beautiful"&gt;My God, it's beautiful&lt;/h1&gt;
&lt;p&gt;The miniatures in the starter box set are absolutely gorgeous, and make the collector in me very happy. The Lord Celestant in particular is a beautiful model. With his triumphant pose and intimidating Drakoth mount, he makes a fine addition to any army. The Khorgorath model on the Chaos side is really ****ing creepy. It's made of blood and skulls of its victims are pushing their way through its skin.&lt;/p&gt;
&lt;h1 id="there-s-a-free-app-for-army-building"&gt;There's a free app for army building&lt;/h1&gt;
&lt;p&gt;This is a big one. I bought Army Builder ages ago to help me build 40k armies, but Games Workshop is notorious for never releasing anything for free. Privateer Press released a free app awhile ago for its Warmachine and Hordes games, and while you need to pay for your specific army, it does have the benefit of being a first-party app. Now, GW has released the Age of Sigmar app that includes an army builder and the Warscrolls for all existing models for free. The one thing that pisses me off about this app is that I don't get the Warscrolls for the starter box units, despite having shelled out $125 for said box. There's no way to redeem a product code or anything. The only way to get those Warscrolls in the app is to buy the Age of Sigmar book through it, which would be an additional $50. No thanks. But it's GW, so I'll give them points for the progress they &lt;em&gt;did&lt;/em&gt; make.&lt;/p&gt;
&lt;h1 id="tournaments"&gt;...tournaments?&lt;/h1&gt;
&lt;p&gt;Yeah, the Age of Sigmar rules pretty much break any possibility of having tournaments without extensive house-ruling. That's a problem for people who're really into the game. I'll admit to being a little hesitant about this. I've never played in a 40k tournament, but I think it'd be fun to try. I can't imagine playing in an Age of Sigmar tournament, though. The rules aren't geared for that.&lt;/p&gt;
&lt;h1 id="what-about-the-people-who-enjoyed-the-old-game"&gt;What about the people who enjoyed the old game?&lt;/h1&gt;
&lt;p&gt;Games Workshop's move to completely get rid of the old rules and cease supporting it in their stores is a bad one, despite the good game that Age of Sigmar is. The community that built up around WHFB is not so easily dismissed. For some people, their local Games Workshop store is the only place they could play the game they'd put a lot of time and money into, and I've heard rumors that GW stores are disallowing WHFB matches now. That's a terrible policy. &lt;a href="http://www.manticgames.com/" rel="external"&gt;Mantic Games&lt;/a&gt; has their Kings of War game, which keeps very closely to WHFB's roots. They just released a second edition, and have been inviting WHFB players left out in the cold to join their community. This is a great move on Mantic's part, and I really hope it works out for everyone. From what I've seen, &lt;a href="https://web.archive.org/web/20150722045547/http://manticblog.com/2015/07/14/how-the-community-helped-develop-kings-of-war/" rel="external"&gt;Mantic cares a lot more about community&lt;/a&gt; than GW does.&lt;/p&gt;
&lt;h1 id="so-is-it-worth-getting"&gt;So is it worth getting?&lt;/h1&gt;
&lt;p&gt;Yes. Especially since the rules are free, and the Warscrolls - the rules for individual units - are also free. You can get them on &lt;a href="http://www.games-workshop.com/en-US/age-of-sigmar-compendiums" rel="external"&gt;Games Workshop's site&lt;/a&gt;. In my opinion, the starter box is also totally worth the $125. It has wonderful minis, and the books are great too.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sun, 19 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/07/age-of-sigmar-breaks-warhammer-fantasy-but-its-worth-it/</guid></item><item><title>Migrated away from Heroku</title><link>https://benovermyer.com/blog/2015/07/migrated-away-from-heroku/</link><description>&lt;p&gt;Heroku made their free tier awful. That's fair enough, but I need more stability.&lt;/p&gt;
&lt;p&gt;So, I've spun up a Digital Ocean droplet and learned how to deploy Rails apps without the help of a PaaS.&lt;/p&gt;
&lt;p&gt;It's not intuitive for someone who's used to provisioning PHP web app servers, but after finally getting it working, it's actually a pretty cool way of doing things.&lt;/p&gt;
&lt;p&gt;So yeah. Obelisk, the Ruby on Rails blog engine I've written to replace the PHP-based Monkblog engine, is now running on a server that I've provisioned from scratch. Yay!&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sat, 18 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/07/migrated-away-from-heroku/</guid></item><item><title>searchcode the path to profitability</title><link>https://boyter.org/2015/07/searchcode-path-profitability/</link><description>&lt;p&gt;One of the things that has always bothered me about searchcode.com was that it never generated any money. Not a huge problem in itself as a side project, but the costs to run it are not insignificant due to the server requirements. I had looked into soliciting donations but I considered this highly unlikely to produce enough revenue to cover costs considering that sites such as &lt;a href="http://www.gwern.net/"&gt;gwern.net&lt;/a&gt; was unable to make enough to cover even basic costs through &lt;a href="https://www.patreon.com/gwern"&gt;patreon&lt;/a&gt; (although since a recent HN post this has jumped from around $20 a month to over $150).&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 17 Jul 2015 11:01:15 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/searchcode-path-profitability/</guid></item><item><title>The benefit of testing for Developers, Managers and the Business</title><link>https://boyter.org/2015/07/benefit-testing-developers-managers-business/</link><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Fixing regression bugs is analogous to digging a hole only to find the next day it has been filled in and having to dig it out again&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ask any manager, developer or tester working on software without tests what the main pain points are. Nearly all the time the main one mentioned is dealing with regressions. This is bugs that were fixed a year ago which returned. Regression bugs cost the software industry billions of dollars a year. Worse still they are demoralising to everyone involved. Finding or fixing the same bug over and over causes you to start looking for new projects or new jobs.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 16 Jul 2015 11:05:30 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/benefit-testing-developers-managers-business/</guid></item><item><title>Video - Cluster Failover Performance Demo</title><link>https://smcleod.net/2015/07/video-cluster-failover-performance-demo/</link><description>&lt;div style="padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
      
    &lt;/div&gt;</description><author>smcleod.net</author><pubDate>Sun, 12 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/07/video-cluster-failover-performance-demo/</guid></item><item><title>AWS EC2 Instance Types to Use as Test Agents</title><link>https://boyter.org/2015/07/aws-ec2-instance-types-test-agents/</link><description>&lt;p&gt;When you are running test agents on AWS knowing what instance type to run as test agents (for TeamCity or otherwise) can involve a lot of trial and error. Not only can there be great savings to be made by picking the correct instance type you can speed up your builds and get test feedback back faster which can be far more valuable the cost of a few additional cents an hour.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 10 Jul 2015 11:03:10 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/aws-ec2-instance-types-test-agents/</guid></item><item><title>Exploring Microservices Architecture on Heroku</title><link>https://www.brightball.com/articles/exploring-microservices-architecture-on-heroku</link><description>Building an application with a microservice architecture is an excellent long-term decision if you can afford the increase in upfront time investment to do it properly. Heroku provides a platform that most developers know for simple deployment, but it also dramatically simplifies microservices architecture.</description><author>Brightball Articles</author><pubDate>Thu, 09 Jul 2015 02:17:02 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/exploring-microservices-architecture-on-heroku</guid></item><item><title>Issues with Google's Bug Prediction Algorithm</title><link>https://boyter.org/2015/07/issues-googles-bug-prediction-algorithm/</link><description>&lt;p&gt;December 2011 the Google Engineering team published a blog post about &lt;a href="http://google-engtools.blogspot.com.au/2011/12/bug-prediction-at-google.html"&gt;bug prediction at Google&lt;/a&gt;. The topic caused quite a lot of discussion at the time over the internet on forums such as Hacker News and the Reddit programming sub-reddit.&lt;/p&gt;
&lt;p&gt;How bug prediction works&lt;/p&gt;
&lt;p&gt;In a nutshell the prediction works by ranking files against checking the file commit history and seeing how many changes have been flagged as bug fixes. Of course this means that code which was previously buggy will still appear in the list. This issue was also addressed in the post and the results were weighted over time to deal with this issue.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 08 Jul 2015 10:58:57 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/issues-googles-bug-prediction-algorithm/</guid></item><item><title>CentOS 7 and HA</title><link>https://smcleod.net/2015/07/centos-7-and-ha/</link><description>&lt;p&gt;First some background&amp;hellip;&lt;/p&gt;
&lt;p&gt;One of the many lessons I&amp;rsquo;ve learnt from my Linux HA / Storage clustering project is that the Debian HA ecosystem is essentially broken, We reached the point where packages were too old, too buggy or in Debian 8&amp;rsquo;s case - outright missing.&lt;/p&gt;
&lt;p&gt;In the past I was very disappointed with RHEL/CentOS 5 / 6 and (until now) have been quite satisfied with Debian as a stable server distribution with historicity more modern packages and kernels.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Tue, 07 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/07/centos-7-and-ha/</guid></item><item><title>What is Usability Testing?</title><link>https://boyter.org/2015/07/usability-testing/</link><description>&lt;p&gt;Usability tests are manual tests used to check that the user interface is understandable. The focus of the tests are to ensure that product meets its intended purpose. These sort of tests can be subjective and are usually impossible to automate. It is important to differentiate usability testing from simply showing an interface to someone and asking them &amp;ldquo;Do you understand how this?&amp;rdquo;. It is usually done by creating a scenario such as &amp;ldquo;Can you find and add this song to a new playlist&amp;rdquo; and observing the steps that the user takes to perform the task.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 06 Jul 2015 10:57:30 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/usability-testing/</guid></item><item><title>The One Question Every Prospective College Student Should Be Asking</title><link>https://tiltingatwindmills.dev/the-one-qu-be-asking/</link><description>Apologies for the clickbaity headline. That sort of thing isn't usually my
style. I'll cut right to the chase. The question is "What…</description><author>Tilting at Windmills</author><pubDate>Mon, 06 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/the-one-qu-be-asking/</guid></item><item><title>Mutation Testing or How to Test Tests</title><link>https://boyter.org/2015/07/mutation-testing-test-tests/</link><description>&lt;p&gt;Mutation testing is a technique used to verify that tests are providing value. Mutation testing involves modifying the given program in small ways. These could include changing boolean checks such as if a condition is True to being False. A mutated version of code is known as a mutant. For each mutant a the test suite is run against it. The tests when run over the mutant version should have a percentage of failure. Where a mutant is not caught additional tests can be written to cover these cases.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sun, 05 Jul 2015 10:56:03 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/mutation-testing-test-tests/</guid></item><item><title>Who is Responsible for Software Quality?</title><link>https://boyter.org/2015/07/responsible-software-quality/</link><description>&lt;p&gt;In the beginning of my software development career I was interviewing for an intern position at Microsoft. I never did get the job but one think out of that interview process really stuck with. The second interviewer after the usual getting to know you chat aded me the following question. &amp;ldquo;On any given software project we have developers, software testers / quality assurance and managers involved. Who is responsible for the quality of the software?&amp;rdquo;. Being young and naive I confidently responded that the QA/testers were. After a long discussion artfully controlled by the interviewer I came to change my opinion. Below is the line of reasoning I went through with him.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sat, 04 Jul 2015 10:54:08 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/responsible-software-quality/</guid></item><item><title>Talks</title><link>https://boyter.org/talks/</link><description>&lt;p&gt;A few of the talks I have given and the slide desks are included below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python @ searchcode.com &lt;a href="http://www.boyter.org/wp-content/uploads/2015/07/sypy_searchcode.key.zip"&gt;sypy_searchcode.key&lt;/a&gt; (keynote) &lt;a href="http://www.boyter.org/wp-content/uploads/2015/07/sypy_searchcode.pptx"&gt;sypy_searchcode&lt;/a&gt; (powerpoint)&lt;/li&gt;
&lt;li&gt;Decoding CAPTCHA’s for Fun and Profit &lt;a href="https://github.com/boyter/decodingcaptchas"&gt;DecodingCaptchas Reveal.js&lt;/a&gt; (futher details can be found &lt;a href="http://www.boyter.org/2015/03/decoding-captchas-presentation/"&gt;http://www.boyter.org/2015/03/decoding-captchas-presentation/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;How AWS and Go Transformed a Public Broadcaster &lt;a href="https://boyter.org/static/aws-go-archive-presso/"&gt;https://boyter.org/static/aws-go-archive-presso/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sloc Cloc and Code - Can a crusty Go program outperform a well written Rust Project? &lt;a href="https://boyter.org/static/gophercon-syd-presentation/"&gt;https://boyter.org/static/gophercon-syd-presentation/&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=jd-sjoy3GZo"&gt;https://www.youtube.com/watch?v=jd-sjoy3GZo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DataEngBytes 2023 - Processing 40 TB of code from ~10 million projects with a dedicated server and Go for $100 &lt;a href="https://boyter.org/static/dataenbytes2023/"&gt;https://boyter.org/static/dataenbytes2023/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GopherCon 2023 - Bloom Filters: Building a Cutting Edge Go Search Engine to Explore the World&amp;rsquo;s Source Code &lt;a href="https://boyter.org/static/gophercon-syd-presentation-2023/"&gt;https://boyter.org/static/gophercon-syd-presentation-2023/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sat, 04 Jul 2015 09:12:08 GMT</pubDate><guid isPermaLink="true">https://boyter.org/talks/</guid></item><item><title>Heroku PostgreSQL vs Amazon RDS for PostgreSQL</title><link>https://www.brightball.com/articles/heroku-postgresql-vs-amazon-rds-for-postgresql</link><description>PostgreSQL is becoming the relational database of choice for web development for a whole host of good reasons.  That means that development teams have to make a decision on whether to  host their own or use a database as a service provider. The two biggest players in the world of PostgreSQL are Heroku PostgreSQL and Amazon RDS for PostgreSQL. Here's a detailed comparison.</description><author>Brightball Articles</author><pubDate>Fri, 03 Jul 2015 14:04:23 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/heroku-postgresql-vs-amazon-rds-for-postgresql</guid></item><item><title>A story about Hubris and Integration Tests</title><link>https://boyter.org/2015/07/story-hubris-integration-tests/</link><description>&lt;p&gt;Philip Dormer Stanhope, 4th Earl of Chesterfield (pictured) managed to embarrass me in front of my peers once. Sort of. In truth it was my hubris that caused the incident. Here is how it happened and what I learnt through the process.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.boyter.org/wp-content/uploads/2016/08/200px-Philip_Stanhope_4th_Earl_of_Chesterfield.png"&gt;&lt;!-- raw HTML omitted --&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the summer of 2010 I was tasked with developing a new application where I worked. The requirement was fairly simple &amp;ldquo;We need a web application to upload a CSV&amp;rdquo;. Requirements such as this aren&amp;rsquo;t exactly conducive to a good outcome but I was confident that given the data required to upload it would be fairly easy to do.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 03 Jul 2015 10:51:07 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/story-hubris-integration-tests/</guid></item><item><title>How searchcode.com is Unit and Integration Tested</title><link>https://boyter.org/2015/07/searchcode-com-unit-integration-tested/</link><description>&lt;p&gt;searchcode is a source code and documentation search engine. It allows users to is search over 20 billions lines of code and millions of API documentation. It at the time of writing gets over 300,000 unique visitors a month processes many millions of API requests.&lt;/p&gt;
&lt;p&gt;What follows is how I am testing searchcode, the issues I hit and where I think I am getting the most value. As big believer in testing as a methodology of improving code quality, one of my goals when rewriting searchcode was to ensure that it had a comprehensive test suite.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 01 Jul 2015 10:46:18 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/searchcode-com-unit-integration-tested/</guid></item><item><title>Flaky Tests</title><link>https://boyter.org/2015/06/flaky-tests/</link><description>&lt;p&gt;A test is considered flaky or flakey if it if fails occasionally. Generally flaky tests are considered to be a bad thing and should be modified to ensure they work correctly every time. This is because a test that is not trustworthy will be ignored even when indicating real failure.&lt;/p&gt;
&lt;p&gt;There are many situations that can cause to become flaky. Integration and acceptance tests are generally the tests in your test suite most likely to become flaky. They generally have more integrations across your software stack and as such there are more things likely to go wrong. We going to go through a few of the main reasons and go through in detail what you can do about a specific one.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 01 Jul 2015 01:50:04 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/06/flaky-tests/</guid></item><item><title>Clean Testable Repository Data Access in C Sharp</title><link>https://boyter.org/2015/06/clean-testable-repository-data-access-sharp/</link><description>&lt;p&gt;Below is an implementation of an extremely clean data access pattern possible using C# and Entity Framework. It saves you the effort of mocking the database context as the code you end up writing is so simple it is all compile time checked.&lt;/p&gt;
&lt;p&gt;The advantages of this are firstly that everything is very easy to test as you can perform all joins in your service layer with mocks of the repository. Secondly it makes your data layer stupidly simple allowing you to forgo writing many tests which would provide little value.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 01 Jul 2015 01:44:13 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/06/clean-testable-repository-data-access-sharp/</guid></item><item><title>The Unsung Benefits of Software Testing</title><link>https://boyter.org/2015/06/unsung-benefits-software-testing/</link><description>&lt;p&gt;One benefit that is generally not talked about when discussing testing is the following. The feeling of productivity because you are writing lots of code.&lt;/p&gt;
&lt;p&gt;Think about that for a moment. Ask any developer who wants to develop why they became a developer. One of the first things that comes up is &amp;ldquo;I enjoy writing code&amp;rdquo;. This is one of the things that I personally enjoy doing. Writing code, any code especially when its solving my current problem makes me feel productive. It makes me feel like I&amp;rsquo;m getting somewhere. Its empowering.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 30 Jun 2015 01:35:06 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/06/unsung-benefits-software-testing/</guid></item><item><title>Testing In Software Engineering</title><link>https://boyter.org/2015/06/testing-software-engineering/</link><description>&lt;p&gt;Testing is software engineering is a method of providing information about code quality when developing a piece of software. The intent of writing and running tests is the enforce good software design and identify software bugs and defects. These defects can include specification/requirement errors as well as developer mistakes.&lt;/p&gt;
&lt;p&gt;The general aim of software testing is the ensure that software meets the following goals,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Meets its requirements gathered before its design and implementation&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 29 Jun 2015 01:38:23 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/06/testing-software-engineering/</guid></item><item><title>Grouping Tests: Unit/Integration vs Fast/Slow Tests</title><link>https://boyter.org/2015/06/grouping-tests-unitintegration-fastslow-tests/</link><description>&lt;p&gt;There is a great deal of argument in the testing community over how to label tests. One camp likes to label tests using levels such that unit tests are in one group, integration in another and so forth. The other likes to label them based on how long they take to run ignoring what level they are in. Fast tests are those that run in milliseconds while slow take longer then this. The reason this is important is that when adopting a testing process slow and flaky tests (those which fail often) are the enemy. Slow tests tend to be run less often in the development process. A delay of a few seconds can seriously interrupt a developer or testers workflow. Also the more often your tests fail randomly the less confidence you are likely to have in them, ignoring genuine errors until they fail multiple times.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 29 Jun 2015 01:36:47 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/06/grouping-tests-unitintegration-fastslow-tests/</guid></item><item><title>Sanity Testing</title><link>https://boyter.org/2015/06/sanity-testing/</link><description>&lt;p&gt;Software sanity tests are closely associated with smoke tests. They attempt to determine if is reasonable to continue with testing a given piece of software. The objective is not to test all functionality, but to determine if there is value in doing so. You can consider it a &amp;ldquo;Should I continue to test this?&amp;rdquo; check. Sanity tests differ from smoke tests as they exist to check if new functionality has been met and existing bugs have been resolved.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 29 Jun 2015 01:13:41 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/06/sanity-testing/</guid></item><item><title>SSD Storage Cluster - Update and Diagram</title><link>https://smcleod.net/2015/06/ssd-storage-cluster-update-and-diagram/</link><description>&lt;p&gt;Due to several recent events beyond my control I&amp;rsquo;m a bit behind on the project - hence the lack of updates which I apologise for.&lt;/p&gt;
&lt;p&gt;The goods news is that I&amp;rsquo;m back working to finish off the clusters and I&amp;rsquo;m happy to report that all is going to plan.&lt;/p&gt;
&lt;p&gt;Here is the final digram of the two-node cluster design:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://smcleod.net//img/san/diagram.png" /&gt;&lt;/p&gt;
&lt;p&gt;Plain text version available &lt;a href="https://gist.github.com/sammcj/0503007ceb5038a0de3c"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://smcleod.net//img/san/lcmcpcmk.png" /&gt;&lt;/p&gt;
&lt;p&gt;This was generated from the &lt;a href="http://github.com/rasto/lcmc"&gt;LCMC&lt;/a&gt; tool (beware - it&amp;rsquo;s java!).&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Wed, 17 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/06/ssd-storage-cluster-update-and-diagram/</guid></item><item><title>Moving past averages in SQL (Postgres) – Percentiles</title><link>/2015/06/07/Moving-past-averages-in-SQL-Postgres-Percentiles/</link><description>&lt;p&gt;Often when you&amp;rsquo;re tracking a metric for the first time you take a look at your average. For example what is your ARPU - Average Revenue Per User. In theory this tells you if you can acquire new user how much you&amp;rsquo;ll make off that user. Or maybe what&amp;rsquo;s your average life time value of a customer. Yet, many that are more familiar looking and extracting meaning from data median or a few different looks at &lt;a href="http://apmblog.dynatrace.com/2012/11/14/why-averages-suck-and-percentiles-are-great/"&gt;percentiles can be much more meaningful&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And while you can very easily get the &lt;code&gt;AVG&lt;/code&gt; in Postgres, with a small amount more effort you can report on percentiles as well. Window functions have been around for some time in Postgres. They allow you to order your result set over a certain group. The most basic example is if you want to order by date, but know which one falls at place 10 in order you can use a window function and project out the &lt;code&gt;rank()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Beyond outputting the rank yourself and doing extra manipulation Postgres has some great utilities to make the most common uses even easier. Being able to compute things such as the perc 95 directly on the data, or lay out for every record in the result where it falls within a percentile is hugely useful. Let&amp;rsquo;s take a look:&lt;/p&gt;
&lt;p&gt;Assuming you have a table called purchases, which has a total in it we could try:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT id,
total,
ntile(100) OVER (ORDER BY total) AS perc_rank
FROM purchases
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This would give us something like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; id | total | perc_rank
----------|---------|-----------
264 | 12034 | 100
643 | 11830 | 100
...
...
304 | 751 | 95
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What this would tell us is we have less than 5% of our purchases that have a total over 751. From here you can start to dig in and extract all sorts of different meanings, and by doing directly in SQL you&amp;rsquo;re closer to the data and have one less processing step.&lt;/p&gt;
&lt;p&gt;Percentiles get even more fun with the ordered set functions that came out in &lt;a href="/2014/02/02/Examining-PostgreSQL-9.4/"&gt;Postgres 9.4&lt;/a&gt;. They even allow you to project out hypothetical values in certain cases. For now I&amp;rsquo;d encourage adding ntile to your toolbox anytime you&amp;rsquo;re analyzing average or medians it will make your world a bit better, and then consider exploring further on the &lt;a href="http://www.postgresql.org/docs/9.4/static/functions-aggregate.html#FUNCTIONS-ORDEREDSET-TABLE"&gt;ordered set functions&lt;/a&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Sun, 07 Jun 2015 23:55:56 GMT</pubDate><guid isPermaLink="true">/2015/06/07/Moving-past-averages-in-SQL-Postgres-Percentiles/</guid></item><item><title>Thoughts on Writing</title><link>https://captnemo.in/blog/2015/06/07/on-writing/</link><description>&lt;p&gt;I have always wanted to be a writer. I think secretly us all reader-folk have that ambition. The joy of getting across your thoughts to another person without ever having met them is enormous.&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;Asking for Donations might sound weird to some. I don’t really need the money, but I think I’d get an additional sense of responsibility towards finishing it if people start giving me money. I will be donating the entire proceedings to &lt;a href="https://www.eff.org/" title="Electronic Frontier Foundation"&gt;EFF&lt;/a&gt;.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Sun, 07 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/06/07/on-writing/</guid></item><item><title>Coding Pet Peeves</title><link>https://cmdev.com/blog/2015-06-03-codingpetpeeves/</link><description>Eight little things I like to nitpick about in code. Mostly applicable to Java, but some are language-neutral.</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Wed, 03 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-06-03-codingpetpeeves/</guid></item><item><title>Numberphilia</title><link>https://donatstudios.com/Numberphilia</link><description>&lt;p&gt;There's been a fair deal of hubbub in the community about version numbers, including what is and isn't &lt;a href="https://semver.org/"&gt;Semantic Versioning&lt;/a&gt;, what qualifies as a breaking change and how to use version numbers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Underscore.js&lt;/strong&gt; released a second digit &amp;quot;minor update&amp;quot; that was actually a &lt;a href="https://github.com/jashkenas/underscore/issues/1805"&gt;breaking update&lt;/a&gt; for some people. They argue it was &lt;em&gt;minor&lt;/em&gt; because not very many people would be affected. The community however was angry.&lt;/p&gt;
&lt;p&gt;On the opposite side of things, &lt;strong&gt;PHP&lt;/strong&gt; Internals announced they will be &lt;a href="https://wiki.php.net/rfc/php6"&gt;skipping version 6&lt;/a&gt; and numbering the next version of &lt;strong&gt;PHP 7&lt;/strong&gt; to avoid confusion with the never released UTF-16 native version. Again the community was angry.&lt;/p&gt;
&lt;h2&gt;Using Version Numbers Well&lt;/h2&gt;
&lt;p&gt;If you are &lt;em&gt;semantically&lt;/em&gt; versioning your library, the version represents a &lt;strong&gt;contract of trust&lt;/strong&gt; between you and your developers regarding the public API. The contract declares that nothing you change in a 'less than major' release should break their code. Ever.&lt;/p&gt;
&lt;p&gt;Break the contract, you can end up breaking their trust. Break their trust and they'll look elsewhere.&lt;/p&gt;
&lt;h3&gt;Version Numbers &lt;strong&gt;SHOULD NEVER&lt;/strong&gt; Be Branding&lt;/h3&gt;
&lt;p&gt;If you're using your version numbers as &lt;strong&gt;branding&lt;/strong&gt;, you are &lt;em&gt;doing it wrong&lt;/em&gt;. Version numbers should show a clear history of the public facing interface, not what you sell or advertise it as.&lt;/p&gt;
&lt;p&gt;Microsoft of all people &lt;a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832.aspx"&gt;understands this&lt;/a&gt;.  While their version numbers aren't truly semantic, they are aimed at developers - and &lt;strong&gt;highly&lt;/strong&gt; out of sync with the marketing designation because the version numbers denote a true relationship.&lt;/p&gt;
&lt;p&gt;You can have both a release number and a sales version. This is the way to go if sales demands control of the version number, such as where I work.&lt;/p&gt;
&lt;h3&gt;Increment Early, Increment Often&lt;/h3&gt;
&lt;p&gt;Breaking changes &lt;strong&gt;always&lt;/strong&gt; need to be a first digit release. &lt;strong&gt;Always&lt;/strong&gt;.  It doesn't matter if it's not a common use case. It shouldn't matter if you're saving the number for a &lt;em&gt;&amp;quot;woo big new release&amp;quot;&lt;/em&gt; version. A breaking change in a minor release violates trust and brings the quality of your software into question.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WHENEVER&lt;/strong&gt; a behavior or signature of &lt;strong&gt;ANY&lt;/strong&gt; &lt;em&gt;explicitly public member&lt;/em&gt; of your API has changed whereas the previous behavior was &lt;strong&gt;anything&lt;/strong&gt; other than bold face wrong it is a first digit release. &lt;/p&gt;
&lt;h2&gt;Numbers are Cheap&lt;/h2&gt;
&lt;p&gt;Numbers are cheap. Numbers are infinite. &lt;strong&gt;Never&lt;/strong&gt; reuse numbers, ever.  There is no reason.&lt;/p&gt;
&lt;p&gt;PHP in my strong opinion did the &lt;strong&gt;right thing&lt;/strong&gt; by skipping 6. They sidestepped ANY potential confusion, minor as it may have been. The argument that they caused confusion about &amp;quot;Where did 6 go&amp;quot; is childish. People will be investing time in the largest digit release, regardless of gaps. No one (save some overly cautious IT people) is going to be using PHP 5.6 and on seeing 7 released think &amp;quot;I'll upgrade to 6&amp;quot;.&lt;/p&gt;
&lt;p&gt;Trying to not have gaps in your version numbers makes as much sense as if Git were to use ordered numbers instead of hashes. &lt;/p&gt;
&lt;p&gt;Version numbers should be a &lt;strong&gt;universally unique identifier&lt;/strong&gt; for a specific set of code. If there is ever any form of contention over what a version number represents, increment. Don't think about it - just do it.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Always avoid confusion; don't ever be afraid to increment your major release number. Only good things can come from it.&lt;/p&gt;
&lt;p&gt;Trust is maintained.&lt;/p&gt;</description><author>Donat Studios</author><pubDate>Tue, 02 Jun 2015 06:13:00 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/Numberphilia</guid></item><item><title>HtmlToWord is now WordInserter</title><link>https://tomforb.es/blog/htmltoword-is-now-wordinserter/</link><description>I’ve released a redesign of my HtmlToWord library, specifically it now supports Markdown and multiple different ways to interact with Word. It’s now also been renamed to WordInserter to reflect this. Originally HtmlToWord was designed to take HTML input, process it and then insert a representation o...</description><author>Tom Forbes</author><pubDate>Sun, 24 May 2015 23:57:06 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/htmltoword-is-now-wordinserter/</guid></item><item><title>Video - Storage Cluster Failover Demo</title><link>https://smcleod.net/2015/05/video-storage-cluster-failover-demo/</link><description>&lt;p&gt;A brief demonstration of the failover and recovery process on the storage clusters I&amp;rsquo;ve been building.&lt;/p&gt;
&lt;div style="padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
      
    &lt;/div&gt;</description><author>smcleod.net</author><pubDate>Thu, 14 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/05/video-storage-cluster-failover-demo/</guid></item><item><title>Upsert lands in PostgreSQL 9.5 – A first look</title><link>/2015/05/08/Upsert-lands-in-PostgreSQL-9.5-A-first-look/</link><description>&lt;p&gt;If you’ve followed anything I’ve &lt;a href="/2012/04/30/why-postgres/"&gt;written about Postgres&lt;/a&gt;, you know that I’m a fan. At the same time you know that there’s been one feature that so many other databases have, which Postgres lacks and it &lt;a href="/2014/08/15/my-postgres-wishlist-for-9.5/"&gt;causes a huge amount of angst for not being in Postgres&lt;/a&gt;… Upsert. Well the day has come, it’s finally committed and will be available &lt;a href="http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=168d5805e4c08bed7b95d351bf097cff7c07dd65"&gt;in Postgres 9.5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sure we’re still several months away from Postgres 9.5 being released, anywhere from 3-6 months as a best guess. That doesn’t mean we can’t take a first look at this feature. Though before we get into it a few special call outs of thanks to Peter Geoghegan of the &lt;a href="http://www.heroku.com/postgres"&gt;Heroku Postgres&lt;/a&gt; team for being the primary author on it, Andres Freund who recently just joined &lt;a href="https://www.citusdata.com"&gt;Citus Data&lt;/a&gt; for his heavy contributions, and Heikki Linnakangas as well for his contributions.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;And now onto the exploration. Upsert is the common name, but if you’re unfamiliar upsert is essentially create or update – Create this new record, but if a conflict exists update it. Let’s take a practical example.&lt;/p&gt;
&lt;p&gt;Assume you have a web scraper that imports product information into a table. Each product has a UPC code, title, description, and link. There’s a unique constraint on the UPC code. Now, if your web scraper tries to insert a new product, and a product with the same UPC already exists, you’d usually get an error. But you don’t want the query to fail, you’d want to update the existing product instead. Maybe with a new image, maybe a new description, whatever have you, but I don’t want it to blow up… I simply want to capture the new data and save it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So before&lt;/strong&gt;: Insert a record… Exception this violates a unique constraint… Let your app figure out what to do. &lt;em&gt;protip: often applications would try to work around this, but you can run a chance of a race condition and duplicate records if there’s a conflict. TLDR; it’s not a perfect solution.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now&lt;/strong&gt;: Insert a record… There’s a unique constraint violation… Okay, let’s just update all the new record’s fields &lt;strong&gt;inside a single transaction&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So enough explanation, here’s how it actually looks in the syntax:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INSERT INTO products (
upc,
title,
description,
link)
VALUES (
123456789,
‘Figment #1 of 5’,
‘THE NEXT DISNEY ADVENTURE IS HERE - STARRING ONE OF DISNEY'S MOST POPULAR CHARACTERS! ’,
‘http://www.amazon.com/dp/B00KGJVRNE?tag=mypred-20’
)
ON CONFLICT DO UPDATE SET description=excluded.description;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It’s been a long time coming for this, and it makes building applications that need this kind of behavior even easier. While it would have been great for this to be available years ago, kudos to Postgres and its community for taking the approach that is safe for your data. The result we have now both provides the desired behavior of create or update, &lt;strong&gt;and&lt;/strong&gt; is performant without the risk of race conditions for your data.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Fri, 08 May 2015 23:55:56 GMT</pubDate><guid isPermaLink="true">/2015/05/08/Upsert-lands-in-PostgreSQL-9.5-A-first-look/</guid></item><item><title>Google Summer of Code 2015!</title><link>https://spindas.dreamwidth.org/1247.html</link><description>&lt;p&gt;My proposal for the Haskell's Google Summer of Code 2015 has been accepted!&amp;nbsp;I'm super excited for this. There's a list of the other accepted proposals &lt;a href="https://www.reddit.com/r/haskell/comments/342rvp/google_summer_of_code_18_projects_accepted/cqqt8mw"&gt;on reddit&lt;/a&gt;, and I've posted my full proposal as a &lt;a href="https://gist.github.com/spinda/b261167303515cc8a1d9"&gt;Gist&lt;/a&gt;. I'll be working on embedding &lt;a href="https://github.com/ucsd-progsys/liquidhaskell"&gt;LiquidHaskell&lt;/a&gt; signatures in Haskell's native type system. Woo!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="comment count unavailable" height="12" src="https://www.dreamwidth.org/tools/commentcount?user=spindas&amp;amp;ditemid=1247" style="vertical-align: middle;" width="30" /&gt; comments</description><author>spinda's dreamwidth</author><pubDate>Wed, 29 Apr 2015 06:57:27 GMT</pubDate><guid isPermaLink="true">https://spindas.dreamwidth.org/1247.html</guid></item><item><title>More AUR Packages!</title><link>https://spindas.dreamwidth.org/986.html</link><description>&lt;strong&gt;New&amp;nbsp;Packages&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/nemo-owncloud-git/"&gt;nemo-owncloud-git&lt;/a&gt;, for my &lt;a href="https://github.com/spinda/nemo-owncloud"&gt;port&lt;/a&gt; of the Nautilus ownCloud plugin to Nemo&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Adopted Packages&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/gargoyle/"&gt;gargoyle&lt;/a&gt;, an interactive fiction player&lt;/li&gt;&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/nemo-dropbox-git/"&gt;nemo-dropbox-git&lt;/a&gt;, Dropbox plugin for Nemo&lt;/li&gt;&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/nemo-fileroller-git/"&gt;nemo-fileroller-git&lt;/a&gt;, File Roller plugin for Nemo&lt;/li&gt;&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/jips/"&gt;jips&lt;/a&gt;, an IPS patcher&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="comment count unavailable" height="12" src="https://www.dreamwidth.org/tools/commentcount?user=spindas&amp;amp;ditemid=986" style="vertical-align: middle;" width="30" /&gt; comments</description><author>spinda's dreamwidth</author><pubDate>Wed, 29 Apr 2015 04:02:02 GMT</pubDate><guid isPermaLink="true">https://spindas.dreamwidth.org/986.html</guid></item><item><title>Organizing Background Worker Queues</title><link>https://www.brightball.com/articles/organizing-background-worker-queues</link><description>At work earlier today I ran across an issue where one of our application queues got backed up and it got me to thinking about how queues are organized in general. The TLDR answer: use urgency and intensity.</description><author>Brightball Articles</author><pubDate>Thu, 23 Apr 2015 23:58:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/organizing-background-worker-queues</guid></item><item><title>Go from a PHP Perspective</title><link>https://www.brightball.com/articles/go-from-a-php-perspective</link><description>Here are the slides from my recent presentation to UpstatePHP in Greenville, looking at Go (Golang) from a PHP Perspective.</description><author>Brightball Articles</author><pubDate>Fri, 17 Apr 2015 00:06:59 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/go-from-a-php-perspective</guid></item><item><title>Talk - High Performance Software Defined Storage</title><link>https://smcleod.net/2015/04/talk-high-performance-software-defined-storage/</link><description>&lt;p&gt;A high level talk from Infracoders Melbourne on 12/04/2015.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://media.githubusercontent.com/media/sammcj/smcleod_files/refs/heads/master/slides/lightning_san.pdf"&gt;&lt;img alt="Click to Start Slides" src="https://smcleod.net//img/san/supermicrox2.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://media.githubusercontent.com/media/sammcj/smcleod_files/refs/heads/master/slides/lightning_san.pdf"&gt;&lt;img alt="Click to Start Slides" src="https://smcleod.net//img/san/ic-slides-image.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also a low quality recording available here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/VAdqurA2zQ4?t=198"&gt;&lt;img alt="Click to Start Video" src="https://smcleod.net//img/san/ic-sds-yt-thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related posts:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://smcleod.net/building-a-high-performance-ssd-san/"&gt;Building a high performance SSD SAN - Part 1&lt;/a&gt;&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Wed, 15 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/04/talk-high-performance-software-defined-storage/</guid></item><item><title>Filetree Listing</title><link>https://boyter.org/2015/04/filetree-listing/</link><description>&lt;p&gt;Just a quick update to searchcode. A few small tweaks here and there, but the largest is that there is now a file tree listing option which will show the file tree for any project. An example would be going to &lt;a href="https://searchcode.com/codesearch/view/92885393/"&gt;this file&lt;/a&gt; and then clicking the &amp;ldquo;View File Tree&amp;rdquo; button on the top left.&lt;/p&gt;
&lt;p&gt;An example screenshot of the result of this is included below.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.boyter.org/wp-content/uploads/2015/04/filetree.png"&gt;&lt;!-- raw HTML omitted --&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 15 Apr 2015 00:32:31 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/04/filetree-listing/</guid></item><item><title>HP Support Solutions Framework Security Issue</title><link>https://tomforb.es/blog/hp-support-solutions-framework-security-issue/</link><description>After discovering the flaw in Dell’s System Detect software I looked into other similar software for issues. This post details two issues I found with the HP Product Detection software and explores the protections HP put in place. I’m also going to explain how they could be easily bypassed to allow ...</description><author>Tom Forbes</author><pubDate>Sun, 12 Apr 2015 02:50:23 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/hp-support-solutions-framework-security-issue/</guid></item><item><title>Ruby on Rails and PostgreSQL Class Slides</title><link>https://www.brightball.com/articles/ruby-on-rails-and-postgresql-class-slides</link><description>In August I taught a course titled Ruby on Rails and PostgreSQL - Intro to Advanced in Greenville over the span of 3 weeks. Here is the compilation of slides from the class.</description><author>Brightball Articles</author><pubDate>Mon, 06 Apr 2015 19:03:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/ruby-on-rails-and-postgresql-class-slides</guid></item><item><title>Medium abuses nofollow</title><link>https://captnemo.in/blog/2015/04/06/medium-abuses-nofollow/</link><description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Since I published this post, I have changed my opinion somewhat on the matter. This post is &lt;a href="https://news.ycombinator.com/item?id=9328384"&gt;quite confrontational&lt;/a&gt; and I didn’t mean it to be that way. Medium is not wrong in this matter, but I still think we need to look for better solutions. I have since been working on a &lt;a href="https://github.com/captn3m0/ideas/blob/master/BADIDEAS.md#-nofollow-enforcer"&gt;proposal/idea&lt;/a&gt; that would use machine learning to “solve” this problem, instead of side-stepping it.&lt;/p&gt;

&lt;p&gt;I call &lt;a href="https://medium.com" rel="nofollow" title="This is a nofollow link"&gt;medium&lt;/a&gt; a “&lt;em&gt;mostly good&lt;/em&gt;” platform for lazy writers. A lot of people have written about its excellent typography, or it being the next “big publishing platform”. I’ve used medium in the past, and while it does have its benefits, I have stopped using it.&lt;/p&gt;

&lt;p&gt;My primary reason was that I already have a blog, where I can control the entire experience. This is the same reason why New York Times does not start publishing articles on Medium.&lt;/p&gt;

&lt;p&gt;The other reason is nofollow abuse.&lt;/p&gt;

&lt;p&gt;Medium hosts more than &lt;a href="https://www.google.co.in/webhp?q=site%3Amedium.com#q=site:medium.com"&gt;1M indexed pages&lt;/a&gt;. It has around &lt;a href="https://medium.com/editors-picks"&gt;650k users&lt;/a&gt; currently by &lt;a href="https://www.quora.com/How-many-users-does-Medium-have/answer/Josh-Yang"&gt;a conservative estimate&lt;/a&gt;. Rounding it to 700k to account for other users, collections, and other internal pages, it leaves us with around 300,000 articles on medium.&lt;/p&gt;

&lt;p&gt;A basic tenet of the web is linkability. That is what Tim Berners Lee meant when he talked about HyperText:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;HyperText is a way to link and access information of various kinds as a web of nodes in which the user can browse at will.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Over time, the web has evolved, and is now not just limited to human users, but to computers as well. This is an important consideration on which the web rests today. The biggest example of this is Google Search, which uses these links to “follow, spider, and index” the web. Google uses this linking information to build a citation index, which gives us the quality of a web page depending on the quality and number of sites that link to it.&lt;/p&gt;

&lt;p&gt;If you know a bit or two about SEO, you might have heard of shady backlink techniques, which essentially amount to you getting links from an established site. This often takes the form of user-generated content such as comments and answers.&lt;/p&gt;

&lt;p&gt;While fighting spam is important, it is far more important to make sure that web remains linked, that people are credited for the content they create. Medium hosts 300,000 articles published by half a million users, and yet none of these links back to external website, because of something called “rel=nofollow”.&lt;/p&gt;

&lt;p&gt;When a link has a &lt;code class="language-plaintext highlighter-rouge"&gt;rel=nofollow&lt;/code&gt; attribute, search engines do not count it as a citation in their index. While this may be the right strategy for comments on a wordpress blog to prevent spam, this is not the right way to move forward if you want to “revolutionize the publishing industry”.&lt;/p&gt;

&lt;p&gt;While medium is not as bad as some other sites in this regard (like quora, which even blocks the internet archive), it is very important because it portrays itself as a “publishing platform”. This means, medium is made up of articles, blog posts, with lots of outbound links compared to, for instance, StackOverflow answers (which &lt;a href="http://meta.stackexchange.com/questions/111279/remove-nofollow-on-links-deemed-reputable"&gt;solved this problem back in 2011&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;If you publish content on medium, and provide relevant links for your readers, remember that these links are not considered as relevant by search engines.&lt;/p&gt;

&lt;p&gt;Medium has said that this is &lt;a href="https://twitter.com/lenkendall/status/432203084270292992"&gt;not a top priority&lt;/a&gt; at the moment for them.&lt;/p&gt;

&lt;p&gt;I understand completely. Handling spam would be a far more harder problem to solve than just blacklisting all outbound links. But we cannot go this way, if we want an open web. We need publishing platforms that cite content, and not blacklist it. This is why I write content on my own blog, and not on medium.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Mon, 06 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/04/06/medium-abuses-nofollow/</guid></item><item><title>Protecting Users from Phishing and Fraud</title><link>https://www.brightball.com/articles/protecting-users-from-phishing-and-fraud</link><description>This presentation covers my experiences combatting phishing and fraud using DMARC and assorted other techniques in a large eBay-like platform for a niche market...when the site previously did everything over direct user email...for over a decade. Good times.</description><author>Brightball Articles</author><pubDate>Thu, 02 Apr 2015 01:47:23 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/protecting-users-from-phishing-and-fraud</guid></item><item><title>Google Drive: Publicly hosting a static website</title><link>https://www.seanw.org/blog/publicly-host-and-share-websites-on-google-drive/</link><description>I frequently need to demo work in progress web sites and web apps to people I&amp;rsquo;m working with. I was looking for the most convenient way to do this and found that Google Drive was a good fit to letting me publicly share web development projects.
Google Drive provides an easy way to store and share documents in the cloud. The Google Drive desktop app also conveniently keeps a folder on your machine in sync with your online Google Drive folder in the same way Dropbox does.</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Wed, 01 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/publicly-host-and-share-websites-on-google-drive/</guid></item><item><title>Dell System Detect RCE vulnerability</title><link>https://tomforb.es/blog/dell-system-detect-rce-vulnerability/</link><description>I recently discovered a serious flaw with Dell System Detect that allowed an attacker to trigger the program to download and execute an arbitrary file without any user interaction. Below is a summary of the issue and the steps taken to bypass the protections Dell put in place. Timeline: The issue wa...</description><author>Tom Forbes</author><pubDate>Mon, 23 Mar 2015 17:16:10 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/dell-system-detect-rce-vulnerability/</guid></item><item><title>Achieving Full Marks on Qualys SSL Labs</title><link>https://3059274a.danpalmer-me.pages.dev/2015-03-23-ssl-labs-grade-a/</link><description>Qualys have become well known in the recent crop of SSL and TLS vulnerabilities as a first-responder with automated testing and validation, but scoring top marks on their SSL Labs test can be difficult. I explored what was required to score full marks.</description><author>Dan Palmer</author><pubDate>Mon, 23 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://3059274a.danpalmer-me.pages.dev/2015-03-23-ssl-labs-grade-a/</guid></item><item><title>Monk is now a Ruby app.</title><link>https://benovermyer.com/blog/2015/03/monk-is-now-a-ruby-app/</link><description>&lt;p&gt;Well, it happened. It took a few days of work, but I taught myself enough Ruby on Rails to fully refactor Monkblog from PHP/Laravel to RoR.&lt;/p&gt;
&lt;p&gt;The blog is now running on Heroku, and my next step will be to setup continuous deployment. I'm pretty excited about this development! I'm officially running a Ruby on Rails app in production that I wrote myself.&lt;/p&gt;
&lt;p&gt;And of course, now that that's done, I'm working on improvements to the blog. The first order of business will probably be to make the writing screen look and feel more like Ghost's marvelous editor.&lt;/p&gt;
&lt;p&gt;I also need to port all of my old content from wherever I can find it into this new blog. I lost several posts when my old web server died (long story), but I imagine I can restore them easily enough. Just need to find backups...&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sat, 21 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/03/monk-is-now-a-ruby-app/</guid></item><item><title>Blog post on recent talk</title><link>https://captnemo.in/blog/2015/03/20/josd-talk/</link><description>&lt;p&gt;So I recently did a talk on Joy of Software Development. You can read more about the talk &lt;a href="https://captnemo.in/talks/josd/"&gt;here&lt;/a&gt; (link includes slides and list of topics covered). This post is devoted to the references I’d promised to link to in the talk. Since it was an introductory talk, and I didn’t want to bore people to death, I decided to cover lots of topics at a shallow depth, instead of covering a few topics deeply.&lt;/p&gt;

&lt;p&gt;This means that I need to post more material for people to follow up on. So, this is that reference blog post. Make sure you have a copy of the slides open as you go through these links.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: I also gave this talk (with a few updates) at &lt;a href="https://www.geekskool.com/"&gt;GeekSkool&lt;/a&gt; in October 2015.&lt;/p&gt;

&lt;h2 id="software-development-in-general"&gt;Software Development in general&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://sockpuppet.org/blog/2015/03/06/the-hiring-post/"&gt;Hiring in software industry is broken&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?BreadthFirstLearning"&gt;Breadth First Learning&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://blog.codinghorror.com/recommended-reading-for-developers/"&gt;Recommended readings for developers&lt;/a&gt; by Jeff Atwood (codinghorror)&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://blog.codinghorror.com/version-1-sucks-but-ship-it-anyway/"&gt;Ship v1, even if it sucks&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://web.archive.org/web/20160504181428/http://mstrick.com/ship-early-and-often/"&gt;Ship early, ship often&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.joelonsoftware.com/articles/fog0000000069.html"&gt;Never rewrite, always refactor&lt;/a&gt; by Joel Spolsky&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;The Joel Test&lt;/a&gt; to score a software company.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="software-security"&gt;Software Security&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=9164895"&gt;Security is the opposite of obscurity&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://owasp.org/www-project-top-ten/"&gt;OWASP Top 10&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://class.coursera.org/softwaresec-002"&gt;Software Security&lt;/a&gt; course on coursera&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ctftime.org"&gt;CTFTime&lt;/a&gt; - See upcoming CTF contests&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://io.smashthestack.org/"&gt;SmashTheStack&lt;/a&gt; - Learn buffer overflow attacks&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://exploit-exercises.lains.space/nebula/"&gt;Nebula Exploit Excercises&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://backdoor.sdslabs.co/"&gt;Backdoor&lt;/a&gt; - Security CTF platform for beginners by SDSLabs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="starting-advice"&gt;Starting Advice&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://codahale.com/how-to-safely-store-a-password/"&gt;Use bcrypt&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://security.stackexchange.com/"&gt;Ask questions on Security.SE&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?PrincipleOfLeastPrivilege"&gt;Principle Of Least Privilege&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://stackoverflow.com/a/2794089/368328"&gt;Never trust user input&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="agnostic-software-development"&gt;Agnostic Software Development&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://programmers.stackexchange.com/questions/1189/what-should-i-do-to-be-language-agnostic"&gt;What should I do to be language-agnostic?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://pragprog.com/book/btlang/seven-languages-in-seven-weeks"&gt;Seven languages in seven weeks&lt;/a&gt; (Book)&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?PickTheRightToolForTheJob"&gt;Right tool for the job&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?LanguageAgnostic"&gt;Language Agnostic&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://programmers.stackexchange.com/questions/64701/balance-between-right-tool-for-the-job-and-familiarity"&gt;Balance between “right tool for the job” and familiarity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="free-and-open-source-development"&gt;Free and open source development&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.gnu.org/philosophy/open-source-misses-the-point.html"&gt;Why Open Source misses the point of Free Software&lt;/a&gt; - by Richard Stallman&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://opensource.org/osd-annotated"&gt;Open source definition&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://choosealicense.com/"&gt;Choose a license&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.gnu.org/philosophy/free-sw.html"&gt;What is free software?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.wired.com/2013/09/why-free-software-is-more-important-now-than-ever-before/"&gt;Why Free Software Movement is important&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.mozilla.org/en-US/mission/"&gt;Mozilla mission statement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="version-control"&gt;Version Control&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://git-scm.com/book/en/v2"&gt;Pro Git&lt;/a&gt; (Book)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://try.github.io/levels/1/challenges/1"&gt;Learn Git in your browser&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://web.archive.org/web/20180926172759/http://hginit.com/"&gt;Hg Init&lt;/a&gt; Mercurial tutorial&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://stackoverflow.com/questions/35837/what-is-the-difference-between-mercurial-and-git"&gt;Difference betweeng Hg and Git&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://z.github.io/whygitisbetter/"&gt;Benefits of git&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;Must read post on git branching model&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.kernel.org/pub/software/scm/git/docs/everyday.html"&gt;Git in 20 commands&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="tests"&gt;Tests&lt;/h2&gt;

&lt;p&gt;During the talk, I decidedly used the term TDD incorrectly. TDD technically means going test first, but I used it as an introduction to testing in general. This was intentional. The links here will use TDD in the correct sense.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://code.tutsplus.com/tutorials/beginning-test-driven-development-in-python--net-30137"&gt;Test Driven Development Tutorial&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://programmers.stackexchange.com/questions/41409/why-does-tdd-work"&gt;Why TDD works&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://programmers.stackexchange.com/questions/66480/when-is-it-appropriate-to-not-unit-test"&gt;How much to cover in tests&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://blog.codinghorror.com/i-pity-the-fool-who-doesnt-write-unit-tests/"&gt;Importance of testing&lt;/a&gt; - Jeff Atwood&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://sd.jtimothyking.com/2006/07/11/twelve-benefits-of-writing-unit-tests-first/"&gt;Benefits of going test first&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://leif.me/on-testing-culture-in-github-projects/"&gt;Testing culture at github&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/captn3m0/talks/blob/gh-pages/josd/code/code2.js"&gt;Source code I used in talk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="rest-and-apis"&gt;REST and APIs&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.quora.com/How-did-Roy-Fieldings-introduction-of-REST-in-his-2000-doctoral-thesis-impact-the-internet"&gt;Why was REST a breakthrough&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.looah.com/source/view/2284"&gt;A simple lucid explanation of REST&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.programmableweb.com/"&gt;What API to use&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?NotInventedHere"&gt;NIH Syndrome&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="unix-philosophy"&gt;Unix Philosophy&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;The epic &lt;a href="http://www.leancrew.com/all-this/2011/12/more-shell-less-egg/#fnref:pipe"&gt;Knuth vs McIlroy&lt;/a&gt; story&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.catb.org/jargon/html/Z/Zawinskis-Law.html"&gt;Zawinski’s Law&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://onethingwell.org/"&gt;http://onethingwell.org/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy"&gt;Wikipedia article&lt;/a&gt; on the topic is surprisingly good&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://unix.stackexchange.com/questions/30759/whats-a-good-example-of-piping-commands-together"&gt;Good examples of pipes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="books"&gt;Books&lt;/h2&gt;
&lt;p&gt;These are books i absolutely recommend every software developer to read, in order.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href="http://blog.codinghorror.com/dont-make-me-think-second-edition/"&gt;Don’t Make Me Think&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/"&gt;The Pragmatic Programmer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Other than these, I recommend reading Code Complete, Mythical Man Month, and everything by Jeff Atwood and Zach Homan, but only after you have read the above 2 books.&lt;/p&gt;

&lt;h2 id="how-to-get-better-at-software-development"&gt;How to get better at Software Development?&lt;/h2&gt;
&lt;p&gt;This is just a small list of topics I cover in a recent blog post. This is only present
in the updated version of the talk which I gave at GeekSkool. You can read the blog
post &lt;a href="/blog/2015/10/12/get-better-at-software-development/"&gt;here&lt;/a&gt; to look at the points I make.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Phew. That was a lot of links. If you are ever interested in learning more about software development, feel free to &lt;a href="/contact/"&gt;contact me&lt;/a&gt;. If you ever feel like chatting with me, I’m usually online at &lt;a href="https://chat.sdslabs.co"&gt;chat.sdslabs.co&lt;/a&gt;.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Fri, 20 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/03/20/josd-talk/</guid></item><item><title>Updates to searchcode.com</title><link>https://boyter.org/2015/03/updates-searchcode-com/</link><description>&lt;p&gt;Just a quick post to list some updates to searchcode.com The first is a slight modification to the home page. A while ago I received an email from the excellent &lt;a href="https://plus.google.com/111936682578972850234/posts"&gt;Christian Moore&lt;/a&gt; who provided some mock-ups of how he felt it should look. I loved the designs, but was busy working on other issues. Thankfully however in the last week or so I found the time to implement his ideas and the result is far more professional to me.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 19 Mar 2015 00:11:33 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/03/updates-searchcode-com/</guid></item><item><title>Continuous integration for the Linux Kernel - Built within Docker</title><link>https://smcleod.net/2015/03/continuous-integration-for-the-linux-kernel-built-within-docker/</link><description>&lt;p&gt;Linux Kernel CI for Debian&lt;/p&gt;
&lt;p&gt;&lt;img src="https://smcleod.net//img/build-passing.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/sammcj/kernel-ci"&gt;Github: sammcj/kernel-ci&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Those of us using technologies such as Docker and BTRFS or simply trying to gain a performance edge on the competition have a lot to gain from the features and performance of recent Kernel updates (especially from 3.18 onwards).&lt;/p&gt;
&lt;p&gt;&amp;lsquo;Enterprise&amp;rsquo; Linux distributions such as RHEL &amp;amp; variants are concerningly out of date when comes to the Kernel.
Many people seem to have forgotten what Linux is&amp;hellip; &lt;em&gt;Linux IS the Kernel&lt;/em&gt;.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Sun, 15 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/03/continuous-integration-for-the-linux-kernel-built-within-docker/</guid></item><item><title>Decoding Captcha's Presentation</title><link>https://boyter.org/2015/03/decoding-captchas-presentation/</link><description>&lt;p&gt;A few days ago there was a lack of speakers for #SyPy which is the Sydney Python meet-up held most months and sponsored by Atlassian. I had previously put my hand up to help out if this situation ever came up and was mostly ready with a presentation about Decoding Captchas. I did not expect it to be so full that people were standing (largest crowd I had ever seen there). Thankfully it seemed to go over well and while I need to get more practice at public speaking I did enjoy it. A few choice tweets that came out of the end of the event,&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sun, 08 Mar 2015 22:41:13 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/03/decoding-captchas-presentation/</guid></item><item><title>Buxton's Rule</title><link>https://captnemo.in/blog/2015/03/08/buxtons-rule/</link><description>&lt;p&gt;I consider myself a UX enthusiast. I consider that term to aptly describe my interest in UX. As I’m deeply involved in many UX and design decisions, I try to be well read on design and UX principles. While reading a discussion about &lt;a href="http://www.cultofmac.com/181782/every-iphone-prototype-apple-ever-made-before-released-the-first-iphone-gallery/" title="Every iPhone Prototype Apple ever made before releasing the first iPhone"&gt;iPhone prototypes&lt;/a&gt; on &lt;a href="https://news.ycombinator.com/item?id=4312460" title="Hacker News Discussion"&gt;HN&lt;/a&gt; in June ‘12, I came across this comment:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Goes to show what it takes to achieve excellence: lots of trial and error. Produce at least 3 alternatives for every design decision (Bill Buxton agrees).&lt;/p&gt;

  &lt;p&gt;— &lt;a href="https://news.ycombinator.com/item?id=4312953"&gt;mstuherl&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It sounded so basic, yet often I see designers trying to defend their first design, because it seems good enough to them. No good design is ever born at the first step. Just like any other process, it takes multiple iterations to perfect it.&lt;/p&gt;

&lt;p&gt;I recently got in touch with Morgan (&lt;a href="https://news.ycombinator.com/user?id=msutherl" title="HN profile"&gt;mstuherl on HN&lt;/a&gt;), and thanked him for his comment. Here’s what he said when I told him I wanted to dub it mstuherl’s rule:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hah! My name’s Morgan, so you can call it Morgan’s Rule if you like, but it comes from Bill, so Buxton’s rule would be more appropriate. His book Sketching User Experience contains yet more wisdom!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So thats what I’m calling it:&lt;/p&gt;

&lt;div&gt;
&lt;center&gt;
&lt;h3&gt;
  BUXTON'S RULE
  &lt;br /&gt;
  Produce at least 3 alternatives for every design decisions.
&lt;/h3&gt;
&lt;/center&gt;
&lt;/div&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.billbuxton.com/iteration.html"&gt;Iteration in the Design of the Human-Computer Interface&lt;/a&gt; - Bill Buxton&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.amazon.com/Sketching-User-Experiences-Interactive-Technologies/dp/0123740371"&gt;Sketching User Experiences&lt;/a&gt; by Bill Buxton&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.sensible.com/dmmt.html"&gt;Don’t Make Me Think&lt;/a&gt; by Steve Krug (My first recommendation to every software dev/designer)&lt;/li&gt;
&lt;/ul&gt;</description><author>Nemo's Home</author><pubDate>Sun, 08 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/03/08/buxtons-rule/</guid></item><item><title>scytheCTF and Updates</title><link>https://captnemo.in/blog/2015/02/27/scythe-ctf-updates/</link><description>&lt;p&gt;February has been an interesting month for me. I haven’t been programming a lot, but have definitely been writing a lot. I have got a few more upcoming projects as well, which I’d love to announce soon.&lt;/p&gt;

&lt;p&gt;We recently held a short 8-hour CTF (scytheCTF) on Backdoor. I made two challenges for the CTF:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://backdoor.sdslabs.co/challenges/SHITTY-OTP"&gt;SHITTY-OTP&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://backdoor.sdslabs.co/challenges/LOST-FOUND"&gt;LOST-FOUND&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both of these problems were rush jobs because of several reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We didn’t have much time to set the problems.&lt;/li&gt;
  &lt;li&gt;We didn’t expect much participation in scytheCTF.&lt;/li&gt;
  &lt;li&gt;scytheCTF was a test CTF, just to figure out any issues with the internet launch of Backdoor.&lt;/li&gt;
  &lt;li&gt;scythe is also supposed to be beginner friendly, unlike our annual BackdoorCTF, which will include much harder problems.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I had a lot of fun with &lt;a href="https://twitter.com/kandoiabhi"&gt;@kandoiabhi&lt;/a&gt; in setting the problems. It was also great seeing &lt;a href="https://twitter.com/DefConUA"&gt;@DefConUA&lt;/a&gt; participate in such a small-scale contest.&lt;/p&gt;

&lt;p&gt;Other than scythe, we recently had our annual SDSLabs trip to Rishikesh, which I enjoyed a lot. I also wrote a small post on &lt;a href="/setup/"&gt;my work setup&lt;/a&gt;.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Fri, 27 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/02/27/scythe-ctf-updates/</guid></item><item><title>Xen Orchestra Docker Image</title><link>https://smcleod.net/2015/02/xen-orchestra-docker-image/</link><description>&lt;p&gt;Docker config to setup XO which is a web interface to visualize and administrate your XenServer (or XAPI enabled) hosts&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/sammcj/docker-xen-orchestra"&gt;Github: sammcj/docker-xen-orchestra&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="running-the-app"&gt;Running the app&lt;/h2&gt;
&lt;p&gt;Updates are pushed to the Docker Hub&amp;rsquo;s automated build service:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://registry.hub.docker.com/u/sammcj/docker-xen-orchestra"&gt;https://registry.hub.docker.com/u/sammcj/docker-xen-orchestra&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="from-docker-hub"&gt;From Docker Hub&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull sammcj/docker-xen-orchestra
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -p 8000:80 sammcj/docker-xen-orchestra
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="building"&gt;Building&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/sammcj/docker-xen-orchestra.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; docker-xen-orchestra
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Edit whatever config you want to change&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build -t xen-orchestra .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See &lt;a href="https://xen-orchestra.com"&gt;https://xen-orchestra.com&lt;/a&gt; for information on Xen Orchestra&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Thu, 26 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/xen-orchestra-docker-image/</guid></item><item><title>Delete Government-Linked Certificate Authorities in OSX</title><link>https://smcleod.net/2015/02/delete-government-linked-certificate-authorities-in-osx/</link><description>&lt;p&gt;&lt;a href="http://zitseng.com/archives/7489"&gt;Inspired by http://zitseng.com/archives/7489&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sammcj/delete-unknown-root-ca"&gt;Source (Github)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;WARNINGS&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do not run unless you understand what this is doing&lt;/li&gt;
&lt;li&gt;The CA system is broken by design - This is not a fix for that&lt;/li&gt;
&lt;li&gt;This is merely a band-aid for those interested or concerned about these root CAs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x delete_gov_roots.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./delete_gov_roots.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll be prompted for your password as root access is required to delete system-wide root certs.&lt;/p&gt;
&lt;p&gt;&lt;img alt="sha1" src="https://cloud.githubusercontent.com/assets/862951/6326428/a261ae24-bba5-11e4-9f69-5aeb36257077.png" /&gt;&lt;/p&gt;
&lt;h2 id="see-also"&gt;See Also&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://convergence.io"&gt;http://convergence.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/certificate-patrol/"&gt;https://addons.mozilla.org/en-US/firefox/addon/certificate-patrol/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kirei/catt"&gt;https://github.com/kirei/catt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.eff.org/observatory"&gt;https://www.eff.org/observatory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=478418"&gt;https://bugzilla.mozilla.org/show_bug.cgi?id=478418&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.apple.com/en-us/HT202858"&gt;http://support.apple.com/en-us/HT202858&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning"&gt;https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>smcleod.net</author><pubDate>Mon, 23 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/delete-government-linked-certificate-authorities-in-osx/</guid></item><item><title>C# XML Cleaner Regex</title><link>https://boyter.org/2015/02/c-xml-cleaner-regex/</link><description>&lt;p&gt;One of the most annoying things I deal with is XML documents with invalid characters inside them. Usually caused by copy pasting from MS Word it ends up with invisible characters that you cannot easily find and cause XML parsers to choke. I have encountered this problem enough that I thought a quick blog post would be worth the effort.&lt;/p&gt;
&lt;p&gt;As such here mostly for my own reference is a regular expression for C# .NET that will clean invalid XML characters from any XML file.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 20 Feb 2015 00:41:47 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/02/c-xml-cleaner-regex/</guid></item><item><title>A product management blueprint</title><link>/2015/02/18/A-product-management-blueprint/</link><description>&lt;p&gt;I find myself having more conversations with startups – both small and large – about product management. I&amp;rsquo;ve blogged about some of &lt;a href="http://www.craigkerstiens.com/2013/03/13/planning-and-prioritizing/"&gt;the tools&lt;/a&gt; in my chest here but I haven&amp;rsquo;t talked much about my “blueprint” for product management, which I find myself laying out in many conversations over coffee. What follows is this process I’ve used a few times over with new teams to get product and engineering moving together, shipping in a predictable manner, and tackling bigger and more strategic projects.&lt;/p&gt;
&lt;h3 id="trust"&gt;
&lt;div&gt;
Trust
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I need to know how to work with my team, what their working styles are, and how we interact. This starts by simply interacting – specifically, outside of the office. I heard a similar opinion recently from Chris Fry (who ran engineering at Salesforce and Twitter) when he remarked something to the effect of: “you can tell a good PM from a bad one based on if he goes to drinks with his team.” Without getting hung up on whether it’s beers or coffee, it’s more about socialization with your team and time outside the office. My personal approach: expect a dinner invite over to my place when I take on running product for a new team.&lt;/p&gt;
&lt;h3 id="velocity"&gt;
&lt;div&gt;
Velocity
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Once you&amp;rsquo;ve started to build some rapport, it&amp;rsquo;s time to get down to business. If being able to quickly commit and ship something isn’t a problem for you, then it’s easy to just assume this is working. In reality most teams I encounter that need PM support don’t have shipping nailed down. You probably already know if you fall into that category of feeling like you can commit and ship vs. not, so if you’re not able to do that a few tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There’s some projects that everyone wants to ship that’s been tried over and over, &lt;strong&gt;don’t tackle that first&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Shipping something is better than nothing. It doesn&amp;rsquo;t have to be the right thing.&lt;/li&gt;
&lt;li&gt;Sometimes you don&amp;rsquo;t have to ship something to get velocity, you can launch things you already have&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Kill scope&lt;/del&gt; Test things earlier and more iteratively, the more you can validate or try something without requiring a large investment the more everyone feels better about the direction you’re heading.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key here is to commit to projects, deliver, and move on. Your velocity depends solely on delivery, not tasks, not sprints, not projects, etc. If you haven’t shipped anything in a year, then your velocity for the year is zero. At a later point you should move from the focus on shipping anything to shipping the right things, it’s more important to ship 1 thing that moves the needle than 10 that don’t, but that’s a later concern.&lt;/p&gt;
&lt;h3 id="killing-things"&gt;
&lt;div&gt;
Killing things
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;On the note of killing scope&amp;hellip; I&amp;rsquo;ve heard it articulated at times, that some engineers are happy when certain PMs show up because it means less work for them. When you go over to an engineer’s desk are you creating more or less work? The answer should be less some large percentage of the time. If you can find a way to accomplish your goals with less effort, it&amp;rsquo;s always a win. Every project everywhere always needs more time or money, what’s more innovative is how you can help a project to ship without one of those two.&lt;/p&gt;
&lt;p&gt;At a broader perspective than just scope – one of the biggest ways product can help engineering is by pushing harder for killing off features and the scope of a product. There&amp;rsquo;s a good test on if something is ready to ship: if you &lt;a href="http://www.craigkerstiens.com/2014/08/13/when-to-ship-when-to-kill/"&gt;tell beta users you&amp;rsquo;re killing it&lt;/a&gt; and they yell at you that you shouldn’t kill it, then it’s ready to ship.&lt;/p&gt;
&lt;p&gt;If you’ve already shipped things, but they’re not delivering value or not being used, kill them. It’s that simple, it may have been a great idea at the time, but either invest in making sure it’s used or kill it so you don’t have to maintain it.&lt;/p&gt;
&lt;h3 id="roadmap-planning"&gt;
&lt;div&gt;
Roadmap planning
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Usually getting velocity and killing things takes 3-6 months to really take full effect. At this point a team feels like they&amp;rsquo;re not under a pile of technical debt, and they can commit to shipping projects. This is the point when product and engineering are melding and you can really start to have fun about where you&amp;rsquo;re headed. At this point I&amp;rsquo;ve seen a huge mix of where engineers are more actively or less actively engaged in this process. And the reality is this is everyone’s job to be thinking about where you&amp;rsquo;re headed as a company – at least that&amp;rsquo;s the case for any company that classifies itself as a startup.&lt;/p&gt;
&lt;p&gt;My favorite tool for this is a team gridding exercise, you can read more about this &lt;a href="http://www.craigkerstiens.com/2013/03/13/planning-and-prioritizing/"&gt;here&lt;/a&gt; and &lt;a href="http://www.craigkerstiens.com/2013/08/13/rule-of-thirds/"&gt;here&lt;/a&gt;. This is often best conducted at an off-site where you have an opportunity for casual conversation which can foster broader thinking beyond the obvious bug fixes or smaller product improvements.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;One item of note I&amp;rsquo;ve heard from teams that have done this or similar exercises is they still have trouble deciding what to do after the fact. The role of product is to get to that decision. The most important part is getting to a decision and not the perfect one, gather data, decide, revisit as you go along. All of this isn’t to say that it’s an arbitrary decision, customers, data all inform that as well as the effort to impact matrix exercise, but in the end a clear direction isn’t executed on consensus.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="in-conclusion"&gt;
&lt;div&gt;
In conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;There’s really no end or done when it comes to the role and the work.&lt;/p&gt;
&lt;p&gt;There’s always another milestone and the market is always moving around you. But once you’re able to execute predictably and think in an ordered sense about your roadmap, you’re in a position to be able to monitor and adapt to the market, and even more so experiment and shape the market yourself. At that point you have to keep doing it and then the hard part becomes finding ways of keeping a fresh perspective &lt;em&gt;protip: customers are an important part of that equation&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Have tips/tricks/practices that I completely missed here or that you disagree with? I’m always happy to talk with others so drop me a note &lt;a href="mailto:craig.kerstiens@gmail.com"&gt;craig.kerstiens@gmail.com&lt;/a&gt;.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Wed, 18 Feb 2015 22:55:56 GMT</pubDate><guid isPermaLink="true">/2015/02/18/A-product-management-blueprint/</guid></item><item><title>Building a high performance SSD SAN - Part 1</title><link>https://smcleod.net/2015/02/building-a-high-performance-ssd-san-part-1/</link><description>&lt;p&gt;&lt;img src="https://smcleod.net//img/san/graphs.png" /&gt;&lt;/p&gt;
&lt;p&gt;Over the coming month I will be architecting, building and testing a modular, high performance SSD-only storage solution.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll be documenting my progress / findings along the way and open sourcing all the information as a public guide.&lt;/p&gt;
&lt;p&gt;With recent price drops and durability improvements in solid state storage now is better time than any to ditch those old magnets.&lt;/p&gt;
&lt;p&gt;Modular server manufacturers such as SuperMicro have spent large on R&amp;amp;D thanks to the ever growing requirements from cloud vendors that utilise their hardware.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Mon, 16 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/building-a-high-performance-ssd-san-part-1/</guid></item><item><title>Regular Expressions are Fast, Until they Aren't</title><link>https://boyter.org/2015/02/regular-expressions-fast/</link><description>&lt;p&gt;TL/DR: Regular expressions are fast, until they aren&amp;rsquo;t. How I got a 20x performance by switching to string functions.&lt;/p&gt;
&lt;p&gt;With the new version of searchcode.com one of the main things I wanted to address was performance. The previous version had all sorts of performance issues which were not limited to the usual suspects such as the database or search index.&lt;/p&gt;
&lt;p&gt;When developing the new version one of the tasks listed in my queue was to profile search operations for anything slowing things down. Sadly I have since lost the profile output but observed that one of the main speed culprits is the format_results function inside the code model. For most queries I tried while it was the slowest operation it wasn&amp;rsquo;t worth optimising simply because its impact was so low. I did however keep it in the back of my mind that if there were any performance issues it would be the first thing to look at.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sun, 15 Feb 2015 23:36:40 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/02/regular-expressions-fast/</guid></item><item><title>Direct-Attach SSD Storage - Performance &amp;amp; Comparisons</title><link>https://smcleod.net/2015/02/direct-attach-ssd-storage-performance-comparisons/</link><description>&lt;p&gt;Further to my earlier post on XenServer storage performance with regards to directly attaching storage from the host, I have been analysing the performance of various SSD storage options.&lt;/p&gt;
&lt;p&gt;I have attached a HP DS2220sb storage blade to an existing server blade and compared performance with 4 and 6 SSD RAID-10 to our existing iSCSI SANs.&lt;/p&gt;
&lt;p&gt;While the P420i RAID controller in the DS2220sb is clearly saturated and unable to provide throughput much over 1,100MB/s - the IOP/s available to PostgreSQL are still a very considerably performance improvement over our P4530 SAN - in fact, 6 SSD&amp;rsquo;s result in a 39.9x performance increase!&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Sun, 15 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/direct-attach-ssd-storage-performance-comparisons/</guid></item><item><title>Search - A Journey of Delivery on a Budget</title><link>https://smcleod.net/2015/02/search-a-journey-of-delivery-on-a-budget/</link><description>&lt;h3 id="heading"&gt;&lt;a href="https://smcleod.net/files/slides-Search-A-Journey-of-Delivery-on-a-Budget/"&gt;&amp;ldquo;Search - A Journey of Delivery on a Budget&amp;rdquo;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Presented a Melbourne Search - July 2014 - &lt;a href="https://smcleod.net/files/slides-Search-A-Journey-of-Delivery-on-a-Budget/"&gt;&amp;ldquo;Search - A Journey of Delivery on a Budget&amp;rdquo;&lt;/a&gt; &lt;em&gt;(Click for slides)&lt;/em&gt;&lt;/p&gt;
&lt;div style="padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
      
    &lt;/div&gt;</description><author>smcleod.net</author><pubDate>Sun, 15 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/search-a-journey-of-delivery-on-a-budget/</guid></item><item><title>Talk - 24 Months</title><link>https://smcleod.net/2015/02/talk-24-months/</link><description>&lt;p&gt;The way we work at Infoxchange has changed greatly.&lt;/p&gt;
&lt;p&gt;A retrospective journey into transforming Infoxchange&amp;rsquo;s technology and culture over the past 24 months - presented a Melbourne DevOps - December 2014&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/sammcj/smcleod_files/blob/master/slides/24_months/24_Months.pdf?raw=true"&gt;&lt;img alt="Click to Download Slides" src="https://smcleod.net//img/misc/24months.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Sun, 15 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/talk-24-months/</guid></item><item><title>The Best Of - 2014 Edition</title><link>https://smcleod.net/2015/02/the-best-of-2014-edition/</link><description>&lt;p&gt;At the end of every year I note down a summary of the best applications, hardware &amp;amp; websites I&amp;rsquo;ve enjoyed &amp;amp; depended on throughout the year (and often for some time before).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This post has long since been superseded. You can find the latest version of this post &lt;a href="https://smcleod.net/2022-10-19-apps-of-2022/"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="software--general-use"&gt;Software / General Use&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fastmail - &lt;a href="https://www.fastmail.com"&gt;https://www.fastmail.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Evernote - &lt;a href="https://evernote.com"&gt;https://evernote.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Reeder - &lt;a href="http://reederapp.com"&gt;http://reederapp.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Keynote - &lt;a href="https://www.apple.com/au/mac/keynote"&gt;https://www.apple.com/au/mac/keynote&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lastpass - &lt;a href="https://lastpass.com"&gt;https://lastpass.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plex - &lt;a href="https://plex.tv"&gt;https://plex.tv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Calibre - &lt;a href="http://calibre-ebook.com"&gt;http://calibre-ebook.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software--geek-use"&gt;Software / Geek Use&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Sublime Text - &lt;a href="http://www.sublimetext.com/3"&gt;http://www.sublimetext.com/3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Homebrew - &lt;a href="http://brew.sh"&gt;http://brew.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DropSync - &lt;a href="http://mudflatsoftware.com"&gt;http://mudflatsoftware.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Beets - &lt;a href="http://beets.radbox.org"&gt;http://beets.radbox.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Textual - &lt;a href="http://www.codeux.com/textual"&gt;http://www.codeux.com/textual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;XLD - &lt;a href="http://tmkk.undo.jp/xld/index_e.html"&gt;http://tmkk.undo.jp/xld/index_e.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code Academy - &lt;a href="http://www.codecademy.com"&gt;http://www.codecademy.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Exercism.io - &lt;a href="http://exercism.io"&gt;http://exercism.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sickbeard + Headphones + Couchpotato + Sabnzbd - &lt;a href="http://www.totalhtpc.com/ultimate-usenet-guide.html"&gt;http://www.totalhtpc.com/ultimate-usenet-guide.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software--mobile"&gt;Software / Mobile&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tweetbot - &lt;a href="http://tapbots.com/software/tweetbot"&gt;http://tapbots.com/software/tweetbot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pushover - &lt;a href="http://pushover.net"&gt;http://pushover.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lastpass - &lt;a href="https://lastpass.com"&gt;https://lastpass.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Keynote - &lt;a href="https://www.apple.com/au/ios/keynote"&gt;https://www.apple.com/au/ios/keynote&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Reeder - &lt;a href="http://reederapp.com/ios"&gt;http://reederapp.com/ios&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Evernote- &lt;a href="https://evernote.com"&gt;https://evernote.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plex - &lt;a href="https://plex.tv"&gt;https://plex.tv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Backblaze - &lt;a href="https://www.backblaze.com"&gt;https://www.backblaze.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;WTF Podcast - &lt;a href="http://www.wtfpod.com/app"&gt;http://www.wtfpod.com/app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MiniHack - &lt;a href="https://itunes.apple.com/au/app/minihack-for-hacker-news/id631108846?mt=8"&gt;https://itunes.apple.com/au/app/minihack-for-hacker-news/id631108846?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Uber - &lt;a href="https://itunes.apple.com/au/app/uber/id368677368?mt=8"&gt;https://itunes.apple.com/au/app/uber/id368677368?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Goodreads - &lt;a href="https://itunes.apple.com/au/app/goodreads-book-recommendations/id355833469?mt=8"&gt;https://itunes.apple.com/au/app/goodreads-book-recommendations/id355833469?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Notify4M - &lt;a href="https://itunes.apple.com/au/app/notify4m/id499161979?mt=8"&gt;https://itunes.apple.com/au/app/notify4m/id499161979?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bandcamp - &lt;a href="https://itunes.apple.com/au/app/bandcamp/id706408639?mt=8"&gt;https://itunes.apple.com/au/app/bandcamp/id706408639?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hype Machine - &lt;a href="https://itunes.apple.com/au/app/hype-machine/id414315986?mt=8"&gt;https://itunes.apple.com/au/app/hype-machine/id414315986?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nuzzel (Only got onto this today) - &lt;a href="https://itunes.apple.com/au/app/nuzzel-news-from-your-friends/id692285770?mt=8"&gt;https://itunes.apple.com/au/app/nuzzel-news-from-your-friends/id692285770?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Alien Blue - &lt;a href="http://www.reddit.com/r/alienblue"&gt;http://www.reddit.com/r/alienblue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software--sysadmin-or-devops-specific"&gt;Software / SysAdmin or DevOps Specific&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gitlab - &lt;a href="http://gitlab.org"&gt;http://gitlab.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gitlab-CI - &lt;a href="https://about.gitlab.com/gitlab-ci"&gt;https://about.gitlab.com/gitlab-ci&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dash - &lt;a href="http://kapeli.com/dash"&gt;http://kapeli.com/dash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PostgreSQL (Makes my list every year &amp;amp; just keeps getting better) - &lt;a href="http://www.postgresql.org"&gt;http://www.postgresql.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PGBadger - &lt;a href="http://dalibo.github.io/pgbadger"&gt;http://dalibo.github.io/pgbadger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Docker - &lt;a href="https://www.docker.com"&gt;https://www.docker.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Consul - &lt;a href="https://consul.io"&gt;https://consul.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Puppet (I couldn&amp;rsquo;t do my job as well without it) - &lt;a href="http://puppetlabs.com"&gt;http://puppetlabs.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;iTerm - &lt;a href="http://iterm2.com"&gt;http://iterm2.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nginx - &lt;a href="http://nginx.org"&gt;http://nginx.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Htop - &lt;a href="http://hisham.hm/htop"&gt;http://hisham.hm/htop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bonnie++ - &lt;a href="http://linux.die.net/man/8/bonnie"&gt;http://linux.die.net/man/8/bonnie&lt;/a&gt;++&lt;/li&gt;
&lt;li&gt;Openfire - &lt;a href="https://www.igniterealtime.org/projects/openfire"&gt;https://www.igniterealtime.org/projects/openfire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hiera-Eyaml - &lt;a href="https://github.com/TomPoulton/hiera-eyaml"&gt;https://github.com/TomPoulton/hiera-eyaml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rubinius - &lt;a href="http://rubini.us"&gt;http://rubini.us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Puma - &lt;a href="http://puma.io"&gt;http://puma.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;XenServer - &lt;a href="http://xenserver.org"&gt;http://xenserver.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ElasticSearch - &lt;a href="https://www.elasticsearch.org"&gt;www.elasticsearch.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Logstash - &lt;a href="http://logstash.net"&gt;http://logstash.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FPM - &lt;a href="https://github.com/jordansissel/fpm"&gt;https://github.com/jordansissel/fpm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PFsense - &lt;a href="https://www.pfsense.org"&gt;https://www.pfsense.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Debian Jessie (Not quite released but the next great version of the best linux Distro IMO) - &lt;a href="https://www.debian.org/releases/jessie"&gt;https://www.debian.org/releases/jessie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Check_MK Multisite - &lt;a href="https://mathias-kettner.de/checkmk_multisite.html"&gt;https://mathias-kettner.de/checkmk_multisite.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PWSafe - &lt;a href="https://itunes.apple.com/au/app/pwsafe-password-safe-compatible/id520993579?mt=12"&gt;https://itunes.apple.com/au/app/pwsafe-password-safe-compatible/id520993579?mt=12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Supervisord - &lt;a href="http://supervisord.org"&gt;http://supervisord.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="websites"&gt;Websites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Last.fm - &lt;a href="http://www.last.fm/user/sammcj2000"&gt;http://www.last.fm/user/sammcj2000&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Feedly - &lt;a href="https://feedly.com"&gt;https://feedly.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;HackerNews - &lt;a href="https://news.ycombinator.com/news"&gt;https://news.ycombinator.com/news&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lucidchart - &lt;a href="http://lucidchart.com/"&gt;http://lucidchart.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MondoTunes (Might be a little biased here!) - &lt;a href="http://mondotunes.org"&gt;http://mondotunes.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="hardware"&gt;Hardware&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Das Ultimate 4- &lt;a href="http://www.daskeyboard.com"&gt;http://www.daskeyboard.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Logitech Performance MX - &lt;a href="http://www.logitech.com/en-au/product/performance-mouse-mx"&gt;http://www.logitech.com/en-au/product/performance-mouse-mx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;15&amp;rsquo;&amp;rsquo; Macbook Pro Retina - &lt;a href="http://www.apple.com/au/macbook-pro"&gt;http://www.apple.com/au/macbook-pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;iPhone 6+ (because its bigger than bigger, or something) - &lt;a href="https://www.apple.com/iphone-6"&gt;https://www.apple.com/iphone-6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CuBox - &lt;a href="http://www.solid-run.com/product/cubox-i4pro"&gt;http://www.solid-run.com/product/cubox-i4pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Parani SD1000 Bluetooth Serial Adapter - &lt;a href="http://www.senaindustrial.com/products/industrial_bluetooth/sd1000.php"&gt;http://www.senaindustrial.com/products/industrial_bluetooth/sd1000.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SanDisk Extreme Pro 480GB SSD - &lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16820171999"&gt;http://www.newegg.com/Product/Product.aspx?Item=N82E16820171999&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="other--non-tech"&gt;Other / Non-tech&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;All Day Socks - &lt;a href="http://alldaysocks.com"&gt;http://alldaysocks.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sennheiser Amperior On-Ear Headphones - &lt;a href="http://www.head-fi.org/products/sennheiser-amperior-on-ear-headphones"&gt;http://www.head-fi.org/products/sennheiser-amperior-on-ear-headphones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;O2 + ODAC - &lt;a href="http://www.jdslabs.com/products/48/o2-odac-combo"&gt;http://www.jdslabs.com/products/48/o2-odac-combo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Benchmark DAC1 HDR - &lt;a href="http://benchmarkmedia.com/products/benchmark-dac1-hdr-digital-to-analog-converter"&gt;http://benchmarkmedia.com/products/benchmark-dac1-hdr-digital-to-analog-converter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bellroy Wallets - &lt;a href="http://bellroy.com"&gt;http://bellroy.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ink Shoes - &lt;a href="http://www.inkshoes.it"&gt;http://www.inkshoes.it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kindle Paperwhite - &lt;a href="http://www.amazon.com.au/gp/feature.html?docId=3077740006"&gt;http://www.amazon.com.au/gp/feature.html?docId=3077740006&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nerf Jolt - &lt;a href="http://nerf.wikia.com/wiki/Jolt_EX-1"&gt;http://nerf.wikia.com/wiki/Jolt_EX-1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="books"&gt;Books&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The Phoenix Project (Reread this year for the 3rd time) - &lt;a href="http://itrevolution.com/books/phoenix-project-DevOps-book"&gt;http://itrevolution.com/books/phoenix-project-DevOps-book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Surely You&amp;rsquo;re Joking Mr Feynman! - &lt;a href="https://www.goodreads.com/book/show/5544.Surely_You_re_Joking_Mr_Feynman_"&gt;https://www.goodreads.com/book/show/5544.Surely_You_re_Joking_Mr_Feynman_&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Dark Tower Series - &lt;a href="https://www.goodreads.com/book/show/43615.The_Gunslinger"&gt;https://www.goodreads.com/book/show/43615.The_Gunslinger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Snow Crash - &lt;a href="https://www.goodreads.com/book/show/830.Snow_Crash"&gt;https://www.goodreads.com/book/show/830.Snow_Crash&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>smcleod.net</author><pubDate>Sun, 15 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/the-best-of-2014-edition/</guid></item><item><title>XenServer, SSDs &amp;amp; VM Storage Performance</title><link>https://smcleod.net/2015/02/xenserver-ssds-vm-storage-performance/</link><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;At Infoxchange we use XenServer as our Virtualisation of choice.
There are many reasons for this including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open Source.&lt;/li&gt;
&lt;li&gt;Offers greater performance than VMware.&lt;/li&gt;
&lt;li&gt;Affordability (it&amp;rsquo;s free unless you purchase support).&lt;/li&gt;
&lt;li&gt;Proven backend Xen is very reliable.&lt;/li&gt;
&lt;li&gt;Reliable cross-host migrations of VMs.&lt;/li&gt;
&lt;li&gt;The XenCentre client, (although having to run in a Windows VM) is quick and simple to use.&lt;/li&gt;
&lt;li&gt;Upgrades and patches have proven to be more reliable than VMware.&lt;/li&gt;
&lt;li&gt;OpenStack while interesting, is not yet reliable or streamlined enough for our small team of 4 to implement and manage.&lt;/li&gt;
&lt;li&gt;XenServer Storage &amp;amp; Filesystems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately the downside to XenServer is that it&amp;rsquo;s underlying OS is quite old.
The latest version (6.5) about to be released is still based on Centos 5 and still lacks any form of EXT4 and BTRFS support, direct disk access is not available… without some tweaking and has no real support for TRIM unless you have direct disk access and are happy with EXT3.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Sun, 15 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/xenserver-ssds-vm-storage-performance/</guid></item><item><title>Get internal and external IP address on Mac with Bash</title><link>https://www.seanw.org/blog/mac-internal-external-ip-from-terminal-with-bash/</link><description>Frequently while coding I need to know the internal and external IP address of my development machine. For example, when your machine is serving a website from a locally running web server, the internal IP address can be used to test the site from a smartphone browser connected to the same network. Likewise, the external IP address is useful when you want to make a local web server publicly accessible or when you need to whitelist your IP address in the firewall settings of an external server.</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Fri, 13 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/mac-internal-external-ip-from-terminal-with-bash/</guid></item><item><title>How I found a bug in HackerEarth</title><link>https://captnemo.in/blog/2015/02/12/hackerearth-bug/</link><description>&lt;p&gt;&lt;em&gt;&lt;a href="https://www.hackerearth.com/notes/how-i-found-a-bug-in-hackerearth/" title="Permalink to How I found a bug in HackerEarth"&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I am not a competitive programmer. I love programming, but more so I love building things. As a result, I rarely participate in coding contests. Even when I do, I try to use languages like Ruby and Python just to see if I can do it &lt;em&gt;my way&lt;/em&gt;, so to speak.&lt;/p&gt;

&lt;p&gt;While trying a contest in Ruby, I realized that I could not use the ruby &lt;code class="language-plaintext highlighter-rouge"&gt;prime&lt;/code&gt; library. This is a standard library in Ruby for a long while, and HackerEarth platform runs on 2.1.1, which is quite new.&lt;/p&gt;

&lt;p&gt;I reported this as a bug to HackerEarth in September ‘14. A quick reply from HE made me realize that they weren’t understanding the issue:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Modules like mathn or erb are part of standard library. They are available.&lt;/p&gt;

  &lt;p&gt;Try using, require ‘erb’require ‘mathn’ in code editor.&lt;br /&gt;
However 3rd party libraries are not available.﻿&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I decided to do some tests and check &lt;em&gt;all standard libraries&lt;/em&gt; for their availability. For those unfamiliar with Ruby, this is how you load a standard library in ruby:&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;require 'prime'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Using the HackerEarth API, I was able to write some quick code that tested all expected libraries:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;while read lib; do
  SOURCE="require%20'$lib'"
  echo "Testing $lib"
  curl -s -d "client_secret=API_SECRET&amp;amp;lang=RUBY&amp;amp;async=0&amp;amp;source=$SOURCE" http://api.hackerearth.com/code/run/ &amp;gt; $lib.json
done &amp;lt; libs.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here &lt;code class="language-plaintext highlighter-rouge"&gt;libs.txt&lt;/code&gt; contains a list of all standard libraries. The above code is in bash, and makes use of curl. Parsing the results, I replied with the following:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Requiring the following libraries raises a missing error:&lt;/p&gt;

  &lt;p&gt;coverage - RE&lt;br /&gt;
extmk - RE&lt;br /&gt;
fiddle - RE&lt;br /&gt;
io/console - RE&lt;br /&gt;
json - RE&lt;br /&gt;
minitest - RE&lt;br /&gt;
minitest/benchmark - RE&lt;br /&gt;
minitest/spec - RE&lt;br /&gt;
mkmf - RE&lt;br /&gt;
objspace - RE&lt;br /&gt;
prime - RE&lt;br /&gt;
psych - RE&lt;br /&gt;
racc - RE&lt;br /&gt;
rake - RE&lt;br /&gt;
rdoc - RE&lt;br /&gt;
rexml - RE&lt;br /&gt;
rinda - RE&lt;br /&gt;
ripper - RE&lt;br /&gt;
rubygems - RE&lt;br /&gt;
tk - RE&lt;br /&gt;
win32ole - RE&lt;br /&gt;
xmlrpc - RE&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;HackerEarth admitted the issue (I posted code to replicate on &lt;a href="https://github.com/captn3m0/ruby-stdlib-test-hackerearth" title="HackerEarth Ruby stdlib Tests"&gt;github&lt;/a&gt;), and have since worked on it. I just ran the tests again, and only the following libraries are unavailable now:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;curses - RE&lt;br /&gt;
dbm - RE&lt;br /&gt;
debug - RE&lt;br /&gt;
extmk - RE&lt;br /&gt;
gdbm - RE&lt;br /&gt;
generator - RE&lt;br /&gt;
iconv - RE&lt;br /&gt;
racc - RE&lt;br /&gt;
readline - RE&lt;br /&gt;
rexml - RE&lt;br /&gt;
rinda - RE&lt;br /&gt;
tk - RE&lt;br /&gt;
win32ole - RE&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few of these are understandable (&lt;code class="language-plaintext highlighter-rouge"&gt;win32&lt;/code&gt; since HE platform runs on Linux, and &lt;code class="language-plaintext highlighter-rouge"&gt;tk&lt;/code&gt;, which is a graphical library). A few of these are unavailable in Ruby 2.1.1 (I copied the list of libs from the 2.1.3 docs).&lt;/p&gt;

&lt;p&gt;Kudos to HackerEarth for fixing a bug that very few of their users would have faced. All the source code for this post can be found at &lt;a href="https://github.com/captn3m0/ruby-stdlib-test-hackerearth" title="HackerEarth Ruby stdlib Tests"&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: This article was copied from HackerEarth because they are shutting down their notes platform.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Thu, 12 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/02/12/hackerearth-bug/</guid></item><item><title>I am offended</title><link>https://captnemo.in/blog/2015/02/06/i-am-offended/</link><description>&lt;p&gt;To start with, here’s a piece of art that &lt;em&gt;is meant to offend you&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="/img/bharatmata.jpg"&gt;&lt;img alt="Bharat Mata, by MF Hussain" src="/img/bharatmata_thumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above is an artwork by MF Hussain. Its was sold as an untitled work by Hussain to a private collector, but was named &lt;em&gt;Bharat Mata&lt;/em&gt; later when it was sold in an auction.&lt;/p&gt;

&lt;p&gt;Were you offended by looking at it? Maybe.
Does it look vulgar and offensive to you? Perhaps.
What should you do as a result?&lt;/p&gt;

&lt;p&gt;CLOSE THE TAB!&lt;/p&gt;

&lt;p&gt;Seriously, India. The right thing to do when you are offended is not to &lt;a href="http://indianexpress.com/article/india/politics/muslim-techie-beaten-to-death-in-pune-7-men-of-hindu-outfit-held/"&gt;&lt;em&gt;lynch a person to death&lt;/em&gt;&lt;/a&gt;, or to &lt;a href="http://timesofindia.indiatimes.com/india/Fatwa-issued-against-Vande-Mataram/articleshow/5191847.cms"&gt;issue a fatwa against singing the national song&lt;/a&gt;. The right thing to do is this:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Flip the table" src="https://boardgametime.files.wordpress.com/2012/04/table_flip.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;The right to get offended in India is a result of the way our constitution curbs the freedom of speech. However, these restrictions were not in the constitution that was passed when India was made a republic (26 Jan 1950). It was added as the First Amendment (ironic, I know), which passed in June 1951.&lt;/p&gt;

&lt;p&gt;In the 18 months that passed between these two events, Indians had the right to absolute freedom of speech. I won’t go into the details of why both Nehru and Patel thought of bringing these restrictions (for the better of India), but needless to say, the reasons are no longer valid.&lt;/p&gt;

&lt;p&gt;However, I found a curious piece of irony while researching this:&lt;/p&gt;

&lt;p&gt;One of the prime opponents to the First Amendment restrictions was &lt;a href="http://www.wikiwand.com/en/Syama_Prasad_Mukherjee"&gt;Syama Prasad Mookerjee&lt;/a&gt;, a long time RSS activist, founder of the Bharatiya Jana Sangh and widely regarded as the &lt;a href="http://www.shyamaprasad.org/home.html"&gt;godfather of Hindu Nationalism&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And now today, 64 years later, these restrictions are getting enacted into even more draconian laws. One such law is Section 66A of the Information Technology Act.&lt;/p&gt;

&lt;p&gt;Kapil Sibal, former union minister &lt;a href="http://indiatoday.intoday.in/story/freedom-internet-online-charlie-hebdo-kapil-sibal/1/416011.html"&gt;writes about it&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Allowing the government to regulate the internet is a recipe for disaster. Government being what it is, it would use such power to further its own ends.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, he gives in to the diplomatic reasoning and writes further:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I know where I stand. I am for freedom of expression, but there are no absolutes in life. Limitless freedom contains within it the seeds of conflict. We must eschew conflict and embrace freedom, for peace and harmony.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Note that back in 2012, Kapil Sibbal had spoken &lt;a href="http://tech.firstpost.com/news-analysis/dear-sibal-here-is-why-section-66a-does-not-protect-women-212326.html"&gt;in favor of Section 66A&lt;/a&gt;, citing it as a tool to protect women online. He seems to have reversed his stance since.&lt;/p&gt;

&lt;p&gt;This is what Tushar Mehta, Additional Solicitor General has to say on the necessity of the act:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[…] every institution and every person right from the President can be subjected to criticism and it is people’s fundamental right to free speech and expression but such rights do not cover grossly offensive comments and posts on social networking sites.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AIB recently tested their rights by making a grossly offensive video and posting it on social networking sites. A lot of people were offended. The video was taken down as a result.&lt;/p&gt;

&lt;p&gt;Did the people who were offended see the video? Yes, probably on YouTube. But the recordings are still floating around, and are available on torrents very easily.&lt;/p&gt;

&lt;p&gt;You see, the internet is a resilient beast. You can’t control it, or bend it to your will. It does not run by your rules, and your sense of sensibility. It has no concept of right or wrong. It just is.&lt;/p&gt;

&lt;p&gt;A nation where I am afraid to post critical views of the government or discuss events that might offend someone is not a nation worth living in.&lt;/p&gt;

&lt;p&gt;The internet cannot be regulated. You might certainly think of it as possible, but &lt;a href="https://www.eff.org/" title="Electronic Frontier Foundation"&gt;we&lt;/a&gt; &lt;a href="https://wikileaks.org/" title="Wikileaks"&gt;will&lt;/a&gt; &lt;a href="https://www.torproject.org/" title="The Tor Project"&gt;always&lt;/a&gt; &lt;a href="https://thepiratebay.org/" title="The Pirate Bay"&gt;find&lt;/a&gt; a way.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you are offended it is your problem, and frankly lots of things offend lots of people. - &lt;a href="http://www.goodreads.com/quotes/739464-nobody-has-the-right-to-not-be-offended-that-right"&gt;Salman Rushdie&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don’t think I will ever see the first amendment repealed in my lifetime. However, I’m gonna try my very best to get the Supreme Court to re-evaluate Section 66A as unconstitional and over-reaching.&lt;/p&gt;

&lt;p&gt;If you want to let the government know of your thoughts on the matter, the Assistant Solicitor General (representing the Government in the case) can be reached at &lt;a href="mailto:tusharmehta64@yahoo.com"&gt;tusharmehta64@yahoo.com&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;p&gt;This is a loose list of various references and readings on the topic.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://vimeo.com/92778395"&gt;A Story of Censorship: How the Right to Take Offense is Shrinking Free Speech in India&lt;/a&gt; - A video seminar on the topic by Anuradha Raman, Outlook Magazine&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/First_Amendment_of_the_Constitution_of_India"&gt;First Amendment&lt;/a&gt; of the Constitution of India&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://scroll.in/article/700020/Why-Nehru-and-Sardar-Patel-curbed-freedom-of-expression-in-India"&gt;Why Nehru and Sardar Patel curbed freedom of expression in India&lt;/a&gt; - A nice summary of the events that lead to the passing of the First Amendment&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://timesofindia.indiatimes.com/india/Bharat-Mata-a-work-of-art-SC/articleshow/3459623.cms"&gt;Bharat Mata a work of art&lt;/a&gt; - A ruling by the Supreme Court declaring the topmost image in this post as a work of art, and that &lt;em&gt;no one gets scandalized looking at art&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.wikiwand.com/en/Freedom_of_expression_in_India"&gt;Restrictions on freedom of speech in India&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.livemint.com/Opinion/hZBwopyF7MD10C8QHODZEN/Of-writers-and-poets-who-criticize-with-their-pens.html"&gt;An excellent piece on abolishing the restrictions on free speech&lt;/a&gt; titled &lt;em&gt;Of writers and poets who criticize with their pens&lt;/em&gt; (Rajeev Mantri)&lt;/li&gt;
  &lt;li&gt;A few pieces on the ongoing panel: &lt;a href="http://indiatoday.intoday.in/story/objectionable-social-media-posts-cyberspace-modi-government-supreme-court-facebook-twitter-freedom-of-expression/1/416800.html"&gt;India Today&lt;/a&gt;, &lt;a href="http://indianexpress.com/article/india/india-others/sc-on-it-act-will-examine-section-66a-as-it-stands/"&gt;Indian Express&lt;/a&gt;, &lt;a href="http://www.firstpost.com/living/who-defines-grossly-offensive-sc-raises-red-flags-over-draconian-sec-66a-of-it-act-2079081.html"&gt;Firstpost’s Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;Thanks to &lt;a href="https://shashankmehta.in/"&gt;Shashank Mehta&lt;/a&gt; and &lt;a href="https://rkravi.com/"&gt;Ravi Kishore&lt;/a&gt; for reviewing drafts of this.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Fri, 06 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/02/06/i-am-offended/</guid></item><item><title>Internet Outrage Fatigue Syndrome (IOFS)</title><link>https://tiltingatwindmills.dev/internet-odrome-iofs/</link><description>The 1980s were a scary time to be a kid. At least that is if you watched the
evening news. Every night at 6 and 11 you'd be apprised of a…</description><author>Tilting at Windmills</author><pubDate>Wed, 04 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/internet-odrome-iofs/</guid></item><item><title>Rebound Project</title><link>https://boyter.org/2015/01/rebound-project/</link><description>&lt;p&gt;As I mentioned in the previous entry I had started work on a new project I called portfold. Built and released without fanfare I have quietly killed it before even the month is out. Why? I realise now that it was a rebound project similar to a rebound relationship. I had been getting a little down on searchcode.com and wanted to branch out to some new technology. Once done though the itch was scratched and now I am back to working on searchcode again.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sat, 31 Jan 2015 00:49:55 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/01/rebound-project/</guid></item><item><title>Download a Git subdirectory from GitHub</title><link>https://www.seanw.org/blog/download-git-repo-subdirectory/</link><description>Have you ever needed to download only a subdirectory from a GitHub project without downloading the entire repository? Surprisingly, there doesn&amp;rsquo;t seem to be a way of doing this easily using Git. A somewhat unexpected solution is to use SVN.
First get the URL of the subfolder. GitHub URLs have the form:
https://github.com/author/repo-name/tree/master/subdirectory Then replace /tree/master/ with /trunk/ to get:
https://github.com/author/repo/trunk/subdirectory You can now download the subdirectory you&amp;rsquo;re interested in using SVN&amp;rsquo;s export command:</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Fri, 30 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/download-git-repo-subdirectory/</guid></item><item><title>Are you a fighter pilot?</title><link>https://captnemo.in/blog/2015/01/28/are-you-a-fighter-pilot/</link><description>&lt;p&gt;As part of a pre job interview for a position as a security consultant, I was asked this question. The interviewer expanded the question further as :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Given the choice between a luxurious journey in a passenger jetliner (flying business class) and a thrilling trip as a fighter pilot, which one would you choose?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My immediate reply was (without a single doubt): “I’ll take the fighter jet, thanks.”&lt;/p&gt;

&lt;p&gt;Then the interviewer tried to dissuade me from my choice: “Its not as glamorous as it sounds. Its a terrible job flying a jet plane. There are lots of complications, you are literally defying death, and even the pay isn’t that good.”. He then spent quite some time explaining the luxuries and comforts that we take for granted in a passenger jet, and those that aren’t available in a fighter jet. “You can’t even piss properly”, he told me. “And there’s free booze on the Boeing.”&lt;/p&gt;

&lt;p&gt;Me (after some deliberation and moment of self-doubt): I’d ultimately like to have my own private jet, but I’m willing to strap myself to a 300 million dollar plane just trying to get there. I’d take that over a passenger jet any day.&lt;/p&gt;

&lt;p&gt;For those who didn’t get the analogy: He was trying to convince me to join a high risk job, where I’d be working late nights doing what I love. But it also means giving up tons of luxuries and comforts that I could get at other companies.&lt;/p&gt;

&lt;p&gt;I’m sure that I’m the fighter jet kind of person, I’m just having difficulty deciding what jet I wanna fly. If you have an opening for a Full Stack Developer/Security Consultant, shoot me a mail.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Wed, 28 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/01/28/are-you-a-fighter-pilot/</guid></item><item><title>Fix: WPML for WordPress causes theme to show multiple languages at the same time</title><link>https://www.seanw.org/blog/themes-and-widgets-showing-multiple-languages-wpml/</link><description>The WordPress Multilingual (WPML) plugin offers a comprehensive solution for transitioning from a single language WordPress website to one that supports multiple languages. Once installed, you can add several translations of individual posts and custom posts from within the WordPress admin interface. When viewing a page for a specific language on your site, page content is then generated by pulling in posts for the current language.
Problem: Theme and widgets showing multiple languages Many themes and plugins will work out of the box with WPML but a common problem is themes and plugins will display content for all languages instead of only the current one.</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Tue, 27 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/themes-and-widgets-showing-multiple-languages-wpml/</guid></item><item><title>Bépo-android</title><link>https://anisse.astier.eu/bepo-android.html</link><description>&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=fr.bepo.clavierexterne"&gt;This&lt;/a&gt; is a small project I recently &lt;a href="https://github.com/anisse/bepo-android/"&gt;released on github&lt;/a&gt; and &lt;a href="https://play.google.com/store/apps/details?id=fr.bepo.clavierexterne"&gt;Google Play&lt;/a&gt;. It aims at catering to the needs of people using the bépo layout, and wanting to use it for &lt;a href="http://bepo.fr/wiki/BepoAndroid"&gt;physical keyboards on Android&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bepo.fr"&gt;Bépo&lt;/a&gt; is a french dvorak-like keyboard layout; it was designed by a community of …&lt;/p&gt;</description><author>Linux Engineer's random thoughts</author><pubDate>Tue, 27 Jan 2015 01:00:00 GMT</pubDate><guid isPermaLink="true">https://anisse.astier.eu/bepo-android.html</guid></item><item><title>Hiding visits to your own site in Google Analytics</title><link>https://www.seanw.org/blog/hide-own-traffic-in-google-analytics/</link><description>When working on a site, it&amp;rsquo;s common to browse it yourself from multiple browsers, multiple devices and multiple locations for testing purposes. For analytics about your user behaviour to be useful, we need a way to exclude this internal traffic from Google Analytics reports. In this post I explain a method I found useful for hiding visits to your own site when you want to be able to test your site from any browser or any location.</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Thu, 22 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/hide-own-traffic-in-google-analytics/</guid></item><item><title>submit-sitemap: Node.js module to submit sitemaps to search engines</title><link>https://www.seanw.org/blog/submit-sitemap-with-node-js/</link><description>I&amp;rsquo;ve just uploaded a small Node.js module for submitting/pinging sitemaps to search engines called submit-sitemap. This is meant to be used after you&amp;rsquo;ve made updates to your site to encourage crawlers to reindex your pages.
The module currently submits your sitemap to Google and Bing. This saves you from having to use Google&amp;rsquo;s webmaster tools and Bing&amp;rsquo;s webmaster tools to submit your sitemap manually.
For example, I&amp;rsquo;ve used this in the last stage of Gulp build scripts that generate and deploy static sites in the following way:</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Wed, 21 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/submit-sitemap-with-node-js/</guid></item><item><title>Never Buy Retail</title><link>https://tiltingatwindmills.dev/never-buy-retail/</link><description>In light of a particularly aggressive savings plan this year, I've been thinking
hard about every purchase I make. In doing so I think I've…</description><author>Tilting at Windmills</author><pubDate>Sun, 18 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/never-buy-retail/</guid></item><item><title>Yu were mislead</title><link>https://captnemo.in/blog/2015/01/13/yu-yureka/</link><description>&lt;p&gt;I was eagerly awaiting the release of Yu Yureka, which has been widely hailed as a great budget phone by most reviews. I won’t go into the details of the phone, but rather the flash sale that took place on 13th Jan ‘15 (on amazon.in). Far from being a well-managed affair, the website was plagued with issues, and went down for everyone a couple of minutes before the sale.&lt;/p&gt;

&lt;p&gt;Still, a few lucky people were able to buy the phone (sadly, I wasn’t one of them). Micromax said that they had to close registrations for the sale early and had around 3 lakh people lined up for the sale.&lt;/p&gt;

&lt;p&gt;This is how the &lt;a href="https://web.archive.org/web/20150122020319/http://yuplaygod.com/"&gt;yuplaygod.com&lt;/a&gt; homepage looks right now:&lt;/p&gt;

&lt;p&gt;&lt;img alt="YuPlayGod.com Home Page" src="/img/yuplaygod.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;Clearly, they had 10k units for sale, and one in every 300 people should have bought it, right? Wrong!&lt;/p&gt;

&lt;p&gt;It seems Yu (the brand new subsidiary of Micromax) is not above lying. There were &lt;em&gt;only 3000 devices on sale today, out of which only 2657 were claimed&lt;/em&gt;, after which the sale was shut down.&lt;/p&gt;

&lt;p&gt;How do I know this? The way deals work on amazon is once you are on a deal page, the client keeps checking the deal status every few seconds so as to let you know as soon as its status changes. This deal status response does not only include the deal status code (say EXPIRED/SOLDOUT/AVAILABLE), but also includes the deal’s nitty details.&lt;/p&gt;

&lt;p&gt;These details include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;totalCouponCount: &lt;strong&gt;3000&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;claimedCouponCount: &lt;strong&gt;2657&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;percentClaimed: &lt;strong&gt;88&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;type: &lt;code class="language-plaintext highlighter-rouge"&gt;LIGHTNING_DEAL&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;title: Yureka&lt;/li&gt;
  &lt;li&gt;dealPrice: 8999&lt;/li&gt;
  &lt;li&gt;currentPrice: 12999&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m not sure why Yu would try such a tactic (hype the device at low cost, overstate sales figures and then switch to a higher price), but it sure does not sound nice if you are one of the 3 lakh people who lined up to buy the device.&lt;/p&gt;

&lt;h2 id="references"&gt;References&lt;/h2&gt;

&lt;p&gt;Since its my word against amazon, here’s a simple way to confirm the deal details for yourself:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Visit &lt;a href="http://hurl.it/"&gt;http://hurl.it/&lt;/a&gt; (I don’t own this site)&lt;/li&gt;
  &lt;li&gt;Change the request method to “POST” from “GET”&lt;/li&gt;
  &lt;li&gt;Enter &lt;code class="language-plaintext highlighter-rouge"&gt;http://www.amazon.in/xa/dealcontent/v2/GetDealStatus&lt;/code&gt; where it says &lt;code class="language-plaintext highlighter-rouge"&gt;yourapihere.com&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Click on “+ Add Body Button”&lt;/li&gt;
  &lt;li&gt;Paste &lt;code class="language-plaintext highlighter-rouge"&gt;{"requestMetadata":{"marketplaceID":"A21TJRUUN4KGV","clientID":"goldbox"},"dealTargets":[{"dealID":"ea9fef51","itemIDs":null}]}&lt;/code&gt; into the box that appears&lt;/li&gt;
  &lt;li&gt;Click on “Launch Request”&lt;/li&gt;
  &lt;li&gt;Scroll to the bottom to see the dealStatus&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As an alternative, &lt;a href="https://gist.github.com/captn3m0/52fca6662e453c60a6b9"&gt;here is a permalink&lt;/a&gt; to the request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: If you try to replicate the above steps, you will notice that the deal response is now blank. My guess is that the deal was deleted from the servers. However, the permalinks above should still work. I’m still waiting for any official word from either Yu/Amazon.&lt;/p&gt;

&lt;p&gt;Here’s a better (edited) photo that Yu might wanna use:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Yu don't play God" src="/img/yuplaygod_edited.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="http://shashankmehta.in/"&gt;Shashank Mehta&lt;/a&gt; for the title suggestion.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Tue, 13 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/01/13/yu-yureka/</guid></item><item><title>The Content Singularity</title><link>https://tiltingatwindmills.dev/the-conteningularity/</link><description>Think back to the time before the Internet, if you're old enough. How did you
get entertainment? Typically, you had to drive to a store pay…</description><author>Tilting at Windmills</author><pubDate>Thu, 08 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/the-conteningularity/</guid></item><item><title>Similar CSS Color Finder</title><link>https://donatstudios.com/CSS-Alike-Color-Finder</link><description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: CIEDE2000 support added to the existing CIE94 support.&lt;/p&gt;
&lt;p&gt;It would seem that &lt;strong&gt;&lt;em&gt;very similar&lt;/em&gt;&lt;/strong&gt; but &lt;em&gt;non&lt;/em&gt;-identical colors seem to pop up often in CSS files of any reasonable age, and I became &lt;strong&gt;sick&lt;/strong&gt; of them. This started as a little script to help me find them in a stylesheet, and grew into this full-fledged tool.&lt;/p&gt;
&lt;p&gt;This tool will scan CSS and CSS-like files like Sass, Less, etc and find colors similar to each other within a set tolerance. &lt;/p&gt;
&lt;p&gt;This handles &lt;code&gt;#hex&lt;/code&gt;, &lt;code&gt;rgb&lt;/code&gt;, &lt;code&gt;rgba&lt;/code&gt;, &lt;code&gt;hsl&lt;/code&gt;, and &lt;code&gt;hsla&lt;/code&gt; colors.&lt;/p&gt;
&lt;p&gt;There is a command line version of this with Continuous Integration support available on &lt;a href="https://github.com/donatj/AlikeColorFinder/"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description><author>Donat Studios</author><pubDate>Tue, 06 Jan 2015 11:41:33 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/CSS-Alike-Color-Finder</guid></item><item><title>Luminosity Masks in Darktable</title><link>https://blog.nawaz.org/posts/2015/Jan/luminosity-masks-in-darktable/</link><description>&lt;p&gt;When I first got into photoediting, I started off with the free software
&lt;a class="reference external" href="http://www.gimp.org/"&gt;&lt;span class="caps"&gt;GIMP&lt;/span&gt;&lt;/a&gt;. I was a student and couldn&amp;#8217;t afford Adobe Photoshop. While &lt;span class="caps"&gt;GIMP&lt;/span&gt;
had/has shortcomings, and as much as people like to denigrate it, it was
(and likely still is), the best general purpose photoediting tool …&lt;/p&gt;</description><author>Beetle Space</author><pubDate>Tue, 06 Jan 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.nawaz.org/posts/2015/Jan/luminosity-masks-in-darktable/</guid></item><item><title>Thank You Pat</title><link>https://captnemo.in/blog/2015/01/03/thank-you-pat/</link><description>&lt;p&gt;I’m a lazy reader. I’ll often start books and leave them halfway, often juggling 3-4 books at the same time. I read in sprints, often spending a few days just finishing lots of books followed by reading nothing for the next few weeks, perhaps. But that doesn’t mean I don’t appreciate good books. This is the story of how I found my favorite writer, and how I discovered the wonderful books that I enjoy so deeply.&lt;/p&gt;

&lt;p&gt;I don’t write a journal regularly, but if I did, one of my favorite things to do with it is to figure out the little things that matter; to separate out the strands and understand the connections and the motivations behind where I am today&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It is our choices…that show what we truly are, far more than our abilities.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Albus Dumbledore&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;What I love to do is figure out those tiny choices, and the &lt;em&gt;reasoning&lt;/em&gt; behind them that led me to today.&lt;/p&gt;

&lt;p&gt;I read Patrick Rothfuss’s &lt;a href="https://www.goodreads.com/book/show/186074.The_Name_of_the_Wind" title="The Name of the Wind, by Patrick Rothfuss"&gt;“Name of the Wind”&lt;/a&gt; a long time back. It was an amazing book, which I found on a site called &lt;a href="http://bestfantasybooks.com/"&gt;bestfantasybooks.com&lt;/a&gt;. In my defense, I was an avid Harry Potter fan at the time, looking for similar books, and I’d decided that reading the best fantasy would be good preparation before I could write my own.&lt;/p&gt;

&lt;p&gt;As it so happens, “Name of the Wind” was a superb book. The kind that made me squirm in delight when I saw that the sequel was already out. So I did what any self-respecting book-lover would do: read it in a single stretch, screwing up my exams in the process. I didn’t sleep much for those few days (its a pretty long book), but I enjoyed every bit of it.&lt;/p&gt;

&lt;p&gt;I started following Pat’s (hilarious) &lt;a href="http://blog.patrickrothfuss.com/" title="Pat's blog"&gt;blog&lt;/a&gt;, where he often posted tidbits of his life, and came across &lt;a href="https://www.goodreads.com/review/show/315662446" title="Patrick's review of The Alloy of Law"&gt;his review&lt;/a&gt; of “The Alloy of Law” by Brandon Sanderson:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;…&lt;br /&gt;
My last point is that Sanderson has now been added to a very short list of authors. Specifically, the list authors whom I wish to kill so that I might eat their livers and thereby gain their power.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Any author that Patrick wanted to kill sounded like a great one to read, so I started “The Alloy of Law”. I finished the book in a few short hours. Its paced excellently, and the action keeps on coming. I’d never really read much urban fantasy before, and despite me never having read Mistborn (Alloy is a sequel to the Mistborn trilogy) I was sucked in.&lt;/p&gt;

&lt;p&gt;And here I am, counting down the next few days, waiting for the release of &lt;a href="https://www.goodreads.com/book/show/15704459.Firefight" title="Firefight, by Brandon Sanderson"&gt;Firefight&lt;/a&gt;, Sanderson’s next book.&lt;/p&gt;

&lt;p&gt;So, thank you Pat. Thanks for introducing me to my favorite writer. Thank you for writing those wonderful books, and keep on reviewing all that you love (I’m reading &lt;a href="https://www.goodreads.com/book/show/18659623-through-the-woods" title="Through the Woods, by Emily Carroll"&gt;“Through the Woods”&lt;/a&gt; next).&lt;/p&gt;

&lt;p&gt;If you are looking for a nice fat book to read next, I heartily recommend &lt;a href="https://www.goodreads.com/book/show/186074.The_Name_of_the_Wind" title="The Name of the Wind, by Patrick Rothfuss"&gt;“The Name of the Wind”&lt;/a&gt; and &lt;a href="https://www.goodreads.com/book/show/7235533-the-way-of-kings" title="Way of Kings, by Brandon Sanderson"&gt;“The Way of Kings”&lt;/a&gt;.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Sat, 03 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/01/03/thank-you-pat/</guid></item><item><title>Your API is not RESTful</title><link>https://3059274a.danpalmer-me.pages.dev/2015-01-03-your-api-is-not-restful/</link><description>RESTful APIs are a popular thing, but is anyone really doing it properly? This post highlights some common flaws in RESTful APIs, and explains why it&amp;rsquo;s important that we improve them beyond the current standard.</description><author>Dan Palmer</author><pubDate>Sat, 03 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://3059274a.danpalmer-me.pages.dev/2015-01-03-your-api-is-not-restful/</guid></item><item><title>New Beginnings</title><link>https://tiltingatwindmills.dev/new-beginnings/</link><description>It's been a long time coming, but I think it's finally time for me
to shutter GreaterDebater. Suffice it to say, the site never
really…</description><author>Tilting at Windmills</author><pubDate>Fri, 02 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/new-beginnings/</guid></item></channel></rss>