rails.cat | assert_response :success http://rails.cat/ blocs sobre ruby on rails ca pg_explain <p>He publicat un petit plugin de rails que afegeix als logs els &#8220;explain&#8221; o &#8220;explain analyze&#8221; de les consultes sql. Solament funciona si estem utilitzant una base de dades postgresql.</p> <p>Podeu consultar-ne els detalls <a href="http://rubyforge.org/projects/pgexplain/">aquí.</a></p> <p>Un exemple de la sortida als logs:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt>7<tt> </tt>8<tt> </tt>9<tt> </tt><strong>10</strong><tt> </tt>11<tt> </tt>12<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">Component Load (0.039698) SELECT components.* FROM components INNER JOIN web_module_components ON components.id = web_module_components.component_id WHERE ((web_module_components.web_module_id = 5)) ORDER BY web_module_components.order ASC<tt> </tt><tt> </tt> Explain Component Load<tt> </tt> <tt> </tt> Sort (cost=42.37..42.38 rows=5 width=565)<tt> </tt> Sort Key: web_module_components.&quot;order&quot;<tt> </tt> -&gt; Hash Join (cost=30.48..42.31 rows=5 width=565)<tt> </tt> Hash Cond: (components.id = web_module_components.component_id)<tt> </tt> -&gt; Seq Scan on components (cost=0.00..11.30 rows=130 width=561)<tt> </tt> -&gt; Hash (cost=30.38..30.38 rows=8 width=8)<tt> </tt> -&gt; Seq Scan on web_module_components (cost=0.00..30.38 rows=8 width=8)<tt> </tt> Filter: (web_module_id = 5)</pre></td> </tr></table> </div> Ramon Salvadó Dc, 19 Des 2007 08:34:48 +0100 http://rails.cat/bloc/rsalvado/post/pg_explain http://rails.cat/bloc/rsalvado/post/pg_explain Nova versió del plugin de rails gettext_localize <p>Hem publicat una nova versió del plugin d&#8217;internacionalització de rails <a href="http://rubyforge.org/projects/gettextlocalize/">gettext_localize</a> (que és una de les opcions que podeu utilizar si voleu desenvolupar aplicacions rails en català).</p> <p>Els canvis en aquesta versió:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">Version 0.4 28/11/2007<tt> </tt>----<tt> </tt><tt> </tt>- Included french translation (thanks to Michel Loiseleur)<tt> </tt>- Relaxed gettext gem requirements to include 1.10<tt> </tt>- Fixed bug to make it work with ruby 1.8.6 (thanks to Luis E. Guardiola)</pre></td> </tr></table> </div><p>Per a més informació podeu consultar-ne la <a href="http://gettextlocalize.rubyforge.org/">documentació.</a></p> Ramon Salvadó Dc, 19 Des 2007 08:34:40 +0100 http://rails.cat/bloc/rsalvado/post/nova_versio_del_plugin_de_rails_gettext_localize http://rails.cat/bloc/rsalvado/post/nova_versio_del_plugin_de_rails_gettext_localize Leopard i lookupd <p>De vegades ens interessa refrescar el &#8220;caché&#8221; de dns per exemple quan modifiquem el fitxer /etc/hosts, per a fer-ho en leopard:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"># El que abans era: lookupd -flushcache<tt> </tt>dscacheutil -flushcache</pre></td> </tr></table> </div><p>Segons el man:</p> <blockquote> <p>dscacheutil does various operations against the Directory Service cache including gathering statistics, initiating lookups, inspection, cache flush, etc. This tool replaces most of the functionality of the lookupd tool previously available in the OS.</p> </blockquote> Ramon Salvadó Dv, 23 Nov 2007 09:02:36 +0100 http://rails.cat/bloc/rsalvado/post/leopard_i_lookupd http://rails.cat/bloc/rsalvado/post/leopard_i_lookupd Rutes a la consola <p>Per a depurar les rutes mitjançant la consola de Rails:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt>7<tt> </tt>8<tt> </tt>9<tt> </tt><strong>10</strong><tt> </tt>11<tt> </tt>12<tt> </tt>13<tt> </tt>14<tt> </tt>15<tt> </tt>16<tt> </tt>17<tt> </tt>18<tt> </tt>19<tt> </tt><strong>20</strong><tt> </tt>21<tt> </tt>22<tt> </tt>23<tt> </tt>24<tt> </tt>25<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">$ script/console<tt> </tt>Loading development environment.<tt> </tt># Carreguem la definició de les rutes<tt> </tt>&gt;&gt; rs = ActionController::Routing::Routes<tt> </tt>=&gt; #&lt;actioncontroller::routing::routeset:0x61d76c&gt;&gt; puts rs.routes<tt> </tt>ANY /feed/suggest/ {:action=&gt;&quot;suggest&quot;, :controller=&gt;&quot;public&quot;}<tt> </tt>ANY /feed/thanks/ {:action=&gt;&quot;thanks&quot;, :controller=&gt;&quot;public&quot;}<tt> </tt>ANY /:page/ {:action=&gt;&quot;index&quot;, :controller=&gt;&quot;public&quot;}<tt> </tt>ANY /:controller/:action/:id.:format/ {}<tt> </tt>ANY /:controller/:action/:id/ {}<tt> </tt>=&gt; nil<tt> </tt># Reconeixement de rutes<tt> </tt>&gt;&gt; rs.recognize_path &quot;/feed&quot;<tt> </tt>=&gt; {:action=&gt;&quot;index&quot;, :page=&gt;&quot;feed&quot;, :controller=&gt;&quot;public&quot;}<tt> </tt>&gt;&gt; rs.recognize_path &quot;/feed/thanks&quot;<tt> </tt>=&gt; {:action=&gt;&quot;thanks&quot;, :controller=&gt;&quot;public&quot;}<tt> </tt>&gt;&gt; rs.generate :controller =&gt; :public, :page =&gt; 2<tt> </tt>=&gt; &quot;/2&quot;<tt> </tt># Per a testejar rutes de controladors inexistents<tt> </tt>&gt;&gt; ActionController::Routing.use_controllers! [ &quot;undefined&quot;, &quot;test&quot; ]<tt> </tt>=&gt; [&quot;undefined&quot;, &quot;test&quot;]<tt> </tt>&gt;&gt; load &quot;config/routes.rb&quot;<tt> </tt>=&gt; []<tt> </tt>&gt;&gt; rs.recognize_path &quot;/undefined/show/1&quot;<tt> </tt>=&gt; {:action=&gt;&quot;show&quot;, :id=&gt;&quot;1&quot;, :controller=&gt;&quot;undefined&quot;}</pre></td> </tr></table> </div> Ramon Salvadó Dl, 19 Nov 2007 12:11:38 +0100 http://rails.cat/bloc/rsalvado/post/rutes_a_la_consola http://rails.cat/bloc/rsalvado/post/rutes_a_la_consola Ruby 1.8.5 en Leopard <p>Leopard porta tot l&#8217;entorn de desenvolupament per a Ruby on Rails i Ruby integrat, cosa que està molt bé ja que facilita enormement l&#8217;arrencada de la gent que comença a desenvolupar amb aquestes tecnologies.</p> <p>La versió de Ruby instal·lada es la 1.8.6 (amb alguns patchs interessants com ara el de suport per a dtrace). Algunes distribucions com ara centos 5 o debian etch utilitzen la versió 1.8.5. Això vol dir que si tenim aplicacions en producció corrent sobre aquestes distribucions probablement voldrem desenvolupar sobre la mateixa versió de Ruby per tal d&#8217;evitar &#8220;sorpreses&#8221;.</p> <p>Per a aconseguir això podem compilar directament dels fonts o utilitzar macports. La cosa es que en el cas de voler utilitzar macports ens trobarem que no existeix variant per la versió 1.8.5.</p> <p>El que podem fer es crear el nostre port a partir de la revisió de subversion del repositori macports del port de ruby que es corresponia a la versió 1.8.5:</p> <p>Primer hem de crear un repositori de ports local:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">mkdir /Users/Shared/dports<tt> </tt>sudo sed -e '1i file:///Users/Shared/dports' -i~ /opt/local/etc/macports/sources.conf</pre></td> </tr></table> </div><p>Seguidament treiem la versió del repositori que ens interessi:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">cd /Users/Shared/dports<tt> </tt>svn co --revision 21487 http://svn.macports.org/repository/macports/trunk/dports/lang/ruby/ lang/ruby/<tt> </tt>portindex /Users/Shared/dports</pre></td> </tr></table> </div><p>Llavors en un món ideal ja podríem instal·lar fent:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre><tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">sudo port install ruby</pre></td> </tr></table> </div><p>I això instal·laria la versió del port en el nostre repositori local (1.8.5), el que passa es que per a que Ruby funcioni en Leopard cal aplicar uns patchs d&#8217;apple al codi font segons s&#8217;explica <a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/12895">aquí</a></p> <p>Així doncs el que caldrà fer es descarregar els fitxers dels patchs al directori files del nostre port i modificar el fixter Portfile per a que els apliqui. Si fem això veurem que s&#8217;apliquen netament excepte un que falla degut a que aquests patchs estan pensats per a la versió 1.8.6 de Ruby.</p> <p>El que cal fer quan falla la instal·lació és anar al directori de treball del port, revisar el patch que falla i veure si podem modificar-lo per a aplicar-lo a la versió 1.8.5.</p> <p>La modificació és molt senzilla, es tracta del fitxer ignore-gsetcontext.diff i un cop modificat per a la versió 1.8.5 queda així:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt>7<tt> </tt>8<tt> </tt>9<tt> </tt><strong>10</strong><tt> </tt>11<tt> </tt>12<tt> </tt>13<tt> </tt>14<tt> </tt>15<tt> </tt>16<tt> </tt>17<tt> </tt>18<tt> </tt>19<tt> </tt><strong>20</strong><tt> </tt>21<tt> </tt>22<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">--- eval.c.orig 2007-10-31 12:03:10.000000000 +0100<tt> </tt>+++ eval.c 2007-10-31 12:03:10.000000000 +0100<tt> </tt>@@ -29,9 +29,17 @@<tt> </tt> #endif<tt> </tt> <tt> </tt> #include &lt;stdio&gt;<tt> </tt>-#if defined(HAVE_GETCONTEXT) &amp;&amp; defined(HAVE_SETCONTEXT)<tt> </tt>-#include &lt;ucontext&gt;<tt> </tt>-#define USE_CONTEXT<tt> </tt>+#if defined(HAVE_GETCONTEXT) &amp;&amp; defined(HAVE_SETCONTEXT) <tt> </tt>+# if defined(__APPLE__)<tt> </tt>+# include &lt;availabilitymacros&gt;<tt> </tt>+# if MAC_OS_X_VERSION_MAX_ALLOWED &lt;= 1040<tt> </tt>+# include &lt;ucontext&gt;<tt> </tt>+# define USE_CONTEXT<tt> </tt>+# endif<tt> </tt>+# else<tt> </tt>+# include &lt;ucontext&gt;<tt> </tt>+# define USE_CONTEXT<tt> </tt>+# endif<tt> </tt> #endif<tt> </tt> #include &lt;setjmp&gt;</pre></td> </tr></table> </div><p>Arribats a aquest punt podem instal·lar el port amb la comanda habitual:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre><tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">sudo port install ruby</pre></td> </tr></table> </div><p>Un cop fet tot això disposarem de 2 versions de ruby instal·lades la 1.8.6 que es la que ve per defecte en Leopard i la 1.8.5 que es la que hem instal·lat via macports.</p> <p>Podem fer servir una o altra segons ens convingui en funció de l&#8217;ordre de càrrega dels binaris de macports en la nostra variable <span class="caps">PATH</span>, si posem primer la de macports (/opt/local/bin i /opt/local/sbin) s&#8217;utilitzarà per defecte la versió 1.8.5 de Ruby i en cas contrari la 1.8.6.</p> Ramon Salvadó Dl, 12 Nov 2007 22:18:02 +0100 http://rails.cat/bloc/rsalvado/post/ruby_185_en_leopard http://rails.cat/bloc/rsalvado/post/ruby_185_en_leopard Systemtap, alternativa a dtrace per a Linux <p>Solaris disposa d&#8217;algunes característiques molt interessants, per a mi destaquen sobretot <a href="http://www.sun.com/bigadmin/content/dtrace/">dtrace</a> i el sistema de fitxers <a href="http://en.wikipedia.org/wiki/ZFS">ZFS</a>.</p> <p>Pel que fa a <a href="http://en.wikipedia.org/wiki/ZFS">ZFS</a> la seva llicència fa impossible un port per a Linux, si bé sembla que es pot utilitzar mitjançant <a href="http://fuse.sourceforge.net/">FUSE</a> tal i com s&#8217;explica a <a href="http://zfs-on-fuse.blogspot.com/">ZFS on <span class="caps">FUSE</span>/Linux</a>.</p> <p>Per a Linux en comptes de <a href="http://www.sun.com/bigadmin/content/dtrace/">dtrace</a> tenim <a href="http://sourceware.org/systemtap/">systemtap</a> que proporciona funcionalitats similars. Podem veure una <a href="http://sourceware.org/systemtap/wiki/SystemtapDtraceComparison">taula comparativa</a> que detalla les diferències entre ambdós sistemes.</p> <p>De moment no es possible d&#8217;utilitzar-lo en llenguatges script com ruby o python (cosa que si és possible amb <a href="http://www.sun.com/bigadmin/content/dtrace/">dtrace</a>).</p> <p>Per a instal·lar <a href="http://sourceware.org/systemtap/">systemtap</a> en <a href="http://www.centos.org/">Centos 5</a> solament hem de fer:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre><tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">yum install systemtap</pre></td> </tr></table> </div><p>A més també haurem d&#8217;instal·lar els paquets:</p> <ul> <li>kernel-devel</li> <li>kernel-headers</li> <li>kernel-debuginfo</li> <li>kernel-debuginfo-common</li> </ul> <p>Les versions dels 2 darrers paquets s&#8217;han de correspondre amb la versió de kernel instal·lada i es poden trobar <a href="http://vault.centos.org/debuginfo/5/">aquí</a></p> <p>Amb <a href="http://sourceware.org/systemtap/">systemtap</a> podem fer coses força interessants, per exemple amb l&#8217;script següent podem veure una llista de processos ordenada en funció de l&#8217;ample de banda de xarxa que consumeixen:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt>7<tt> </tt>8<tt> </tt>9<tt> </tt><strong>10</strong><tt> </tt>11<tt> </tt>12<tt> </tt>13<tt> </tt>14<tt> </tt>15<tt> </tt>16<tt> </tt>17<tt> </tt>18<tt> </tt>19<tt> </tt><strong>20</strong><tt> </tt>21<tt> </tt>22<tt> </tt>23<tt> </tt>24<tt> </tt>25<tt> </tt>26<tt> </tt>27<tt> </tt>28<tt> </tt>29<tt> </tt><strong>30</strong><tt> </tt>31<tt> </tt>32<tt> </tt>33<tt> </tt>34<tt> </tt>35<tt> </tt>36<tt> </tt>37<tt> </tt>38<tt> </tt>39<tt> </tt><strong>40</strong><tt> </tt>41<tt> </tt>42<tt> </tt>43<tt> </tt>44<tt> </tt>45<tt> </tt>46<tt> </tt>47<tt> </tt>48<tt> </tt>49<tt> </tt><strong>50</strong><tt> </tt>51<tt> </tt>52<tt> </tt>53<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">global ifxmit, ifrecv, ifdevs, ifpid, execname, user<tt> </tt><tt> </tt>probe netdev.transmit<tt> </tt>{<tt> </tt> p = pid()<tt> </tt> execname[p] = execname()<tt> </tt> user[p] = uid()<tt> </tt> ifdevs[p, dev_name] = dev_name<tt> </tt> ifxmit[p, dev_name] &lt;&lt;&lt; length<tt> </tt> ifpid[p, dev_name] ++<tt> </tt>}<tt> </tt><tt> </tt>probe netdev.receive<tt> </tt>{<tt> </tt> p = pid()<tt> </tt> execname[p] = execname()<tt> </tt> user[p] = uid()<tt> </tt> ifdevs[p, dev_name] = dev_name<tt> </tt> ifrecv[p, dev_name] &lt;&lt;&lt; length<tt> </tt> ifpid[p, dev_name] ++<tt> </tt>}<tt> </tt><tt> </tt><tt> </tt>function print_activity()<tt> </tt>{<tt> </tt> printf(<span class="s"><span class="dl">&quot;</span><span class="k">%5s %5s %-7s %7s %7s %7s %7s %-15s</span><span class="ch">\n</span><span class="dl">&quot;</span></span>,<tt> </tt> <span class="s"><span class="dl">&quot;</span><span class="k">PID</span><span class="dl">&quot;</span></span>, <span class="s"><span class="dl">&quot;</span><span class="k">UID</span><span class="dl">&quot;</span></span>, <span class="s"><span class="dl">&quot;</span><span class="k">DEV</span><span class="dl">&quot;</span></span>, <span class="s"><span class="dl">&quot;</span><span class="k">XMIT_PK</span><span class="dl">&quot;</span></span>, <span class="s"><span class="dl">&quot;</span><span class="k">RECV_PK</span><span class="dl">&quot;</span></span>,<tt> </tt> <span class="s"><span class="dl">&quot;</span><span class="k">XMIT_KB</span><span class="dl">&quot;</span></span>, <span class="s"><span class="dl">&quot;</span><span class="k">RECV_KB</span><span class="dl">&quot;</span></span>, <span class="s"><span class="dl">&quot;</span><span class="k">COMMAND</span><span class="dl">&quot;</span></span>)<tt> </tt><tt> </tt> foreach ([pid, dev] <span class="r">in</span> ifpid-) {<tt> </tt> n_xmit = <span class="iv">@count</span>(ifxmit[pid, dev])<tt> </tt> n_recv = <span class="iv">@count</span>(ifrecv[pid, dev])<tt> </tt> printf(<span class="s"><span class="dl">&quot;</span><span class="k">%5d %5d %-7s %7d %7d %7d %7d %-15s</span><span class="ch">\n</span><span class="dl">&quot;</span></span>,<tt> </tt> pid, user[pid], dev, n_xmit, n_recv,<tt> </tt> n_xmit ? <span class="iv">@sum</span>(ifxmit[pid, dev])/<span class="i">1024</span> : <span class="i">0</span>,<tt> </tt> n_recv ? <span class="iv">@sum</span>(ifrecv[pid, dev])/<span class="i">1024</span> : <span class="i">0</span>,<tt> </tt> execname[pid])<tt> </tt> }<tt> </tt><tt> </tt> print(<span class="s"><span class="dl">&quot;</span><span class="ch">\n</span><span class="dl">&quot;</span></span>)<tt> </tt><tt> </tt> delete execname<tt> </tt> delete user<tt> </tt> delete ifdevs<tt> </tt> delete ifxmit<tt> </tt> delete ifrecv<tt> </tt> delete ifpid<tt> </tt>}<tt> </tt><tt> </tt>probe timer.ms(<span class="i">5000</span>)<tt> </tt>{<tt> </tt> print_activity()<tt> </tt>}</pre></td> </tr></table> </div><p>Un exemple de la sortida si l&#8217;executem:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><span class="co">PID</span> <span class="co">UID</span> <span class="co">DEV</span> <span class="co">XMIT_PK</span> <span class="co">RECV_PK</span> <span class="co">XMIT_KB</span> <span class="co">RECV_KB</span> <span class="co">COMMAND</span> <tt> </tt> <span class="i">0</span> <span class="i">0</span> eth0 <span class="i">0</span> <span class="i">13</span> <span class="i">0</span> <span class="i">2</span> swapper <tt> </tt> <span class="i">1947</span> <span class="i">501</span> eth0 <span class="i">4</span> <span class="i">0</span> <span class="i">0</span> <span class="i">0</span> ping <tt> </tt> <span class="i">1873</span> <span class="i">0</span> eth0 <span class="i">1</span> <span class="i">0</span> <span class="i">0</span> <span class="i">0</span> sshd</pre></td> </tr></table> </div><p>Podem veure més exemples d&#8217;scripts en el <a href="http://sourceware.org/systemtap/wiki/WarStories">wiki</a>.</p> Ramon Salvadó Dg, 11 Nov 2007 01:24:37 +0100 http://rails.cat/bloc/rsalvado/post/systemtap_alternativa_a_dtrace_per_a_linux http://rails.cat/bloc/rsalvado/post/systemtap_alternativa_a_dtrace_per_a_linux Presentacions Railsconf 2007 <p>Per si voleu anar seguint les sessions de la Railsconf, aquest <a href="http://wiki.oreillynet.com/wiki/railsconf2007/index.cgi?PresentationSlides">enllaç</a> us pot resultar interessant.</p> <p>Avui hi han hagut sessions molt interessants a veure si més tard tinc temps de donar-ne la meva opinió i fer-ne un breu resum.</p> Ramon Salvadó Dv, 18 Mai 2007 22:52:51 +0200 http://rails.cat/bloc/rsalvado/post/presentacions_railsconf_2007 http://rails.cat/bloc/rsalvado/post/presentacions_railsconf_2007 Railsconf 2007. Scaling a Rails Application from the Bottom Up <p>Aquest &#8220;tutorial&#8221; estava a càrrec d&#8217;en Jason Hoffman de <a href="http://joyent.com/">Joyent</a> . La veritat es que d&#8217;entrada prometia bastant ja que ells porten alguns dels &#8220;deployments&#8221; d&#8217;aplicacions Rails de més gran escala en l&#8217;actualitat com ara <a href="http://twitter.com">twitter</a> per exemple.</p> <p>La sessió ha tractat desde la selecció de servidors, consideracions de consum d&#8217;energia, costos d&#8217;ample de banda a alguns temes més específics d&#8217;aplicacions Rails.</p> <p>Personalment pensava que tractaria més a fons temes específics sobre les bones pràctiques a l&#8217;hora d&#8217;escalar aplicacions Rails però les 2 primeres hores s&#8217;han centrat en temes de caire general, malgrat això la darrera hora ha estat prou interessant.</p> <p>Algunes coses que he trobat especialment interessants:</p> <ol> <li><a href="http://varnish.projects.linpro.no/">Varnish</a> balancejador de càrrega, aquest tema es important ja que sembla ser que a partir d&#8217;un cert nombre de req/s la combinació d&#8217;apache amb el mod_proxy_balancer no escala per més mongrels que afegim per tant no és una solució viable per a grans deployments.</li> <li>Un truquet interessant que no havia pensat mai, es que podem utilitzar backtics (per a executar comandes de sistema) en els fitxers de configuració yml del mongrel_cluster per exemple de manera que els podem fer més genèrics. En el seu cas concret ho utilitzaven per determinar la ip i el hostname.</li> <li>Utilitzar múltiples hosts per a distribuir els continguts estàtics. Això accelera les nostres pàgines ja que els navegadors sols obren 2 conexions per host. Això vol dir que si utilitzem 4 hosts (que es el que han recomanat) per distribuir el contingut estàtic això vol dir que s&#8217;obriran 8 conexions simultanies enlloc de les 2 si ho fessim amb un de sol. Més informació sobre el tema <a href="http://chadfowler.com/2007/2/18/edge-rails-goody-distributed-asset-hosts">aquí</a></li> <li><a href="http://wiki.powerdns.com/cgi-bin/trac.fcgi">Powerdns</a> un servidor de noms interessant que pot llegir les dades d&#8217;una base de dades mysql entre d&#8217;altre opcions. (O sigui que afegint un registre a una taula de la base de dades podem donar d&#8217;alta un subdomini, molt interessant per segons quin tipus d&#8217;aplicacions).</li> <li>Mongrels més ràpids i estables aka <a href="http://brainspl.at/articles/2007/05/12/event-driven-mongrel-and-swiftiply-proxy">event driven mongrels</a></li> </ol> <p>Evidentment s&#8217;han tractat molts d&#8217;altres temes: com escalar la base de dades, Jruby o la separació dels controladors de la nostra aplicació amb mongrels específics.</p> <p>En resum molt interessant però he trobat a faltar certa manca de profunditat a l&#8217;hora de tractar temes més específics de Rails.</p> Ramon Salvadó Dv, 18 Mai 2007 07:26:12 +0200 http://rails.cat/bloc/rsalvado/post/railsconf_2007_scaling_a_rails_application_from_the_bottom_up http://rails.cat/bloc/rsalvado/post/railsconf_2007_scaling_a_rails_application_from_the_bottom_up Railsconf 2007 <p>D&#8217;aquí una estona sortim cap a la <a href="http://conferences.oreillynet.com/rails/">Railsconf 2007</a> , que aquest any es fa a Portland.</p> <p>Miraré d&#8217;anar donant la meva opinió de les sessions a les que finalment assisteixi, de moment podeu fer un cop d&#8217;ull al que tinc planificat d&#8217;assistir <a href="http://myconfplan.com/conferences/RailsConf2007/users/rsalvado">aquí</a> (per cert bona idea la de l&#8217;aplicació aquesta), però segurament faré canvis de darrera hora sobre el que tenia previst (s&#8217;han afegit noves sessions des que ho vaig mirar).</p> <p>Si teniu comentaris o preguntes a fer, ja ho sabeu no us talleu&#8230;</p> Ramon Salvadó Dt, 15 Mai 2007 23:59:41 +0200 http://rails.cat/bloc/rsalvado/post/railsconf_2007 http://rails.cat/bloc/rsalvado/post/railsconf_2007 Nova versió de JRuby <p>Ha sortit una nova versió (la 0.9.9) de <a href="http://jruby.codehaus.org/">JRuby</a> , i això és important ja que aquesta iniciativa pot facilitar l&#8217;entrada de Ruby i de Rails als entorns més &#8220;enterprise&#8221; al permetre l&#8217;utilització de la infraestructura Java/J2EE existent.</p> <p>Bàsicament podem fer correr aplicacions rails (i d&#8217;altres ruby) en servidors com ara Tomcat, a més de disposar de facilitats extres per a accedir a llibreries de java (aquesta sembla ser la idea).</p> <p>Si hi voleu donar un cop d&#8217;ull i comprovar que tal funcionen les vostres aplicacions Rails podeu descarregar la <a href="http://dist.codehaus.org/jruby/jruby-bin-0.9.9.tar.gz">versió binària</a></p> <p>Llavors podeu afegir quelcom així al vostre profile:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">export JRUBY_HOME=/cami/al/directori/jruby-0.9.9<tt> </tt>export PATH=totelquejatenim:$JRUBY_HOME:$PATH</pre></td> </tr></table> </div><p>Després des del directori on heu descomprimit l&#8217;arxiu:</p><div class='samp'><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">bin/gem install rails<tt> </tt>chmod +x bin/rails bin/rake<tt> </tt>bin/rails testapp<tt> </tt>cd testapp<tt> </tt>jruby script/server</pre></td> </tr></table> </div><p>Fer el deploy en un tomcat o similars tampoc es massa complicat.</p> <p>La versió 1.0 s&#8217;acosta i aplicacions com ara <a href="http://mephistoblog.com/">Mephisto</a> ja funcionen. Es nota l&#8217;empenta del projecte des que <a href="http://www.sun.com/">Sun</a> va decidir de <a href="http://headius.blogspot.com/2006/09/jruby-steps-into-sun.html">contribuir-hi</a></p> Ramon Salvadó Dt, 24 Abr 2007 17:41:54 +0200 http://rails.cat/bloc/rsalvado/post/nova_versio_de_jruby http://rails.cat/bloc/rsalvado/post/nova_versio_de_jruby