<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Sidnei Silva</title>
	<atom:link href="https://blog.sidneidasilva.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.sidneidasilva.com</link>
	<description></description>
	<lastBuildDate>Sat, 01 Feb 2014 22:58:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.sidneidasilva.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://secure.gravatar.com/blavatar/042c4a10e63814ac5463185febc7f6ea91fd037f5086567e263f8b95872d9c45?s=96&#038;d=https%3A%2F%2Fs0.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Sidnei Silva</title>
		<link>https://blog.sidneidasilva.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://blog.sidneidasilva.com/osd.xml" title="Sidnei Silva" />
	<atom:link rel='hub' href='https://blog.sidneidasilva.com/?pushpress=hub'/>
	<item>
		<title>Life, reset.</title>
		<link>https://blog.sidneidasilva.com/2014/02/01/life-reset/</link>
					<comments>https://blog.sidneidasilva.com/2014/02/01/life-reset/#comments</comments>
		
		<dc:creator><![CDATA[Sidnei]]></dc:creator>
		<pubDate>Sat, 01 Feb 2014 22:58:25 +0000</pubDate>
				<category><![CDATA[google]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[swissed]]></category>
		<category><![CDATA[work]]></category>
		<guid isPermaLink="false">http://blog.sidneidasilva.com/?p=539</guid>

					<description><![CDATA[As mentioned on my last blog post, I&#8217;ve just completed 5 years at Canonical, and this is an year of many more milestones. My time at Canonical could only be described as excellent, and with the kids just past 3 years old, personal life has been getting back on track again. We moved to a [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>As mentioned on my <a href="https://blog.sidneidasilva.com/2014/01/07/five-years-ago-today/">last blog post</a>, I&#8217;ve just completed 5 years at Canonical, and this is an year of many more milestones.</p>
<p>My time at Canonical could only be described as excellent, and with the kids just past 3 years old, personal life has been getting back on track again. We moved to a larger apartment mid-2012. Kids started going to day care in early 2013, which gave me some calm afternoons to focus on work. We finished paying our car. Things suddenly got&#8230; too comfortable.</p>
<p>The loss of Dorneles, <a href="https://blog.sidneidasilva.com/2011/02/14/unfinished-life-of-a-sushi-lover/">just short of three years ago</a>, affected me in ways that were not fully apparent. I became more introspective and spent way too much time thinking about how short our life truly is, and how our plans, if not executed, end up being just that&#8230; plans. Not too long before his accident, Dorneles was talking about moving to Norway with his family, a plan that never had the chance to be executed.</p>
<p>For many years I, too, planned to move abroad, but never had the courage to do so. And then other things go in the way. Finishing university, having kids, Daiane being too attached to her parents, and so on.</p>
<p>Suddenly, an opportunity popped up. A chance to reset everything. Start a new life, in a new country, with a new job. It seemed too good to be true. And indeed, we spent countless nights debating the pros and cons to no avail. Nothing could tip the scale in either direction.</p>
<p>Truth is, more than not having a good reason to take the opportunity, we lacked a really good reason not to take the opportunity, other than fear. Mighty, paralyzing fear. We went over the pros once more: kids are the right age, our parents are still young and can care for themselves for a few years, if everything goes wrong we still have a home we can come back to, and so on. And then we thought of Dorneles again, and that tipped the scale big time.</p>
<p>Since last Tuesday, we&#8217;re now living in Zürich. As of next Monday, I&#8217;ll be one more piece in the well oiled <a href="http://google.com">Chocolate Factory</a>.</p>
<p>As someone that&#8217;s quite adverse to change, a small town boy that always lived in the same city, I still get shivers down my spine every time I think about the effects of this decision on my own life, and the life of my kids and relatives. There&#8217;s really no way to know if it was the right decision or not, but my wife keeps telling me that it is much better to try and fail, than not try and regret.</p>
<p>So there it is: life, reset. A clean slate. Let&#8217;s make this a beautiful and memorable journey.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.sidneidasilva.com/2014/02/01/life-reset/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/38249bf282a7c862259c9ac3fa5e19e22166727e8f6e2fe209901ecf21c20f80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidnei</media:title>
		</media:content>
	</item>
		<item>
		<title>Five years ago today&#8230;</title>
		<link>https://blog.sidneidasilva.com/2014/01/07/five-years-ago-today/</link>
					<comments>https://blog.sidneidasilva.com/2014/01/07/five-years-ago-today/#respond</comments>
		
		<dc:creator><![CDATA[Sidnei]]></dc:creator>
		<pubDate>Tue, 07 Jan 2014 23:53:21 +0000</pubDate>
				<category><![CDATA[canonical]]></category>
		<guid isPermaLink="false">http://blog.sidneidasilva.com/?p=528</guid>

					<description><![CDATA[ (reposting from G+, originally on Jan 5th) Subject: You have been added to canonical Hello Sidnei da Silva, James Troup (elmo) added you as a member of Canonical (canonical). &#60;https://launchpad.net/~canonical&#62; Regards, The Launchpad team My involvement with Canonical actually started much earlier than this. Back in 2004 I noticed Steve Alexander connecting to an IRC channel from a brazilian IP. [&#8230;]]]></description>
										<content:encoded><![CDATA[<div> (reposting from G+, originally on Jan 5th)</div>
<blockquote>
<div>Subject: You have been added to canonical</p>
<p>Hello Sidnei da Silva,</p>
<p><a href="https://plus.google.com/103071342591446097524">James Troup</a> (elmo) added you as a member of Canonical (canonical).<br />
&lt;<a href="https://launchpad.net/~canonical" target="_blank" rel="nofollow">https://launchpad.net/~canonical</a>&gt;</p>
<p>Regards,<br />
The Launchpad team</p>
</div>
</blockquote>
<div>My involvement with <a href="https://plus.google.com/116469902245452284818">Canonical</a> actually started much earlier than this. Back in 2004 I noticed <a href="https://plus.google.com/116006068297197522922">Steve Alexander</a> connecting to an IRC channel from a brazilian IP. Curious, I asked what he was doing here and to my surprise he was at Debconf, in Porto Alegre. I rushed there to meet him, since we hadn&#8217;t met in person before, and ended up meeting some of the first Canonical employees.</div>
<div>Actually, Canonical didn&#8217;t even had a proper name back them, I believe. And neither did Ubuntu. In the room were a bunch of Launchpad developers, and I remember they were putting up suggestions for the name of the soon-to-be-created Debian-derivative distro in a blackboard. Maybe someone has a picture. I certainly should have snapped one.One of the libraries I had created was being heavily used by Launchpad, and Steve invited me to join the team. Unfortunately I had just started at a new job a couple months before. And the whole &#8216;we are going to create a new distribution based on Debian&#8217; sounded kind of bonkers anyway. I ended up referring <a href="https://plus.google.com/104848459013180627211">Christian Reis</a>, which as I learnt later managed to meet Steve and <a href="https://plus.google.com/116812394236590806058">Mark Shuttleworth</a> at the airport in Guarulhos in between flights.</p>
<p>Regardless, I stuck around to see Mark&#8217;s talk on his space trip. The most impressive part was definitely his description about reentering Earth&#8217;s atmosphere. Since young age I always dreamt of being an Astronaut. Meeting one in person was probably the most significant event in my life until that point.</p>
<p>Time passed, and Kiko tried to convince me several times to join the Launchpad team in the years that followed. The only reason that I didn&#8217;t do so was because he wanted me to move to his town, Sao Carlos &#8211; SP, even though most of the Launchpad team was distributed.</p>
<p>Fast forward a couple years, and I decided it was time to move on from my job at Enfold Systems, where I was responsible for maintaining several products that integrated the Plone CMS with the Windows platform. What a bold change it was, going from being practically a Windows developer to working with the company behind a Linux distribution.</p>
<p>My time at Canonical started with a ride from Porto Alegre to Curitiba with <a href="https://plus.google.com/107994348420168435683">Gustavo Niemeyer</a>, my soon-to-be boss. We actually had to take a long detour all the way to Lages because BR-101 flooded near Ararangua. Luckily Gustavo had his GPS with him.</p>
<p><a href="https://blog.sidneidasilva.com/wp-content/uploads/2014/01/dsc07308.jpg"><img data-attachment-id="530" data-permalink="https://blog.sidneidasilva.com/2014/01/07/five-years-ago-today/dsc07308/" data-orig-file="https://blog.sidneidasilva.com/wp-content/uploads/2014/01/dsc07308.jpg" data-orig-size="1600,1067" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;8&quot;,&quot;credit&quot;:&quot;Picasa&quot;,&quot;camera&quot;:&quot;DSC-W90&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1231083312&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.8&quot;,&quot;iso&quot;:&quot;400&quot;,&quot;shutter_speed&quot;:&quot;0.016666666666667&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Me and Gustavo in Curitiba, 2009" data-image-description="" data-image-caption="" data-medium-file="https://blog.sidneidasilva.com/wp-content/uploads/2014/01/dsc07308.jpg?w=300" data-large-file="https://blog.sidneidasilva.com/wp-content/uploads/2014/01/dsc07308.jpg?w=640" class="aligncenter size-medium wp-image-530" alt="Me and Gustavo in Curitiba, 2009" src="https://blog.sidneidasilva.com/wp-content/uploads/2014/01/dsc07308.jpg?w=300&#038;h=200" width="300" height="200" srcset="https://blog.sidneidasilva.com/wp-content/uploads/2014/01/dsc07308.jpg?w=300 300w, https://blog.sidneidasilva.com/wp-content/uploads/2014/01/dsc07308.jpg?w=600 600w, https://blog.sidneidasilva.com/wp-content/uploads/2014/01/dsc07308.jpg?w=150 150w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Under Gustavo&#8217;s lead I worked on the Landscape project, a tool to manage Ubuntu servers and keep them up-to-date. We mostly worked on database scalability issues until Gustavo left the team to spearhead what later came to be known as <a href="https://plus.google.com/103184405956510785630">juju</a>. After that I ended up working closely with Canonical&#8217;s Design team on a major facelift for Landscape and leading the team&#8217;s effort in frontend engineering, ensuring fast load times on one side and enforcing strict Javascript testing on the other.</p>
<p>As the facelift started winding down I started focusing on gathering a good set of backend metrics, of which we had none. I introduced the use of Graphite to the team, which unfortunately didn&#8217;t hit production in time. I created <a href="https://github.com/sidnei/txstatsd">txStatsD</a> in the process. I wanted to learn more about how things actually worked in production, how things were deployed, and if there was anything we could do to improve. The right opportunity revealed itself in the form of an open position as Operations Engineer at the <a href="https://plus.google.com/101604387022354574903">Ubuntu One</a> team.</p>
<p>In Ubuntu One, they already had Graphite running in production, with a minimal set of metrics. So we started adding more and more, and the more we added, the more production issues we uncovered and fixed. I had my first real taste of a metrics-driven operations process and nothing could stop me from wanting more.</p>
<p>A couple years later, and all the hard work paid for itself. We went from being the group with most production incidents and recurring issues to being a reference within the company. Trailblazers in DevOps, so to speak. Services that were deemed complete failures and ripe for a rewrite from scratch got ironed out until they ran smoothly for months without incidents. We were amongst the first to put Juju in production and are probably the team with most Juju-deployed production services to date. We got the new app store for Ubuntu Touch from nothing into a Juju-deployed production service just a couple months.</p>
<p>It has been an amazing ride. I&#8217;ve traveled to many countries and met some of the brightest people I&#8217;ve had the chance to work with. I&#8217;m really proud of what we accomplished as a team, and what Canonical has accomplished as a whole. I have faith that 2014 and the years to come will only see more and more of that.</p>
<p>To me and Daiane, 2014 is a year full of milestones. 5 years at Canonical, 10 since I first heard of it. She is turning 30 in March, also the month we complete 10 years of being married. In June we&#8217;re celebrating 15 years together (yes, we started dating when she was just 15!). 2014 also marks 10 years since we&#8217;ve traveled together through Austria, Germany and the Czech Republic, and the stories from that trip are among the most memorable we had.</p>
<p>This year we want to do great things, like we did in 2004. Things that we&#8217;ll be talking about for the next 10 years and even longer. Shake off the dust and blaze new trails. Get out our comfort zone. We&#8217;ve got some changes lined up, but this is not the appropriate time to talk about them yet.</p>
<p>Stay tuned, and wish us luck!</p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.sidneidasilva.com/2014/01/07/five-years-ago-today/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/38249bf282a7c862259c9ac3fa5e19e22166727e8f6e2fe209901ecf21c20f80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidnei</media:title>
		</media:content>

		<media:content url="https://blog.sidneidasilva.com/wp-content/uploads/2014/01/dsc07308.jpg?w=300" medium="image">
			<media:title type="html">Me and Gustavo in Curitiba, 2009</media:title>
		</media:content>
	</item>
		<item>
		<title>Improving the state of art in container cloning</title>
		<link>https://blog.sidneidasilva.com/2013/10/28/improving-the-state-of-art-in-container-cloning/</link>
					<comments>https://blog.sidneidasilva.com/2013/10/28/improving-the-state-of-art-in-container-cloning/#comments</comments>
		
		<dc:creator><![CDATA[Sidnei]]></dc:creator>
		<pubDate>Mon, 28 Oct 2013 20:58:06 +0000</pubDate>
				<category><![CDATA[canonical]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[juju]]></category>
		<category><![CDATA[lvm]]></category>
		<category><![CDATA[lxc]]></category>
		<guid isPermaLink="false">http://blog.sidneidasilva.com/?p=459</guid>

					<description><![CDATA[Since early August I&#8217;ve been looking at improving the state of the art in container cloning with an ultimate goal of making Juju faster when used in a local provider context, which happens to be where I spend most of my days lately. For those who don&#8217;t know, the local provider in Juju uses LXC [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Since early August I&#8217;ve been looking at improving the state of the art in container cloning with an ultimate goal of making <a href="https://bugs.launchpad.net/juju-core/+bug/1203291">Juju faster when used in a local provider context</a>, which happens to be where I spend most of my days lately. For those who don&#8217;t know, the local provider in Juju uses LXC with the LXC-provided &#8216;ubuntu-cloud&#8217; template in order to provide an environment that&#8217;s as similar as possible to provisioning a cloud instance elsewhere.</p>
<p>In looking at the various storage backends supported by LXC and experimenting with each of them, I&#8217;ve stumbled on various issues, from broken inotify support in overlayfs to random timing issues deleting btrfs snapshots. Eventually I&#8217;ve discovered the holy grail of LVM Thin Provisioning and started working on a <a href="https://github.com/lxc/lxc/pull/33">patch to LXC</a> which would allow it to create volumes in a thin provisioned pool. In the meantime, Docker announced their intent of adding <a href="http://blog.docker.io/2013/09/red-hat-and-docker-collaborate/">support for LVM Thin Provisioning</a> too. I&#8217;m happy to announce that the work I started in August is now merged into LXC as various separate pull requests (<a href="https://github.com/lxc/lxc/pull/67">#67</a>, <a href="https://github.com/lxc/lxc/pull/70">#70</a>, <a href="https://github.com/lxc/lxc/pull/72">#72</a>, <a href="https://github.com/lxc/lxc/pull/74">#74</a>) and is already available in <a href="https://launchpad.net/~ubuntu-lxc/+archive/daily">the LXC Daily PPA</a>. I&#8217;ve even created a Gist <a href="https://gist.github.com/sidnei/7041338">showing how to use it</a>.</p>
<p>As pointed out by a colleague today, Thin Provisioning support should <a href="http://community.redhat.com/adventures-in-dockerland/">soon land in Docker itself</a>. I applaud the initiative, and am really looking forward to seeing this feature land in Docker. I wish though there was a little more coordination going on to get that work upstreamed into LXC instead, to the benefit of everyone. Regardless, I&#8217;m committed to make sure that the differences between whatever ends up landing in Docker and what I&#8217;ve added to LXC eventually converge. One such difference is that I&#8217;ve simply shelled out to the &#8216;lvs&#8217; command while Alexander is using libdevmapper directly, something I&#8217;ve looked at doing but felt a little over my head. I&#8217;ve also haven&#8217;t got around to making the filesystem default to ext4 with DISCARD support yet, but that&#8217;s on the top of my list.</p>
<p>So without much ado, let&#8217;s look at an example with a loopback-mounted device backed by a sparse-allocated file.</p>
<pre>$ sudo fallocate -l 6G /tmp/lxc
$ sudo losetup -f /tmp/lxc
$ sudo pvcreate /dev/loop0
$ sudo vgcreate lxc /dev/loop0</pre>
<div id="file-lxc-thin-provisioning-LC5">Nothing special so far, simply a 6G sparse file, mounted loopback and then a VG named &#8216;lxc&#8217; is created within it. Now the next step, creating the Thin Provisioning Pool. The size of the LV cannot be specified as 100%FREE because some space needs to be left for the LV metadata:</div>
<pre>$ sudo lvcreate -l 95%FREE --type thin-pool --thinpool lxc lxc
$ sudo lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
lxc lxc twi-a-tz- 5.70g 0.00</pre>
<div id="file-lxc-thin-provisioning-LC10">Now if you have a recent enough LXC as the one from the PPA above, creating a LVM-backed LXC container should default to creating a Thin Provisioned volume on the thinpool named &#8216;lxc&#8217;, so the command is pretty simple:</div>
<pre id="file-lxc-thin-provisioning-LC11">$ sudo lxc-create -n precise-template -B lvm --fssize 8G -t ubuntu-cloud -- -r precise
$ sudo lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
lxc lxc twi-a-tz- 5.70g 17.38
precise-template lxc Vwi-a-tz- 7.81g lxc 12.67</pre>
<div id="file-lxc-thin-provisioning-LC17">If you wanted to use a custom named thin pool, that&#8217;s also possible by specifying the &#8216;&#8211;thinpool&#8217; command line argument.</div>
<div></div>
<div>Now, how fast is it to create a clone of this container? Let&#8217;s see.</div>
<pre id="file-lxc-thin-provisioning-LC18">$ time sudo lxc-clone -s precise-template precise-copy
real 0m0.276s
user 0m0.021s
sys 0m0.085s</pre>
<p>Plenty fast I say. What does the newly created volume looks like?</p>
<pre><span style="font-family:'Courier 10 Pitch', Courier, monospace;font-size:13px;font-style:normal;line-height:1.5;">$ sudo lvs
</span>LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
lxc lxc twi-a-tz- 5.70g 17.44
precise-copy lxc Vwi-a-tz- 7.81g lxc precise-template 12.71
precise-template lxc Vwi-a-tz- 7.81g lxc 12.67</pre>
<p>Not only cloning the container was super fast, but it also barely used any new data in the &#8216;lxc&#8217; thin pool.</p>
<p>The result of this work should soon make it&#8217;s way into Juju and, I hope, Docker, either via Alexander&#8217;s work or some other way. If you&#8217;re into Docker or a more hardcore LXC user, I hope you enjoy this feature and make good use of it.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.sidneidasilva.com/2013/10/28/improving-the-state-of-art-in-container-cloning/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/38249bf282a7c862259c9ac3fa5e19e22166727e8f6e2fe209901ecf21c20f80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidnei</media:title>
		</media:content>
	</item>
		<item>
		<title>A tale of four proxies</title>
		<link>https://blog.sidneidasilva.com/2013/06/06/a-tale-of-four-proxies/</link>
					<comments>https://blog.sidneidasilva.com/2013/06/06/a-tale-of-four-proxies/#respond</comments>
		
		<dc:creator><![CDATA[Sidnei]]></dc:creator>
		<pubDate>Thu, 06 Jun 2013 15:07:58 +0000</pubDate>
				<category><![CDATA[canonical]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[wsgi]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Twisted]]></category>
		<guid isPermaLink="false">http://blog.sidneidasilva.com/?p=451</guid>

					<description><![CDATA[As part of my job as Operations Engineer on the Ubuntu One team, I&#8217;m constantly looking for ways to improve the reliability and operational efficiency of the service as a whole. Very high on my list of things to fix I have an item to look into Vaurien, and make some tweaks to the service [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>As part of my job as Operations Engineer on the Ubuntu One team, I&#8217;m constantly looking for ways to improve the reliability and operational efficiency of the service as a whole.</p>
<p>Very high on my list of things to fix I have an item to look into <a title="Vaurien" href="https://github.com/mozilla-services/vaurien">Vaurien</a>, and make some tweaks to the service to cope better with outages in other parts of the system.</p>
<p>As you probably realized by now if you&#8217;re somehow involved into the design and maintenance of any kind of distributed systems, <a title="network partitions are a big deal" href="http://aphyr.com/posts/288-the-network-is-reliable">network partitions are a big deal</a>, and we&#8217;ve had some of those affect our service in the past, some with very interesting effects.</p>
<p>Take our application servers for example. They&#8217;ve been through many generations of rewrites, and switches from one WSGI server to another in the past (not long before I joined the team), each of them with a particular issue. Either they didn&#8217;t scale, or crashed constantly, or had memory leaks. Or maybe none of those (it was before I joined the team, so I wouldn&#8217;t know for sure). By the time I joined, <a title="Paste" href="http://pythonpaste.org/">Paste</a>, of all the things, was one of the WSGI servers in use in part of the service, and <a title="Twisted WSGI" href="http://twistedmatrix.com/documents/12.3.0/web/howto/web-in-60/wsgi.html">Twisted WSGI</a> was used in another part.</p>
<p>(The actual setup of those services is very interesting on itself. It&#8217;s a mix of Twisted and Django (and <a title="many others" href="https://www.google.com/search?q=twisted+django">many others</a> have done this before, so it&#8217;s not very unique. But there are internal details which are quite interesting. More below.)</p>
<p>Having moved from another team that used Twisted heavily, I decided to call it out and settle on Twisted WSGI, which seemed just fine.</p>
<p>As for the stability and memory issues, we started ironing them out one by one. Turns out the majority of the problems had nothing to do with the WSGI server itself, but everything to do with not cleaning up resources correctly, be it temporary files, file descriptors, and cycles between <a title="producers and consumers" href="http://twistedmatrix.com/documents/12.3.0/core/howto/producers.html">producers and consumers</a>.</p>
<p>And everything was perfect.</p>
<p>But then we got a few networking issues and hardware issues. Some of the servers were eventually moved to a different datacenter and things got even more interesting. I&#8217;ll go into the details of the specific problems that I&#8217;m hoping to approach with Vaurien on a different post, but suffice to say that talking to many external services in a threaded server doesn&#8217;t get pretty when there&#8217;s a network blip.</p>
<p>So speaking of threaded and Twisted, and coming to the subject of this post.</p>
<p>In front of a subset of our services we currently have 4 HAProxy instances in different servers. They are all set up to use <em>httpchk</em> every 2 seconds, which by default sends an <em>OPTIONS</em> request to &#8216;/&#8217;. If you&#8217;re still following, we have a Django app running there, and depending on how you have your Django app configured, it might just take that <em>OPTIONS</em> request and treat it just like a <em>GET</em>, effectively (in our case) rendering a response just as if a normal browser had requested it. Turns out that page is not particularly lean in our case.</p>
<p>So you take 4 servers, effectively doing a <em>GET</em> request to your homepage every 2s each one, times many processes serving that page across a couple hosts, and you have a full plate for someone looking for things to optimize.</p>
<p>To make it more fun, early on I added monitoring of the thread pool used by Twisted WSGI, sending metrics to Graphite. Whenever we had a network blip we saw the queue growing and growing without bound. This was actually a combination of a couple things, which I&#8217;m still working on fixing:</p>
<ol>
<li>HAProxy will keep triggering the httpchk after the service is taken out of rotation.</li>
<li>Twisted WSGI will keep accepting requests and throwing them in the thread pool queue, even if the thread pool is busy and the queue is building up.</li>
<li>We do a terrible job at timing out connections to external services currently so a minor blip can easily cause the thread pool queue to build up.</li>
</ol>
<p>As a strategy to alleviate that problem I came up with the following solution:</p>
<ol>
<li>Implement a custom thread pool that triggers a callback when going from busy -&gt; free and from free -&gt; busy (where busy is defined as: there are more requests queued than idle threads).</li>
<li>Changed the response to the HAProxy <em>httpchk</em> to simply check that busy/free state.</li>
<li>Changed the handling of that HAProxy check to *not* go through the thread pool.</li>
</ol>
<p>(There&#8217;s a few more details that I won&#8217;t get into in this post, but that&#8217;s the high-level summary.)</p>
<p>I have good confidence that this will fix (or at least alleviate) the main issue, which is the queue growing without bounds in the thread pool, and it will instead move the queueing to HAProxy. But after looking through the metrics today I saw an unintended consequence of the changes.</p>
<p><a href="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/busy-threads.png"><img data-attachment-id="452" data-permalink="https://blog.sidneidasilva.com/2013/06/06/a-tale-of-four-proxies/busy-threads/" data-orig-file="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/busy-threads.png" data-orig-size="800,360" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="busy-threads" data-image-description="" data-image-caption="" data-medium-file="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/busy-threads.png?w=300" data-large-file="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/busy-threads.png?w=640" class="aligncenter size-medium wp-image-452" alt="busy-threads" src="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/busy-threads.png?w=300&#038;h=135" width="300" height="135" srcset="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/busy-threads.png?w=300 300w, https://blog.sidneidasilva.com/wp-content/uploads/2013/06/busy-threads.png?w=600 600w, https://blog.sidneidasilva.com/wp-content/uploads/2013/06/busy-threads.png?w=150 150w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p><a href="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/load-avg.png"><img data-attachment-id="453" data-permalink="https://blog.sidneidasilva.com/2013/06/06/a-tale-of-four-proxies/load-avg/" data-orig-file="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/load-avg.png" data-orig-size="800,360" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="load-avg" data-image-description="" data-image-caption="" data-medium-file="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/load-avg.png?w=300" data-large-file="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/load-avg.png?w=640" class="aligncenter size-medium wp-image-453" alt="load-avg" src="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/load-avg.png?w=300&#038;h=135" width="300" height="135" srcset="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/load-avg.png?w=300 300w, https://blog.sidneidasilva.com/wp-content/uploads/2013/06/load-avg.png?w=600 600w, https://blog.sidneidasilva.com/wp-content/uploads/2013/06/load-avg.png?w=150 150w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>In retrospect, it seems fairly obvious that this was to be one of the expected outcomes. I was simply surprised to see it since it was not the immediate goal of the proposed changes, but simply a side effect of them.</p>
<p>I hope you enjoyed this glimpse into what goes on at the heart of my job. I expect to write more about this soon, and maybe explore some of the details that I didn&#8217;t get into, since this post is already too long.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.sidneidasilva.com/2013/06/06/a-tale-of-four-proxies/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/38249bf282a7c862259c9ac3fa5e19e22166727e8f6e2fe209901ecf21c20f80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidnei</media:title>
		</media:content>

		<media:content url="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/busy-threads.png?w=300" medium="image">
			<media:title type="html">busy-threads</media:title>
		</media:content>

		<media:content url="https://blog.sidneidasilva.com/wp-content/uploads/2013/06/load-avg.png?w=300" medium="image">
			<media:title type="html">load-avg</media:title>
		</media:content>
	</item>
		<item>
		<title>Coming back to (social) life</title>
		<link>https://blog.sidneidasilva.com/2013/05/15/coming-back-to-social-life/</link>
					<comments>https://blog.sidneidasilva.com/2013/05/15/coming-back-to-social-life/#comments</comments>
		
		<dc:creator><![CDATA[Sidnei]]></dc:creator>
		<pubDate>Wed, 15 May 2013 16:51:39 +0000</pubDate>
				<category><![CDATA[canonical]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[nical]]></category>
		<category><![CDATA[social]]></category>
		<guid isPermaLink="false">http://blog.sidneidasilva.com/?p=447</guid>

					<description><![CDATA[Due to some unplanned traveling I ended up near the Bay Area last week, more specifically Canonical was holding an internal Cloud Sprint in Oakland, CA, and Martin asked me to participate and push our agenda for the upcoming click packages upload and download services, which need to be live by October at least on [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Due to some unplanned traveling I ended up near the Bay Area last week, more specifically <a href="http://www.canonical.com/">Canonical</a> was holding an internal Cloud Sprint in Oakland, CA, and <a href="http://beuno.com.ar/">Martin</a> asked me to participate and push our agenda for the upcoming <a href="https://lists.ubuntu.com/archives/ubuntu-devel/2013-May/037074.html">click packages</a> upload and download services, which need to be live by October at least on its simplest form. But I&#8217;ll tell you more about that in a separate post.</p>
<p>What I want to share with you today is the joy of being able to connect with old friends and recollect memories, as I mentioned I was longing for in my <a href="https://blog.sidneidasilva.com/2013/03/01/extended-mourning/">last post</a>. In those few days I was in California I managed to catch up with <a href="http://limi.net/">Limi</a> and <a href="https://www.facebook.com/philikon">Philipp</a>, said an en passant hi to <a href="https://www.facebook.com/nonsequitarian">Rob Miller</a> at the Mozilla SF office, had dinner with <a href="http://blog.labix.org/">Gustavo</a>, walked around the city with <a href="http://www.flickr.com/photos/tealeg/8739695178/in/photostream">Fernando, Alberto, and Geoff</a>, ending up at an <a href="http://www.yelp.com/biz/great-eastern-restaurant-san-francisco">amazing Chinese restaurant</a> pretty much by accident, paid a visit to <a href="https://www.facebook.com/mfdutra">Marlon</a>, who took me on a guided tour of the Facebook HQ followed by lunch at <a href="http://locations.thecheesecakefactory.com/ca/san-mateo-156.html">The Cheesecake Factory</a> which I couldn&#8217;t refuse. It was exausting, but really great catching up with everyone!</p>
<p>A recurring topic between all of us was the general issues that all of our companies (Mozilla, Canonical, Facebook) have with general public perception. Most interestingly perhaps is the similarity between Canonical and Facebook when it comes down to privacy matters, how there seems to be a disconnect between the internal and external messaging on those matters, and how much the public perception is biased by the media and the very loud minority of privacy tinfoil hat zealots. I wish I could do more to help with solving that. Perhaps pushing for more transparency, better communication at least from the technical side of things could be a way to improve that.</p>
<p>Tech talks aside, I was simply overwhelmed by how much my kids&#8217; pictures and videos are popular amongst friends. Every single person that I talked to was quick to mention that as the very first thing. Oddly, that generally does not reflect in likes and comments on those Facebook posts, which is an interesting observation. Are people generally afraid of clicking that <strong>Like</strong> link or is it too much effort for them? I&#8217;m sure it would do for a great usability study.</p>
<p>I hope to explore a bit more on the outcome of the sprint on a later post. Suffice to say that I was really glad to be present and contribute some feedback to all the planning that&#8217;s going into the next cycle, and the opportunity to meet some old friends while at it was invaluable. Looking forward to be doing more of that in the coming months, at <a href="http://softwarelivre.org/fisl14">FISL</a> and <a href="http://2013.pythonbrasil.org.br/">PythonBrasil</a>. </p>
<p>As an article I&#8217;ve read yesterday mentioned, we tech heads seem to live on a bubble that mostly bounces between social networks and having post work hours drinks with colleagues, usually from the same company. I wish we could all be more social in the physical world, and talk more about things that are not so tech-related. About life, and family, and non-work things, and enjoy ourselves more.</p>
<p><a href="http://en.wikipedia.org/wiki/Coming_Back_to_Life">And headed straight into the shining sun.</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.sidneidasilva.com/2013/05/15/coming-back-to-social-life/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/38249bf282a7c862259c9ac3fa5e19e22166727e8f6e2fe209901ecf21c20f80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidnei</media:title>
		</media:content>
	</item>
		<item>
		<title>Extended Mourning</title>
		<link>https://blog.sidneidasilva.com/2013/03/01/extended-mourning/</link>
					<comments>https://blog.sidneidasilva.com/2013/03/01/extended-mourning/#comments</comments>
		
		<dc:creator><![CDATA[Sidnei]]></dc:creator>
		<pubDate>Fri, 01 Mar 2013 03:35:39 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dorneles]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[plone]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">http://blog.sidneidasilva.com/?p=400</guid>

					<description><![CDATA[It&#8217;s been more than two years now since I&#8217;ve written anything on this blog. The last thing I wrote was my attempt at summing up all that Dorneles meant to me as a friend and co-worker. It still hurts. Every. Day. I&#8217;ve been carrying on with life. Heads down into work. Enjoying my kids, which [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>It&#8217;s been more than two years now since I&#8217;ve written anything on this blog. The last thing I wrote was my attempt at summing up all that Dorneles meant to me as a friend and co-worker. It still hurts. Every. Day.</p>
<p>I&#8217;ve been carrying on with life. Heads down into work. Enjoying my kids, which just started at daycare (or is afternooncare a word, even?) this week. But it&#8217;s going to hurt for quite some time. I can tell.</p>
<p>I feel like I should be writing more. I feel the need to hang out with old friends again. I might end up going to this year&#8217;s <a href="http://2013.pythonbrasil.org.br/">PythonBrasil</a>/<a href="http://2013.ploneconf.org/">PloneConf</a> one-two combo just for that. Hopefully some of the old-timers like Alan and Limi will be there. It would sure be great to see Paul again, which is apparently confirmed for one of the keynotes.</p>
<p>I actually started this post feeling very nostalgic, and the paragraph above shows. This was after stumbling on Gustavo&#8217;s <a href="http://blog.labix.org/2013/03/01/12-years-ago">12 years ago</a> post. Then I looked at the archive of this blog and found that my oldest post here is from <a href="https://blog.sidneidasilva.com/2003/07/20/cmfweblog-movabletype-and-metaweblog-apis-implemented/">July 20th 2003</a>. Reading forward from there I&#8217;ve revived some really happy memories, and tons of now-broken links. One of the broken links was to one of the oldest traces of me out there, asking for help with <a href="https://www.cslu.ogi.edu/forum/viewtopic.php?t=1154&amp;sid=9289ccd386632b3fbf1af36c97cf7720">Including TCL scripts in the CSLU Toolkit</a>, back in 1999. Here&#8217;s another, from 2005, where I mention <a href="https://blog.sidneidasilva.com/2005/05/05/in-other-news-a-gnome-vfs-for-plone-desktop/">meeting Gustavo in person</a> for the first time. And, the irony. I linked to his LiveJournal blog. :)</p>
<p>I feel much better now.</p>
<p>I should be writing more, and soon. I have lots of things to share, both personally and professionally. I really wish to become more like Dorneles. Not only <a href="http://www.nczonline.net/blog/2013/02/26/what-kind-of-a-software-engineer-do-you-want-to-be-known-as/">fun to work with</a>, but also fun to be around. I want to share more, not only about the things that I do, but also the things that I am. I hope to become a better person in the process, and I hope you can share and enjoy that journey with me.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.sidneidasilva.com/2013/03/01/extended-mourning/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/38249bf282a7c862259c9ac3fa5e19e22166727e8f6e2fe209901ecf21c20f80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidnei</media:title>
		</media:content>
	</item>
		<item>
		<title>Unfinished Life of a Sushi Lover</title>
		<link>https://blog.sidneidasilva.com/2011/02/14/unfinished-life-of-a-sushi-lover/</link>
					<comments>https://blog.sidneidasilva.com/2011/02/14/unfinished-life-of-a-sushi-lover/#comments</comments>
		
		<dc:creator><![CDATA[Sidnei]]></dc:creator>
		<pubDate>Mon, 14 Feb 2011 03:33:48 +0000</pubDate>
				<category><![CDATA[enfold]]></category>
		<category><![CDATA[houston]]></category>
		<category><![CDATA[plone]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">http://blog.sidneidasilva.com/?p=391</guid>

					<description><![CDATA[In the last couple days since our beloved friend Dorneles died in a tragic car accident much has been said about him, both on and offline. Many people remember him from his technical prowess, though he never thought of himself as someone with exceptional programming skills. I know a lot of really brilliant people, both [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>In the last couple days since our beloved friend Dorneles died in a tragic car accident much has been said about him, both on and offline. Many people remember him from his technical prowess, though he never thought of himself as someone with exceptional programming skills. I know a lot of really brilliant people, both in the Python and Plone communities and elsewhere, people that Dorneles himself considered actual heroes, but if there&#8217;s one thing that made him stand out from the rest was his willingness to share knowledge and collaboratively solve problems.</p>
<p>The realization of that had a profound impact in my life. As programmers, technically minded people that we are, we tend to focus on ourselves and rarely share our knowledge, except to show it off at conferences here and there. We do it mostly to please our ego. Dorneles was nothing like that. He didn&#8217;t present at many conferences, though he was always there as either a participant or an organizer. He didn&#8217;t write lengthy blog posts full of technical details. In fact, he didn&#8217;t blog at all since 2007. He didn&#8217;t create brilliant frameworks. Instead, his contributions were mostly invisible, through IRC, IM or Skype, directly between him and the person seeking his help. It was very common for him to carry about five parallel conversations over IM, helping people all over the world without breaking a sweat. He would happily pull out his laptop or phone at a table in a blink to teach someone a trick. The endless stream of messages on twitter following his death should serve as proof that his way was much more effective in causing an impact in the world than a horde of highly skilled programmers ever could.</p>
<p>As other people well put it, Dorneles could never lose that smile on his face. Nothing could make him curse or complain. He was a mixture of cheerfulness, innocence, tranquility and awkwardness that would immediately conquer people&#8217;s hearts with no effort. He was like that young little brother that makes you blush at a family dinner for being excessively goofy, but that you love so much you would never reprehend.</p>
<p>To me and my wife, Dorneles was closer than family. My wife suffered more from his loss than for the loss of her lovely grandma, or from her uncle that died a slow death from brain cancer a couple years ago. </p>
<p>In retrospect, I can now see that he did treat me like an older brother, always eager to take on my advice. When he was alone in a big empty office in Caxias do Sul, following the break with the other partners at X3ng I told him to move to Garibaldi because we could rent a similar office for much cheaper. I suggested that he should reunite with his wife and two kids, which were living with her mom, and that raising them in Garibaldi would be much better for their education and overall quality of life. I said it would be nice if he had a car so that he didn&#8217;t need to call a cab at 3am when his kids were sick (he refused to buy a car for years, since he had cars stolen several times). At a time he was having trouble getting regular pay, I suggested he should work for Enfold. I told him to go to more conferences and sprints, so that he could put faces to the names on #plone. He was easily convinced. And all of these things had a great impact in his life.</p>
<p>I regret not spending as much time with him as I could in the last year. But many are the good memories that we&#8217;ve shared. Back in November 2009, when my backpack with laptop and cameras containing all the pictures from my vacation in New York got stolen on our first day in Houston he calmly told me: &#8220;Don&#8217;t worry, you can buy all those things again. They didn&#8217;t take from you the most precious thing: your life.&#8221;</p>
<p>I regret that he didn&#8217;t find the time to visit my 3mo old twins. But I&#8217;m glad that after my visit last Saturday, he went to visit his 2 weeks old nephew and his dad on the Sunday. I&#8217;m glad that we spent a good 2h last Saturday sitting around, chatting about the most diverse subjects while I was at his place waiting for the rain to stop.</p>
<p>Dorneles was a sushi lover. He once walked for tens of blocks in Houston on a cracking hot summer day just to eat sushi, and lived to tell the tale. That&#8217;s perhaps the most un-American thing he could do. The first thing we did when we met in Houston in November 2009 was to go out for sushi. When Nate came to Brazil, he took him out for sushi, and that&#8217;s perhaps the most un-Brazilian thing he could do. His love for sushi passed on to his kids. For several weeks I told my wife that we should invite his family out for sushi. We were waiting for the right occasion, and it never happened. In his memory, I think we should do it anyway.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.sidneidasilva.com/2011/02/14/unfinished-life-of-a-sushi-lover/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/38249bf282a7c862259c9ac3fa5e19e22166727e8f6e2fe209901ecf21c20f80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidnei</media:title>
		</media:content>
	</item>
		<item>
		<title>New domain, please fix your RSS readers</title>
		<link>https://blog.sidneidasilva.com/2010/12/09/new-domain-please-fix-your-rss-readers/</link>
					<comments>https://blog.sidneidasilva.com/2010/12/09/new-domain-please-fix-your-rss-readers/#comments</comments>
		
		<dc:creator><![CDATA[Sidnei]]></dc:creator>
		<pubDate>Thu, 09 Dec 2010 17:08:08 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://blog.sidneidasilva.com/?p=385</guid>

					<description><![CDATA[I&#8217;ve registered the sidneidasilva.com domain slighly over a year ago, and let my old awkly.org domain expire. Seems like a few places (like planet.plone.org) were still using the old URL. Sorry for the noise.]]></description>
										<content:encoded><![CDATA[<p>I&#8217;ve registered the sidneidasilva.com domain slighly over a year ago, and let my old awkly.org domain expire. Seems like a few places (like planet.plone.org) were still using the old URL. Sorry for the noise.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.sidneidasilva.com/2010/12/09/new-domain-please-fix-your-rss-readers/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/38249bf282a7c862259c9ac3fa5e19e22166727e8f6e2fe209901ecf21c20f80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidnei</media:title>
		</media:content>
	</item>
		<item>
		<title>Even Faster Web Sites, with YUI</title>
		<link>https://blog.sidneidasilva.com/2010/10/01/even-faster-web-sites-with-yui/</link>
					<comments>https://blog.sidneidasilva.com/2010/10/01/even-faster-web-sites-with-yui/#comments</comments>
		
		<dc:creator><![CDATA[Sidnei]]></dc:creator>
		<pubDate>Fri, 01 Oct 2010 06:22:40 +0000</pubDate>
				<category><![CDATA[canonical]]></category>
		<category><![CDATA[landscape]]></category>
		<category><![CDATA[yui]]></category>
		<category><![CDATA[speed]]></category>
		<guid isPermaLink="false">http://blog.sidneidasilva.com/?p=360</guid>

					<description><![CDATA[Ever since I got my copy of Steve Souders&#8217; Even Faster Web Sites I&#8217;ve became obsessed with speed. During my day job I&#8217;m constantly looking for things that can be improved to make the user experience smoother, specially for first-time visitors. I&#8217;m fairly happy with what we&#8217;ve achieved in the last year, though there are [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Ever since I got my copy of <a href="http://stevesouders.com/">Steve Souders&#8217;</a> <a href="http://stevesouders.com/efws/">Even Faster Web Sites</a> I&#8217;ve became obsessed with speed. During my day job I&#8217;m constantly looking for things that can be improved to make the user experience smoother, specially for first-time visitors. I&#8217;m fairly happy with what we&#8217;ve achieved in the last year, though there are always things to be improved.</p>
<p>Today I&#8217;m going to share with you one of the tricks that we&#8217;ve discovered almost by accident and that can help with making your website faster, if <a href="http://developer.yahoo.com/yui/3">YUI</a> is your Javascript framework of choice.</p>
<p>We&#8217;ve started using YUI in <a href="https://landscape.canonical.com/">Landscape</a> around March of 2009, by rewriting all of our ExtJS-based scripts (which weren&#8217;t that many) to use YUI. Since our application requires HTTPS due to potentially sensitive information, we had to self-host YUI, to avoid mixed-content warnings. Initially we had little experience with it, so we went with the easiest option available: loading the YUI seed file and letting everything else be loaded on-demand by the YUI Loader, without a combo handler (more on that later).</p>
<p>Soon enough we noticed that it wasn&#8217;t such a great idea. First-time access was terrible, with load times over 30 seconds in some cases, due to the combination of HTTPS connection overhead, no static resource caching and large number of requests to fetch all the resources. It was worse than that even, because most browsers either don&#8217;t cache HTTPS content by default, or only cache it on memory, unless you set the proper caching headers. To give you an idea of what it looked like, here&#8217;s what a trivial page using the &#8216;overlay&#8217; module looks like in terms of loading.</p>
<div data-shortcode="caption" id="attachment_369" style="width: 310px" class="wp-caption aligncenter"><a href="http://bit.ly/bAmXnD"><img aria-describedby="caption-attachment-369" loading="lazy" data-attachment-id="369" data-permalink="https://blog.sidneidasilva.com/2010/10/01/even-faster-web-sites-with-yui/selection_202/" data-orig-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_202.png" data-orig-size="529,411" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="No combo loading at all" data-image-description="" data-image-caption="&lt;p&gt;No combo loading at all&lt;/p&gt;
" data-medium-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_202.png?w=300" data-large-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_202.png?w=529" src="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_202.png?w=300&#038;h=233" alt="No combo loading at all" title="No combo loading at all" width="300" height="233" class="size-medium wp-image-369" srcset="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_202.png?w=300 300w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_202.png?w=150 150w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_202.png 529w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-369" class="wp-caption-text">No combo loading at all</p></div>
<p>It was pretty clear that this kind of performance would not be acceptable, so I started looking for options to reduce the number of requests. It was around that time that I heard about Steve Souders work on web performance, through <a href="http://limi.net/">a long time friend</a> from the Plone community that happened to be working at Google and shared a link to Souders&#8217; <a href="http://www.stevesouders.com/blog/2009/04/09/dont-use-import/">blog post on &#8216;@import&#8217;</a>.</p>
<p>Turns out that the YUI Loader supports using a <a href="http://www.yuiblog.com/blog/2008/07/16/combohandler/">combo handler</a> for reducing the number of requests, when loading modules on demand. What this &#8216;combo handler&#8217; does is basically take a GET request with a bunch of filenames as parameters and return a single response with the respective files concatenated. Here&#8217;s an example using the combo server from YUI&#8217;s CDN.</p>
<div data-shortcode="caption" id="attachment_368" style="width: 310px" class="wp-caption aligncenter"><a href="http://bit.ly/aIE7QA"><img aria-describedby="caption-attachment-368" loading="lazy" data-attachment-id="368" data-permalink="https://blog.sidneidasilva.com/2010/10/01/even-faster-web-sites-with-yui/selection_203/" data-orig-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_203.png" data-orig-size="531,139" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Combo loading with a single &#8216;Y.use()&#8217;" data-image-description="" data-image-caption="&lt;p&gt;Combo loading with a single &#8216;Y.use()&#8217;&lt;/p&gt;
" data-medium-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_203.png?w=300" data-large-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_203.png?w=531" src="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_203.png?w=300&#038;h=78" alt="Combo loading with a single &#039;Y.use()&#039;" title="Combo loading with a single &#039;Y.use()&#039;" width="300" height="78" class="size-medium wp-image-368" srcset="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_203.png?w=298 298w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_203.png?w=150 150w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_203.png 531w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-368" class="wp-caption-text">Combo loading with a single 'Y.use()'</p></div>
<p>The problem was that we couldn&#8217;t use YUI&#8217;s combo server on the CDN because it doesn&#8217;t support HTTPS, which was requirement for us.</p>
<p>In November of 2009, at <a href="https://wiki.ubuntu.com/UDS-L">UDS-Lucid in Dallas</a>, we had our first YUI-only cross-team sprint, totalling about 20 people from Launchpad, Landscape, ISD and Ubuntu One. The main goals were to spread knowledge on YUI and improve support for IE on our shared codebase (lazr-js), but I managed to sneak in two things for the Landscape team: implementing a <a href="http://bazaar.launchpad.net/~launchpad-pqm/lazr-js/toolchain/annotate/188/combo.tac">Python-based combo loader</a> (served by Twisted, but it&#8217;s just a plain WSGI app) and extracting <a href="http://bazaar.launchpad.net/~launchpad-pqm/lazr-js/toolchain/annotate/188/src-py/lazr/js/meta.py">YUI module metadata</a>, so that we could make it easier to load extension modules on-demand, the code for which ended up as part of the lazr-js project.</p>
<p>At this point however we realized that there&#8217;s a significant issue with using the combo loader on an application as diverse as Launchpad or Landscape: depending on how you group your &#8216;Y.use()&#8217; calls, the combo URL generated by the YUI Loader can vary significantly, which means that re-use from the browser cache is less than optimal. Here&#8217;s an example of loading both the &#8216;anim-color&#8217; module and the &#8216;overlay&#8217; module within a page. Compare it to the previous example and notice how the parameters passed to the combo are completely different, since the second request (to load the &#8216;overlay&#8217; module) only requests modules which haven&#8217;t been loaded by the first request (to load the &#8216;anim-color&#8217; module).</p>
<div data-shortcode="caption" id="attachment_367" style="width: 310px" class="wp-caption aligncenter"><a href="http://bit.ly/9EVFlN"><img aria-describedby="caption-attachment-367" loading="lazy" data-attachment-id="367" data-permalink="https://blog.sidneidasilva.com/2010/10/01/even-faster-web-sites-with-yui/selection_205/" data-orig-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_205.png" data-orig-size="530,156" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Combo loader can be a caching problem" data-image-description="" data-image-caption="&lt;p&gt;Combo loader can be a caching problem&lt;/p&gt;
" data-medium-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_205.png?w=300" data-large-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_205.png?w=530" src="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_205.png?w=300&#038;h=88" alt="Combo loader can be a caching problem" title="Combo loader can be a caching problem" width="300" height="88" class="size-medium wp-image-367" srcset="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_205.png?w=300 300w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_205.png?w=150 150w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_205.png 530w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-367" class="wp-caption-text">Combo loader can be a caching problem</p></div>
<p>In a hurry to get the situation solved ASAP, and taking a clue from our fellow developers on the Launchpad team, we went with a simpler alternative: manually combining all of YUI, including the seed file, and loading all of that in a &#8216;script&#8217; tag in the document &#8216;head&#8217;. It turns out that the situation improved quite dramatically, but there was still more to be done. Although the number of requests was much smaller, the total page size was actually larger, since we were loading a lot of stuff that wasn&#8217;t even being used. Worse, since we were putting that &#8216;script&#8217; tag in the &#8216;head&#8217;, it was blocking the whole page from loading until the script was finished downloading, which I after following Souders&#8217; blog for a while I realized wasn&#8217;t such a great idea either. Here&#8217;s an example of what that looked like.</p>
<div data-shortcode="caption" id="attachment_366" style="width: 310px" class="wp-caption aligncenter"><a href="http://bit.ly/dAVZPg"><img aria-describedby="caption-attachment-366" loading="lazy" data-attachment-id="366" data-permalink="https://blog.sidneidasilva.com/2010/10/01/even-faster-web-sites-with-yui/selection_204/" data-orig-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_204.png" data-orig-size="532,154" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Combined modules in the head" data-image-description="" data-image-caption="&lt;p&gt;Combined modules in the head&lt;/p&gt;
" data-medium-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_204.png?w=300" data-large-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_204.png?w=532" src="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_204.png?w=300&#038;h=86" alt="Combined modules in the head" title="Combined modules in the head" width="300" height="86" class="size-medium wp-image-366" srcset="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_204.png?w=300 300w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_204.png?w=297 297w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_204.png?w=150 150w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_204.png 532w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-366" class="wp-caption-text">Combined modules in the head</p></div>
<p>At this point we had a significant codebase of YUI-based modules, and so did the Launchpad team, but we had gone from solely relying on the YUI Loader to not using it at all (by just loading all the code in one big honking file).</p>
<p>Once we got the module metadata extraction figured out though, I resumed working on improving the first-view load time, by reducing the number of modules manually combined to the bare minimum shared by all of our pages. Also, by having a single file with the common modules being loaded on all the pages, we can be sure that it is highly cacheable. And then we let the YUI Loader kick in and load the missing modules on less-used pages, which was a really nice improvement in page weight and reducing the time to the &#8216;onload&#8217; event.</p>
<p>At this point Souders started talking about asynchronous loading of scripts and the &#8216;defer&#8217; attribute, and I got my copy of Even Faster Web Sites. I started pondering if there was something that could be done to defer the loading of the combined modules while still letting the YUI Loader do it&#8217;s job.</p>
<p>The problem lies in the fact that YUI asynchronously loads modules that are not on the page yet, calling a callback function (the last argument to &#8216;Y.use()&#8217;) once all the scripts containing the required modules have finished loading. If all the modules are already on the page, it just calls the callback right away. So by just tacking a &#8216;defer&#8217; attribute on the &#8216;script&#8217; tag for the combined modules there would be a race condition between the loader checking if the modules were loaded and the script with the combined modules being loaded.</p>
<p>Then, it struck me. If the last argument to &#8216;Y.use()&#8217; is just a callback function, could we queue those functions to be called at a later time and load the combined modules ourselves, before letting the YUI loader proceed? After a little back and forth with Dav Glass and some pseudocode exchange, I got an implementation of this idea(which I&#8217;m calling the &#8216;<a href="http://bazaar.launchpad.net/~launchpad-pqm/lazr-js/toolchain/annotate/188/src-js/lazrjs/loader/prefetch.js">Prefetch YUI Loader Hack</a>&#8216;). And thus we managed to move the loading of all the combined modules from a &#8216;script&#8217; in the &#8216;head&#8217; to use asynchronous script loading, shortening even further our time to the &#8216;onload&#8217; event. Here&#8217;s an example of what it looks like.</p>
<div data-shortcode="caption" id="attachment_377" style="width: 310px" class="wp-caption aligncenter"><a href="http://bit.ly/cMyF0a"><img aria-describedby="caption-attachment-377" loading="lazy" data-attachment-id="377" data-permalink="https://blog.sidneidasilva.com/2010/10/01/even-faster-web-sites-with-yui/selection_208/" data-orig-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_208.png" data-orig-size="571,156" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Prefetch with a single request" data-image-description="" data-image-caption="&lt;p&gt;Prefetch with a single request&lt;/p&gt;
" data-medium-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_208.png?w=300" data-large-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_208.png?w=571" src="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_208.png?w=300&#038;h=81" alt="Prefetch with a single request" title="Prefetch with a single request" width="300" height="81" class="size-medium wp-image-377" srcset="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_208.png?w=300 300w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_208.png?w=296 296w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_208.png?w=150 150w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_208.png 571w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-377" class="wp-caption-text">Prefetch with a single request</p></div>
<p>But wait, there&#8217;s more! Souders then started talking about parallel loading, tickling my speed bug again. After thinking for a while about the problem, enlightenment came again: when an YUI module is loaded, it is not executed right away, but added to an internal registry of modules. What that means is that regardless of what other modules it depends on, they can all be loaded independently from each other! That means you can break up a manually combined file into N smaller files and have them be loaded in up to N parallel connections (where N varies by browser and by browser version) and when they are all done you can let the YUI Loader kick in. Here&#8217;s an example with two parallel downloads plus an extra module not prefetched.</p>
<div data-shortcode="caption" id="attachment_365" style="width: 310px" class="wp-caption aligncenter"><a href="http://bit.ly/d8rLkq"><img aria-describedby="caption-attachment-365" loading="lazy" data-attachment-id="365" data-permalink="https://blog.sidneidasilva.com/2010/10/01/even-faster-web-sites-with-yui/selection_206/" data-orig-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_206.png" data-orig-size="530,173" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Prefetch, with parallel download" data-image-description="" data-image-caption="&lt;p&gt;Prefetch, with parallel download&lt;/p&gt;
" data-medium-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_206.png?w=300" data-large-file="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_206.png?w=530" src="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_206.png?w=300&#038;h=97" alt="Prefetch, with parallel download" title="Prefetch, with parallel download" width="300" height="97" class="size-medium wp-image-365" srcset="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_206.png?w=300 300w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_206.png?w=297 297w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_206.png?w=150 150w, https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_206.png 530w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-365" class="wp-caption-text">Prefetch, with parallel download</p></div>
<p>So that&#8217;s where things stand now. There are still optimizations that can be done in Landscape, like using the combo loader to reduce the number of requests on less common pages, or even using fixed URLs to the combo loader with the prefetch hack, to simplify the build process. We also need to start using Caridy&#8217;s <a href="http://yuilibrary.com/gallery/show/event-binder">Event Binder module</a>, since now the pages load so fast that the users start clicking around before the event handlers are in place (ha!). </p>
<p>I am also pushing to get those kinds of tips documented and passed around <a href="http://www.canonical.com/">Canonical</a>, through a project codenamed Dare2BFast, which has the goal of coming up with a set of Web Performance Guidelines that all Canonical web sites should follow, both on the frontend and backend. Stay tuned!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.sidneidasilva.com/2010/10/01/even-faster-web-sites-with-yui/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/38249bf282a7c862259c9ac3fa5e19e22166727e8f6e2fe209901ecf21c20f80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidnei</media:title>
		</media:content>

		<media:content url="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_202.png?w=300" medium="image">
			<media:title type="html">No combo loading at all</media:title>
		</media:content>

		<media:content url="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_203.png?w=300" medium="image">
			<media:title type="html">Combo loading with a single &#039;Y.use()&#039;</media:title>
		</media:content>

		<media:content url="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_205.png?w=300" medium="image">
			<media:title type="html">Combo loader can be a caching problem</media:title>
		</media:content>

		<media:content url="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_204.png?w=300" medium="image">
			<media:title type="html">Combined modules in the head</media:title>
		</media:content>

		<media:content url="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_208.png?w=300" medium="image">
			<media:title type="html">Prefetch with a single request</media:title>
		</media:content>

		<media:content url="https://blog.sidneidasilva.com/wp-content/uploads/2010/10/selection_206.png?w=300" medium="image">
			<media:title type="html">Prefetch, with parallel download</media:title>
		</media:content>
	</item>
		<item>
		<title>Get it like you like it</title>
		<link>https://blog.sidneidasilva.com/2010/09/08/get-it-like-you-like-it/</link>
					<comments>https://blog.sidneidasilva.com/2010/09/08/get-it-like-you-like-it/#respond</comments>
		
		<dc:creator><![CDATA[Sidnei]]></dc:creator>
		<pubDate>Wed, 08 Sep 2010 16:05:50 +0000</pubDate>
				<category><![CDATA[Announcement]]></category>
		<category><![CDATA[canonical]]></category>
		<category><![CDATA[landscape]]></category>
		<category><![CDATA[speed]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">http://blog.sidneidasilva.com/?p=349</guid>

					<description><![CDATA[This morning I woke up with this song in my head. It reminds me quite a bit of the Rolling Stones, and it&#8217;s very appropriate for the mood I&#8217;m in today. I&#8217;m sitting here at Canonical&#8217;s office in Montreal, where we are having another Landscape sprint. There&#8217;s a couple things that make this sprint special, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>This morning I <a href="http://www.amazon.com/Get-Like-You/dp/B000TDWJ84">woke up with this song in my head</a>. It reminds me quite a bit of the Rolling Stones, and it&#8217;s very appropriate for the mood I&#8217;m in today.</p>
<p>I&#8217;m sitting here at Canonical&#8217;s office in Montreal, where we are having another Landscape sprint. There&#8217;s a couple things that make this sprint special, one of them being that <a href="http://fwierzbicki.blogspot.com/">Frank Wierzbicki</a> has joined us! Welcome to the team, Frank, and I hope you enjoy!</p>
<p>It has also coincided with the end of our 1.5.5 milestone, which rolled out yesterday, with some interesting highlights:</p>
<h3>Speed!</h3>
<p>Contrary to what other people might tell you, <em>YES</em> speed does matter. We&#8217;ve been slowly (ha!) <a href="http://www.showslow.com/details/?url=https://landscape.canonical.com/">rolling out improvements to page load speed</a>, and I&#8217;m happy to say that the improvements are very noticeable. Things we&#8217;ve done to improve this range from setting proper caching headers for static resources to heavily <a href="http://developer.yahoo.com/yui/3/yui/#loader">abusing the YUI Loader</a>. I should write more about that on a more appropriate occasion. There&#8217;s always things to improve on, so keep an eye on it!</p>
<h3>Faster Trials</h3>
<p>Over the last four years, the trial registration for Landscape hasn&#8217;t been&#8230; enjoyable to say the least. This week we&#8217;ve finally rolled out the first iteration of our simplified registration process, which removes a manual approval step which used to take several weeks to be done. That means you can now register for a trial account in Landscape and start using it right away! Quite a novel concept, isn&#8217;t it? :) We&#8217;ll planning some more updates to it, so that when starting the registration process you have a better sense of where you are in the process and what are steps involved.</p>
<p>We have more exciting updates coming up before the end of the year, so keep an eye on it. But in the meantime, <a href="https://landscape.canonical.com/?utm_source=sidnei&amp;utm_medium=blog&amp;utm_campaign=new-trial-registration">hit that &#8216;Registration&#8217; link in Landscape</a>, get it like you like it, and enjoy!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.sidneidasilva.com/2010/09/08/get-it-like-you-like-it/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/38249bf282a7c862259c9ac3fa5e19e22166727e8f6e2fe209901ecf21c20f80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidnei</media:title>
		</media:content>
	</item>
	</channel>
</rss>
