<?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>itora web</title>
	<atom:link href="http://www.itora.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.itora.net/blog</link>
	<description></description>
	<lastBuildDate>Thu, 22 Mar 2012 10:44:40 +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>Moving from WordPress to jekyll</title>
		<link>http://www.itora.net/blog/2012/03/22/moving-from-wordpress-to-jekyll/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=moving-from-wordpress-to-jekyll</link>
		<comments>http://www.itora.net/blog/2012/03/22/moving-from-wordpress-to-jekyll/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 10:44:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.itora.net/blog/?p=525</guid>
		<description><![CDATA[I'm moving my website from worpdress to jekyll. I'm moving the hosting too, because github is free. And I'm changing domain name. Yes, spring is coming, time to change. So, if you wanna read what I'm writing, you can follow me here edapx.com. Ah, the new feed is available here (there is a noisy screensaver [...]]]></description>
			<content:encoded><![CDATA[<p>I'm moving my website from worpdress to jekyll.<br />
I'm moving the hosting too, because github is free.<br />
And I'm changing domain name.<br />
Yes, spring is coming, time to change.<br />
So, if you wanna read what I'm writing, you can follow me here <a href="http://edapx.com">edapx.com</a>.<br />
Ah, the new feed is available <a href="http://feeds.feedburner.com/Edapx">here</a> (there is a noisy screensaver that I will remove)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itora.net/blog/2012/03/22/moving-from-wordpress-to-jekyll/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cakePHP youtube datasource</title>
		<link>http://www.itora.net/blog/2012/03/12/cakephp-youtube-datasource/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp-youtube-datasource</link>
		<comments>http://www.itora.net/blog/2012/03/12/cakephp-youtube-datasource/#comments</comments>
		<pubDate>Mon, 12 Mar 2012 09:37:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[cakephp]]></category>
		<category><![CDATA[datasource]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.itora.net/blog/?p=522</guid>
		<description><![CDATA[I've seen in google analytics that mosts visitors of this blog speak english. I've thought that the italians can understand what i'm writing, so, here we are, i've switched language. I've just pushed on github a cakePHP youtube datasource, to retrieve information (all the metatags) regarding a video. It's still incomplete, I would like to [...]]]></description>
			<content:encoded><![CDATA[<p>I've seen in google analytics that mosts visitors of this blog speak english. I've thought that the italians can understand what i'm writing, so, here we are, i've switched language.<br />
I've just pushed on github a <a href="https://github.com/edap/cakePHP-youtube-datasource">cakePHP youtube datasource</a>, to retrieve information (all the metatags) regarding a video. It's still incomplete, I would like to add some others functionality, like retrieve the standard feed for a given category, or retrieve a video with more than X views. Ecc, anyway, Fork Me.<br />
Here I provide a solution that I've adopted to save in the database the fields "video_title", "video_thumb" and "video_id" for a given youtube video link associated to a model, for example an Article model containing a video, or a Submission Model containing a youtube video for a video contest. This code validates the video URL and, if valid, add the videos metatags to the data model to save, in this example, the Article model.<br />
1)Follow the instruction on the github page and install the datasource<br />
2) Add this rule to your $validate array in the model where you would like to save the video information</p>
<pre>
'video' => array(
    'rule' => 'validYoutube',
    'message' => 'the given videos link is incorrect',
    'allowEmpty' => true,
),
</pre>
<p>3)Add this functions in the Model, that checks if the video is valid, and add the metatags to the $data array</p>
<pre>
&lt;?
    public function validYoutube(array $data ){
        $url = current($data);
        $video_info = $this-&gt;getVideo($url);
        if ($video_info) {
            $this-&gt;setVideoValues($video_info);
            return true;
        }else{
            return false;
        }
    }

    public function getVideo($id){
	$this-&gt;Youtube = ConnectionManager::getDataSource(&#039;Youtube&#039;);
        $video = $this-&gt;Youtube-&gt;findById($id);
        if (!$video) {
            return false;
        }
        $info = $this-&gt;Youtube-&gt;formatData($video);
        return $info;
    }

    public function setVideoValues($info){
        if (empty($info)) {
            return false;
        }
        $this-&gt;data[&#039;Article&#039;][&#039;video&#039;] = $info[&#039;id&#039;];
        $this-&gt;data[&#039;Article&#039;][&#039;video_thumb&#039;] = $info[&#039;default_thumb&#039;];
	$this-&gt;data[&#039;Article&#039;][&#039;video_title&#039;] = $info[&#039;title&#039;];
    }
?&gt;
</pre>
<p>Thanks <a href="http://debuggable.com/posts/datasources,-models,-components,-behaviors:48bd3025-2c44-40b6-a6e7-35674834cda3">debuggable for this article</a> on datasources in CakePHP</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itora.net/blog/2012/03/12/cakephp-youtube-datasource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP 2.0 Comments Spam Datasource</title>
		<link>http://www.itora.net/blog/2012/03/03/cakephp-2-0-comments-spam-datasource/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp-2-0-comments-spam-datasource</link>
		<comments>http://www.itora.net/blog/2012/03/03/cakephp-2-0-comments-spam-datasource/#comments</comments>
		<pubDate>Sat, 03 Mar 2012 19:31:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[cakephp]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://www.itora.net/blog/?p=520</guid>
		<description><![CDATA[Ho trovato questo post che spiega come implementare akismet per verificare i commenti sul nostro sito.Mi e' sembrata davvero la soluzione piu' semplice fra le tante disponibili. I commenti vengono salvati nel nostro database, e dopo il salvataggio verifichiamo tramite akismet se il commento e' spam o meno. Ecco qui i passaggi: 1) Scaricarsi il [...]]]></description>
			<content:encoded><![CDATA[<p>Ho trovato questo <a href="http://www.thelittlebakery.org/2011/06/admin-panel-development-akismet-product-review/">post</a> che spiega come implementare akismet per verificare i commenti sul nostro sito.Mi e' sembrata davvero la soluzione piu' semplice fra le tante disponibili. I commenti vengono salvati nel nostro database, e dopo il salvataggio verifichiamo tramite akismet se il commento e' spam o meno. Ecco qui i passaggi:<br />
1) Scaricarsi il datasource <a href="https://github.com/alexdd55/thelittlebakery/blob/master/app/Model/Datasource/akismet.php">akismet.php</a> ed metterlo in app/Model/Datasource.<br />
1)Creare una api key sul sito di akisemt, ed aggiungere queste linee al file database.php</p>
<pre>
public $Akismet = array(
    'datasource' => 'Akismet',
    'blog' => 'http://yourblog/',
    'key' => 'your_akismet_key'
);
</pre>
<p>2)Nella nostra tabella destinanata ai commenti, aggiungere i campi spam e checked<br />
3)Aggiungere al model Comment.php la seguente funzione.</p>
<pre>
public function checkForSpam($id) {
	$comment = $this->read(null, $id);
	App::uses('HttpSocket', 'Network/Http');
	$this->Http = new HttpSocket();
	$this->Akismet = ConnectionManager::getDataSource('Akismet');
	$data = array(
	      'user_ip' => $comment['Comment']['ip'],
	      'user_agent' => $_SERVER['HTTP_USER_AGENT'],
	      'referrer' => 'http://www.google.com',
	      'permalink' => '/comments/view/'.$comment['Comment']['id'],
	      'comment_type' => 'comment',
	      'comment_author' => $comment['Comment']['name'],
	      'comment_author_email' => $comment['Comment']['email'],
	      'comment_author_url' => '',
	      'comment_content' => $comment['Comment']['text']
		);
	$check = $this->Akismet->checkSpam($data);
	if($check == 'true') {
		$spam = array(
			'id' => $comment['Comment']['id'],
			'checked' => 1,
			'spam' => 1
		);
	} else {
		$spam = array(
			'id' => $comment['Comment']['id'],
			'checked' => 1,
			'spam' => 0
		);
	};
	return $this->save($spam, false);
}
</pre>
<p>4) Nel vostro CommentsController file, dopo aver salvato il commento richiamate la funzione appena creata. Es</p>
<pre>
public function add() {
	if ($this->request->is('post')) {
		$this->Comment->create();
		if ($this->Comment->save($this->request->data)) {
			$this->Comment->checkForSpam($this->Comment->getInsertID());
			$this->Session->setFlash(__('The comment has been saved'));
			$this->redirect(array('action' => 'index'));
		} else {
			$this->Session->setFlash(__('The comment could not be saved. Please, try again.'));
		}
	}
	$articles = $this->Comment->Article->find('list');
	$this->set(compact('articles'));
}
</pre>
<p>5)Nella vostra sezione amministrativa, elencate tutti i commenti, e verificate i falsi positivi, in caso ce ne siano<br />
6)Sul vostro sito, mostrate solo i commmenti con il valore di "spam" = 0</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itora.net/blog/2012/03/03/cakephp-2-0-comments-spam-datasource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stesso progetto in rails, due versioni di ruby e due gemset diversi</title>
		<link>http://www.itora.net/blog/2012/03/02/stesso-progetto-in-rails-due-versioni-di-ruby-e-due-gemset-diversi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=stesso-progetto-in-rails-due-versioni-di-ruby-e-due-gemset-diversi</link>
		<comments>http://www.itora.net/blog/2012/03/02/stesso-progetto-in-rails-due-versioni-di-ruby-e-due-gemset-diversi/#comments</comments>
		<pubDate>Fri, 02 Mar 2012 16:16:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[allday]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[RVM]]></category>

		<guid isPermaLink="false">http://www.itora.net/blog/?p=514</guid>
		<description><![CDATA[Supponiamo di avere un progetto in rails che usa rails 3.0.0 e ruby 1.8.7, ma di voler sviluppare parallelamente a questo, lo stesso progetto ma con ruby 1.9.3 e rails 3.2.2, per prepararci in tempo qual'ora verra' il momento di passare in produzione. Per fare questo creeremo un branch "develop" che useremo per portare avanti [...]]]></description>
			<content:encoded><![CDATA[<p>Supponiamo di avere un progetto in rails che usa rails 3.0.0 e ruby 1.8.7, ma di voler sviluppare parallelamente a questo, lo stesso progetto ma con ruby 1.9.3 e rails 3.2.2, per prepararci in tempo qual'ora verra' il momento di passare in produzione. Per fare questo creeremo un <a href="http://www.itora.net/blog/2011/09/20/git_branch/">branch</a> "develop" che useremo per portare avanti la nostra applicazione sull'ultima release disponibile.<br />
Per prima cosa, installiamo rvm come spiegato nel <a href="http://www.itora.net/blog/2012/02/26/installare-ruby-rvm-ovvero-come-avere-differenti-versioni-di-ruby-sulla-stessa-macchina/">post precedente</a> e ripassiamo come creare dei branch in git, e switchare tra l'uno e l'altro. Poi spostiamoci nella cartella del nostro progetto, nel branch master.<br />
creiamo il file .rvmrc contenente "ruby.1.8.7@progetto". usciamo dalla cartella e rientriamo, apparira' un messaggio. "Gemset 'progetto' does not exist, rvm gemset create 'progetto' first.". Facciamo quanto dice:</p>
<pre>
gemset create progetto
gemset use progetto
gem install bundler
</pre>
<p>I primi due comandi dicono a ruby che per questo progetto esiste il gemset 'progetto' per la versione 1.8.7 e che quella va usata. se da linea di comando digitiamo "rvm gemset list", verranno elencati tutti i gemset per la versione di ruby selezionata, e con un asterisco verra' contrassegnata la versione corrente.<br />
L'ultimo comando installa bundler, onde evitare questo errore che potremmo avere al primo avvio di rails nel caso ce ne fossimo dimenticati:</p>
<pre>
/usr/local/lib/site_ruby/1.8/rubygems/dependency.rb:247:in `to_specs': Could not find rails (>= 0) amongst [bundler-1.0.22] (Gem::LoadError)
</pre>
<p>Bene, passiamo al branch develop, creaiamo il branch "develop", e modifichiamo il file .rvmrc mettendo come valore ruby1.9.3@progetto. Come prima, creiamo il gemset per questa versione di ruby in questo progetto e diciamo a ruby di usare questa.</p>
<pre>
gemset create progetto
gemset use progetto
gem install bundler
</pre>
<p>Dopo aver aggiornato il nostro Gemfile, aggiornando le gemme ad una versione piu' recente, lanciamo bundle.</p>
<p>Ricapitolando, abbiamo due branch, ognuno con una differente versione di ruby ed un diverso gemset.<br />
master ruby 1.8.7, gemset 'progetto' per la versione 1.8.7<br />
develop ruby 1.9.3, gemset 'progetto' per la versione 1.9.3<br />
Per muoversi da un branch all'altro usare 'branch checkout'.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itora.net/blog/2012/03/02/stesso-progetto-in-rails-due-versioni-di-ruby-e-due-gemset-diversi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installare Ruby RVM, ovvero come avere differenti versioni di ruby sulla stessa macchina</title>
		<link>http://www.itora.net/blog/2012/02/26/installare-ruby-rvm-ovvero-come-avere-differenti-versioni-di-ruby-sulla-stessa-macchina/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=installare-ruby-rvm-ovvero-come-avere-differenti-versioni-di-ruby-sulla-stessa-macchina</link>
		<comments>http://www.itora.net/blog/2012/02/26/installare-ruby-rvm-ovvero-come-avere-differenti-versioni-di-ruby-sulla-stessa-macchina/#comments</comments>
		<pubDate>Sun, 26 Feb 2012 22:34:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[allday]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[RVM]]></category>

		<guid isPermaLink="false">http://www.itora.net/blog/?p=491</guid>
		<description><![CDATA[Ruby Virtual Machine serve per utilizzare differenti versioni di ruby sulla stessa macchina. In Ruby, data l'alta frequenza con cui vengono rilasciate le nuove release, e' molto facile avere progetti in produzione che funzionano con una versione vecchia di ruby. un altro scenario in cui RVM puo' tornare utile e' quello in cui vogliamo sperimentare [...]]]></description>
			<content:encoded><![CDATA[<p>Ruby Virtual Machine serve per utilizzare differenti versioni di ruby sulla stessa macchina. In Ruby, data l'alta frequenza con cui vengono rilasciate le nuove release, e' molto facile avere progetti in produzione che funzionano con una versione vecchia di ruby. un altro scenario in cui RVM puo' tornare utile e' quello in cui vogliamo sperimentare la nuova versione di ruby al posto di quella predefinita dal nostro sistema.<br />
Se scegliamo di affidarci a RVM, cosa saggia, e' bene che d'ora in avanti ogni progetto in ruby abbia la sua versione di ruby e relativo gemset definito in .rvmrc (vedi tutorial alla fine), e di non affidarsi piu'alla versione di ruby in /usr/bin ma a quella installata nella nostra /home/user/.rvm. Dopo aver completato quanto scritto in questa guida, il comando "which ruby" restituira' il path dell'eseguibile all'interno della nostra .rvm folder. Se invece da root, eseguiamo il comando "which ruby" quesyto ritornera' il path "/usr/bin/ruby", perche' questo e' il path dell'eseguibile di sistema, mentre con rvm installiamo diverse versioni di ruby in user space, all'interno della nostra home. Si puo' installare rvm anche da root, ma e' una cosa che sconsiglio. Meglio avere una sola versione di ruby sull'intero sistema, e diverse versioni di ruby in user space, adattabili ai nostri progetti.</p>
<h4>Installare RVM</h4>
<pre>
$ bash -s stable &lt; &lt;(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
[bash]
aggiungi questa linea alla fine di .bashrc
[bash]
[[ -s &quot;$HOME/.rvm/scripts/rvm&quot; ]] &amp;&amp; source &quot;$HOME/.rvm/scripts/rvm&quot;
</pre>
<p>ricarica il file ".bashrc"</p>
<pre>
$ source ~/.bashrc
</pre>
<p>leggi bene cosa ti dice l'output di questo comando, e in caso installa quanto richiesto</p>
<pre>
rvm requirements
</pre>
<p>Qui leggiamo</p>
<pre>
To install rbx and/or Ruby 1.9 head (MRI) (eg. 1.9.2-head),
then you must install and use rvm 1.8.7 first
</pre>
<p>Ed e' quello che faremo.Per installa MRI dobbiamo prima installare ruby 1.8.7.MRI, Matz' Ruby Interpreter e' l'implementazione ufficiale di ruby scritta in C.</p>
<pre>
apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion
</pre>
<p>poi</p>
<pre>
rvm install ruby 1.8.7
</pre>
<p>con questo comando possiamo invece vedere tutte le versioni di ruby che possiamo installare</p>
<pre>
rvm list known
</pre>
<p>Ora possiamo installare ruby 1.9.3</p>
<pre>
rvm install ruby 1.9.3
</pre>
<h4>Passare da una versiona all'altra di ruby, o sceglierne una di default</h4>
<p>dando il comando</p>
<pre>
rwm list
</pre>
<p>Possiamo avere un elenco delle versione di ruby installate. Per passare dalla 1.8.7 alla 1.9.3, diamo il comando</p>
<pre>
rwm use 1.9.3
</pre>
<p>Se invece vogliamo usarne una di default, basta settarla</p>
<pre>
 rvm --default use 1.9.3
</pre>
<h4>.rvmrc</h4>
<p>Come far si che ogni progetto abbia la sua versione di ruby e il suo gemset gia' configurato.creiamo la cartella "uno" che conterra' un progetto che usa ruby 1.8.7 e la cartella "due" che usa ruby 1.9.3.<br />
Spostiamoci in "uno" e creiamo il file .rvmrc contenente il nome della versione di ruby che vogliamo usare ed il nome del progetto separati dal simbolo <b>@</b>.Quindi</p>
<pre>
rvm 1.8.7@uno
</pre>
<p>Facciamo la stessa cosa nella cartella "due", modificando i valori per il file .rvmrc</p>
<pre>
rvm 1.9.3@due
</pre>
<p>Ora ritorniamo nella cartella "uno", apparira' un warning, che ci dira' che non abbiamo il gemset installato. Digitiamo "y" ed andiamo avanti. spostandoci nelle cartelle e digitando "ruby -v" si puo' vedere come ruby cambi la versione a seconda di dove si trovi.<br />
Per creare il gemset dove necessario(nel mio caso 1.9.3, perche' 1.8.7 era gia' installato) basta copiare il messagio letto nel warning ed eseguirlo nella directory dove abbiamo letto tale warning</p>
<pre>
rvm gemset create 'due'
</pre>
<h4>Aggiornare RVM</h4>
<p>All'ultima stable</p>
<pre>
rvm get stable
</pre>
<p>Alla piu' recente</p>
<pre>
rvm get latest
</pre>
<p>Alla recentissima piena di bugs</p>
<pre>
rvm get head
</pre>
<p>rvm ha davvero un infinita' di opzioni, dare un occhio alla pagina help (rvm -h) per rendersene conto. Il progetto e' attivamente sviluppato qua <a href="https://github.com/wayneeseguin/rvm">https://github.com/wayneeseguin/rvm</a></p>
<p><strong>Link utili:</strong><br />
<a href="http://beginrescueend.com/set/gem/">http://beginrescueend.com/set/gem/</a><br />
<a href="http://beginrescueend.com/rvm/best-practices/">http://beginrescueend.com/rvm/best-practices/</a><br />
<a href="http://screencasts.org/episodes/how-to-use-rvm">http://screencasts.org/episodes/how-to-use-rvm</a><br />
<a href=" http://rails.vandenabeele.com/blog/2011/11/26/installing-ruby-and-rails-with-rvm-on-ubuntu-11-dot-10/">http://rails.vandenabeele.com/blog/2011/11/26/installing-ruby-and-rails-with-rvm-on-ubuntu-11-dot-10/</a><br />
<a href="http://beginrescueend.com/">http://beginrescueend.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.itora.net/blog/2012/02/26/installare-ruby-rvm-ovvero-come-avere-differenti-versioni-di-ruby-sulla-stessa-macchina/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Contare child rows per un determinato record.</title>
		<link>http://www.itora.net/blog/2011/12/09/contare-child-rows-per-un-determinato-record/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=contare-child-rows-per-un-determinato-record</link>
		<comments>http://www.itora.net/blog/2011/12/09/contare-child-rows-per-un-determinato-record/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 12:03:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[best practice]]></category>
		<category><![CDATA[model]]></category>

		<guid isPermaLink="false">http://www.itora.net/blog/?p=480</guid>
		<description><![CDATA[Supponiamo il caso di avere un post con relativi articoli, un autore con molti libri, una ditta che ha ricevuto degli ordini, o ancora, un la risposta piu' votata all'interno di un questionario. In tutti questi casi, per ogni record principale avremo piu' record correlati. Supponiamo il caso di voler contare, nella pagina dove vengono [...]]]></description>
			<content:encoded><![CDATA[<p>Supponiamo il caso di avere un post con relativi articoli, un autore con molti libri, una ditta che ha ricevuto degli ordini, o ancora, un la risposta piu' votata all'interno di un questionario.<br />
In tutti questi casi, per ogni record principale avremo piu' record correlati. Supponiamo il caso di voler contare, nella pagina dove vengono elencate le risposte, quanti voti ogni risposta ha ricevuto, mostrando la piu' votata per prima. In Rails, possiamo scrivere un apposito metodo direttamente nel model.</p>
<pre>
class Answer < ActiveRecord::Base
	belongs_to :survey
	has_many :vote, :dependent => :destroy	

	def self.more_voted(survey_id)
		voted_answer = find(
			:all, :select => 'answers.*, count(votes.id) as vote_count',
			:conditions => ["answers.survey_id = ?", survey_id],
			:joins => 'left outer join votes on votes.answer_id = answers.id',
			:group => 'answers.id',
			:Order => 'vote_count DESC'
		)
	end
end
</pre>
<p>Ora nella nostra action 'show' per il controller survey, dove vengono elencate tutte le risposte per il tal survey, possiamo recuperare le answer con il metodo appena creato.</p>
<pre>
@answers = Answer.more_voted(params[:survey_id])
</pre>
<p>e mostrare nella view il valore 'vote_count'</p>
<pre>
&lt;% @answers.each do |a| %&gt;
	&lt;tr class=&quot;even&quot;&gt;
	&lt;td&gt;&lt;%= &quot;#{a.reply}&quot; %&gt;&lt;/td&gt;
	&lt;td&gt;&lt;%= &quot;#{a.vote_count}&quot; %&gt; &lt;/td&gt;
	&lt;/tr&gt;
&lt;% end %&gt;
</pre>
<p>Link consigliati:<br />
<a href="http://therailsway.com/2007/6/1/railsconf-recap-skinny-controllers">http://therailsway.com/2007/6/1/railsconf-recap-skinny-controllers</a><br />
<a href="http://blog.devinterface.com/2010/06/rails-best-practices-1-fat-model-skinny-controller/">http://blog.devinterface.com/2010/06/rails-best-practices-1-fat-model-skinny-controller/</a><br />
<a href="http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model">http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.itora.net/blog/2011/12/09/contare-child-rows-per-un-determinato-record/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aggiungere una action ad un controller in rails3</title>
		<link>http://www.itora.net/blog/2011/12/02/aggiungere-una-action-ad-un-controller-in-rails3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=aggiungere-una-action-ad-un-controller-in-rails3</link>
		<comments>http://www.itora.net/blog/2011/12/02/aggiungere-una-action-ad-un-controller-in-rails3/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 16:11:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[routes]]></category>

		<guid isPermaLink="false">http://www.itora.net/blog/?p=468</guid>
		<description><![CDATA[Rails3 cread i default sette azioni per ogni controller generato dinamicamente. Se vogliamo aggiungere un azione, che ne so, per aggiornare un solo valore nel database, per una nuova view, o per quasiasi altra cosa, dobbiamo: 1)Scrivere la nostra azione nel controller, in questo esempio scrivero' un azione per disapprovare un commento, settando a "0" [...]]]></description>
			<content:encoded><![CDATA[<p>Rails3 cread i default <a href="http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions">sette azioni</a> per ogni controller generato dinamicamente.<br />
Se vogliamo aggiungere un azione, che ne so, per aggiornare un solo valore nel database, per una nuova view, o per quasiasi altra cosa, dobbiamo:<br />
1)Scrivere la nostra azione nel controller, in questo esempio scrivero' un azione per disapprovare un commento, settando a "0" il valore del campo "approved".</p>
<pre>
def disapprove
	@comment = Comment.find(params[:id])
	if ( @comment.update_attribute(:approved, "0"))
		respond_to do |format|
			format.html { redirect_to(admin_comment_url(@comment),
					:notice => 'Comment was unapproved.') }
			format.xml  { head:ok }
		end
	else
		respond_to do |format|
			format.html { render :action => "edit" }
			format.xml  {render:xml=>@comment.errors, :status => :unprocessable_entity }
		end
	end
end
</pre>
<p>Nel mio file routes.rb, dovro' dire alla mia app che oltre alle 7 azioni canoniche ce ne' un altra, disapprove. E dovro' specifivare che tipo di http request e', tra post, get, put e delete. Nel mio caso ho messo post, piu' dettagli <a href="http://guides.rubyonrails.org/routing.html#adding-more-restful-actions">qui</a></p>
<pre>
resources :comment do
	post 'disapprove',:on=>:member
end
</pre>
<p>Lanciando "rake routes" nella cartella della mia app, posso vedere la nuova route creata, e vedere quale e' l'url da utlizzare nell'helper. Nel mio caso l'approvazione dei commenti si trova nell'admin area.</p>
<pre>
disapprove_admin_comment POST   /admin/comments/:id/disapprove(.:format)              {:controller=>"admin/comments", :action=>"disapprove"}
</pre>
<p>Ora creaimo un link all'azione</p>
<pre>
&lt;%= link_to &#039;Disapprove&#039;, disapprove_admin_comment_path(@comment)%&gt;
</pre>
<p>Dopo aver generato questo link, ottenevo un errore "No route matches..." la mia azione.<br />
Errore risolto<a href="http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to"> specificando</a> nel link il tipo di http verb</p>
<pre>
&lt;%= link_to &#039;Disapprove&#039;, disapprove_admin_comment_path(@comment), :method=&gt;&#039;post&#039; %&gt;
</pre>
<p>Consiglio questi screencast, per capire come vengono generate le routes, <a href="http://railscasts.com/episodes/231-routing-walkthrough">1</a> e <a href="http://railscasts.com/episodes/232-routing-walkthrough-part-2">2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.itora.net/blog/2011/12/02/aggiungere-una-action-ad-un-controller-in-rails3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creare un admin area in rails3 usando l&#8217;autenticazione scritta in devise</title>
		<link>http://www.itora.net/blog/2011/11/17/creare-un-admin-area-in-rails3-usando-lautenticazione-scritta-in-devise/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=creare-un-admin-area-in-rails3-usando-lautenticazione-scritta-in-devise</link>
		<comments>http://www.itora.net/blog/2011/11/17/creare-un-admin-area-in-rails3-usando-lautenticazione-scritta-in-devise/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 19:56:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[devise]]></category>

		<guid isPermaLink="false">http://www.itora.net/blog/?p=451</guid>
		<description><![CDATA[1)aggiungere il namespace "admin" in routes.rb, ed abbinarlo ai controller per i quali vogliamo l'autenticazione, in questo esempio "questions". namespace :admin do match '/' => 'questions#index' resources :questions end 2In views/layout creare il layout admin.html.erb specificando le parti che vogliamo mostrare nella sezione admin. 3) creare il controller admin_controller.rb in controllers/admin e utilizzare "autenticate_user" (vedere [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1)</strong>aggiungere il namespace "admin" in routes.rb, ed abbinarlo ai controller per i quali vogliamo l'autenticazione, in questo esempio "questions".</p>
<pre>
namespace :admin do
	match '/' => 'questions#index'
	resources :questions
end
</pre>
<p><strong>2</strong>In views/layout creare il layout admin.html.erb specificando le parti che vogliamo mostrare nella sezione admin.<br />
<strong>3)</strong> creare il controller admin_controller.rb in controllers/admin e utilizzare "autenticate_user" (vedere il tutorial su <a href="http://www.itora.net/blog/2011/07/24/ruby-on-rails-devise-authentication/">devise</a>) per verificare che un utente sia loggato</p>
<pre>
class Admin::AdminController &lt; ApplicationController
	layout "admin"
	before_filter :authenticate_user!
end
</pre>
<p><strong>4)</strong> Sempre in controllers/admin, creare il file questions_controller.rb</p>
<pre>
class Admin::QuestionsController < Admin::AdminController
  def index
    @questions = Question.all
    respond_to do |format|
      format.html # index.html.erb
    end
  end
end
</pre>
<p><strong>5)</strong>in views/admin creaimo la cartella "questions" e inderiamo tutte le views richieste dal controller controllers/admin/questions_controller.rb, in questo caso, solo il file index.html.rb<br />
<strong>6</strong><br />
Le action dei form all'interno delle views in views/admin/questions devono rimandare ai controllers in controllers/admin/question controller. Quindi, sempre tenendo "question" come esempio da:</p>
<pre>
&lt;%= form_for(@answer) do |f| %&gt;
</pre>
<p>dobbiamo passare a </p>
<pre>
&lt;%= form_for(:admin, @answer) do |f| %&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.itora.net/blog/2011/11/17/creare-un-admin-area-in-rails3-usando-lautenticazione-scritta-in-devise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>creare un fork da un plugin su Github e svilupparlo come submodule</title>
		<link>http://www.itora.net/blog/2011/10/15/creare-un-fork-da-un-plugin-su-github-e-svilupparlo-come-submodule/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=creare-un-fork-da-un-plugin-su-github-e-svilupparlo-come-submodule</link>
		<comments>http://www.itora.net/blog/2011/10/15/creare-un-fork-da-un-plugin-su-github-e-svilupparlo-come-submodule/#comments</comments>
		<pubDate>Sat, 15 Oct 2011 21:35:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[allday]]></category>
		<category><![CDATA[fork]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[submodule]]></category>

		<guid isPermaLink="false">http://www.itora.net/blog/?p=435</guid>
		<description><![CDATA[Sto sviluppando un'applicazione in CakePhp 2.0 e voglio usare dei plugin che sono ancora fermi alla versione 1.3 di CakePhp. Per ora, rinominare qualche cartella sembra essere sufficiente. Per tenere traccia del lavoro fatto e per far si che qualcun altro possa usufruirne, ho trovato molto utile "git sumbodule". Vediamo come creare un fork da [...]]]></description>
			<content:encoded><![CDATA[<p>Sto sviluppando un'applicazione in CakePhp 2.0 e voglio usare dei plugin che sono ancora fermi alla versione 1.3 di CakePhp. Per ora, rinominare qualche cartella sembra essere sufficiente. Per tenere traccia del lavoro fatto e per far si che qualcun altro possa usufruirne, ho trovato molto utile "git sumbodule". Vediamo come creare un <a href="http://help.github.com/fork-a-repo/">fork</a> da un plugin e svilupparlo in locale come un submodule.<br />
Per prima cosa installiamo la versione 2.0 di cake e inizializzamo un repository git.<br />
Poi andiamo su github e scegliamo il plugin da adattare alla versione 2.0 di Cake, per esempio il plugin <a href="https://github.com/CakeDC/categories">categories di CakeDc</a>. Creiamo un fork con il bottone... fork. Poi Andiamo in "Admin", selezioniamo il repository appena forkato e diciamo a github quale deve essere il "default branch", in questo caso, scegliamo il 2.0.<br />
Importante! quando cloniamo o installiamo come submodule un repo da github, questo si porta con appresso tutti i branches. Sta a noi decidere con "git checkout nomebranch" su quale branch lavorare.</p>
<h5>Aggiungere il submodule</h5>
<p>Dobbiamo dire a git di aggiungere un submodule contenente il codice del nostro fork, per esempio git@github.com:user/categories.git</p>
<pre>
git submodule add git@github.com:user/categories.git app/Plugin/Categories
</pre>
<p>Se vogliamo aggiungere solo un particolare branch, per esempio il 2.0, dobbiamo aggiunger il flag -b al comando precedente</p>
<pre>
git submodule add -b 2.0 git@github.com:user/categories.git app/Plugin/Categories
</pre>
<p>Poi spostiamoci nella cartella del plugin appena scaricato e diciamo a git dove e' il repository remote</p>
<pre>
cd app/Plugin/Categories
git remote add push git@github.com:user/categories.git
</pre>
<p>Proviamo a modificare un file del plugin, e sempre dalla cartella del plugin, eseguiamo il commit ed il push.</p>
<pre>
git add .
git commit -m "test commit"
git push master
</pre>
<h5>Aggiungere l'indirizzo remote originario del repo forkato</h5>
<p>Automaticamente, la nostra "origin" e' il nostro repo forkato su github, non il repo originario(quello di CakeDC in questo esempio).<br />
Per dire a git di scaricare gli aggiornamenti fatti dagli sviluppatori di cakedc, dobbiamo aggiungere un altro remote.<br />
sempre nella cartella del submodule</p>
<pre>
git remote add upstream git://github.com/CakeDC/categorie.git
</pre>
<h5>Sincronizzare il nostro submodule con il repo originario forkato</h5>
<p>Per scaricare gli aggiornamenti</p>
<pre>
git fetch upstream
</pre>
<p>Per fare un merge fra gli aggiornamenti appena scaricati da upstream ed il vostro repo in locale</p>
<pre>
git merge upstream/master
</pre>
<p>Per capire la differenza tra "git pull upstream" e "git fetch upstream", consiglio di leggere il punto "Pull in upstream changes" di questa <a href="http://help.github.com/fork-a-repo/">guida</a>.<br />
Qui un link su<a href="http://stackoverflow.com/questions/3903817/how-to-pull-new-updates-for-forked-repository-in-github"> stackoverflow </a>riguardante questa parte.</p>
<h5>Rimuovere submodules</h5>
<p>Per rimuovere un submodule erronemente creato:<br />
Delete the relevant line from the .gitmodules file.<br />
Delete the relevant section from .git/config.<br />
Run git rm --cached path_to_submodule (no trailing slash).<br />
via <a href="http://stackoverflow.com/questions/1260748/how-do-i-remove-a-git-submodule">Stackoverflow</a></p>
<h5>Clonare un progetto contenente submodules</h5>
<pre>
git clone git://github.com/user/progettoconsubmodules.git
</pre>
<p>Questo clonera' il progetto e la cartella del submodule, ma non il contenuto di quest'ultima. Per farlo lanciamo:</p>
<pre>
git submodule init
git submodule update
</pre>
<p>Altre info su questa parte nel <a href="http://progit.org/book/ch6-6.html">git pro book</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.itora.net/blog/2011/10/15/creare-un-fork-da-un-plugin-su-github-e-svilupparlo-come-submodule/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jquery screensaver</title>
		<link>http://www.itora.net/blog/2011/10/11/jquery-screensaver/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=jquery-screensaver</link>
		<comments>http://www.itora.net/blog/2011/10/11/jquery-screensaver/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 09:39:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.itora.net/blog/?p=429</guid>
		<description><![CDATA[Uno screensaver stile windows, fatto con jquery. questo l'html &#60;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#34;&#62; &#60;html&#62; &#60;head&#62; &#60;script src=&#34;http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js&#34;&#62;&#60;/script&#62; &#60;style&#62; body{ background-color:#b0c4de; margin:0px; width:100%; } #container{ position: relative; } #saver{ background-color:lime; width:100px; height:100px; position: fixed; z-index: 50; } &#60;/style&#62; &#60;/head&#62; &#60;body&#62; &#60;div id =&#34;container&#34;&#62; &#60;div id =&#34;saver&#34;&#62;I&#039;m a screensaver &#60;/div&#62; &#60;/div&#62; &#60;/body&#62; &#60;/html&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Uno screensaver stile windows, fatto con jquery.<br />
questo l'html</p>
<pre>
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;style&gt;
body{
	background-color:#b0c4de;
	margin:0px;
	width:100%;
}
#container{
	position: relative;
}
#saver{
	background-color:lime;
	width:100px;
	height:100px;
	position: fixed;
	z-index: 50;
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div id =&quot;container&quot;&gt;
		&lt;div id =&quot;saver&quot;&gt;I&#039;m a screensaver
		&lt;/div&gt;
	&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Dopo la fine del tag
<pre>head</pre>
<p> inserite questo codice js</p>
<pre>
&lt;script&gt;
$(function(){
var savescreen = function(speed, vertical, horizontal){
	$(&quot;#saver&quot;).animate({left: &#039;+=&#039;+horizontal, top: &#039;+=&#039;+vertical}, speed);
	$(&quot;#saver&quot;).animate({left: &#039;-=&#039;+horizontal, top: &#039;+=&#039;+vertical}, speed);
	$(&quot;#saver&quot;).animate({left: &#039;-=&#039;+horizontal, top: &#039;-=&#039;+vertical}, speed);
	$(&quot;#saver&quot;).animate({left: &#039;+=&#039;+horizontal, top: &#039;-=&#039;+vertical}, speed);
};

$(function(){
	larg_saver = $(&#039;#saver&#039;).width();
	alt_saver = $(&#039;#saver&#039;).height();
	width = $(window).width();
	height = $(window).height();
	margin_top_saver = (height - alt_saver)/2;
	margin_left_saver = (width - larg_saver)/2;
	$(&#039;#saver&#039;).css(&#039;top&#039;,0);
	$(&#039;#saver&#039;).css(&#039;left&#039;,margin_left_saver);
  });

window.setInterval(function(){
	speed = 1000
	savescreen(speed, margin_top_saver, margin_left_saver);
}, 1000);

});
&lt;/script&gt;
</pre>
<p>Qui una demo per lo <a href="http://www.itora.net/demo/screensaver.html">screensaver</a> in jquery</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itora.net/blog/2011/10/11/jquery-screensaver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

