<?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>Keasoft</title>
	<atom:link href="http://www.keasoft.it/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.keasoft.it/blog</link>
	<description>Dio non gioca a dadi con l'universo</description>
	<lastBuildDate>Wed, 11 Jan 2012 11:42:19 +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>Human vs Bot: captcha o altro?</title>
		<link>http://www.keasoft.it/blog/2011/10/02/human-vs-bot-captcha-o-altro</link>
		<comments>http://www.keasoft.it/blog/2011/10/02/human-vs-bot-captcha-o-altro#comments</comments>
		<pubDate>Sun, 02 Oct 2011 13:28:56 +0000</pubDate>
		<dc:creator>kea</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[trick]]></category>

		<guid isPermaLink="false">http://www.keasoft.it/blog/?p=232</guid>
		<description><![CDATA[In questi giorni mi sono chiesto se il catpcha fosse veramente la soluzione al problema Bot per SocialCibus. Così mi sono letto diversi articoli in rete. Alcuni di questi parlavano di un 3-10% di utenti che, quando vedono un captcha, &#8230; <a href="http://www.keasoft.it/blog/2011/10/02/human-vs-bot-captcha-o-altro">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[
				<!-- Social Sharing Toolkit v2.0.4 | http://www.marijnrongen.com/wordpress-plugins/social_sharing_toolkit/ -->
				<div class="mr_social_sharing_wrapper"><span class="mr_social_sharing"><iframe src="https://www.facebook.com/plugins/like.php?locale=en_US&amp;href=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F10%2F02%2Fhuman-vs-bot-captcha-o-altro&amp;layout=standard&amp;show_faces=false&amp;width=51px&amp;height=24px" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:51px; height:24px;" allowTransparency="true"></iframe></span><span class="mr_social_sharing"><div id="fb-root"></div><fb:send href="http://www.keasoft.it/blog/2011/10/02/human-vs-bot-captcha-o-altro" font=""></fb:send></span><span class="mr_social_sharing"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F10%2F02%2Fhuman-vs-bot-captcha-o-altro&amp;text=Human+vs+Bot%3A+captcha+o+altro%3F" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/twitter.png" alt="Share on Twitter" title="Share on Twitter"/></a></span><span class="mr_social_sharing"><g:plusone size="medium" count="false" href="http://www.keasoft.it/blog/2011/10/02/human-vs-bot-captcha-o-altro"></g:plusone></span><span class="mr_social_sharing"><a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F10%2F02%2Fhuman-vs-bot-captcha-o-altro&amp;title=Human+vs+Bot%3A+captcha+o+altro%3F" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/delicious.png" alt="Save on Delicious" title="Save on Delicious"/></a></span><span class="mr_social_sharing"><a href="http://digg.com/submit?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F10%2F02%2Fhuman-vs-bot-captcha-o-altro&amp;title=Human+vs+Bot%3A+captcha+o+altro%3F" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/digg.png" alt="Digg This" title="Digg This"/></a></span><span class="mr_social_sharing"><a href="mailto:?subject=Human vs Bot: captcha o altro?&amp;body=http://www.keasoft.it/blog/2011/10/02/human-vs-bot-captcha-o-altro"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/email.png" alt="Share via email" title="Share via email"/></a></span></div><p>In questi giorni mi sono chiesto se il <a href="http://it.wikipedia.org/wiki/Captcha" title="captcha">catpcha</a> fosse veramente la soluzione al problema <a href="http://it.wikipedia.org/wiki/Bot" title="Bot">Bot</a> per <a href="http://socialcibus.com" title="Ricette per tutti SociaCibus">SocialCibus</a>. Così mi sono letto diversi articoli in rete. Alcuni di questi parlavano di un 3-10% di utenti che, quando vedono un captcha, lasciano perdere la registrazione, altri abbandonano solo dopo aver sbagliato una o due volte l&#8217;inserimento del testo.<br />
Posso tenere fuori i bot e dentro gli esseri umani senza captcha? E&#8217; la domanda che si sono posti in tanti.<br />
<span id="more-232"></span><br />
Di risposte ce ne sono diverse ma a me è piaciuta questa soluzione: inserire un campo di testo in più nel form, nascondendolo con css o javascipt e verificare che questo rimanga vuoto.<br />
Il trucco è che i bot normalmente non visualizzano la pagina e sono ingolositi da campi di testo che tendono a riempire in maniera casuale o inserendo js.<br />
Quindi se sei un bot probabilmente riempirai il campo, se sei un umano sicuramente no, visto che è nascosto!</p>
<p>Per Symfony è piuttosto semplice implementare questo sistema. Nel form si aggiunge un campo di testo, es:</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">widgetSchema</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'message'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> sfWidgetFormInputText<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validatorSchema</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'message'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> EmptyValidator<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'required'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>e un metodo che mi verifichi se l&#8217;errore è in questo campo</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> isBot<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isValid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errorSchema</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'message'</span><span style="color: #009900;">&#93;</span> instanceof sfValidatorError<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>quindi nell&#8217;action</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeRegistration<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><br />
&nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">form</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RegistrationForm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isMethod</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'POST'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bind</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isBot</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">forward404</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isValid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// tutto ok, procedi!</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span></div></div>
<p>Anche il 404 sembra sia un modo per scoraggiare i bot.<br />
Aggiornerò al più presto con le statistiche di funzionamento di questo sistema.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keasoft.it/blog/2011/10/02/human-vs-bot-captcha-o-altro/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testare pagine web con versioni differenti di Internet Explorer</title>
		<link>http://www.keasoft.it/blog/2011/09/18/testare-pagine-web-con-versioni-differenti-di-internet-explorer</link>
		<comments>http://www.keasoft.it/blog/2011/09/18/testare-pagine-web-con-versioni-differenti-di-internet-explorer#comments</comments>
		<pubDate>Sun, 18 Sep 2011 14:40:47 +0000</pubDate>
		<dc:creator>kea</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.keasoft.it/blog/?p=229</guid>
		<description><![CDATA[Spesso ho la necessità di testare alcune pagine web con differenti versioni di IE, a volte per la grafica ma più spesso per verificare le funzionalità Javascript sulle varie versioni di Internet Explorer. Fin&#8217;ora ho sempre pensato che lo strumento &#8230; <a href="http://www.keasoft.it/blog/2011/09/18/testare-pagine-web-con-versioni-differenti-di-internet-explorer">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[
				<!-- Social Sharing Toolkit v2.0.4 | http://www.marijnrongen.com/wordpress-plugins/social_sharing_toolkit/ -->
				<div class="mr_social_sharing_wrapper"><span class="mr_social_sharing"><iframe src="https://www.facebook.com/plugins/like.php?locale=en_US&amp;href=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F09%2F18%2Ftestare-pagine-web-con-versioni-differenti-di-internet-explorer&amp;layout=standard&amp;show_faces=false&amp;width=51px&amp;height=24px" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:51px; height:24px;" allowTransparency="true"></iframe></span><span class="mr_social_sharing"><div id="fb-root"></div><fb:send href="http://www.keasoft.it/blog/2011/09/18/testare-pagine-web-con-versioni-differenti-di-internet-explorer" font=""></fb:send></span><span class="mr_social_sharing"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F09%2F18%2Ftestare-pagine-web-con-versioni-differenti-di-internet-explorer&amp;text=Testare+pagine+web+con+versioni+differenti+di+Internet+Explorer" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/twitter.png" alt="Share on Twitter" title="Share on Twitter"/></a></span><span class="mr_social_sharing"><g:plusone size="medium" count="false" href="http://www.keasoft.it/blog/2011/09/18/testare-pagine-web-con-versioni-differenti-di-internet-explorer"></g:plusone></span><span class="mr_social_sharing"><a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F09%2F18%2Ftestare-pagine-web-con-versioni-differenti-di-internet-explorer&amp;title=Testare+pagine+web+con+versioni+differenti+di+Internet+Explorer" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/delicious.png" alt="Save on Delicious" title="Save on Delicious"/></a></span><span class="mr_social_sharing"><a href="http://digg.com/submit?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F09%2F18%2Ftestare-pagine-web-con-versioni-differenti-di-internet-explorer&amp;title=Testare+pagine+web+con+versioni+differenti+di+Internet+Explorer" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/digg.png" alt="Digg This" title="Digg This"/></a></span><span class="mr_social_sharing"><a href="mailto:?subject=Testare pagine web con versioni differenti di Internet Explorer&amp;body=http://www.keasoft.it/blog/2011/09/18/testare-pagine-web-con-versioni-differenti-di-internet-explorer"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/email.png" alt="Share via email" title="Share via email"/></a></span></div><p>Spesso ho la necessità di testare alcune pagine web con differenti versioni di IE, a volte per la grafica ma più spesso per verificare le funzionalità Javascript sulle varie versioni di Internet Explorer.<br />
Fin&#8217;ora ho sempre pensato che lo strumento migliore fosse <a href="http://www.my-debugbar.com/wiki/IETester/HomePage" title="IETester">IETester</a> anche se sapevo che non era sempre coerente.<br />
Oggi ho letto questa guida sul <a href="http://coding.smashingmagazine.com/2011/09/02/reliable-cross-browser-testing-part-1-internet-explorer/">cross browser testing con IE</a>. Spettacolo!<br />
Il post è un po&#8217; lunghino ma ne vale la pena leggerlo. Non racconta cose mirabolanti ma descrive lo stato dell&#8217;arte e mi ha rivelato un tool che non conoscevo: <a href="http://utilu.com/IECollection/">Utilu IE Collection</a> [Non è un errore si chiama proprio Utilu]<br />
Ma non voglio svelarvi il finale <img src='http://www.keasoft.it/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Buona lettura.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keasoft.it/blog/2011/09/18/testare-pagine-web-con-versioni-differenti-di-internet-explorer/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notifiche con Doctrine: ereditarietà con relazioni diverse per i figli</title>
		<link>http://www.keasoft.it/blog/2011/08/12/notifiche-con-doctrine-ereditarieta-con-relazioni-diverse-per-i-figli</link>
		<comments>http://www.keasoft.it/blog/2011/08/12/notifiche-con-doctrine-ereditarieta-con-relazioni-diverse-per-i-figli#comments</comments>
		<pubDate>Fri, 12 Aug 2011 21:46:05 +0000</pubDate>
		<dc:creator>kea</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Constraint]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[Inheritance]]></category>

		<guid isPermaLink="false">http://www.keasoft.it/blog/?p=211</guid>
		<description><![CDATA[Stavo cercando di creare un sistema di notifiche (tipo wall di FB) di ciò che accade agli utenti del mio nuovo sito di ricette e mi sono imbattuto in un problema: ereditarietà con Doctrine e relazioni diverse per ogni figlio. &#8230; <a href="http://www.keasoft.it/blog/2011/08/12/notifiche-con-doctrine-ereditarieta-con-relazioni-diverse-per-i-figli">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[
				<!-- Social Sharing Toolkit v2.0.4 | http://www.marijnrongen.com/wordpress-plugins/social_sharing_toolkit/ -->
				<div class="mr_social_sharing_wrapper"><span class="mr_social_sharing"><iframe src="https://www.facebook.com/plugins/like.php?locale=en_US&amp;href=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F08%2F12%2Fnotifiche-con-doctrine-ereditarieta-con-relazioni-diverse-per-i-figli&amp;layout=standard&amp;show_faces=false&amp;width=51px&amp;height=24px" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:51px; height:24px;" allowTransparency="true"></iframe></span><span class="mr_social_sharing"><div id="fb-root"></div><fb:send href="http://www.keasoft.it/blog/2011/08/12/notifiche-con-doctrine-ereditarieta-con-relazioni-diverse-per-i-figli" font=""></fb:send></span><span class="mr_social_sharing"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F08%2F12%2Fnotifiche-con-doctrine-ereditarieta-con-relazioni-diverse-per-i-figli&amp;text=Notifiche+con+Doctrine%3A+ereditariet%C3%A0+con+relazioni+diverse+per+i+figli" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/twitter.png" alt="Share on Twitter" title="Share on Twitter"/></a></span><span class="mr_social_sharing"><g:plusone size="medium" count="false" href="http://www.keasoft.it/blog/2011/08/12/notifiche-con-doctrine-ereditarieta-con-relazioni-diverse-per-i-figli"></g:plusone></span><span class="mr_social_sharing"><a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F08%2F12%2Fnotifiche-con-doctrine-ereditarieta-con-relazioni-diverse-per-i-figli&amp;title=Notifiche+con+Doctrine%3A+ereditariet%C3%A0+con+relazioni+diverse+per+i+figli" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/delicious.png" alt="Save on Delicious" title="Save on Delicious"/></a></span><span class="mr_social_sharing"><a href="http://digg.com/submit?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F08%2F12%2Fnotifiche-con-doctrine-ereditarieta-con-relazioni-diverse-per-i-figli&amp;title=Notifiche+con+Doctrine%3A+ereditariet%C3%A0+con+relazioni+diverse+per+i+figli" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/digg.png" alt="Digg This" title="Digg This"/></a></span><span class="mr_social_sharing"><a href="mailto:?subject=Notifiche con Doctrine: ereditarietà con relazioni diverse per i figli&amp;body=http://www.keasoft.it/blog/2011/08/12/notifiche-con-doctrine-ereditarieta-con-relazioni-diverse-per-i-figli"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/email.png" alt="Share via email" title="Share via email"/></a></span></div><p>Stavo cercando di creare un sistema di notifiche (tipo wall di FB) di ciò che accade agli utenti del mio <a href="http://socialcibus.com" title="Ricette per tutti SociaCibus">nuovo sito di ricette</a> e mi sono imbattuto in un problema: ereditarietà con Doctrine e relazioni diverse per ogni figlio.<br />
Premetto che il sito è realizzato con Sf 1.4 e Doctrine 1.2.<br />
Accantonato per il momento l&#8217;utilizzo di database documentali e varianti, rimanendo nel mondo del relazionale, per l&#8217;implementazione del sistema di notifiche ho fatto il seguente ragionamento:<br />
ci sono principalmente due modi per memorizzare le informazioni su &#8220;cosa sta accadendo&#8221; (es. nuova ricetta di un amico, commento ad una mia ricetta, follow, like, etc.):</p>
<ul>
<li>
Leggere ogni volta tutti gli inserimenti dalle rispettive tabelle (Recipe, Comment, Follow, Like)</p>
<ul>
<li>Pro: non devo aggiungere modelli al db</li>
<li>Contro: la lettura delle informazioni è lentisssssima (devo leggere tutte le tabelle), la computazione (merge e ordinamento) è impegnativa e aumenta al crescere delle informazioni memorizzate
</ul>
</li>
<li>Scrivere e leggere su una tabella che raggruppa le notifiche.
<ul>
<li>Pro: il fetch è velocissimo, posso mantenere la distinzione delle tipologie di notifica, non è necessaria computazione aggiuntiva oltre al fetch per merge e ordinamento</li>
<li>Contro: devo realizzare e gestire un repository per le notifiche, la mappatura ai vari tipi di notifica non è banale</li>
</ul>
</li>
</ul>
<p>Naturalmente ho scelto la seconda, che sicuramente è la soluzione più pulita e performante.<br />
Di seguito lo schema (semplificato) dei modelli da &#8220;notificare&#8221;.</p>
<div class="codecolorer-container yaml blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="yaml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007F45;">Recipe</span>:<span style="color: #007F45;"><br />
&nbsp; id</span>:<span style="color: #007F45;"><br />
&nbsp; user_id</span>:<span style="color: #007F45;"><br />
&nbsp; title</span><span style="font-weight: bold; color: brown;">:<br />
</span> &nbsp;<span style="color: cyan;">...</span><span style="color: #007F45;"><br />
relations</span>:<span style="color: green;"><br />
&nbsp; &nbsp; User</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> class<span style="font-weight: bold; color: brown;">: </span>sfGuardUser, <span style="color: cyan;">...</span> <span class="br0">&#125;</span><br />
<span style="color: #007F45;"><br />
Comment</span>:<span style="color: #007F45;"><br />
&nbsp; id</span>:<span style="color: #007F45;"><br />
&nbsp; user_id</span>:<span style="color: #007F45;"><br />
&nbsp; recipe_id</span>:<span style="color: #007F45;"><br />
&nbsp; comment</span><span style="font-weight: bold; color: brown;">:<br />
</span> &nbsp;<span style="color: cyan;">...</span><span style="color: #007F45;"><br />
relations</span>:<span style="color: green;"><br />
&nbsp; &nbsp; User</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> class<span style="font-weight: bold; color: brown;">: </span>sfGuardUser, <span style="color: cyan;">...</span> <span class="br0">&#125;</span><span style="color: green;"><br />
&nbsp; &nbsp; Recipe</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> class<span style="font-weight: bold; color: brown;">: </span>Recipe, <span style="color: cyan;">...</span> <span class="br0">&#125;</span><br />
<span style="color: #007F45;"><br />
Follow</span>:<span style="color: #007F45;"><br />
&nbsp; user_id</span>:<span style="color: #007F45;"><br />
&nbsp; followed_user_id</span>:<span style="color: #007F45;"><br />
relations</span>:<span style="color: green;"><br />
&nbsp; &nbsp; User</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> class<span style="font-weight: bold; color: brown;">: </span>sfGuardUser, <span style="color: cyan;">...</span> <span class="br0">&#125;</span><span style="color: green;"><br />
&nbsp; &nbsp; FollowedUser</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> class<span style="font-weight: bold; color: brown;">: </span>sfGuardUser, <span style="color: cyan;">...</span> <span class="br0">&#125;</span><br />
<span style="color: #007F45;"><br />
Like</span>:<span style="color: #007F45;"><br />
&nbsp; id</span>:<span style="color: #007F45;"><br />
&nbsp; user_id</span>:<span style="color: #007F45;"><br />
&nbsp; recipe_id</span><span style="font-weight: bold; color: brown;">:<br />
</span> &nbsp;<span style="color: cyan;">...</span><span style="color: #007F45;"><br />
relations</span>:<span style="color: green;"><br />
&nbsp; &nbsp; User</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> class<span style="font-weight: bold; color: brown;">: </span>sfGuardUser, <span style="color: cyan;">...</span> <span class="br0">&#125;</span><span style="color: green;"><br />
&nbsp; &nbsp; Recipe</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> class<span style="font-weight: bold; color: brown;">: </span>Recipe, <span style="color: cyan;">...</span> <span class="br0">&#125;</span></div></div>
<p>Ed eccoci a modellare le notifice: per realizzare la mappatura alle varie tipologie di notifica ho deciso di utilizzare l&#8217;ereditarietà con <a href="http://www.doctrine-project.org/projects/orm/1.2/docs/manual/inheritance/en#column-aggregation" title="Doctrine column aggregation">aggregazione di colonne</a> di Doctrine.</p>
<div class="codecolorer-container yaml blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="yaml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007F45;">Notification</span>:<span style="color: #007F45;"><br />
&nbsp; columns</span>:<span style="color: #007F45;"><br />
&nbsp; &nbsp; user_id</span>:<span style="color: #007F45;"><br />
&nbsp; &nbsp; dest_user_id</span>:<span style="color: #007F45;"><br />
&nbsp; &nbsp; subject_model</span>:<span style="color: #007F45;"><br />
&nbsp; &nbsp; subject_id</span><span style="font-weight: bold; color: brown;">:<br />
</span> &nbsp; &nbsp;<span style="color: cyan;">...</span><span style="color: #007F45;"><br />
&nbsp; relations</span>:<span style="color: green;"><br />
&nbsp; &nbsp; User</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> class<span style="font-weight: bold; color: brown;">: </span>sfGuardUser <span style="color: cyan;">...</span> <span class="br0">&#125;</span><span style="color: green;"><br />
&nbsp; &nbsp; DestUser</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> class<span style="font-weight: bold; color: brown;">: </span>sfGuardUser, <span style="color: cyan;">...</span> <span class="br0">&#125;</span><span style="color: #007F45;"><br />
&nbsp; indexes</span>:<span style="color: #007F45;"><br />
&nbsp; &nbsp; subject_id_index</span>:<span style="color: green;"><br />
&nbsp; &nbsp; &nbsp; fields</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#91;</span>subject_id<span class="br0">&#93;</span><br />
<span style="color: #007F45;"><br />
NotificationComment</span>:<span style="color: green;"><br />
&nbsp; inheritance</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> extends<span style="font-weight: bold; color: brown;">: </span>Notification, type<span style="font-weight: bold; color: brown;">: </span>column_aggregation, keyField<span style="font-weight: bold; color: brown;">: </span>type, keyValue<span style="font-weight: bold; color: brown;">: </span><span style="">1</span> <span class="br0">&#125;</span><span style="color: #007F45;"><br />
NotificationRecipe</span>:<span style="color: green;"><br />
&nbsp; inheritance</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> extends<span style="font-weight: bold; color: brown;">: </span>Notification, type<span style="font-weight: bold; color: brown;">: </span>column_aggregation, keyField<span style="font-weight: bold; color: brown;">: </span>type, keyValue<span style="font-weight: bold; color: brown;">: </span><span style="">2</span> <span class="br0">&#125;</span><span style="color: #007F45;"><br />
NotificationFollow</span>:<span style="color: green;"><br />
&nbsp; inheritance</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> extends<span style="font-weight: bold; color: brown;">: </span>Notification, type<span style="font-weight: bold; color: brown;">: </span>column_aggregation, keyField<span style="font-weight: bold; color: brown;">: </span>type, keyValue<span style="font-weight: bold; color: brown;">: </span><span style="">3</span> <span class="br0">&#125;</span><span style="color: #007F45;"><br />
NotificationLike</span>:<span style="color: green;"><br />
&nbsp; inheritance</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> extends<span style="font-weight: bold; color: brown;">: </span>Notification, type<span style="font-weight: bold; color: brown;">: </span>column_aggregation, keyField<span style="font-weight: bold; color: brown;">: </span>type, keyValue<span style="font-weight: bold; color: brown;">: </span><span style="">4</span> <span class="br0">&#125;</span></div></div>
<p>Bene, ora ho quello che mi serve&#8230; o quasi. Considerando che <em>subject_id</em> sia l&#8217;<em>id</em> del soggetto della notifica (es. Ricetta o Commento) mi serve una relazione con il repository del soggetto stesso, cosicchè possa avere direttamente l&#8217;oggetto relativo alla notifica:</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$notification_recipe</span> <span style="color: #339933;">=</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'NotificationRecipe'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$recipe</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$notification_recipe</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRecipe</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Come aggiungo le relazioni? Ho provato con le relazioni &#8220;classiche&#8221;:</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">NotificationComment:<br />
&nbsp; inheritance: { extends: Notification, type: column_aggregation, keyField: type, keyValue: 1 }<br />
&nbsp; relations:<br />
&nbsp; &nbsp; Comment: { class: Comment, ... }<br />
NotificationRecipe:<br />
&nbsp; inheritance: { extends: Notification, type: column_aggregation, keyField: type, keyValue: 2 }<br />
&nbsp; relations:<br />
&nbsp; &nbsp; Recipe: { class: Recipe, ... }</div></div>
<p>Funziona! Ma&#8230; il problema è che alla creazione del database le relazioni le crea&#8230; TUTTE nella stessa tabella, quindi abbiamo Notification che ha come constraint tutte le relazioni definite, con Recipe, Comment, Like e Follow.<br />
Il che non funziona affatto, poichè ad ogni inserimento avremo errori di chiavi importate inesistenti nella tabella Notification. Sigh!<br />
Ricominciamo ed eliminiamo le relazioni dallo schema.yml.<br />
Cercando in rete ho trovato un attributo che fa al caso mio: <em>Doctrine::EXPORT_CONSTRAINTS</em><br />
Quindi ho modificato i modelli dicendo di non esportare le constraint:</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> NotificationRecipe <span style="color: #000000; font-weight: bold;">extends</span> BaseNotificationRecipe<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setUp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; parent<span style="color: #339933;">::</span><span style="color: #004000;">setUp</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasOne</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Recipe'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">'local'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'subject_id'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">'foreign'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'id'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">'onDelete'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'cascade'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span>Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">ATTR_EXPORT</span><span style="color: #339933;">,</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">EXPORT_ALL</span> ^ Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">EXPORT_CONSTRAINTS</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Si può fare anche direttamente nello schema.yml ma non ho indagato otre, perchè già così&#8230; <a href="http://socialcibus.com">FUNZIONA</a>!!!</p>
<p>Buon divertimento</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keasoft.it/blog/2011/08/12/notifiche-con-doctrine-ereditarieta-con-relazioni-diverse-per-i-figli/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Installare estensioni PECL su Mac OsX e Zend Server</title>
		<link>http://www.keasoft.it/blog/2011/04/20/installare-estensioni-pecl-su-mac-osx-e-zend-server</link>
		<comments>http://www.keasoft.it/blog/2011/04/20/installare-estensioni-pecl-su-mac-osx-e-zend-server#comments</comments>
		<pubDate>Wed, 20 Apr 2011 20:30:33 +0000</pubDate>
		<dc:creator>kea</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.keasoft.it/blog/?p=203</guid>
		<description><![CDATA[Per evitare errori del tipo: PHP Warning: &#160;PHP Startup: Unable to load dynamic library '/usr/local/zend/lib/php_extensions/XXXX.so' - dlopen(/usr/local/zend/lib/php_extensions/XXXX.so, 9): no suitable image found. &#160;Did find: &#160; &#160; /usr/local/zend/lib/php_extensions/XXXX.so: mach-o, but wrong architecture in Unknown on line 0 Un link vale più &#8230; <a href="http://www.keasoft.it/blog/2011/04/20/installare-estensioni-pecl-su-mac-osx-e-zend-server">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[
				<!-- Social Sharing Toolkit v2.0.4 | http://www.marijnrongen.com/wordpress-plugins/social_sharing_toolkit/ -->
				<div class="mr_social_sharing_wrapper"><span class="mr_social_sharing"><iframe src="https://www.facebook.com/plugins/like.php?locale=en_US&amp;href=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F04%2F20%2Finstallare-estensioni-pecl-su-mac-osx-e-zend-server&amp;layout=standard&amp;show_faces=false&amp;width=51px&amp;height=24px" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:51px; height:24px;" allowTransparency="true"></iframe></span><span class="mr_social_sharing"><div id="fb-root"></div><fb:send href="http://www.keasoft.it/blog/2011/04/20/installare-estensioni-pecl-su-mac-osx-e-zend-server" font=""></fb:send></span><span class="mr_social_sharing"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F04%2F20%2Finstallare-estensioni-pecl-su-mac-osx-e-zend-server&amp;text=Installare+estensioni+PECL+su+Mac+OsX+e+Zend+Server" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/twitter.png" alt="Share on Twitter" title="Share on Twitter"/></a></span><span class="mr_social_sharing"><g:plusone size="medium" count="false" href="http://www.keasoft.it/blog/2011/04/20/installare-estensioni-pecl-su-mac-osx-e-zend-server"></g:plusone></span><span class="mr_social_sharing"><a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F04%2F20%2Finstallare-estensioni-pecl-su-mac-osx-e-zend-server&amp;title=Installare+estensioni+PECL+su+Mac+OsX+e+Zend+Server" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/delicious.png" alt="Save on Delicious" title="Save on Delicious"/></a></span><span class="mr_social_sharing"><a href="http://digg.com/submit?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2011%2F04%2F20%2Finstallare-estensioni-pecl-su-mac-osx-e-zend-server&amp;title=Installare+estensioni+PECL+su+Mac+OsX+e+Zend+Server" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/digg.png" alt="Digg This" title="Digg This"/></a></span><span class="mr_social_sharing"><a href="mailto:?subject=Installare estensioni PECL su Mac OsX e Zend Server&amp;body=http://www.keasoft.it/blog/2011/04/20/installare-estensioni-pecl-su-mac-osx-e-zend-server"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/email.png" alt="Share via email" title="Share via email"/></a></span></div><p>Per evitare errori del tipo:</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PHP Warning: &nbsp;PHP Startup: Unable to load dynamic library '/usr/local/zend/lib/php_extensions/XXXX.so' - dlopen(/usr/local/zend/lib/php_extensions/XXXX.so, 9): no suitable image found. &nbsp;Did find:<br />
&nbsp; &nbsp; /usr/local/zend/lib/php_extensions/XXXX.so: mach-o, but wrong architecture in Unknown on line 0</div></div>
<p>Un link vale più di mille parole!<br />
<a href="http://serverfault.com/questions/138046/how-to-compile-php-pecl-apd-for-mamp-snow-leopard">http://serverfault.com/questions/138046/how-to-compile-php-pecl-apd-for-mamp-snow-leopard</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.keasoft.it/blog/2011/04/20/installare-estensioni-pecl-su-mac-osx-e-zend-server/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>K3a.it: un mashup in PHP (blog, flickr, twitter) con HTML5 e CSS3</title>
		<link>http://www.keasoft.it/blog/2010/11/20/k3a-it-un-mashup-in-php-blog-flickr-twitter-con-html5-e-css3</link>
		<comments>http://www.keasoft.it/blog/2010/11/20/k3a-it-un-mashup-in-php-blog-flickr-twitter-con-html5-e-css3#comments</comments>
		<pubDate>Sat, 20 Nov 2010 10:47:00 +0000</pubDate>
		<dc:creator>kea</dc:creator>
				<category><![CDATA[k3a]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.keasoft.it/blog/?p=192</guid>
		<description><![CDATA[Prendendo spunto dal mio amico Francesco mi vorrei inoltrare nel creare una pagina di mashup dei miei account dei servizi maggiormente utilizzati: twitter, flickr e blog. Visto che non inserisco contenuti da mesi in nessuno dei tre, voi direte, &#8220;cosa &#8230; <a href="http://www.keasoft.it/blog/2010/11/20/k3a-it-un-mashup-in-php-blog-flickr-twitter-con-html5-e-css3">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[
				<!-- Social Sharing Toolkit v2.0.4 | http://www.marijnrongen.com/wordpress-plugins/social_sharing_toolkit/ -->
				<div class="mr_social_sharing_wrapper"><span class="mr_social_sharing"><iframe src="https://www.facebook.com/plugins/like.php?locale=en_US&amp;href=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F11%2F20%2Fk3a-it-un-mashup-in-php-blog-flickr-twitter-con-html5-e-css3&amp;layout=standard&amp;show_faces=false&amp;width=51px&amp;height=24px" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:51px; height:24px;" allowTransparency="true"></iframe></span><span class="mr_social_sharing"><div id="fb-root"></div><fb:send href="http://www.keasoft.it/blog/2010/11/20/k3a-it-un-mashup-in-php-blog-flickr-twitter-con-html5-e-css3" font=""></fb:send></span><span class="mr_social_sharing"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F11%2F20%2Fk3a-it-un-mashup-in-php-blog-flickr-twitter-con-html5-e-css3&amp;text=K3a.it%3A+un+mashup+in+PHP+%28blog%2C+flickr%2C+twitter%29+con+HTML5+e+CSS3" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/twitter.png" alt="Share on Twitter" title="Share on Twitter"/></a></span><span class="mr_social_sharing"><g:plusone size="medium" count="false" href="http://www.keasoft.it/blog/2010/11/20/k3a-it-un-mashup-in-php-blog-flickr-twitter-con-html5-e-css3"></g:plusone></span><span class="mr_social_sharing"><a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F11%2F20%2Fk3a-it-un-mashup-in-php-blog-flickr-twitter-con-html5-e-css3&amp;title=K3a.it%3A+un+mashup+in+PHP+%28blog%2C+flickr%2C+twitter%29+con+HTML5+e+CSS3" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/delicious.png" alt="Save on Delicious" title="Save on Delicious"/></a></span><span class="mr_social_sharing"><a href="http://digg.com/submit?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F11%2F20%2Fk3a-it-un-mashup-in-php-blog-flickr-twitter-con-html5-e-css3&amp;title=K3a.it%3A+un+mashup+in+PHP+%28blog%2C+flickr%2C+twitter%29+con+HTML5+e+CSS3" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/digg.png" alt="Digg This" title="Digg This"/></a></span><span class="mr_social_sharing"><a href="mailto:?subject=K3a.it: un mashup in PHP (blog, flickr, twitter) con HTML5 e CSS3&amp;body=http://www.keasoft.it/blog/2010/11/20/k3a-it-un-mashup-in-php-blog-flickr-twitter-con-html5-e-css3"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/email.png" alt="Share via email" title="Share via email"/></a></span></div><p>Prendendo spunto dal mio amico <a href="http://www.trucchia.it/">Francesco</a> mi vorrei inoltrare nel creare una pagina di mashup dei miei account dei servizi maggiormente utilizzati: twitter, flickr e blog. Visto che non inserisco contenuti da mesi in nessuno dei tre, voi direte, &#8220;cosa lo fai a fare?&#8221;. Per ripassare come si può realizzare qualcosa di semplice in PHP e come si può organizzare un progetto (semplice) da zero utilizzando le &#8220;migliori pratiche&#8221; imparando qualcosa di nuovo.<span id="more-192"></span></p>
<p>Vediamo le cose che devono essere affrontate in ordine sparso:</p>
<ol>
<li>Registrare il dominio </li>
<li>Scrivere le storie</li>
<li>Implementare il tutto</li>
<li>Studiare HTML5 e CSS3</li>
<li>Creare/trovare la grafica</li>
</ol>
<p><strong>1. Registrare il dominio</strong><br />
Per mia grande fortuna il dominio <a href="k3a.it">k3a.it</a> era disponibile, l&#8217;ho acquistato e sono cominciati i problemi. Ho un account illimitato su Dreamhost con il quale posso ospitare i miei siti personali. Il problema è che permette di registrare o trasferire solo domini .com, .net, .org, .edu. Il mio registrant per conto suo ha politiche di cambio DNS un po&#8217; troppo restrittive e non sono riuscito a far puntare i DNS correttamente: come risultato ho inserito a mano una ventina di entri nel gestore di DNS. Cominciamo male!</p>
<p><strong>2. Scrivere le storie</strong><br />
Quali storie scriviamo? &#8220;C&#8217;era una volta&#8230;&#8221; no, non quelle! Facciamo un elenco delle funzionalità che il sito/pagina deve avere:</p>
<ul>
<li>Come utente voglio visualizzare gli ultimi K tweet di k3a</li>
<li>Come utente voglio visualizzare gli ultimi E post di keasoft.it</li>
<li>Come utente voglio visualizzare le ultime A foto di kea42 su Flickr</li>
<li>Come utente voglio visualizzare alcune informazioni sull&#8217;autore del sito</li>
</ul>
<p><strong>3. Implementare il tutto</strong><br />
Prima di iniziare direi di ricordare a me stesso alcune cose da tenere in mente durante lo sviluppo:</p>
<ul>
<li>DRTW (Don&#8217;t Reinvent The Wheel)</li>
<li>TDD (Test Driven Design)</li>
<li>KISS (Keep It Simple, Stupid)</li>
<li>DRY (Don&#8217;t Repeat Yourself)</li>
<li>HFDSA (Hai Finito Di Scrive Acronimi?)</li>
</ul>
<p>Quindi per il primo principio è meglio verificare prima se ci sono già alcune classi PHP che fanno ciò di cui ho bisogno.<br />
Nel caso in cui non esistano classi adatte o per fare alcuni di test di integrazione, direi di orientarmi su un classico <a href="http://www.phpunit.de/">PHPUnit</a> per la scrittura dei test. Questa scelta (a parte perché PHPUnit è la libreria di riferimento) è anche perché probabilmente non utilizzerò nessun framework in particolare vista la semplicità del progetto.</p>
<p><strong>4. Studiare HTML5 e CSS3</strong><br />
Al momento un progetto molto interessante per iniziare a scrivere da subito siti con HTML5 è senza dubbio <a href="http://html5boilerplate.com/">HTML5 Boilerplate</a>. Nella pagina del progetto ci sono anche numerosi link dove poter iniziare a studiare sia HTML5 che CSS3. Il progetto HTML5 Boilerplate, attraverso un template omnicomprensivo e a partire da una pagina HTML5, degrada il codice in base al browser che visualizza la pagine e la &#8220;traduce&#8221; in modo che ogni browser possa interpretarla in maniera corretta. Il sistema è piuttosto semplice nel concetto ma molto potente nel contempo. Per esempio il tag</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HEADER</div></div>
<p>è tradotto per i browser che non lo suppotano con</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;DIV class&quot;header&quot;&gt;</div></div>
<p>e adattati contemporaneamente anche i CSS, il tutto via Javascript e senza scrivere una riga di codice.<br />
Oltre a questo mette a disposizione template sia per i CSS che per i Javascript e anche per i Web server più diffusi in modo da iniziare a lavorare con un ambiante già configurato per le performace.</p>
<p><strong>5. Creare/trovare la grafica</strong><br />
Il primo pensiero è stato quello di cercare sui classici siti che forniscono template gratuitamente, ma dopo un po&#8217; di ricerca, i siti che offrono un layout a me congeniale e realizzati in HTML5 sono veramente pochi. Al momento mi ispirerò vagamente ad un layout a tre colonne e cercherò di riscriverlo per HTML5, ispirandomi di tanto in tanto ad altri siti.</p>
<p>Ok ci siamo, posso cominciare.<br />
Alla prossima puntata!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keasoft.it/blog/2010/11/20/k3a-it-un-mashup-in-php-blog-flickr-twitter-con-html5-e-css3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Doctrine migrate: quando ci si accorge di essere in ritardo</title>
		<link>http://www.keasoft.it/blog/2010/05/19/doctrine-migrate-quando-ci-si-accorge-di-essere-in-ritardo</link>
		<comments>http://www.keasoft.it/blog/2010/05/19/doctrine-migrate-quando-ci-si-accorge-di-essere-in-ritardo#comments</comments>
		<pubDate>Wed, 19 May 2010 11:13:24 +0000</pubDate>
		<dc:creator>kea</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[migration]]></category>

		<guid isPermaLink="false">http://www.keasoft.it/blog/?p=187</guid>
		<description><![CDATA[A volte può capitare di essere pronti per il deploy di una applicazione quando ci accorgiamo di aver dimenticato di creare gli script per aggiornare il database in produzione. Con Symfony, Doctrine e un sistema di versioning è possibile rimediare &#8230; <a href="http://www.keasoft.it/blog/2010/05/19/doctrine-migrate-quando-ci-si-accorge-di-essere-in-ritardo">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[
				<!-- Social Sharing Toolkit v2.0.4 | http://www.marijnrongen.com/wordpress-plugins/social_sharing_toolkit/ -->
				<div class="mr_social_sharing_wrapper"><span class="mr_social_sharing"><iframe src="https://www.facebook.com/plugins/like.php?locale=en_US&amp;href=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F05%2F19%2Fdoctrine-migrate-quando-ci-si-accorge-di-essere-in-ritardo&amp;layout=standard&amp;show_faces=false&amp;width=51px&amp;height=24px" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:51px; height:24px;" allowTransparency="true"></iframe></span><span class="mr_social_sharing"><div id="fb-root"></div><fb:send href="http://www.keasoft.it/blog/2010/05/19/doctrine-migrate-quando-ci-si-accorge-di-essere-in-ritardo" font=""></fb:send></span><span class="mr_social_sharing"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F05%2F19%2Fdoctrine-migrate-quando-ci-si-accorge-di-essere-in-ritardo&amp;text=Doctrine+migrate%3A+quando+ci+si+accorge+di+essere+in+ritardo" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/twitter.png" alt="Share on Twitter" title="Share on Twitter"/></a></span><span class="mr_social_sharing"><g:plusone size="medium" count="false" href="http://www.keasoft.it/blog/2010/05/19/doctrine-migrate-quando-ci-si-accorge-di-essere-in-ritardo"></g:plusone></span><span class="mr_social_sharing"><a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F05%2F19%2Fdoctrine-migrate-quando-ci-si-accorge-di-essere-in-ritardo&amp;title=Doctrine+migrate%3A+quando+ci+si+accorge+di+essere+in+ritardo" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/delicious.png" alt="Save on Delicious" title="Save on Delicious"/></a></span><span class="mr_social_sharing"><a href="http://digg.com/submit?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F05%2F19%2Fdoctrine-migrate-quando-ci-si-accorge-di-essere-in-ritardo&amp;title=Doctrine+migrate%3A+quando+ci+si+accorge+di+essere+in+ritardo" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/digg.png" alt="Digg This" title="Digg This"/></a></span><span class="mr_social_sharing"><a href="mailto:?subject=Doctrine migrate: quando ci si accorge di essere in ritardo&amp;body=http://www.keasoft.it/blog/2010/05/19/doctrine-migrate-quando-ci-si-accorge-di-essere-in-ritardo"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/email.png" alt="Share via email" title="Share via email"/></a></span></div><p>A volte può capitare di essere pronti per il deploy di una applicazione quando ci accorgiamo di aver dimenticato di creare gli script per aggiornare il database in produzione.<br />
Con Symfony, Doctrine e un sistema di versioning è possibile rimediare molto facilmente.<br />
Questa è la mia ricetta:</p>
<ul>
<li>Recuperare la versione di
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">config/doctrine/schema.yml</div></div>
<p>che rappresenta il database in produzione (verosimilmente il file che è adesso in produzione <img src='http://www.keasoft.it/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  oppure con il sistema di versioning)</li>
<li>Lanciare
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">./symfony doctrine:build --all</div></div>
</li>
<li>Copiare l&#8217;attuale file
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">config/doctrine/schema.yml</div></div>
<p>in un posto sicuro</li>
<li>Sostituire il file
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">config/doctrine/schema.yml</div></div>
<p>con la copia &#8220;vecchia&#8221; recuperata</li>
<li>Lanciare
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">./symfony doctrine:generate-migrations-diff</div></div>
<p>(se necessario con il parametro env settato)</li>
<li>Aprire il file
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">*version*.php</div></div>
<p>appena creato dalla procedura in</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lib/migration/doctrine</div></div>
<p>(se è la prima volta che migri ce n&#8217;è uno solo altrimenti apri solo l&#8217;ultimo)</li>
<li>Inverti il nome dei metodi &#8220;up()&#8221; e &#8220;down()&#8221;, cioè sostituisci il nome &#8220;up()&#8221; con &#8220;down()&#8221; e viceversa</li>
<li>Riporta lo
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">schema.yml</div></div>
<p>all&#8217;ultima versione</li>
<li>Ora puoi lanciare il task di migrazione
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">./symfony doctrine:migrate</div></div>
</li>
<li>Nel caso di errori di CHARSET o COLLATION nel lanciare il task precedente, verifica che nel file di migrazione che hai modificato precedentemente non siano presenti i parametri &#8216;charset&#8217; e &#8216;collate&#8217; come opzioni dei metodi createTable()</li>
</ul>
<p>Buona migrazione a tutti.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keasoft.it/blog/2010/05/19/doctrine-migrate-quando-ci-si-accorge-di-essere-in-ritardo/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Selenium RC Firefox vs Iceweasel in Debian</title>
		<link>http://www.keasoft.it/blog/2010/04/17/selenium-rc-firefox-vs-iceweasel-in-debian</link>
		<comments>http://www.keasoft.it/blog/2010/04/17/selenium-rc-firefox-vs-iceweasel-in-debian#comments</comments>
		<pubDate>Sat, 17 Apr 2010 07:43:03 +0000</pubDate>
		<dc:creator>kea</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[RC]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.keasoft.it/blog/2010/04/17/selenium-rc-firefox-vs-iceweasel-in-debian</guid>
		<description><![CDATA[Se siete così pazzi da aver installato Debian sui vostri computer e rimanete fedeli alle sue politiche (anche con qualche strappo), vi troverete con questo errore lanciando i vostri test con Selenium RC PHPUnit_Framework_Exception: Response from Selenium RC server for &#8230; <a href="http://www.keasoft.it/blog/2010/04/17/selenium-rc-firefox-vs-iceweasel-in-debian">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[
				<!-- Social Sharing Toolkit v2.0.4 | http://www.marijnrongen.com/wordpress-plugins/social_sharing_toolkit/ -->
				<div class="mr_social_sharing_wrapper"><span class="mr_social_sharing"><iframe src="https://www.facebook.com/plugins/like.php?locale=en_US&amp;href=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F04%2F17%2Fselenium-rc-firefox-vs-iceweasel-in-debian&amp;layout=standard&amp;show_faces=false&amp;width=51px&amp;height=24px" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:51px; height:24px;" allowTransparency="true"></iframe></span><span class="mr_social_sharing"><div id="fb-root"></div><fb:send href="http://www.keasoft.it/blog/2010/04/17/selenium-rc-firefox-vs-iceweasel-in-debian" font=""></fb:send></span><span class="mr_social_sharing"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F04%2F17%2Fselenium-rc-firefox-vs-iceweasel-in-debian&amp;text=Selenium+RC+Firefox+vs+Iceweasel+in+Debian" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/twitter.png" alt="Share on Twitter" title="Share on Twitter"/></a></span><span class="mr_social_sharing"><g:plusone size="medium" count="false" href="http://www.keasoft.it/blog/2010/04/17/selenium-rc-firefox-vs-iceweasel-in-debian"></g:plusone></span><span class="mr_social_sharing"><a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F04%2F17%2Fselenium-rc-firefox-vs-iceweasel-in-debian&amp;title=Selenium+RC+Firefox+vs+Iceweasel+in+Debian" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/delicious.png" alt="Save on Delicious" title="Save on Delicious"/></a></span><span class="mr_social_sharing"><a href="http://digg.com/submit?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F04%2F17%2Fselenium-rc-firefox-vs-iceweasel-in-debian&amp;title=Selenium+RC+Firefox+vs+Iceweasel+in+Debian" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/digg.png" alt="Digg This" title="Digg This"/></a></span><span class="mr_social_sharing"><a href="mailto:?subject=Selenium RC Firefox vs Iceweasel in Debian&amp;body=http://www.keasoft.it/blog/2010/04/17/selenium-rc-firefox-vs-iceweasel-in-debian"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/email.png" alt="Share via email" title="Share via email"/></a></span></div><p>Se siete così pazzi da aver installato Debian sui vostri computer e rimanete fedeli alle sue politiche (anche con qualche strappo), vi troverete con questo errore lanciando i vostri test con Selenium RC</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PHPUnit_Framework_Exception: Response from Selenium RC server for getNewBrowserSession(*firefox, http://localhost/).<br />
Failed to start new browser session: Error while launching browser.</div></div>
<p>Questo semplicemente perchè&#8230; non avete effettivamente Firefox installato!<br />
I trucco è aggiungere il path di Iceweasel nella dichiarazione del browser da utilizzare con Selenium. Quindi nei vostri test (se utilizzate PHP) sarà</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$this-&gt;setBrowser(&quot;*firefox /usr/bin/iceweasel&quot;);</div></div>
<p>Oppure aggiungete il link</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ln -s /usr/lib/iceweasel/iceweasel /usr/bin/firefox-bin</div></div>
<p>Buoni test a tutti!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keasoft.it/blog/2010/04/17/selenium-rc-firefox-vs-iceweasel-in-debian/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony: caricare helper dalle action</title>
		<link>http://www.keasoft.it/blog/2010/03/27/symfony-caricare-helper-dalle-action</link>
		<comments>http://www.keasoft.it/blog/2010/03/27/symfony-caricare-helper-dalle-action#comments</comments>
		<pubDate>Sat, 27 Mar 2010 05:19:05 +0000</pubDate>
		<dc:creator>kea</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[helper]]></category>

		<guid isPermaLink="false">http://www.keasoft.it/blog/?p=179</guid>
		<description><![CDATA[Talvolta è utile poter caricare alcuni helper dal controller o dal modello, per esempio mi è capitato di dover formattare una data o utilizzare alcuni dei miei helper direttamente dal controller. Per far questo è sufficiente inserire il codice seguente &#8230; <a href="http://www.keasoft.it/blog/2010/03/27/symfony-caricare-helper-dalle-action">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[
				<!-- Social Sharing Toolkit v2.0.4 | http://www.marijnrongen.com/wordpress-plugins/social_sharing_toolkit/ -->
				<div class="mr_social_sharing_wrapper"><span class="mr_social_sharing"><iframe src="https://www.facebook.com/plugins/like.php?locale=en_US&amp;href=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F03%2F27%2Fsymfony-caricare-helper-dalle-action&amp;layout=standard&amp;show_faces=false&amp;width=51px&amp;height=24px" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:51px; height:24px;" allowTransparency="true"></iframe></span><span class="mr_social_sharing"><div id="fb-root"></div><fb:send href="http://www.keasoft.it/blog/2010/03/27/symfony-caricare-helper-dalle-action" font=""></fb:send></span><span class="mr_social_sharing"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F03%2F27%2Fsymfony-caricare-helper-dalle-action&amp;text=Symfony%3A+caricare+helper+dalle+action" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/twitter.png" alt="Share on Twitter" title="Share on Twitter"/></a></span><span class="mr_social_sharing"><g:plusone size="medium" count="false" href="http://www.keasoft.it/blog/2010/03/27/symfony-caricare-helper-dalle-action"></g:plusone></span><span class="mr_social_sharing"><a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F03%2F27%2Fsymfony-caricare-helper-dalle-action&amp;title=Symfony%3A+caricare+helper+dalle+action" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/delicious.png" alt="Save on Delicious" title="Save on Delicious"/></a></span><span class="mr_social_sharing"><a href="http://digg.com/submit?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2010%2F03%2F27%2Fsymfony-caricare-helper-dalle-action&amp;title=Symfony%3A+caricare+helper+dalle+action" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/digg.png" alt="Digg This" title="Digg This"/></a></span><span class="mr_social_sharing"><a href="mailto:?subject=Symfony: caricare helper dalle action&amp;body=http://www.keasoft.it/blog/2010/03/27/symfony-caricare-helper-dalle-action"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/email.png" alt="Share via email" title="Share via email"/></a></span></div><p>Talvolta è utile poter caricare alcuni helper dal controller o dal modello, per esempio mi è capitato di dover formattare una data o utilizzare alcuni dei miei helper direttamente dal controller.<br />
Per far questo è sufficiente inserire il codice seguente nel metodo in cui si ha la necessità:</p>
<pre>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sfLoad::helpers(array('helper1', 'helper2', ...));</div></div>
</pre>
<p>Buon coding.</p>
<p>UPDATE: per sf 1.4</p>
<pre>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$this-&gt;getContext()-&gt;getConfiguration()-&gt;loadHelpers('Partial');<br />
$this-&gt;getContext()-&gt;getConfiguration()-&gt;loadHelpers(array('helper1', 'helper2', ...));</div></div>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.keasoft.it/blog/2010/03/27/symfony-caricare-helper-dalle-action/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Symfony e Ajax, finalmente il &#8220;cart&#8221; anche con jQuery</title>
		<link>http://www.keasoft.it/blog/2009/09/19/symfony-e-ajax-finalmente-il-cart-anche-con-jquery</link>
		<comments>http://www.keasoft.it/blog/2009/09/19/symfony-e-ajax-finalmente-il-cart-anche-con-jquery#comments</comments>
		<pubDate>Sat, 19 Sep 2009 21:25:44 +0000</pubDate>
		<dc:creator>kea</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[patch]]></category>

		<guid isPermaLink="false">http://www.keasoft.it/blog/?p=173</guid>
		<description><![CDATA[Ho appena patchato il plugin sfJqueryReloaded (il trunk) per abilitare il supporto a jq_drop_receiving_element(), ultimo tassello mancante per poter riscrivere il tutorial ajax di symfony anche con jQuery. Potete trovare la demo riscritta in http://cart.demo.keasoft.it/ e la patch (in attesa &#8230; <a href="http://www.keasoft.it/blog/2009/09/19/symfony-e-ajax-finalmente-il-cart-anche-con-jquery">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[
				<!-- Social Sharing Toolkit v2.0.4 | http://www.marijnrongen.com/wordpress-plugins/social_sharing_toolkit/ -->
				<div class="mr_social_sharing_wrapper"><span class="mr_social_sharing"><iframe src="https://www.facebook.com/plugins/like.php?locale=en_US&amp;href=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2009%2F09%2F19%2Fsymfony-e-ajax-finalmente-il-cart-anche-con-jquery&amp;layout=standard&amp;show_faces=false&amp;width=51px&amp;height=24px" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:51px; height:24px;" allowTransparency="true"></iframe></span><span class="mr_social_sharing"><div id="fb-root"></div><fb:send href="http://www.keasoft.it/blog/2009/09/19/symfony-e-ajax-finalmente-il-cart-anche-con-jquery" font=""></fb:send></span><span class="mr_social_sharing"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2009%2F09%2F19%2Fsymfony-e-ajax-finalmente-il-cart-anche-con-jquery&amp;text=Symfony+e+Ajax%2C+finalmente+il+%E2%80%9Ccart%E2%80%9D+anche+con+jQuery" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/twitter.png" alt="Share on Twitter" title="Share on Twitter"/></a></span><span class="mr_social_sharing"><g:plusone size="medium" count="false" href="http://www.keasoft.it/blog/2009/09/19/symfony-e-ajax-finalmente-il-cart-anche-con-jquery"></g:plusone></span><span class="mr_social_sharing"><a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2009%2F09%2F19%2Fsymfony-e-ajax-finalmente-il-cart-anche-con-jquery&amp;title=Symfony+e+Ajax%2C+finalmente+il+%E2%80%9Ccart%E2%80%9D+anche+con+jQuery" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/delicious.png" alt="Save on Delicious" title="Save on Delicious"/></a></span><span class="mr_social_sharing"><a href="http://digg.com/submit?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2009%2F09%2F19%2Fsymfony-e-ajax-finalmente-il-cart-anche-con-jquery&amp;title=Symfony+e+Ajax%2C+finalmente+il+%E2%80%9Ccart%E2%80%9D+anche+con+jQuery" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/digg.png" alt="Digg This" title="Digg This"/></a></span><span class="mr_social_sharing"><a href="mailto:?subject=Symfony e Ajax, finalmente il “cart” anche con jQuery&amp;body=http://www.keasoft.it/blog/2009/09/19/symfony-e-ajax-finalmente-il-cart-anche-con-jquery"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/email.png" alt="Share via email" title="Share via email"/></a></span></div><p>Ho appena patchato il plugin <a href="http://www.symfony-project.org/plugins/sfJqueryReloadedPlugin">sfJqueryReloaded</a> (il trunk) per abilitare il supporto a jq_drop_receiving_element(), ultimo tassello mancante per poter riscrivere il <a href="http://www.symfony-project.org/tutorial/1_2/en/symfony-ajax">tutorial ajax di symfony</a> anche con jQuery.</p>
<p>Potete trovare la demo riscritta in <a href="http://cart.demo.keasoft.it/">http://cart.demo.keasoft.it/</a> e la patch (in attesa di approvazione dai lead del plugin) qui <a href="http://www.keasoft.it/patch/jQueryHelper.php.diff">jQueryHelper.php.diff</a></p>
<p>Buon divertimento</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keasoft.it/blog/2009/09/19/symfony-e-ajax-finalmente-il-cart-anche-con-jquery/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aggiornamento del kernel: tutta colpa di initramfs-tools? No di libmtp</title>
		<link>http://www.keasoft.it/blog/2009/06/27/aggiornamento-del-kernel-tutta-colpa-di-initramfs-tools-no-di-libmtp</link>
		<comments>http://www.keasoft.it/blog/2009/06/27/aggiornamento-del-kernel-tutta-colpa-di-initramfs-tools-no-di-libmtp#comments</comments>
		<pubDate>Sat, 27 Jun 2009 08:18:15 +0000</pubDate>
		<dc:creator>kea</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[initrd]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[libmtp]]></category>

		<guid isPermaLink="false">http://www.keasoft.it/blog/?p=168</guid>
		<description><![CDATA[Oggi mi sono deciso ad aggiornare il kernel alla 2.6.30 visto che avevo qualche problema di installazione (postinst) con la versione 2.6.29-2. Lanciando apt-get ricevevo questo messaggio update-initramfs: Generating /boot/initrd.img-2.6.29-2-686 &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#8230; <a href="http://www.keasoft.it/blog/2009/06/27/aggiornamento-del-kernel-tutta-colpa-di-initramfs-tools-no-di-libmtp">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[
				<!-- Social Sharing Toolkit v2.0.4 | http://www.marijnrongen.com/wordpress-plugins/social_sharing_toolkit/ -->
				<div class="mr_social_sharing_wrapper"><span class="mr_social_sharing"><iframe src="https://www.facebook.com/plugins/like.php?locale=en_US&amp;href=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2009%2F06%2F27%2Faggiornamento-del-kernel-tutta-colpa-di-initramfs-tools-no-di-libmtp&amp;layout=standard&amp;show_faces=false&amp;width=51px&amp;height=24px" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:51px; height:24px;" allowTransparency="true"></iframe></span><span class="mr_social_sharing"><div id="fb-root"></div><fb:send href="http://www.keasoft.it/blog/2009/06/27/aggiornamento-del-kernel-tutta-colpa-di-initramfs-tools-no-di-libmtp" font=""></fb:send></span><span class="mr_social_sharing"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2009%2F06%2F27%2Faggiornamento-del-kernel-tutta-colpa-di-initramfs-tools-no-di-libmtp&amp;text=Aggiornamento+del+kernel%3A+tutta+colpa+di+initramfs-tools%3F+No+di+libmtp" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/twitter.png" alt="Share on Twitter" title="Share on Twitter"/></a></span><span class="mr_social_sharing"><g:plusone size="medium" count="false" href="http://www.keasoft.it/blog/2009/06/27/aggiornamento-del-kernel-tutta-colpa-di-initramfs-tools-no-di-libmtp"></g:plusone></span><span class="mr_social_sharing"><a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2009%2F06%2F27%2Faggiornamento-del-kernel-tutta-colpa-di-initramfs-tools-no-di-libmtp&amp;title=Aggiornamento+del+kernel%3A+tutta+colpa+di+initramfs-tools%3F+No+di+libmtp" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/delicious.png" alt="Save on Delicious" title="Save on Delicious"/></a></span><span class="mr_social_sharing"><a href="http://digg.com/submit?url=http%3A%2F%2Fwww.keasoft.it%2Fblog%2F2009%2F06%2F27%2Faggiornamento-del-kernel-tutta-colpa-di-initramfs-tools-no-di-libmtp&amp;title=Aggiornamento+del+kernel%3A+tutta+colpa+di+initramfs-tools%3F+No+di+libmtp" target="_blank" class="mr_social_sharing_popup_link"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/digg.png" alt="Digg This" title="Digg This"/></a></span><span class="mr_social_sharing"><a href="mailto:?subject=Aggiornamento del kernel: tutta colpa di initramfs-tools? No di libmtp&amp;body=http://www.keasoft.it/blog/2009/06/27/aggiornamento-del-kernel-tutta-colpa-di-initramfs-tools-no-di-libmtp"><img src="http://www.keasoft.it/blog/wp-content/plugins/social-sharing-toolkit/images/buttons/email.png" alt="Share via email" title="Share via email"/></a></span></div><p>Oggi mi sono deciso ad aggiornare il kernel alla 2.6.30 visto che avevo qualche problema di installazione (postinst) con la versione 2.6.29-2. Lanciando apt-get ricevevo questo messaggio</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">update-initramfs: Generating /boot/initrd.img-2.6.29-2-686 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
cpio: ./etc/udev/rules.d/libmtp.rules: Cannot stat: No such file or directory &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
update-initramfs: failed for /boot/initrd.img-2.6.29-2-686 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
dpkg: il sottoprocesso installed post-installation script ha restituito un codice di errore 1<br />
E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem.</div></div>
<p>Stessa cosa con il 2.6.30&#8230; sigh!<br />
Spulciando nella rete ho trovato un post tra i <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=527493">Debian bug</a> che riportava esattamente lo stesso errore.<br />
L&#8217;errore è dovuto ad una coesistenza difficile tra due versioni di libmtp: io avevo installato sia la libmtp5 che la libmtp8. E&#8217; stato sufficiente eliminare la 5 (obsoleta) e tutto si è risolto automagicamente.<br />
Buon upgrade a tutti!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keasoft.it/blog/2009/06/27/aggiornamento-del-kernel-tutta-colpa-di-initramfs-tools-no-di-libmtp/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

