<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>Simone Tellini</title>
	<atom:link href="http://tellini.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://tellini.info</link>
	<description>To strive, to seek, to find, and not to yield</description>
	<lastBuildDate>Mon, 06 Feb 2012 10:42:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Effortless, template-based dynamic tables</title>
		<link>http://tellini.info/2012/01/effortless-template-based-dynamic-tables/</link>
		<comments>http://tellini.info/2012/01/effortless-template-based-dynamic-tables/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 19:23:21 +0000</pubDate>
		<dc:creator>Simone</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">http://tellini.info/?p=150</guid>
		<description><![CDATA[When you develop web applications for a living, sooner or later you&#8217;ll need to allow the user to edit collections of data. For instance: Some option&#8230; Field 1 Options To create something like this, I&#8217;ve been using a very rough &#8230; <a href="http://tellini.info/2012/01/effortless-template-based-dynamic-tables/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript" language="javascript" src="http://files.tellini.info/dynamicTable.js"></script>When you develop web applications for a living, sooner or later you&#8217;ll need to allow the user to edit collections of data. For instance: </p>
<table id="example1" class="dynamicTable">
<tbody>
<tr class="template">
<td>
<input type="text" name="test[#{rowId}]" /></td>
<td>
<input id="test#{rowId}" type="checkbox" name="cbTest[#{rowId}]" />
            <label for="test#{rowId}">Some option&#8230;</label>
        </td>
<td>
<input class="deleteRow" type="button" value="Del" /></td>
</tr>
<tr>
<th>Field 1</th>
<th>Options</th>
<th></th>
</tr>
</tbody>
</table>
<input class="example1 addRow" type="button" value="Add" />
<p>To create something like this, I&#8217;ve been using a very rough script that simply replicated a hidden template row when required for several years. Eventually, I couldn&#8217;t stand its uglyness anymore and I decided to polish it a bit <img src='http://tellini.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>I&#8217;ve based my new script on <a href="http://prototypejs.org" target="_blank">prototype</a>, thus keeping it short and elegant.</p>
<p>Let&#8217;s see the full code required to create the table above:</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">&lt;!-- Ideally, this should go in &lt;head&gt; --&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/script.html"><span style="color: #000000; font-weight: bold;">script</span></a> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">language</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;javascript&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://files.tellini.info/dynamicTable.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/script.html"><span style="color: #000000; font-weight: bold;">script</span></a>&gt;</span><br />
<br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/table.html"><span style="color: #000000; font-weight: bold;">table</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;example1&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;dynamicTable&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/tr.html"><span style="color: #000000; font-weight: bold;">tr</span></a> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;template&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/td.html"><span style="color: #000000; font-weight: bold;">td</span></a>&gt;&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;test[#{rowId}]&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/td.html"><span style="color: #000000; font-weight: bold;">td</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/td.html"><span style="color: #000000; font-weight: bold;">td</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;test#{rowId}&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;checkbox&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;cbTest[#{rowId}]&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/label.html"><span style="color: #000000; font-weight: bold;">label</span></a> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;test#{rowId}&quot;</span>&gt;</span>Some option...<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/label.html"><span style="color: #000000; font-weight: bold;">label</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/td.html"><span style="color: #000000; font-weight: bold;">td</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/td.html"><span style="color: #000000; font-weight: bold;">td</span></a>&gt;&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;deleteRow&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;button&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Del&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/td.html"><span style="color: #000000; font-weight: bold;">td</span></a>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/tr.html"><span style="color: #000000; font-weight: bold;">tr</span></a>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/tr.html"><span style="color: #000000; font-weight: bold;">tr</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/th.html"><span style="color: #000000; font-weight: bold;">th</span></a>&gt;</span>Field 1<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/th.html"><span style="color: #000000; font-weight: bold;">th</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/th.html"><span style="color: #000000; font-weight: bold;">th</span></a>&gt;</span>Options<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/th.html"><span style="color: #000000; font-weight: bold;">th</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/th.html"><span style="color: #000000; font-weight: bold;">th</span></a>&gt;&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/th.html"><span style="color: #000000; font-weight: bold;">th</span></a>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/tr.html"><span style="color: #000000; font-weight: bold;">tr</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/table.html"><span style="color: #000000; font-weight: bold;">table</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;example1 addRow&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;button&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Add&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></div></td></tr></tbody></table></div>
<p>Simple, isn&#8217;t it?</p>
<p>Here&#8217;s what you need to know:</p>
<ol>
<li>the script automatically sets up all the tables with a <strong>dynamicTable</strong> class</li>
<li>the <strong>template</strong> row is automatically hidden</li>
<li>the ID of the table can be repeated as a class together with the <strong>addRow</strong> class to link the button to the table. If the button is already inside the table, you might just use the addRow class.</li>
<li>the <strong>deleteRow</strong> class marks the button used to remove its containing row</li>
<li><strong>#{rowId}</strong> in the template will be replaced with an unique ID for every row that gets added. You&#8217;ll have to use sequential IDs starting from 0 for rows you add before serving the page to the client.</li>
</ol>
<p>Exploiting prototype <strong>Class</strong>es, you can subclass <strong>DynamicTable</strong> and override <strong>addRow()</strong> or <strong>deleteRow()</strong> to perform whatever action you need on freshly created rows or when the user removes one.</p>
<p>By the way, you can <a href="http://files.tellini.info/dynamicTable.js">find the code here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://tellini.info/2012/01/effortless-template-based-dynamic-tables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Keeping script kiddies at bay with mod_evasive and iptables</title>
		<link>http://tellini.info/2011/11/keeping-script-kiddies-at-bay-with-mod_evasive-and-iptables/</link>
		<comments>http://tellini.info/2011/11/keeping-script-kiddies-at-bay-with-mod_evasive-and-iptables/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 17:52:55 +0000</pubDate>
		<dc:creator>Simone</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[Tips'n'Tricks]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mod_evasive]]></category>
		<guid isPermaLink="false">http://tellini.info/?p=147</guid>
		<description><![CDATA[mod_evasive is a nice Apache module that helps to protect your server against DoS attacks. However, when a client is blocked, it will keep on using resources on your server. Even if the request will result in a 403 error, &#8230; <a href="http://tellini.info/2011/11/keeping-script-kiddies-at-bay-with-mod_evasive-and-iptables/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zdziarski.com/blog/?page_id=442">mod_evasive</a> is a nice Apache module that helps to protect your server against DoS attacks.</p>
<p>However, when a client is blocked, it will keep on using resources on your server. Even if the request will result in a 403 error, it&#8217;s still a connection that needs to be handled. In some cases, it might require spawning a new process for no good reason.</p>
<p>It&#8217;s quite easy to configure mod_evasive so that the evil IPs are blocked via the machine firewall, though:</p>
<div class="codecolorer-container apache default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="apache codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;<span style="color: #000000; font-weight:bold;">IfModule</span> mod_evasive20.c&gt;<br />
<span style="color: #adadad; font-style: italic;"># ...your other settings...</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; DOSSystemCommand <span style="color: #7f007f;">&quot;sudo /root/scripts/ban_ip.sh %s&quot;</span><br />
&lt;/<span style="color: #000000; font-weight:bold;">IfModule</span>&gt;</div></div>
<p>You could put an iptables command there, but I prefer to use a small script because it&#8217;s easier to maintain. Also I don&#8217;t want to block the IP until the end of time <img src='http://tellini.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  So, I use this:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/sh</span><br />
<br />
<span style="color: #007800;">IP</span>=<span style="color: #007800;">$1</span><br />
<span style="color: #007800;">IPTABLES</span>=<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>iptables<br />
<br />
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> banned <span style="color: #660033;">-s</span> <span style="color: #007800;">$IP</span> <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> <span style="color: #000000;">80</span> <span style="color: #660033;">-j</span> DROP<br />
<br />
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$IPTABLES</span> -D banned -s <span style="color: #007800;">$IP</span> -p TCP --dport 80 -j DROP&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> at now + <span style="color: #000000;">2</span> hours</div></div>
<p>Don&#8217;t forget to grant the permission to run the script to the account used by apache. My sudoers config contains:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">www-data ALL=(ALL) NOPASSWD: /root/scripts/ban_ip.sh</div></div>
<p>And here&#8217;s the result, on a busy server victim of some abuse:</p>
<p><a href="http://tellini.info/wp-content/uploads/2011/11/mod_evasive.png"><img src="http://tellini.info/wp-content/uploads/2011/11/mod_evasive.png" alt="" title="CPU usage before and after iptables integration" width="380" height="116" class="aligncenter size-full wp-image-148" /></a></p>
<p>Red means &#8220;system time&#8221;, blue is &#8220;user time&#8221;. The green arrow marks the time when I configured it to use iptables.</p>
]]></content:encoded>
			<wfw:commentRss>http://tellini.info/2011/11/keeping-script-kiddies-at-bay-with-mod_evasive-and-iptables/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Quick Sprites: CSS sprites, the easy way</title>
		<link>http://tellini.info/2011/08/quick-sprites-css-sprites-the-easy-way/</link>
		<comments>http://tellini.info/2011/08/quick-sprites-css-sprites-the-easy-way/#comments</comments>
		<pubDate>Sun, 21 Aug 2011 17:02:52 +0000</pubDate>
		<dc:creator>Simone</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[sprites]]></category>
		<guid isPermaLink="false">http://tellini.info/?p=144</guid>
		<description><![CDATA[The use of CSS sprites is a valuable techique for any web developer who wishes to optimize his web site, making it both faster for users and better ranked by search engines. However, it usually involves more work to pack &#8230; <a href="http://tellini.info/2011/08/quick-sprites-css-sprites-the-easy-way/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The use of CSS sprites is a valuable techique for any web developer who wishes to optimize his web site, making it both faster for users and better ranked by search engines.</p>
<p>However, it usually involves more work to pack the images in a single sprite sheet and to update them when the site evolves.</p>
<p>If you never used this technique for this reason, now you won&#8217;t have any excuse left: <a href="http://www.tellini.org/mac/quicksprites/" target="_blank">Quick Sprites</a> makes creating and maintaining sprite sheets a breeze <img src='http://tellini.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>You can see how easy is to work with Quick Sprites in this short video:</p>
<div align="center" style="margin-top: 1em">
<iframe width="480" height="390" src="http://www.youtube-nocookie.com/embed/7oLIOjMwbxI?rel=0" frameborder="0" allowfullscreen></iframe>
</div>
<p>Currently available in the <a href="http://itunes.apple.com/app/quick-sprites/id457516296" title="Quick Sprites on the Mac App Store">Mac App Store</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://tellini.info/2011/08/quick-sprites-css-sprites-the-easy-way/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scraping App Store reviews, page after page&#8230;</title>
		<link>http://tellini.info/2011/07/scraping-app-store-reviews-page-after-page/</link>
		<comments>http://tellini.info/2011/07/scraping-app-store-reviews-page-after-page/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 19:58:22 +0000</pubDate>
		<dc:creator>Simone</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[app store]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[itunes]]></category>
		<category><![CDATA[linkedin]]></category>
		<guid isPermaLink="false">http://tellini.info/?p=143</guid>
		<description><![CDATA[Someone pointed out that my little scraping script was fetching only some of the reviews of his app. Indeed, it was only considering the first &#8220;page&#8221; of results. So, I&#8217;ve just updated it to grab &#8216;em all. The new version &#8230; <a href="http://tellini.info/2011/07/scraping-app-store-reviews-page-after-page/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Someone pointed out that <a href="http://tellini.info/2011/05/scraping-mac-app-store-reviews/">my little scraping script</a> was fetching only <em>some</em> of the reviews of his app. Indeed, it was only considering the first &#8220;page&#8221; of results.</p>
<p>So, I&#8217;ve just updated it to grab &#8216;em all. The new version is available at the same address: <a href="http://files.tellini.info/macappstore.zip">here</a>.</p>
<p>By the way, the script was born to get reviews from the <strong>Mac</strong> App Store, but it seems to work just fine with the iOS store as well <img src='http://tellini.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Feel free to send me a promo code for your app, if you really like it <img src='http://tellini.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
<em style="font-size: 70%">(or even an iPad 2, if it changed your life <img src='http://tellini.info/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> )</em></p>
]]></content:encoded>
			<wfw:commentRss>http://tellini.info/2011/07/scraping-app-store-reviews-page-after-page/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Lion, the Witch and the Xcode</title>
		<link>http://tellini.info/2011/07/the-lion-the-witch-and-the-xcode/</link>
		<comments>http://tellini.info/2011/07/the-lion-the-witch-and-the-xcode/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 20:03:40 +0000</pubDate>
		<dc:creator>Simone</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tips'n'Tricks]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[xcode]]></category>
		<guid isPermaLink="false">http://tellini.info/?p=141</guid>
		<description><![CDATA[&#8230;or maybe it was &#8220;The Lion, the Bug and the Xcode&#8220;? Anyway, if you just upgraded your system to Lion, then downloaded the new Xcode from the App Store, tried to run it just to get welcomed by a sparkling &#8230; <a href="http://tellini.info/2011/07/the-lion-the-witch-and-the-xcode/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>&#8230;or maybe it was &#8220;<em>The Lion, the Bug and the Xcode</em>&#8220;?</p>
<p>Anyway, if you just upgraded your system to <a href="http://www.apple.com/macosx/" target="_blank">Lion</a>, then downloaded the new <a href="http://itunes.apple.com/us/app/xcode/id448457090?mt=12" target="_blank">Xcode</a> from the App Store, tried to run it just to get welcomed by a sparkling crash along the lines of</p>
<blockquote><p>UNCAUGHT EXCEPTION (NSInternalInconsistencyException): Couldn&#8217;t load plug-in &#8216;com.apple.dt.IDE.IDEiPhoneSupport&#8217; while firing fault for extension &#8216;Xcode.Device.iPhoneSimulator&#8217;</p></blockquote>
<p>Don&#8217;t panic!</p>
<p>Simply go to your Applications folder and re-run the Xcode installer. The second time it&#8217;ll get it right, or at least it did for me.</p>
]]></content:encoded>
			<wfw:commentRss>http://tellini.info/2011/07/the-lion-the-witch-and-the-xcode/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Special Tablatures offer coming up this week</title>
		<link>http://tellini.info/2011/05/special-tablatures-offer-coming-up-this-week/</link>
		<comments>http://tellini.info/2011/05/special-tablatures-offer-coming-up-this-week/#comments</comments>
		<pubDate>Tue, 24 May 2011 05:58:37 +0000</pubDate>
		<dc:creator>Simone</dc:creator>
				<category><![CDATA[Music]]></category>
		<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">http://tellini.info/?p=139</guid>
		<description><![CDATA[A very special Tablatures offer will be available this weekend at Bits du Jour: a whopping 46% off the regular price! If the only reason why you haven&#8217;t started writing your music with Tablatures yet is because you were thinking &#8230; <a href="http://tellini.info/2011/05/special-tablatures-offer-coming-up-this-week/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A very special <a href="http://www.tellini.org/mac/tablatures/">Tablatures</a> offer will be available this weekend at <a href="http://www.bitsdujour.com/software/tablatures/">Bits du Jour</a>: a whopping 46% off the regular price!</p>
<p>If the only reason why you haven&#8217;t started writing your music with <a href="http://www.tellini.org/mac/tablatures/">Tablatures</a> yet is because you were thinking about the price, you have no excuse now. <img src='http://tellini.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Don&#8217;t miss your chance to take advantage of this promotion: there won&#8217;t be another one like it anytime soon.</p>
<p>For further details, please visit <a href="http://www.bitsdujour.com/software/tablatures/">http://www.bitsdujour.com/software/tablatures/</a>  and click on the &#8220;I Want This&#8221; button to get notified when the promotion will start, to be sure not to miss the deal.</p>
]]></content:encoded>
			<wfw:commentRss>http://tellini.info/2011/05/special-tablatures-offer-coming-up-this-week/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scraping Mac App Store reviews</title>
		<link>http://tellini.info/2011/05/scraping-mac-app-store-reviews/</link>
		<comments>http://tellini.info/2011/05/scraping-mac-app-store-reviews/#comments</comments>
		<pubDate>Sun, 08 May 2011 12:14:06 +0000</pubDate>
		<dc:creator>Simone</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[linkedin]]></category>
		<guid isPermaLink="false">http://tellini.info/?p=138</guid>
		<description><![CDATA[You have some products on the Mac App Store, you would like to know what people think of them but you can&#8217;t bother checking for reviews one store at a time? Don&#8217;t worry, you&#8217;re not alone. I can&#8217;t understand why &#8230; <a href="http://tellini.info/2011/05/scraping-mac-app-store-reviews/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>You have some products on the Mac App Store, you would like to know what people think of them but you can&#8217;t bother checking for reviews one store at a time?</p>
<p>Don&#8217;t worry, you&#8217;re not alone. I can&#8217;t understand why Apple made it so difficult to check reviews for your own products in iTunes Connect, so here&#8217;s <a href="http://files.tellini.info/macappstore.zip">a little PHP script</a> that will do the dirty work for you: it&#8217;ll check all the stores and fetch all the reviews, producing an XML file per product with the most important info (review, reviewer, version of the product&#8230;).</p>
<p>You just need to rename the config file to <strong>macappstore.cfg.php</strong>, fill in the <strong>$products</strong> array, create an <strong>output</strong> subdirectory and execute:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">php macappstore.php</div></td></tr></tbody></table></div>
<p>After a while you&#8217;ll see the XML appearing in the output directory, ready for further processing.</p>
]]></content:encoded>
			<wfw:commentRss>http://tellini.info/2011/05/scraping-mac-app-store-reviews/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Happy New Year!</title>
		<link>http://tellini.info/2011/01/happy-new-year-2/</link>
		<comments>http://tellini.info/2011/01/happy-new-year-2/#comments</comments>
		<pubDate>Sat, 01 Jan 2011 12:57:45 +0000</pubDate>
		<dc:creator>Simone</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<guid isPermaLink="false">http://tellini.info/?p=135</guid>
		<description><![CDATA[My best wishes for a great 2011 to everyone!]]></description>
			<content:encoded><![CDATA[<p>My best wishes for a great 2011 to everyone! <img src='http://tellini.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://tellini.info/2011/01/happy-new-year-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using SQLi Import with Oracle</title>
		<link>http://tellini.info/2010/12/using-sqli-import-with-oracle/</link>
		<comments>http://tellini.info/2010/12/using-sqli-import-with-oracle/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 11:33:38 +0000</pubDate>
		<dc:creator>Simone</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[eZ Publish]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">http://tellini.info/?p=134</guid>
		<description><![CDATA[SQLi Import is a nice eZ Publish extension that allows you to develop data importers in a quick and elegant way. Sadly, it comes only with MySQL support, but it takes only a minute to make it work with Oracle &#8230; <a href="http://tellini.info/2010/12/using-sqli-import-with-oracle/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://projects.ez.no/sqliimport">SQLi Import</a> is a nice <a href="http://ez.no/">eZ Publish</a> extension that allows you to develop data importers in a quick and elegant way.</p>
<p>Sadly, it comes only with MySQL support, but it takes only a minute to make it work with Oracle too. So here&#8217;s the SQL code I&#8217;ve used to make it happy <img src='http://tellini.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>(tested with SQLi Import 1.2.0 and eZ Publish 4.4)</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> sqliimport_scheduled <span style="color: #66cc66;">&#40;</span><br />
&nbsp; id <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
&nbsp; handler <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; label <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; options_serialized <span style="color: #993333; font-weight: bold;">CLOB</span><span style="color: #66cc66;">,</span><br />
&nbsp; frequency <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">30</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">NEXT</span> <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span><br />
&nbsp; user_id <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">,</span><br />
&nbsp; requested_time <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">,</span><br />
&nbsp; is_active <span style="color: #993333; font-weight: bold;">SMALLINT</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span><br />
&nbsp; manual_frequency <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> sqliimport_item <span style="color: #66cc66;">&#40;</span><br />
&nbsp; id <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
&nbsp; handler <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; options_serialized <span style="color: #993333; font-weight: bold;">CLOB</span><span style="color: #66cc66;">,</span><br />
&nbsp; user_id <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">,</span><br />
&nbsp; requested_time <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">STATUS</span> <span style="color: #993333; font-weight: bold;">SMALLINT</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span><br />
&nbsp; percentage_int <span style="color: #993333; font-weight: bold;">SMALLINT</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">TYPE</span> <span style="color: #993333; font-weight: bold;">SMALLINT</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><br />
&nbsp; progression_notes <span style="color: #993333; font-weight: bold;">CLOB</span><span style="color: #66cc66;">,</span><br />
&nbsp; process_time <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span><br />
&nbsp; scheduled_id <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">,</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">SEQUENCE</span> se_sqliimport_item;<br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">SEQUENCE</span> se_sqliimport_scheduled;<br />
<br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> tr_sqliimport_scheduled_id<br />
<span style="color: #993333; font-weight: bold;">BEFORE</span> <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">ON</span> sqliimport_scheduled<br />
<span style="color: #993333; font-weight: bold;">FOR</span> EACH <span style="color: #993333; font-weight: bold;">ROW</span><br />
<span style="color: #993333; font-weight: bold;">WHEN</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #993333; font-weight: bold;">NEW</span><span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #66cc66;">&#41;</span><br />
<span style="color: #993333; font-weight: bold;">BEGIN</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">SELECT</span> se_sqliimport_scheduled<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">NEXTVAL</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">INTO</span> :<span style="color: #993333; font-weight: bold;">NEW</span><span style="color: #66cc66;">.</span>ID<br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">FROM</span> dual;<br />
<span style="color: #993333; font-weight: bold;">END</span>;<br />
<span style="color: #66cc66;">/</span><br />
<br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> tr_sqliimport_item_id<br />
<span style="color: #993333; font-weight: bold;">BEFORE</span> <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">ON</span> sqliimport_item<br />
<span style="color: #993333; font-weight: bold;">FOR</span> EACH <span style="color: #993333; font-weight: bold;">ROW</span><br />
<span style="color: #993333; font-weight: bold;">WHEN</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #993333; font-weight: bold;">NEW</span><span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #66cc66;">&#41;</span><br />
<span style="color: #993333; font-weight: bold;">BEGIN</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">SELECT</span> se_sqliimport_item<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">NEXTVAL</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">INTO</span> :<span style="color: #993333; font-weight: bold;">NEW</span><span style="color: #66cc66;">.</span>ID<br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">FROM</span> dual;<br />
<span style="color: #993333; font-weight: bold;">END</span>;<br />
<span style="color: #66cc66;">/</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://tellini.info/2010/12/using-sqli-import-with-oracle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Serendipity to WordPress</title>
		<link>http://tellini.info/2010/10/serendipity-to-wordpress/</link>
		<comments>http://tellini.info/2010/10/serendipity-to-wordpress/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 18:59:09 +0000</pubDate>
		<dc:creator>Simone</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[s9y wordpress migration]]></category>
		<guid isPermaLink="false">http://tellini.info/?p=117</guid>
		<description><![CDATA[I&#8217;ve moved a couple of my blogs from Serendipity to WordPress (mostly because I&#8217;ve discovered that Serendipity has some issues with newer PHP setups, but also because I&#8217;m getting lazy and WordPress&#8217; admin panel is nicer than s9y&#8217;s ). Luckily &#8230; <a href="http://tellini.info/2010/10/serendipity-to-wordpress/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve moved a couple of my blogs from <a href="http://www.s9y.org/">Serendipity</a> to <a href="http://wordpress.org/">WordPress</a> (mostly because I&#8217;ve discovered that Serendipity has some issues with newer PHP setups, but also because I&#8217;m getting lazy and WordPress&#8217; admin panel is nicer than s9y&#8217;s <img src='http://tellini.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ).</p>
<p>Luckily someone else did already write a <a href="http://snowulf.com/2010/06/11/serendipity-to-wordpress-post-import/">s9y-&gt;WP importer plugin</a>. Sadly it didn&#8217;t support nested categories, so I changed a couple of things and here&#8217;s my <a href="http://files.tellini.info/s9y2wp.zip">Serendipity (S9Y) importer for WordPress 1.5</a> (hoping that noone else has already used that version number&#8230; the history of the plugin contains several authors <img src='http://tellini.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</p>
<p>One snag: after the import, you&#8217;ll need to edit one of the categories (just open and save it) to fix the hierarchy. I don&#8217;t know why and honestly I don&#8217;t care <img src='http://tellini.info/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' />  Worked for me, your mileage might vary.</p>
<p>Refer to <a href="http://snowulf.com/2010/06/11/serendipity-to-wordpress-post-import/">this article</a> for other useful migration tips.</p>
]]></content:encoded>
			<wfw:commentRss>http://tellini.info/2010/10/serendipity-to-wordpress/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
	</channel>
</rss>

