<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Novanebula blog - Programación</title>
    <link>http://www.novanebula.net/blog/</link>
    <description>Noticias</description>
    <dc:language>es</dc:language>
    <generator>Serendipity 1.2.1 - http://www.s9y.org/</generator>
    <pubDate>Mon, 13 Oct 2008 17:51:00 GMT</pubDate>

    <image>
        <url>http://www.novanebula.net/blog/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Novanebula blog - Programación - Noticias</title>
        <link>http://www.novanebula.net/blog/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>El cache de Smarty</title>
    <link>http://www.novanebula.net/blog/archives/105-El-cache-de-Smarty.html</link>
            <category>Articulos programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/105-El-cache-de-Smarty.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=105</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=105</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    Smarty es un sistema de plantillas diseñado para acelerar la presentación de las páginas html. Para poder emplear la cache simplemente debes instalar smarty en tu frameword de desarrollo e introducir las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
$plantilla = new Smarty;&lt;br /&gt;
$plantilla-&gt;caching = 1; //Activa la cache&lt;br /&gt;
$plantilla-&gt;display(&#039;planilla.tpl&#039;); //El fichero planilla.tpl debe contener la planilla a devolver&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible llamar a&lt;br /&gt;
&lt;br /&gt;
$html = $plantilla-&gt;fetch(&#039;planilla.tpl&#039;);&lt;br /&gt;
&lt;br /&gt;
Para no volcar al navegador el html y tenerlo almacenado en la variable $html.&lt;br /&gt;
&lt;br /&gt;
Antes de llamar a display o a fetch podemos modificar el comportamiento del sistema de caché de smarty&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;cache_dir = &#039;/tmp/smarty/&#039;;&lt;br /&gt;
&lt;br /&gt;
Grabará las planillas cacheadas en este directorio (smarty cachea el contenido en disco por defecto)&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;cache_lifetime = 300;&lt;br /&gt;
&lt;br /&gt;
El contenido permanece en cache 5 minutos (300 segundos) antes de ser reemplazado. El valor por defecto es una hora.&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;compile_check = true; &lt;br /&gt;
&lt;br /&gt;
Verifica si la plantilla ha sido actualizada desde la última vez que se regeneró la caché. Introduce una pequeña sobrecarga al tener que averiguar y comparar la fecha de modificación de la plantilla.&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;force_compile = true;&lt;br /&gt;
&lt;br /&gt;
Siempre regenerará la cache&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;is_cached(&#039;plantilla.tpl&#039;);&lt;br /&gt;
&lt;br /&gt;
Detecta si una plantilla está en el cache o no.&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;assign(&#039;variable&#039;,$var);&lt;br /&gt;
&lt;br /&gt;
La plantilla puede ahora leer la variable $var, con el nombre {variable} generando así contenido realmente dinámico&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;clear_cache(&#039;plantilla.tpl&#039;);&lt;br /&gt;
&lt;br /&gt;
Elimina la cache para esta plantilla&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;clear_all_cache();&lt;br /&gt;
&lt;br /&gt;
Elimina todas las caches (en el directorio de cache)&lt;br /&gt;
&lt;br /&gt;
Es posible eliminar el cache por grupos de plantillas. Estos grupos de plantillas se pueden definir de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;display(&#039;index.tpl&#039;,&#039;sports|basketball&#039;);&lt;br /&gt;
&lt;br /&gt;
Y entonces borrar la caché del grupo sports|basketball así:&lt;br /&gt;
&lt;br /&gt;
$smarty-&gt;clear_cache(null,&#039;sports|basketball&#039;);&lt;br /&gt;
&lt;br /&gt;
o borrar sólo el index.tpl del grupo sports|basketball así:&lt;br /&gt;
&lt;br /&gt;
$smarty-&gt;clear_cache(&#039;index.tpl&#039;,&#039;sports|basketball&#039;);&lt;br /&gt;
&lt;br /&gt;
Funcionando como una especie de espacio de nombres&lt;br /&gt;
&lt;br /&gt;
Es posible introducir contenido no cacheable dentro de una plantilla cacheada utilizando {insert}.&lt;br /&gt;
&lt;br /&gt;
{insert} funciona de una manera idéntica a {include} con la particularidad de su comportamiento ante el cache.&lt;br /&gt;
&lt;br /&gt;
Veamos como funciona con un ejemplo&lt;br /&gt;
&lt;br /&gt;
{insert name=&quot;obtenerPublicidad&quot; localizacion=#banner_location_id# id=#site_id#}&lt;br /&gt;
&lt;br /&gt;
Lo que hará a continuación smarty será llamar a la funcion insert_obtenerPublicidad, que debes tener definida en tu código, pasandole como argumento un array asociativo.&lt;br /&gt;
&lt;br /&gt;
Suponiendo que #banner_location_id# valga 5 y #site_id# valga 8. Se ejecutará:&lt;br /&gt;
&lt;br /&gt;
insert_obtenerPublicidad(array(&#039;localizacion&#039;= &amp;gt; &#039;5&#039; , &#039;id&#039;= &amp;gt &#039;8&#039;));&lt;br /&gt;
&lt;br /&gt;
y lo que devuelva esta función será añadido en la plantilla.&lt;br /&gt;
&lt;br /&gt;
Para saber más sobre &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.smarty.net/manual/es/caching.php&#039;);&quot;  href=&quot;http://www.smarty.net/manual/es/caching.php&quot;&gt;smarty y su sistema de cache&lt;/a&gt; visita su página oficial.&lt;br /&gt;
&lt;br /&gt;
Otros métodos para acelerar tu servidor web a otros niveles son &lt;a href=&quot;http://www.novanebula.net/blog/archives/94-Memcache.html&quot;&gt;memcache&lt;/a&gt;, &lt;a href=&quot;http://www.novanebula.net/blog/archives/102-XCache.html&quot;&gt;x-cache&lt;/a&gt; o apc.&lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Mon, 13 Oct 2008 19:51:00 +0200</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/105-guid.html</guid>
    
</item>
<item>
    <title>XCache</title>
    <link>http://www.novanebula.net/blog/archives/102-XCache.html</link>
            <category>Programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/102-XCache.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=102</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=102</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    Xcache es una librería que sirve para almacenar en cache los códigos de operación de nuestros scripts php. Aunque esta frase pueda parecer algo oscuro y difícil de entender sólo significa que tendremos pre-parseados e interpretados nuestros scripts por el core de php. De manera que en ejecuciones posterires no hará falta pasar por todas las fases de validación, análisis, tratamiento e interpretación del código. Nos encontramos pues ante una especie de compilación de código php. Lo mejor es que el código no está realmente compilado y podemos modificarlo de la forma habitual forzando que se recree el cache sólo para los scripts que hemos modificado.&lt;br /&gt;
&lt;br /&gt;
De esta manera se optimiza el rendimiento de las páginas php en los servidores. Almacenando en RAM (shm) de cache el estado compilado de los scripts php se ahorra tiempo de compilación. Según sus desarrolladores es posible obtener hasta 5 veces más de velocidad en la generación de páginas.&lt;br /&gt;
&lt;br /&gt;
La página oficial de Xcache es la siguiente: &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/xcache.lighttpd.net/&#039;);&quot;  href=&quot;http://xcache.lighttpd.net/&quot;&gt;Xcache&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Actualmente se encuentra en versión estable y sólo disponible para linux. Soporta varias versiones de php desde la 4.3 hasta la 5.3 (e incluso para pre versiones de &lt;a href=&quot;http://www.novanebula.net/blog/archives/98-PHP-6.html&quot;&gt;php6&lt;/a&gt;). Extrañamente no es soportado para la versión 5.0. 
    </content:encoded>

    <pubDate>Fri, 08 Aug 2008 22:22:00 +0200</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/102-guid.html</guid>
    
</item>
<item>
    <title>Optimizando consultas Mysql</title>
    <link>http://www.novanebula.net/blog/archives/101-Optimizando-consultas-Mysql.html</link>
            <category>Programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/101-Optimizando-consultas-Mysql.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=101</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=101</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    La optimización de las consultas a la base de datos de tus aplicaciones web es de vital importancia, no sólo ha la hora de medir el tiempo en el que una página se carga sino también cuando el tráfico de tu máquina se incrementa o cuando el hardware tiene trabajo extra debido a un mal diseño de esas consultas.&lt;br /&gt;
&lt;br /&gt;
Incluso aunque tengamos implementadas soluciones de caché (librerías de mysql con cache, &lt;a href=&quot;http://www.novanebula.net/blog/archives/94-Memcache.html&quot;&gt;memcache&lt;/a&gt; o similares) la optimización de las consultas sigue teniendo un relevancia plena. En este artículo resumiremos que herramientas podemos emplear para optimizar, detectar y solucionar problemas en las consultas a tu base de datos que lastran tu aplicación llegando ha hacerla inutilizable o requiriendo una inversión mayor en equipo cuando no debería.&lt;br /&gt;
&lt;br /&gt;
La primera de las herramientas, interna al propio servidor mysql es la sentencia explain, explain también es un alias del comando describe cuando se escribe a continuación un nombre de tabla. Explain o describe devolverá información sobre la estructura de la tabla. La otra sintaxis propia de explain, y la que nos interesa, es la que sirve para analizar como mysql ejecuta una sentencia select.&lt;br /&gt;
&lt;br /&gt;
EXPLAIN [EXTENDED] SELECT select_options&lt;br /&gt;
&lt;br /&gt;
Explain hará que el optimizar de mysql nos devuelva información sobre como se procesará la sentencia SELECT incluyendo información de que tablas usará como utilizará los joins, en que orden y en que modo utilizará los indices que haya definidos en las tablas. Todo esta información se conoce con el nombre de información sobre plan de ejecución de mysql.&lt;br /&gt;
&lt;br /&gt;
Esta información es muy valiosa y se puede emplear para optimizar nuestros selects. Con esta información podremos por ejemplo decidir añadir nuevos índices a nuestras tablas o modificar nuestros selects para que se fuerte un determinado orden para nuestros joins.&lt;br /&gt;
&lt;br /&gt;
Explain devuelve una fila de información por cada tabla empleada en la consulta. Las tablas son listadas en el orden en el que mysql las leerá a la hora de procesar la consulta. Si añadimos EXTENDED mysql nos dará información adicional en forma de warning, para poder verla debemos ejecutar un SHOW WARNINGS. La información extra contiene como el optimizador da &lt;br /&gt;
nombre cada una de las tablas y columnas de la sentencia select y puede que otras notas sobre el proceso de optimización.&lt;br /&gt;
&lt;br /&gt;
Veamoslo con un ejemplo bien simple:&lt;br /&gt;
&lt;br /&gt;
mysql&gt; select 1;&lt;br /&gt;
+---+&lt;br /&gt;
| 1 |&lt;br /&gt;
+---+&lt;br /&gt;
| 1 |&lt;br /&gt;
+---+&lt;br /&gt;
1 row in set (0.00 sec)&lt;br /&gt;
&lt;br /&gt;
mysql&gt; explain select 1;&lt;br /&gt;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+&lt;br /&gt;
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra          |&lt;br /&gt;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+&lt;br /&gt;
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | No tables used |&lt;br /&gt;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+&lt;br /&gt;
1 row in set (0.00 sec)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cada columna que devuelve EXPLAIN tiene el siguiente significado:&lt;br /&gt;
&lt;br /&gt;
id - identificador, es sólo una secuencia numérica autoincrementada para cada una de las filas del explain&lt;br /&gt;
select_type - Debe ser uno de los siguiente tipos&lt;br /&gt;
    SIMPLE - No usa subqueries ni UNION&lt;br /&gt;
    PRIMARY - Último SELECT&lt;br /&gt;
    UNION - Segunda o última sentencia SELECT en una UNION&lt;br /&gt;
    DEPENDENT UNION - Segunda o última sentencia SELECT en una UNION, dependiente de otra query&lt;br /&gt;
    SUBQUERY - Primera SELECT en una subquery&lt;br /&gt;
    DEPENDENT SUBQUERY - Primera SELECT en una subquery, dependiente de otra query&lt;br /&gt;
    DERIVED - Tabla SELECT derivada (subquery en una clausula FROM)&lt;br /&gt;
    UNCACHEABLE SUBQUERY - Una subquery cuyo resultado no puede ser cacheado y debe ser re-evaluado para cada file de la otra query.&lt;br /&gt;
&lt;br /&gt;
table - la tabla a la que se refiere la información&lt;br /&gt;
tipo - el tipo de unión empleado, que puede ser:&lt;br /&gt;
    sytem - SYSTEM SELECT sólo hay una fila en la tabla (tipo especial del tipo const)&lt;br /&gt;
    const - La tabla tiene como mucho un sola fila resultado, que es leída al principio de la operación convirtiéndose en una constante para el resto de las operaciones del select (operación muy rápida)&lt;br /&gt;
    eq_ref - Una fila es leída de la tabla por cada combinación de filas en las tablas previas.&lt;br /&gt;
    ref - Todas las filas con valores de índices validos son leídos de esta tabla por cada combinación de filas de las tablas previas.&lt;br /&gt;
    fulltext - El join se utiliza mediante un índice FULLTEXT&lt;br /&gt;
    ref_or_null - Este tipo de join es como el ref, pero además MySQL hace una busqueda extra por filas que contengan valores NULL&lt;br /&gt;
    index_merge - la columna key en la fila de salida contiene una lista de indices a utilizar, y key_len contiene una lista de las claves más largas para los índices utilizados.&lt;br /&gt;
    unique_subquery -  Este tipo sustituye al ref para algunas subqueries IN de el siguiente tipo de estructuras: value IN (SELECT primary_key FROM single_table WHERE some_expr)&lt;br /&gt;
    index_subquery - Este tipo join es similar al unique_subquery. Este sustituye subqueries IN, pero funciona para índices no únicos en subqueries del siguiente tipo: value IN (SELECT key_column FROM single_table WHERE some_expr)&lt;br /&gt;
    range - Solamente las columnas que están en un rango dado son retornadas, empleando un índice para seleccionar las columnas. La columna key indica que índice es utilizado. key_len contiene el índice más largo de la parte del índice más larga utilizada. ref es NULL para este tipo.&lt;br /&gt;
    index - Este ipo de join es el mismo que el de ALL, con la excepción de que sólo se realiza el escaneado a través de un índice. Esto es mas rápido que ALL ya que los ficheros índice son generalmente más pequeños que el fichero de datos.&lt;br /&gt;
    all - Se realiza un escaneado de toda la tabla por cada combinación de filas de las tablas anteriores.&lt;br /&gt;
&lt;br /&gt;
Estos tipos están ordenados en cuando a lo mejor o peor en cuanto a optimización. Así un tipo all sería lo peor y un tipo system sería lo mejor. Reducir de un tipo a otro, cambiando o creando índices para una determinada tabla o modificando la estrucutra misma de la petición es la tarea básica que debemos intentar para optimizar nuestra querys.&lt;br /&gt;
&lt;br /&gt;
possible_keys - La columna indica que índices se pueden seleccionar para ser usados a la hora de encontrar filas en la tabla.&lt;br /&gt;
key - Índica que índice es empleado finalmente (podría se uno que no estuviera listado en las possible_keys).&lt;br /&gt;
key_len - Longitud del índice empleado&lt;br /&gt;
ref - Muestra que columnas o constante son empleadas para comparar con el índice&lt;br /&gt;
rows - Número de filas que MySQL piensa que debe examinar al ejecutar la petición&lt;br /&gt;
extra - Información adicional sobre la consulta.&lt;br /&gt;
&lt;br /&gt;
Cuando modifiques la estructura de una tabla o añadas índices recuerda ejecutar un:&lt;br /&gt;
&lt;br /&gt;
ANALIZE TABLE nombre_tabla;&lt;br /&gt;
&lt;br /&gt;
Esto hará que el optimizador analize adecuadamente la tabla, los datos los usará para ayudarle a determinar la mejor estrategia en consultas posteriores. Tras modificar la tabla ejecuta ANALIZE y vuelve a ejecutar un EXPLAIN para observar las modificaciónes en el plan de ejecución de la consulta.&lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Sun, 01 Jun 2008 17:00:43 +0200</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/101-guid.html</guid>
    
</item>
<item>
    <title>Firefox 3 rc1</title>
    <link>http://www.novanebula.net/blog/archives/100-Firefox-3-rc1.html</link>
            <category>Programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/100-Firefox-3-rc1.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=100</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=100</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    Firefox, uno de los navegadores más empleados en la actualidad y el más importante de las alternativas &quot;open source&quot; acaba de anunciar la salida de la primera &quot;release candidate&quot;.&lt;br /&gt;
&lt;br /&gt;
Este navegador podría ser el primero en desbancar a internet explorer como &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.w3schools.com/browsers/browsers_stats.asp&#039;);&quot;  href=&quot;http://www.w3schools.com/browsers/browsers_stats.asp&quot;&gt;navegador más empleado&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
La versión puede ser descargada directamente desde las páginas de &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.mozilla.com/en-US/firefox/all-rc.html&#039;);&quot;  href=&quot;http://www.mozilla.com/en-US/firefox/all-rc.html&quot;&gt;mozilla&lt;/a&gt;. Pero se avisa que sólo es válido para realizar pruebas. No presenta muchas características nuevas respecto a las betas anteriores por lo que nos encontramos ante una versión más estable que sólo (esperemos) solucione bugs de las betas anteriores. 
    </content:encoded>

    <pubDate>Sat, 24 May 2008 15:56:01 +0200</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/100-guid.html</guid>
    
</item>
<item>
    <title>Unit testing (pruebas unitarias)</title>
    <link>http://www.novanebula.net/blog/archives/99-Unit-testing-pruebas-unitarias.html</link>
            <category>Programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/99-Unit-testing-pruebas-unitarias.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=99</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=99</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    En el desarrollo de software la ausencia de errores es una autentica quimera. Tantos son los factores que finalmente pueden alterar el flujo que consideramos &quot;normal&quot; en el programa como los errores propios a cualquier actividad humana.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Uno de los métodos más utilizados para realizar pruebas a nuestro software es el llamado de pruebas unitarias (unit testing). La base de este método es el hacer pruebas en pequeños fragmentos de nuestro programa. Estos fragmentos deben ser unidades estructurales de nuestro programa encargados de una tarea especifica, en programación procedural u orientada a objetos podemos afirmar que estas unidades son los métodos o las funciones que tenemos definidos.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Tras realizar estas pruebas sobre los elementos unitarios de nuestro programa podremos eliminar gran parte de los errores de los que podría adolecer. Como ya sabemos cualquier prueba demuestra no la ausencia de errores sino que revela la presencia de ellos. Las pruebas unitarias no revelan errores en la integración de las partes unitarias ni tampoco otros problemas como el bajo rendimiento de las aplicaciones o problemas derivados del sistema sobre el que está ejecutándose nuestro programa.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;El objetivo de las pruebas unitarias es el aislamiento de partes del código y la demostración de que estas partes no contienen errores.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Una vez creados el conjunto de pruebas unitarias sobre un fragmento de código los beneficios obtenidos, incluso antes de ejecutar ninguna prueba, son múltiples. Pasaré a enumerarlos:&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Simplificación de la integración&lt;/strong&gt;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Las pruebas unitarias eliminan las posibles incertidumbres y errores en lo que se espera de cada una de las unidades ayudando a entender la integración de cada una de las partes.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Refactorización de código&lt;/strong&gt;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Una vez refactorizado el código; las mismas pruebas unitarias nos pueden servir para probar el nuevo código asegurándonos de que este sigue siendo válido bajo la nueva implementación.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Documentación&lt;/strong&gt;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Las pruebas unitarias sirven como método de documentación mismo. Los desarrolladores pueden ver a través de las pruebas unitarias cual es el objetivo de las distintas partes del código de una manera básica.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Diseño&lt;/strong&gt;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Cuando se desarrolla el software las pruebas unitarias pueden tomar el lugar del diseño formal. Cada prueba unitaria puede ser visto como un elemento de diseños que especifica las clases, los métodos y el comportamiento observable de la aplicación.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Thu, 22 May 2008 21:42:56 +0200</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/99-guid.html</guid>
    
</item>
<item>
    <title>PHP 6</title>
    <link>http://www.novanebula.net/blog/archives/98-PHP-6.html</link>
            <category>Programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/98-PHP-6.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=98</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=98</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    Dentro de muy poco tiempo tendremos entre nosotros la próxima versión de php, php6. Esta versión ya está disponible en php.net para su &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/snaps.php.net/&#039;);&quot;  href=&quot;http://snaps.php.net/&quot;&gt;descargar&lt;/a&gt;. Aunque la adopción de php5 y desaparición de php4 fue un proceso algo más lento de lo esperado. PHP6 no supone un cambio tan radical como el que sucedió con la versión anterior por lo que es de esperar, si todo va bien, que la adopción de esta versión sea más rápida.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;strong&gt;PHP&lt;/strong&gt; sigue siendo el &lt;strong&gt;lenguaje script&lt;/strong&gt; para &lt;strong&gt;desarrollos web&lt;/strong&gt; &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.php.net/usage.php&#039;);&quot;  href=&quot;http://www.php.net/usage.php&quot;&gt;más popular&lt;/a&gt; y la lista de  &lt;strong&gt;nuevas características&lt;/strong&gt; que vienen con esta nueva versión pueden situarle en posiciones todavía más destacadas.&lt;br /&gt;
&lt;br /&gt;
Estas son las novedades que incorporará el lenguaje:&lt;br /&gt;
&lt;br /&gt;
Soporte para &lt;strong&gt;Unicode&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;PHP6 soporta Unicode en la mayoría de sus funciones principales. Esta característica tendrá un fuerte impacto ya que permitirá una mayor capacidad de internazionalización al soportar un conjunto de caracteres mucho mayor mediante sus funciones nativas. &lt;br /&gt;
&lt;br /&gt;
Espacios de nombres (&lt;strong&gt;Namespaces&lt;/strong&gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;PHP6 soporta namespaces. Una manera de evitar colisiones entre los nombres que asignemos a las diferentes clases sin tener que estar elaborando notaciones especificas para evitar este problema. De esta manera al crear tu propio espacio de nombres no tienes que preocuparte por si php tiene una clase con el mismo nombre o si una librería externa podría fallar debido a una colisión en los nombres de clase.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;No es obligatorio el uso de namespaces lo que permite que el código de la versión 5 sea compatible con esta nueva caracteristica. Los namespaces aparecen ya soportados en la version php 5.3&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;php&lt;br /&gt;
namespace ACC&lt;br /&gt;
class Dummy {}&lt;br /&gt;
$dummy = new ACC::Dummy();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;SOAP&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;SOAP es uno de los protocolos empleados por los servicios web soportado en otros lenguajes como JAVA. SOAP permite la interoperativilidad entre diferentes plataformas.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;PHP6 tendra una extensión SOAP que nos permitirá una manera más sencilla de implementar tanto clientes como servidores SOAP&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;XML&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;A partir de PHP5.1 XMLWriter y XMLReader han formado parte del núcleo de PHP lo que permite construir y leer mensajes XML sin tener que preocuparte de los detalles más complejos de este formato. PHP6 mejora esta funcionalidad&lt;br /&gt;
&lt;br /&gt;
Cosas que se han eliminado en PHP6&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Además de los nuevas características añadidas, PHP 6 no tendrá algunas de las funciones y características propias de versiones anteriores. La mayoría de estas características, como register_globlas y safe_mode, son consideradas negativamente en la versión actual. Los que se oponen ha estas modificaciones arguyen que estos cambios provocará el fallo en los scripts actuales en cuanto se actualize a la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Estas con las características eliminadas en la próxima versión de PHP&lt;br /&gt;
&lt;br /&gt;
 &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/es.php.net/magic_quotes/&#039;);&quot;  href=&quot;http://es.php.net/magic_quotes/&quot;&gt;magic_quotes&lt;/a&gt;&lt;br /&gt;
 &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/es.php.net/register_globals&#039;);&quot;  href=&quot;http://es.php.net/register_globals&quot;&gt;register_globals&lt;/a&gt;&lt;br /&gt;
 &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/es.php.net/manual/en/language.variables.predefined.php&#039;);&quot;  href=&quot;http://es.php.net/manual/en/language.variables.predefined.php&quot;&gt;register_long_arrays&lt;/a&gt;&lt;br /&gt;
 &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/es.php.net/manual/en/features.safe-mode.php&#039;);&quot;  href=&quot;http://es.php.net/manual/en/features.safe-mode.php&quot;&gt;safe_mode&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Magic quotes&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Por razones de portabilidad, rendimiento e inconveniencia se recomienda ya no utilizar esta característica. magic_quotes escapa cadenas que proceden de datos introducidos por el usuario $_POST, $_GET, $_REQUEST y que podrían ser empleados en una sentencia SQL originando fallos en la seguridad de la aplicación si se introducen determinadas secuencias de caracteres. Cuando se elimine esto de PHP también desaparecerá la función get_magic_quotes_gpc(). En su lugar para eliminar este riesgo de seguridad debemos recurrir a funciones del estilo mysql_escape_string para mysql y pg_escape_string para PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Register globals&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Register globals permitía inicializar variables a partir de datos externos ($_GET,$_POST,$_REQUEST) lo que potencialmente podría producir importantes errores en la aplicación y su seguridad. Register globals paso de estar activo a desactivo por defecto a partir de la versión 4.2&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Register long arrays&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Se eliminan los variables superglobales $HTTP_*_VARS se ha mantenido por razones de compatibilidad, aunque se aconsejaba dejar esta característica deshabilitada para mejorar el rendimiento de los scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Safe mode&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Cuando esta habilitada safe mode se aseguraba de que el propietario del fichero que se está ejecutando coincida con el propietario del fichero que se está empleando. Originariamente fue un intento para securizar determinadas operaciones en un entorno en el que el servidor estaba compartido.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Etiquetas PHP&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Ya no se permiten ni etiquetas cortas &lt;? ?&gt; ni el formato ASP &lt;% %&gt; para encerrar fragmentos de código php&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;FreeType 1 y GD1&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;El soporte para FreeType 1 y GD 1 será eliminado completamente de PHP debido a que ambas librería ya no son mantenidas desde hace bastante tiempo. Las nuevas versiones de ambas librerías si que seguirán en PHP ya que proporcionan mejor funcionalidad.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Ereg&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;La extensión ereg también desaparecerá. En su lugar ya tenemos las expresiones regulares compatibles Perl (PCRE - Perl-Compatible Regular Expressions). De esta manera ereg() y eregi() pueden ser sustituidas por preg_match() y ereg_replace() y ereg_replacei() por preg_replace.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;PHP 5.3&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Algunas de las características mencionadas previamente para la nueva versión ya han sido portadas a la versión 5.3 de PHP para que el cambio de versión no sea tan violento como son los Namespaces y la inclusión en el núcleo de PHP de XMLReader y XMLWriter.&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Fri, 09 May 2008 22:13:19 +0200</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/98-guid.html</guid>
    
</item>
<item>
    <title>getopt</title>
    <link>http://www.novanebula.net/blog/archives/95-getopt.html</link>
            <category>Programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/95-getopt.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=95</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=95</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    Las funciones getopt y getopt_long sirven para automatizar el paso de parámetros al programa en linea de comandos. Estas funciones también pertenecen a la librería C de GNU. Sus usos y ejemplos son inmediatos en cuando comenzamos a escribir comandos en nuestra consola.&lt;br /&gt;
&lt;br /&gt;
# ls -la&lt;br /&gt;
# find . -name &quot;*.mp3&quot; &lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;-la y -name son los &lt;strong&gt;parámetros&lt;/strong&gt; que deben ser analizados cuando invocamos estos programas para su correcto funcionamiento. &lt;strong&gt;Getopt&lt;/strong&gt; y &lt;strong&gt;getopt_long&lt;/strong&gt; nos servirán de mucha ayuda para analizar y detectar todos esto parámetros.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Debemos incluir el archivo de cabecera &lt;strong&gt;unistd.h&lt;/strong&gt; para poder emplear getopt una vez hecho esto la &lt;strong&gt;firma&lt;/strong&gt; de la &lt;strong&gt;función&lt;/strong&gt; es la siguiente:&lt;br /&gt;
&lt;br /&gt;
int getopt(int argc, char * const argv[], const char *optstring);&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Para getopt_long también necesitamos el archivo de cabecera unistd.h:&lt;br /&gt;
&lt;br /&gt;
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;getopt emplea o fija varias &lt;strong&gt;variables&lt;/strong&gt;, estas son:&lt;br /&gt;
&lt;br /&gt;
int opterr - Si le damos un valor igual a 0 getopt no indicara imprimirá en stderr ningún mensaje de error (por defecto si que lo hará)&lt;br /&gt;
int optopt - Si getopt encuentra una opción no reconocida o sin un parámetro necesario, entonces almacena este caracter en esta varible.&lt;br /&gt;
int optint - La variable fijada por getopt nos da el indice del parámetro a ser analizado.&lt;br /&gt;
char* optarg - Fijada por getopt y que nos da la posición del argumento a analizar.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;La función getopt obtiene el siguiente argumento en la lista de &lt;strong&gt;argumentos&lt;/strong&gt; que se le pasan al programa. Normalmente los argumentos son los pasados a la función main al comienzo de nuestro programa (argc y argv)&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;optstring es una cadena que especifica todos los caracteres válidos para nuestro &lt;strong&gt;programa&lt;/strong&gt;. Un carácter seguido de dos puntos &#039;:&#039; indica que esta opción necesita un argumento y si está seguida de dos dobles puntos &#039;::&#039; indicamos que ese argumento es opcional (sólo GNU), por lo tanto la cadena:&lt;br /&gt;
&lt;br /&gt;
&quot;lac:d::&quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Indica que nuestro programa acepta el parametro -l, -a el parámetro -c seguido de un argumento y -d que puede no estar seguido de un argumento esto podría ser:&lt;br /&gt;
&lt;br /&gt;
-l -a -c /tmp/a.txt -d&lt;br /&gt;
&lt;br /&gt;
ó&lt;br /&gt;
&lt;br /&gt;
-la -d -c /tmp/a.txt&lt;br /&gt;
&lt;br /&gt;
etc&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;getopt va devolviendo el último &lt;strong&gt;parámetro&lt;/strong&gt; analizado y al final cuando no queda ningúno más por analizar devuelve -1&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Si la opción tiene un argumento este es colocado dentro de optarg&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;El argumento especial &#039;--&#039; termina el análisis de opciones posteriores&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Si getopt encuentra una opción que no aparece en la lista de opciones disponibles devuelve &#039;?&#039; e introduce en la variable externa optopt este argumento.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Este es un ejemplo del uso de getopt:&lt;br /&gt;
&lt;br /&gt;
#include &lt;ctype.h&gt;&lt;br /&gt;
#include &lt;stdio.h&gt;&lt;br /&gt;
#include &lt;stdlib.h&gt;&lt;br /&gt;
#include &lt;unistd.h&gt;&lt;br /&gt;
     &lt;br /&gt;
     int main (int argc, char **argv)&lt;br /&gt;
     {&lt;br /&gt;
       int aflag = 0;&lt;br /&gt;
       int bflag = 0;&lt;br /&gt;
       char *cvalue = NULL;&lt;br /&gt;
       int index;&lt;br /&gt;
       int c;&lt;br /&gt;
     &lt;br /&gt;
       opterr = 0;&lt;br /&gt;
     &lt;br /&gt;
       while ((c = getopt (argc, argv, &quot;abc:&quot;)) != -1)&lt;br /&gt;
         switch (c)&lt;br /&gt;
           {&lt;br /&gt;
           case &#039;a&#039;:&lt;br /&gt;
             aflag = 1;&lt;br /&gt;
             break;&lt;br /&gt;
           case &#039;b&#039;:&lt;br /&gt;
             bflag = 1;&lt;br /&gt;
             break;&lt;br /&gt;
           case &#039;c&#039;:&lt;br /&gt;
             cvalue = optarg;&lt;br /&gt;
             break;&lt;br /&gt;
           case &#039;?&#039;:&lt;br /&gt;
             if (optopt == &#039;c&#039;)&lt;br /&gt;
               fprintf (stderr, &quot;Option -%c requires an argument.\n&quot;, optopt);&lt;br /&gt;
             else if (isprint (optopt))&lt;br /&gt;
               fprintf (stderr, &quot;Unknown option `-%c&#039;.\n&quot;, optopt);&lt;br /&gt;
             else&lt;br /&gt;
               fprintf (stderr,&lt;br /&gt;
                        &quot;Unknown option character `\\x%x&#039;.\n&quot;,&lt;br /&gt;
                        optopt);&lt;br /&gt;
             return 1;&lt;br /&gt;
           default:&lt;br /&gt;
             abort ();&lt;br /&gt;
           }&lt;br /&gt;
     &lt;br /&gt;
       printf (&quot;aflag = %d, bflag = %d, cvalue = %s\n&quot;,&lt;br /&gt;
               aflag, bflag, cvalue);&lt;br /&gt;
     &lt;br /&gt;
       for (index = optind; index &lt; argc; index++)&lt;br /&gt;
         printf (&quot;Non-option argument %s\n&quot;, argv[index]);&lt;br /&gt;
       return 0;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Tue, 06 May 2008 20:30:20 +0200</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/95-guid.html</guid>
    
</item>
<item>
    <title>Alloca</title>
    <link>http://www.novanebula.net/blog/archives/92-Alloca.html</link>
            <category>Programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/92-Alloca.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=92</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=92</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    La función &lt;strong&gt;alloca&lt;/strong&gt; reserva espacio en la &lt;strong&gt;pila&lt;/strong&gt; de la función que lo llama, devolviendo un &lt;strong&gt;puntero&lt;/strong&gt; ha este espacio reservado. Este espacio temporal es automáticamente liberado cuando la función que llama a alloca retorna.&lt;br /&gt;
&lt;br /&gt;
Esta es la firma o &lt;strong&gt;prototipo&lt;/strong&gt; de la función:&lt;br /&gt;
&lt;br /&gt;
void *alloca(size_t size);&lt;br /&gt;
&lt;br /&gt;
Su declaración está en el archivo de cabecera &lt;strong&gt;alloca.h&lt;/strong&gt;. El parámetro que se le pasa es el número de bytes que se desean reservar. Alloca además devuelve un puntero nulo cuando no tiene éxito al reservar memoria.&lt;br /&gt;
&lt;br /&gt;
Alloca presenta una serie de ventajas con respecto a &lt;strong&gt;malloc&lt;/strong&gt; a la hora de reservar memoria. Alloca no produce segmentación en los bloques de memoria reservados, ya que el espacio se reserva en la pila. Alloca apenas malgasta espacio y es bastante  rápido. Cuando la función que llama a alloca es abandonada la memoria es liberada evitando posibles &lt;strong&gt;memory leaks&lt;/strong&gt;. Esto también ocurre en caso de error en la función, la memoria es liberada de inmediato.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de función que emplea alloca:&lt;br /&gt;
&lt;br /&gt;
int  open2(char *str1, char *str2, int flags, int mode)&lt;br /&gt;
{&lt;br /&gt;
            char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);&lt;br /&gt;
            stpcpy (stpcpy (name, str1), str2);&lt;br /&gt;
            return open(name, flags, mode);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Para tener un código similar empleando sólo malloc y free debemos escribir:&lt;br /&gt;
&lt;br /&gt;
int  open2 (char *str1, char *str2, int flags, int mode)&lt;br /&gt;
{&lt;br /&gt;
       char *name = (char *) malloc (strlen (str1) + strlen (str2) + 1);&lt;br /&gt;
       int desc;&lt;br /&gt;
       if (name == 0)&lt;br /&gt;
         fatal (&quot;virtual memory exceeded&quot;);&lt;br /&gt;
       stpcpy (stpcpy (name, str1), str2);&lt;br /&gt;
       desc = open (name, flags, mode);&lt;br /&gt;
       free (name);&lt;br /&gt;
       return desc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Alloca, sin embargo, también tiene algunas desventajas:&lt;br /&gt;
&lt;br /&gt;
 Si intentas reservas más memoria de la que la máquina puede reservar no obtendrás un mensaje de error claro. En su lugar tendrás una señal fatal como las obtenidas en un recursion infinita; probablemente una &lt;strong&gt;violación de segmento&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
 Algunos sistemas no-GNU no tienen soporte para alloca, convirtiendo a alloca en menos portable. Sin embargo hay algunas implementaciones en C para solventar estas deficiencias en estos sistemas.&lt;br /&gt;
&lt;br /&gt;
Sigue este link para saber más de &lt;a href=&quot;http://www.novanebula.net/blog/archives/87-Reserva-de-memoria-en-glibc.html&quot;&gt;reserva de memoria&lt;/a&gt; 
    </content:encoded>

    <pubDate>Sat, 26 Apr 2008 19:35:12 +0200</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/92-guid.html</guid>
    
</item>

</channel>
</rss>