<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Making It Scale</title>
	<atom:link href="http://www.makingitscale.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.makingitscale.com</link>
	<description>Blogging about scaling systems, applications and ranting about everything in between.</description>
	<lastBuildDate>Thu, 26 Apr 2012 16:01:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>JUnit XML test reports from SBT</title>
		<link>http://www.makingitscale.com/2012/junit-xml-test-reports-from-sbt.html</link>
		<comments>http://www.makingitscale.com/2012/junit-xml-test-reports-from-sbt.html#comments</comments>
		<pubDate>Thu, 26 Apr 2012 16:01:49 +0000</pubDate>
		<dc:creator>Brandon Seibel</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[bamboo]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[report]]></category>
		<category><![CDATA[sbt]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[test reports]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[unit tests]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.makingitscale.com/?p=426</guid>
		<description><![CDATA[Now that we&#8217;ve started doing some Scala development internally and in particular using sbt as our build tool of choice we hit our first little snag when it came to integrating these scala projects into the same development flow as all of our other projects. We use Atlassian&#8217;s Bamboo to handle all of our code [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.makingitscale.com/wp-content/uploads/2012/04/scala-logo.png" alt="scala logo" title="Scala Logo" width="198" height="59" class="alignright size-full wp-image-409" /><br />
Now that we&#8217;ve started doing some Scala development internally and in particular using sbt as our build tool of choice we hit our first little snag when it came to integrating these scala projects into the same development flow as all of our other projects. </p>
<p>We use Atlassian&#8217;s Bamboo to handle all of our code builds and unit testing, as such it looks for JUnit style XML reports to be generated by whatever testing framework is being used. Unfortunately sbt doesn&#8217;t appear provide any means to tell our testing framework (in this case ScalaTest) to output xml reports as of yet. Solution? Write an sbt plugin that spits out something resembling JUnit XML reports <img src='http://www.makingitscale.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>You can find the project here <a href="https://github.com/bseibel/sbt-simple-junit-xml-reporter-plugin" title="https://github.com/bseibel/sbt-simple-junit-xml-reporter-plugin">https://github.com/bseibel/sbt-simple-junit-xml-reporter-plugin</a> its pretty basic and could use a bit of loving but its enough to allow Bamboo to report on our tests.</p>
<p>To include it in your project add a plugin.scala into your projects projects project directory (ha! that is ./project/project/plugin.scala) and drop in:<br />
<pre class="prettyprint prettify"><br />
import sbt._</p>
<p>object Plugins extends Build {<br />
  lazy val plugins = Project(&#8220;plugins&#8221;, file(&#8220;.&#8221;))<br />
    .dependsOn(<br />
      uri(&#8220;git://github.com/bseibel/sbt-simple-junit-xml-reporter-plugin.git&#8221;)<br />
    )<br />
}<br />
</pre></p>
<p>Currently its just hard coded to drop reports into `cwd`/test-reports/ but that can be changed easily enough.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makingitscale.com/2012/junit-xml-test-reports-from-sbt.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scala, so elegant</title>
		<link>http://www.makingitscale.com/2012/scala-so-elegant.html</link>
		<comments>http://www.makingitscale.com/2012/scala-so-elegant.html#comments</comments>
		<pubDate>Fri, 20 Apr 2012 14:27:54 +0000</pubDate>
		<dc:creator>Brandon Seibel</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[concicse]]></category>
		<category><![CDATA[elegant]]></category>
		<category><![CDATA[functional]]></category>
		<category><![CDATA[imperative languages]]></category>
		<category><![CDATA[imperative style]]></category>
		<category><![CDATA[learning curve]]></category>
		<category><![CDATA[match]]></category>
		<category><![CDATA[pattern matching]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[verbose]]></category>

		<guid isPermaLink="false">http://www.makingitscale.com/?p=408</guid>
		<description><![CDATA[I have only just started learning Scala over the last week or so and I have to say I&#8217;ve already fallen in love with it. The learning curve stems mostly from having to switch my&#160;imperative&#160;style thinking into a functional one, which is pretty difficult since its like trying to drop every bad habit you&#8217;ve ever [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-409" title="Scala Logo" src="http://www.makingitscale.com/wp-content/uploads/2012/04/scala-logo.png" alt="scala logo" width="198" height="59" /><br />
I have only just started learning Scala over the last week or so and I have to say I&#8217;ve already fallen in love with it. The learning curve stems mostly from having to switch my&nbsp;imperative&nbsp;style thinking into a functional one, which is pretty difficult since its like trying to drop every bad habit you&#8217;ve ever had at once but once you do the elagent minimalistic code you can produce is astonishing.</p>
<p>Take for example the following string:</p>
<pre>key1=value1; key2=value2; key3=value3</pre>
<p>In java (or other&nbsp;imperative&nbsp;languages for that matter) how would you go about writing a method that can retrieve the value for a given key out of that string?</p>
<p>Something like this maybe, pretty verbose.<br />
<pre class="prettyprint prettify"><br />
    String extractValue(String key, String string) {</p>
<p>        Pattern p = new Pattern.compile(&#8220;(.*)=(.*)&#8221;);</p>
<p>        ArrayList<String> pairs = new ArrayList<String>();<br />
        for (String i : string.split(&#8220;;&#8221;)) {<br />
            pairs.add(i.trim());<br />
        }</p>
<p>        for (String i : pairs) {<br />
            Matcher m = p.matcher(i);<br />
            if (m.matches()) {<br />
                String k = m.group(0);<br />
                String v = m.group(1);</p>
<p>                if (k.compareTo(key) == 0) {<br />
                    return v;<br />
                }<br />
            }<br />
        }</p>
<p>        return null;</p>
<p>    }<br />
</pre></p>
<p>In scala thanks to its incredibly powerful pattern matching capabilities we can convert this into something really nice:<br />
<pre class="prettyprint prettify"><br />
val ValueExtractorRE = &#8220;&#8221;"(.*)=(.*)&#8221;"&#8221;.r</p>
<p>@tailrec<br />
final def extractValue(name: String, values: List[String]): Option[String] = {<br />
  values match {<br />
    case ValueExtractorRE(x, y) :: rest if x == name =&gt; Some(y)<br />
    case x :: rest =>extractValue(name, rest)<br />
    case _ => None<br />
  }<br />
}</p>
<p>val myVal = extractValue(&#8220;key1&#8243;,string.split(&#8220;;&#8221;).toList.map(_.trim)))<br />
</pre></p>
<p>To me this is infinitely more elegant and readable and really demonstrates the power of Scalas pattern matching.</p>
<p>The important bit to know here if you&#8217;ve never used Scala before is that matching is eager, so the first case to match wins. I&#8217;ll break the first case into two parts:</p>
<ol>
<li>The :: operator is extracting the head and remaining entries from the list, a simpler form of this is seen in the second case.</li>
<li>We try to match the head entry using the ValueExtractorRE Regex from the top and extract the matched groups into x and y. The case has a guard too so we only match if x equals the value we&#8217;re looking for, if it does we return an Option as Some(y).</li>
</ol>
<p>Whats extra-neat is that the compiler will optimize this into a loop with a goto instead of actually being recursive, and I ensure that by providing the @tailrec annotation. If for whatever reason the compiler can&#8217;t tail-optimize the method it will bomb with the reason why, which is also pretty useful.</p>
<p>I don&#8217;t know if I&#8217;ll be able go back and use any other language again <img src='http://www.makingitscale.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Cheers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makingitscale.com/2012/scala-so-elegant.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hugepages and your buffers/cache.</title>
		<link>http://www.makingitscale.com/2012/hugepages-and-your-buffers-cache.html</link>
		<comments>http://www.makingitscale.com/2012/hugepages-and-your-buffers-cache.html#comments</comments>
		<pubDate>Wed, 04 Jan 2012 14:52:40 +0000</pubDate>
		<dc:creator>Brandon Seibel</dc:creator>
				<category><![CDATA[Scaling]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[buffers]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cpu cache]]></category>
		<category><![CDATA[hugepages]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mmap]]></category>
		<category><![CDATA[page cache]]></category>
		<category><![CDATA[physical memory address]]></category>
		<category><![CDATA[rhel]]></category>
		<category><![CDATA[translation lookaside buffer]]></category>
		<category><![CDATA[vfs]]></category>
		<category><![CDATA[virtual memory]]></category>

		<guid isPermaLink="false">http://www.makingitscale.com/?p=395</guid>
		<description><![CDATA[Something is afoot in the above graph, what I can tell you is at around 10:15pm is when I disabled transparent hugepages on this box. So where why am I suddenly buffering and caching more? What are transparent hugepages? From what I understand hugepages were introduced to maximize the use of the TLB (translation lookaside [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-396" title="hugepages-ram-usage" src="http://www.makingitscale.com/wp-content/uploads/2012/01/Screen-Shot-2012-01-04-at-9.17.58-AM.png" alt="" width="578" height="198" /></p>
<p style="text-align: left;">Something is afoot in the above graph, what I can tell you is at around 10:15pm is when I disabled transparent hugepages on this box. So where why am I suddenly buffering and caching more?</p>
<h3 style="text-align: left;">What are transparent hugepages?</h3>
<p>From what I understand hugepages were introduced to maximize the use of the TLB (translation lookaside buffer) which is a fixed size CPU cache used to speed up virtual memory address to physical memory address lookups. Hugepages combines multiple smaller pages into one huge page such that the TLB can potentially contain more useful pages as a whole and we can skip deep lookups more often. Now this really only matters for systems that are allocating large amounts of memory and in fairly sizeable chunks, or so I assume.</p>
<h3>Where did my vfs cache go?</h3>
<p>The reason this attracted my attention was because we were having IO problems on a few of our RHEL6 boxes that normally had no issues when run on identical hardware and running FreeBSD instead. The reason was pretty clear, we&#8217;re hardly caching anything and we keep going to disk for frequently accessed blocks, but why?</p>
<p>I bet it has something to do with this statement from <a title="lwn.net" href="https://lwn.net/Articles/423584/">https://lwn.net/Articles/423584/</a>:</p>
<blockquote><p>&#8220;The current patch only works with anonymous pages; the work to integrate huge pages with the page cache has not yet been done.&#8221;</p></blockquote>
<p>These boxes are primarily running apache with mmap enabled, I&#8217;m guessing that when we mmap a file (which is 99% of the time going to be far bigger than one 4k page) we&#8217;re allocating a hugepage, and as such skip any sort of page cache for future accesses of that same data. I could be entirely wrong on how those internals work as I havent looked too deeply but it would certainly explain why we&#8217;re seeing this behaviour.</p>
<p>So this begs the question of why this is enabled by default on RHEL6, normally they&#8217;re pretty conservative on potentially performance breaking features. I can hazard a guess that it&#8217;s because the majority of RedHats customers are running large JVM installations where hugepages would actually help and not small apache setups like we are.</p>
<p>Oh well, for now: echo never &gt; /sys/kernel/mm/redhat_transparent_hugepage</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makingitscale.com/2012/hugepages-and-your-buffers-cache.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How not to write an article about things toxic to scalability.</title>
		<link>http://www.makingitscale.com/2011/how-not-to-write-an-article-about-things-toxic-to-scalability.html</link>
		<comments>http://www.makingitscale.com/2011/how-not-to-write-an-article-about-things-toxic-to-scalability.html#comments</comments>
		<pubDate>Fri, 23 Sep 2011 02:29:46 +0000</pubDate>
		<dc:creator>Brandon Seibel</dc:creator>
				<category><![CDATA[Rants]]></category>
		<category><![CDATA[Scaling]]></category>
		<category><![CDATA[consistency]]></category>
		<category><![CDATA[graphs]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[object relational]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[scalability]]></category>

		<guid isPermaLink="false">http://www.makingitscale.com/?p=388</guid>
		<description><![CDATA[I was making my way through the sites in my daily reading rotation tonight when I saw a fairly suspicious article posted on the High Scalability blog talking about 5 things poisonous to scalability.  I dont know how this managed to make it through their normally decent moderation because it read more like cheap marketing [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-390" title="Screen Shot 2011-09-22 at 10.28.53 PM" src="http://www.makingitscale.com/wp-content/uploads/2011/09/Screen-Shot-2011-09-22-at-10.28.53-PM.png" alt="" width="168" height="160" />I was making my way through the sites in my daily reading rotation tonight when I saw a fairly suspicious article posted on the <a href="http://highscalability.com/">High Scalability</a> blog talking about 5 things poisonous to scalability.  I dont know how this managed to make it through their normally decent moderation because it read more like cheap marketing material stating obvious facts with little substance than anything else.</p>
<p>Well I too can play this game; so here is my list of 5 things toxic to scalability.</p>
<p style="padding-left: 30px;"><strong>1. Don&#8217;t use Object Relational Mappers</strong></p>
<p style="padding-left: 30px;">Sure any ORM will be your bottleneck when you need to scale into the millions, but lets be honest you&#8217;re not writing an app today to support a million users, likely not even 100k. But throw MySQL&#8217;s amazing query planner into the mix and you&#8217;ll be lucky to hit 5k! Clearly anyone can see why every ORM is bad for scalability here!</p>
<p style="padding-left: 30px;"><strong>2. Don&#8217;t worry about data consistency. Live in the eventually, not in the now.</strong></p>
<p style="padding-left: 30px;">If theres anything Facebook has shown us, it&#8217;s that consistently broken images, confusing randomly changing data you don&#8217;t expect is A-OK! Atomic operations are so last century.</p>
<p style="padding-left: 30px;"><strong>3. Make sure you have graphs.</strong></p>
<p style="padding-left: 30px;">Without graphs, executives have no idea how to respond to scalability issues. I mean shit, the site is offline, but show me the graphs that show me that!</p>
<p style="padding-left: 30px;"><strong>4. Scale your database.</strong></p>
<p style="padding-left: 30px;">It turns out you can&#8217;t scale with only one database serving up requests, so you should have more. Unless of course you use NOSQL or something, that shit scales itself right?</p>
<p style="padding-left: 30px;"><strong>5. Feature Flags</strong></p>
<p style="padding-left: 30px;">Ensure you can turn off various features of the site, like all the interactive bits that made your site worth visiting in the first place.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makingitscale.com/2011/how-not-to-write-an-article-about-things-toxic-to-scalability.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fix for broken search domain resolution in OSX Lion</title>
		<link>http://www.makingitscale.com/2011/fix-for-broken-search-domain-resolution-in-osx-lion.html</link>
		<comments>http://www.makingitscale.com/2011/fix-for-broken-search-domain-resolution-in-osx-lion.html#comments</comments>
		<pubDate>Tue, 26 Jul 2011 12:50:51 +0000</pubDate>
		<dc:creator>Brandon Seibel</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[broken search]]></category>
		<category><![CDATA[broken search domain]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[fix for search domain]]></category>
		<category><![CDATA[lion]]></category>
		<category><![CDATA[mdnsresponder]]></category>
		<category><![CDATA[plist]]></category>
		<category><![CDATA[resolver]]></category>
		<category><![CDATA[search domain]]></category>

		<guid isPermaLink="false">http://www.makingitscale.com/?p=379</guid>
		<description><![CDATA[Thanks to Erik for pointing this out, he has also put up a easy HOWTO for fixing this on his blog. So it turns out all is not lost, you can still revert to the original behaviour of apples resolver! They&#8217;ve added a parameter to mDNSResponder called -AlwaysAppendSearchDomains. Implying that this new behaviour was very intentional. I [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-372" title="overview_callout_osx" src="http://www.makingitscale.com/wp-content/uploads/2011/07/overview_callout_osx.png" alt="" width="102" height="116" />Thanks to Erik for pointing this out, he has also put up a easy <a href="http://www.eigenspace.org/2011/07/fixing-osx-lion-dns-search-domains/">HOWTO for fixing this on his blog</a>.</p>
<p>So it turns out all is not lost, you can still revert to the original behaviour of apples resolver! They&#8217;ve added a parameter to mDNSResponder called<br />
<code>-AlwaysAppendSearchDomains</code>. Implying that this new behaviour was very intentional. I had read that Windows apparently made a similar change in one of there past updates as well so I guess this is to help fight some phishing attacks maybe? Either way, tres-annoying!</p>
<p>Anyway the gist of how to fix it is this:</p>
<p>Open up <code>/System/Library/LaunchDaemons/com.apple.mDNSResponder.plist</code> and add<br />
<code>-AlwaysAppendSearchDomains</code> following parameter to the list in the ProgramArguments block:</p>
<p>Then reload the launchd config for it, this should take care of restarting it as well:<br />
<code><br />
launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist<br />
launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist<br />
</code></p>
<p>And&#8230;<br />
<code><br />
icarus:~ bseibel$ ping util01.tor<br />
PING util01.tor.verticalscope.com (67.223.104.5): 56 data bytes<br />
</code></p>
<p><strong>YAY!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.makingitscale.com/2011/fix-for-broken-search-domain-resolution-in-osx-lion.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Broken search domain resolution in OSX Lion</title>
		<link>http://www.makingitscale.com/2011/broken-search-domain-resolution-in-osx-lion.html</link>
		<comments>http://www.makingitscale.com/2011/broken-search-domain-resolution-in-osx-lion.html#comments</comments>
		<pubDate>Thu, 21 Jul 2011 13:02:19 +0000</pubDate>
		<dc:creator>Brandon Seibel</dc:creator>
				<category><![CDATA[Rants]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apple operating system]]></category>
		<category><![CDATA[broken search]]></category>
		<category><![CDATA[domain names]]></category>
		<category><![CDATA[lion]]></category>
		<category><![CDATA[name resolution]]></category>
		<category><![CDATA[regression]]></category>
		<category><![CDATA[search domain]]></category>
		<category><![CDATA[search domains]]></category>
		<category><![CDATA[unknown host]]></category>

		<guid isPermaLink="false">http://www.makingitscale.com/?p=370</guid>
		<description><![CDATA[Have you just updated to the latest and greatest Apple operating system? Noticing anything .. funky? No, I&#8217;m not talking about the fact they think the &#8216;natural&#8217; way to scroll on a mouse is by reversing what everyones been using since the creation of the scroll wheel. I&#8217;m talking about the serious regression in name [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-372" title="overview_callout_osx" src="http://www.makingitscale.com/wp-content/uploads/2011/07/overview_callout_osx.png" alt="" width="102" height="116" />Have you just updated to the latest and greatest Apple operating system? Noticing anything .. funky? No, I&#8217;m not talking about the fact they think the &#8216;natural&#8217; way to scroll on a mouse is by reversing what everyones been using since the creation of the scroll wheel. I&#8217;m talking about the serious regression in name resolution!</p>
<p>I make heavy use of search domains in my DNS config, as should any respectably lazy systems administrator, so what do I find when I try to be extra lazy this morning by not typing full domain names? Some weird shit, let me tell you:</p>
<p><code>host-253:~ bseibel$ host util01.tor<br />
util01.tor.verticalscope.com has address 67.223.104.5<br />
host-253:~ bseibel$ ping util01.tor<br />
ping: cannot resolve util01.tor: Unknown host<br />
</code></p>
<p>Uh, what? But wait theres more.<br />
<code><br />
host-253:~ bseibel$ host web01<br />
web01.verticalscope.com has address 74.86.67.166<br />
host-253:~ bseibel$ ping web01<br />
PING web01.verticalscope.com (74.86.67.166): 56 data bytes<br />
</code></p>
<p>So, the domain searching partially breaks when you type more than just a single part? How does something like this happen? This is terribly broken, shame on Apple.</p>
<p>I&#8217;ll do some digging and see if I can&#8217;t find a real fix for this.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>UPDATE:</p>
<p>Interestingly enough even though both are only linked to /usr/lib/libSystem.B.dylib, host is the only one that actually reads /etc/resolv.conf</p>
<p><code>open_nocancel("/etc/resolv.conf\0", 0x0, 0x1B6) = 4 0<br />
fstat64(0x4, 0x7FFF6EDCCF38, 0x7FFF6EDCCFFC) = 0 0<br />
read_nocancel(0x4, "#\n# Mac OS X Notice\n#\n# This file is not used by the host name and address resolution\n# or the DNS query routing mechanisms used by most processes on\n# this Mac OS X system.\n#\n# This file is automatically generated.\n#\nsearch office.verticalscope.com vertic", 0x1000) = 305 0<br />
</code></p>
<p>And as the file itself would indicate, host is using the traditional unix resolver and the apple &#8216;custom&#8217; one is broken. Sad.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makingitscale.com/2011/broken-search-domain-resolution-in-osx-lion.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Appliance Revenue Inflation</title>
		<link>http://www.makingitscale.com/2011/appliance-revenue-inflation.html</link>
		<comments>http://www.makingitscale.com/2011/appliance-revenue-inflation.html#comments</comments>
		<pubDate>Wed, 13 Jul 2011 13:47:37 +0000</pubDate>
		<dc:creator>Brandon Seibel</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Rants]]></category>
		<category><![CDATA[backup appliance]]></category>
		<category><![CDATA[backups]]></category>
		<category><![CDATA[barracuda]]></category>
		<category><![CDATA[consumer hardware]]></category>
		<category><![CDATA[hardware support]]></category>
		<category><![CDATA[open source software]]></category>
		<category><![CDATA[pricing model]]></category>
		<category><![CDATA[software raid]]></category>
		<category><![CDATA[support model]]></category>
		<category><![CDATA[warranty]]></category>

		<guid isPermaLink="false">http://www.makingitscale.com/?p=360</guid>
		<description><![CDATA[We&#8217;ve been using the Barracuda Backup appliance for a few years now primarily to provide us with a 3rd party source for storing backups that aren&#8217;t physically removable by our own employees, effectively backups for disaster recovery purposes only. They can send us hard disks of our content in the unfortunate event that we require it. Great. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-365" title="Screen shot 2011-07-13 at 9.48.49 AM" src="http://www.makingitscale.com/wp-content/uploads/2011/07/Screen-shot-2011-07-13-at-9.48.49-AM-300x220.png" alt="" width="300" height="220" />We&#8217;ve been using the Barracuda Backup appliance for a few years now primarily to provide us with a 3rd party source for storing backups that aren&#8217;t physically removable by our own employees, effectively backups for disaster recovery purposes only. They can send us hard disks of our content in the unfortunate event that we require it. Great.</p>
<p>Now for all the great safety-net like services this provides us, unfortunately their implementation and support model is a bit out of whack. The only way to make use of this off site storage for your backups is via their appliance, which also must store local copies of the backups to be sent off site, so in reality your off-site backups are somewhat tied to your local backup machine functioning, sure, I can accept this. Enter their hardware/support pricing model:</p>
<p>What you&#8217;re paying for.</p>
<ul>
<li>A box full of mostly consumer hardware</li>
<li>Slow&#8217;ish Celeron CPU</li>
<li>2G of ram</li>
<li>4 or more enterprise grade disks</li>
</ul>
<div>All of this is running on linux using mostly open source software. Yes of course we could have built this ourselves for much cheaper, but no then I&#8217;ll have access in order to manage it and what if I or anyone else on my team go rogue? bye bye backups. Moving on, here is the slightly mind boggily bit, they&#8217;re using software raid in a configuration that causes the box to hang on  IO if any one of the disks goes bad. Not so good, but they can just send us a replacement disk we swap it out and all will be back to normal right? Wrong.</div>
<p></p>
<div>Here are the options if you&#8217;re out of their 1 year warranty:</div>
<div>
<ol>
<li>Buy our instant replacement plan for the low price of $2100 for 2 years. (aka, please pay for this hardware 4 times over for the opportunity to get a new one in the case something goes wrong)</li>
<li>Send it in for repair for $700 (not including shipping)</li>
</ol>
</div>
<p></p>
<div>So lets see, to replace a $100 disk costs $700, or approximately $2400/hr of someones time. Damn, I didn&#8217;t know computer repair could be so lucrative!</div>
<div>The unfortunate part is that all of the big name companies that use this product are all willing to pay whatever the hell they ask for without question, so no wonder they get away with it.</div>
<div>I won&#8217;t mention the seemingly archaic way they actually perform backups, nor the obviously missing features that havent been added in almost 2 years. For now it works &#8216;good enough&#8217; for disaster recovery purposes, all of our time sensitive data is backed up by other means anyway.</div>
<div>End rant.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.makingitscale.com/2011/appliance-revenue-inflation.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cloud Foundry and Open Source PaaS</title>
		<link>http://www.makingitscale.com/2011/cloud-foundry-and-open-source-paas.html</link>
		<comments>http://www.makingitscale.com/2011/cloud-foundry-and-open-source-paas.html#comments</comments>
		<pubDate>Tue, 26 Apr 2011 14:14:01 +0000</pubDate>
		<dc:creator>Brandon Seibel</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Scaling]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[cloud foundry]]></category>
		<category><![CDATA[common interface]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[hardware infrastructure]]></category>
		<category><![CDATA[open source community]]></category>
		<category><![CDATA[paas]]></category>
		<category><![CDATA[platform]]></category>
		<category><![CDATA[platform as a service]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[sinatra]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://www.makingitscale.com/?p=348</guid>
		<description><![CDATA[Cloud Foundry was recently unveiled by VMWare at JAX in London and given the recent failings of other cloud hosting providers I think timing couldn&#8217;t have been better. What do you do when you&#8217;ve built your entire infrastructure on one vendors &#8216;cloud&#8217;? You&#8217;ve tied in all of their API&#8217;s into your application to make the [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-349" title="Cloud Foundry Logo" src="http://www.makingitscale.com/wp-content/uploads/2011/04/VMW-LGO-CloudFoundry-217-square-300x300.png" alt="" width="300" height="300" /><a href="http://www.cloudfoundry.com">Cloud Foundry</a> was recently unveiled by VMWare at JAX in London and given the recent failings of other cloud hosting providers I think timing couldn&#8217;t have been better.</p>
<p>What do you do when you&#8217;ve built your entire infrastructure on one vendors &#8216;cloud&#8217;? You&#8217;ve tied in all of their API&#8217;s into your application to make the most of the proprietary features their cloud provides. But what happens when there&#8217;s a catastrophic failure and your business is offline for days. Sure you probably should have spent the extra money to ensure that even the partial outage didn&#8217;t take you down completely, but not everyone has the money to be able to do that.</p>
<p>I&#8217;m sure theres a few CTO&#8217;s and VP&#8217;s out there that would have taken this recent outage as a sign to consider your alternatives. But what alternatives do you have when your application is so tightly relying on CloudA&#8217;s feature set? Well hopefully Cloud Foundry starts to solve this problem. Sure you won&#8217;t be migrating your existing application today, but hopefully the idea of a fully open source standard to cloud deployment with no restrictions on what services your cloud can provide will begin to change the landscape a bit.</p>
<p>What Cloud Foundry brings to the table is the idea that there is an open common interface for creating, managing and deploying your application backed by the open source community to help add support for new languages, services and features. Suppose your business doesn&#8217;t let you host your applications in a public cloud, well now you have an open source &#8216;cloud&#8217; alternative that lets you leverage the simplicity of deployment and scalability that the cloud environment provides while still keeping the hardware infrastructure in house.</p>
<div id="attachment_351" class="wp-caption aligncenter" style="width: 235px"><img class="size-medium wp-image-351" title="Cabinet of Servers" src="http://www.makingitscale.com/wp-content/uploads/2011/04/IMG_20100728_171944-225x300.jpg" alt="" width="225" height="300" /><p class="wp-caption-text">Look Ma, My own cloud.</p></div>
<p style="text-align: center;">&nbsp;</p>
<p>Out of the box there is already support for a lot of common frameworks, services and languages. Spring and Grails for Java apps, Rails and Sinatra for Ruby, Node.js apps even. The basic services including MySQL plus some newer ones like Redis and MongoDB. I&#8217;m sure now that the source code is out there we&#8217;ll very quickly see support for more.</p>
<p>In a recent <a href="http://blog.cloudfoundry.com/post/4754582920/cloud-foundry-open-paas-deep-dive">blog post</a> they discuss the core of the software called VCAP which is claimed to be completely distributed, redundant and allows for hot-scaling of your &#8216;cloud&#8217; which is something I can appreciate. I&#8217;m only slightly disappointed that they decided to use Ruby as a language to write this in, mostly for personal reasons as I simply detest the language. But the idea intrigues me enough that I might just have to get over it.</p>
<p>Another thing that may need to be sorted out is the ability to get your data out of one of these clouds as it doesn&#8217;t seem that there is any quick and dirty way of exporting your MySQL databases or other data stores yet (mind you I havent looked heavily into this). Something like this will be key if you want to have the option of moving your applications in the case of major outages and failing service expectations with another provider. Mind you it can be as simple as writing and deploying another app that exports this for you but that seems like a whole lot of effort for something that should be quite simple to accomplish.</p>
<p>In the end I&#8217;m sure we&#8217;ll see how successful VMware is with its open platform as a service idea by the number of new cloud hosting providers that start popping up. Interesting times indeed!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makingitscale.com/2011/cloud-foundry-and-open-source-paas.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Systems Security: US vs UK</title>
		<link>http://www.makingitscale.com/2011/systems-security-us-vs-uk.html</link>
		<comments>http://www.makingitscale.com/2011/systems-security-us-vs-uk.html#comments</comments>
		<pubDate>Tue, 05 Apr 2011 17:42:17 +0000</pubDate>
		<dc:creator>Brandon Seibel</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[basic security]]></category>
		<category><![CDATA[compare]]></category>
		<category><![CDATA[default ports]]></category>
		<category><![CDATA[public keys]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[systems security]]></category>
		<category><![CDATA[uk]]></category>
		<category><![CDATA[us]]></category>

		<guid isPermaLink="false">http://www.makingitscale.com/?p=341</guid>
		<description><![CDATA[Having overseen a fair number of site acquisitions theres a very noticeable trend when it comes to the security practises used on sites hosted in the US versus those hosted overseas. Its common to see servers wide open to the internet with little to no concern for the traffic inbound or outbound; SSH available on [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-343" title="Padlock" src="http://www.makingitscale.com/wp-content/uploads/2011/04/padlock.png" alt="" width="250" height="278" />Having overseen a fair number of site acquisitions theres a very noticeable trend when it comes to the security practises used on sites hosted in the US versus those hosted overseas.</p>
<p>Its common to see servers wide open to the internet with little to no concern for the traffic inbound or outbound; SSH available on the default ports and remote root access enabled. Rarely have I seen many people require explicitly allowing access to administrative ports from our IP addresses, requiring public keys or even requiring a unprivileged account and providing sudo access.</p>
<p>I can almost state the exact opposite for security practises overseas; Is caring about even basic security practises too hard for the American hoster to bother with?</p>
<p>Control Panel products that have been around for ages have had support for these things for quite some time, but why aren&#8217;t they used or set up to be enabled by default at least. Every time I encounter one that is using one of these control panels the feature is left un-configured; Its kind of scary. If hosting companies overseas can do it, surely the US equivalents can too.</p>
<p>I don&#8217;t have too much experience with any Canadian hosting providers but I&#8217;m curious how we stand comparatively.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makingitscale.com/2011/systems-security-us-vs-uk.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why Grails</title>
		<link>http://www.makingitscale.com/2011/why-grails.html</link>
		<comments>http://www.makingitscale.com/2011/why-grails.html#comments</comments>
		<pubDate>Fri, 25 Feb 2011 16:11:54 +0000</pubDate>
		<dc:creator>Brandon Seibel</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[business intelligence]]></category>
		<category><![CDATA[compass]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[instant gratification]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[rapid development]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[searchable]]></category>
		<category><![CDATA[spring framework]]></category>
		<category><![CDATA[web application]]></category>

		<guid isPermaLink="false">http://www.makingitscale.com/?p=332</guid>
		<description><![CDATA[Over the course of the last month or so I&#8217;ve been working intensively on a new piece of software for VerticalScope that allows us to very easily and quickly see the goings-on across all of our owned properties with a wide variety of metrics to choose from, in effect this software is bringing some business [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.makingitscale.com/wp-content/uploads/2010/12/Grails_logo.png"><img class="size-full wp-image-317 alignright" title="Grails_logo" src="http://www.makingitscale.com/wp-content/uploads/2010/12/Grails_logo.png" alt="" width="163" height="43" /></a>Over the course of the last month or so I&#8217;ve been working intensively on a new piece of software for VerticalScope that allows us to very easily and quickly see the goings-on across all of our owned properties with a wide variety of metrics to choose from, in effect this software is bringing some business intelligence to our organization. The first release of this web application was completed in just shy of 4 weeks using Grails.</p>
<p>So why Grails you ask? Well a few reasons to start:</p>
<ul>
<li>It runs on the JVM, probably the most advanced, stable, and fastest (for a non-natively compiled code) piece of software around.</li>
<li>Groovy: a fully java language compatible less-verbose JVM language</li>
<li>Hibernate: The de-facto standard when it comes to an ORM</li>
</ul>
<p>Together this means some seriously rapid development.</p>
<p>So thats all well and good but the real reason why I&#8217;m writing this post is because of the huge number of plugins people have made for the grails framework. If you can think of something you need, its pretty likely someone has written something for you already.</p>
<p>So why use plugins when you can just use the libraries themselves? Well the nice thing about the Spring framework that Grails bases itself upon is that plugins are able to inject functionality into your domain classes automatically, bringing you instant gratification when it comes to library usage.</p>
<p>For example, I recently wanted to allow searching through the gobs of data I&#8217;m collecting in an easy and maintainable way. The first thing I do is look through the plugin repository for any plugins that may do this for me and it turns out there is, &#8220;searchable&#8221;!</p>
<p>Simply by installing this plugin and adding  a single static property to any of my domain classes that I would like to be indexed I get an extremely powerful Compass/Lucene powered search engine with almost no effort. With a little more effort I can create complex mappings that allow searches to return relavent objects associated with the root result set with ease.</p>
<p>Example:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">static</span> searchable <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
        name boost<span style="color: #339933;">:</span> <span style="color: #cc66cc;">2.0</span>
        site component<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">true</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>This really exemplifies the Grails doctrine of convention over configuration. That closure in my domain class automatically configures searchable to say that the name property gets a bit more priority in results and that the reference to the site domain model is a component of this one, so I will get results for it as well when this node is matched in a search.</p>
<p>So how do you perform a search? Suppose I want to now search through a particular set of instances of a Domain class, thanks to the method injection I now have a &#8220;search&#8221; method added to all of my domain classes. I simply:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">MyDomain.<span style="color: #006633;">search</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;my string&quot;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Wow that was easy, heh.<br />
&nbsp;</p>
<p>Total time to implement site wide search? 15 minutes.</p>
<p>Thats why.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makingitscale.com/2011/why-grails.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Object Caching 883/1094 objects using apc

Served from: www.makingitscale.com @ 2012-05-19 10:33:01 -->
