<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><description>This is a play ground for me to post snippets about life, love and code. 

I’m a CTO for a social media analytics company based in Helsinki Finland.</description><title>Uncle G's Rant</title><generator>Tumblr (3.0; @pwistrand)</generator><link>https://paulwistrand.com/</link><item><title>So HBO delivered a present this week with the return of both...</title><description>&lt;img src="https://64.media.tumblr.com/a6d7ba76c5dd6342ff18b32e211feee4/tumblr_o6etvzloi71spsccbo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;So HBO delivered a present this week with the return of both Game of Thrones and Silicon Valley. In the later as a startup founder and developer I’m amazed that anyone outside the “bubble” understands what the heck the characters are talking. However especially hilarious was just prior to watching the opening episode of Silicon Valley I witnessed our team spend an entire lunch giggling over snapchat’s ability to transpose faces.&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Apparently in the list of incentives to entice people to your start up the ability to a slap moustache on peoples faces is second to changing the world.&lt;/p&gt;</description><link>https://paulwistrand.com/post/143594080123</link><guid>https://paulwistrand.com/post/143594080123</guid><pubDate>Fri, 29 Apr 2016 22:23:59 +0300</pubDate></item><item><title>Fatherhood</title><description>&lt;p&gt;My last post goes back nearly a year and pretty much coincides with not the birth of my son but when he started to have difficulties sleeping. Its been one huge effort to finally get him to the point where he will sleep through two nights in every three. &lt;/p&gt;&lt;p&gt;I’ve never been a good sleeper myself. No doubt not helped by adopting the “night owl” lifestyle from early adulthood that is rife with software developers. However the body’s ability to cope with sleep deprivation can only go so far and I’m painfully aware of how far its diminished as I’ve grown older. Trying to function at work and at home at the level of expectation that I put on myself has been impossible. &lt;/p&gt;&lt;p&gt;Therefore I’m in awe of parents that can balance home, work and professional development. I don’t know how they manage it.&lt;br/&gt;&lt;/p&gt;</description><link>https://paulwistrand.com/post/142832814313</link><guid>https://paulwistrand.com/post/142832814313</guid><pubDate>Fri, 15 Apr 2016 09:01:49 +0300</pubDate></item><item><title>I’m lazy so I want apt-get package installs for the init.d scripts but why oh why do 99% of packages...</title><description>&lt;p&gt;I’m lazy so I want apt-get package installs for the init.d scripts but why oh why do 99% of packages start any service daemon by default? Don’t friggin do that! &lt;/p&gt;</description><link>https://paulwistrand.com/post/118359434153</link><guid>https://paulwistrand.com/post/118359434153</guid><pubDate>Thu, 07 May 2015 15:24:44 +0300</pubDate></item><item><title>Upgrade time</title><description>&lt;figure data-orig-height="324" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/83bc43668f30319e8b00ab0065e31de6/tumblr_inline_nkdncmDKEn1rl48dc.png"&gt;&lt;img src="https://64.media.tumblr.com/9ac84e15a3c17881abec4ec253c909b9/tumblr_inline_pbljvsAMQ91rl48dc_540.png" alt="image" data-orig-height="324" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/83bc43668f30319e8b00ab0065e31de6/tumblr_inline_nkdncmDKEn1rl48dc.png"/&gt;&lt;/figure&gt;&lt;p&gt;I&amp;rsquo;ve finally had to bite the bullet and upgrade. My current Mac Book Pro is being returned and I&amp;rsquo;ve been given a new one as part of a company wide upgrade. I&amp;rsquo;m usually very slow to apply software upgrades these days because of the inevitability of it breaking something in my development environment. &lt;/p&gt;&lt;p&gt;It seems even trivial maintenance patches always trash my python virtual environments. I develop using a mix of IntelliJ, Sublime Text and Vim. IntelliJ for Java and Python. Sublime for html and Javascript and Vim when wanting to do anything that is short and quick. The big catch ya with Yosemite is that it doesn&amp;rsquo;t ship with a Java runtime.&lt;/p&gt;&lt;p&gt;Realising this I thought &amp;ldquo;no problem&amp;rdquo; Cask for Homebrew (&lt;a href="http://cask.readthedocs.org/"&gt;http://cask.readthedocs.org/&lt;/a&gt;) will get that solved in about 10 seconds. Now I do vaguely remember IntelliJ popping something up mentioning Java 1.6 but who pays attention to installation instructions? Two days of random application crashes later there is no escaping it&amp;hellip; RTFM. &lt;/p&gt;&lt;p&gt;When I say random it wasn&amp;rsquo;t IntelliJ that was crashing most of the time, it was other things. Start IntelliJ bang Chrome blows up&amp;hellip; hmm weird. Start IntelliJ later&amp;hellip; bang Evernote blows up WTF? Finally IntelliJ stopped launching at all and I had to take to Google. I found postings suggesting altering the Contents/Info.plist file and warnings not to do it&amp;hellip; tried it didn&amp;rsquo;t work. &lt;/p&gt;&lt;p&gt;The only thing that worked was installing the Apple JDK 1.6 as advised &lt;a href="https://intellij-support.jetbrains.com/entries/27854363-IDE-doesn-t-start-after-updating-to-Mac-OS-Yosemite-or-Mavericks"&gt;here&lt;/a&gt;. &lt;/p&gt;</description><link>https://paulwistrand.com/post/112128339783</link><guid>https://paulwistrand.com/post/112128339783</guid><pubDate>Thu, 26 Feb 2015 14:07:12 +0200</pubDate><category>yosemite</category><category>python</category><category>java</category><category>intellij</category></item><item><title>AFK</title><description>&lt;p&gt;So I&amp;rsquo;ve been largely AFK recently having not only been tied up allot more with non coding activities within my company but also becoming proud Dad for the first time. I hope to get back on the posting band wagon soon as things return to some form of normality. As I write that I know I&amp;rsquo;m only fooling myself :)&lt;/p&gt;</description><link>https://paulwistrand.com/post/109193411288</link><guid>https://paulwistrand.com/post/109193411288</guid><pubDate>Mon, 26 Jan 2015 12:25:43 +0200</pubDate></item><item><title>My company is looking to hire a Lead Developer. If you know a...</title><description>&lt;img src="https://64.media.tumblr.com/30c1c1e8bd5c4acb9d1cb70e7f28df9c/tumblr_nis4pzzhiI1spsccbo1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;My company is looking to hire a Lead Developer. If you know a software developer who has strong python and analytics skills then share these details.&lt;/p&gt;</description><link>https://paulwistrand.com/post/109193242933</link><guid>https://paulwistrand.com/post/109193242933</guid><pubDate>Mon, 26 Jan 2015 12:20:23 +0200</pubDate><category>python</category><category>job</category><category>postgresql</category><category>mongodb</category><category>analytics</category></item><item><title>Flat batteries included</title><description>&lt;p&gt;Python date time handling is a mess for the unwary. Between the datetime, time, pytz and calender libraries how is anyone supposed to know where to begin? That someone hasn&amp;rsquo;t taken to them in the same way as requests to urllib2 is surprising. But to be fair to python allot of other languages suffer from the same problem in that timezones were an after thought to date time types.&lt;/p&gt;
&lt;p&gt;What caught me out this week was the expectation that date time arithmetic in python was safe for standard time/daylight saving time boundaries. It isn&amp;rsquo;t&amp;hellip; silly me for not reading the documentation in pytz correctly:&lt;/p&gt;
&lt;p&gt;&lt;figure class="tmblr-full" data-orig-height="123" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/a417f3a75ee95c6873f613ef8044e98a/tumblr_inline_ng28vwlqzb1rl48dc.png"&gt;&lt;img src="https://64.media.tumblr.com/bfe126f64132df6d990d26da55bd154f/tumblr_inline_pbljvsetC21rl48dc_540.png" data-orig-height="123" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/a417f3a75ee95c6873f613ef8044e98a/tumblr_inline_ng28vwlqzb1rl48dc.png"/&gt;&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;But since I needed to interpolate missing dates into a time series data set as milliseconds from the unix epoch I was in for a further surprise. When converting from UTC date times you need to use calendar.timegm and when converting from local data times you need to use time.mktime. When converting from &lt;strong&gt;any possible timezone&lt;/strong&gt; then neither of these are going to work. You need to perform the conversion yourself:&lt;/p&gt;
&lt;p&gt;&lt;figure class="tmblr-full" data-orig-height="142" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/93c3512cf9151727b7ce1dde4cac75cb/tumblr_inline_ng2c1qDxLm1rl48dc.png"&gt;&lt;img src="https://64.media.tumblr.com/9b8f662baffdf5c4bbbb3639e181173d/tumblr_inline_pbljvs5c4n1rl48dc_540.png" data-orig-height="142" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/93c3512cf9151727b7ce1dde4cac75cb/tumblr_inline_ng2c1qDxLm1rl48dc.png"/&gt;&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;However in doing so we have reintroduced the problem when crossing DST boundaries because python date time arithmetic doesn&amp;rsquo;t account this (remembering what pytz told us). You can see below that our times are no longer aligned to midnight.&lt;/p&gt;
&lt;p&gt;&lt;figure class="tmblr-full" data-orig-height="123" data-orig-width="473" data-orig-src="https://64.media.tumblr.com/fe7532cc591e7dc8458dce46211366bd/tumblr_inline_ng2cwpzNBT1rl48dc.png"&gt;&lt;img src="https://64.media.tumblr.com/fe7532cc591e7dc8458dce46211366bd/tumblr_inline_pbljvsWolg1rl48dc_540.png" data-orig-height="123" data-orig-width="473" data-orig-src="https://64.media.tumblr.com/fe7532cc591e7dc8458dce46211366bd/tumblr_inline_ng2cwpzNBT1rl48dc.png"/&gt;&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;Worse when going from ST to DST you will skip a day in the sequence. We need to manually correct again by adjusting for the DST.&lt;/p&gt;
&lt;p&gt;&lt;figure class="tmblr-full" data-orig-height="141" data-orig-width="469" data-orig-src="https://64.media.tumblr.com/5c214d3a6d77194d6943d28ff1adda9c/tumblr_inline_ng2d44qimQ1rl48dc.png"&gt;&lt;img src="https://64.media.tumblr.com/5c214d3a6d77194d6943d28ff1adda9c/tumblr_inline_pbljvtejyt1rl48dc_540.png" data-orig-height="141" data-orig-width="469" data-orig-src="https://64.media.tumblr.com/5c214d3a6d77194d6943d28ff1adda9c/tumblr_inline_ng2d44qimQ1rl48dc.png"/&gt;&lt;/figure&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;/p&gt;</description><link>https://paulwistrand.com/post/104331448818</link><guid>https://paulwistrand.com/post/104331448818</guid><pubDate>Thu, 04 Dec 2014 17:31:24 +0200</pubDate><category>python</category></item><item><title>Regular Expressions</title><description>&lt;p&gt;There are a few things in computer science that you end up doing just infrequently enough that you have to relearn them every time. Regular expressions falls in that category for me. XSLT used to be number two but fortunately JSON came along to save us.&lt;/p&gt;&lt;p&gt;One day I hope to work with someone who can pull them out of thin air so I never have to go and read up on them again. This regular expression visualizer might help in the mean time &lt;a href="http://jex.im/regulex/"&gt;http://jex.im/regulex/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;EDIT 7th March 2015 : the excellent &lt;a href="https://regex101.com/"&gt;https://regex101.com/&lt;/a&gt; site also does a good job&lt;/b&gt;&lt;/p&gt;

&lt;figure class="tmblr-full" data-orig-height="221" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/0048436a2620b1ed3c3c453d3ca93fa2/tumblr_inline_nfoy31y7rC1rl48dc.png"&gt;&lt;img src="https://64.media.tumblr.com/3b88b17bbc34e18b05dedbea21b7a878/tumblr_inline_pbljvsGxqQ1rl48dc_540.png" alt="image" data-orig-height="221" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/0048436a2620b1ed3c3c453d3ca93fa2/tumblr_inline_nfoy31y7rC1rl48dc.png"/&gt;&lt;/figure&gt;</description><link>https://paulwistrand.com/post/103712523258</link><guid>https://paulwistrand.com/post/103712523258</guid><pubDate>Thu, 27 Nov 2014 11:27:06 +0200</pubDate><category>regexp</category></item><item><title>Apache Spark with a RDBMS</title><description>&lt;p&gt;&lt;span&gt;Last week I spent a number of hours looking at Apache Spark. We currently have a problem with one of our computations at EzyInsights and I was interested to know if Spark could be a solution.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id="docs-internal-guid-3bf079ce-e14c-ccf3-53bc-bf6e1b22060f"&gt;I’ll avoid getting into a description on what Spark is and isn’t instead I’m assume that you can read up on it yourself. But I’ll talk abit about all the things that tripped me up trying to get it to integrate with a relational database.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Spark is built with strong interoperability with Hadoop and allot of the other libraries tied to that ecosystem. At its core is concept of the RDD (Resilient Distributed Dataset) and this is where it gets difficult if you’re not sourcing the data for your RDDs via HBase, HDFS, Cassadra etc. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id="docs-internal-guid-3bf079ce-e14d-07a1-b831-8dcfca57cac7"&gt;Sourcing from relational databases or other data sources is only briefly touched on in the documentation.  Unless you want to use the new experimental Spark SQL then you need to use a Hadoop InputFormat derived type. Please note that Spark SQL provides sql like querying capabilities and allows you to construct typed RDDs but is not an interface to RDBMS sources.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;I quickly identified that I could use the org.apache.hadoop.mapreduce.lib.db.DBInputFormat class but beyond that there was very little information on how to wire everything together in Spark. There was no other choice but to pull the sources for Spark and Hadoop and starting working through the code using a debugger. Especially as any misconfiguration results in extremely uninformative NullPointerExceptions right, left and centre.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;If you want to listen (or attach) to the Spark shell and executor then you will need to specify the SPARK_JAVA_OPTS environment variable for your IDE’s remote debugging settings not JAVA_OPTS. You’ll probably be wanting to do this allot. There are some other options you will be supplying but I’ll come back to those later.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;I was specifically looking at Spark’s Python language bindings (e.g. pyspark) since we use Python allot. In addition we’re trying to connect to an Postgres database. So lets look at what ended up working for me.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;The newAPIHadoopRDD method of the spark context must be called to acquire the RDD instance. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;figure class="tmblr-full" data-orig-height="86" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/9ec96eb14473ecee5b02ad534bb34f4a/tumblr_inline_nfjgpwms6Q1rl48dc.png"&gt;&lt;img alt="image" src="https://64.media.tumblr.com/242d2d0c4737fed1f655a496eb0c2b2d/tumblr_inline_pbljvsHxgJ1rl48dc_540.png" data-orig-height="86" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/9ec96eb14473ecee5b02ad534bb34f4a/tumblr_inline_nfjgpwms6Q1rl48dc.png"/&gt;&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;In this instance the DBInputFormat class provides an implementation of the InputFormat abstract class. We will supply a number of settings to the DBInputFormat using the conf parameter.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;When using the DBInputFormat type you have no choice but to specify the key parameter as a java.lang.Long. It took me a long time to figure out what was going on here. Embarrassingly so since the java doc on DBInputFormat actually says “DBInputFormat emits LongWritables containing the record number as key and DBWritables as value”. Its a pity this can’t be specified to what ever we like.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;I ended up specifying java.util.List as the value type but was able to use a Map as well but this required a different org.apache.hadoop.io.Writable implementation and would presumably be more memory intensive. I’ll talk about the Writable soon.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;The value converter is required as we must tell spark how to convert the Writable to the value type specified (e.g. java.util.List). Note since the key is a primitive and the LongWritable emitted by the DBInputFormat is a core Hadoop type Spark doesn’t require us to supply a key converter.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;The conf parameter is required to supply to the DBInputFormat all the details on where, what and how it can obtain the data for the RDD. This can be defined as something like:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="tmblr-full" data-orig-height="151" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/a410a4ceceedced770c01eadd56e13aa/tumblr_inline_nfjhzl37wh1rl48dc.png"&gt;&lt;img src="https://64.media.tumblr.com/1fee187ad0a4572c3c50dd2b2600b90f/tumblr_inline_pbljvsi4mQ1rl48dc_540.png" data-orig-height="151" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/a410a4ceceedced770c01eadd56e13aa/tumblr_inline_nfjhzl37wh1rl48dc.png"/&gt;&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;The name of the jdbc driver we’ll be using must be provided. Below I will show how we must specify the path of this to pyspark.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id="docs-internal-guid-3bf079ce-e158-32a1-e419-76869b525f42"&gt;The org.apache.hadoop.io.Writable that we will be using by DBInputFormat to read the data is also required. Rather than supply my code see &lt;a href="http://technologywithvineet.com/import_export_hdfs_rdbms/"&gt;&lt;a href="http://technologywithvineet.com/import_export_hdfs_rdbms/"&gt;http://technologywithvineet.com/import_export_hdfs_rdbms/&lt;/a&gt;&lt;/a&gt; for an example on how to write.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span id="docs-internal-guid-3bf079ce-e158-e84f-b00b-d8221f83f735"&gt;There are different ways of specifying the query but I ended up using these options since the DBInputFormat does something stupid with aliasing the table that breaks for Postgres schemas. See org.apache.hadoop.mapreduce.lib.db.DBConfiguration for the options.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span id="docs-internal-guid-3bf079ce-e159-8ebf-bddb-8a65b0a834af"&gt;Now if you just copied these settings into the pyspark shell they won’t work without modification. However you would still be missing the value converter to take a com.kampiki.analytics.spark.FooBarWritable and convert it to a java.lang.List. I had allot of trouble with this as I just couldn’t get it to work using a converter written in Java. I ended up creating a mixed language jar and writing my Writable in Java and my converter in Scala.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="tmblr-full" data-orig-height="73" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/b2cecacf09dcf9fa88567f01a3d1b8bb/tumblr_inline_nfjhkxV8Y91rl48dc.png"&gt;&lt;img alt="image" src="https://64.media.tumblr.com/2a36dcb039ece611a519b44a3632a873/tumblr_inline_pbljvsTx4R1rl48dc_540.png" data-orig-height="73" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/b2cecacf09dcf9fa88567f01a3d1b8bb/tumblr_inline_nfjhkxV8Y91rl48dc.png"/&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Now we’re getting close to being able to get a RDD from Postgres but we still need to know how to specify to Spark where to find the necessary Jar files for the driver and the writable and converter.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;bin/pyspark &amp;ndash;jars mywritableandconverter.jar &amp;ndash;driver-class-path postgresql-9.3-1102.jdbc41.jar &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Now everything should work… as long as your query doesn’t timeout.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;</description><link>https://paulwistrand.com/post/103453328443</link><guid>https://paulwistrand.com/post/103453328443</guid><pubDate>Mon, 24 Nov 2014 12:48:29 +0200</pubDate><category>postgresql</category><category>rdbms</category><category>apache spark</category><category>hadoop</category></item><item><title>Endless choice does not lead to simplicity it leads to complexity</title><description>&lt;p&gt;Scala is a language I badly want to like but try as a might I can&amp;rsquo;t sell myself on it. I&amp;rsquo;m all for being succinct in code but offering endless choice of how you can express intent does not make a language simple. &lt;/p&gt;</description><link>https://paulwistrand.com/post/102881770478</link><guid>https://paulwistrand.com/post/102881770478</guid><pubDate>Mon, 17 Nov 2014 18:52:02 +0200</pubDate><category>scala</category></item><item><title>.NET OSS</title><description>&lt;p&gt;Its been a couple of years since I spent any significant time on .NET. So the recent announcement is not as ground shattering as it might be for those locked in Microsoft&amp;rsquo;s enterprise development eco system.&lt;/p&gt;

&lt;blockquote class="twitter-tweet"&gt;
&lt;p&gt;Announcing Open Source of .NET Core Framework, .NET for Linux/OSX, and Free Visual Studio Community edition: &lt;a href="https://t.co/VlDKM9rFu7"&gt;https://t.co/VlDKM9rFu7&lt;/a&gt;&lt;/p&gt;
— Scott Guthrie (@scottgu) &lt;a href="https://twitter.com/scottgu/status/532560636547710976"&gt;November 12, 2014&lt;/a&gt;&lt;/blockquote&gt;
&lt;script charset="utf-8" src="//platform.twitter.com/widgets.js" type="text/javascript"&gt;&lt;/script&gt;

&lt;p&gt;While there is still allot of work they need to do the thought of one day getting the certifiable stack on top of Linux is appealing to me. I think C# is an awesome language that gets the OO functional hybrid approach far better than the likes of Scala.&lt;/p&gt;</description><link>https://paulwistrand.com/post/102599272028</link><guid>https://paulwistrand.com/post/102599272028</guid><pubDate>Fri, 14 Nov 2014 10:48:30 +0200</pubDate><category>dotnet</category><category>scala</category><category>csharp</category></item><item><title>Saltstack</title><description>&lt;p&gt;So I&amp;rsquo;ve been spending allot of time recently working on our &lt;a href="http://www.saltstack.com/"&gt;Saltstack&lt;/a&gt; states. I have a love hate relationship with Saltstack. Not of a love to hate variety but a genuine love it one day hate it the next.&lt;/p&gt;
&lt;p&gt;I chose to adopt it as our deployment/configuration platform largely because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The amount of antidotal stories I was hearing on the difficulty of &lt;a href="http://puppetlabs.com/"&gt;Puppet&lt;/a&gt; and &lt;a href="https://www.getchef.com/"&gt;Chef&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Its written python&lt;/li&gt;
&lt;li&gt;I hadn&amp;rsquo;t heard of &lt;a href="http://www.ansible.com/"&gt;Ansible&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The issue with SaltStack is that its not a trivial piece of software to have to learn. Of course it can be argued that deployment/configuration is not a trivial problem.&lt;/p&gt;
&lt;p&gt;However when you want to maximise the amount of time you spend coding additional customer value into your product having to spend a number of weeks getting to grips with a piece of infrastructure software hurts.&lt;/p&gt;</description><link>https://paulwistrand.com/post/102551887048</link><guid>https://paulwistrand.com/post/102551887048</guid><pubDate>Thu, 13 Nov 2014 22:44:00 +0200</pubDate><category>saltstack</category></item><item><title>Welcome Back</title><description>&lt;p&gt;Its been about 9 years since I last decided to blog about anything. So since around 2005&amp;hellip; oh dear feeling old. Back then I found it impossible to keep my posts short and hence I found that the whole endeavour was taking way too much time.&lt;/p&gt;
&lt;p&gt;This time round I hope to keep it short and sweet with a focus less on trying to write informative articles and more like a daily update on what I&amp;rsquo;m looking into and working on. The kind of stuff I don&amp;rsquo;t want to bore my friends on facebook with and struggle to fit on twitter. We&amp;rsquo;ll see how it goes.&lt;/p&gt;</description><link>https://paulwistrand.com/post/102548998343</link><guid>https://paulwistrand.com/post/102548998343</guid><pubDate>Thu, 13 Nov 2014 22:05:25 +0200</pubDate><category>startups</category></item><item><title>Its taken me nearly three years to come to the realisation that life in a startup is about doing the...</title><description>&lt;p&gt;Its taken me nearly three years to come to the realisation that life in a startup is about doing the worst possible job you can get away with at the last possible moment. &lt;/p&gt;</description><link>https://paulwistrand.com/post/102534130313</link><guid>https://paulwistrand.com/post/102534130313</guid><pubDate>Thu, 13 Nov 2014 18:01:00 +0200</pubDate><category>startups</category></item></channel></rss>
