<?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>Bosque Viejo &#187; programación</title>
	<atom:link href="http://bosqueviejo.net/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://bosqueviejo.net</link>
	<description>Sitio web sobre programación, software libre, redes, servidores, ofimática... y todo lo relacionado con la informática que nos rodea</description>
	<lastBuildDate>Sun, 22 Jan 2012 01:02:42 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Las gemas de Ruby</title>
		<link>http://bosqueviejo.net/2012/01/02/las-gemas-de-ruby/</link>
		<comments>http://bosqueviejo.net/2012/01/02/las-gemas-de-ruby/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 17:03:31 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1165</guid>
		<description><![CDATA[ Tengo a Ruby un poco abandonado, por lo que me he decidido a escribir un poco acerca de él, al igual que hice con Python, para detallar un poco cómo son los paquetes de código (o librerías) de Ruby: las gemas.
Las gemas de Ruby son paquetes de librerías para Ruby que se instalan en el sistema y quedan listas para ser usadas, con un simple require o con mecanismos que aporta el propio sistema de gemas para Ruby.
El gestor de gemas: rubygems
En distribuciones de GNU/Linux, e instalaciones automáticas para Windows, se nos habilita un comando, generalmente, que nos permite agregar librerías y código de un repositorio muy extenso de código listo para usar. Esto es conocido como el gestor de gemas, rubygems, o simplemente gem.
El gestor de gemas es un comando que nos permite listar las gemas instaladas, buscar gemas remotas o localmente (de las instaladas), instalar, actualizar y eliminar gemas. Se puede saber si está instalado simplemente ejecutando:

gem --version

La última versión a día de hoy es la 1.8.12, actualizar el sistema de gemas es tan simple como ejecutar:

gem update --system

Instalar una gema
Por ejemplo, si queremos usar el código siguiente:

require &#34;rubygems&#34;;
require &#34;json&#34;;
&#160;
puts &#91; &#34;hola a todos&#34;, 12, &#34;C/Sin nombre, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/rubygems-150x150.jpg" alt="" title="rubygems" width="150" height="150" class="alignleft size-thumbnail wp-image-1166" /> Tengo a Ruby un poco abandonado, por lo que me he decidido a escribir un poco acerca de él, al igual que hice con Python, para detallar un poco cómo son los paquetes de código (o librerías) de Ruby: las gemas.<span id="more-1165"></span></p>
<p>Las gemas de Ruby son paquetes de librerías para Ruby que se instalan en el sistema y quedan listas para ser usadas, con un simple <em>require</em> o con mecanismos que aporta el propio sistema de gemas para Ruby.</p>
<h3>El gestor de gemas: rubygems</h3>
<p>En distribuciones de GNU/Linux, e instalaciones automáticas para Windows, se nos habilita un comando, generalmente, que nos permite agregar librerías y código de un repositorio muy extenso de código listo para usar. Esto es conocido como el gestor de gemas, <em>rubygems</em>, o simplemente <em>gem</em>.</p>
<p>El gestor de gemas es un comando que nos permite listar las gemas instaladas, buscar gemas remotas o localmente (de las instaladas), instalar, actualizar y eliminar gemas. Se puede saber si está instalado simplemente ejecutando:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">gem --version</pre></div></div>

<p>La última versión a día de hoy es la 1.8.12, actualizar el sistema de gemas es tan simple como ejecutar:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">gem update --system</pre></div></div>

<h3>Instalar una gema</h3>
<p>Por ejemplo, si queremos usar el código siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;rubygems&quot;</span>;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;json&quot;</span>;
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#006600; font-weight:bold;">&#91;</span> <span style="color:#996600;">&quot;hola a todos&quot;</span>, <span style="color:#006666;">12</span>, <span style="color:#996600;">&quot;C/Sin nombre, 25&quot;</span> <span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_json</span></pre></div></div>

<p>Tendremos que instalar previamente la gema <em>json</em>. Para instalarla, solo tenemos que ejecutar el siguiente comando:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ sudo gem install json
[sudo] password for marubio: 
Building native extensions.  This could take a while...
Successfully installed json-1.6.4
1 gem installed
Installing ri documentation for json-1.6.4...
Installing RDoc documentation for json-1.6.4...</pre></div></div>

<p>Como se puede apreciar, se instala la gema y se genera la documentación para <em>ri</em> y <em>rdoc</em>. La generación de la documentación es bastante lenta y si tenemos que instalar muchas gemas, puede ser algo tedioso. Se puede eliminar esta tarea agregando al comando de instalación: <tt>--no-ri --no-rdoc</tt></p>
<p>Ahora, cuando listemos los paquetes instalados podremos ver:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ sudo gem list
&nbsp;
*** LOCAL GEMS ***
&nbsp;
json (1.6.4)</pre></div></div>

<p>Nos indica la versión, ya que podríamos tener varias versiones instaladas y conviviendo, y desde el código emplear la que requiramos específicamente. Si queremos instalar una versión específica de un paquete, podemos hacerlo agregando la opción, por ejemplo: <tt>--v=1.6.1</tt></p>
<h3>Buscando una gema</h3>
<p>Si queremos buscar una gema específica del directorio de gemas, podemos hacerlo a través de la propia página web: <a href="http://rubygems.org">RubyGems</a>; o a través del comando:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ gem search -r jsonn
&nbsp;
*** REMOTE GEMS ***
&nbsp;
active_record_serialize_json (0.1.2)
activejson (0.1.2)
activeresource_json_patch (0.0.1)
assert_json (0.1.1)
capcode-render-json (0.2.0)
capybara-json (0.1.1)
colorful_json (0.9.1)
csv2json (0.2.0)
cucumber-json (0.0.2)
dm-json-search (0.0.3)
[...]</pre></div></div>

<p>La base de datos de gemas tiene la friolera de más de 32 mil gemas, por lo que, no es de extrañar que ante algo trivial (como JSON) puedan aparecer cientos de gemas. A la hora de buscar deberemos de ser más precisos con los términos a elegir.</p>
<h3>Conclusiones</h3>
<p>Ha sido una introducción muy ligera a este entorno de gestión de paquetes de Ruby, lo sé, pero al menos complementa un poco la entrada de hace algunos meses sobre <a href="">Bundler</a> y da un poco de información sobre los comandos más usuales a la hora de instalar una librería en Ruby, ya sea para código scripting o para Rails.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2012/01/02/las-gemas-de-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Catalyst: framework web para Perl</title>
		<link>http://bosqueviejo.net/2011/11/29/catalyst-framework-web-para-perl/</link>
		<comments>http://bosqueviejo.net/2011/11/29/catalyst-framework-web-para-perl/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 18:20:22 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[catalyst]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=777</guid>
		<description><![CDATA[ Justo cuando colgaba la encuesta sobre: Si tuvieses que hacer un sitio web dinámico, ¿en qué tecnología lo harías?; busqué un framework en los lenguajes más populares de desarrollo web y, topé con Catalyst, un framework en Perl para el desarrollo de aplicaciones web.
Después de un recorrido por Symfony (PHP), Rails (Ruby) y Django (Python), he decidido echarle un vistazo a Catalyst (Perl) para ver qué novedades integra y en qué mejora, tanto a nivel de rendimiento, como a nivel de desarrollo, la generación de sitios web dinámicos.
Perspectiva MVC
Cada entorno integra MVC de una forma diferente, incluso lo que se entiende por MVC, desde los primeros libros a finales de los 70 y principios de los 80, es un esquema en el que la Vista puede interactuar con el modelo, al igual que el controlador con la vista y con el modelo.
En Rails, se presenta el fat model, donde la codificación referente a base de datos se realiza en estos, y el flujo de la aplicación recae en los controladores, que deciden qué tipo de vista o presentación de la información emplear, dando facilidades para la presentación en HTML, JSON, XML&#8230; e incluso vía email.
En cambio, Django, no dispone [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/perl_catalyst.png" alt="" title="perl_catalyst" width="105" height="105" class="alignleft size-full wp-image-1093" /> Justo cuando colgaba la encuesta sobre: <em>Si tuvieses que hacer un sitio web dinámico, ¿en qué tecnología lo harías?</em>; busqué un framework en los lenguajes más populares de desarrollo web y, topé con <a href="http://www.catalystframework.org/">Catalyst</a>, un framework en Perl para el desarrollo de aplicaciones web.<span id="more-777"></span></p>
<p>Después de un recorrido por Symfony (PHP), Rails (Ruby) y Django (Python), he decidido echarle un vistazo a Catalyst (Perl) para ver qué novedades integra y en qué mejora, tanto a nivel de rendimiento, como a nivel de desarrollo, la generación de sitios web dinámicos.</p>
<h3>Perspectiva MVC</h3>
<p>Cada entorno integra MVC de una forma diferente, incluso lo que se entiende por MVC, desde los primeros libros a finales de los 70 y principios de los 80, es un esquema en el que la Vista puede interactuar con el modelo, al igual que el controlador con la vista y con el modelo.</p>
<p>En Rails, se presenta el <em>fat model</em>, donde la codificación referente a base de datos se realiza en estos, y el flujo de la aplicación recae en los controladores, que deciden qué tipo de vista o presentación de la información emplear, dando facilidades para la presentación en HTML, JSON, XML&#8230; e incluso vía email.</p>
<p>En cambio, Django, no dispone de controlador como tal, ya que lo nombran por defecto como <em>views</em>, siendo esta la entidad que controla el flujo y la presentación, ayudada de la plantillas usando DTL. En este caso, la parte de MVC queda más difusa y ellos mismos explican en su web, que se podría decir más bien que Django es MTV (Model-Template-View).</p>
<p>Catalyst, sin embargo, tiene más semejanza a Rails en este sentido. Tiene un parte para los controladores, una parte para los modelos y otra parte para las vistas. Así mismo, las vistas se desarrollan, al igual que Django y Rails, con un sistema de plantillas (templates).</p>
<p>Al crear un proyecto, tan solo ejecutando el siguiente comando, se genera la estructura de ficheros que podemos ver a continuación:</p>
<pre>
$ catalyst.pl miproject
created "miproject"
created "miproject/script"
created "miproject/lib"
created "miproject/root"
created "miproject/root/static"
created "miproject/root/static/images"
[...]
$ tree
.
├── Changes
├── lib
│   ├── miproject
│   │   ├── Controller
│   │   │   └── Root.pm
│   │   ├── Model
│   │   └── View
│   └── miproject.pm
├── Makefile.PL
├── miproject.conf
├── miproject.psgi
├── README
├── root
│   ├── favicon.ico
│   └── static
│       └── images
│           ├── btn_120x50_built.png
│           ├── btn_120x50_built_shadow.png
│           ├── btn_120x50_powered.png
│           ├── btn_120x50_powered_shadow.png
│           ├── btn_88x31_built.png
│           ├── btn_88x31_built_shadow.png
│           ├── btn_88x31_powered.png
│           ├── btn_88x31_powered_shadow.png
│           └── catalyst_logo.png
├── script
│   ├── miproject_cgi.pl
│   ├── miproject_create.pl
│   ├── miproject_fastcgi.pl
│   ├── miproject_server.pl
│   └── miproject_test.pl
└── t
    ├── 01app.t
    ├── 02pod.t
    └── 03podcoverage.t

10 directories, 25 files
</pre>
<p>En el directorio <strong>lib/miproject</strong> es donde está el código principal.</p>
<h3>Los controladores</h3>
<p>A diferencia de otros entornos, las URLs o rutas para acceso a los métodos de Catalyst son implícitas a las subrutinas de cada paquete que está en el directorio (o paquete) de controladores. Por ejemplo, si editamos el fichero <tt>lib/miproject/Controller/Root.pm</tt> y agregamos el siguiente código:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">sub</span> libros <span style="color: #339933;">:</span>Global <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$self</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$c</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">response</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">body</span> <span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;listado de libros!&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Al ejecutar el servidor de pruebas: <tt>script/miproject_server.pl</tt>; podremos ver la siguiente tabla:</p>
<pre>
[debug] Loaded Private actions:
.----------------------+--------------------------------------+--------------.
| Private              | Class                                | Method       |
+----------------------+--------------------------------------+--------------+
| /default             | miproject::Controller::Root          | default      |
| /end                 | miproject::Controller::Root          | end          |
| /libros              | miproject::Controller::Root          | libros       |
| /index               | miproject::Controller::Root          | index        |
'----------------------+--------------------------------------+--------------'
</pre>
<p>Al cargar la página <a href="http://localhost:3000/libros">http://localhost:3000/libros</a> podemos ver el resultado de la ejecución de la subrutina escrita.</p>
<h3>La vista</h3>
<p>Hemos realizado antes una salida directa desde el controlador, pero lo suyo es crear una vista. El sistema de plantillas de Perl se denomina TT. Es parecido al que se usa en JSP e incluso al que usa la DTL (Django Template Library), pero difiere bastante. Vamos a generar una vista primero:</p>
<pre>
$ script/miproject_create.pl view HTML TT
</pre>
<p>Con esto nuestro directorio de <tt>View</tt> se completa con la generación de un módulo de Perl <tt>HTML.pm</tt>. Ahora creamos una vista con la siguiente información en la ruta <tt>root</tt> con el nombre <tt>listado.tt</tt>:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;h1&gt;Hola mundo!&lt;/h1&gt;
&nbsp;
&lt;p&gt;[% libros %]&lt;/p&gt;</pre></div></div>

<p>Para lo que habrá que cambiar la subrutina escrita anteriormente a la siguiente (también se puede cambiar el nombre y agregar como una completamente nueva):</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">sub</span> libros <span style="color: #339933;">:</span>Global <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$self</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$c</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">stash</span><span style="color: #009900;">&#40;</span>template <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">&quot;listado.tt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">stash</span><span style="color: #009900;">&#40;</span>libros <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">&quot;no hay libros&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Los modelos</h3>
<p>Tanto Django como Rails, e incluso Doctrine, tienen sistemas de migraciones o sincronización con base de datos. Catalyst no dispone de estos mecanismos. Puede generar sus modelos de una conexión de base de datos con tablas ya creadas, pero no al contrario.</p>
<p>No obstante, su ORM es bastante potente. Por ejemplo, pongamos que creamos una base de datos SQLite (supongamos que en <tt>/tmp/libros.db</tt>):</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">PRAGMA foreign_keys <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">ON</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> libros <span style="color: #66cc66;">&#40;</span>
     id <span style="color: #993333; font-weight: bold;">INTEGER</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
     titulo TEXT
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> autores <span style="color: #66cc66;">&#40;</span>
     id <span style="color: #993333; font-weight: bold;">INTEGER</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
     nombre TEXT<span style="color: #66cc66;">,</span>
     apellidos TEXT
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> libros_autores <span style="color: #66cc66;">&#40;</span>
     libro_id <span style="color: #993333; font-weight: bold;">INTEGER</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> libros<span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">DELETE</span> CASCADE <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> CASCADE<span style="color: #66cc66;">,</span>
     autor_id <span style="color: #993333; font-weight: bold;">INTEGER</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> autores<span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">DELETE</span> CASCADE <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> CASCADE<span style="color: #66cc66;">,</span>
     <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>libro_id<span style="color: #66cc66;">,</span> autor_id<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Diseño Ágil con TDD'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'No me hagas pensar'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Hacking Etico'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Perl Best Practices'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Carlos'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Ble'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Steve'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Krug'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Carlos'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Tori'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Damian'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Conway'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros_autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros_autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros_autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros_autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Generamos nuestros modelos con el siguiente comando:</p>
<pre>
$ script/miproject_create.pl model  DB DBIC::Schema \
     MiProject::Schema create=static \
     dbi:SQLite:/tmp/libros.sqlite \
     on_connect_do="PRAGMA foreign_keys = ON"
</pre>
<p>Con esto nos genera un fichero de esquema en el directorio <tt>Model</tt>, con lo que tendremos el acceso a la base de datos configurada. Si quisieramos probar, tan solo necesitaríamos ejecutar lo siguiente. Modificamos la subrutina de nuevo:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">sub</span> libros <span style="color: #339933;">:</span>Global <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$self</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$c</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">stash</span><span style="color: #009900;">&#40;</span>template <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">&quot;listado.tt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">stash</span><span style="color: #009900;">&#40;</span>libros <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">model</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'DB::Libro'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">all</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y también el fichero de plantilla por lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;h1&gt;Hola mundo!&lt;/h1&gt;
&nbsp;
[% FOREACH libro IN libros -%]
[% tt_autores = []; tt_autores.push(autor.apellidos) FOREACH autor = libro.autores %]
&lt;p&gt;[% libro.titulo %] - [% tt_autores.join(', ') | html %]&lt;/p&gt;
[% END -%]</pre></div></div>

<p>Por último, agregamos las referencias necesarias en <tt>Libro.pm</tt> y <tt>Autore.pm</tt> (es lo malo del pluralize del inglés cuando se usan palabras castellanas):</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">__PACKAGE__<span style="color: #339933;">-&gt;</span><span style="color: #006600;">many_to_many</span><span style="color: #009900;">&#40;</span>libros <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'libros_autores'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'libro'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Y esto para <tt>Autore.pm</tt>:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">__PACKAGE__<span style="color: #339933;">-&gt;</span><span style="color: #006600;">many_to_many</span><span style="color: #009900;">&#40;</span>autores <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'libros_autores'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'autor'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Con esto ya tendríamos un listado muy simple en funcionamiento. Puedes ver el tutorial completo (con un CRUD de ejemplo y más cosas aún) en la siguiente dirección (en inglés): <a href="http://search.cpan.org/~hkclark/Catalyst-Manual-5.9002/lib/Catalyst/Manual/Tutorial.pod">Tutorial</a>.</p>
<h3>Conclusiones</h3>
<p>El entorno proporciona las bases que proporcionan el resto de frameworks, su simpleza en las rutas y su formato de ORM hace que la programación de elementos sea bastante simple y rápida, no obstante, hay ciertos elementos con los que hay que tratar y revisarlos bien, leer bien la documentación y tratar de entenderlos, si no queremos toparnos con ningún problema a la hora de realizar cualquier entorno.</p>
<p>Personalmente, me ha gustado la experiencia y el entorno en sí, la programación con los módulos de Perl, lo documentado que queda todo si se siguen las líneas y el hecho de que no hace falta escribir mucho código para conseguir que el sistema funcione bien, hacen que sea un framework muy cómodo de utilizar.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/11/29/catalyst-framework-web-para-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>haXe: metalenguaje para todos</title>
		<link>http://bosqueviejo.net/2011/11/15/haxe-metalenguaje-para-todos/</link>
		<comments>http://bosqueviejo.net/2011/11/15/haxe-metalenguaje-para-todos/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 10:44:55 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[haxe]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[metalenguaje]]></category>
		<category><![CDATA[neko]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1049</guid>
		<description><![CDATA[ Hace tiempo que vi este lenguaje de pasada y no le presté mucha atención, pero hoy, revisando algunas cosas, he vuelto a él y he visto algo que, antes quizás me habría parecido ridículo, pero ahora, después de ciertos acontecimientos, comienzo a verle mucho sentido.
El lenguaje haXe, se presenta como un meta-lenguaje, un lenguaje que se compila resultando en otro diferente, como pueda ser JavaScript, PHP, Java o Neko, por lo que puede emplear cualquier entorno de ejecución conocido por el programador. Dicho de otra forma, este es un lenguaje para dominarlos a todos&#8230;
El lenguaje
Echándole un vistazo a la sintaxis del lenguaje, podríamos decir que el lenguaje es muy parecido a JavaScript, pero con definición de tipos. La declaración es parecida a Pascal o Modula-2, usando dos puntos, pero sin embargo, la forma de los arrays es más como las plantillas de Java.
Las estructuras condicionales son las que están disponibles en lenguajes como PHP, C, Java y demás, con algunos matices, por ejemplo, con el uso de iteradores, con lo que el for es más parecido a Python o Java, por ejemplo. Tiene una forma tal que así:

import php.Lib;
&#160;
class Index &#123;
    static function main&#40;&#41; &#123;
  [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/haXe.jpg" alt="" title="haXe" width="150" height="150" class="alignleft size-full wp-image-1050" /> Hace tiempo que vi este lenguaje de pasada y no le presté mucha atención, pero hoy, revisando algunas cosas, he vuelto a él y he visto algo que, antes quizás me habría parecido ridículo, pero ahora, después de ciertos acontecimientos, comienzo a verle mucho sentido.</p>
<p>El <a href="http://haxe.org">lenguaje haXe</a>, se presenta como un meta-lenguaje, un lenguaje que se compila resultando en otro diferente, como pueda ser JavaScript, PHP, Java o Neko, por lo que puede emplear cualquier entorno de ejecución conocido por el programador. Dicho de otra forma, este es <em>un lenguaje para dominarlos a todos</em>&#8230;</p>
<h3>El lenguaje</h3>
<p>Echándole un vistazo a <a href="http://haxe.org/ref/syntax">la sintaxis del lenguaje</a>, podríamos decir que el lenguaje es muy parecido a JavaScript, pero con definición de tipos. La declaración es parecida a Pascal o Modula-2, usando dos puntos, pero sin embargo, la forma de los arrays es más como las plantillas de Java.</p>
<p>Las estructuras condicionales son las que están disponibles en lenguajes como PHP, C, Java y demás, con algunos matices, por ejemplo, con el uso de iteradores, con lo que el <em>for</em> es más parecido a Python o Java, por ejemplo. Tiene una forma tal que así:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">import</span> php.<span style="color: #660066;">Lib</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">class</span> Index <span style="color: #009900;">&#123;</span>
    static <span style="color: #003366; font-weight: bold;">function</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> p <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Point<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">65</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        trace<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">class</span> Point <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">:</span> Int<span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> y <span style="color: #339933;">:</span> Int<span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #003366; font-weight: bold;">new</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span>y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">=</span> x<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">=</span> y<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">function</span> toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;Point(&quot;</span><span style="color: #339933;">+</span>x<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;,&quot;</span><span style="color: #339933;">+</span>y<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;)&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Este código (tomado de su <a href="http://haxe.org/manual/2_types">web, sección de tipos</a>) se encarga de definir una clase Point, con un constructor que inicializa los atributos internos (x e y) y una función especial para representar el dato en modo texto (como en Java).</p>
<p>Lo suyo sería que se particionase como clases independientes, e incluso se creasen paquetes, una vez se programe en serio con el lenguaje.</p>
<h3>La compilación</h3>
<p>En Debian, el compilador viene en el repositorio. Llama la atención el hecho de que se instala de la mano de <a href="">Neko</a> (que es otro lenguaje similar, que se puede compilar en otros, pero que además tiene una VM propio e integración con Apache).</p>
<p>Generar el código visto anteriormente en PHP, es tan simple como ejecutar esto:</p>
<pre>
haxe -main Index -php www
</pre>
<p>Nos creará un directorio <em>www</em> en la ruta en la que estemos que tendrá un directorio <em>lib</em> y un <em>index.php</em> en la base con los comandos básicos para ejecutar el código programado. Lo podemos ejecutar desde consola (si tenemos el php-cli), así:</p>
<pre>
$ php www/index.php
Index.hx:6: Point(-1,65)
</pre>
<h3>Conclusiones</h3>
<p>Últimamente se van escuchando cada vez más lenguajes nuevos que salen, buenos lenguajes con muchas nuevas características que facilitan mucho la vida a los programadores, pero que, por el simple hecho de ser más completos, tienen una curva de aprendizaje más alta.</p>
<p>Lo que propone HaXe, en sí, es un solo lenguaje, un lenguaje muy completo, con todas las características de alto nivel que tienen todos los lenguajes, fácil y muy parecido a los lenguajes más usados de hoy en día, por lo que su entrada a él sea rápida, pero además, muy versátil, como los lenguajes <em>scriptting</em>, y ajustable a las necesidades de producción, gracias a que se puede compilar en C++, Java, C#, PHP, JavaScript, Flash y Neko.</p>
<p>En mi opinión, es una muy buena propuesta, ya que se podría emplear para generar el código necesario para realizar la web a nivel de servidor, cliente, e incluso algunos códigos a nivel de aplicación de escritorio, todo en un solo lenguaje.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/11/15/haxe-metalenguaje-para-todos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RSS: leyéndolos desde PHP y Rails</title>
		<link>http://bosqueviejo.net/2011/11/14/rss-leyendolos-desde-php-y-rails/</link>
		<comments>http://bosqueviejo.net/2011/11/14/rss-leyendolos-desde-php-y-rails/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 10:26:04 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1057</guid>
		<description><![CDATA[ Hace un tiempo hice un lector de RSS para poner noticias en una web, en Ruby on Rails, y me gustó la simpleza con la que se parsean los códigos y se pueden presentar las noticias, sin mucho esfuerzo, y apenas líneas de código. Unos días más tarde, me tocó hacerlo también en PHP&#8230; e aquí un ejemplo de simpleza de un framework, frente a un lenguaje.
Versión PHP
Empezaremos con la complicada. Este código se encarga de descargar el código del RSS y deserializar el XML en un array, para poder tratarlo a posteriori. El tratamiento lo haré en plan cutre, ya que me intentaré, sobretodo, basar en el proceso de descarga y deserialización.
Para esto, se requiere de una librería que no suele venir con PHP, pero sí está en PEAR, con lo que, se puede instalar fácilmente ejecutando la siguiente línea de comandos:

pear install XML_Serializer

Con esto, el código, en plan simple, sería el siguiente:

&#60;?php
&#160;
&#160;
include 'XML/Unserializer.php';
&#160;
function xml_to_array&#40; $data &#41; &#123;
    $options = array&#40;
        &#34;addDecl&#34;            =&#62; true,
        &#34;encoding&#34;      [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/rss-150x150.jpg" alt="" title="rss" width="150" height="150" class="alignleft size-thumbnail wp-image-1058" /> Hace un tiempo hice un lector de RSS para poner noticias en una web, en Ruby on Rails, y me gustó la simpleza con la que se parsean los códigos y se pueden presentar las noticias, sin mucho esfuerzo, y apenas líneas de código. Unos días más tarde, me tocó hacerlo también en PHP&#8230; e aquí un ejemplo de simpleza de un framework, frente a un lenguaje.</p>
<h3>Versión PHP</h3>
<p>Empezaremos con la complicada. Este código se encarga de descargar el código del RSS y deserializar el XML en un array, para poder tratarlo a posteriori. El tratamiento lo haré en plan <em>cutre</em>, ya que me intentaré, sobretodo, basar en el proceso de descarga y deserialización.</p>
<p>Para esto, se requiere de una librería que no suele venir con PHP, pero sí está en PEAR, con lo que, se puede instalar fácilmente ejecutando la siguiente línea de comandos:</p>
<pre>
pear install XML_Serializer
</pre>
<p>Con esto, el código, en plan simple, sería el siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
&nbsp;
<span style="color: #b1b100;">include</span> <span style="color: #0000ff;">'XML/Unserializer.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> xml_to_array<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">&quot;addDecl&quot;</span>            <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;encoding&quot;</span>           <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;utf-8&quot;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;mode&quot;</span>               <span style="color: #339933;">=&gt;</span> XML_SERIALIZER_MODE_SIMPLEXML<span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;indent&quot;</span>             <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;    &quot;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;linebreak&quot;</span>          <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;scalarAsAttributes&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;attributesArray&quot;</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'_a'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;contentName&quot;</span>        <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'_c'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;rootName&quot;</span>           <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'rss'</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$unserializer</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XML_Unserializer<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$unserializer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">unserialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$doc</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$unserializer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUnserializedData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$doc</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> xml_to_array<span style="color: #009900;">&#40;</span><span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http://www.debian.org/News/news'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;html&gt;
&lt;body&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;item&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$noticia</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    &lt;h1&gt;&lt;a href=&quot;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;link&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;title&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/a&gt;&lt;/h1&gt;
    &lt;p class=&quot;date&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;d/m/Y H:i&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">strtotime</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;dc:date&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/p&gt;
    &lt;p class=&quot;desc&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'description'</span><span style="color: #009900;">&#93;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/p&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/body&gt;
&lt;/html&gt;</pre></div></div>

<p>No pinta mal, conseguimos lo que nos proponemos sin tener muchas complicaciones.</p>
<h3>Ahora la versión <em>bonita</em></h3>
<p>En Rails las cosas siempre tienden a ser más simples, o al menos mucho más cortas, muestra de ello, es la versión del código anterior en versión Rails. Este sería:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> noticias
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rss/1.0'</span>
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rss/2.0'</span>
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'open-uri'</span>
&nbsp;
    source = <span style="color:#996600;">&quot;http://www.debian.org/News/news&quot;</span>
    content = <span style="color:#996600;">&quot;&quot;</span>
    <span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span>source<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>s<span style="color:#006600; font-weight:bold;">|</span> content = s.<span style="color:#9900CC;">read</span> <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#0066ff; font-weight:bold;">@rss</span> = <span style="color:#6666ff; font-weight:bold;">RSS::Parser</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span>content, <span style="color:#0000FF; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Aunque he puesto los <em>require</em> dentro de la función, realmente podrían ponerse en otro sitio (como en <em>environment.rb</em>) y no requieren de la instalación de ninguna gema extra. En la vista sería tan solo usar el código de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;% @rss.items.each do |i| %&gt;
    &lt;h1&gt;&lt;%= link_to i.title, i.link %&gt;&lt;/h1&gt;
    &lt;p class=&quot;date&quot;&gt;&lt;%=i.date.strftime(&quot;%d/%m/%Y %H:%M&quot;)%&gt;&lt;/p&gt;
    &lt;p class=&quot;desc&quot;&gt;&lt;%=simple_format(i.description)%&gt;&lt;/p&gt;
&lt;% end %&gt;</pre></div></div>

<p>Los <em>helpers</em> ayudan bastante en la creación del código, haciendo que los enlaces se hagan de forma simple, así como el formateado de la fecha, y el parseo del texto para HTML.</p>
<h3>Conclusiones</h3>
<p>He estado revisando el repositorio PEAR, donde he podido ver que había un par de paquetes de RSS, uno de ellos sin mantenimiento ya (<a href="http://pear.php.net/package/XML_RSS/redirected">XML_RSS</a>), y el resto de blogs que he visitado lo hacen como he mencionado, por lo que, obliga a conocer los distintos formatos de los que se van a rescatar noticias, ya sean Atom, RSS (la versión que corresponda), etc. Me parece que en este sentido Rails ha demostrado ser más serio o aplicado.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/11/14/rss-leyendolos-desde-php-y-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP: convirtiendo Fatal Errors en Excepciones</title>
		<link>http://bosqueviejo.net/2011/10/24/php-convirtiendo-fatal-errors-en-excepciones/</link>
		<comments>http://bosqueviejo.net/2011/10/24/php-convirtiendo-fatal-errors-en-excepciones/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 13:26:52 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[control de errores]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1020</guid>
		<description><![CDATA[ Uno de los problemas que surge cuando se usa PHP, es que muchas veces, se programa pensando en orientación a objetos y, de repente&#8230; un Fatal Error, algo tan ligado a la programación estructurada o incluso spaguetti nos ronda en un esquema que intentamos que sea lo más POO (u OOP) posible.
Después de realizar una pequeña búsqueda por Internet, he visto que, en la propia página de PHP, ya tienen medio resuelto el problema y, funciona bastante bien&#8230; según leo en un ejemplo de :

&#60;?php
function exception_error_handler&#40;$errno, $errstr, $errfile, $errline &#41; &#123;
    throw new ErrorException&#40;$errstr, 0, $errno, $errfile, $errline&#41;;
&#125;
set_error_handler&#40;&#34;exception_error_handler&#34;, E_USER_ERROR&#41;;
&#160;
/* Trigger exception */
strpos&#40;&#41;;
?&#62;

Si lanzamos la ejecución del código, veremos que ya no se sucede el típico Fatal Error, sino una excepción no capturada, con lo que, si envolviésemos el código strpos con try ... catch, obtendríamos que el programa ya no deja de funcionar.
Hay que tener en cuenta de que PHP no tiene solo errores, sino también noticas (NOTICE), avisos de elementos en desuso (DEPRECATED) y avisos (WARNING), que podría capturarse si no indicamos el parámetro E_USER_ERROR como segundo parámetro de set_error_handler.
¿Para cuándo lo incluirán este cómo como por defecto en la distribución estándar de PHP?
]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/bugs-150x150.jpg" alt="" title="bugs" width="150" height="150" class="alignleft size-thumbnail wp-image-1021" /> Uno de los problemas que surge cuando se usa PHP, es que muchas veces, se programa pensando en orientación a objetos y, de repente&#8230; un <em>Fatal Error</em>, algo tan ligado a la programación estructurada o incluso <em>spaguetti</em> nos ronda en un esquema que intentamos que sea lo más POO (u OOP) posible.</p>
<p>Después de realizar una pequeña búsqueda por Internet, he visto que, en la propia página de PHP, ya tienen medio resuelto el problema y, funciona bastante bien&#8230; según leo en un ejemplo de <a href=""></a>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">function</span> exception_error_handler<span style="color: #009900;">&#40;</span><span style="color: #000088;">$errno</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errstr</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errfile</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errline</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> ErrorException<span style="color: #009900;">&#40;</span><span style="color: #000088;">$errstr</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errno</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errfile</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errline</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">set_error_handler</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;exception_error_handler&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">E_USER_ERROR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Trigger exception */</span>
<span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Si lanzamos la ejecución del código, veremos que ya no se sucede el típico <em>Fatal Error</em>, sino una excepción no capturada, con lo que, si envolviésemos el código <tt>strpos</tt> con <tt>try ... catch</tt>, obtendríamos que el programa ya no deja de funcionar.</p>
<p>Hay que tener en cuenta de que PHP no tiene solo errores, sino también noticas (NOTICE), avisos de elementos en desuso (DEPRECATED) y avisos (WARNING), que podría capturarse si no indicamos el parámetro E_USER_ERROR como segundo parámetro de <tt>set_error_handler</tt>.</p>
<p>¿Para cuándo lo incluirán este cómo como <em>por defecto</em> en la distribución estándar de PHP?</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/24/php-convirtiendo-fatal-errors-en-excepciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>South: migraciones en Django</title>
		<link>http://bosqueviejo.net/2011/10/23/south-migraciones-en-django/</link>
		<comments>http://bosqueviejo.net/2011/10/23/south-migraciones-en-django/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 19:27:39 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[migraciones]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[south]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1015</guid>
		<description><![CDATA[ Bueno, cuando escribí el artículo sobre Django, fui bastante positivo con respecto al sistema de llevar los modelos a la base de datos, ya que, según parecía, el sistema propuesto por syncdb era automágico, pero realmente, lo único que se encarga de realizar es la creación de nuevos modelos que estén en el fichero de models.py.
Entonces, si estamos desarrollando y, por arte y gracia del destino necesitamos de una nueva columna en una tabla&#8230; y peor aún, si el sistema ya está en producción, ¿cómo lo hacemos?
¡South al rescate!
South es un sistema de migraciones parecido al que viene con Rails, solo que: es automático.
El sistema se basa en la creación (y activación) del sistema de migraciones por aplicación. Cuando se activa, se crea un subdirectorio de migrations en la aplicación, donde se almacenan ficheros de migración. En principio, se agregan las migraciones necesarias para la creación de los modelos que se hayan agregado en el fichero models.py nada más comenzar.
Esto se consigue, antes de ejecutar el comando syncdb, algo como esto:

./manage.py schemamigration myapp --initial

Siendo myapp el nombre de la aplicación sobre la que se quiere activar el sistema de migraciones.
Y en el momento que se tenga que cambiar alguna [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/django-south.jpg" alt="" title="django-south" width="150" height="150" class="alignleft size-full wp-image-1016" /> Bueno, cuando escribí el <a href="http://bosqueviejo.net/2011/10/16/django-web-muy-facil-y-muy-sencilla/">artículo sobre Django</a>, fui bastante positivo con respecto al sistema de llevar los modelos a la base de datos, ya que, según parecía, el sistema propuesto por <em>syncdb</em> era <em>automágico</em>, pero realmente, lo único que se encarga de realizar es la creación de nuevos modelos que estén en el fichero de <tt>models.py</tt>.</p>
<p>Entonces, si estamos desarrollando y, por arte y gracia del destino necesitamos de una nueva columna en una tabla&#8230; y peor aún, si el sistema ya está en producción, ¿cómo lo hacemos?</p>
<h3>¡South al rescate!</h3>
<p>South es un sistema de migraciones parecido al que viene con Rails, solo que: es automático.</p>
<p>El sistema se basa en la creación (y activación) del sistema de migraciones por aplicación. Cuando se activa, se crea un subdirectorio de migrations en la aplicación, donde se almacenan ficheros de migración. En principio, se agregan las migraciones necesarias para la creación de los modelos que se hayan agregado en el fichero <tt>models.py</tt> nada más comenzar.</p>
<p>Esto se consigue, antes de ejecutar el comando <em>syncdb</em>, algo como esto:</p>
<pre>
./manage.py schemamigration myapp --initial
</pre>
<p>Siendo <em>myapp</em> el nombre de la aplicación sobre la que se quiere activar el sistema de migraciones.</p>
<p>Y en el momento que se tenga que cambiar alguna de las tablas, para realizar la agregación o cambio de algún campo (o la eliminación, claro), tan solo hay que grabar el fichero <tt>models.py</tt> con el cambio y ejecutar en consola:</p>
<pre>
./manage.py schemamigration myapp --auto
</pre>
<p>En este punto, el sistema agrega una migración con los cambios a insertar en la base de datos para realizar el cambio del estado de las tablas en la versión anterior para adecuarlo a la definición actual.</p>
<p>Cuando se ejecuta <em>syncdb</em> el sistema informa de que no puede hacer nada con esa aplicación y que se debe de ejecutar <em>migrate</em> para realizar las migraciones. En este punto ya es donde se comienza a ver y notar el parecido con Rails, ya que el comando es exactamente el mismo, la única diferencia, es que no hemos tenido ni que crear ni que escribir ningún fichero (salvo el conocido <tt>models.py</tt>).</p>
<p>La única pega, de momento, con este sistema, es que si nos equivocamos, no podemos echar atrás una migración. La única forma de avanzar, al igual que con los sistemas de control de versiones, es deshacer lo que queramos en el fichero de <tt>models.py</tt> y volver a crear una nueva migración.</p>
<h3>Desde el principio&#8230; ¿cómo se instala esto?</h3>
<p>La parte buena, es que se instala fácilmente con el siguiente comando:</p>
<pre>
easy_install South
</pre>
<p>El paquete está publicado en el <a href="http://pypi.python.org/pypi">Cheese Shop</a>, con lo que, se baja e instala de forma fácil. Para que esté disponible en nuestro proyecto, solo tenemos que agregarlo al <tt>settings.py</tt> (la aplicación <tt>south</tt>), y ya estarán disponibles los comandos para <tt>manage.py</tt>.</p>
<p>Si la aplicación sobre la que queremos usar las migraciones ya existe y se han creado modelos con <em>syncdb</em>, en caso de crear la primera migración, puede pasar que al ejecutar <em>migrate</em>, el sistema falle diciendo que la tabla que se intenta crear ya existe. Esto es porque, cuando el proyecto ya existe y se ha usado <em>syncdb</em> para la aplicación en concreto, necesita la ejecución del siguiente comando a nivel de consola:</p>
<pre>
./manage.py convert_to_south myapp
</pre>
<p>Con esto, el sistema toma como realizada la migración inicial y puedes seguir a partir de ahí.</p>
<h3>Conclusiones</h3>
<p>Django es un buen sistema para desarrollo de aplicaciones web, como ya dije anteriormente. Como muchos otros frameworks para desarrollo de aplicaciones web, tiene sus carencias, pero afortunadamente, si se revisa un simple <tt>pip search django</tt>, donde puede observar que, aparte de lo que viene por defecto con Django, se pueden agregar muchas extensiones muy útiles al sistema&#8230; como South.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/23/south-migraciones-en-django/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CoffeeScript: haciendo fácil JavaScript</title>
		<link>http://bosqueviejo.net/2011/10/21/coffeescript-haciendo-facil-javascript/</link>
		<comments>http://bosqueviejo.net/2011/10/21/coffeescript-haciendo-facil-javascript/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 16:54:56 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[coffeescript]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=996</guid>
		<description><![CDATA[ Después de leer la liberación de Rails 3.1, me topé con que trae por defecto este sistema para facilitar la escritura de código JavaScript. Es curioso que lo traiga activo por defecto, ya que hay muchos a los que les gusta el lenguaje JavaScript y pueden haberse tomado mal esta decisión&#8230; no obstante yo lo veo bastante acertado, más que nada porque el código de CoffeeScript me resulta muy claro y limpio, en comparación con JavaScript y, lo mejor de todo, es que resulta incluso hasta más fácil de portar entre navegadores.
En principio, si consideramos algo tan simple como el famoso heredoc, que en JavaScript no está soportado, en CoffeeScript es posible de la siguiente forma:

datos = '''
     Estimado lector,
&#160;
     esta es una carta....
     '''

O algo típico como:

potencia = (x, y) -&#62;
    a = 1
    for i in [1..y]
        a *= x
    a
&#160;
alert potencia(5, 2)

Pero no es un nuevo lenguaje que vayan a soportar los navegadores, realmente es una abstracción que finalmente se traduce a JavaScript (ya sea por parte del [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/coffeescript_logo.png" alt="" title="coffeescript_logo" width="128" height="128" class="alignleft size-full wp-image-1012" /> Después de leer la liberación de Rails 3.1, me topé con que trae por defecto este sistema para facilitar la escritura de código JavaScript. Es curioso que lo traiga activo por defecto, ya que hay muchos a los que les gusta el lenguaje JavaScript y pueden haberse tomado mal esta decisión&#8230; no obstante yo lo veo bastante acertado, más que nada porque el código de <a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a> me resulta muy claro y limpio, en comparación con JavaScript y, lo mejor de todo, es que resulta incluso hasta más fácil de portar entre navegadores.</p>
<p>En principio, si consideramos algo tan simple como el famoso <em>heredoc</em>, que en JavaScript no está soportado, en CoffeeScript es posible de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="coffeescript" style="font-family:monospace;">datos = '''
     Estimado lector,
&nbsp;
     esta es una carta....
     '''</pre></div></div>

<p>O algo típico como:</p>

<div class="wp_syntax"><div class="code"><pre class="coffeescript" style="font-family:monospace;">potencia = (x, y) -&gt;
    a = 1
    for i in [1..y]
        a *= x
    a
&nbsp;
alert potencia(5, 2)</pre></div></div>

<p>Pero no es un nuevo lenguaje que vayan a soportar los navegadores, realmente es una abstracción que finalmente se traduce a JavaScript (ya sea por parte del servidor o del cliente a través de las librerías de javascript correspondientes) y se usa en el navegador. Eso sí, el lenguaje es más completo, ya que incluye cosas que JavaScript no tiene por defecto, y más claro, ya que usa la sintaxis de palabra sobre símbolo (equivalente al <em>use english</em> de Perl).</p>
<p>En la página web oficial de CoffeeScript podemos encontrar un manual extenso y lleno de ejemplos del lenguaje, con su equivalencia en JavaScript. La mayoría de trozos se notan más claros y escuetos en CoffeeScript. No obstante, es lógico que una persona que esté más habituada a leer y escribir código en JavaScript, lo que le costará es ver el acercamiento que intenta realizar este lenguaje.</p>
<p>La sintaxis recuerda un poco a YAML, y por ende a Python, ya que requiere de una indentación para identificar de que pende cada instrucción. Así mismo, en su carencia de la palabra clave <em>return</em>, se parece también un poco Ruby. El uso de las funciones se ha asemejado a las <em>lambda</em> que integran ahora muchos lenguajes (Java se espera que lo tenga para su versión 8 ) y que emplea la flecha o símbolo de conclusión lógica (que es también usado para la definición de funciones en Erlang).</p>
<p>Como buen lenguaje de scripting no requiere que se declare ninguna variable, a diferencia de algunas implementaciones de JavaScript, donde es requerido, sobretodo para fijar el alcance de la misma, y hace uso de las post-condiciones, tal y como se puede ver en Perl y Ruby, en trozos como:</p>

<div class="wp_syntax"><div class="code"><pre class="coffeescript" style="font-family:monospace;">dato = 5 if valor &gt; 5 and valor &lt; 10</pre></div></div>

<p>Es una de las mejoras que se integran en Ruby 3.1, por lo que, se puede probar en ese mismo entorno, o instalándolo directamente o a través del sistema de NodeJS. El sistema contiene un compilador o traductor que toma el código fuente y lo transforma en las librerías JavaScript necesarias para la página web, por lo que no penaliza el rendimiento de la propia página en sí.</p>
<p>Decir que, en mi parecer, el hecho de que sea un lenguaje que se compila a otro da la buena fe y esperanza de que el código generado sea estándar para todos los navegadores, así como la facilidad de que la implementación del mismo parte de un solo sitio, de una sola definición muy trabajada por el autor. Seguiremos de cerca su evolución.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/21/coffeescript-haciendo-facil-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Egg: huevos de Python</title>
		<link>http://bosqueviejo.net/2011/10/21/egg-huevos-de-python/</link>
		<comments>http://bosqueviejo.net/2011/10/21/egg-huevos-de-python/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 23:28:41 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[egg]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1002</guid>
		<description><![CDATA[ Tal y como Ruby tiene sus gemas, PHP su PEAR y PECL, PERL su CPAN, &#8230; pues Python, tiene huevos&#8230; vamos, extensiones a las que llama egg.
Cuando un desarrollador realiza un desarrollo que quiere compartir con el mundo, normalmente, lo empaqueta de alguna forma y lo sube a Internet de alguna forma. A día de hoy, es muy común ver mucho código subido a sitios como PHPClasses, PEAR, RubyGems, Cheese Shop, SourceForge, GitHub, BitBucket, etc.
El empaquetado es algo en lo que, cada lenguaje pone un cierto estándar para facilitar la vida a los programadores y usuarios finales de ese código. Es muy común también, ver que muchas veces se empaqueta en ficheros de tipo phar, jar, gem, egg o los más conocidos tar.gz, tar.bz2 y zip. Cada lenguaje pone sus preferencias y convenciones.
La tienda de quesos
El índice general de paquetes Python (donde la gente suele subir sus códigos para compartirlos con la comunidad, suele ser lo que se conoce como Cheese Shop (la tienda de quesos). En este sitio, cada desarrollador puede darse de alta y subir sus códigos de modo que estén disponibles para el instalador de paquetes de Python.
El comando easy_install
La forma más fácil de instalar un [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/python_eggs-150x150.jpg" alt="" title="python_eggs" width="150" height="150" class="alignleft size-thumbnail wp-image-1003" /> Tal y como Ruby tiene sus gemas, PHP su PEAR y PECL, PERL su CPAN, &#8230; pues Python, tiene huevos&#8230; vamos, extensiones a las que llama <em>egg</em>.</p>
<p>Cuando un desarrollador realiza un desarrollo que quiere compartir con el mundo, normalmente, lo empaqueta de alguna forma y lo sube a Internet de alguna forma. A día de hoy, es muy común ver mucho código subido a sitios como <a href="http://www.phpclasses.org/">PHPClasses</a>, <a href="http://pear.php.net">PEAR</a>, <a href="http://rubygems.org">RubyGems</a>, <a href="http://www.python.org/pypi">Cheese Shop</a>, <a href="http://sourceforge.net">SourceForge</a>, <a href="http://github.com">GitHub</a>, <a href="http://bitbucket.org">BitBucket</a>, etc.</p>
<p>El empaquetado es algo en lo que, cada lenguaje pone un cierto estándar para facilitar la vida a los programadores y usuarios finales de ese código. Es muy común también, ver que muchas veces se empaqueta en ficheros de tipo <em>phar</em>, <em>jar</em>, <em>gem</em>, <em>egg</em> o los más conocidos <em>tar.gz</em>, <em>tar.bz2</em> y <em>zip</em>. Cada lenguaje pone sus preferencias y convenciones.</p>
<h3>La tienda de quesos</h3>
<p>El índice general de paquetes Python (donde la gente suele subir sus códigos para compartirlos con la comunidad, suele ser lo que se conoce como <a href="http://www.python.org/pypi">Cheese Shop</a> (la tienda de quesos). En este sitio, cada desarrollador puede darse de alta y subir sus códigos de modo que estén disponibles para el instalador de paquetes de Python.</p>
<h3>El comando <em>easy_install</em></h3>
<p>La forma más fácil de instalar un huevo de Python, es emplear el comando <em>easy_install</em>, simplemente se ejecuta lo siguiente:</p>
<pre>easy_install django</pre>
<p>El sistema se conecta al índice general de paquetes y descarga el paquete indicado, así como lo instala una vez ha conseguido bajarlo. En el caso del ejemplo, bajaría el paquete de django, y lo instalaría sin problemas.</p>
<h3>El gestor de paquetes de Python: pip</h3>
<p>No obstante, para poder instalar de forma local (o vía URL) un paquete, o desinstalarlo, u obtener información del mismo, necesitamos otro comando más completo como este: <em>pip</em>; este comando se encarga de desempaquetar el huevo e instalarlo en el sistema.</p>
<p>Estos comandos se encuentra con el <em>setuptools</em> de Python, que generalmente se instala en todos los sistemas base Python que vienen instalados por defecto en la mayoría de distribuciones GNU/Linux. En MacOS X suele venir por defecto <em>easy_install</em>, y ejecutando lo siguiente, se puede instalar el comando <em>pip</em>:</p>
<pre>easy_install pip</pre>
<p>Los comandos, según la opción <em>help</em> de <em>pip</em>, son los siguientes:</p>
<ul>
<li><strong>freeze</strong>: muestra los paquetes instalados.</li>
<li><strong>install</strong>: instala un paquete <em>egg</em></li>
<li><strong>search</strong>: busca un paquete <em>egg<7em> en el sistema de índices (tiemda de queso).</li>
<lit><strong>uninstall</strong>: desinstala un paquete</strong></li>
<li><strong>zip/unzip</strong>: comprime o descomprime, respectivamente, un paquete.</li>
</ul>
<h3>Conclusiones</h3>
<p>La interfaz de la instalación de paquetes es bastante simple, pero tiene todas las características que sus homónimos en otros lenguajes de programación, por lo que es un buen punto de partida para codificar, sin repetirse (DRY <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ).</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/21/egg-huevos-de-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django: web muy fácil y muy sencilla</title>
		<link>http://bosqueviejo.net/2011/10/16/django-web-muy-facil-y-muy-sencilla/</link>
		<comments>http://bosqueviejo.net/2011/10/16/django-web-muy-facil-y-muy-sencilla/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 16:48:59 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[cal henderson]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[djangocon]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=983</guid>
		<description><![CDATA[ En estos días he estado más volcado en Python y Django. Quizás sea por acercar un poco más y mejor a lo que hace gente como Demoware, o quizás sea por puro vicio&#8230; ya eso lo dejo a opinión popular  
El hecho, es que llevo unos tres años desarrollando en Rails (no cada día pero sí de forma más o menos asidua), y me interesé en ver qué tenía de bueno Django que pudiese aprovechar en algunos proyectos en lugar de hacerlos todos siempre en Rails, no porque Rails no me guste, sino porque, desde el punto de vista de administración de sistemas, sí es verdad que Rails es más pesado de instalar y mantener que Django (Python).
A vista de pájaro
En principio, la página web oficial de Django ofrece una gran información con tutoriales y un manual muy completo sobre el framework. El tutorial que ofrece da un repaso completo a la base de Django y te permite introducirte de forma rápida en el framework.
Lo primero que sorprende, es que la generación del proyecto base son&#8230; ¡4 ficheros!&#8230; el fichero de configuración (settings.py), el fichero de administración (para los comandos de consola y demás, manage.py), el fichero de [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/django_logo.jpeg" alt="" title="django_logo" width="120" height="120" class="alignleft size-full wp-image-984" /> En estos días he estado más volcado en Python y Django. Quizás sea por acercar un poco más y mejor a lo que hace gente como <a href="http://bosqueviejo.net/2011/10/07/demonware-videojuegos-y-erlang/">Demoware</a>, o quizás sea por puro vicio&#8230; ya eso lo dejo a opinión popular <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>El hecho, es que llevo unos tres años desarrollando en Rails (no cada día pero sí de forma más o menos asidua), y me interesé en ver qué tenía de bueno Django que pudiese aprovechar en algunos proyectos en lugar de hacerlos todos siempre en Rails, no porque Rails no me guste, sino porque, desde el punto de vista de administración de sistemas, sí es verdad que Rails es más pesado de instalar y mantener que Django (Python).</p>
<h3>A vista de pájaro</h3>
<p>En principio, la página web oficial de Django ofrece una gran información con tutoriales y un manual muy completo sobre el framework. El tutorial que ofrece da un repaso completo a la base de Django y te permite introducirte de forma rápida en el framework.</p>
<p>Lo primero que sorprende, es que la generación del proyecto base son&#8230; ¡4 ficheros!&#8230; el fichero de configuración (<em>settings.py</em>), el fichero de administración (para los comandos de consola y demás, <em>manage.py</em>), el fichero de rutas (<em>urls.py</em>) y el típico fichero <em>__init__.py</em> para indicar que el directorio es un paquete.</p>
<p>Otra de las cosas que cambian con respecto de los sistemas <em>rails-like</em> es el concepto de <em>aplicación</em>. En Django pueden existir, para un proyecto, varias aplicaciones, y cada aplicación está lo suficiente encapsulada como para poder instalarse en cualquier proyecto.</p>
<p>Esto quiere decir que podríamos crear (o instalar) una aplicación para blog, otra para foro y otra para galería de fotos, por ejemplo, y esas aplicaciones se podrían seguir usando no solo en ese proyecto, sino también en otros.</p>
<p>El tema de las rutas es muy parecido a todos los demás sistemas que he visto, salvo por el tema de que puede fraccionarse de modo que cada aplicación pueda tener su propio enrutado. El enrutado es por URI, por lo que no tiene nada que ver con dominios y se pueden establecer <em>bases</em>, para cuando se cargue una aplicacion, que sus URIs se completen anteponiendo esa base.</p>
<p>Una de las cosas que más sorprende, que he visto en casi ningún framework, es una interfaz de administración configurable. Con gestión de usuarios, grupos y perfiles de usuarios por defecto, así como un sistema <em>scaffold</em> para poder gestionar los datos de los modelos que se quieran administrar, con la posibilidad de definir, incluso, la forma en la que se presentarán los campos.</p>
<p>Por último, el tema de los modelos, tiene como buena base el hecho de que se define cada tabla en cada fichero específico de modelos dentro de cada aplicación, y con un simple <em>syncdb</em> desde consola, el sistema lee la definición de los modelos, la definición de las tablas en la base de datos, y realiza las modificaciones pertinentes. En este  sentido, parece mucho más claro y limpio que las migraciones de rails, o la generación de modelos de doctrine.</p>
<h3>Rendimiento</h3>
<p>No he podido aún realizar las pruebas que lo verifiquen, pero dada la fuente, le daré credibilidad como para describirlo o comentarlo al menos. Según parece, el rendimiento de tres frameworks comparados con las mismas pruebas e incluso optimizaciones, resulta que Django queda a la cabeza, justo delante de Rails y finalizando la lista Symfony.</p>
<p>Esto realmente me ha asombrado bastante, ya que consideraba que PHP, en este sentido, e incluso usando extensiones como APC, sería mucho más rápido que Rails y Django. No obstante, hay que tener en cuenta ciertos aspectos claves. El primero, es que, por ejemplo, Rails, cachea el código <em>compilado</em> de los modelos, controladores y vistas en el demonio que sirve las páginas, de modo que cada ejecución aislada, cada petición, hace uso de ese código listo para ejecutarse.</p>
<p>Lo mismo sucede con Python, en general, se pueden ver ficheros con la extensión <em>pyc</em>, que indican que el código se ha compilado y queda listo para su ejecución directa.</p>
<p>El estudio completo puede verse <a href="">aquí</a>.</p>
<h3>Entonces, ¿por qué odio Django?</h3>
<p>No, no lo odio, es el título de una presentación que hizo Cal Henderson en el Djangocon de 2008 con ese mismo título (pero en inglés): <a href="http://www.bestechvideos.com/2009/04/08/djangocon-2008-keynote-cal-henderson">Why I hate Django?</a></p>
<p><iframe width="420" height="315" src="http://www.youtube.com/embed/i6Fr65PFqfk" frameborder="0" allowfullscreen></iframe></p>
<p>En sí, es un gran forofo de Django y Python, su conferencia termina siendo más una parodia que una crítica real, y viene motivada por tres factores:</p>
<ul>
<li><strong>El equipo</strong>: humano que realiza Django. Lo critica porque, comparado con el creador de Stuts (que tiene&#8230; ¡¡¡barba!!!), o el equipo de Rails (que se puede comparar a Michael Knight), el equipo de Django lo compara o ve como si fuese un grupo de música o algo sin forma&#8230; vamos, que no se vende bien.</li>
<li><strong>El lenguaje</strong>: ya que no es una moda, el lenguaje tiene algo que <em>preocupa</em> a los programadores, y es que no se pueden hacer cosas como con un lenguaje serio, como Perl (que es <em>organizar el código a su forma</em>)&#8230; Python restringe el formato de escritura y no está de moda como Ruby, Haskell, Erlang o Scala.</li>
<li><strong>El framework</strong>: tenemos a Struts (estructuras), tenemos a Rails (raíles), &#8230; tenemos a Django&#8230; ¿sin logo ni mascota?&#8230; eso  no es serio&#8230; aunque haya intentos de buscar mascotas como la de los <a href="http://djangopony.com/">ponies</a>.</li>
</ul>
<p>Una posible mascota para Django es el pony (más parecido a un pegaso de Barbie), junto al slogan: <em>el framework web para ponies con poderes mágicos</em>.</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/pink_mascot.jpg" alt="" title="pink_mascot" width="300" height="150" class="aligncenter size-full wp-image-990" /></p>
<h3>Conclusiones</h3>
<p>Bueno, es domingo, lo único que puedo decir es que, junto con Rails, Django es uno de los mejores frameworks en los que he desarrollado y de los que más me gustan para la realización de interfaces web. El código resultante se basa en el concepto <a href="http://es.wikipedia.org/wiki/No_te_repitas">DRY</a>, por lo que, si se sabe aprovechar al máximo la creación de aplicaciones, se puede llegar a ese punto que quieren llegar muchas empresas de <em>hacer webs como churros</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/16/django-web-muy-facil-y-muy-sencilla/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Demonware: videojuegos y Erlang</title>
		<link>http://bosqueviejo.net/2011/10/07/demonware-videojuegos-y-erlang/</link>
		<comments>http://bosqueviejo.net/2011/10/07/demonware-videojuegos-y-erlang/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 05:00:35 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[demonware]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[videojuegos]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=954</guid>
		<description><![CDATA[ Demonware es una división de Activision y Blizzard, encargada de desarrollar la parte de cliente-servidor para que los jugadores online puedan echar sus partidas con los amigos.
En su presentación en la Erlang Factory de Londres de 2011, Demonware preparó una presentación de Erlang and First-Person Shooters.
En resumen, ya que el documento es bastante gráfico e interesante de ver, Demonware es una empresa que se dedica a dar soporte de servidor a videojuegos multi-jugador de Activision y Blizzard. No solo la parte en sí del juego, sino también el chat y audio/vídeo que se puede activar en algunos juegos, así como sistemas anti-trampas, etc.
Los juegos que mantienen en sus servidores van desde Call of Duty (todas las entregas), pasando por Guitar Hero (y derivados), hasta otros como Blur y Marvel Ultimate Alliance 2.
Para hacernos una idea de su crecimiento y tecnologías:


Año
Tecnología
Usuarios concurrentes


2005
C++/C++/MySQL
80


2006
C++/Python/MySQL
1,000


2007
Erlang/Python/MySQL
20,000


2007+
2,500,000


Según la empresa, si el cambio no se hubiese realizado, la crisis podría haber sido un desastre, ya que el paso de mil a 20 mil usuarios se realizó con una sola salida al mercado, la de Call Of Duty 4: Modern Warfare.
Terminan la presentación, comentando algunas cosas que han aprendido con la práctica, que son bastante interesante, a [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/DW-Banner-centre.png" alt="" title="demonware logo" width="160" height="160" class="alignleft size-full wp-image-955" /> <a href="http://www.demonware.net/">Demonware</a> es una división de Activision y Blizzard, encargada de desarrollar la parte de cliente-servidor para que los jugadores online puedan <em>echar sus partidas</em> con los amigos.</p>
<p>En su <a href="http://www.erlang-factory.com/upload/presentations/395/ErlangandFirst-PersonShooters.pdf">presentación</a> en la <a href="http://www.erlang-factory.com/conference/London2011">Erlang Factory de Londres de 2011</a>, Demonware preparó una presentación de <em>Erlang and First-Person Shooters</em>.</p>
<p>En resumen, ya que el documento es bastante gráfico e interesante de ver, Demonware es una empresa que se dedica a dar soporte de servidor a videojuegos multi-jugador de Activision y Blizzard. No solo la parte en sí del juego, sino también el chat y audio/vídeo que se puede activar en algunos juegos, así como sistemas anti-trampas, etc.</p>
<p>Los juegos que mantienen en sus servidores van desde <strong>Call of Duty</strong> (todas las entregas), pasando por <strong>Guitar Hero</strong> (y derivados), hasta otros como <strong>Blur</strong> y <strong>Marvel Ultimate Alliance 2</strong>.</p>
<p>Para hacernos una idea de su crecimiento y tecnologías:</p>
<table>
<tr>
<th>Año</th>
<th>Tecnología</th>
<th>Usuarios concurrentes</th>
</tr>
<tr>
<td>2005</td>
<td>C++/C++/MySQL</td>
<td>80</td>
</tr>
<tr>
<td>2006</td>
<td>C++/Python/MySQL</td>
<td>1,000</td>
</tr>
<tr>
<td>2007</td>
<td rowspan="2">Erlang/Python/MySQL</td>
<td>20,000</td>
</tr>
<tr>
<td>2007+</td>
<td>2,500,000</td>
</tr>
</table>
<p>Según la empresa, si el cambio no se hubiese realizado, la crisis podría haber sido un desastre, ya que el paso de mil a 20 mil usuarios se realizó con una sola salida al mercado, la de <strong>Call Of Duty 4: Modern Warfare</strong>.</p>
<p>Terminan la presentación, comentando algunas cosas que han aprendido con la práctica, que son bastante interesante, a la par que útiles. Nada, lo dicho, recomiendo su visualización.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/07/demonware-videojuegos-y-erlang/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

