<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <title type="text">L'Alpiniste</title>
  <id>http://blog.projectfondue.com/feed.atom</id>
  <updated>2011-06-06T07:13:35Z</updated>
  <link href="http://blog.projectfondue.com" />
  
  <subtitle type="text">The blog of the Project Fondue Team</subtitle>
  <generator uri="http://zine.pocoo.org/" version="0.1.2">Zine</generator>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/projectfondue/posts" /><feedburner:info uri="projectfondue/posts" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">The Web Column: Issue No.5</title>
    <id>tag:blog.projectfondue.com,2011-02-15:/entry;2011/2/18/the-web-column:-issue-no-5</id>
    <updated>2011-06-06T07:13:35Z</updated>
    <published>2011-06-06T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/lFH2LsRIpiA/the-web-column:-issue-no-5" />
    <author>
      <name>Cyril Doussin</name>
    </author>
    <content type="html">&lt;div id="contents" class="contents rc topic"&gt;
&lt;p class="topic-title first"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="#recent-news" id="id1" class="reference internal"&gt;Recent news&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#django-weblog-django-1-3-released" id="id2" class="reference internal"&gt;Django | Weblog | Django 1.3 released&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#divide-and-concur-code-as-craft" id="id3" class="reference internal"&gt;Divide and Concur « Code as Craft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-road-to-being-a-kick-ass-public-speaker-christian-heilmann-s-blog-wait-till-i-come" id="id4" class="reference internal"&gt;The road to being a kick-ass public speaker | Christian Heilmann's blog – Wait till I come!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#byobu-in-launchpad" id="id5" class="reference internal"&gt;byobu in Launchpad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#puppet-labs-style-guide" id="id6" class="reference internal"&gt;Puppet Labs - Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fabric-gets-a-nice-set-of-updates" id="id7" class="reference internal"&gt;Fabric Gets a nice set of updates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#iranian-hackers-obtain-ssl-certs-for-major-sites-fraudulently" id="id8" class="reference internal"&gt;Iranian Hackers obtain SSL certs for major sites fraudulently&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#matt-haughey-on-11-years-of-community-at-metafilter" id="id9" class="reference internal"&gt;Matt Haughey on 11 Years of Community at MetaFilter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#front-end" id="id10" class="reference internal"&gt;Front-End&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#heatmap-js-html5-canvas-heatmap-library" id="id11" class="reference internal"&gt;heatmap.js | HTML5 Canvas Heatmap Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#jquery-jquery-1-6-released" id="id12" class="reference internal"&gt;jQuery: » jQuery 1.6 Released&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#web-font-services-an-overview-by-sprungmarker-de" id="id13" class="reference internal"&gt;Web font services - An Overview - by sprungmarker.de&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#anatomy-of-a-mashup-definitive-daft-punk-visualised" id="id14" class="reference internal"&gt;Anatomy of a Mashup: Definitive Daft Punk visualised&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#improve-browser-performance-with-the-css-stress-test-tool-sitepoint" id="id15" class="reference internal"&gt;Improve Browser Performance With the CSS Stress Test Tool » SitePoint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#an-unconventional-loading-strategy-for-yui-3-julien-lecomte-s-blog" id="id16" class="reference internal"&gt;An unconventional loading strategy for YUI 3 | Julien Lecomte's Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#back-end" id="id17" class="reference internal"&gt;Back-End&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-secrets-of-building-realtime-big-data-systems" id="id18" class="reference internal"&gt;The Secrets of Building Realtime Big Data Systems&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-python-corner" id="id19" class="reference internal"&gt;The Python corner&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#pypy-status-blog-pypy-1-5-released-catching-up" id="id20" class="reference internal"&gt;PyPy Status Blog: PyPy 1.5 Released: Catching Up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#pyke" id="id21" class="reference internal"&gt;pyke&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#pycon" id="id22" class="reference internal"&gt;PyCon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="recent-news" class="section"&gt;
&lt;h2&gt;&lt;a href="#id1" class="toc-backref"&gt;Recent news&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The latest news hot off the press.&lt;/p&gt;
&lt;div id="django-weblog-django-1-3-released" class="section"&gt;
&lt;h3&gt;&lt;a href="#id2" class="toc-backref"&gt;Django | Weblog | Django 1.3 released&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The latest iteration of the django web framework (one of the most popular ones) came out a couple of weeks ago. This release was delayed a few times but finally brings some much anticipated improvements: class-based views (cleaner view code FTW), better integrated logging, a standard way to handle static files and much more...&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.djangoproject.com/weblog/2011/mar/23/13/" class="reference external"&gt;http://www.djangoproject.com/weblog/2011/mar/23/13/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="divide-and-concur-code-as-craft" class="section"&gt;
&lt;h3&gt;&lt;a href="#id3" class="toc-backref"&gt;Divide and Concur « Code as Craft&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Interesting article on Etsy&amp;amp;#039;s use of Jenkins to split up their test suite to get it run inside of 11 minutes pre-deployments.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://codeascraft.etsy.com/2011/04/20/divide-and-concur/" class="reference external"&gt;http://codeascraft.etsy.com/2011/04/20/divide-and-concur/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="the-road-to-being-a-kick-ass-public-speaker-christian-heilmann-s-blog-wait-till-i-come" class="section"&gt;
&lt;h3&gt;&lt;a href="#id4" class="toc-backref"&gt;The road to being a kick-ass public speaker | Christian Heilmann's blog – Wait till I come!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Christian Heilmann provides some great insights and tips on what it takes to make a good presentation.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.wait-till-i.com/2011/04/11/the-road-to-being-a-kick-ass-public-speaker/" class="reference external"&gt;http://www.wait-till-i.com/2011/04/11/the-road-to-being-a-kick-ass-public-speaker/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="byobu-in-launchpad" class="section"&gt;
&lt;h3&gt;&lt;a href="#id5" class="toc-backref"&gt;byobu in Launchpad&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Byobu is a fantastic set of enhancements to gnu screen. It provides a great deal of information and is on my list of base packages for any new machine.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://launchpad.net/byobu" class="reference external"&gt;https://launchpad.net/byobu&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="puppet-labs-style-guide" class="section"&gt;
&lt;h3&gt;&lt;a href="#id6" class="toc-backref"&gt;Puppet Labs - Style Guide&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Puppet labs produce a style guide detailing exactly how your should layout your modules and manifests. Essential reading if you&amp;amp;#039;re using puppet and want to adhere to a common standard.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://docs.puppetlabs.com/guides/style_guide.html" class="reference external"&gt;http://docs.puppetlabs.com/guides/style_guide.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="fabric-gets-a-nice-set-of-updates" class="section"&gt;
&lt;h3&gt;&lt;a href="#id7" class="toc-backref"&gt;Fabric Gets a nice set of updates&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://docs.fabfile.org/" class="reference external"&gt;Fabric&lt;/a&gt;, if you've not already heard of it is a python library that makes it really easy to handle deployments with a fabfile, which is essentially similar to a Makefile except that it it's just pure python.&lt;/p&gt;
&lt;p&gt;Tav has built-out a bunch of additional features for Fabric: Running commands in parallel, API improvements, Fabric Shell. Staged environments. It's all there, the only downside is that it's not currently in a format that makes it easy for upstream to accept the patches. Still hopefully the work will be done to resolve that and we'll see these changes land in Fabric in due course. &lt;a href="http://tav.espians.com/fabric-python-with-cleaner-api-and-parallel-deployment-support.html" class="reference external"&gt;See Tav's post for more details&lt;/a&gt; (via &lt;a href="http://www.rosslawley.co.uk/" class="reference external"&gt;Ross Lawley&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div id="iranian-hackers-obtain-ssl-certs-for-major-sites-fraudulently" class="section"&gt;
&lt;h3&gt;&lt;a href="#id8" class="toc-backref"&gt;Iranian Hackers obtain SSL certs for major sites fraudulently&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An fairly worrying report from eff.org on how Iranian hackers managed to trick a Certificate Authority into issuing fraudulent SSL certs for major sites such as google.com, login.yahoo.com.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://www.eff.org/deeplinks/2011/03/iranian-hackers-obtain-fraudulent-https" class="reference external"&gt;Iranian hackers obtain fraudulent HTTPS certificates: How close to a Web security meltdown did we get?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nakedsecurity.sophos.com/2011/03/24/fraudulent-certificates-issued-by-comodo-is-it-time-to-rethink-who-we-trust/" class="reference external"&gt;Graham Cluely (Sophos) has more details on the incident&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="matt-haughey-on-11-years-of-community-at-metafilter" class="section"&gt;
&lt;h3&gt;&lt;a href="#id9" class="toc-backref"&gt;Matt Haughey on 11 Years of Community at MetaFilter&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You may have seen this already but if not it's well worth seeing. Matt Haughey talks about the tools created to manage and moderate the community on MetaFilter.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="front-end" class="section"&gt;
&lt;h2&gt;&lt;a href="#id10" class="toc-backref"&gt;Front-End&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Everything related to client-side development.&lt;/p&gt;
&lt;div id="heatmap-js-html5-canvas-heatmap-library" class="section"&gt;
&lt;h3&gt;&lt;a href="#id11" class="toc-backref"&gt;heatmap.js | HTML5 Canvas Heatmap Library&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Heatmaps are a fantastic way to visualise geographical statistics and of course user behaviour on web pages.
Heatmap.js is the easiest way I've seen to build such visualisations.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.patrick-wied.at/static/heatmapjs/" class="reference external"&gt;http://www.patrick-wied.at/static/heatmapjs/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="jquery-jquery-1-6-released" class="section"&gt;
&lt;h3&gt;&lt;a href="#id12" class="toc-backref"&gt;jQuery: » jQuery 1.6 Released&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;jQuery 1.6 is out, with small but major changes which break backwards-compatibility (see .prop() and .attr()).&lt;/p&gt;
&lt;p&gt;This is not really a problem though, as jQuery has mostly been bug-free for a while, so running on 1.5 until you've updated your codebase, however big it is, is perfectly reasonable.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.jquery.com/2011/05/03/jquery-16-released/" class="reference external"&gt;http://blog.jquery.com/2011/05/03/jquery-16-released/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="web-font-services-an-overview-by-sprungmarker-de" class="section"&gt;
&lt;h3&gt;&lt;a href="#id13" class="toc-backref"&gt;Web font services - An Overview - by sprungmarker.de&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sylvia Egger keeps a useful comparison table of the various webfonts hosting services out there, allowing you to compare how many fonts are available, how you can embed them, what you can use them for and which particular services are offered.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sprungmarker.de/wp-content/uploads/webfont-services/" class="reference external"&gt;http://sprungmarker.de/wp-content/uploads/webfont-services/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="anatomy-of-a-mashup-definitive-daft-punk-visualised" class="section"&gt;
&lt;h3&gt;&lt;a href="#id14" class="toc-backref"&gt;Anatomy of a Mashup: Definitive Daft Punk visualised&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Cameron Adams awesome visualisation of his own audio mashup of 23 different Daft Punk tracks using modern web technologies.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://daftpunk.themaninblue.com/" class="reference external"&gt;http://daftpunk.themaninblue.com/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="improve-browser-performance-with-the-css-stress-test-tool-sitepoint" class="section"&gt;
&lt;h3&gt;&lt;a href="#id15" class="toc-backref"&gt;Improve Browser Performance With the CSS Stress Test Tool » SitePoint&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bookmarklet that measures performance impact of CSS effects.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.sitepoint.com/css-stress-test-tool/" class="reference external"&gt;http://blogs.sitepoint.com/css-stress-test-tool/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="an-unconventional-loading-strategy-for-yui-3-julien-lecomte-s-blog" class="section"&gt;
&lt;h3&gt;&lt;a href="#id16" class="toc-backref"&gt;An unconventional loading strategy for YUI 3 | Julien Lecomte's Blog&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An interesting deck from Julian Lecomte on YUI3 loading strategies used on SRPs.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.julienlecomte.net/blog/2011/03/583/" class="reference external"&gt;http://www.julienlecomte.net/blog/2011/03/583/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="back-end" class="section"&gt;
&lt;h2&gt;&lt;a href="#id17" class="toc-backref"&gt;Back-End&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Server-side technologies and services.&lt;/p&gt;
&lt;div id="the-secrets-of-building-realtime-big-data-systems" class="section"&gt;
&lt;h3&gt;&lt;a href="#id18" class="toc-backref"&gt;The Secrets of Building Realtime Big Data Systems&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Nathan Marz&amp;amp;#039;s presentation on building scalable architecture. This is a very good introduction to the type of architecture needed for any &amp;amp;quot;realtime&amp;amp;quot; analytics platform. Nathan has also written a few tools/libraries which facilitate data processing on Hadoop (for example Cascalog: &lt;a href="https://github.com/nathanmarz/cascalog" class="reference external"&gt;https://github.com/nathanmarz/cascalog&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.slideshare.net/nathanmarz/the-secrets-of-building-realtime-big-data-systems" class="reference external"&gt;http://www.slideshare.net/nathanmarz/the-secrets-of-building-realtime-big-data-systems&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="the-python-corner" class="section"&gt;
&lt;h2&gt;&lt;a href="#id19" class="toc-backref"&gt;The Python corner&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python rocks. At Project Fondue, we love it and so we keep a close eye on what's happening in the Python realms. Here is an excerpt.&lt;/p&gt;
&lt;div id="pypy-status-blog-pypy-1-5-released-catching-up" class="section"&gt;
&lt;h3&gt;&lt;a href="#id20" class="toc-backref"&gt;PyPy Status Blog: PyPy 1.5 Released: Catching Up&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A new release of Pypy is out and now claims to be on par feature-wise with Python 2.7.1 "including the standard library".&lt;/p&gt;
&lt;p&gt;Pypy is a major achievement and keeps getting better and better. Don't gorget to check their compatibility list before you switch to it over cPython though: https://bitbucket.org/pypy/compatibility/wiki/Home&lt;/p&gt;
&lt;p&gt;&lt;a href="http://morepypy.blogspot.com/2011/04/pypy-15-released-catching-up.html" class="reference external"&gt;http://morepypy.blogspot.com/2011/04/pypy-15-released-catching-up.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="pyke" class="section"&gt;
&lt;h3&gt;&lt;a href="#id21" class="toc-backref"&gt;pyke&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pyke is a knowledge-based inference engine (expert system) written in 100% Python.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;a href="http://pyke.sourceforge.net" class="reference external"&gt;Pyke Homepage&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;Blog post with a practical application&lt;/dt&gt;
&lt;dd&gt;&lt;ul class="first last simple"&gt;
&lt;li&gt;&lt;a href="http://cyberdelia.tryphon.org/post/3291592720/moteur-inference" class="reference external"&gt;In french&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://translate.google.com/translate?js=n&amp;amp;prev=_t&amp;amp;hl=en&amp;amp;ie=UTF-8&amp;amp;layout=2&amp;amp;eotf=1&amp;amp;sl=fr&amp;amp;tl=en&amp;amp;u=http%3A%2F%2Fcyberdelia.tryphon.org%2Fpost%2F3291592720%2Fmoteur-inference" class="reference external"&gt;English Translation via translate.google.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="pycon" class="section"&gt;
&lt;h3&gt;&lt;a href="#id22" class="toc-backref"&gt;PyCon&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There's a huge amount of fantastic videos of the talks from PyCon 2011. Well worth checking out.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pycon.blip.tv/posts?view=archive&amp;amp;nsfw=dc" class="reference external"&gt;PyCon 2011 Videos&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/lFH2LsRIpiA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2011/6/06/the-web-column:-issue-no-5</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">The Web Column: Issue No.4</title>
    <id>tag:blog.projectfondue.com,2011-01-31:/entry;2011/1/31/the-web-column:-issue-no-4</id>
    <updated>2011-02-09T09:23:16Z</updated>
    <published>2011-02-08T22:55:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/UVL_a5HsI_c/the-web-column:-issue-no-4" />
    <author>
      <name>Stuart Colville</name>
    </author>
    <content type="html">&lt;div id="contents" class="contents rc topic"&gt;
&lt;p class="topic-title first"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="#recent-news" id="id7" class="reference internal"&gt;Recent news&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#google-accuses-bing-of-copying-their-search-results" id="id8" class="reference internal"&gt;Google Accuses Bing of Copying their Search Results&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#why-you-should-never-search-for-free-wordpress-themes" id="id9" class="reference internal"&gt;Why You Should Never Search For Free WordPress Themes...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#history-hack-day" id="id10" class="reference internal"&gt;History Hack Day&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#spread-the-word-on-facebook-scams-and-phishing-techniques" id="id11" class="reference internal"&gt;Spread the Word on Facebook Scams and Phishing Techniques&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#front-end" id="id12" class="reference internal"&gt;Front-End&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#deferreds-in-jquery-1-5" id="id13" class="reference internal"&gt;Deferreds in JQuery 1.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#html5-forms" id="id14" class="reference internal"&gt;HTML5 Forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#breaking-the-web-with-hashbangs" id="id15" class="reference internal"&gt;Breaking the Web with HashBangs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#little-big-details" id="id16" class="reference internal"&gt;Little big details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#back-end" id="id17" class="reference internal"&gt;Back-End&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#elasticsearch" id="id18" class="reference internal"&gt;Elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-python-corner" id="id19" class="reference internal"&gt;The Python corner&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#datadiff" id="id20" class="reference internal"&gt;datadiff&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#grin-and-search-it" id="id21" class="reference internal"&gt;Grin and Search it&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="recent-news" class="section"&gt;
&lt;h2&gt;&lt;a href="#id7" class="toc-backref"&gt;Recent news&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The latest news hot off the press.&lt;/p&gt;
&lt;div id="google-accuses-bing-of-copying-their-search-results" class="section"&gt;
&lt;h3&gt;&lt;a href="#id8" class="toc-backref"&gt;Google Accuses Bing of Copying their Search Results&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A fascinating article by Danny Sullivan that broke the news on Google's accusation that Bing are copying their search results.
&lt;a href="http://searchengineland.com/google-bing-is-cheating-copying-our-search-results-62914" class="reference external"&gt;Google Accuses Bing of Copying their Search Results&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="why-you-should-never-search-for-free-wordpress-themes" class="section"&gt;
&lt;h3&gt;&lt;a href="#id9" class="toc-backref"&gt;Why You Should Never Search For Free WordPress Themes...&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Want a free wordpress theme? You might be getting more than you bargained for.  &lt;a href="http://wpmu.org/why-you-should-never-search-for-free-wordpress-themes-in-google-or-anywhere-else/" class="reference external"&gt;This article looks at various sites that provide free wordpress themes only to uncover a whole heap of obfuscated spam.&lt;/a&gt;. Talk about there being no such thing as a free lunch.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="history-hack-day" class="section"&gt;
&lt;h3&gt;&lt;a href="#id10" class="toc-backref"&gt;History Hack Day&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;YDN's Murray Rowan reports on the events at the recent &lt;a href="http://developer.yahoo.com/blogs/ydn/posts/2011/01/history-hack-day-it-was-therefore-it-now-isnt/" class="reference external"&gt;History Hack Day&lt;/a&gt;. Sounds like it was a great success with many excellent hacks being produced over the course of the event.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"Hack Days get people engaged with and excited about a subject, and our subject is history. There's a lot of it about, but lots of it is stuck, on paper, in old HTML pages, in archives, on hard-to-reach databases. We want people to figure out how to set some of that free, and start bringing that history to life as... whatever crazy things people can come up with."&lt;/p&gt;
&lt;p class="attribution"&gt;—&lt;a href="http://historyhackday.org/" class="reference external"&gt;Matt Patterson, Organiser of the History Hackday&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div id="spread-the-word-on-facebook-scams-and-phishing-techniques" class="section"&gt;
&lt;h3&gt;&lt;a href="#id11" class="toc-backref"&gt;Spread the Word on Facebook Scams and Phishing Techniques&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://nakedsecurity.sophos.com/" class="reference external"&gt;Graham Cluley's Naked Security blog&lt;/a&gt; is a great resource for keeping abreast of the latest news relating to computer/web security. Recently a lot of the news has been related to scams on facebook.&lt;/p&gt;
&lt;p&gt;Now for those of us who work in the industry it might be more easy for us to spot a scam from a mile away. However if you have friends and family that frequent facebook and similar sites it could be worth getting them to take a look at Graham's blog to understand how theses ploys work and how they generate scammers money.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="front-end" class="section"&gt;
&lt;h2&gt;&lt;a href="#id12" class="toc-backref"&gt;Front-End&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Everything related to client-side development.&lt;/p&gt;
&lt;div id="deferreds-in-jquery-1-5" class="section"&gt;
&lt;h3&gt;&lt;a href="#id13" class="toc-backref"&gt;Deferreds in JQuery 1.5&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.erichynds.com/jquery/using-deferreds-in-jquery/" class="reference external"&gt;Using deferreds in Jquery&lt;/a&gt; provides a nice walk through of how to use the new feature in JQuery 1.5.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"With deferreds, multiple callbacks can be bound to a task’s outcome, and any of these callbacks can be bound even after the task is complete.
The task in question may be asynchronous, but not necessarily."&lt;/p&gt;
&lt;p class="attribution"&gt;—Eric Hynds&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you've ever used Twisted in Python this territory will be familiar to you.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="html5-forms" class="section"&gt;
&lt;h3&gt;&lt;a href="#id14" class="toc-backref"&gt;HTML5 Forms&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chris Mills and Patrick H. Lauke provide walk through some of the shiny new HTML 5 features available for creating richer forms on Dev.Opera: &lt;a href="http://dev.opera.com/articles/view/new-form-features-in-html5/" class="reference external"&gt;New form features in HTML5&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="breaking-the-web-with-hashbangs" class="section"&gt;
&lt;h3&gt;&lt;a href="#id15" class="toc-backref"&gt;Breaking the Web with HashBangs&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Mike Davies writes up an excellent critique on the trend of using fragment identifiers to provide state for Ajax based site navigation schemes. &lt;a href="http://isolani.co.uk/blog/javascript/BreakingTheWebWithHashBangs" class="reference external"&gt;Breaking the Web with Hashbangs&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="little-big-details" class="section"&gt;
&lt;h3&gt;&lt;a href="#id16" class="toc-backref"&gt;Little big details&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Quite often the work going into improving the user experience goes unnoticed even though it can turn on ordinary application or web site into something users actually enjoy. You know, that whole "delight your users" thing.
&lt;a href="http://littlebigdetails.com" class="reference external"&gt;Little big details&lt;/a&gt; is a blog pointing out those improvements and sometimes genuinely innovative ideas that make the software we like using.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="back-end" class="section"&gt;
&lt;h2&gt;&lt;a href="#id17" class="toc-backref"&gt;Back-End&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Server-side technologies and services.&lt;/p&gt;
&lt;div id="elasticsearch" class="section"&gt;
&lt;h3&gt;&lt;a href="#id18" class="toc-backref"&gt;Elasticsearch&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As explained on the homepage, search is hard. That's exactly the problem &lt;a href="http://www.elasticsearch.org" class="reference external"&gt;elasticsearch&lt;/a&gt; is trying to tackle, and by the looks of things it might be successful at making search a lot more trivial than it currently. Many features one might expect from a robust search solution have been implemented in elasticsearch and quite often requiring little work or no work at all for the user: redundancy, failover, multiple indices, easy data format, simple configuration, automatically distributed architecture, choice of index storage etc.&lt;/p&gt;
&lt;p&gt;We haven't tested it ourselves (yet), but this looks like an impressive project with a lot of potential. If you're looking at implementing search: give elasticsearch a go.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="the-python-corner" class="section"&gt;
&lt;h2&gt;&lt;a href="#id19" class="toc-backref"&gt;The Python corner&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python rocks. At Project Fondue, we love it and so we keep a close eye on what's happening in the Python realms. Here is an excerpt.&lt;/p&gt;
&lt;div id="datadiff" class="section"&gt;
&lt;h3&gt;&lt;a href="#id20" class="toc-backref"&gt;datadiff&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is an interesting idea. &lt;a href="http://pypi.python.org/pypi/datadiff" class="reference external"&gt;Datadiff&lt;/a&gt; provides a way to get a human readable diff from python data structures&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datadiff&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;baz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;baz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;---&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="o"&gt;+++&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s"&gt;'bar'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;'bar'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s"&gt;'baz'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
 &lt;span class="err"&gt;@@&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="err"&gt;@@&lt;/span&gt;
  &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="s"&gt;'foo'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id="grin-and-search-it" class="section"&gt;
&lt;h3&gt;&lt;a href="#id21" class="toc-backref"&gt;Grin and Search it&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://rhodesmill.org/brandon/2011/grin-and-search-it/" class="reference external"&gt;Brandon Craig Rhodes&lt;/a&gt; uses &lt;a href="http://pypi.python.org/pypi/grin" class="reference external"&gt;grin&lt;/a&gt; instead of grep. It's fairly similar to ack-grep but is written in python.&lt;/p&gt;
&lt;p&gt;grin provides a way to search through files, colorising the matches in the output so you can see exactly what you were looking for and quickly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/UVL_a5HsI_c" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2011/1/31/the-web-column:-issue-no-4</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">Contribute to the Web Column</title>
    <id>tag:blog.projectfondue.com,2011-02-08:/entry;2011/2/8/contribute-to-the-web-column</id>
    <updated>2011-02-08T10:27:43Z</updated>
    <published>2011-02-08T07:49:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/GJYAE3m29_A/contribute-to-the-web-column" />
    <author>
      <name>Stuart Colville</name>
    </author>
    <content type="html">&lt;p&gt;We're always on the look-out for interesting information to add to our Web Column. If you've come across a useful blog-post or have discovered a great library that you couldn't live without or have a great tip to share then we'd love to hear about it.&lt;/p&gt;
&lt;p&gt;Please note all content needs to be strictly web-development/tech/geek related. We welcome submissions from original content authors too, if it's well-written, informative and interesting then chances are we'll include it.&lt;/p&gt;
&lt;p&gt;To send us a link, please drop us a line via our &lt;a href="http://projectfondue.com/#get-in-touch" class="reference external"&gt;contact form&lt;/a&gt;. We're always interested in feedback too, so if there's something we should be covering more of please let us know.&lt;/p&gt;
&lt;p&gt;As always, to keep up-to-date with all Project Fondue happenings &lt;a href="https://twitter.com/projectfondue/" class="reference external"&gt;follow us on twitter here&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/GJYAE3m29_A" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2011/2/8/contribute-to-the-web-column</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">The Web Column: Issue No.3</title>
    <id>tag:blog.projectfondue.com,2011-01-14:/entry;2011/1/14/the-web-column:-issue-no-3</id>
    <updated>2011-01-18T10:10:11Z</updated>
    <published>2011-01-18T08:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/EZGrRZR6DeQ/the-web-column:-issue-no-3" />
    <author>
      <name>Stuart Colville</name>
    </author>
    <content type="html">&lt;div id="contents" class="contents rc topic"&gt;
&lt;p class="topic-title first"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="#recent-news" id="id5" class="reference internal"&gt;Recent news&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#google-drops-native-support-for-h-264-from-chrome" id="id6" class="reference internal"&gt;Google Drops Native support for H.264 from Chrome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#puppet-cookbook-launched" id="id7" class="reference internal"&gt;Puppet Cookbook Launched&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#why-developers-should-care-about-system-packages" id="id8" class="reference internal"&gt;Why developers should care about system packages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-facebook-ships-code" id="id9" class="reference internal"&gt;How Facebook Ships Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#bazaar-pipeline-plugin-demo" id="id10" class="reference internal"&gt;Bazaar Pipeline Plugin Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#google-app-engine-s-new-high-replication-datastore" id="id11" class="reference internal"&gt;Google App Engine's new High Replication Datastore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#front-end" id="id12" class="reference internal"&gt;Front-End&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#novnc" id="id13" class="reference internal"&gt;NoVNC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#modernizr-2-0-beta-preview" id="id14" class="reference internal"&gt;Modernizr 2.0 Beta Preview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#game-development-and-javascript" id="id15" class="reference internal"&gt;Game development and Javascript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#framework-activity" id="id16" class="reference internal"&gt;Framework activity&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#symphony-2" id="id17" class="reference internal"&gt;Symphony 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#djangocon-europe-2011" id="id18" class="reference internal"&gt;DjangoCon Europe 2011&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-python-corner" id="id19" class="reference internal"&gt;The Python corner&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#ned-batchelder-faked-translations-poxx-py" id="id20" class="reference internal"&gt;Ned Batchelder: Faked translations: poxx.py&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#pyro" id="id21" class="reference internal"&gt;Pyro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#focus-on-wtforms" id="id22" class="reference internal"&gt;Focus on: WTForms&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#getting-data-into-the-form" id="id23" class="reference internal"&gt;Getting Data into the form&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#updating-db-objects-with-validated-data" id="id24" class="reference internal"&gt;Updating DB objects with validated data&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="recent-news" class="section"&gt;
&lt;h2&gt;&lt;a href="#id5" class="toc-backref"&gt;Recent news&lt;/a&gt;&lt;/h2&gt;
&lt;div id="google-drops-native-support-for-h-264-from-chrome" class="section"&gt;
&lt;h3&gt;&lt;a href="#id6" class="toc-backref"&gt;Google Drops Native support for H.264 from Chrome&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There's been a strong reaction to the news that Google is dropping native support for the H.264 codec within Google Chrome in order to push forward their own open-source &lt;a href="http://www.webmproject.org/" class="reference external"&gt;WebM&lt;/a&gt; codec. There's plenty of polarised opinons, and that's not suprising with Apple and Microsoft in one corner and Opera, Mozilla and Google in the other (&lt;a href="http://www.flickr.com/photos/24374884@N08/5349656086/" class="reference external"&gt;see this chart from Bruce Lawson&lt;/a&gt;).&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;daringfireball.net - &lt;a href="http://daringfireball.net/linked/2011/01/11/h264-chrome" class="reference external"&gt;Google Dropping Support for H.264 in Chrome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;wired.com - &lt;a href="http://www.wired.com/epicenter/2011/01/google-reveals-plan-to-remove-h-264-support-from-chrome/" class="reference external"&gt;Google Reveals Plan To Remove H.264 Support From Chrome&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="puppet-cookbook-launched" class="section"&gt;
&lt;h3&gt;&lt;a href="#id7" class="toc-backref"&gt;Puppet Cookbook Launched&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Former colleague &lt;a href="http://www.unixdaemon.net/" class="reference external"&gt;Dean Wilson&lt;/a&gt; has been hard at work over the break putting together the &lt;a href="http://www.puppetcookbook.com/" class="reference external"&gt;Puppet Cookbook&lt;/a&gt; - It's full of sound tips and definitely a resource worth keeping tabs on if you're using Puppet for configuration management.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="why-developers-should-care-about-system-packages" class="section"&gt;
&lt;h3&gt;&lt;a href="#id8" class="toc-backref"&gt;Why developers should care about system packages&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In &lt;a href="http://morethanseven.net/2011/01/16/Why-developers-should-care-about-system-packages.html" class="reference external"&gt;Why developers should care about system packages&lt;/a&gt; Gareth Rushgrove details why system packages are important and why packaging skills are important for developers to learn. He also mentions Launchpad's excellent PPA feature, which is something we use quite a bit here at Project Fondue for backporting newer package versions. Back-porting a newer version of a package is something that PPA's are really handy for. Particularly as with a lot of packages this is often a relatively simple task.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="how-facebook-ships-code" class="section"&gt;
&lt;h3&gt;&lt;a href="#id9" class="toc-backref"&gt;How Facebook Ships Code&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Whether you like the site's purpose or not, there is no denying that Facebook is a high traffic, technically challenging site. &lt;a href="http://framethink.wordpress.com/2011/01/17/how-facebook-ships-code/" class="reference external"&gt;These rumors&lt;/a&gt; on how Facebook handles development and deployment are of course to take with a grain of salt, but can provide a little insight into how different a company Facebook might be, should you care.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="bazaar-pipeline-plugin-demo" class="section"&gt;
&lt;h3&gt;&lt;a href="#id10" class="toc-backref"&gt;Bazaar Pipeline Plugin Demo&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://bazaarvcs.wordpress.com/2011/01/16/bzr-pipelines-demo-video/" class="reference external"&gt;Bazaar Pipeline Plugin Demo&lt;/a&gt; provides a run-through of what can be achieved with the &lt;a href="http://wiki.bazaar.canonical.com/BzrPipeline" class="reference external"&gt;bzr-pipeline plugin&lt;/a&gt;. Which looks potentially very useful for breaking up large projects in to smaller bite-sized, reviewable chunks.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="google-app-engine-s-new-high-replication-datastore" class="section"&gt;
&lt;h3&gt;&lt;a href="#id11" class="toc-backref"&gt;Google App Engine's new High Replication Datastore&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://googleappengine.blogspot.com/2011/01/announcing-high-replication-datastore.html" class="reference external"&gt;Google has announced that it will now support a second datastore for App Engine&lt;/a&gt; as a remedy to availability problems encountered with the regular Master/Slave datastore. There are a few caveats though:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;an application has to take particular precautions when using this new High Replication datastore, particularly regarding write latency, which can be much higher than before. Therefore data consistency is not guaranteed as much as it was with the Master/Slave datastore.&lt;/li&gt;
&lt;li&gt;the new duplicates data across many data centers, which means more bandwidth used by Google, which in turn means the pricing of this new datastore is significantly higher than its little brother's. Google is starting with a three times more expensive scheme and will re-evaluate the price in June.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Despite its drawbacks, the new datastore seems like a pretty robust offer.
If you value Google App Engine as your hosting platform of choice and should avoid downtimes at all cost, this might just be the solution you were waiting for.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="front-end" class="section"&gt;
&lt;h2&gt;&lt;a href="#id12" class="toc-backref"&gt;Front-End&lt;/a&gt;&lt;/h2&gt;
&lt;div id="novnc" class="section"&gt;
&lt;h3&gt;&lt;a href="#id13" class="toc-backref"&gt;NoVNC&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://kanaka.github.com/noVNC/screenshots.html" class="reference external"&gt;NoVNC&lt;/a&gt; - An exciting project which provides VNC with HTML5, websockets and canvas. via &lt;a href="http://twitter.com/sil" class="reference external"&gt;@sil&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="modernizr-2-0-beta-preview" class="section"&gt;
&lt;h3&gt;&lt;a href="#id14" class="toc-backref"&gt;Modernizr 2.0 Beta Preview&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Faruk Ate? and Paul Irish have joined forces with Alex Sexton to put out &lt;a href="http://modernizr.github.com/Modernizr/2.0-beta/" class="reference external"&gt;a 2.0 version of Modernizr&lt;/a&gt;, their feature detection Javascript library, which "allows you to target specific browser functionality in your stylesheet". This is a very handy tool when using a progressive enhancement approach, which you already do, of course...&lt;/p&gt;
&lt;/div&gt;
&lt;div id="game-development-and-javascript" class="section"&gt;
&lt;h3&gt;&lt;a href="#id15" class="toc-backref"&gt;Game development and Javascript&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A &lt;a href="http://www.reddit.com/r/javascript/comments/f094j/list_of_js_game_engines_community_effort/" class="reference external"&gt;very long list of game development resources in Javascript&lt;/a&gt; was compiled on Reddit. You can find there a plethora of graphics and audio engines to play with. With WebGL being implemented across most modern web browsers at the moment, game development will soon become a new avenue for your leet JS skillz :)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="framework-activity" class="section"&gt;
&lt;h2&gt;&lt;a href="#id16" class="toc-backref"&gt;Framework activity&lt;/a&gt;&lt;/h2&gt;
&lt;div id="symphony-2" class="section"&gt;
&lt;h3&gt;&lt;a href="#id17" class="toc-backref"&gt;Symphony 2&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Work on Symphony 2 &lt;a href="http://www.symfony-project.org/blog/2011/01/16/a-week-of-symfony-211-10-16-january-2011" class="reference external"&gt;is continuing with recent refactoring (and more)&lt;/a&gt; and &lt;a href="http://www.symfony-project.org/blog/2011/01/17/symfony2-pr5-released" class="reference external"&gt;a PR5 release&lt;/a&gt; which Fabien Potencier said is more or less the equivalent to a beta release. A release candidate is planned soon.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="djangocon-europe-2011" class="section"&gt;
&lt;h3&gt;&lt;a href="#id18" class="toc-backref"&gt;DjangoCon Europe 2011&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.djangoproject.com/weblog/2011/jan/14/djangocon-eu-2011-announced/" class="reference external"&gt;DjangoCon Europe 2011 was recently announced&lt;/a&gt; and will take place in June in Amsterdam, in the old port district (a pretty cool and different area). All the relevant info can be found &lt;a href="http://www.djangocon.eu" class="reference external"&gt;at the official site&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="the-python-corner" class="section"&gt;
&lt;h2&gt;&lt;a href="#id19" class="toc-backref"&gt;The Python corner&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python rocks. At Project Fondue, we love it and so we keep a close eye on what's happening in the Python realms. Here is an excerpt.&lt;/p&gt;
&lt;div id="ned-batchelder-faked-translations-poxx-py" class="section"&gt;
&lt;h3&gt;&lt;a href="#id20" class="toc-backref"&gt;Ned Batchelder: Faked translations: poxx.py&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://nedbatchelder.com/blog/201012/faked_translations_poxxpy.html" class="reference external"&gt;poxx.py&lt;/a&gt;: A Nice utility for testing out gettext translations.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="pyro" class="section"&gt;
&lt;h3&gt;&lt;a href="#id21" class="toc-backref"&gt;Pyro&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.razorvine.net/python/Pyro" class="reference external"&gt;Pyro&lt;/a&gt; stands for Python Remote Object library and does exactly that: let you call Python code running on other machines. The API is very simple and a new version, Pyro 4, is being written from scratch at the moment. RPC can be a tedious task, so there is no doubt this could come as a handy tool to quite a few people.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="focus-on-wtforms" class="section"&gt;
&lt;h2&gt;&lt;a href="#id22" class="toc-backref"&gt;Focus on: WTForms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://wtforms.simplecodes.com" class="reference external"&gt;WTForms&lt;/a&gt;, by Thomas Johansson and James Crasta, is a forms library which is in appearance very close to Django's forms library, but is framework-agnostic.&lt;/p&gt;
&lt;p&gt;WTForms is a great choice if you are using a lighter-weight framework with a standalone ORM. It integrates with result objects in a very elegant way.&lt;/p&gt;
&lt;p&gt;Here's an example of a form taken straight from the docs. This is fairly similar to Django forms on the whole. As the forms are just python classes you can subclass forms quickly and easily to add an extra field if you need to.&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;wtforms&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Form&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BooleanField&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;validators&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProfileForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Form&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""User profile."""&lt;/span&gt;
    &lt;span class="n"&gt;birthday&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateTimeField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Your Birthday'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'%m/&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s"&gt;/%y'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TextAreaField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Forum Signature'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div id="getting-data-into-the-form" class="section"&gt;
&lt;h3&gt;&lt;a href="#id23" class="toc-backref"&gt;Getting Data into the form&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The really nice feature is how you can easily use both formdata and an object to update your form.&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;edit_profile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt;
    &lt;span class="n"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ProfileForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;'POST'&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;populate_obj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'edit_profile'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;render_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'edit_profile.html'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There's two things to note here. See the form instance is created by passing in the POST and the user object. Forms get data using the following precdences:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Form Data - form data has the highest priority&lt;/li&gt;
&lt;li&gt;Data Object - the data object is the next in line. Usually an object returned by your ORM - e.g. Storm, SQLAlchemy&lt;/li&gt;
&lt;li&gt;Kwargs - kwargs take the lowest priority.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So anything that's not present in the form data (e.g POST) is filled in by the data in the user object in our example above.&lt;/p&gt;
&lt;p&gt;This means it's possible to make create/read/update and delete forms (CRUD) in an arbitrary way.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="updating-db-objects-with-validated-data" class="section"&gt;
&lt;h3&gt;&lt;a href="#id24" class="toc-backref"&gt;Updating DB objects with validated data&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To update the db object &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;form.populate_obj(obj)&lt;/span&gt;&lt;/tt&gt; is used. This simply updates &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;obj&lt;/span&gt;&lt;/tt&gt; with the validated data based on matching it up to the object attrs. It's very neat and easy to use. With a bit of thought it's possible to use your favorite simple framework + your preferred ORM + WTForms and create a nice set of re-usable CRUD forms.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/EZGrRZR6DeQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2011/1/18/the-web-column:-issue-no-3</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">The Web Column: Issue No.2</title>
    <id>tag:blog.projectfondue.com,2010-12-20:/entry;2010/12/20/the-web-column:-issue-no-2</id>
    <updated>2011-01-14T09:15:34Z</updated>
    <published>2010-12-20T00:23:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/MaZfai8x41o/the-web-column:-issue-no-2" />
    <author>
      <name>Cyril Doussin</name>
    </author>
    <content type="html">&lt;div id="contents" class="contents rc topic"&gt;
&lt;p class="topic-title first"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="#recent-news" id="id1" class="reference internal"&gt;Recent news&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#ways-2010-edition" id="id2" class="reference internal"&gt;24 ways 2010 edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#spacelog" id="id3" class="reference internal"&gt;Spacelog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#chrome-cr-48" id="id4" class="reference internal"&gt;Chrome Cr-48&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#websockets-availability-delayed" id="id5" class="reference internal"&gt;WebSockets availability delayed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#prey-open-source-cross-platform-theft-recovery-software" id="id6" class="reference internal"&gt;Prey: Open Source, Cross Platform Theft Recovery software&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#design" id="id7" class="reference internal"&gt;Design&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#retinart-on-page-harmony" id="id8" class="reference internal"&gt;Retinart on page harmony&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#front-end" id="id9" class="reference internal"&gt;Front-End&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#css3-page-curls" id="id10" class="reference internal"&gt;CSS3 page curls&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#framework-activity" id="id11" class="reference internal"&gt;Framework activity&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#django-1-3-getting-there" id="id12" class="reference internal"&gt;Django 1.3 getting there ...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#smisk-a-web-service-framework-written-in-c-and-controlled-by-python" id="id13" class="reference internal"&gt;Smisk: A Web-service framework written in C and controlled by Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-python-corner" id="id14" class="reference internal"&gt;The Python corner&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#configglue" id="id15" class="reference internal"&gt;Configglue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#why-php-is-fun-and-easy-but-python-is-marriage-material" id="id16" class="reference internal"&gt;Why PHP Is Fun and Easy But Python Is Marriage Material&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#focus-on-python-yql" id="id17" class="reference internal"&gt;Focus on: Python YQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#end-of-year" id="id18" class="reference internal"&gt;End of Year!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="recent-news" class="section"&gt;
&lt;h2&gt;&lt;a href="#id1" class="toc-backref"&gt;Recent news&lt;/a&gt;&lt;/h2&gt;
&lt;div id="ways-2010-edition" class="section"&gt;
&lt;h3&gt;&lt;a href="#id2" class="toc-backref"&gt;24 ways 2010 edition&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;24 ways is carrying on with great articles about workflow, organisation, APIs and shiny Javascript and CSS techniques.&lt;/p&gt;
&lt;p&gt;This year, 24 Ways is also printing all articles, selling it for £8 and donating all sales profits to UNICEF. Very cool.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;This year's 24 Ways is at &lt;a href="http://24ways.org/2010/" class="reference external"&gt;http://24ways.org/2010/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fivesimplesteps.com/books/the-24-ways-annual-2010" class="reference external"&gt;Order an annual&lt;/a&gt; - hurry though; you can only order a copy during December!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="spacelog" class="section"&gt;
&lt;h3&gt;&lt;a href="#id3" class="toc-backref"&gt;Spacelog&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;James Aylett and (ex-colleague) Mark Norman Francis regularly organise &lt;a href="http://devfort.com/" class="reference external"&gt;/dev/fort&lt;/a&gt;, a week-long gathering of web geeks in an actual fort (yes!). Designers and developers alike collaborate without all the usual interference you can find in a "normal" office. Oh, and the Internet is a 30 minute walk away.&lt;/p&gt;
&lt;p&gt;This year they launched Spacelog, a fantastic presentation of space mission transcripts from Nasa. Two missions are being featured so far: Apollo 13 and Mercury 6.&lt;/p&gt;
&lt;p&gt;The UX, design and frontend work on this site are brilliant. It also offers very cool features like linkable transcript parts, for example &lt;a href="http://apollo13.spacelog.org/05:03:12:07/05:03:12:35/#log-line-443527" class="reference external"&gt;http://apollo13.spacelog.org/05:03:12:07/05:03:12:35/#log-line-443527&lt;/a&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Stay up all night reading Spacelog at &lt;a href="http://spacelog.org" class="reference external"&gt;http://spacelog.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Don't miss Hannah Donovan's &lt;a href="http://24ways.org/2010/extreme-design" class="reference external"&gt;article on 24 Ways detailing the process used during this year's /dev/fort.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="chrome-cr-48" class="section"&gt;
&lt;h3&gt;&lt;a href="#id4" class="toc-backref"&gt;Chrome Cr-48&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Google introduced a Pilot program for Chrome OS notebooks for US-based residents. Open until December 21st (Today!). It has been getting pretty good reviews all around. If they open up a program in Australia and the UK we'd be up for taking it for a spin :)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://www.google.com/chromeos/pilot-program-cr48.html" class="reference external"&gt;http://www.google.com/chromeos/pilot-program-cr48.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slashgear.com/google-cr-48-chrome-os-notebook-review-20120389/" class="reference external"&gt;http://www.slashgear.com/google-cr-48-chrome-os-notebook-review-20120389/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wired.co.uk/news/archive/2010-12/10/first-look-google-netbook" class="reference external"&gt;http://www.wired.co.uk/news/archive/2010-12/10/first-look-google-netbook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="websockets-availability-delayed" class="section"&gt;
&lt;h3&gt;&lt;a href="#id5" class="toc-backref"&gt;WebSockets availability delayed&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You may have heard that Mozilla and Opera have announced that WebSockets won't be enabled by default in their future versions, due to a security issue with protocol. This is of course not very good news since WebSockets are pretty cool to play with and open up the door to a standardised way of implementing many new applications.&lt;/p&gt;
&lt;p&gt;But do not fear, for this is not the end of WebSockets at all. Pusher, which develops a realtime communications platform based on WebSockets has all the details for you:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://blog.pusherapp.com/2010/12/9/it-s-not-websockets-it-s-your-broken-proxy" class="reference external"&gt;http://blog.pusherapp.com/2010/12/9/it-s-not-websockets-it-s-your-broken-proxy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="prey-open-source-cross-platform-theft-recovery-software" class="section"&gt;
&lt;h3&gt;&lt;a href="#id6" class="toc-backref"&gt;Prey: Open Source, Cross Platform Theft Recovery software&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sadly Christmas time is well known to bring an increase in thefts of personal property. Prey is a nice bit of software which provides the means to activate tracking of your laptop or phone after it's been stolen (assuming you've installed it beforehand of course!).&lt;/p&gt;
&lt;p&gt;It can do all-sorts of useful things such as reporting it's location based on wifi triangulation or gps if available as well as taking a photo of the thief if the device is equipped with a camera. Best yet Prey is cross platforma and is currently available for mac, windows, linux and android.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://preyproject.com/" class="reference external"&gt;http://preyproject.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="design" class="section"&gt;
&lt;h2&gt;&lt;a href="#id7" class="toc-backref"&gt;Design&lt;/a&gt;&lt;/h2&gt;
&lt;div id="retinart-on-page-harmony" class="section"&gt;
&lt;h3&gt;&lt;a href="#id8" class="toc-backref"&gt;Retinart on page harmony&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Retinart, a beautiful design blog, has a great post of the Secret Law of Page Harmony, a pretty old technique to lay out elements on a page. They even give you the backstory behind the technique.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://retinart.net/graphic-design/secret-law-of-page-harmony/" class="reference external"&gt;http://retinart.net/graphic-design/secret-law-of-page-harmony/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="front-end" class="section"&gt;
&lt;h2&gt;&lt;a href="#id9" class="toc-backref"&gt;Front-End&lt;/a&gt;&lt;/h2&gt;
&lt;div id="css3-page-curls" class="section"&gt;
&lt;h3&gt;&lt;a href="#id10" class="toc-backref"&gt;CSS3 page curls&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Page curls are quite shiny and Matt Hamm has come up with a nice example of how to make them using only CSS3.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://matthamm.com/box-shadow-curl.html" class="reference external"&gt;http://matthamm.com/box-shadow-curl.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="framework-activity" class="section"&gt;
&lt;h2&gt;&lt;a href="#id11" class="toc-backref"&gt;Framework activity&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Frameworks are built for The Greater Good ™. No matter which language or framework is your favourite, it's always good to be aware of what "the other guys" are doing. So here is what we picked up from the world of frameworks recently:&lt;/p&gt;
&lt;div id="django-1-3-getting-there" class="section"&gt;
&lt;h3&gt;&lt;a href="#id12" class="toc-backref"&gt;Django 1.3 getting there ...&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;... bit by bit. A few deadlines have been missed :( but things aren't that bad, and Django 1.3 is now scheduled for release at the end of January.&lt;/p&gt;
&lt;p&gt;Django 1.3 will feature (amongst many other things) class-based views, improvements to logging and unit testing, and will deprecated mod_python support.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;the latest release schedule blog post: &lt;a href="http://www.djangoproject.com/weblog/2010/dec/13/django-1_3-release-schedule-update/" class="reference external"&gt;http://www.djangoproject.com/weblog/2010/dec/13/django-1_3-release-schedule-update/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="smisk-a-web-service-framework-written-in-c-and-controlled-by-python" class="section"&gt;
&lt;h3&gt;&lt;a href="#id13" class="toc-backref"&gt;Smisk: A Web-service framework written in C and controlled by Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Smisk is a framework for building scalable web-services using python. It's fully WSGI compliant and is currently being used in production by Spotify no-less.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://python-smisk.org/" class="reference external"&gt;http://python-smisk.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://python-smisk.org/examples" class="reference external"&gt;http://python-smisk.org/examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="the-python-corner" class="section"&gt;
&lt;h2&gt;&lt;a href="#id14" class="toc-backref"&gt;The Python corner&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python rocks. At Project Fondue, we love it and so we keep a close eye on what's happening in the Python realms. Here is an excerpt.&lt;/p&gt;
&lt;div id="configglue" class="section"&gt;
&lt;h3&gt;&lt;a href="#id15" class="toc-backref"&gt;Configglue&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Configglue is a nice library that makes it really easy to combine both configuration files and command-line arguments. Fantastic for rolling utility scripts where the the amount of options can make the CLI-args seem a little unwieldy. There's also a separate project for using configglue to replace django settings.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="https://launchpad.net/configglue" class="reference external"&gt;https://launchpad.net/configglue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://launchpad.net/django-configglue/" class="reference external"&gt;https://launchpad.net/django-configglue/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://packages.python.org/django-configglue/walkthrough/" class="reference external"&gt;http://packages.python.org/django-configglue/walkthrough/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="why-php-is-fun-and-easy-but-python-is-marriage-material" class="section"&gt;
&lt;h3&gt;&lt;a href="#id16" class="toc-backref"&gt;Why PHP Is Fun and Easy But Python Is Marriage Material&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An interesting article which takes a look at programming language choices and more specifically deals with the pros and cons of PHP and Python. It makes some good points and is well worth a read if you're a PHP programmer thinking about getting into Python.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://onstartups.com/tabid/3339/bid/20493/Why-PHP-Is-Fun-and-Easy-But-Python-Is-Marriage-Material.aspx" class="reference external"&gt;http://onstartups.com/tabid/3339/bid/20493/Why-PHP-Is-Fun-and-Easy-But-Python-Is-Marriage-Material.aspx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="focus-on-python-yql" class="section"&gt;
&lt;h2&gt;&lt;a href="#id17" class="toc-backref"&gt;Focus on: Python YQL&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python-yql has recently become the newest Open Source project maintained by the Project Fondue Team so we'd thought it would be a good opportunity to highlight it.&lt;/p&gt;
&lt;p&gt;If you've not heard of YQL (Yahoo Query Language) (you've probably been living under a rock) it's a SQL-like way to query the internetz for data from a growing number of public APIs. The nice thing about YQL is that it takes a lot of the effort out of interfacing with other APIs.&lt;/p&gt;
&lt;p&gt;Python-yql is a Python wrapper to YQL which looks to make using YQL from Python as easy as possible. Here's a quick example of what you can do:&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;yql&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Public&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Public&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"""USE 'http://www.datatables.org/&lt;/span&gt;
&lt;span class="s"&gt;ukpostcode/ukpostcode.postcode.xml';&lt;/span&gt;
&lt;span class="s"&gt;                    select * from ukpostcode.postcode&lt;/span&gt;
&lt;span class="s"&gt;                        where postcode='SW1A1AA'&lt;/span&gt;
&lt;span class="s"&gt;                            and format = 'xml'"""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s"&gt;'geo'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;'lat'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="s"&gt;u'51.501007'&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s"&gt;'geo'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;'lng'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="s"&gt;u'-0.141588'&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Python-yql documentation: &lt;a href="http://python-yql.org" class="reference external"&gt;http://python-yql.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python-yql Launchpad Project: &lt;a href="https://launchpad.net/python-yql" class="reference external"&gt;https://launchpad.net/python-yql&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python-yql has been around for about a year, and there's been quite a few updates in that time. However we're always happy to hear from anyone with suggestions or feature requests. If you have found a bug or something doesn't work how you'd expect it to please file a bug on launchpad - &lt;a href="https://launchpad.net/python-yql" class="reference external"&gt;https://launchpad.net/python-yql&lt;/a&gt;. Additionally patches are welcomed.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="end-of-year" class="section"&gt;
&lt;h2&gt;&lt;a href="#id18" class="toc-backref"&gt;End of Year!&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ok, that's it! Join us again in the new year for the next edition of the web column. We're going to retreat to our Mountain hideaway over the Christmas holidays to eat fondue, drink and be merry. Here's wishing you all very happy Christmas and a happy new year!&lt;/p&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/MaZfai8x41o" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2010/12/20/the-web-column:-issue-no-2</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">The Web Column: Issue No.1</title>
    <id>tag:blog.projectfondue.com,2010-12-05:/entry;2010/12/5/the-web-column-issue-1</id>
    <updated>2011-01-14T09:13:37Z</updated>
    <published>2010-12-05T23:21:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/k-kJn37bs5E/the-web-column-issue-1" />
    <author>
      <name>Cyril Doussin</name>
    </author>
    <content type="html">&lt;div id="contents" class="contents rc topic"&gt;
&lt;p class="topic-title first"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="#recent-news" id="id1" class="reference internal"&gt;Recent news&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#ways-2010-edition" id="id2" class="reference internal"&gt;24 ways 2010 edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#css3-flexible-box-layout-module" id="id3" class="reference internal"&gt;CSS3 Flexible Box Layout Module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#jsmentors-mailing-list" id="id4" class="reference internal"&gt;JSMentors mailing list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#new-web-messaging-working-draft" id="id5" class="reference internal"&gt;New Web Messaging working draft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#css-railroad-diagrams" id="id6" class="reference internal"&gt;CSS railroad diagrams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mobilesafari-and-html5" id="id7" class="reference internal"&gt;MobileSafari and HTML5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#apparently-xhtml-2-is-still-around" id="id8" class="reference internal"&gt;Apparently XHTML 2 is still around&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#smashing-magazine-roundup-of-project-questionnaires" id="id9" class="reference internal"&gt;Smashing Magazine roundup of project questionnaires&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#framework-activity" id="id10" class="reference internal"&gt;Framework activity&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#opensocial-1-1-published" id="id11" class="reference internal"&gt;OpenSocial 1.1 published&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#backbone-js-and-django" id="id12" class="reference internal"&gt;Backbone.js and Django&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#djangocon-us-2011-announced" id="id13" class="reference internal"&gt;DjangoCon US 2011 announced&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#rails-for-zombies" id="id14" class="reference internal"&gt;Rails for Zombies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#symphony-2-is-making-good-progress" id="id15" class="reference internal"&gt;Symphony 2 is making good progress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-python-corner" id="id16" class="reference internal"&gt;The Python corner&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#textmate-and-pyflakes" id="id17" class="reference internal"&gt;Textmate and Pyflakes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#yahoo-pipes-python-and-appengine" id="id18" class="reference internal"&gt;Yahoo! Pipes, Python and Appengine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#twisted-10-2-0-out" id="id19" class="reference internal"&gt;Twisted 10.2.0 out&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#python-redis-graph-library" id="id20" class="reference internal"&gt;Python redis graph library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#pysignals" id="id21" class="reference internal"&gt;PySignals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mongrel-and-wsgi-apps" id="id22" class="reference internal"&gt;Mongrel and WSGI apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#scrapemark" id="id23" class="reference internal"&gt;Scrapemark&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#focus-on-object-oriented-css-framework" id="id24" class="reference internal"&gt;Focus on: Object Oriented CSS Framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="recent-news" class="section"&gt;
&lt;h2&gt;&lt;a href="#id1" class="toc-backref"&gt;Recent news&lt;/a&gt;&lt;/h2&gt;
&lt;div id="ways-2010-edition" class="section"&gt;
&lt;h3&gt;&lt;a href="#id2" class="toc-backref"&gt;24 ways 2010 edition&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For the 6th year in a row, Drew McLellan and friends are back to make December the best month of the year.&lt;/p&gt;
&lt;p&gt;The 2010 edition is already packed with progressive enhancement, web fonts, Javascript, CSS, design goodness, and generally good advice, as usual.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Drop whatever you're doing and go read it at &lt;a href="http://24ways.org/2010/" class="reference external"&gt;http://24ways.org/2010/&lt;/a&gt;. Now!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="css3-flexible-box-layout-module" class="section"&gt;
&lt;h3&gt;&lt;a href="#id3" class="toc-backref"&gt;CSS3 Flexible Box Layout Module&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In the same spirit, Robert Nyman has a great article and examples about the CSS3 Flexible Box Layout Module.&lt;/p&gt;
&lt;p&gt;This is something many frontenders have been wishing for, and now it's just around the corner (the IE and Opera teams still need to work on it).&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Robert's article: &lt;a href="http://robertnyman.com/2010/12/02/css3-flexible-box-layout-module-aka-flex-box-introduction-and-demostest-cases/" class="reference external"&gt;http://robertnyman.com/2010/12/02/css3-flexible-box-layout-module-aka-flex-box-introduction-and-demostest-cases/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="jsmentors-mailing-list" class="section"&gt;
&lt;h3&gt;&lt;a href="#id4" class="toc-backref"&gt;JSMentors mailing list&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Rey Bango and Asen Bozhilov decided to put together a list dedicated to all things Javascript, including reviewing code and getting by some of the best JS coders out there. If you don't feel up to scratch on JS, this might be one of the best places to find good advice.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The mailing list's site: &lt;a href="http://jsmentors.com" class="reference external"&gt;http://jsmentors.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The announcement at Ajaxian: &lt;a href="http://ajaxian.com/archives/jsmentors-com-the-mailing-list-to-learn-javascript" class="reference external"&gt;http://ajaxian.com/archives/jsmentors-com-the-mailing-list-to-learn-javascript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="new-web-messaging-working-draft" class="section"&gt;
&lt;h3&gt;&lt;a href="#id5" class="toc-backref"&gt;New Web Messaging working draft&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A new working draft has been published by Ian Hickson regarding communication between different browsing contexts (ie. documents) "regardless of their source domain".&lt;/p&gt;
&lt;p&gt;Of course security measures are part of the spec, which still states "Warning! Use of this API requires extra care to protect users from hostile entities abusing a site for their own purposes."&lt;/p&gt;
&lt;p&gt;Don't let that scare you too much and keep on eye on this spec though, as communication between different web pages would be a big deal if vendors start to implement it.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The draft is at &lt;a href="http://www.w3.org/TR/2010/WD-webmessaging-20101118/" class="reference external"&gt;http://www.w3.org/TR/2010/WD-webmessaging-20101118/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="css-railroad-diagrams" class="section"&gt;
&lt;h3&gt;&lt;a href="#id6" class="toc-backref"&gt;CSS railroad diagrams&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Stoyan Stefanov has decided to "enjoy his unused vacation days" writing a CSS parser in Javascript. Yep.&lt;/p&gt;
&lt;p&gt;After writing a lexer, he's now taking on the parsing task and details his work in a set of railroad diagrams which will give you a little bit of insight into what work browsers have to do upon page load.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The lexer code: &lt;a href="https://github.com/stoyan/etc/tree/master/cssex" class="reference external"&gt;https://github.com/stoyan/etc/tree/master/cssex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Post about parsing, with railroad diagrams: &lt;a href="http://www.phpied.com/css-railroad-diagrams/" class="reference external"&gt;http://www.phpied.com/css-railroad-diagrams/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="mobilesafari-and-html5" class="section"&gt;
&lt;h3&gt;&lt;a href="#id7" class="toc-backref"&gt;MobileSafari and HTML5&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;iOS 4.2 came out recently, with a new version of Mobile Safari and new features: accelerometer, Web sockets, HTML5 Forms, partial XHR2 support and better JS, DOM, SVG and Canvas support.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;You can find a good list of the changes at &lt;a href="http://www.mobilexweb.com/blog/safari-ios-accelerometer-websockets-html5" class="reference external"&gt;http://www.mobilexweb.com/blog/safari-ios-accelerometer-websockets-html5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="apparently-xhtml-2-is-still-around" class="section"&gt;
&lt;h3&gt;&lt;a href="#id8" class="toc-backref"&gt;Apparently XHTML 2 is still around&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Oh well...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://www.w3.org/News/2010.html#entry-8962" class="reference external"&gt;http://www.w3.org/News/2010.html#entry-8962&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="smashing-magazine-roundup-of-project-questionnaires" class="section"&gt;
&lt;h3&gt;&lt;a href="#id9" class="toc-backref"&gt;Smashing Magazine roundup of project questionnaires&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you do freelance work, or even work for an agency, understanding what your clients actually want isn't always that simple.&lt;/p&gt;
&lt;p&gt;I always found Clearleft's Client Ideas Sheet was great, but Smashing Magazine went around and did a round up of many questionnaires of this kind. From all these you can probably compile your own that fits your type and style of work. Very useful stuff.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://www.smashingmagazine.com/2010/11/26/web-design-questionnaires-project-sheets-and-work-sheets/" class="reference external"&gt;http://www.smashingmagazine.com/2010/11/26/web-design-questionnaires-project-sheets-and-work-sheets/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="framework-activity" class="section"&gt;
&lt;h2&gt;&lt;a href="#id10" class="toc-backref"&gt;Framework activity&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Frameworks are built for The Greater Good ™. No matter which language or framework is your favourite, it's always good to be aware of what "the other guys" are doing. So here is what we picked up from the world of frameworks recently:&lt;/p&gt;
&lt;div id="opensocial-1-1-published" class="section"&gt;
&lt;h3&gt;&lt;a href="#id11" class="toc-backref"&gt;OpenSocial 1.1 published&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The OpenSocial spec is carrying on with version 1.1 published in November, with emphasis on pub/sub communication between gadgets.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://blog.opensocial.org/2010/11/opensocial-11-published.html" class="reference external"&gt;http://blog.opensocial.org/2010/11/opensocial-11-published.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="backbone-js-and-django" class="section"&gt;
&lt;h3&gt;&lt;a href="#id12" class="toc-backref"&gt;Backbone.js and Django&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Josh Bohde has a nice example of how to integrate Backbone.js with Django.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://joshbohde.com/2010/11/25/backbonejs-and-django/" class="reference external"&gt;http://joshbohde.com/2010/11/25/backbonejs-and-django/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="djangocon-us-2011-announced" class="section"&gt;
&lt;h3&gt;&lt;a href="#id13" class="toc-backref"&gt;DjangoCon US 2011 announced&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;From the blog post: "DjangoCon US 2011 will be held in Portland, Oregon, from September 6-8 2011. This will be followed by a couple of days of sprints."&lt;/p&gt;
&lt;p&gt;A couple of things to note: the venue has changed, and the organizers are calling for help via their mailing list.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Announcement: &lt;a href="http://www.djangoproject.com/weblog/2010/nov/22/djangocon-us-2011/" class="reference external"&gt;http://www.djangoproject.com/weblog/2010/nov/22/djangocon-us-2011/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Organizers' mailing list: &lt;a href="http://groups.google.com/group/djangocon-organizers" class="reference external"&gt;http://groups.google.com/group/djangocon-organizers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="rails-for-zombies" class="section"&gt;
&lt;h3&gt;&lt;a href="#id14" class="toc-backref"&gt;Rails for Zombies&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In order to make Rails fun to learn, the guys at Envylab came up with a pretty cool educational concept: "You'll watch five videos, each followed by exercises where you'll be programming Rails in your browser."&lt;/p&gt;
&lt;p&gt;Oh, and the whole thing has a Zombie theme.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The site: &lt;a href="http://railsforzombies.org" class="reference external"&gt;http://railsforzombies.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="symphony-2-is-making-good-progress" class="section"&gt;
&lt;h3&gt;&lt;a href="#id15" class="toc-backref"&gt;Symphony 2 is making good progress&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A whole lot of work was checked in recently and apparently it could hit beta before the end of the year.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Summary of recent activity: &lt;a href="http://www.symfony-project.org/blog/2010/11/28/a-week-of-symfony-204-22-28-november-2010" class="reference external"&gt;http://www.symfony-project.org/blog/2010/11/28/a-week-of-symfony-204-22-28-november-2010&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="the-python-corner" class="section"&gt;
&lt;h2&gt;&lt;a href="#id16" class="toc-backref"&gt;The Python corner&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python rocks. At Project Fondue, we love it and so we keep a close eye on what's happening in the Python realms. Here is an excerpt.&lt;/p&gt;
&lt;div id="textmate-and-pyflakes" class="section"&gt;
&lt;h3&gt;&lt;a href="#id17" class="toc-backref"&gt;Textmate and Pyflakes&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;David Crammer wanted inline-error checking in Textmate and made a bundle for it, based on an existing one for Javascript.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Blog post: &lt;a href="http://www.davidcramer.net/code/36327/integrating-pyflakes-into-textmate.html" class="reference external"&gt;http://www.davidcramer.net/code/36327/integrating-pyflakes-into-textmate.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Javascript Tools Bundle: &lt;a href="https://github.com/johnmuhl/javascript-tools-tmbundle" class="reference external"&gt;https://github.com/johnmuhl/javascript-tools-tmbundle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;David's Python Tools Bundle: &lt;a href="https://github.com/dcramer/python-tools-tmbundle" class="reference external"&gt;https://github.com/dcramer/python-tools-tmbundle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="yahoo-pipes-python-and-appengine" class="section"&gt;
&lt;h3&gt;&lt;a href="#id18" class="toc-backref"&gt;Yahoo! Pipes, Python and Appengine&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Greg Gaughan, inspired by others, has decided to compile Yahoo! Pipes into Python code and run them on AppEngine.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Blog post: &lt;a href="http://www.wordloosed.com/running-yahoo-pipes-on-google-app-engine" class="reference external"&gt;http://www.wordloosed.com/running-yahoo-pipes-on-google-app-engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The code on Github: &lt;a href="https://github.com/ggaughan/pipe2py" class="reference external"&gt;https://github.com/ggaughan/pipe2py&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The test site, on AppEngine: &lt;a href="http://pipes-engine.appspot.com" class="reference external"&gt;http://pipes-engine.appspot.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="twisted-10-2-0-out" class="section"&gt;
&lt;h3&gt;&lt;a href="#id19" class="toc-backref"&gt;Twisted 10.2.0 out&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;From the announcement: "Survivors of the release process - what few there were of them - have been heard to claim that this version is "awesome", "even more robust", "fun-sized" and "oven fresh"."&lt;/p&gt;
&lt;p&gt;There's no reason not to use it then.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Announcement: &lt;a href="http://labs.twistedmatrix.com/2010/11/twisted-1020-released.html" class="reference external"&gt;http://labs.twistedmatrix.com/2010/11/twisted-1020-released.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Twisted's site: &lt;a href="http://twistedmatrix.com" class="reference external"&gt;http://twistedmatrix.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="python-redis-graph-library" class="section"&gt;
&lt;h3&gt;&lt;a href="#id20" class="toc-backref"&gt;Python redis graph library&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Amir Salihefendic has implemented a small graph library on top of Redis.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Blog post: &lt;a href="http://amix.dk/blog/post/19592#redis-graph-Graph-database-for-Python" class="reference external"&gt;http://amix.dk/blog/post/19592#redis-graph-Graph-database-for-Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Package on Pypi: &lt;a href="http://pypi.python.org/pypi/redis_graph/1.0" class="reference external"&gt;http://pypi.python.org/pypi/redis_graph/1.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="pysignals" class="section"&gt;
&lt;h3&gt;&lt;a href="#id21" class="toc-backref"&gt;PySignals&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Django implements signals as a nice way to achieve decoupling through your site.&lt;/p&gt;
&lt;p&gt;Theo Julienne extracted that signal dispatcher into its own package and put it on Pypi. Good idea!&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The Package on Pypi: &lt;a href="http://pypi.python.org/pypi/pysignals/0.1.1" class="reference external"&gt;http://pypi.python.org/pypi/pysignals/0.1.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="mongrel-and-wsgi-apps" class="section"&gt;
&lt;h3&gt;&lt;a href="#id22" class="toc-backref"&gt;Mongrel and WSGI apps&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A new WSGI handler for Mongrel was published by Daniel Holth. This adds to the existing "Mongrel2-WSGI-Handler" by Berry.&lt;/p&gt;
&lt;p&gt;If you wanted to play with Mongrel2 and Python, you're all sorted now.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://bitbucket.org/dholth/mongrel2_wsgi" class="reference external"&gt;http://bitbucket.org/dholth/mongrel2_wsgi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/berry/Mongrel2-WSGI-Handler" class="reference external"&gt;https://github.com/berry/Mongrel2-WSGI-Handler&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="scrapemark" class="section"&gt;
&lt;h3&gt;&lt;a href="#id23" class="toc-backref"&gt;Scrapemark&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Scrapemark is a nice little module that lets you easily scrape web pages.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The site: &lt;a href="http://arshaw.com/scrapemark/" class="reference external"&gt;http://arshaw.com/scrapemark/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="focus-on-object-oriented-css-framework" class="section"&gt;
&lt;h2&gt;&lt;a href="#id24" class="toc-backref"&gt;Focus on: Object Oriented CSS Framework&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In most issues, we will spend a bit more time detailing a particular, not necessarily new, project which we deem particularly useful and might not be known from all.&lt;/p&gt;
&lt;p&gt;This time: Nicole Sullivan's Object Oriented CSS Framework (OOCSS for short).&lt;/p&gt;
&lt;p&gt;Through 2008 Nicole developed the idea of a simple, highly reusable and maintainable way of writing CSS code. At the beginning of 2009 she pushed the first public commit of the OOCSS project.&lt;/p&gt;
&lt;p&gt;OOCSS emphasises the importance of separation between the structure and the styling (or "skin"). It also ensures that most "objects" can be embedded in most containers. You've certainly wanted to move a piece of functionality from one location to the other on a page before. Writing your CSS with OOCSS makes this process a lot simpler than it usually is.&lt;/p&gt;
&lt;p&gt;Oh and of course, reusability for you as a developer, means reusability by the browser too. Less parsing is always good for performance.&lt;/p&gt;
&lt;p&gt;OOCSS is not a massive framework of sorts. It is, essentially, a way of working that comes with examples. It advocates a change in mindset: what you usually see as a set of technical properties and attributes, coded in a linear way, element after element, you should try to see as functional, logical blocks and then organise your code as so.&lt;/p&gt;
&lt;p&gt;Looking at the big picture is rarely a waste of time, and what you will gain is clarity both in your head and in your code.&lt;/p&gt;
&lt;p&gt;You can certainly apply principles of OOCSS through your work without necessarily using the provided templates. But toying around with the code on Github doesn't hurt and will at least show you the way all this can be achieved.&lt;/p&gt;
&lt;p&gt;Give it a go, if you don't adopt it, you'll probably learn from it.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Public site: &lt;a href="http://oocss.org" class="reference external"&gt;http://oocss.org&lt;/a&gt; (apparently put together for the Velocity conference)&lt;/li&gt;
&lt;li&gt;The code on Github: &lt;a href="https://github.com/stubbornella/oocss" class="reference external"&gt;https://github.com/stubbornella/oocss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The wiki on Github: &lt;a href="https://github.com/stubbornella/oocss/wiki" class="reference external"&gt;https://github.com/stubbornella/oocss/wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nicole's post introducing OOCSS: &lt;a href="http://www.stubbornella.org/content/2009/02/28/object-oriented-css-grids-on-github/" class="reference external"&gt;http://www.stubbornella.org/content/2009/02/28/object-oriented-css-grids-on-github/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/k-kJn37bs5E" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2010/12/5/the-web-column-issue-1</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">Security: Raw Roles in Docutils</title>
    <id>tag:blog.projectfondue.com,2010-07-27:/entry;2010/7/27/raw-roles-in-docutils</id>
    <updated>2010-07-27T22:23:09Z</updated>
    <published>2010-07-27T21:48:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/uE6ZbLgynHU/security-raw-roles-in-docutils" />
    <author>
      <name>Stuart Colville</name>
    </author>
    <content type="html">&lt;p&gt;The flaw occurs via the roles feature which is designed to allow the author to bypass the parsing of rst. The only problem was that despite the options being set to disable the raw directive which similarly allows unfiltered text, the raw role was still permitted.&lt;/p&gt;
&lt;p&gt;Here's an example of how this could be used:&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="ow"&gt;role&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="k"&gt;unsafe_raw(raw)&lt;/span&gt;
    &lt;span class="nc"&gt;:format:&lt;/span&gt; &lt;span class="nf"&gt;html&lt;/span&gt;

:unsafe_raw:&lt;span class="nv"&gt;`&amp;lt;p onclick="alert('hello')"&amp;gt;Oh Hai (click me)&amp;lt;/p&amp;gt;`&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The good news is following the provision of a &lt;a href="http://sourceforge.net/tracker/?func=detail&amp;amp;atid=422030&amp;amp;aid=2845002&amp;amp;group_id=38414" class="reference external"&gt;patch&lt;/a&gt; this was fixed in release 0.6 of docutils. If you're using reStructuredText on your site where third parties can use it to provide content, it's definitely recommended that you check to make sure you're using 0.6 or higher.&lt;/p&gt;
&lt;div id="related-reading" class="section"&gt;
&lt;h2&gt;Related Reading&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://docutils.sourceforge.net/docs/ref/rst/roles.html#raw" class="reference external"&gt;The documentation for the raw role&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sourceforge.net/tracker/?func=detail&amp;amp;atid=422030&amp;amp;aid=2845002&amp;amp;group_id=38414" class="reference external"&gt;The related bug on sourceforge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rst.projectfondue.com" class="reference external"&gt;Our reStructuredText API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/uE6ZbLgynHU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2010/7/27/security-raw-roles-in-docutils</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">Using Apache in a Python Development Environment</title>
    <id>tag:blog.projectfondue.com,2010-07-12:/entry;2010/7/12/using-apache-in-a-python-development-environment</id>
    <updated>2010-07-12T22:21:07Z</updated>
    <published>2010-07-12T21:52:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/4gMjGyZyimk/using-apache-in-a-python-development-environment" />
    <author>
      <name>Stuart Colville</name>
    </author>
    <content type="html">&lt;div class="figure"&gt;
&lt;img src="http://pf.staticfil.es/blog/images/apache-dev.png" alt="http://pf.staticfil.es/blog/images/apache-dev.png"&gt;
&lt;p class="caption"&gt;figure 1: Apache front-end and two web services.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Initially our development environment used the built-in WSGI server that comes with Werkzeug, but it occurred to me that ultimately this would be running on &lt;a href="http://code.google.com/p/modwsgi" class="reference external"&gt;mod_wsgi&lt;/a&gt; under apache, so we decided to set-up the development environment to use apache instances with mod_wsgi running in daemon mode.&lt;/p&gt;
&lt;p&gt;This actually proved to be fairly straight forward, all that's required is to generate a configuration for each instance at run-time, which points at each application.&lt;/p&gt;
&lt;p&gt;By abstracting the start-up of each instance a single script can fire up the web-services, and additionally the front-end one after the other. The other advantage with this approach is that you can then develop any configurations that make use of apache modules with ease, so for example using something like mod_rewrite is no problem. In essence this means you don't have to write utility code that's just used to replicate something that your server provides.&lt;/p&gt;
&lt;p&gt;Reloading on changes. Development servers such as Werkzeug's come with code to trigger a reload when code changes so that you can see changes instantly during development. Fortunately with mod_wsgi this isn't a problem as the code is provided for you see &lt;a href="http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode" class="reference external"&gt;the mod_wsgi documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Configuring this as part of the environment is simple and works very well.&lt;/p&gt;
&lt;p&gt;All of this means you can have a development evnironment that brings you closer to a production environment with minimal hassle. So far this is working very well for us.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/4gMjGyZyimk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2010/7/12/using-apache-in-a-python-development-environment</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">Building a Static Asset Cluster </title>
    <id>tag:blog.projectfondue.com,2010-02-11:/entry;2010/2/11/building-a-budget-ha-static-asset-cluster</id>
    <updated>2010-03-04T23:22:12Z</updated>
    <published>2010-02-17T12:55:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/msuNhO4-Dsk/building-static-asset-cluster" />
    <author>
      <name>Stuart Colville</name>
    </author>
    <content type="html">&lt;div id="initial-thoughts" class="section"&gt;
&lt;h2&gt;Initial Thoughts&lt;/h2&gt;
&lt;p&gt;As this configuration is going to be used by several sites it became clear that building some kind of redundancy into the setup would be a good idea. Otherwise if this ended up as a single point of failure, all our sites would have no images, JavaScript or CSS should something go wrong with the static server.&lt;/p&gt;
&lt;p&gt;So the first piece in the puzzle was being able to share a single public ip address across 2 Slicehost boxes to provide high availability. We're using the excellent &lt;a href="http://slicehost.com" class="reference external"&gt;Slicehost&lt;/a&gt; as our provider and they're happy to support HA configurations. For a shared IP address all it takes is a mail to Slicehost support to say that's what you want. At the same time I added another public IP so that each box has a dedicated local network and public IP address as well as sharing a single public ip between them.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img src="http://pf.staticfil.es/blog/images/haproxy-nginx-glusterfs.png" alt="http://pf.staticfil.es/blog/images/haproxy-nginx-glusterfs.png"&gt;
&lt;p class="caption"&gt;figure 1: Basic diagram showing simple static cluster across 2 boxes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="setting-up-heartbeat" class="section"&gt;
&lt;h2&gt;Setting up Heartbeat&lt;/h2&gt;
&lt;p&gt;Setting up heartbeat &lt;a href="#heartbeat" id="id1" class="footnote-reference"&gt;[1]&lt;/a&gt;. is an extremely straightforward process it's simply a case of installing the packages and then providing configs for each box as well as a centralised config which is the same on both boxes.&lt;/p&gt;
&lt;p&gt;The way it works is that one box has the shared IP enabled on an alias of the primary network card eth0 in our case. If the non-live server detects the live box has gone down it switches on its alias for the shared IP address. This provides a quick and easy way to have failover. Slicehost provide detailed instructions on using Heartbeat with slices on their site &lt;a href="#slicehostha" id="id2" class="footnote-reference"&gt;[2]&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="setting-up-haproxy" class="section"&gt;
&lt;h2&gt;Setting up HAProxy&lt;/h2&gt;
&lt;p&gt;The next piece is HAProxy &lt;a href="#haproxy" id="id3" class="footnote-reference"&gt;[3]&lt;/a&gt; which we use as a load balancer. This handles all the traffic on port 80 and then balances it across our Nginx boxes which are serving from port 8080. HAProxy requires some fairly simple configuration where you define a farm and define the nodes you want to balance traffic over. If you are balancing traffic for an application it's possible to have HAProxy set cookies so that once a client has made one request all subsequent requests will go to the same box. In our case we are dealing with static content so it's not necessary.&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;server  Static1 xxx.xxx.xxx.xxx:8080 check port 8081 inter 2000
server  Static2 xxx.xxx.xxx.xxx:8080 check port 8081 inter 2000
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So that HAProxy knows which of our Nginx boxes are up, it uses a HEAD request to each machine to check it's alive. This is carried out on a separate port e.g: 8081 so that it's independently controlled. Done this way we can switch off the Nginx config (via a script nginxdissite) in order to temporarily remove it from the farm. An alternative to this would be to turn off access to port 8081 through iptables. Either way; this makes it dead easy to be able to carry out maintenance without removing all static serving capabilities. Adding it back in is just a case of re-enabling the site and then HAProxy can start distributing traffic to that node again.&lt;/p&gt;
&lt;p&gt;HAProxy also comes with a stats page which you can view as a way of being able to see what nodes are up and how much traffic is being served at any one time.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="configuring-nginx" class="section"&gt;
&lt;h2&gt;Configuring Nginx&lt;/h2&gt;
&lt;p&gt;The Nginx &lt;a href="#nginx" id="id4" class="footnote-reference"&gt;[4]&lt;/a&gt; configuration is pretty straightforward in that it's optimised for static asset serving and defines GZIP and Expires along with a couple of custom rewrite rules. The first is to allow Nginx to discard version numbers from requests. This is a cache-busting mechanism for when assets are set with long expiry date of a year in the future. The only way to get the client to download a new asset (when for example a graphic has been altered or CSS updated) is to provide a new URI. This is done by adding the revision to the asset file name. So rather than linking to &lt;cite&gt;/i/foo.png&lt;/cite&gt; we can link to &lt;cite&gt;/i/foo.2348.png&lt;/cite&gt;.&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="k"&gt;rewrite&lt;/span&gt; &lt;span class="s"&gt;"^(.*)\.\d+\.(jpeg|jpg|gif|png|css|js|html)&lt;/span&gt;&lt;span class="nv"&gt;$"&lt;/span&gt;  &lt;span class="nv"&gt;$1.$2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The second rewrite addition is to redirect subdomains to directories. This provides a nice easy way to be able to utilise new subdomains in the future depending without needing to update the configuration. This of course requires a wildcard A record to be set up in DNS as well as a wildcard in the server_name directive.&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;'(.*)\.staticfil.es'&lt;/span&gt; &lt;span class="s"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$subdomain&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;rewrite&lt;/span&gt;  &lt;span class="s"&gt;"^/(.*)&lt;/span&gt;&lt;span class="nv"&gt;$"&lt;/span&gt;  &lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$subdomain/$1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lastly I wrote my own nginxensite/nginxdissite for enabling and disabling configurations. This is based on the same Debian/Ubuntu convention used with Apache. The Apache convention is the following: you have sites-enabled and sites-disabled directories and the sites-enabled directory is set-up so that any configuration within it is automatically included. The a2ensite command symlinks a chosen configuration from sites-available into sites-enabled. The benefit of it is that it encourages good separation of a conf for each site and provides a quick way to drop a particular configuration or replace it with a new one.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="mirroring-static-assets-with-glusterfs" class="section"&gt;
&lt;h2&gt;Mirroring Static Assets with Glusterfs&lt;/h2&gt;
&lt;p&gt;The final issue with setting something like this up is how to cleanly share assets between servers. A basic solution would be to use rsync on cron which is fine, except that there would be a delay between getting files on one box before it is synced to the other one. To eliminate this delay I considered writing a script based on inotify which would run rsync as files were added but this would also create lots of problems to solve, such as ensuring adding lots of files doesn't result in too many rsync processes, but at the same time doing this without losing the almost realtime aspect of delivery which is the desirable result.&lt;/p&gt;
&lt;p&gt;I then started looking into what was available from distributed filesystems.  In the end after some testing I settled on using Glusterfs &lt;a href="#glusterfs" id="id5" class="footnote-reference"&gt;[5]&lt;/a&gt;. Glusterfs has a server and a client component and is very easy to set-up. In our case I made the two boxes run the server configuration which essentially makes each node a mirror of the data. Then each server also runs the client which is essentially a mount of the filesystem via FUSE &lt;a href="#fuse" id="id6" class="footnote-reference"&gt;[6]&lt;/a&gt;. Adding files through the client makes those files almost instantaneously available from both static servers which is perfect for what we are trying to do. The other cool thing with Gluster is that scaling this up through adding more boxes becomes very easy to do.&lt;/p&gt;
&lt;p&gt;Glusterfs is also fault tolerant in that if we drop one of the servers out of the farm for maintenance and continue to add files to be served as soon as that box is back in rotation it will pick up all of the missing files.&lt;/p&gt;
&lt;p&gt;So that's it's - feel free to add your thoughts, comments, experiences of this kind of set-up or similar in the comments.&lt;/p&gt;
&lt;div id="related-links" class="section"&gt;
&lt;h3&gt;Related Links&lt;/h3&gt;
&lt;table rules="none" frame="void" id="heartbeat" class="docutils footnote"&gt;
&lt;colgroup&gt;&lt;col class="label"&gt;&lt;col&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a href="#id1" class="fn-backref"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;HeartBeat Failover &lt;a href="http://www.linux-ha.org/wiki/Heartbeat" class="reference external"&gt;http://www.linux-ha.org/wiki/Heartbeat&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table rules="none" frame="void" id="slicehostha" class="docutils footnote"&gt;
&lt;colgroup&gt;&lt;col class="label"&gt;&lt;col&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a href="#id2" class="fn-backref"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Setting up ip failover on slicehost &lt;a href="http://articles.slicehost.com/2008/10/28/ip-failover-slice-setup-and-installing-heartbeat" class="reference external"&gt;http://articles.slicehost.com/2008/10/28/ip-failover-slice-setup-and-installing-heartbeat&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table rules="none" frame="void" id="haproxy" class="docutils footnote"&gt;
&lt;colgroup&gt;&lt;col class="label"&gt;&lt;col&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a href="#id3" class="fn-backref"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;HAProxy &lt;a href="http://haproxy.1wt.eu/" class="reference external"&gt;http://haproxy.1wt.eu/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table rules="none" frame="void" id="nginx" class="docutils footnote"&gt;
&lt;colgroup&gt;&lt;col class="label"&gt;&lt;col&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a href="#id4" class="fn-backref"&gt;[4]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Nginx &lt;a href="http://wiki.nginx.org/" class="reference external"&gt;http://wiki.nginx.org/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table rules="none" frame="void" id="glusterfs" class="docutils footnote"&gt;
&lt;colgroup&gt;&lt;col class="label"&gt;&lt;col&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a href="#id5" class="fn-backref"&gt;[5]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Gluster File System &lt;a href="http://www.gluster.org/" class="reference external"&gt;http://www.gluster.org/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table rules="none" frame="void" id="fuse" class="docutils footnote"&gt;
&lt;colgroup&gt;&lt;col class="label"&gt;&lt;col&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a href="#id6" class="fn-backref"&gt;[6]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Filesystem in User Space &lt;a href="http://en.wikipedia.org/wiki/Filesystem_in_Userspace" class="reference external"&gt;http://en.wikipedia.org/wiki/Filesystem_in_Userspace&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/msuNhO4-Dsk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2010/2/11/building-static-asset-cluster</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">Getting an Early Warning of Low Disk Space</title>
    <id>tag:blog.projectfondue.com,2010-01-21:/entry;2010/1/21/poor-man-s-low-disk-space-warning-with-python</id>
    <updated>2010-01-21T23:51:57Z</updated>
    <published>2010-01-21T23:11:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/Xu8v5whNdbI/getting-an-early-warning-of-low-disk-space" />
    <author>
      <name>Stuart Colville</name>
    </author>
    <content type="html">&lt;div id="keeping-an-eye-on-disk-space" class="section"&gt;
&lt;h2&gt;Keeping an eye on Disk Space&lt;/h2&gt;
&lt;p&gt;Running out of disk space is not a good situation to be in. Services that run out of disk space can cause your server to blow up in a very short space of time. As a result of that it's a good idea to get an early warning that your machine is on it's way to running out of disk space. This script is a noddy way to get that insight with minimum effort.&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="c"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;

&lt;span class="sd"&gt;"""&lt;/span&gt;
&lt;span class="sd"&gt;Disk Space&lt;/span&gt;
&lt;span class="sd"&gt;Simple class for working out the free disk space on a system&lt;/span&gt;

&lt;span class="sd"&gt;by Stuart Colville http://muffinresearch.co.uk&lt;/span&gt;
&lt;span class="sd"&gt;License: http://www.opensource.org/licenses/mit-license.php&lt;/span&gt;

&lt;span class="sd"&gt;"""&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DiskSpace&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="sd"&gt;"""Free Disk Space"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Init class and retrieves disk space info"""&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;statvfs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;has_free_space&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Bool returns true if remaining space is above limit %"""&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;percent_free&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;percent_free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Gets the amount of space left as a percentage"""&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bytes_capacity&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                                                &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bytes_free&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bytes_capacity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Returns the total capacity in bytes"""&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;f_frsize&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;f_blocks&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bytes_free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Returns the free space in bytes"""&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;f_frsize&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;f_bavail&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bytes_used&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Returns the used space in bytes"""&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;f_frsize&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;f_blocks&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
                                                   &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;f_bavail&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@staticmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;humanize_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="sd"&gt;"""Humanizes bytes&lt;/span&gt;

&lt;span class="sd"&gt;        See http://en.wikipedia.org/wiki/Kilobyte for info on the&lt;/span&gt;
&lt;span class="sd"&gt;        different ways to interpret whether a kilobyte is 1,024 bytes&lt;/span&gt;
&lt;span class="sd"&gt;        or 1,000 bytes&lt;/span&gt;

&lt;span class="sd"&gt;        """&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;kilo&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mf"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"KiB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"MiB"&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"GiB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"TiB"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c"&gt;# fallback&lt;/span&gt;
            &lt;span class="n"&gt;kilo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1000&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"KB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"MB"&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"GB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"TB"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;kilo&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;%.2F%s&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;%.2F%s&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;%.2F%s&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;%.2F%s&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kilo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id="example" class="section"&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;Here's a quick example of how this can be used in practice&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;span class="c"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;

&lt;span class="sd"&gt;"""Simple example command line usage:&lt;/span&gt;

&lt;span class="sd"&gt;Usage: ./check_disk_space.py &amp;lt;percentage free space&amp;gt;&lt;/span&gt;

&lt;span class="sd"&gt;e.g:&lt;/span&gt;

&lt;span class="sd"&gt;$ ./check_disk_space.py 30&lt;/span&gt;
&lt;span class="sd"&gt;Running low on disk space. 20.0% remaining (Warning Threshold: 30%)&lt;/span&gt;
&lt;span class="sd"&gt;Total: 115.13GB&lt;/span&gt;
&lt;span class="sd"&gt;Used:  92.35GB&lt;/span&gt;
&lt;span class="sd"&gt;Avail: 22.77GB&lt;/span&gt;

&lt;span class="sd"&gt;The idea would be to put this in a Cron Job and have it email you when&lt;/span&gt;
&lt;span class="sd"&gt;the free disk space is lower than "n" percent.&lt;/span&gt;

&lt;span class="sd"&gt;"""&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;

&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'../'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;diskspace&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DiskSpace&lt;/span&gt;

&lt;span class="n"&gt;ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DiskSpace&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;perc_arg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;percent_limit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;perc_arg&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mf"&gt;20&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_free_space&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;percent_limit&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"Running low on disk space. &lt;/span&gt;&lt;span class="si"&gt;%s%%&lt;/span&gt;&lt;span class="s"&gt; remaining "&lt;/span&gt;\
       &lt;span class="s"&gt;"(Warning Threshold: &lt;/span&gt;&lt;span class="si"&gt;%s%%&lt;/span&gt;&lt;span class="s"&gt;)"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;percent_free&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;percent_limit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"Total: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;humanize_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bytes_capacity&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mf"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"Used:  &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;humanize_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bytes_used&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mf"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"Avail: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;humanize_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bytes_free&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mf"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This last file can be saved as check_disk_space.py and made executable with:&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;chmod +x check_disk_space.py
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All you then need to do is add a crontab entry and define the limit at which you want to be warned of impending disk space running out.&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;MAILTO=systems@yourdomain.com
0 */2 * * * /path/to/file/free_disk_space 15
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This example will check the space every 2 hours and will email you when the remaining disk space drops below 15%.&lt;/p&gt;
&lt;p&gt;A Branch of these files is available here: &lt;a href="http://code.projectfondue.com/diskspace/trunk/files/head:/diskspace/" class="reference external"&gt;http://code.projectfondue.com/diskspace/trunk/files/head:/diskspace/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Suggestions for improvement are always welcome.&lt;/p&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/Xu8v5whNdbI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2010/1/21/getting-an-early-warning-of-low-disk-space</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">Loggerhead and mod_wsgi</title>
    <id>tag:blog.projectfondue.com,2009-11-26:/entry;2009/11/26/loggerhead-and-mod-wsgi</id>
    <updated>2009-11-27T09:14:52Z</updated>
    <published>2009-11-26T21:55:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/UOF8O7gmIR8/loggerhead-and-mod-wsgi" />
    <author>
      <name>Stuart Colville</name>
    </author>
    <content type="html">&lt;p&gt;Currently &lt;a href="https://edge.launchpad.net/loggerhead" class="reference external"&gt;loggerhead&lt;/a&gt; defaults to using pasteserver out of the box, which means you have to proxy this with Apache if you don't want to use pasteserver directly. Instead of doing that we went the route of setting up Loggerhead under apache with mod_wsgi.&lt;/p&gt;
&lt;p&gt;Here's the wsgi file to set-up the application.&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="n"&gt;BZR_SERVE_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'THE_DIR_CONTAINING_YOUR_BRANCHES_HERE'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;paste.httpexceptions&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HTTPExceptionHandler&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;loggerhead.apps.transport&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BranchesFromTransportRoot&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;loggerhead.apps.error&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ErrorHandlerApp&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;loggerhead.config&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LoggerheadConfig&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;paste.deploy.config&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PrefixMiddleware&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bzrlib.plugin&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_plugins&lt;/span&gt;

&lt;span class="n"&gt;load_plugins&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoggerheadConfig&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BranchesFromTransportRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BZR_SERVE_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PrefixMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HTTPExceptionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ErrorHandlerApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I save this file as loggerhead.wsgi in the checkout of loggerhead.&lt;/p&gt;
&lt;p&gt;Next all you need is a basic apache config and a WSGIAlias directive pointing at the wsgi file. Obviously it goes without saying this example is just for illustrative purposes.&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;VirtualHost&lt;/span&gt; &lt;span class="s"&gt;*:80&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nb"&gt;ServerName&lt;/span&gt; loggerhead

    &lt;span class="nb"&gt;WSGIScriptAlias&lt;/span&gt; / &lt;span class="sx"&gt;/PATH_TO_LOGGERHEAD/loggerhead.wsgi&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Directory&lt;/span&gt; &lt;span class="s"&gt;/PATH_TO_LOGGERHEAD&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nb"&gt;Order&lt;/span&gt; allow,deny
        &lt;span class="nb"&gt;Allow&lt;/span&gt; from &lt;span class="k"&gt;all&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;The following assumes you have a dns entry for whatever value you give ServerName - In my example I use loggerhead which I have set-up on my local machine to point to 127.0.0.1 so I have a local loggerhead running to view my checkouts.&lt;/p&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Change the values of the paths and the ServerName as necessary&lt;/li&gt;
&lt;li&gt;Save this file as loggerhead (or whatever you want to call it) in /etc/apache2/sites-available&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then all you need to do is enable it with&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;sudo a2ensite loggerhead
sudo /etc/init.d/apache2 force-reload
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That's it!&lt;/p&gt;
&lt;p&gt;You can view our code repository at &lt;a href="http://code.projectfondue.com/" class="reference external"&gt;http://code.projectfondue.com/&lt;/a&gt; and a branch for these files is here: &lt;a href="http://code.projectfondue.com/loggerhead-wsgi/trunk/files" class="reference external"&gt;http://code.projectfondue.com/loggerhead-wsgi/trunk/files&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/UOF8O7gmIR8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2009/11/26/loggerhead-and-mod-wsgi</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">Google Chrome Frame — good or bad for the web?</title>
    <id>tag:blog.projectfondue.com,2009-09-23:/entry;2009/9/23/google-chrome-frame-ndash%3B-good-or-bad-for-the-web</id>
    <updated>2009-10-02T20:35:38Z</updated>
    <published>2009-09-23T13:05:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/_2hTiJZS8NQ/google-chrome-frame-good-or-bad-for-the-web" />
    <author>
      <name>Stuart Colville</name>
    </author>
    <content type="html">&lt;p&gt;Here is Google's description of what Chrome Frame is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Google Chrome Frame is an early-stage open source plug-in that seamlessly brings Google Chrome's open web technologies and speedy JavaScript engine to Internet Explorer. With Google Chrome Frame, you can:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Start using open web technologies - like the HTML5 canvas tag - right away, even technologies that aren't yet supported in Internet Explorer 6, 7, or 8.&lt;/li&gt;
&lt;li&gt;Take advantage of JavaScript performance improvements to make your apps faster and more responsive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="attribution"&gt;—&lt;a href="http://code.google.com/chrome/chromeframe/" class="reference external"&gt;http://code.google.com/chrome/chromeframe/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'm intrigued by &lt;a href="http://code.google.com/chrome/chromeframe/" class="reference external"&gt;Google Frame&lt;/a&gt;; on one hand it's a pretty neat way of providing a more advanced experience to users of Internet Explorer, but I'm also concerned that it's providing a prop to browsers that really should be moving towards deprecation. If a browser isn't capable of displaying a site wouldn't it make more sense to point people in the direction of browsers that are more advanced?&lt;/p&gt;
&lt;p&gt;Is this also saying that Google Wave will need Chrome Frame because it will only be meaningful to users with the most up to date technology. If you aren't up to date is there no base-line experience? If that's the case, a future that ignores progressive enhancement has a nasty aroma to it.&lt;/p&gt;
&lt;div class="admonition-update-24th-september-2009 admonition"&gt;
&lt;p class="first admonition-title"&gt;Update: 24th September 2009&lt;/p&gt;
&lt;p class="last"&gt;&lt;a href="http://googlewavedev.blogspot.com/2009/09/google-wave-in-internet-explorer.html" class="reference external"&gt;According to this post on the Google Wave Blog&lt;/a&gt;, it seems IE 6,7 and 8 users will not be able to use Google Wave unless they install the Google Frame Plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="google-frame-and-accessibility" class="section"&gt;
&lt;h2&gt;Google Frame and Accessibility&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.paciellogroup.com/blog/?p=444" class="reference external"&gt;Early investigations by Steve Faulkner&lt;/a&gt; have shown that the inclusion of Google Frame locks out users of assisitive technologies completely.&lt;/p&gt;
&lt;p&gt;Clearly this is an early release and assistive technology support could be improved in a future release. Whilst I'm happy to be proved wrong, I somehow doubt this will change given the epic technical challenges involved. That said, if anyone can do it, Google is a company that is best placed to make it happen.&lt;/p&gt;
&lt;div id="elsewhere" class="section"&gt;
&lt;h3&gt;Elsewhere&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/microsoft/news/2009/09/microsoft-google-chrome-frame-makes-ie-less-secure.ars" class="reference external"&gt;A Microsoft Spokesperson says Google Chrome Frame makes IE less secure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jimray.tumblr.com/post/194793633/more-technical-details-about-google-chrome-frame" class="reference external"&gt;More technical details about Google Chrome Frame&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://groups.google.com/group/google-chrome-frame/browse_thread/thread/7d94aff736a42d29/b3f63eb21c983fd9?hl=en&amp;amp;#b3f63eb21c983fd9" class="reference external"&gt;Google Groups thread with further comment on the acessibility issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/_2hTiJZS8NQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2009/9/23/google-chrome-frame-good-or-bad-for-the-web</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">Apache: Moving from prefork to worker</title>
    <id>tag:blog.projectfondue.com,2009-08-25:/entry;2009/8/25/apache:-moving-from-prefork-to-worker</id>
    <updated>2010-03-04T23:23:57Z</updated>
    <published>2009-08-25T23:53:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/YEpFdopRQSQ/apache-moving-from-prefork-to-worker" />
    <author>
      <name>Stuart Colville</name>
    </author>
    <content type="html">&lt;div id="differences-between-mpm-versions" class="section"&gt;
&lt;h2&gt;Differences between MPM Versions&lt;/h2&gt;
&lt;p&gt;So what are the differences between Apache MPM ("multi-processing module") types?&lt;/p&gt;
&lt;p&gt;MPM Prefork doesn't use threads and instead spawns child processes to serve requests. MPM Worker on the other hand uses multi-threaded processes where each child process utilises a number of threads:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By using threads to serve requests, it is able to serve a large number of requests with less system resources than a process-based server. Yet it retains much of the stability of a process-based server by keeping multiple processes available, each with many threads.&lt;/p&gt;
&lt;p class="attribution"&gt;—Apache 2 Documentation&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Something to bear in mind is that you probably won't want to switch to worker if you are using PHP unless you are ok with using PHP as FastCGI and even then the &lt;a href="http://www.php.net/manual/en/faq.installation.php#faq.installation.apache2" class="reference external"&gt;PHP manual doesn't recommend using MPM worker.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For us that means we are now running our PHP apps using prefork and mod_php on a box dedicated to running PHP. This is better in a lot of ways because it means we can tune Apache for each specific application rather than running a mixture of PHP and Python apps on the same hardware.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="converting-to-mpm-worker" class="section"&gt;
&lt;h2&gt;Converting to mpm-worker&lt;/h2&gt;
&lt;p&gt;Actually carrying out the conversion on an Ubuntu box is as simple as running&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;pre&gt;sudo apt-get install apache2-mpm-worker
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That will remove prefork if you have it installed and will install worker in its place and trigger a restart. That's all there is to it. (Though of course YMMV)&lt;/p&gt;
&lt;/div&gt;
&lt;div id="what-difference-does-it-make" class="section"&gt;
&lt;h2&gt;What Difference does it make?&lt;/h2&gt;
&lt;p&gt;In our case used memory levels dropped a reasonable amount as you can see in the last 6th of this graph:&lt;/p&gt;
&lt;img src="http://pf.staticfil.es/blog/images/radha.png" alt="Graph Showing memory usage down when switched to MPM worker"&gt;
&lt;div id="related-reading" class="section"&gt;
&lt;h3&gt;Related Reading&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a href="http://lucumr.pocoo.org/2007/9/30/pushing-apache-performance" class="reference external"&gt;Pushing Apache Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://httpd.apache.org/docs/2.2/mpm.html" class="reference external"&gt;Multi-Processing Modules (MPMs)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/YEpFdopRQSQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2009/8/25/apache-moving-from-prefork-to-worker</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">CSS Sprite Generator v4.0 available on Launchpad</title>
    <id>tag:blog.projectfondue.com,2009-08-05:/entry;2009/8/5/version-4-of-source-code-for-css-sprite-generator-available-in-launchpad</id>
    <updated>2009-09-01T11:03:28Z</updated>
    <published>2009-08-05T19:25:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/iMcIjvX2i3E/version-4-of-source-code-for-css-sprite-generator-available-in-launchpad" />
    <author>
      <name>Ed Eliot</name>
    </author>
    <content type="html">&lt;p&gt;This is useful for sprites which contain gradients that need to be repeated in a specific direction. There's also been some suggestion, particularly from the Yahoo! performance guys, that &lt;a href="http://developer.yahoo.com/performance/rules.html#opt_sprites" class="reference external"&gt;building sprites horizontally results in a smaller overall image size&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Arranging the images in the sprite horizontally as opposed to vertically usually results in a smaller file size.&lt;/p&gt;
&lt;p class="attribution"&gt;—Yahoo! Exceptional Performance Team&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div id="other-changes" class="section"&gt;
&lt;h2&gt;Other Changes&lt;/h2&gt;
&lt;div id="generated-css" class="section"&gt;
&lt;h3&gt;Generated CSS&lt;/h3&gt;
&lt;p&gt;Displaying the generated CSS within a textarea field (rather than a scrolling div) to enable select all and easier copy and paste.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="component-spacing" class="section"&gt;
&lt;h3&gt;Component Spacing&lt;/h3&gt;
&lt;p&gt;A reduction in the default spacing (horizontal and vertical) between component images in the sprite. This makes the tool kinder to our servers and means, with a default generation, the browser has to handle a smaller uncompressed image in memory. &lt;a href="http://developer.yahoo.com/performance/rules.html#opt_sprites" class="reference external"&gt;This should be of particular benefit to the iphone which doesn't seem to handle large sprites too well.&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"Be mobile-friendly" and don't leave big gaps between the images in a sprite. This doesn't affect the file size as much but requires less memory for the user agent to decompress the image into a pixel map. 100x100 image is 10 thousand pixels, where 1000x1000 is 1 million pixels&lt;/p&gt;
&lt;p class="attribution"&gt;—Yahoo! Exceptional Performance Team&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There's a balance to be had here, of course. The usual reason for including space between component images is to allow for text sizes increases which would otherwise result in partial display of the next image in the sprite. You can see how this would be a particular problem on something like the navigation of the &lt;a href="http://www.yahoo.com/" class="reference external"&gt;Yahoo! home page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="language-selection" class="section"&gt;
&lt;h3&gt;Language Selection&lt;/h3&gt;
&lt;p&gt;Conversion of the language selection interface from a drop down box to a list of links to make it easier for someone to switch to their native language, particularly where they don't understand the currently displayed language. There's an &lt;a href="http://www.w3.org/International/questions/qa-navigation-select" class="reference external"&gt;interesting analysis of the use of drop downs versus links&lt;/a&gt; in the W3C i18n FAQ with the relative benefits and pitfalls of each approach.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="looking-forward" class="section"&gt;
&lt;h2&gt;Looking Forward&lt;/h2&gt;
&lt;p&gt;We've got a few other bugs that need fixing. We'll be working on those shortly and, in due course, we'll also be developing a command line version of the tool. This should make it easy to incorporate into an automated build script. Check back regularly for further details and do drop us a line if you've got any suggestions.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="get-the-code" class="section"&gt;
&lt;h2&gt;Get the Code&lt;/h2&gt;
&lt;p&gt;You can &lt;a href="https://launchpad.net/css-sprite-generator" class="reference external"&gt;get the source code here on Launchpad&lt;/a&gt;. As always comments, suggestions, bugs and patches are welcomed.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="try-version-4-online" class="section"&gt;
&lt;h2&gt;Try Version 4 Online&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://spritegen.website-performance.org/" class="reference external"&gt;CSS Sprite Generator version 4&lt;/a&gt; is available online where you can dive right in and try out the latest features.&lt;/p&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/iMcIjvX2i3E" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2009/8/5/version-4-of-source-code-for-css-sprite-generator-available-in-launchpad</feedburner:origLink></entry>
  <entry xml:base="http://blog.projectfondue.com/feed.atom">
    <title type="text">Raclette: Web App Utils for Python</title>
    <id>tag:blog.projectfondue.com,2009-06-28:/entry;2009/6/28/raclette:-web-app-utils-for-python</id>
    <updated>2009-07-14T10:58:36Z</updated>
    <published>2009-07-12T12:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/projectfondue/posts/~3/qxuY7nPiE1w/raclette:-web-app-utils-for-python" />
    <author>
      <name>Stuart Colville</name>
    </author>
    <content type="html">&lt;p&gt;The goals for Raclette are to provide well tested middlewares and libraries that can be used to facilitate web development. We're also looking to keep the quality of code at a high standard as much as possible whilst balancing that with getting code out there so developers can try it out and provide feedback.&lt;/p&gt;
&lt;div id="raclette-gbs-graded-browser-support-middleware" class="section"&gt;
&lt;h2&gt;raclette.gbs: Graded Browser Support Middleware&lt;/h2&gt;
&lt;p&gt;The first app off the blocks is a WSGI middleware which provides a solution to implementing Yahoo's Graded Browser support strategy see &lt;a href="http://developer.yahoo.com/yui/articles/gbs/" class="reference external"&gt;http://developer.yahoo.com/yui/articles/gbs/&lt;/a&gt; for more information.&lt;/p&gt;
&lt;div id="installation" class="section"&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;sudo easy_install raclette.gbs
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To use the middleware simply wrap the init of the middleware around your WSGI application&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;raclette.gbs&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GradedBrowser&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GradedBrowser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;raclette.gbs works by analyzing the user-agent string and returning a grade stating that the browser is C, A or X grade. Yahoo's own strategy only provides details of which browser's are A grade so the C grade matrix is pretty much created based on guess-work around the notion that C-Grade browsers should be Antiquated and rare.&lt;/p&gt;
&lt;p&gt;Ultimately for the purposes of this middleware only C-grade browsers really need to be identified as A and X grade are generally treated the same. However to be able to give the end user more scope to do different things with browser grades in development or production C and A grades are explicitly identified. It's up to the user to modify the browser matrix should they wish to add or drop support for any particular browser.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="known-issues" class="section"&gt;
&lt;h3&gt;Known Issues&lt;/h3&gt;
&lt;p&gt;There's clearly some work to be done in terms of extending the data used to provide the decisions on which browsers are and aren't supported. With that in mind we're happy to get feedback on which browsers you think need to be indentified. Clearly it doesn't have to be something that's in Yahoo's matrix of support as it's clear that anyone using this may wish to define their own matrix of support.&lt;/p&gt;
&lt;p&gt;Caching is not currently implemented. As the UA string is parsed on every request it's fairly crucial that caching is added - expect several caching solutions to be made available in subsequent releases.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="future-possibilities" class="section"&gt;
&lt;h3&gt;Future Possibilities&lt;/h3&gt;
&lt;p&gt;Something that came up early on was an idea around extending support to include some notion of graded mobile browser support in the sense that you might have MA, MX and MC. At this point it's not clear if having any separate grades for mobile devices is a good thing or not, but certainly being able to detect common mobile browsers would be useful.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="getting-the-code" class="section"&gt;
&lt;h3&gt;Getting the code&lt;/h3&gt;
&lt;p&gt;The code is available on launchpad.net at &lt;a href="https://launchpad.net/raclette.gbs" class="reference external"&gt;https://launchpad.net/raclette.gbs&lt;/a&gt; -- Contributions and patches gratefully received. All code is licensed under the modified BSD license.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/projectfondue/posts/~4/qxuY7nPiE1w" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.projectfondue.com/2009/6/28/raclette:-web-app-utils-for-python</feedburner:origLink></entry>
</feed>

