<?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>Il blog di Claudio</title>
	<atom:link href="http://blog.leevee.it/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.leevee.it</link>
	<description>Rantoli di un SysAdmin</description>
	<lastBuildDate>Thu, 11 Apr 2013 09:19:51 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>ActiveRecord: random</title>
		<link>http://blog.leevee.it/2013/04/11/activerecord-random/</link>
		<comments>http://blog.leevee.it/2013/04/11/activerecord-random/#comments</comments>
		<pubDate>Thu, 11 Apr 2013 09:19:36 +0000</pubDate>
		<dc:creator>Claudio Moratti</dc:creator>
				<category><![CDATA[Appunti Sparsi]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[activerecord]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://blog.leevee.it/?p=151</guid>
		<description><![CDATA[ActiveRecord non mette a disposizione uno strumento semplice per estrarre un insieme random di elementi. Normalmente si aggiunge alla query, nella clausola &#8216;order&#8217; o RAND() o RANDOM() in base al database utilizzato. Questa soluzione non è molto pulita, quindi è preferibile utilizzare una gemma come randumb, che si occupa di inserire automaticamente la giusta funzione. [...]]]></description>
				<content:encoded><![CDATA[<p>ActiveRecord non mette a disposizione uno strumento semplice per estrarre un insieme random di elementi. Normalmente si aggiunge alla query, nella clausola &#8216;order&#8217; o RAND() o RANDOM() in base al database utilizzato. Questa soluzione non è molto pulita, quindi è preferibile utilizzare una gemma come <a href="https://github.com/spilliton/randumb">randumb</a>, che si occupa di inserire automaticamente la giusta funzione.</p>
<p>Una volta inserita nel file Gemfile e eseguita l&#8217;installazione con un</p>
<pre>bundle install</pre>
<p>sarà sufficiente appendere .random(x) alla nostra query, come da esempio:</p>
<pre>Artist.random # un artista a caso
Artist.random(3)  # un array di artisti casuali
Artist.random(1)  # un array contenente solo un artista casuale</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.leevee.it/2013/04/11/activerecord-random/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails: caricare i parametri da un file di configurazione yml</title>
		<link>http://blog.leevee.it/2013/04/04/rails-caricare-i-parametri-da-un-file-di-configurazione-yml/</link>
		<comments>http://blog.leevee.it/2013/04/04/rails-caricare-i-parametri-da-un-file-di-configurazione-yml/#comments</comments>
		<pubDate>Thu, 04 Apr 2013 06:52:20 +0000</pubDate>
		<dc:creator>Claudio Moratti</dc:creator>
				<category><![CDATA[Appunti Sparsi]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[yml]]></category>

		<guid isPermaLink="false">http://blog.leevee.it/?p=149</guid>
		<description><![CDATA[Per l&#8217;interfacciamento con un gateway di pagamento con carta di credito mi sono trovato a dover gestire credenziali diverse per l&#8217;ambiente di staging e di produzione. Se il primo approccio, più semplice e immediato, è quello di inserire i dati nel codice, all&#8217;interno di un if che controlla in che ambiente strano, conviene fare le [...]]]></description>
				<content:encoded><![CDATA[<p>Per l&#8217;interfacciamento con un gateway di pagamento con carta di credito mi sono trovato a dover gestire credenziali diverse per l&#8217;ambiente di staging e di produzione. Se il primo approccio, più semplice e immediato, è quello di inserire i dati nel codice, all&#8217;interno di un if che controlla in che ambiente strano, conviene fare le cose fatte bene e spostare i parametri in un file esterno, che verrà caricato all&#8217;avvio dell&#8217;applicazione.</p>
<p>Supponiamo di avere un file chiamato<em> bank.yml</em> posizionato all&#8217;interno della directory <em>config/</em>, con il seguente contenuto:</p>
<pre class="brush:plain">development:
  username: 478881
  password: c8e79387bb3e
  signature: 2178614
staging:
  username: 4788c81
  password: c8e7c9387bb3e
  signature: 217c8614
test:
  username: 478b881
  password: c8eb79387bb3e
  signature: 21b78614
production:  
  username: 47a8881
  password: 8ea79387bb3e
  signature: 21a78614</pre>
<p>come possiamo vedere, per ogni ambiente abbiamo una tripletta diversa, che verrà usata per gestire l&#8217;integrazione con la banca.</p>
<p>Ora creiamo un file, <em>bank.rb</em>, in<em> config/initializers/</em> con il seguente contenuto:</p>
<pre class="brush:ruby">module Bank
  CONFIG = YAML.load_file(Rails.root.join("config/bank.yml"))[Rails.env]
  USERNAME = CONFIG['username']
  PASSWORD = CONFIG['password']
  SIGNATURE = CONFIG['signature']
end</pre>
<p>Riavviando la nostra applicazione avremo a disposizione le seguenti costanti: <em>Bank::USERNAME</em>, <em>Bank::PASSWORD</em>,<em> Bank::SIGNATURE</em> che conterranno i dati presenti nel nostro file di configurazione, filtrati per l&#8217;ambiente corrente.</p>
<p>La scelta di utilizzare un modulo per la gestione di questi parametri ci permette di evitare conflitti con altri elementi della nostra applicazione.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.leevee.it/2013/04/04/rails-caricare-i-parametri-da-un-file-di-configurazione-yml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Monitorare da quale script php vengono inviate le e-mail</title>
		<link>http://blog.leevee.it/2013/04/03/monitorare-da-quale-script-php-vengono-inviate-le-e-mail/</link>
		<comments>http://blog.leevee.it/2013/04/03/monitorare-da-quale-script-php-vengono-inviate-le-e-mail/#comments</comments>
		<pubDate>Wed, 03 Apr 2013 10:27:17 +0000</pubDate>
		<dc:creator>Claudio Moratti</dc:creator>
				<category><![CDATA[Appunti Sparsi]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[apache2]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://blog.leevee.it/?p=146</guid>
		<description><![CDATA[Quando un sito viene bucato e viene utilizzato per inviare tonnellate di email di spam, la prima cosa che si deve affrontare, oltre alla pulizia della coda di postfix, è l&#8217;individuazione del responsabile. Le cose diventano difficili quando su un server sono presenti decine e decine di siti, in quanto il file colpevole dell&#8217;invio di [...]]]></description>
				<content:encoded><![CDATA[<p>Quando un sito viene bucato e viene utilizzato per inviare tonnellate di email di spam, la prima cosa che si deve affrontare, oltre alla pulizia della coda di postfix, è l&#8217;individuazione del responsabile.</p>
<p>Le cose diventano difficili quando su un server sono presenti decine e decine di siti, in quanto il file colpevole dell&#8217;invio di spam non è facilmente identificabile.</p>
<p>Con questa piccola modifica si potrà avere un log più dettagliato delle e-mail provenienti dai vari siti, permettendoci di identificare il colpevole.</p>
<p>Per prima cosa creiamo due file col seguente contenuto</p>
<pre>/usr/local/bin/sendmail-php</pre>
<pre class="brush:shell">#!/bin/sh

logger -p mail.info sendmail-php: site=${HTTP_HOST}, client=${REMOTE_ADDR}, script=${SCRIPT_NAME}, filename=${SCRIPT_FILENAME}, docroot=${DOCUMENT_ROOT}, pwd=${PWD}, uid=${UID}, user=$(whoami)

/usr/sbin/sendmail -t -i $*</pre>
<pre>/var/www/tpl.php</pre>
<pre class="brush:php">&lt;?php
putenv("PATH_INFO=". $_SERVER["PATH_INFO"]);
putenv("SCRIPT_NAME=". $_SERVER["SCRIPT_NAME"]);
putenv("SCRIPT_FILENAME=". $_SERVER["SCRIPT_FILENAME"]);
putenv("REMOTE_ADDR=". $_SERVER["REMOTE_ADDR"]);
putenv("HTTP_HOST=". $_SERVER["HTTP_HOST"]);
?&gt;</pre>
<p>Impostiamo i permessi:</p>
<pre class="brush:shell">chmod +x /usr/local/bin/phpsendmail
chmod +rx /var/www/tpl.php</pre>
<p>Ora non ci resta che modificare il file php.ini (in Debian si trova in /etc/php5/apache2/php.ini ) modificando/aggiungendo le seguenti righe:</p>
<pre class="brush:plain">sendmail_path = /usr/local/bin/sendmail-php -t -i
auto_prepend_file = /var/www/tpl.php</pre>
<p>Dopo aver riavviato apache, nel file mail.log, troveremo righe di questo tipo:</p>
<pre class="brush:plain">Mar 30 09:30:25 web1 logger: sendmail-php: site=www.xxxx.it, client=31.184.244.18, script=/includes/.cfwqkt.php, filename=/var/customers/webs/xxx/www/includes/.cfwqkt.php, docroot=/var/customers/webs/xxx/www/, pwd=/var/customers/webs/xxx/www/includes, uid=33, user=www-data</pre>
<p>Che ci permetterà di individuare istantaneamente il colpevole</p>
<p>&nbsp;</p>
<p>Fonti:</p>
<p>http://serverfault.com/questions/130069/find-the-php-script-thats-sending-mails</p>
<p>http://forum.directadmin.com/showthread.php?t=36311</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.leevee.it/2013/04/03/monitorare-da-quale-script-php-vengono-inviate-le-e-mail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Brakeman: Security Vulnerability per Ruby on Rails</title>
		<link>http://blog.leevee.it/2013/04/02/brakeman-security-vulnerability-per-ruby-on-rails/</link>
		<comments>http://blog.leevee.it/2013/04/02/brakeman-security-vulnerability-per-ruby-on-rails/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 09:47:28 +0000</pubDate>
		<dc:creator>Claudio Moratti</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rubygems]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[vulnerability]]></category>

		<guid isPermaLink="false">http://blog.leevee.it/?p=144</guid>
		<description><![CDATA[Oggi parliamo di sicurezza: parliamo di Brakeman! Brakeman è un Security Vulnerability Scanner per Ruby on Rails. Dopo averlo installato con un gem install brakeman ed eventualmente aver fatto un rehash rbenv rehash disporremo del comando brakeman. Eseguendolo all&#8217;interno della directory del proprio progetto in Rails ci verrà fornito l&#8217;output di una analisi di sicurezza [...]]]></description>
				<content:encoded><![CDATA[<p>Oggi parliamo di sicurezza: parliamo di <a href="https://github.com/presidentbeef/brakeman">Brakeman</a>!</p>
<p>Brakeman è un Security Vulnerability Scanner per Ruby on Rails.</p>
<p>Dopo averlo installato con un</p>
<pre>gem install brakeman</pre>
<p>ed eventualmente aver fatto un rehash</p>
<pre>rbenv rehash</pre>
<p>disporremo del comando brakeman.</p>
<p>Eseguendolo all&#8217;interno della directory del proprio progetto in Rails ci verrà fornito l&#8217;output di una analisi di sicurezza e vulnerabilità della nostra applicazione.</p>
<p>Un esempio di output è il seguente:</p>
<pre class="brush:plain">$ brakeman 
Loading scanner...
[Notice] Detected Rails 3 application
Processing application in /Users/claudio/Progetti/xxxxx
Processing configuration...
[Notice] Escaping HTML by default
Processing gems...
Processing initializers...
Processing libs...
Processing routes...          
Processing templates...       
Processing data flow in templates...
Processing models...          
Processing controllers...     
Processing data flow in controllers...
Indexing call sites...        
Running checks in parallel...
 - CheckBasicAuth
 - CheckCrossSiteScripting
 - CheckContentTag
 - CheckDefaultRoutes
 - CheckDigestDoS
 - CheckEscapeFunction
 - CheckEvaluation
 - CheckExecute
 - CheckFileAccess
 - CheckFilterSkipping
 - CheckForgerySetting
 - CheckJRubyXML
 - CheckJSONParsing
 - CheckLinkTo
 - CheckLinkToHref
 - CheckMailTo
 - CheckMassAssignment
 - CheckModelAttributes
 - CheckModelSerialize
 - CheckNestedAttributes
 - CheckQuoteTableName
 - CheckRedirect
 - CheckRender
 - CheckResponseSplitting
 - CheckSafeBufferManipulation
 - CheckSanitizeMethods
 - CheckSelectTag
 - CheckSelectVulnerability
 - CheckSend
 - CheckSendFile
 - CheckSessionSettings
 - CheckSingleQuotes
 - CheckSkipBeforeFilter
 - CheckSQL
 - CheckStripTags
 - CheckSymbolDoS
 - CheckTranslateBug
 - CheckUnsafeReflection
 - CheckValidationRegex
 - CheckWithoutProtection
 - CheckYAMLLoad
 - CheckYAMLParsing
Checks finished, collecting results...
Generating report...

+BRAKEMAN REPORT+

Application path: /Users/claudio/Progetti/xxxxxx
Rails version: 3.2.8
Brakeman version: 1.9.4
Started at 2013-03-27 21:58:02 +0100
Duration: 4.805979 seconds
Checks run: BasicAuth, ContentTag, CrossSiteScripting, DefaultRoutes, DigestDoS, EscapeFunction, Evaluation, Execute, FileAccess, FilterSkipping, ForgerySetting, JRubyXML, JSONParsing, LinkTo, LinkToHref, MailTo, MassAssignment, ModelAttributes, ModelSerialize, NestedAttributes, QuoteTableName, Redirect, Render, ResponseSplitting, SQL, SafeBufferManipulation, SanitizeMethods, SelectTag, SelectVulnerability, Send, SendFile, SessionSettings, SingleQuotes, SkipBeforeFilter, StripTags, SymbolDoS, TranslateBug, UnsafeReflection, ValidationRegex, WithoutProtection, YAMLLoad, YAMLParsing

+SUMMARY+

+-------------------+---------+
| Scanned/Reported  | Total   |
+-------------------+---------+
| Controllers       | 19      |
| Models            | 22      |
| Templates         | 106     |
| Errors            | 0       |
| Security Warnings | 22 (12) |
+-------------------+---------+

+-----------------------+-------+
| Warning Type          | Total |
+-----------------------+-------+
| Attribute Restriction | 1     |
| Default Routes        | 1     |
| Denial of Service     | 1     |
| Mass Assignment       | 10    |
| Redirect              | 2     |
| Remote Code Execution | 2     |
| SQL Injection         | 4     |
| Session Setting       | 1     |
+-----------------------+-------+

+SECURITY WARNINGS+

+------------+---------------------------+---------------------------------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------&gt;&gt;
| Confidence | Class                     | Method                                      | Warning Type          | Message                                                                                                                                                                       &gt;&gt;
+------------+---------------------------+---------------------------------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------&gt;&gt;
| High       |                           |                                             | Default Routes        | All public methods in controllers are available as actions in routes.rb near line 163                                                                                         &gt;&gt;
| High       | ContactController         | submit                                      | Mass Assignment       | Unprotected mass assignment near line 7: ContactRequest.new(+params[:contact_request]+)                                                                                       &gt;&gt;
| High       | CartController            | add                                         | Redirect              | Possible unprotected redirect near line 24: redirect_to(+params[:last_url]+)                                                                                                  &gt;&gt;
| High       | Mobile::ProductController | xxxxxxxxxxxx                                | Redirect              | Possible unprotected redirect near line 28: redirect_to(+params[:back_url]+)                                                                                                  &gt;&gt;
| High       |                           |                                             | Remote Code Execution | json gem version 1.7.5 has a remote code vulnerablity: upgrade to 1.7.7                                                                                                       &gt;&gt;
| High       |                           |                                             | Remote Code Execution | Rails 3.2.8 has a remote code execution vulnerability: upgrade to 3.2.11 or disable XML parsing                                                                               &gt;&gt;
| High       |                           |                                             | SQL Injection         | All versions of Rails before 3.0.18, 3.1.9, and 3.2.10 contain a SQL Injection Vulnerability: CVE-2012-5664; Upgrade to 3.2.10, 3.1.9, 3.0.18                                 &gt;&gt;
| High       |                           |                                             | SQL Injection         | All versions of Rails before 3.0.19, 3.1.10, and 3.2.11 contain a SQL Injection Vulnerability: CVE-2013-0155; Upgrade to 3.2.11, 3.1.10, 3.0.19                               &gt;&gt;
| High       | CartController            | remove                                      | SQL Injection         | Possible SQL injection near line 36: CartLine.where(+params[:line_id]+)                                                                                                       &gt;&gt;
| High       | Mobile::xxxxxxxxxxxx      | index                                       | SQL Injection         | Possible SQL injection near line 10: Product.where("name LIKE '%#{+params[:name]+}%' AND published = ? ", true)                                                               &gt;&gt;
| High       |                           |                                             | Session Setting       | Session secret should not be included in version control near line 7                                                                                                          &gt;&gt;
| Medium     |                           |                                             | Denial of Service     | Rails 3.2.8 has a denial of service vulnerability in ActiveRecord: upgrade to 3.2.13 or patch                                                                                 &gt;&gt;
| Weak       | Article                   | xxxxxxxxxxxxxxxxxxxxxxxxxx                  | Mass Assignment       | Unprotected mass assignment near line 39: Article.new(:code =&gt; ((local row)[0]), :title =&gt; ((local row)[1]), :sku =&gt; ((local row)[2]), :size =&gt; ((local row)[3]), :published =&gt;&gt;
| Weak       | CartController            | add                                         | Mass Assignment       | Unprotected mass assignment near line 18: CartLine.create(:cart_id =&gt; ((Cart.find_by_customer_id(current_customer.id) or Cart.create(:customer_id =&gt; (current_customer.id), :d&gt;&gt;
| Weak       | CartController            | checkout                                    | Mass Assignment       | Unprotected mass assignment near line 49: Order.create(:date =&gt; (DateTime.now), :customer_id =&gt; (current_customer.id), :total_items =&gt; 0, :total_price =&gt; 0, :note =&gt; (+params&gt;&gt;
| Weak       | CartController            | checkout                                    | Mass Assignment       | Unprotected mass assignment near line 57: OrderLine.create(:order =&gt; (+Order.create(:date =&gt; (DateTime.now), :customer_id =&gt; (current_customer.id), :total_items =&gt; 0, :total_&gt;&gt;
| Weak       | Customer                  | Customer.xxxxxxxxxxxxxxxxxx                 | Mass Assignment       | Unprotected mass assignment near line 27: Customer.create(:name =&gt; ((local row)[1]), :code =&gt; ((local row)[0]), :email =&gt; (("" or ((local row)[0] + "@maw.it"))), :agent =&gt; (+&gt;&gt;
| Weak       | xxxxxxxxxxxxxxxxxxxxxxxx  | xxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxx | Mass Assignment       | Unprotected mass assignment near line 20: CustomerDiscountCategory.create(:customer =&gt; (Customer.find_by_code((local row)[0])), :discount_category =&gt; ((DiscountCategory.find_&gt;&gt;
| Weak       | Mobile::CartController    | add                                         | Mass Assignment       | Unprotected mass assignment near line 30: CartLine.create(:cart_id =&gt; ((Cart.find_by_customer_id(session[:customer_id]) or Cart.create(:customer_id =&gt; (session[:customer_id])&gt;&gt;
| Weak       | Mobile::CartController    | checkout                                    | Mass Assignment       | Unprotected mass assignment near line 65: OrderLine.create(:order =&gt; (+Order.create(:date =&gt; (DateTime.now), :customer_id =&gt; (session[:customer_id]), :total_items =&gt; 0, :tota&gt;&gt;
| Weak       | xxxxxxxxxxxx              | SpecialPrice.xxxxxxxxxxxxxxxxxx             | Mass Assignment       | Unprotected mass assignment near line 20: SpecialPrice.create(:customer =&gt; (Customer.find_by_code((local row)[0])), :product =&gt; (+Article.find_by_sku((local row)[1]).product+&gt;&gt;
+------------+---------------------------+---------------------------------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------&gt;&gt;

Model Warnings:

+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------&gt;&gt;
| Confidence | Model                                                                                                                                                                                                                                                                 | Warning &gt;&gt;
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------&gt;&gt;
| High       | Agent, Article, Browsable, Cart, CartLine, Category, Ckeditor::Asset, Ckeditor::AttachmentFile, Ckeditor::Picture, ContactRequest, Customer, CustomerDiscountCategory, DiscountCategory, News, Order, OrderLine, Page, Product, ProductAttachment, SpecialPrice, Word | Attribut&gt;&gt;
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------&gt;&gt;</pre>
<p class="brush:plain">
Dopo una analisi dell&#8217;output capiamo cosa effettuare per migliorare la sicurezza del nostro applicativo.</p>
<p class="brush:plain">E&#8217; possibile anche generare report in vari formati, come in html o json:</p>
<pre class="brush:plain">brakeman -o output.html</pre>
<pre class="brush:plain">brakeman -o output.json</pre>
<p class="brush:plain">Per maggiori informazioni e opzioni consultate la pagina del progetto <a href="https://github.com/presidentbeef/brakeman">Brakeman</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.leevee.it/2013/04/02/brakeman-security-vulnerability-per-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails + Kaminari + Jquery + Infinite Ajax Pagination</title>
		<link>http://blog.leevee.it/2013/03/30/rails-kaminari-jquery-infinite-ajax-pagination/</link>
		<comments>http://blog.leevee.it/2013/03/30/rails-kaminari-jquery-infinite-ajax-pagination/#comments</comments>
		<pubDate>Sat, 30 Mar 2013 08:49:52 +0000</pubDate>
		<dc:creator>Claudio Moratti</dc:creator>
				<category><![CDATA[Appunti Sparsi]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[infinite scroll]]></category>
		<category><![CDATA[kaminari]]></category>
		<category><![CDATA[paginazione]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://blog.leevee.it/?p=141</guid>
		<description><![CDATA[Jquery Infinite Ajax Scroll è un plugin per jQuery che permette di implementare l&#8217;infinite scroll. Tramite una semplice configurazione è possibile integrarlo in modo semplice con Kaminari (la gemma più usata per la paginazione). Assegnamo al div contenente i nostri elementi l&#8217;id &#8216;item-list&#8217; e agli elementi la classe &#8216;item&#8217;, come da esempio: &#60;div id="item-list"&#62; &#60;div [...]]]></description>
				<content:encoded><![CDATA[<p><a href="https://github.com/webcreate/infinite-ajax-scroll">Jquery Infinite Ajax Scroll</a> è un plugin per jQuery che permette di implementare l&#8217;infinite scroll.</p>
<p>Tramite una semplice configurazione è possibile integrarlo in modo semplice con <a href="https://github.com/amatsuda/kaminari">Kaminari</a> (la gemma più usata per la paginazione).</p>
<p>Assegnamo al div contenente i nostri elementi l&#8217;id &#8216;item-list&#8217; e agli elementi la classe &#8216;item&#8217;, come da esempio:</p>
<pre class="brush:xml">&lt;div id="item-list"&gt;
    &lt;div class="item"&gt;&lt;!-- contenuto --&gt;&lt;/div&gt;
    &lt;div class="item"&gt;&lt;!-- contenuto --&gt;&lt;/div&gt;
    &lt;div class="item"&gt;&lt;!-- contenuto --&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<p>Dopo la chiusura del div con id &#8216;item-list&#8217; posizioniamo il codice per il pager:</p>
<pre class="brush:ruby">&lt;%= paginate @items %&gt;</pre>
<p>Il codice per far funzionare &#8220;out-of-the-box&#8221; l&#8217;infinite scroll è:</p>
<pre class="brush:js">&lt;script type="text/javascript"&gt;
    jQuery.ias({
        container: '#item-list',
        item: '.box',
        pagination: '.pagination',
        next: '.next a',
        loader: '&lt;img src="/img/loader.gif"/&gt;',
        history: false,
        triggerPageThreshold: 100
    });
&lt;/script&gt;</pre>
<p>Ricordiamoci, ovviamente, di includere il plugin nell&#8217;header <img src='http://blog.leevee.it/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.leevee.it/2013/03/30/rails-kaminari-jquery-infinite-ajax-pagination/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ckeditor e Capistrano: preservare i file caricati</title>
		<link>http://blog.leevee.it/2013/03/29/ckeditor-e-capistrano-preservare-i-file-caricati/</link>
		<comments>http://blog.leevee.it/2013/03/29/ckeditor-e-capistrano-preservare-i-file-caricati/#comments</comments>
		<pubDate>Fri, 29 Mar 2013 07:24:20 +0000</pubDate>
		<dc:creator>Claudio Moratti</dc:creator>
				<category><![CDATA[Appunti Sparsi]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[ckeditor]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://blog.leevee.it/?p=126</guid>
		<description><![CDATA[La gemma ckeditor permette di aggiungere in modo semplice il comodo editor wysiwyg ai propri form. Questa integrazione, inoltre, permette all&#8217;utente di usare paperclip per caricare i file da inserire direttamente nell&#8217;editor. Tutto funziona bene fino a quando non ci si appoggia a capistrano per gestire le fasi di deploy. Ckeditor, infatti, configura paperclip per [...]]]></description>
				<content:encoded><![CDATA[<p>La gemma <a href="https://github.com/galetahub/ckeditor">ckeditor</a> permette di aggiungere in modo semplice il comodo editor wysiwyg ai propri form. Questa integrazione, inoltre, permette all&#8217;utente di usare paperclip per caricare i file da inserire direttamente nell&#8217;editor.</p>
<p>Tutto funziona bene fino a quando non ci si appoggia a <a href="https://github.com/capistrano/capistrano">capistrano</a> per gestire le fasi di deploy. Ckeditor, infatti, configura paperclip per salvare i file in una directory all&#8217;infuori di public/system, directory che capistrano non preserva durante le operazioni di deploy.</p>
<p>Per ovviare a questo problema è necessario apportare delle modifiche alla configurazione creata durante l&#8217;installazione di ckeditor, e in particolare ai file:</p>
<p><em>app/models/ckeditor/attachment_file.rb</em><br />
<em>app/models/ckeditor/picture.rb</em></p>
<p>Modificandoli in:</p>
<p><strong>app/models/ckeditor/attachment_file.rb</strong></p>
<pre class="brush:ruby">class Ckeditor::AttachmentFile &lt; Ckeditor::Asset
  has_attached_file :data,
                    :url =&gt; "/system/ckeditor_assets/attachments/:id/:filename",
                    :path =&gt; ":rails_root/public/system/ckeditor_assets/attachments/:id/:filename"

  validates_attachment_size :data, :less_than =&gt; 100.megabytes
  validates_attachment_presence :data

	def url_thumb
	  @url_thumb ||= Ckeditor::Utils.filethumb(filename)
	end
end</pre>
<p><strong>app/models/ckeditor/picture.rb</strong></p>
<pre class="brush:ruby">class Ckeditor::Picture &lt; Ckeditor::Asset
  has_attached_file :data,
                    :url  =&gt; "/system/ckeditor_assets/pictures/:id/:style_:basename.:extension",
                    :path =&gt; ":rails_root/public/system/ckeditor_assets/pictures/:id/:style_:basename.:extension",
	                  :styles =&gt; { :content =&gt; '800&gt;', :thumb =&gt; '118x100#' }

	validates_attachment_size :data, :less_than =&gt; 2.megabytes
	validates_attachment_presence :data

	def url_content
	  url(:content)
	end
end</pre>
<p>con questa modifica i file verranno caricati all&#8217;interno della directory public/system, che verrà preservata da capistrano, evitando di farci perdere immaigni e file ad ogni <em>cap deploy</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.leevee.it/2013/03/29/ckeditor-e-capistrano-preservare-i-file-caricati/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installare Ruby on Rails su Mac OS X Mountain Lion</title>
		<link>http://blog.leevee.it/2013/03/28/installare-ruby-on-rails-su-mac-os-x-mountain-lion/</link>
		<comments>http://blog.leevee.it/2013/03/28/installare-ruby-on-rails-su-mac-os-x-mountain-lion/#comments</comments>
		<pubDate>Thu, 28 Mar 2013 08:30:26 +0000</pubDate>
		<dc:creator>Claudio Moratti</dc:creator>
				<category><![CDATA[Appunti Sparsi]]></category>
		<category><![CDATA[Mac Os]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[homebrew]]></category>
		<category><![CDATA[installazione]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rbenv]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[ruby-build]]></category>

		<guid isPermaLink="false">http://blog.leevee.it/?p=135</guid>
		<description><![CDATA[L&#8217;installazione di tutto quello che serve per lo sviluppo in Ruby on Rails passo passo, visto che ogni volta devo andare a pescare documenti a destra e a manca Step1: Installare XCode Per prima cosa è necessario installare XCode. Una volta installato, bisogna installare i &#8220;Command Line Tools&#8221; aprendo XCode, andando in XCode -&#62; Preferences [...]]]></description>
				<content:encoded><![CDATA[<p>L&#8217;installazione di tutto quello che serve per lo sviluppo in Ruby on Rails passo passo, visto che ogni volta devo andare a pescare documenti a destra e a manca <img src='http://blog.leevee.it/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h2>Step1: Installare XCode</h2>
<p>Per prima cosa è necessario installare <a href="http://itunes.apple.com/gb/app/xcode/id497799835?mt=12">XCode</a>. Una volta installato, bisogna installare i &#8220;Command Line Tools&#8221; aprendo XCode, andando in XCode -&gt; Preferences -&gt; Downloads e premendo il tasto &#8220;Install&#8221; a fianco di &#8220;Command Line Tools&#8221;.</p>
<p>Una volta scaricati possiamo andare avanti.</p>
<h2>Step2: Installare Homebrew</h2>
<p><a href="http://mxcl.github.com/homebrew/">Homebrew</a> è un tool fantastico: permette di installare software utilissimo, soprattutto per chi sviluppa, con un comodo comando.</p>
<p>L&#8217;installazione avviene inserendo il seguente comando in un terminale:</p>
<pre>ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"</pre>
<p>Una volta terminata l&#8217;installazione possiamo controllare che tutto sia andato per il meglio e aggiornare l&#8217;elenco dei pacchetti disponibili:</p>
<div>
<p>brew doctor</p>
<div>
<pre>brew update</pre>
</div>
</div>
<p>Ora possiamo passare allo step3.</p>
<h2>Step3: Installazione di Ruby</h2>
<p>Homebrew ci permette, come dicevo, di installare in modo semplice <a href="https://github.com/sstephenson/rbenv/">rbenv</a> e <a href="https://github.com/sstephenson/ruby-build">ruby-build</a>:</p>
<pre>brew install rbenv ruby-build</pre>
<p>Terminata l&#8217;installazione, andiamo ad aggiungere le nuove variabili di ambiente tramite il seguente comando:</p>
<pre>echo 'eval "$(rbenv init -)"' &gt;&gt; ~/.bash_profile</pre>
<pre>source ~/.bash_profile</pre>
<p>Una volta terminato il processo possiamo installare la versione di ruby che vogliamo, nel mio caso la  &#8221;1.9.3-p392&#8243;:</p>
<pre>rbenv install  1.9.3-p392</pre>
<p>In alternativa è possibile ottenere l&#8217;elenco di tutte le versioni di ruby disponibili tramite il comando</p>
<pre>rbenv install --list</pre>
<p>Al termine dell&#8217;installazione è necessario aggiornare le hash e indicare al sistema quale versione utilizzare come predefinita:</p>
<pre>rbenv rehash</pre>
<pre>rbenv global 1.9.3-p392</pre>
<h2>Step4: Installare le gemme fondamentali</h2>
<p>Per avere un sistemam funzionante procediamo all&#8217;installazione di:</p>
<pre>gem install rails bundle rake</pre>
<p>Ora siamo pronti a lavorare <img src='http://blog.leevee.it/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.leevee.it/2013/03/28/installare-ruby-on-rails-su-mac-os-x-mountain-lion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>lol_dba: trovare gli indici mancanti</title>
		<link>http://blog.leevee.it/2013/03/27/lol_dba-trovare-gli-indici-mancanti/</link>
		<comments>http://blog.leevee.it/2013/03/27/lol_dba-trovare-gli-indici-mancanti/#comments</comments>
		<pubDate>Wed, 27 Mar 2013 07:15:29 +0000</pubDate>
		<dc:creator>Claudio Moratti</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rubygems]]></category>
		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://blog.leevee.it/?p=124</guid>
		<description><![CDATA[Inizia una piccola serie di articoli dedicati al tuning delle applicazioni scritte in Ruby on Raisl. In questo post parlo di lol_dba, una gemma che ha una funzione semplice quanto comoda: analizzare il codice, controllando i modelli e indicandoci gli indici mancanti. L&#8217;output che ci restituisce può essere il codice di una migrazione o una [...]]]></description>
				<content:encoded><![CDATA[<p>Inizia una piccola serie di articoli dedicati al tuning delle applicazioni scritte in Ruby on Raisl.</p>
<p>In questo post parlo di <a href="https://github.com/plentz/lol_dba">lol_dba</a>, una gemma che ha una funzione semplice quanto comoda: analizzare il codice, controllando i modelli e indicandoci gli indici mancanti. L&#8217;output che ci restituisce può essere il codice di una migrazione o una query sql per aggiungere gli indici al database.</p>
<p>Il funzionamento è semplice: dopo averla installata tramite il classico</p>
<pre class="brush:shell">gem install lol_dba</pre>
<p>avremo a disposizione due comandi: <em>lol_dba db:find_indexes</em> e <em>lol_dba db:migrate_sql .</em></p>
<p>Entrambi hanno lo stesso fine, ma varia l&#8217;output prodotto: nel primo caso verrà prodotto il contenuto da mettere dentro una migrazione che andremo a generare, come consigliato dall&#8217;output del programma, tramite:</p>
<pre class="brush:shell">rails g migration AddMissingIndexes</pre>
<p>nel primo caso verrà prodotta una query sql da eseguire sul database server.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.leevee.it/2013/03/27/lol_dba-trovare-gli-indici-mancanti/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rubygem: evitare l&#8217;installazione della documentazione</title>
		<link>http://blog.leevee.it/2013/03/26/rubygem-evitare-linstallazione-della-documentazione/</link>
		<comments>http://blog.leevee.it/2013/03/26/rubygem-evitare-linstallazione-della-documentazione/#comments</comments>
		<pubDate>Tue, 26 Mar 2013 16:38:11 +0000</pubDate>
		<dc:creator>Claudio Moratti</dc:creator>
				<category><![CDATA[Appunti Sparsi]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://blog.leevee.it/?p=138</guid>
		<description><![CDATA[Spesso l&#8217;installazione della documentazione delle varie gemme installate, oltre ad essere superflua occupa inutilmente spazio: la documentazione viene consultata via internet e quella presente sul sistema è ignorata. Per evitare la perdita di tempo dell&#8217;installazione/compilazione della documentazione è possibile disabilitarne l&#8217;installazione tramite il seguente comando: echo 'gem: --no-rdoc --no-ri' &#62;&#62; ~/.gemrc]]></description>
				<content:encoded><![CDATA[<p>Spesso l&#8217;installazione della documentazione delle varie gemme installate, oltre ad essere superflua occupa inutilmente spazio: la documentazione viene consultata via internet e quella presente sul sistema è ignorata. Per evitare la perdita di tempo dell&#8217;installazione/compilazione della documentazione è possibile disabilitarne l&#8217;installazione tramite il seguente comando:</p>
<pre>echo 'gem: --no-rdoc --no-ri' &gt;&gt; ~/.gemrc</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.leevee.it/2013/03/26/rubygem-evitare-linstallazione-della-documentazione/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Localeapp: migliorare le performance</title>
		<link>http://blog.leevee.it/2013/03/25/localeapp-migliorare-le-performance/</link>
		<comments>http://blog.leevee.it/2013/03/25/localeapp-migliorare-le-performance/#comments</comments>
		<pubDate>Mon, 25 Mar 2013 06:59:08 +0000</pubDate>
		<dc:creator>Claudio Moratti</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[localeapp]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://blog.leevee.it/?p=120</guid>
		<description><![CDATA[Localeapp.com è forse il sistema più comodo per internazionalizzare le proprie applicazioni scritte in Ruby on Rails. La configurazione di Default, però, rallenta spesso in modo estenuante le performance in fase di sviluppo: ad ogni pagina richiesta viene infatti fatta una richiesta ai server di localeapp per mandare le traduzioni mancanti e scaricare quelle nuove. [...]]]></description>
				<content:encoded><![CDATA[<p>Localeapp.com è forse il sistema più comodo per internazionalizzare le proprie applicazioni scritte in Ruby on Rails. La configurazione di Default, però, rallenta spesso in modo estenuante le performance in fase di sviluppo: ad ogni pagina richiesta viene infatti fatta una richiesta ai server di localeapp per mandare le traduzioni mancanti e scaricare quelle nuove.</p>
<p>Sebbene la soluzione funzioni alla perfezione &#8220;out-of-the-box&#8221; genera delle attese che spesso sono snervanti.</p>
<p>La soluzione per migliorare questa situazione esiste e si può applicare così:</p>
<p>Disabilitiamo l&#8217;invio e la ricezione delle traduzioni ad ogni pagina, modificando il file config/initializers/localeapp.rb e aggiungendo, nel blocco, le seguenti righe:</p>
<pre class="brush:ruby">config.sending_environments = []
config.polling_environments = []</pre>
<p>In questo modo non verranno più inviate e ricevute le traduzioni in automatico.</p>
<p>Il lavoro di aggiornamento delle traduzioni, infatti, verrà demandato ad un demone che lanceremo col seguente comando:</p>
<pre class="brush:shell">$ localeapp daemon</pre>
<p>che si occuperà di fare il fetch in automatico ad intervalli regolari.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.leevee.it/2013/03/25/localeapp-migliorare-le-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
