<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Santiago Lizardo - Technology entrepreneur- Technology entrepreneur</title>
    <link>http://www.santiagolizardo.com</link>
    <description>Articles published by Santiago Lizardo</description>
    <item>
      <title>Git counterpart of svn:external</title>
      <link>http://www.santiagolizardo.com/article/git-counterpart-of-svnexternal/70001</link>
      <description>&lt;p&gt;&#xD;
	Is a very common practice to link external libraries in your coding projects. One nice feature Subversion has let&amp;#39;s you reference external dependencies so that every time you issue a svn up command, not only your code gets updated, but all the dependencies as well.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="" src="http://andyjeffries.co.uk/uploads/articles/33/view_git-logo.png" style="width: 200px; height: 200px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	This is a must in any VCS (version control system), and you can&amp;#39;t expect less from a modern VCS like Git. Git translates the concept of &lt;strong&gt;externals&lt;/strong&gt; -dependencies- into &lt;strong&gt;submodules&lt;/strong&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Here is how I&amp;#39;m using it:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The first time you add a submodule (a dependency):&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	(in the toplevel directory)&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	&lt;code&gt;git submodule add git://&lt;a href="http://github.com/amazonwebservices/aws-sdk-for-php.git" target="_blank"&gt;github.com/&lt;/a&gt;&lt;/code&gt;&lt;a href="http://github.com/amazonwebservices/aws-sdk-for-php.git" target="_blank"&gt;&lt;wbr&gt;&lt;code&gt;amazonwebservices/aws-sdk-for-&lt;/code&gt;&lt;wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/a&gt;&lt;code&gt;&lt;a href="http://github.com/amazonwebservices/aws-sdk-for-php.git" target="_blank"&gt;php.git&lt;/a&gt;&lt;/code&gt;&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;&lt;code&gt; aws&lt;br /&gt;&#xD;
	git submodule update --init&lt;/code&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;&#xD;
	&lt;p&gt;&#xD;
		Then every time you want to get the fresh copy of modules:&lt;br /&gt;&#xD;
		&lt;br /&gt;&#xD;
		&lt;code&gt;git submodule update&lt;/code&gt;&lt;br /&gt;&#xD;
		&amp;nbsp;&lt;/p&gt;&#xD;
	&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 08 Feb 2012 20:52:44 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/git-counterpart-of-svnexternal/70001</guid>
      <dc:date>2012-02-08T20:52:44Z</dc:date>
    </item>
    <item>
      <title>One-Liner: Drop all MySQL tables automatically</title>
      <link>http://www.santiagolizardo.com/article/oneliner-drop-all-mysql-tables-automatically/69001</link>
      <description>&lt;p&gt;&#xD;
	Have you ever wanted to &lt;strong&gt;drop all MySQL tables &lt;/strong&gt;leaving the database untouched? Forget about issuing a DROP TABLE LIKE &amp;#39;%&amp;#39; ... DROP ALL TABLE... etc. those commands don&amp;#39;t exist.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Now is when a combination of the &lt;strong&gt;GROUP_CONCAT&lt;/strong&gt; function and the &lt;strong&gt;INFORMATION_SCHEMA&lt;/strong&gt; database become handy.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	This simple SQL returns the exact line you have to run to drop all the tables at once:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;iframe src="http://embed.snipcat.com/c" style="border: 0px; width: 90%;"&gt;&lt;/iframe&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Surround the statement with &lt;strong&gt;SET foreign_key_checks = X;&lt;/strong&gt; to avoid complaints about foreign keys whatsoever.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;tt&gt;SET foreign_key_checks = FALSE;&lt;/tt&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;tt&gt;SELECT CONCAT( &amp;#39;DROP TABLE &amp;#39;, GROUP_CONCAT( table_name SEPARATOR &amp;#39;, &amp;#39; ), &amp;#39;;&amp;#39; ) FROM information_schema.tables WHERE table_schema = &amp;#39;ingmxdb&amp;#39;;&lt;/tt&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;tt&gt;SET foreign_key_checks = TRUE;&lt;/tt&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 26 Jan 2012 19:32:40 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/oneliner-drop-all-mysql-tables-automatically/69001</guid>
      <dc:date>2012-01-26T19:32:40Z</dc:date>
    </item>
    <item>
      <title>Handling version numbers efficiently in Maven</title>
      <link>http://www.santiagolizardo.com/article/handling-version-numbers-efficiently-in-maven/67001</link>
      <description>&lt;p&gt;&#xD;
	Maven, for those who don&amp;#39;t know it, is a terrific tool used by almost all Java developers. It&amp;#39;s so used mainly because it enforces a number of good practices to be adopted in your project, such as unit testing, documentation, project layout, and a long etc...&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Other feature offered by Maven is the dependency management. This means that you can link your code to dependent libraries, specifying their names and version numbers.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The little bad thing about this, is that sometimes you end with a Maven configuration file (pom.xml) with a list of dozens of dependencies having indicated an old version, and the update of those versions have to be done manually.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	As a tool with a depth sense of flexibility, you enjoy of a vast number of available plugins, and one comes very handy to improve our experience managing dependency versions.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The plugin Versions, lets us check which of our plugins is outdated and consequently, gives us the chance to update it.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Let&amp;#39;s see it in action:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;slizardo@debian:~/Projects/beobachter$ mvn versions:display-dependency-updates&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] Scanning for projects...&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] ------------------------------------------------------------------------&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] Building Beobachter&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] &amp;nbsp; &amp;nbsp;task-segment: [versions:display-dependency-updates]&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] ------------------------------------------------------------------------&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] [versions:display-dependency-updates {execution: default-cli}]&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] artifact commons-collections:commons-collections: checking for updates from central&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] artifact commons-configuration:commons-configuration: checking for updates from central&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] artifact commons-digester:commons-digester: checking for updates from central&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] artifact commons-io:commons-io: checking for updates from central&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] artifact commons-lang:commons-lang: checking for updates from central&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] artifact commons-logging:commons-logging: checking for updates from central&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] artifact junit:junit: checking for updates from central&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] The following dependencies in Dependencies are using the newest version:&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] &amp;nbsp; commons-collections:commons-collections ........................ 3.2.1&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] &amp;nbsp; commons-digester:commons-digester ................................ 2.1&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] &amp;nbsp; commons-io:commons-io .......................................... 2.0.1&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] &amp;nbsp; commons-lang:commons-lang ........................................ 2.6&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] &amp;nbsp; commons-logging:commons-logging ................................ 1.1.1&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] &amp;nbsp; junit:junit ...................................................... 4.9&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO]&amp;nbsp;&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] The following dependencies in Dependencies have newer versions:&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] &amp;nbsp; commons-configuration:commons-configuration ... 1.7 -&amp;gt; 20040121.140929&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO]&amp;nbsp;&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] ------------------------------------------------------------------------&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] BUILD SUCCESSFUL&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] ------------------------------------------------------------------------&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] Total time: 7 seconds&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] Finished at: Sun Sep 18 00:12:54 CEST 2011&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] Final Memory: 14M/79M&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;[INFO] ------------------------------------------------------------------------&lt;/code&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	So far, we&amp;#39;ve seen how Versions informs us about current and new versions.&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	If we decide to use the latest versions available, then we have to issue this command:&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;slizardo@debian:~/Projects/beobachter$ mvn versions:use-next-releases&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] Scanning for projects...&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] ------------------------------------------------------------------------&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] Building Beobachter&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] &amp;nbsp; &amp;nbsp;task-segment: [versions:use-next-releases]&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] ------------------------------------------------------------------------&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] [versions:use-next-releases {execution: default-cli}]&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;span style="background-color:#ffff00;"&gt;&lt;code&gt;&lt;strong&gt;[INFO] Updated commons-configuration:commons-configuration:jar:null:1.7 to version 20030311.152757&lt;/strong&gt;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] ------------------------------------------------------------------------&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] BUILD SUCCESSFUL&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] ------------------------------------------------------------------------&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] Total time: 3 seconds&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] Finished at: Sun Sep 18 00:15:09 CEST 2011&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] Final Memory: 15M/79M&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;[INFO] ------------------------------------------------------------------------&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
	&lt;div&gt;&#xD;
		&amp;nbsp;&lt;/div&gt;&#xD;
	&lt;div&gt;&#xD;
		As you can see from the previous output, Maven Versions found an old component and updated it to the most recent version available.&lt;/div&gt;&#xD;
	&lt;div&gt;&#xD;
		&amp;nbsp;&lt;/div&gt;&#xD;
	&lt;div&gt;&#xD;
		Now you know, save some precious time and keep your projects up to date easily with this plugin.&lt;/div&gt;&#xD;
&lt;/div&gt;</description>
      <pubDate>Sat, 17 Sep 2011 23:38:30 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/handling-version-numbers-efficiently-in-maven/67001</guid>
      <dc:date>2011-09-17T23:38:30Z</dc:date>
    </item>
    <item>
      <title>Installing Debian from a USB stick</title>
      <link>http://www.santiagolizardo.com/article/installing-debian-from-a-usb-stick/66001</link>
      <description>&lt;p&gt;&#xD;
	&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
	I used to install Linux distributions burning a CD and booting from it. But today is lot more easier to find USB drives at home than blank CDs. Moreover, some laptops don&amp;#39;t longer have a CD tray in order to make them thinner.&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	Ok, first of all. Grab a bootable image for your platform (i386 for me) from this URL (or navigate through parent folders):&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;a href="http://http.us.debian.org/debian/dists/stable/main/installer-i386/current/images/hd-media/ "&gt;http://http.us.debian.org/debian/dists/stable/main/installer-i386/current/images/hd-media/&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	Dump the previous image directly into the device (I use zcat here because it&amp;#39;s a compressed image, .gz)&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;code&gt;&lt;strong&gt;zcat boot.img.gz &amp;gt; /dev/sdb&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	Now you can download your favourite ISO flavour which the bootable image will use as installer.&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;a href="http://www.debian.org/CD/netinst/#businesscard-stable"&gt;http://www.debian.org/CD/netinst/#businesscard-stable&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	Don&amp;#39;t forget to copy it to the brand new USB drive (at this point the USB have to have just one partition)&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;code&gt;&lt;strong&gt;cp debian-6.0.2.1-i386-netinst.iso /media/Debian\ Inst/&lt;/strong&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	That&amp;#39;s it. Reboot your computer ensuring the boot order put USB disks before others such as network or harddisks.&lt;/div&gt;</description>
      <pubDate>Mon, 12 Sep 2011 21:04:25 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/installing-debian-from-a-usb-stick/66001</guid>
      <dc:date>2011-09-12T21:04:25Z</dc:date>
    </item>
    <item>
      <title>Arithmetics in Bash</title>
      <link>http://www.santiagolizardo.com/article/arithmetics-in-bash/65001</link>
      <description>&lt;p&gt;&#xD;
	Variable assignment in Bash is as easy as:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;i=20&lt;/code&gt;&lt;/strong&gt; (without spaces around the = sign)&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	And you can refer to the previous variable with the dollar sign:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;echo &amp;quot;Foo: $i&amp;quot;&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	But performing an simple math operation requires a no so intuitive syntax:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;x=$(( $i + 13 ))&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Take note: you need the dollar sign &amp;quot;$&amp;quot; and double parenthesis before &amp;quot;((&amp;quot; and after &amp;quot;))&amp;quot; the arithmetic operation.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Now a simple command to rename all files in the current folder to a new name with a counter in the name. (to generate unique names)&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;i=0; for file in *.txt; do mv $file step-$i.txt; i=$(($i+1)); done&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Keep bashing!&lt;/p&gt;</description>
      <pubDate>Sun, 04 Sep 2011 21:39:42 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/arithmetics-in-bash/65001</guid>
      <dc:date>2011-09-04T21:39:42Z</dc:date>
    </item>
    <item>
      <title>Vim: Jump to classes and functions defined in different files</title>
      <link>http://www.santiagolizardo.com/article/vim-jump-to-classes-and-functions-defined-in-different-files/64003</link>
      <description>&lt;p&gt;&#xD;
	I use Vim everyday. No matter what file format I&amp;#39;m opening (as long as it is a text file) Vim recognises it and help me with its edition. The shortcuts save me lot of time and impress my colleagues :)&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	But sometimes shortcuts are not enough. If you look at other people using robusts IDE such as Eclipse or Netbeans you feel like you are missing something: The ability to jump from one file to another using parent classes, overrided methods and global variables.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="" src="http://www.santiagolizardo.com/r/tag-keyword-name_64002.jpg" style="width: 240px; height: 148px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Fortunately for me, an smart guy invented something called &lt;a href="http://ctags.sourceforge.net/"&gt;exuberant tags&lt;/a&gt;. What it does is to create an index with all the tags (keywords such as method names, class names, variables, interfaces and so on) that later on you can use in Vim to automagically move between files in seconds. (and I&amp;#39;m talking I&amp;#39;ve tested it with a huge project of thousand of files!).&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Enough theory, let&amp;#39;s start practicing. What you need to start using ctags is install it (of course). Do so issuing your favourite apt-get command or (if you are an old-school linux user) compiling it by yourself.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Let&amp;#39;s see how to do it the old way:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;wget http://prdownloads.sourceforge.net/ctags/ctags-5.8.tar.gz&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;tar xvfz ctags-5.8.tar.gz&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;cd ctags-5.8/&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;./configure --prefix=/home/slizardo/apps/ctags&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;make &amp;amp;&amp;amp; make install&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Done! Don&amp;#39;t forget to add the bin folder to the PATH environment variable. ( &lt;code&gt;export PATH=$PATH:/home/slizardo/apps/ctags/bin&lt;/code&gt; )&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The first part is completed. Now it&amp;#39;s turn to create the keywords (&amp;quot;tags&amp;quot;) database, taken from our source repository.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;ctags -f ~/project_tags \&lt;br /&gt;&#xD;
	&amp;nbsp; -h &amp;quot;.php&amp;quot; -R \&lt;br /&gt;&#xD;
	&amp;nbsp; --exclude=&amp;quot;\.svn&amp;quot; \&lt;br /&gt;&#xD;
	&amp;nbsp; --totals=yes \&lt;br /&gt;&#xD;
	&amp;nbsp; --tag-relative=yes \&lt;br /&gt;&#xD;
	&amp;nbsp; --language-force=PHP \&lt;br /&gt;&#xD;
	&amp;nbsp; --PHP-kinds=+cfiv \&lt;br /&gt;&#xD;
	&amp;nbsp; --regex-PHP=&amp;#39;/abstract\s+class\s+([^ ]+)/\1/c/&amp;#39; \&lt;br /&gt;&#xD;
	&amp;nbsp; --regex-PHP=&amp;#39;/interface\s+([^ ]+)/\1/i/&amp;#39; \&lt;br /&gt;&#xD;
	&amp;nbsp; --regex-PHP=&amp;#39;/(public|static|abstract|protected|private)+\s+function\s+([^ (]+)/\2/f/&amp;#39; \&lt;br /&gt;&#xD;
	&amp;nbsp; --regex-PHP=&amp;#39;/\$([a-zA-Z_][a-zA-Z0-9_]*)/\1/v/&amp;#39; \&lt;br /&gt;&#xD;
	&amp;nbsp; Projects/openquestions/webapp&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The previous command tells among other things:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
	&lt;li&gt;&#xD;
		Exclude SVN repositories&lt;/li&gt;&#xD;
	&lt;li&gt;&#xD;
		Treat the code as PHP syntax&lt;/li&gt;&#xD;
	&lt;li&gt;&#xD;
		Index classes, functions (and methods), interfaces and variables using the given regular expressions&lt;/li&gt;&#xD;
	&lt;li&gt;&#xD;
		Traverse the directory Projects/openquestions/webapp to find the source code&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
	Last step, and the most exciting. Open your Vim, execute the command &lt;strong&gt;:set tags=~/project_tags&lt;/strong&gt; place the cursor over a keyword and press &lt;strong&gt;CTRL+]&lt;/strong&gt;... voil&amp;agrave;! You have jumped from file A to file B without notice it! You want to go to the previous file? No prob, press CTRL+T and you&amp;#39;re back.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Happy Viming!&lt;/p&gt;</description>
      <pubDate>Tue, 05 Jul 2011 20:13:57 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/vim-jump-to-classes-and-functions-defined-in-different-files/64003</guid>
      <dc:date>2011-07-05T20:13:57Z</dc:date>
    </item>
    <item>
      <title>How to setup wildcard subdomains in Linux</title>
      <link>http://www.santiagolizardo.com/article/how-to-setup-wildcard-subdomains-in-linux/64001</link>
      <description>&lt;p&gt;&#xD;
	This simple tutorial will show you how to setup an small localhost nameserver to support wildcard subdomains in your development environment.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="" src="http://www.santiagolizardo.com/r/wildcard-subdomain_63001.jpg" style="width: 220px; height: 165px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The file &lt;strong&gt;/etc/hosts&lt;/strong&gt; is very useful and commonly used when you have to map an IP to certain server name/domain. The format is as follow:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;127.0.0.1 www.ponup.dev.ar&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The problem appears when you want to map an unknown or high number of subdomains. It is still possible to use the /etc/hosts to define each of those subdomains:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	127.0.0.1 autos.ponup.dev.ar casas.ponup.dev.ar empleos.ponup.dev.ar&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	But it has an important drawback. It won&amp;#39;t resolve something out of that definition. &lt;em&gt;blog.ponup.dev.ar&lt;/em&gt; is not reachable, &lt;em&gt;m.ponup.dev.ar&lt;/em&gt; is not reachable, and &lt;em&gt;user.nn.ponup.dev.ar&lt;/em&gt; is not reachable as well. (The list of possible subdomains is never ending)&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	How can we solve this? Install a &lt;strong&gt;local DNS server&lt;/strong&gt; is the answer. What I use in my Linux boxes for its simplicity and flexibility is &lt;a href="http://www.thekelleys.org.uk/dnsmasq/doc.html"&gt;dnsmasq&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	As with other .deb packages, the installation is as easy as &lt;strong&gt;sudo apt-get install dnsmasq&lt;/strong&gt;, and only one line is required to modify if you want to configure the domain of this example.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;u&gt;1. Open the dnsmasq configuration:&lt;/u&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;sudo vim /etc/dnsmasq.conf&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;u&gt;2. And add a line like this:&lt;/u&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;address=/ponup.dev.ar/127.0.0.1&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;u&gt;3. After this, a restart of the dnsmasq service is necessary.&lt;/u&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;sudo service dnsmasq restart&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;u&gt;&lt;code&gt;4. Edit the file &lt;strong&gt;/etc/resolv.conf&lt;/strong&gt; to put the new local nameserver &lt;/code&gt;at work.&lt;/u&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;nameserver 127.0.0.1&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;nameserver 8.8.8.8&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;nameserver 8.8.4.4&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	ping whatever-you-need.ponup.dev.ar and the resolution will work!&lt;/p&gt;</description>
      <pubDate>Mon, 04 Jul 2011 21:21:48 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/how-to-setup-wildcard-subdomains-in-linux/64001</guid>
      <dc:date>2011-07-04T21:21:48Z</dc:date>
    </item>
    <item>
      <title>Differences between two Apache projects: Lucene and Solr</title>
      <link>http://www.santiagolizardo.com/article/differences-between-two-apache-projects-lucene-and-solr/62001</link>
      <description>&lt;p&gt;&#xD;
	In a couple of weeks I have to give a talk at &lt;a href="http://www.softonic.com"&gt;work&lt;/a&gt; about Apache Solr. Of course I started to work on the slides few days ago. One of the slides on the presentation is about the differences between Lucene and Solr.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="" src="http://www.santiagolizardo.com/r/apache-solr-lucene_59002.gif" style="width: 351px; height: 231px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The bottom line is, while &lt;strong&gt;Lucene&lt;/strong&gt; is a Java library (.JAR) for full text search, &lt;strong&gt;Solr&lt;/strong&gt; is the Web application (.WAR) wrapping it.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Some noticeable differences:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
	&lt;li&gt;&#xD;
		Lucene does not have a single configuration file. You can only interact with Lucene with the Java API (or a port in C++, PHP, Python, ...).&lt;/li&gt;&#xD;
	&lt;li&gt;&#xD;
		Solr runs over a Java application server and through HTTP calls you can add, remove or query documents of the Lucene index.&lt;/li&gt;&#xD;
	&lt;li&gt;&#xD;
		Solr supports replication.&lt;/li&gt;&#xD;
	&lt;li&gt;&#xD;
		Additionally, Solr offers extra features such as field types (that is, fields of a document have strong types: int, boolean, string, date, ...), &amp;quot;more like this&amp;quot; (a extension to get similar documents), faceting (to get category counting and filtering), autosuggest, spellchecker....&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
	In case you didn&amp;#39;t know, I&amp;#39;m heavily using Solr on ponUp, a vertical &lt;a href="http://www.ponup.us"&gt;search engine for classified ads&lt;/a&gt;. The product works like a charm, fast and consistently.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Please visit this blog often the next days if you want to learn more about &lt;strong&gt;Apache Solr and Lucene&lt;/strong&gt;.&lt;/p&gt;</description>
      <pubDate>Sun, 03 Jul 2011 22:55:54 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/differences-between-two-apache-projects-lucene-and-solr/62001</guid>
      <dc:date>2011-07-03T22:55:54Z</dc:date>
    </item>
    <item>
      <title>(Code) Documentation tools for PHP</title>
      <link>http://www.santiagolizardo.com/article/code-documentation-tools-for-php/60002</link>
      <description>&lt;p&gt;&#xD;
	Programming languages such as Java have their own documentation tools (javadoc), but not all the languages have that luck.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="" src="http://www.santiagolizardo.com/r/writing-documentation_61001.jpg" style="width: 200px; height: 199px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;PHP&lt;/strong&gt; is one of those without an official tool to generate documentation from code. From the beggining of times there is a tool, phpDocumentor, but never became the robust or flexible tool the community needs -from my POV-. Moreover, the development is stopped and the roadmap is not clear.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	What I&amp;#39;ve been using for this purpose is Doxygen. It&amp;#39;s an excellent documentation tool with support not only for PHP but a lot more (C++, Python, Java, ...). This means that for a project with many technologies involved, all the documentation will have the same appearance and control.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Let&amp;#39;s see quickly how to setup a &lt;a href="http://www.stack.nl/~dimitri/doxygen/"&gt;Doxygen&lt;/a&gt; project:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;0. Install Doxygen (only Debian/Ubuntu)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	sudo apt-get install doxygen&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;1. Create a Doxygen configuration file&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;doxygen -g [Optional name, defaults to Doxyfile]&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;2. Adjust the config file parameters&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	One common parameter here is EXTRACT_ALL. If set to YES, Doxygen will include in the generation even not documented class members and functions.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;3. Launch Doxygen!&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;doxygen&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;C&amp;#39;est fini!&lt;/strong&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 02 Jul 2011 00:00:00 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/code-documentation-tools-for-php/60002</guid>
      <dc:date>2011-07-02T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Translating plain addresses to geo coordinates using Python and Google Maps API</title>
      <link>http://www.santiagolizardo.com/article/translating-plain-addresses-to-geo-coordinates-using-python-and-google-maps-api/59001</link>
      <description>&lt;p&gt;&#xD;
	&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		Humans use descriptive names to locate places within a city, a country or the entire World.&lt;em&gt; This isn&amp;#39;t something you didn&amp;#39;t know.&lt;/em&gt; But when it comes to locate those places within a map, then something else is needed. This something else are geografic coordinates expressed in latitude and longitud values.&amp;nbsp;The process which translates from plain addresses to geo coordinates is commonly known as &lt;strong&gt;geodecoding&lt;/strong&gt;, and Google Maps offers a pretty simple service to use it.&lt;/div&gt;&#xD;
	&lt;div&gt;&#xD;
		&amp;nbsp;&lt;/div&gt;&#xD;
	&lt;div style="text-align: center; "&gt;&#xD;
		&lt;img alt="" src="http://www.santiagolizardo.com/r/globe_60001.jpg" style="width: 300px; height: 314px; " /&gt;&lt;/div&gt;&#xD;
	&lt;div&gt;&#xD;
		&amp;nbsp;&lt;/div&gt;&#xD;
	&lt;div id="cke_pastebin"&gt;&#xD;
		I don&amp;#39;t have too much time to explain the script below line by line, but it&amp;#39;s straight forward.&amp;nbsp;It constructs a URL to the&lt;strong&gt; Google Maps API&lt;/strong&gt; endpoint using the postal address as parameter and fetches its content. (a JSON structure) This JSON object has the values you are looking for.&lt;/div&gt;&#xD;
	&lt;div&gt;&#xD;
		&amp;nbsp;&lt;/div&gt;&#xD;
	&lt;div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;try:&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import cStringIO as StringIO&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;except ImportError:&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import StringIO&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&amp;nbsp;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;import urllib, urllib2&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;import json&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&amp;nbsp;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;def translateAddressToCoordinates( address ):&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; urlParams = {&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;address&amp;#39;: address,&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;sensor&amp;#39;: &amp;#39;false&amp;#39;,&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url = &amp;#39;http://maps.google.com/maps/api/geocode/json?&amp;#39; + urllib.urlencode( urlParams )&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; response = urllib2.urlopen( url )&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; responseBody = response.read()&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&amp;nbsp;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; body = StringIO.StringIO( responseBody )&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result = json.load( body )&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if &amp;#39;status&amp;#39; not in result or result[&amp;#39;status&amp;#39;] != &amp;#39;OK&amp;#39;:&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return None&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else:&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return {&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;lat&amp;#39;: result[&amp;#39;results&amp;#39;][0][&amp;#39;geometry&amp;#39;][&amp;#39;location&amp;#39;][&amp;#39;lat&amp;#39;],&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;lng&amp;#39;: result[&amp;#39;results&amp;#39;][0][&amp;#39;geometry&amp;#39;][&amp;#39;location&amp;#39;][&amp;#39;lng&amp;#39;]&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&amp;nbsp;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;if __name__ == &amp;#39;__main__&amp;#39;:&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print decodeAddressToCoordinates(&amp;#39;Buenos Aires, Argentina&amp;#39;)&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div id="cke_pastebin"&gt;&#xD;
			&lt;span style="color:#(color);"&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print decodeAddressToCoordinates(&amp;#39;Diagonal 444, Barcelona, Spain&amp;#39;)&lt;/code&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
		&lt;div&gt;&#xD;
			&amp;nbsp;&lt;/div&gt;&#xD;
	&lt;/div&gt;&#xD;
&lt;/div&gt;</description>
      <pubDate>Wed, 29 Jun 2011 00:00:00 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/translating-plain-addresses-to-geo-coordinates-using-python-and-google-maps-api/59001</guid>
      <dc:date>2011-06-29T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Ignore data from a table, but including its structure when using mysqldump</title>
      <link>http://www.santiagolizardo.com/article/ignore-data-from-a-table-but-including-its-structure-when-using-mysqldump/58001</link>
      <description>&lt;p&gt;&#xD;
	Let&amp;#39;s say you want to export a database from your production server to your workstation. &lt;span style="color:#000080;"&gt;&lt;strong&gt;mysqldump&lt;/strong&gt;&lt;/span&gt; is a handy tool which is surely going to help you with this duty.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	But wait! You realizes one of the tables have a size of more than a hundred of MB.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	When you need to export an entire database and ignore some of the tables, the&lt;span style="color:#000080;"&gt;&lt;strong&gt; --ignore-table&lt;/strong&gt;&lt;/span&gt; (it receives a value with the form SCHEMA.TABLE_NAME) argument comes to the rescue. Just append it to the oher arguments and that&amp;#39;s it.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;mysqldump -h backend-03 -u backend_admin -p --ignore-table=items_db.item_archive items_db &amp;gt; items_db_wo_archive.sql&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The tradeoff about this technique is that the ignored table is not going to be created on the destination schema. The solution? Run the mysqldump twice, one for the entire db without the ignored table(s), and the other to export exclusively the ignored tables structures (no data using the --no-data argument).&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;mysqldump -h backend-03 -u backend_admin -p --ignore-table=items_db.item_archive items_db &amp;gt; items_db_wo_archive.sql&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;mysqldump -h backend-03 -u backend_admin -p --no-data items_db item_archive &amp;gt;&amp;gt; items_db_wo_archive.sql&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	See ya!&lt;/p&gt;</description>
      <pubDate>Thu, 16 Jun 2011 00:00:00 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/ignore-data-from-a-table-but-including-its-structure-when-using-mysqldump/58001</guid>
      <dc:date>2011-06-16T00:00:00Z</dc:date>
    </item>
    <item>
      <title>How to install PEAR and PHPUnit in Debian/Ubuntu</title>
      <link>http://www.santiagolizardo.com/article/how-to-install-pear-and-phpunit-in-debianubuntu/57001</link>
      <description>&lt;p&gt;&#xD;
	In general terms, it&amp;#39;s very easy to install/upgrade new software in APT distros such as Debian/Ubuntu.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	I don&amp;#39;t want to say doing so for PHPUnit or PEAR is more difficult, but has a little, tricky part, upgrading PEAR. If you don&amp;#39;t upgrade PEAR, PHPUnit will complain about an insufficient version and the installation will abort.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Summarizing:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;&lt;strong&gt;sudo apt-get install php-pear&lt;br /&gt;&#xD;
	sudo pear channel-update pear.php.net&lt;br /&gt;&#xD;
	sudo pear upgrade pear&lt;br /&gt;&#xD;
	sudo pear channel-discover pear.phpunit.de&lt;br /&gt;&#xD;
	sudo pear channel-discover pear.symfony-project.com&lt;br /&gt;&#xD;
	sudo pear channel-discover components.ez.no&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	sudo pear install -a phpunit/PHPUnit&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Additionally, if you want to include code coverage in your tests, you have to install the xdebug PHP extension.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;&lt;strong&gt;sudo apt-get install php5-xdebug&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Happy testing!&lt;/p&gt;</description>
      <pubDate>Tue, 14 Jun 2011 00:00:00 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/how-to-install-pear-and-phpunit-in-debianubuntu/57001</guid>
      <dc:date>2011-06-14T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Get rid of the "Cannot set locale" messages</title>
      <link>http://www.santiagolizardo.com/article/get-rid-of-the-cannot-set-locale-messages/56001</link>
      <description>&lt;p&gt;&#xD;
	After installing, and sometimes upgrading, a Linux box it might happen that you get these messages:&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="" src="https://lh6.googleusercontent.com/-dS6jrkoHzsA/TfZvtToCnyI/AAAAAAAAAV8/i4QuDXMVUAs/s144/terminal.png" style="width: 144px; height: 144px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;locale: Cannot set LC_CTYPE to default locale: No such file or directory&lt;br /&gt;&#xD;
	locale: Cannot set LC_MESSAGES to default locale: No such file or directory&lt;br /&gt;&#xD;
	locale: Cannot set LC_ALL to default locale: No such file or directory&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Basically what&amp;#39;s happening is that locale configuration is absent or the locale files are missing. The solution that works for me (a Debian distro) is:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;sudo apt-get install locales&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;sudo dpkg-reconfigure locale&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Happy hacking!&lt;/p&gt;</description>
      <pubDate>Mon, 13 Jun 2011 00:00:00 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/get-rid-of-the-cannot-set-locale-messages/56001</guid>
      <dc:date>2011-06-13T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Getting the name of a class dynamically in Python</title>
      <link>http://www.santiagolizardo.com/article/getting-the-name-of-a-class-dynamically-in-python/55001</link>
      <description>&lt;p&gt;&#xD;
	Have you wonder how to resolve a class name in Python? Wonder no more!&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;class ObscureObject:&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __str__(self):&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return self.__class__.__name__&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;obj = ObscureObject()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;print obj # Result is &amp;quot;ObscureObject&amp;quot; being printed.&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Voil&amp;agrave;!&lt;/p&gt;</description>
      <pubDate>Fri, 03 Jun 2011 00:00:00 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/getting-the-name-of-a-class-dynamically-in-python/55001</guid>
      <dc:date>2011-06-03T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Ternary operator in Python</title>
      <link>http://www.santiagolizardo.com/article/ternary-operator-in-python/54001</link>
      <description>&lt;p&gt;&#xD;
	Is very common to see...&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;expression ? &lt;span style="color:#0000cd;"&gt;if_true&lt;/span&gt; : &lt;span style="color:#b22222;"&gt;if_false&lt;/span&gt;&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	...as the ternary operator of many modern languages. But that expression is incompatible with Python.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="" src="https://lh6.googleusercontent.com/-DEMUORE39jA/TebFIf2qlrI/AAAAAAAAAVk/8WAWEHQeLCE/s144/python-logo.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	I love the Python syntax for this operator, as I show here:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;&lt;strong&gt;&lt;span style="color:#0000cd;"&gt;if_true&lt;/span&gt; if expression else &lt;span style="color:#b22222;"&gt;if_false&lt;/span&gt;&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Python has a lot of other peculiar syntax, and I&amp;#39;ll try to show you most of them in a next series of posts.&lt;/p&gt;</description>
      <pubDate>Thu, 02 Jun 2011 00:00:00 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/ternary-operator-in-python/54001</guid>
      <dc:date>2011-06-02T00:00:00Z</dc:date>
    </item>
    <item>
      <title>My humble advice on saving money</title>
      <link>http://www.santiagolizardo.com/article/my-humble-advice-on-saving-money/53001</link>
      <description>&lt;p&gt;&#xD;
	This time I want you share with you the simplest and effective advice I&amp;#39;ve heard for saving money.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="" src="https://lh3.googleusercontent.com/-ZO71I2SiT8M/TeVW6wMimOI/AAAAAAAAAVU/aW0u5qBCRqo/s800/070504-piggybank.jpg" style="width: 240px; height: 240px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The thing is lot of people save the money at the end of the month. So, depending on the expenses of that particular month, your savings will be huge, small or tiny. When you have all the money of your incomes and no commitments for it, you start spending it on silly, useless things, and by the time you remember you could save, the leftovers are ridiculous.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	So, change the order of your cash flow and start saving a fixed amount of money every month before any other superfluous expenses. It&amp;#39;s a lot more easy to increase your piggy bank this way, and cope your whole money wisely.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Happy savings!&lt;/p&gt;</description>
      <pubDate>Tue, 31 May 2011 00:00:00 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/my-humble-advice-on-saving-money/53001</guid>
      <dc:date>2011-05-31T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Solution for "no such file to load -- net/https (LoadError)"</title>
      <link>http://www.santiagolizardo.com/article/solution-for-no-such-file-to-load-nethttps-loaderror/49001</link>
      <description>&lt;p&gt;&#xD;
	After installing a Ruby command line application and trying to run it I hit with the next message:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;no such file to load -- net/https (LoadError)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Because I am not used to work Ruby as with other technologies, I found this message somehow confusing.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Thanks, one more time, to our big brother Google, I could find the solution on this line:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;sudo apt-get install libopenssl-ruby&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Apparently, my command line utility was requiring some SSL routines available in the libopenssl port for Ruby. Once installed, everything work like a charm.&lt;/p&gt;</description>
      <pubDate>Tue, 08 Feb 2011 00:00:00 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/solution-for-no-such-file-to-load-nethttps-loaderror/49001</guid>
      <dc:date>2011-02-08T00:00:00Z</dc:date>
    </item>
    <item>
      <title>List of DNS hosting (nameservers) services</title>
      <link>http://www.santiagolizardo.com/article/list-of-dns-hosting-nameservers-services/48001</link>
      <description>&lt;p&gt;&#xD;
	I am looking for a good and cheap DNS hosting, so far I&amp;#39;ve found this list of services:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;a href="http://zonomi.com/" target="_blank"&gt;http://zonomi.com/&lt;/a&gt;&lt;a href="http://www.zerigo.com/" target="_blank"&gt;&lt;br /&gt;&#xD;
	http://www.zerigo.com/&lt;/a&gt;&lt;a href="http://dyndns.com/" target="_blank"&gt;&lt;br /&gt;&#xD;
	http://dyndns.com/&lt;/a&gt;&lt;a href="http://aws.amazon.com/route53/" target="_blank"&gt;&lt;br /&gt;&#xD;
	http://aws.amazon.com/route53/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	I am going to update this post as soon as I make a decision on which one to hire.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Many factors influence on this decision: number of domains included in the plan, wildcard support for cname records, price (obviously), maximum number of queries included in a month ...&lt;/p&gt;</description>
      <pubDate>Wed, 02 Feb 2011 23:26:48 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/list-of-dns-hosting-nameservers-services/48001</guid>
      <dc:date>2011-02-02T23:26:48Z</dc:date>
    </item>
    <item>
      <title>How to appeal in the Google Adsense program</title>
      <link>http://www.santiagolizardo.com/article/how-to-appeal-in-the-google-adsense-program/47001</link>
      <description>&lt;p&gt;&#xD;
	Google Adsense is one of those services of Google with an strict policy of use. If one of your Websites have a violation on this policy, will be disabled very quickly.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="Google Adsense" src="http://lh3.ggpht.com/_97t2cvMP3SQ/TUQyXTKRLvI/AAAAAAAAAUQ/o-1MduVmZSQ/s800/adsense_logo.gif" style="width: 209px; height: 40px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Sadly, a readmission on the program is slow, and not always possible. (depending on the severity of the violation)&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The only way on the process of re-activation starts filling and sending the appeal form.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;a href="https://www.google.com/adsense/support/bin/request.py?contact_type=policy_violation_appeal" target="_blank"&gt;https://www.google.com/adsense/support/bin/request.py?contact_type=policy_violation_appeal&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	If you have some luck, a positive answer will arrive to your inbox after a couple of days or weeks.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Please notice that a complete Google Adsense account is very hard to recover from a disabled state, and follows a different procedure.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Worst case scenario is when a fraud activity is detected. If you believe you receive a message from Google and might be an error, contact them using this other form:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;a href="http://www.google.com/support/adsense/bin/request.py?contact_type=appeal_form" target="_blank"&gt;http://www.google.com/support/adsense/bin/request.py?contact_type=appeal_form&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 29 Jan 2011 15:30:36 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/how-to-appeal-in-the-google-adsense-program/47001</guid>
      <dc:date>2011-01-29T15:30:36Z</dc:date>
    </item>
    <item>
      <title>Hide broken (not found) images in HTML</title>
      <link>http://www.santiagolizardo.com/article/hide-broken-not-found-images-in-html/46001</link>
      <description>&lt;p&gt;&#xD;
	One of the most typical things you might have experimented while creating a Web page is the broken image, I mean, a image tag (&amp;lt;img /&amp;gt;) which is pointing to a image that does not exist.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	When that occurs, Firefox hide the image silently, while other browsers such as Internet Explorer show a red cross in the place where the image was expected to be shown.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	This inconsistency between browsers is bad for you and for your users, so, do you want to know how to hide the broken images of your Web no matter the browser of your users? Read carefully.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	There is an special event in HTML called &lt;strong&gt;onerror&lt;/strong&gt;, that is called after an error triggered by the HTML document itself or one of its resources (like an image).&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Having said that, let me show you an example of use:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;&amp;lt;img src=&amp;quot;image-foo-bar.png&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Assuming that image does not exist, Internet Explorer will show:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;img alt="" src="http://lh6.ggpht.com/_97t2cvMP3SQ/TTSxChZrQFI/AAAAAAAAATw/zIVYPjoQzgg/s800/broken_image.gif" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	A quick fix is to handle the &amp;quot;onerror&amp;quot; event to replace the original source of the image with a new one (one confirmed to be working).&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;&amp;lt;img src=&amp;quot;image-foo-bar.png&amp;quot; onerror=&amp;quot;this.src = &amp;#39;image-not-found.png&amp;#39;;&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Easy, isn&amp;#39;t?&lt;/p&gt;</description>
      <pubDate>Mon, 17 Jan 2011 21:15:53 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/hide-broken-not-found-images-in-html/46001</guid>
      <dc:date>2011-01-17T21:15:53Z</dc:date>
    </item>
    <item>
      <title>Blending the Linux shell and Python</title>
      <link>http://www.santiagolizardo.com/article/blending-the-linux-shell-and-python/45001</link>
      <description>&lt;p&gt;&#xD;
	Let&amp;#39;s face it: Python has an extensive library of utilities out there, but sometimes that is not enough.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	What can we do if we need to use the the powerful shell within the Python environment?&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The answer is in fact quite simple. Look at the self-explaining code below:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;import os&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	proc = os.popen(&amp;quot;free -m | awk &amp;#39;{ if(NR == 2) print $4 }&amp;#39;&amp;quot;, &amp;#39;r&amp;#39;)&lt;br /&gt;&#xD;
	freeMemory = proc.readline().strip()&lt;br /&gt;&#xD;
	proc.close()&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	print &amp;#39;Free memory: %s&amp;#39; % freeMemory&lt;/code&gt;&lt;/strong&gt;&lt;br /&gt;&#xD;
	&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The key here is the set of functions to create subprocesses and capture their outputs. (popen) This call is very common not only in Python but in other languages as well.&lt;/p&gt;</description>
      <pubDate>Wed, 12 Jan 2011 20:58:55 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/blending-the-linux-shell-and-python/45001</guid>
      <dc:date>2011-01-12T20:58:55Z</dc:date>
    </item>
    <item>
      <title>SSH without password in two easy steps</title>
      <link>http://www.santiagolizardo.com/article/ssh-without-password-in-two-easy-steps/44001</link>
      <description>&lt;p&gt;&#xD;
	Lot of developers connect to remote systems to do their work. The most common tool to do that, because its security, is SSH.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="" src="http://lh6.ggpht.com/_97t2cvMP3SQ/TRXB33HtrWI/AAAAAAAAATU/P9bcqqLdp_U/s288/secure.jpg" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	It&amp;#39;s common also that after 8 connections to the same server you get tired of entering the password so many times. Luckily for us, there is a simple method to establish trusted connections between SSH client-server, as described below this line:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	1) [OPTIONAL if you already have a key] Generate a public/private key in your client.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;ssh-keygen -t dsa&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(a path to the new key will be asked, as well as a passphrase, leave it in blank)&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	2) Copy the key from your client to the server:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;&lt;strong&gt;ssh-copy-id -i $HOME/.ssh/id_dsa.pub USER@SERVER&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Done! Now it is time to test the connection issuing a ssh USER@SERVER with the hope of no password need to be entered.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Notes:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
	&lt;li&gt;&#xD;
		You can change dsa by rsa, but is not working in all cases, at least for me.&lt;/li&gt;&#xD;
	&lt;li&gt;&#xD;
		The public key of your client will be stored in .ssh/authorized_keys of the server. Make sure this file has 0600 permissions, and the .ssh folder itself has 0700.&lt;/li&gt;&#xD;
&lt;/ul&gt;</description>
      <pubDate>Sat, 25 Dec 2010 10:06:42 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/ssh-without-password-in-two-easy-steps/44001</guid>
      <dc:date>2010-12-25T10:06:42Z</dc:date>
    </item>
    <item>
      <title>If you are Python lover, you will love this offer!</title>
      <link>http://www.santiagolizardo.com/article/if-you-are-python-lover-you-will-love-this-offer/43001</link>
      <description>&lt;p&gt;&#xD;
	Yesterday I received a message from Nikhita Shetty, Marketing Research Executive of &lt;a href="http://www.packtpub.com/" target="_blank"&gt;PACKT Publishing&lt;/a&gt;. She is offering a discount of 20 to 30% in Python books of her editorial.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="" src="http://lh3.ggpht.com/_97t2cvMP3SQ/TQk_8BY1tZI/AAAAAAAAAS0/_w4wUVOOo-s/s288/special-managed-services-offer.jpg" style="width: 288px; height: 219px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	The books listing includes: &lt;strong&gt;Application development with wxPython 2.8, Python Text processing with NLTK, Python Geospatial development, Python testing for Beginners&lt;/strong&gt;, among others. See the full &lt;a href="https://www.packtpub.com/article/exclusive-offer-on-python-books" target="_blank"&gt;list of books&lt;/a&gt; here.&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	These special days are great to buy a book for your geek friends or for your personal joy, and the discounts apply for PDF or printed books, so don&amp;#39;t loose this chance!&lt;br /&gt;&#xD;
	&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Wed, 15 Dec 2010 22:24:45 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/if-you-are-python-lover-you-will-love-this-offer/43001</guid>
      <dc:date>2010-12-15T22:24:45Z</dc:date>
    </item>
    <item>
      <title>HireReporter.com: Business idea for free and to take away.</title>
      <link>http://www.santiagolizardo.com/article/hirereportercom-business-idea-for-free-and-to-take-away/42001</link>
      <description>&lt;p&gt;&#xD;
	Instead of using this idea for my own purposes (as I normally would) I want to share it with you, because I don&amp;#39;t have neither the time nor the knowledge on the field to start it seriously.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="Business idea" src="http://lh6.ggpht.com/_97t2cvMP3SQ/TP_zLP_2u_I/AAAAAAAAASc/cfK1Z5KtGTA/s288/business-idea.jpg" style="width: 231px; height: 288px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	It basically consists of a network (yes, another social network) to &lt;strong&gt;hire reporters remotely&lt;/strong&gt; and pay them per objective. An objective is the work itself: film a demonstration, a concert, conference, report about a civil war, etc.&lt;br /&gt;&#xD;
	Thanks to globalization and tools like Internet (email, twitter, ...) you could contact with people of the entire world (where a Internet connection is available), from amateurs reporters, to professionals, depending on your budget, quality expected, etc.&lt;br /&gt;&#xD;
	From this point and forward, you can add as many functionalities as you want: reputation, translation services, etc. This is just the beginning. I think is a simple idea, with social implications, and plenty of opportunities.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	At last, I looked for a suitable domain available, and I found this one: hirereporter.com (two nice keywords directly related to the business behind this idea). So, I not only giving you the idea, but the domain also! :-)&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Good luck with it! Don&amp;#39;t forget to leave a tip if this idea converts you in a billionaire!&lt;/p&gt;</description>
      <pubDate>Wed, 08 Dec 2010 21:09:36 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/hirereportercom-business-idea-for-free-and-to-take-away/42001</guid>
      <dc:date>2010-12-08T21:09:36Z</dc:date>
    </item>
    <item>
      <title>What are the stopwords and how can I use them?</title>
      <link>http://www.santiagolizardo.com/article/what-are-the-stopwords-and-how-can-i-use-them/41001</link>
      <description>&lt;p&gt;&#xD;
	As you may already know, when search engines are indexing, they calculate&amp;nbsp; the relevance of a content, among other things, by the &lt;strong&gt;occurrences of keywords&lt;/strong&gt; they found.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="Stop words" src="http://lh3.ggpht.com/_97t2cvMP3SQ/TPUZPbdgUEI/AAAAAAAAASE/YiWCzn7wxv0/s288/google_stop_words.jpg" style="width: 200px; height: 197px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Keywords are the words you get from a text after removing the &lt;strong&gt;stopwords&lt;/strong&gt;. What are the stopwords then? Stopwords are &lt;strong&gt;linking words&lt;/strong&gt; -connectors; normally prepositions- which make sense for a human in a conversation or a written text, but not relevant enough for search engines (like Google, Yahoo!, bing, ...)&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;br /&gt;&#xD;
	So, in order to publish documents more keyword-focused (better to &lt;strong&gt;improve your SEO and appear first in SERP&lt;/strong&gt;), is always a good idea to filter stopwords from your URL, meta keywords (this is a must!) and other contents of your Web.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Having said that, let me show you how to filter stopwords using PHP code (easily portable to other languages):&lt;br /&gt;&#xD;
	&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 40px;"&gt;&#xD;
	&lt;br /&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;function filterStopWords($text) {&lt;br /&gt;&#xD;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;// A collection of stopwords, quite incomplete&lt;br /&gt;&#xD;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;$stopWords = array(&amp;#39;is&amp;#39;, &amp;#39;are&amp;#39;, &amp;#39;a&amp;#39;, &amp;#39;the&amp;#39;, &amp;#39;of&amp;#39;);&lt;br /&gt;&#xD;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;$words = explode(&amp;#39; &amp;#39;, strtolower($text));&lt;br /&gt;&#xD;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;$filteredWords = array_diff($words, $stopWords);&lt;br /&gt;&#xD;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;$newText = implode(&amp;#39; &amp;#39;, $filteredWords);&lt;br /&gt;&#xD;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;return $newText;&lt;br /&gt;&#xD;
	}&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	$title = &amp;#39;The book is a complete waste of time&amp;#39;;&lt;br /&gt;&#xD;
	echo &amp;#39;Before: &amp;#39;, $title, PHP_EOL;&lt;br /&gt;&#xD;
	$newTitle = filterStopWords($title);&lt;br /&gt;&#xD;
	echo &amp;#39; After: &amp;#39;, $newTitle, PHP_EOL;&lt;/code&gt;&lt;/strong&gt;&lt;br /&gt;&#xD;
	&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	As a final note: stopwords are heavily use when you use Lucene (or &lt;a href="http://lucene.apache.org/"&gt;Lucene&lt;/a&gt; + &lt;a href="http://lucene.apache.org/solr/"&gt;Solr&lt;/a&gt;) and you want to fine-tune the indexing of your documents.&lt;/p&gt;</description>
      <pubDate>Tue, 30 Nov 2010 15:25:37 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/what-are-the-stopwords-and-how-can-i-use-them/41001</guid>
      <dc:date>2010-11-30T15:25:37Z</dc:date>
    </item>
    <item>
      <title>How to avoid Google App Engine cache your HTTP requests</title>
      <link>http://www.santiagolizardo.com/article/how-to-avoid-google-app-engine-cache-your-http-requests/40001</link>
      <description>&lt;p style="text-align: center;"&gt;&#xD;
	&lt;img alt="" src="http://lh6.ggpht.com/_97t2cvMP3SQ/TOxLuYco1oI/AAAAAAAAARg/LZrG03rWvRk/s800/appengine_lowres.gif" style="width: 142px; height: 109px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Did you know that I use &lt;a href="http://code.google.com/appengine/docs/"&gt;Google App Engine&lt;/a&gt; (Python flavour) as the frontends for &lt;a href="http://www.ponup.com"&gt;ponUp&lt;/a&gt;?&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	ponUp is a search portal splitted in three verticals: &lt;a href="http://www.ponup.ca"&gt;jobs, cars and houses&lt;/a&gt;. While in the frontend I use GAE, the backend servers have Solr instances. The communication between frontend and backends is done with regular HTTP calls.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	GAE offers a urlfetch API to establish this communication. Several days ago I had to deal with a problem that indicated that GAE was caching the HTTP responses using this API.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;a href="http://code.google.com/appengine/docs/python/urlfetch/fetchfunction.html"&gt;Documentation&lt;/a&gt; of Google App Engine suggest to use this line of code:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;resp = urlfetch.fetch(url)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The problem is Google App Engine by default caches responses without stating it anywhere. It&amp;#39;s very confusing when you aren&amp;#39;t taking this information into account in your servers.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Hopefuly, the solution comes in the form of a Python dictionary (a similar solution exists in Java):&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;&lt;strong&gt;resp = urlfetch.fetch(url, headers = { &amp;#39;Cache-Control&amp;#39;: &amp;#39;no-cache,max-age=0&amp;#39;, &amp;#39;Pragma&amp;#39;: &amp;#39;no-cache&amp;#39; })&lt;/strong&gt;&lt;/code&gt;&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	Hope this post makes you aware of this behaviour and save you a headache or two ;)&lt;/p&gt;</description>
      <pubDate>Tue, 23 Nov 2010 23:19:18 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/how-to-avoid-google-app-engine-cache-your-http-requests/40001</guid>
      <dc:date>2010-11-23T23:19:18Z</dc:date>
    </item>
    <item>
      <title>Alternate row colors in OpenOffice Calc</title>
      <link>http://www.santiagolizardo.com/article/alternate-row-colors-in-openoffice-calc/38001</link>
      <description>&lt;p&gt;&#xD;
	Hi reader! Let me show you how to get this nice decoration in your spreadsheets using OpenOffice Calc. The idea is very simple, but you need to be aware of some OO&amp;#39;s features to be able to use it.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Here is how to do it, step by step:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	1) Select the range of cells where you want to be apply this effect. With the cells selected go to the menu &amp;quot;&lt;strong&gt;Format&lt;/strong&gt;&amp;quot;, item &amp;quot;&lt;strong&gt;Conditional formatting&lt;/strong&gt;&amp;quot;.&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;a href="http://lh6.ggpht.com/_97t2cvMP3SQ/TOO0sIJWyvI/AAAAAAAAARI/dX3Ws8wT8Mk/s800/Screenshot-6.png"&gt;&lt;img alt="" src="http://lh6.ggpht.com/_97t2cvMP3SQ/TOO0sIJWyvI/AAAAAAAAARI/dX3Ws8wT8Mk/s400/Screenshot-6.png" style="width: 279px; height: 400px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	2) Change the condition dropdown for the option &amp;quot;&lt;strong&gt;Formula is&lt;/strong&gt;&amp;quot;, and put the text &amp;quot;&lt;strong&gt;ISEVEN(ROW())&lt;/strong&gt;&amp;quot; on the textfield after it. On the &amp;quot;&lt;strong&gt;Cell style&lt;/strong&gt;&amp;quot; dropdown pick the style to be applied to each even row (or create a new style).&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;a href="http://lh6.ggpht.com/_97t2cvMP3SQ/TOO0spR4kNI/AAAAAAAAARM/0-fyz_10PA4/s800/Screenshot-7.png"&gt;&lt;img alt="" src="http://lh6.ggpht.com/_97t2cvMP3SQ/TOO0spR4kNI/AAAAAAAAARM/0-fyz_10PA4/s400/Screenshot-7.png" style="width: 400px; height: 204px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	3) Optional: Impress stakeholders and family with the elegant spreadsheet you have created :-D&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&#xD;
	&lt;a href="http://lh6.ggpht.com/_97t2cvMP3SQ/TOO0s3b_uYI/AAAAAAAAARQ/twe3xgF0fuY/s800/Screenshot-8.png" target="_blank"&gt;&lt;img alt="" src="http://lh6.ggpht.com/_97t2cvMP3SQ/TOO0s3b_uYI/AAAAAAAAARQ/twe3xgF0fuY/s400/Screenshot-8.png" style="width: 344px; height: 400px;" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 17 Nov 2010 11:07:52 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/alternate-row-colors-in-openoffice-calc/38001</guid>
      <dc:date>2010-11-17T11:07:52Z</dc:date>
    </item>
    <item>
      <title>Convert OGG files to MP3 using Linux command line</title>
      <link>http://www.santiagolizardo.com/article/convert-ogg-files-to-mp3-using-linux-command-line/34001</link>
      <description>&lt;p&gt;&#xD;
	This is probably my shortest post ever ;)&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;for f in *.ogg; do temp=$(basename &amp;quot;$f&amp;quot; .ogg); oggdec &amp;quot;$f&amp;quot; -o &amp;quot;$temp.wav&amp;quot;; lame -h &amp;quot;$temp.wav&amp;quot; &amp;quot;$temp.mp3&amp;quot;; done&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 02 Nov 2010 20:26:00 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/convert-ogg-files-to-mp3-using-linux-command-line/34001</guid>
      <dc:date>2010-11-02T20:26:00Z</dc:date>
    </item>
    <item>
      <title>A new born should celebrate his first birthday 3 months after get out of the womb</title>
      <link>http://www.santiagolizardo.com/article/a-new-born-should-celebrate-his-first-birthday-3-months-after-get-out-of-the-womb/29001</link>
      <description>&lt;p&gt;&#xD;
	I&amp;#39;ve been thinking in this idea lately. &lt;em&gt;Disclaimer: is not about IT&lt;/em&gt;.&lt;/p&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	When a baby born, it is usual to say it is one year old after 12 months from this date. I sincerely think this concept is wrong. Here is why: For me it makes sense to say that the &lt;strong&gt;first birthday is 12 months after its conception, 9 in the womb, 3 outside&lt;/strong&gt;.&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
	So, while people ask me how old is my son, sometimes I say 5 months and sometimes 1 year, 2 months old. :-)&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div id="cke_pastebin"&gt;&#xD;
	With this idea I&amp;#39;m also supporting people who see &lt;strong&gt;abortion as a crime&lt;/strong&gt;, as I believe fetus is just a baby &amp;quot;under construction&amp;quot;, but a baby after all.&lt;/div&gt;</description>
      <pubDate>Mon, 20 Sep 2010 22:55:11 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/a-new-born-should-celebrate-his-first-birthday-3-months-after-get-out-of-the-womb/29001</guid>
      <dc:date>2010-09-20T22:55:11Z</dc:date>
    </item>
    <item>
      <title>Reduce video size: Converting AVI to MPEG with mencoder</title>
      <link>http://www.santiagolizardo.com/article/reduce-video-size-converting-avi-to-mpeg-with-mencoder/28001</link>
      <description>&lt;p&gt;&#xD;
	I have lot of videos of my son recorded with a simple camera. The format of these videos is AVI, which is huge in size.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	So, when I want to send them over the wire, I convert them to MPEG, a drastically lighter format.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Here is the command I use:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;mencoder -of avi -ovc lavc -lavcopts vcodec=mpeg4 -oac copy &lt;u&gt;input.avi&lt;/u&gt; -o &lt;u&gt;output.mpg&lt;/u&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Additionally, you can rotate the video adding these parameters to the previous command line:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;-vf rotate=1&lt;/code&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 19 Sep 2010 12:08:19 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/reduce-video-size-converting-avi-to-mpeg-with-mencoder/28001</guid>
      <dc:date>2010-09-19T12:08:19Z</dc:date>
    </item>
    <item>
      <title>Scanner class to read the content of a file in Java</title>
      <link>http://www.santiagolizardo.com/article/scanner-class-to-read-the-content-of-a-file-in-java/27001</link>
      <description>&lt;p&gt;&#xD;
	You could use a combination of InputStream and readers, but starting from Java 1.5+ you can simply use the useful Scanner class as shown here:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;Scanner scanner = new Scanner(file).useDelimiter(&amp;quot;\\Z&amp;quot;);&lt;br /&gt;&#xD;
	String fileContent = scanner.next();&lt;br /&gt;&#xD;
	scanner.close();&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;System.out.println(fileContent);&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	To read the same file but in a line per line basis, replace the previous code with this one:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;Scanner scanner = new Scanner(file);&lt;br /&gt;&#xD;
	String line = null;&lt;br /&gt;&#xD;
	while((line = scanner.nextLine()) != null) {&lt;br /&gt;&#xD;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(line);&lt;br /&gt;&#xD;
	}&lt;br /&gt;&#xD;
	scanner.close();&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The delimiter &amp;quot;\\Z&amp;quot; points to the end of file.&lt;/p&gt;</description>
      <pubDate>Fri, 10 Sep 2010 08:16:51 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/scanner-class-to-read-the-content-of-a-file-in-java/27001</guid>
      <dc:date>2010-09-10T08:16:51Z</dc:date>
    </item>
    <item>
      <title>PHP include_path equivalent in Python</title>
      <link>http://www.santiagolizardo.com/article/php-includepath-equivalent-in-python/26001</link>
      <description>&lt;p&gt;&#xD;
	PHP has a directive to set where to look for PHP scripts during require or import statements. (&lt;strong&gt;include_path&lt;/strong&gt;)&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	If you are looking the equivalent instruction in Python, I&amp;#39;m glad to tell you your search finishes here.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	To share some Python scripts (libraries and so on) outside your current work directory, set the environement variable &lt;strong&gt;PYTHONPATH&lt;/strong&gt; to whatever directory you are using to store these scripts.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	&lt;code&gt;export PYTHONPATH=/opt/python_libs/:$PYTHONPATH&lt;/code&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 05 Sep 2010 16:46:23 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/php-includepath-equivalent-in-python/26001</guid>
      <dc:date>2010-09-05T16:46:23Z</dc:date>
    </item>
    <item>
      <title>Calculate the size of your MySQL databases</title>
      <link>http://www.santiagolizardo.com/article/calculate-the-size-of-your-mysql-databases/24001</link>
      <description>&lt;p&gt;&#xD;
	You have a couple of MySQL db, right? Want to know is the size of each of them?&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	Run this SQL query and get your answer:&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	&lt;strong&gt;&lt;code&gt;SELECT table_schema &amp;#39;Database&amp;#39;, CONCAT(ROUND(SUM(data_length + index_length) / 1024 / 1024, 2), &amp;#39; MB&amp;#39;) AS &amp;#39;Size&amp;#39; FROM information_schema.tables GROUP BY table_schema;&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	As you may see, the calculation is very simple. Just sum &lt;u&gt;the size of the content of each db plus its indexes&lt;/u&gt;.&lt;/p&gt;</description>
      <pubDate>Mon, 30 Aug 2010 13:30:58 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/calculate-the-size-of-your-mysql-databases/24001</guid>
      <dc:date>2010-08-30T13:30:58Z</dc:date>
    </item>
    <item>
      <title>Find files of a given size in Linux and other Unixes</title>
      <link>http://www.santiagolizardo.com/article/find-files-of-a-given-size-in-linux-and-other-unixes/23001</link>
      <description>&lt;p&gt;&#xD;
	&lt;strong&gt;&lt;tt&gt;find /directory -size +10M -printf &amp;quot;%s \t\t%h/%f\n&amp;quot;&lt;/tt&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	No further explanation needed :)&lt;/p&gt;</description>
      <pubDate>Tue, 24 Aug 2010 09:35:30 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/find-files-of-a-given-size-in-linux-and-other-unixes/23001</guid>
      <dc:date>2010-08-24T09:35:30Z</dc:date>
    </item>
    <item>
      <title>How to change the URL of a Subversion repository</title>
      <link>http://www.santiagolizardo.com/article/how-to-change-the-url-of-a-subversion-repository/22001</link>
      <description>&lt;p&gt;&#xD;
	If you have changed the URL of a Subversion repository and want to adjust your local copy to continue working as before, then execute the command:&lt;/p&gt;&#xD;
&lt;blockquote&gt;&#xD;
	&lt;p&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;svn switch --relocate &amp;lt;OLD_URL&amp;gt; &amp;lt;NEW_URL&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&#xD;
	For instance:&lt;/p&gt;&#xD;
&lt;blockquote&gt;&#xD;
	&lt;p&gt;&#xD;
		&lt;code&gt;&lt;strong&gt;svn switch --relocate https://svn.myco.com https://88.99.22.12/svn&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;</description>
      <pubDate>Thu, 29 Jul 2010 15:50:55 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/how-to-change-the-url-of-a-subversion-repository/22001</guid>
      <dc:date>2010-07-29T15:50:55Z</dc:date>
    </item>
    <item>
      <title>Useful tips on PHP streams</title>
      <link>http://www.santiagolizardo.com/article/useful-tips-on-php-streams/21001</link>
      <description>&lt;p&gt;&#xD;
	&lt;strong&gt;PHP&lt;/strong&gt; is a rich language with some features not very popular but extremely useful, like the underlying streams architecture.&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	Almost all the PHP functions that expect a file, can also accept a URL or stream.&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	How this can be useful?&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	Let&amp;#39;s say you want to construct a SoapClient in PHP against a regular file containing your WSDL:&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	&lt;em&gt;$soapClient = new &lt;a href="http://php.net/manual/en/class.soapclient.php" target="_blank"&gt;SoapClient&lt;/a&gt;(&amp;#39;MyService.wsdl&amp;#39;);&lt;/em&gt;&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	That will work without problems, but what would happens if you want to construct the same WebService against a string with the exactly content of the MyService.wsdl file?&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	&lt;em&gt;$content = &amp;#39;&amp;#39;;&lt;br /&gt;&#xD;
	$soapClient = new SoapClient($content);&lt;/em&gt;&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	That will cause an error because the constructor of this class only accept a file or stream as a parameter.&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	The solution is to wrap the string into a data stream, in this way:&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	&lt;em&gt;$soapClient = new SoapClient(&amp;#39;&lt;strong&gt;data://text/plain;base64&lt;/strong&gt;,&amp;#39; . base64_encode($content));&lt;/em&gt;&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	Another example can be found when using the &lt;a href="http://phpexcel.codeplex.com/" target="_blank"&gt;PHPExcel&lt;/a&gt; library. This library creates spreadsheets and there is not (evident)&amp;nbsp; option to save them to an output stream (stdout).&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	So, if you want to throw the image into the standard ouput instead of a file, you can invoke this method directly:&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	&lt;em&gt;writer = new PHPExcel_Writer_Excel2007($excel);&lt;br /&gt;&#xD;
	$writer-&amp;gt;save(&amp;#39;&lt;strong&gt;php://output&lt;/strong&gt;&amp;#39;);&lt;/em&gt;&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	Hope you like this article and it has helped you to discover the amazing flexibility of the streams API in PHP.&lt;br /&gt;&#xD;
	&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Tue, 22 Jun 2010 14:56:39 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/useful-tips-on-php-streams/21001</guid>
      <dc:date>2010-06-22T14:56:39Z</dc:date>
    </item>
    <item>
      <title>Maven trick for bad programmers (skip tests)</title>
      <link>http://www.santiagolizardo.com/article/maven-trick-for-bad-programmers-skip-tests/20001</link>
      <description>&lt;p&gt;&#xD;
	A good programmer should never forget to test the code during and after the development phase, but if you are in a hurry you may find this line useful:&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	&lt;strong&gt;mvn -Dmaven.test.skip&lt;/strong&gt;&lt;br /&gt;&#xD;
	&lt;br /&gt;&#xD;
	Please don&amp;#39;t say I told you this to anybody ;)&lt;/p&gt;</description>
      <pubDate>Thu, 13 May 2010 08:58:12 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/maven-trick-for-bad-programmers-skip-tests/20001</guid>
      <dc:date>2010-05-13T08:58:12Z</dc:date>
    </item>
    <item>
      <title>Remove BOM mark from files with VIM</title>
      <link>http://www.santiagolizardo.com/article/remove-bom-mark-from-files-with-vim/5001</link>
      <description>&lt;p&gt;&#xD;
	Some &lt;em&gt;evil&lt;/em&gt; editors add the &lt;a href="http://en.wikipedia.org/wiki/Byte_order_mark" target="_blank"&gt;BOM&lt;/a&gt; (&lt;strong&gt;Byte Order Mark&lt;/strong&gt;) at the beginnig of the files you edit with them.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	This sometimes may clash with other tools, like the famous Java tool Maven. If you received an error message doing a mvn compile you clearly need to remove the BOM from the affected files.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Thankfully my favourite editor, VIM, comes with an option to automatically remove the BOM from any file.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Instructions:&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	1) Open your file: &lt;strong&gt;vim Infected.java&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	2) Execute the magic command within VIM: &lt;strong&gt;:set nobomb&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	3) Save and be happy: &lt;strong&gt;:wq&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	Happy coding!&lt;/p&gt;</description>
      <pubDate>Thu, 11 Mar 2010 21:13:22 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/remove-bom-mark-from-files-with-vim/5001</guid>
      <dc:date>2010-03-11T21:13:22Z</dc:date>
    </item>
    <item>
      <title>A new version of my personal blog</title>
      <link>http://www.santiagolizardo.com/article/a-new-version-of-my-personal-blog/1002</link>
      <description>&lt;p&gt;&#xD;
	Welcome back old reader! This is a new version (third version actually) of my personal web site.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
	The goals for this web site are:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
	&lt;li&gt;&#xD;
		Have fun using GAE (Google App Engine) instead of the silly blogspot service :)&lt;/li&gt;&#xD;
	&lt;li&gt;&#xD;
		Describe better my experience (sidebar menu) and career in companies and open source projects.&lt;/li&gt;&#xD;
	&lt;li&gt;&#xD;
		Explain what I&amp;#39;m doing right now and where I want to go on the about section.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
	These are my main motivations, plus writing often and extensive articles on this blog. Time will probe it!&lt;/p&gt;</description>
      <pubDate>Sat, 27 Feb 2010 15:34:27 GMT</pubDate>
      <guid>http://www.santiagolizardo.com/article/a-new-version-of-my-personal-blog/1002</guid>
      <dc:date>2010-02-27T15:34:27Z</dc:date>
    </item>
  </channel>
</rss>


