<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8870498</id><updated>2012-01-28T00:10:27.640-03:00</updated><category term='php5'/><category term='zend engine'/><category term='Sara Golemon'/><category term='query cache'/><category term='array_reverse'/><category term='mysql'/><category term='gdb'/><category term='php'/><category term='PHP source code'/><category term='escalabilidad'/><category term='Zend Framework'/><category term='explode'/><category term='zvalue'/><category term='api'/><category term='php6'/><category term='diferencias'/><category term='php4'/><category term='ruby on rails'/><category term='blogger'/><category term='namespaces'/><category term='memcached'/><category term='datetime'/><category term='implode'/><category term='zval'/><category term='google'/><title type='text'>Blog de Pichongol</title><subtitle type='html'>Este Blog está orientado a todos los desarrolladores PHP que intentan ir un poco más allá con el lenguaje.
Se basa un poco en mis experiencias personales, investigando el código fuente, creando extensiones y tratando con temas avanzados. Optimización, buenas prácticas de programación e innovación son topics íntimamamente relacionados con este Weblog.
Una cosa más, ASPeros abstenerse :-).
Hack Php! Open Source forever.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8870498.post-4273405634557190016</id><published>2008-03-10T12:37:00.005-02:00</published><updated>2008-03-10T22:21:22.222-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Hello, world!</title><content type='html'>I am on the intarweb!&lt;br /&gt;&lt;br /&gt;jeje, y probando el API de Blogger... muy interesante&lt;br /&gt;http://code.google.com/apis/blogger/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-4273405634557190016?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/4273405634557190016/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=4273405634557190016' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/4273405634557190016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/4273405634557190016'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2008/03/hello-world.html' title='Hello, world!'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-2188026969551317676</id><published>2007-10-10T19:47:00.000-03:00</published><updated>2007-10-10T20:00:14.379-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='query cache'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='memcached'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Dilemas sobre Query Caché</title><content type='html'>&lt;span style="font-style: italic;"&gt;Si bien son innegables las bondades del uso de un Query caché en un motor de base de datos, debemos tener en claro algunos conceptos y situaciones antes de definirnos a usarlo intensivamente.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Al publicarse el artículo "&lt;a href="http://www.maestrosdelweb.com/editorial/memcached-un-alivio-para-las-bases-de-datos/"&gt;Memcached: un alivio para las bases de datos&lt;/a&gt;" en &lt;a href="http://www.maestrosdelweb.com/"&gt;Maestros del Web&lt;/a&gt; he recibido algunas opiniones, entre las cuales, una de Manuel Lagar:&lt;br /&gt;"Interesante artículo. Pero estas características ya deben ser implementadas nativamente por las bases de datos, me consta que Oracle y Sqlserver si lo hacen (se que son propietarias y caras), no se si mysql lo hace…", a lo que le respondo:&lt;br /&gt;"Hola Manuel, como bien apuntas, las bases de datos deberian implementar un “Query cache” (me imagino que a esto te refieres), el tema es que no siempre es conveniente usarlo.&lt;br /&gt;Un cacheo de los queries inyecta un overhead en el motor de las bases de datos, que muchas veces implica lockeos de tablas, y por ende ralentiza las IO (entradas/salidas).&lt;br /&gt;Cuando se manejan volumenes de tráfico del orden de los millones, no es tan bueno tener este tipo de overhead.&lt;br /&gt;Fijate que los ejemplos de sitios que usan memcached son sitios que manejan trafico por millones, rankeados en algunos casos Top 50, en algunos casos Top 10 en la escala mundial de manejo de trafico."&lt;br /&gt;&lt;br /&gt;Es un buen pie como para hablar un poco más de los Query Cachés, y para hacerlo, voy a enfocarme en la implementación de MySQL.&lt;br /&gt;Como conclusión, intento fundamentar el porqué no es necesario usar Query Caché junto con Memcached Server, y porqué es contraproducente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Funcionamiento&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Arrancamos diciendo que el query caché es una característica de MySQL a partir de la version 4.0, y que representó en su momento una mejora rotunda de la velocidad de respuesta del motor, muchas veces superando en 5 veces la ejecución de un simple SELECT en un MySQL3 comparado con un MySQL4.&lt;br /&gt;En algunas instalaciones, el query caché de MySQL viene desactivado por default.&lt;br /&gt;Podemos chequearlo en nuestro motor haciedo:&lt;br /&gt;&lt;br /&gt;mysql&gt; show variables like '%query%';&lt;br /&gt;&lt;br /&gt;Variable_name Value&lt;br /&gt;query_alloc_block_size        8192&lt;br /&gt;query_cache_limit               1048576&lt;br /&gt;query_cache_min_res_unit 4096&lt;br /&gt;query_cache_size                0&lt;br /&gt;query_cache_type                ON&lt;br /&gt;query_cache_wlock_invalidate OFF&lt;br /&gt;query_prealloc_size           8192&lt;br /&gt;&lt;br /&gt;De todas estas variables, las que nos definen si esta activo o no son "query_cache_type" y "query_cache_size".&lt;br /&gt;&lt;br /&gt;query_cache_type&lt;br /&gt;• Determina si el query caché esta activo, y el tipo de cacheo.&lt;br /&gt;• 0: Cache inactivo. 1: Siempre se cachea, salvo que lo pidamos explicitamente con SQL_NO_CACHE. 2: Solo se cachea con la opcion SQL_CACHE&lt;br /&gt;&lt;br /&gt;query_cache_size&lt;br /&gt;• Indica el tamaño del set de datos cacheados. Si se establece en 0, se inhabilita el caché, independientemente de query_cache_type.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ventajas y desventajas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La principal ventaja del cacheo de queries frente al esquema contrario, radica en el beneficio que implica el ahorro del tiempo de parseo frente a cada comando SELECT. El query ya no debe parsearse ni calcular su plan de ejecución, sino que ahora solo nos enfocamos a capturar el resultado cacheado.&lt;br /&gt;&lt;br /&gt;A su vez, el cacheo de queries funciona para sentencias SELECT únicamente. Es decir, que no le sacamos el jugo con subselects, partes de UNION, stored procedures, comandos SHOW, etc.&lt;br /&gt;&lt;br /&gt;Ahora bien, como en todo esquema computacional, rige el principio de costo-beneficio. El cacheo de queries no es gratis.&lt;br /&gt;El hecho de almacenar el resultado de un SELECT le agrega un overhead al ciclo normal de ejecución:&lt;br /&gt;&lt;br /&gt;Por ejemplo:&lt;br /&gt;mysql&gt; SELECT field1, field2 FROM table1 WHERE field1='value1';&lt;br /&gt;El motor realiza el parseo, calcula los indices a utilizar, captura los resultados y "cachea los resultados".&lt;br /&gt;&lt;br /&gt;Luego, si el cliente realiza el mismo query:&lt;br /&gt;mysql&gt; SELECT field1, field2 FROM table1 WHERE field1='value1';&lt;br /&gt;El motor solo se remite a capturar el resultado del caché.&lt;br /&gt;&lt;br /&gt;Pero bueno, aqui viene la parte triste de la historia. MySQL tiene una política de invalidacion de datos de cache muy "agresiva".&lt;br /&gt;Ante cualquier accion de escritura sobre una tabla, invalida todos los datos cacheados en la misma, independientemente de los datos escritos...&lt;br /&gt;&lt;br /&gt;Veamos un ejemplo de este concepto. Arrancamos con el caché vacio:&lt;br /&gt;&lt;br /&gt;mysql&gt; SELECT field1, field2 FROM table1 WHERE field1='value1';&lt;br /&gt;Resultset1 calculado y cacheado.&lt;br /&gt;&lt;br /&gt;mysql&gt; SELECT field1, field2 FROM table1 WHERE field1='Pichongol';&lt;br /&gt;Resultset1 entregado desde el caché.&lt;br /&gt;&lt;br /&gt;mysql&gt; INSERT INTO table1 (field1, field2) VALUES('1','Daniel Lopez');&lt;br /&gt;Registro insertado y VACIADO DE TODOS LOS DATOS CACHEADOS PARA table1.&lt;br /&gt;&lt;br /&gt;mysql&gt; SELECT field1, field2 FROM table1 WHERE field1='value1';&lt;br /&gt;Resultset1 calculado y cacheado.&lt;br /&gt;&lt;br /&gt;Queda demostrado entonces la falta de "inteligencia" del motor para darse cuenta que el INSERT no afecta el resultado de "SELECT field1, field2 FROM table1 WHERE field1='Pichongol'", y por lo tanto no deberia ser invalidado.&lt;br /&gt;De todas formas, no es una crítica sino una observacion. El hecho de dotar de esta logica al query cache quizas lo dejaria muy complejo, y la performance se veria mas afectada de lo necesario.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sistemas intensivos en lecturas vs. Sistemas intensivos en escrituras&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Entonces, teniendo en cuenta esta invalidación agresiva de resultados cacheados ante una acción de escritura, queda preguntarnos, cuando realmente nos conviene utilizar el query cache, y bajo que circunstancias.&lt;br /&gt;&lt;br /&gt;Para responder esta pregunta, lo primero que deberiamos revisar es el sistema en cuestión.&lt;br /&gt;Si nuestro sistema es intensivo en reads (lecturas), entonces el beneficio que podriamos sacar de un query caché, es claro. Los datos del caché se invalidarian muy esporádicamente, para luego volver a capturarse desde este último.&lt;br /&gt;Si nuestro sistema es intensivo en writes (escrituras), seguramente deberiamos pensar en desactivarlo: Ante un flujo de INSERTS o UPDATES los datos seria invalidados constantemente, y los SELECT no solo sufrirían el overhead de almacenar el query en el caché, sino que no lo estarían utilizando ante dichas invalidaciones.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Query cache + Memcached Servers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es frecuente en sistemas web de tráfico masivo, y a veces no tan masivo, encontrar esquemas que utilicen algún medio para persistir datos en disco (base de datos) + algun medio de acceso rápido a esos datos (Memcached Server por ejemplo).&lt;br /&gt;&lt;br /&gt;Me ha tocado por razones laborales, ponerme a evaluar que tan necesario es el query caché cuando lo combinamos con el uso de caché en memoria.&lt;br /&gt;La realidad es que con dichos esquemas de acceso rápido a los datos residentes en memoria, se disminuyen drásticamente los reads en la base de datos, llegando en la mayoria de los casos al orden del 90% de queries que ya no se efectuan.&lt;br /&gt;De esta manera, nuestro sistema web termina convirtiéndose en un sistema crítico en writes (viéndolo desde el lado de la base de datos), y por tal motivo, se convierte en un sistema que constantemente invalida los datos del query caché.&lt;br /&gt;Conclusión rapida y furiosa: Es contraproducente el uso de Memory Caché + Query Caché.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-2188026969551317676?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/2188026969551317676/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=2188026969551317676' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/2188026969551317676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/2188026969551317676'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2007/10/dilemas-sobre-query-cach.html' title='Dilemas sobre Query Caché'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-4360330707641748265</id><published>2007-08-30T01:20:00.000-03:00</published><updated>2007-08-30T01:22:40.459-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='array_reverse'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='implode'/><category scheme='http://www.blogger.com/atom/ns#' term='datetime'/><category scheme='http://www.blogger.com/atom/ns#' term='explode'/><title type='text'>Datetimes</title><content type='html'>Voy a contar una curiosidad, con la cual he dejado con la boca abierta &lt;br /&gt;a un par de desarrolladores de PHP :P.&lt;br /&gt;Tiene que ver con el tratamiento de valores Datetimes de MySQL, cuyo formato más común de almacenamiento es YYYY-MM-DD HH:MM:SS.&lt;br /&gt;Que pasaría si queremos traernos una fecha con este formato, y obtener algo como DD/MM/YYYY (un formato mas ... hispano?)&lt;br /&gt;Podriamos hacer dos cosas:&lt;br /&gt;1) Utilizar la MySQL function DATE_FORMAT haciendo algo como &lt;br /&gt;mysql&gt; SELECT DATE_FORMAT('2007-08-30 22:23:00', '$d/%m/%Y %H:%i:%s');&lt;br /&gt;con lo cual estaríamos inyectando un pequeño overhead en el tratamiento del Query.&lt;br /&gt;2) Traernos el Datetime y procesarlo con PHP. Todo viene a cuento de esta segunda opción. Se puede resolver todo en el procesamiento en una sola línea, anidando 5 funciones:&lt;br /&gt;&lt;br /&gt;$date="2007-20-03 14:33:22";&lt;br /&gt;$new_date = implode("/",array_reverse(explode("-",current(explode("",$date)))));&lt;br /&gt;&lt;br /&gt;El desglose sería el siguiente:&lt;br /&gt;&lt;br /&gt;&gt; "2007-20-03 14:33:22"&lt;br /&gt;&lt;br /&gt;$aux = explode("",$date);&lt;br /&gt;&gt; Array(0 =&gt; "2007-20-03", 1 =&gt; "14:33:22")&lt;br /&gt;&lt;br /&gt;current($aux)&lt;br /&gt;&gt;  "2007-20-03"&lt;br /&gt;&lt;br /&gt;explode("-", $aux)&lt;br /&gt;&gt;  Array(0 =&gt; "2007", 1 =&gt; "20", 2 =&gt; "03")&lt;br /&gt;&lt;br /&gt;array_reverse($aux)&lt;br /&gt;&gt;  Array(0 =&gt; "03", 1 =&gt; "20", 2 =&gt; "2007")&lt;br /&gt;&lt;br /&gt;implode("/",$aux)&lt;br /&gt;&gt; "03/20/2007"&lt;br /&gt;&lt;br /&gt;En el desglose es como que queda bastante mas claro, aunque cuando se ve toda la linea junta intimida un poco.&lt;br /&gt;En fin, solo una curiosidad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-4360330707641748265?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/4360330707641748265/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=4360330707641748265' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/4360330707641748265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/4360330707641748265'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2007/08/datetimes.html' title='Datetimes'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-3806191378762290410</id><published>2007-07-18T01:07:00.000-03:00</published><updated>2007-07-18T01:44:17.605-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='namespaces'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='php6'/><title type='text'>Habemus Namespaces en PHP!</title><content type='html'>Recibimos con agrado la &lt;a href="http://www.zend.com/lists/php-dev/200707/msg00301.html"&gt;noticia&lt;/a&gt; de Dmitry Stogov de la inclusion del patch para el soporte de Namespaces en PHP6.&lt;br /&gt;Profundizemos un poco sobre su uso:&lt;br /&gt;&lt;br /&gt;namespace trabajo;&lt;br /&gt;&lt;br /&gt;class Persona {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function getNombre(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo 'Pichongol';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;static function saludo(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo 'Hola!, soy Pichongol';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Entonces podemos hacer&lt;br /&gt;$p = new trabajo::Persona();&lt;br /&gt;echo $p-&gt;getNombre(); // Muestra 'Pichongol'&lt;br /&gt;echo trabajo::Persona::saludo(); // Muestra 'Hola!, soy Pichongol'&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;El uso de "import" se torna importante para definir las reglas de conversion de los operadores. En pocas palabras, define el/los namespaces a utilizar.&lt;br /&gt;Por ejemplo&lt;br /&gt;&lt;br /&gt;import trabajo as work; // defino un alias para el namespace trabajo&lt;br /&gt;import trabajo; // defino al namespace trabajo como actual&lt;br /&gt;&lt;br /&gt;Como punto a destacar, podemos mencionar la inclusion de la constante __NAMESPACE__, que indica el actual namespace en uso.&lt;br /&gt;&lt;br /&gt;Cabe aclarar que aun hay ciertas cuestiones a definir, ademas de que actuamente esta siendo testeado en su funcionalidad basica. Sin embargo, la realidad es que no pude contenerme de contar la noticia :P. Los que venimos de larga data con php sabemos que los namespaces se hicieron desear bastante y lo interesante es que ya se dio el gran paso. En breve paso en limpio otros ejemplos de su futuro uso.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-3806191378762290410?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/3806191378762290410/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=3806191378762290410' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/3806191378762290410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/3806191378762290410'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2007/07/habemus-namespaces-en-php.html' title='Habemus Namespaces en PHP!'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-2207459038793889810</id><published>2007-07-08T03:23:00.000-03:00</published><updated>2007-07-08T03:29:55.697-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='memcached'/><category scheme='http://www.blogger.com/atom/ns#' term='escalabilidad'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Memcached: Un alivio para las bases de datos</title><content type='html'>&lt;i style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Cuando la performance de un sistema Web se torna crítica y el tiempo de respuesta puede quedar afectado por las numerosas visitas simultaneas, debemos echar mano a herramientas “poco convencionales”. Este es el caso de Memcached.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;¿Qué es Memcached?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Memcached es definido por Danga Interactive, la empresa que lo desarrollo y mantiene el proyecto bajo licencia BSD como un “sistema distribuido de alta performance para el cacheo de objetos en memoria, genérico por naturaleza, pero pensado para incrementar la velocidad de aplicaciones Web dinámicas, aliviando la carga de las bases de datos”.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;La idea es muy simple y a la vez muy efectiva: un servicio que escucha en un host y un port específico, que puede almacenar cadenas de bytes (strings).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;De esta manera, podríamos estar guardando en memoria una estructura serializada de PHP o Java, un string encodeado con Json, o un documento de cualquier formato (después de todo no dejan de ser cadenas de bytes).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;El proyecto puede ser visitado en: &lt;a href="http://www.danga.com/memcached/"&gt;http://www.danga.com/memcached/&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;Existe actualmente una implementacion de Memcached Server que corre en Win32. Si bien no es oficial, cuenta con el apoyo de varios desarrolladores de la comunidad&lt;b style=""&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;        &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;a href="http://jehiah.cz/projects/memcached-win32/"&gt;http://jehiah.cz/projects/memcached-win32/&lt;/a&gt;&lt;o:p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Funcionamiento&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;A grandes rasgos, el Memcached Server almacena los strings (internamente denominados ítems), en una gran tabla de hash, y los mapea según la clave que le asociemos a dicho item.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Dicha tabla de hash adopta una estructura de porciones de memoria de tamaño variable (denominadas slabs), con el objetivo de optimizar la asignación del espacio de memoria.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Un dato no menor es el slab de mayor tamaño (1 Mb), siendo este por consiguiente el tamaño máximo que un ítem puede tener si quiere ser almacenado en Memcached Server (aunque este valor puede ser modificado desde el código fuente).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Su arquitectura escalable nos permite mantener un pool de Memcached servers, característica que bien puede ser explotada en momentos donde la cantidad de conexiones no puede ser gestionada por un único Server. En ese caso, el pool optara por otro Server, balanceando la carga de conexiones.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;Protocolo&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;La comunicación de clientes con servidor es muy simple, y basada en comandos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;El protocolo Memcached implementa 3 comandos de almacenamiento, con pequeñas diferencias en su funcionamiento: SET, ADD y REPLACE.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;SET: Actualiza el objeto si no existía anteriormente, o lo agrega en caso contrario.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;ADD: Agrega el objeto solo si no existe.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;REPLACE: Actualiza el objeto solo si existe.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;Memcached permite controlar el tiempo de vida de un objeto, indicando el “tiempo de expiración” para el mismo, en el momento de realizar una operación de almacenamiento.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;A su vez, posee un comando de recuperación: GET.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Podemos eliminar un objeto mediante el comando DELETE.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;Además, el protocolo implementa comandos para recuperar estadísticas, vaciar el cache, utilizar algún tipo de compresión, entre otros.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;      &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;Ejemplo de uso&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;            &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="default"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  lang="ES-AR" &gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  lang="ES-AR" &gt;  &lt;!--[if !supportLineBreakNewLine]--&gt;  &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;// Inicializamos y conectamos&lt;br /&gt;&lt;span class="default"&gt;$memcache &lt;/span&gt;&lt;span class="keyword"&gt;= new &lt;/span&gt;&lt;span class="default"&gt;Memcache&lt;/span&gt;&lt;span class="keyword"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="default"&gt;$memcache&lt;/span&gt;&lt;span class="keyword"&gt;-&gt;&lt;/span&gt;&lt;span class="default"&gt;connect&lt;/span&gt;&lt;span class="keyword"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'localhost'&lt;/span&gt;&lt;span class="keyword"&gt;, &lt;/span&gt;&lt;span class="default"&gt;11211&lt;/span&gt;&lt;span class="keyword"&gt;) or die(&lt;/span&gt;&lt;span class="string"&gt;"No podemos conectarnos"&lt;/span&gt;&lt;span class="keyword"&gt;);&lt;/span&gt;  &lt;!--[if !supportLineBreakNewLine]--&gt;  &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;// Creamos una estructura a cachear&lt;br /&gt;&lt;span class="default"&gt;$pichongol &lt;/span&gt;&lt;span class="keyword"&gt;= new &lt;/span&gt;&lt;span class="default"&gt;stdClass&lt;/span&gt;&lt;span class="keyword"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="default"&gt;$pichongol&lt;/span&gt;&lt;span class="keyword"&gt;-&gt;&lt;/span&gt;&lt;span class="default"&gt;nombre &lt;/span&gt;&lt;span class="keyword"&gt;= “Daniel”;&lt;/span&gt;&lt;br /&gt;&lt;span class="default"&gt;$pichongol&lt;/span&gt;&lt;span class="keyword"&gt;-&gt;&lt;/span&gt;&lt;span class="default"&gt;apellido &lt;/span&gt;&lt;span class="keyword"&gt;= “Lopez”;&lt;/span&gt;  &lt;!--[if !supportLineBreakNewLine]--&gt;  &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;// Almacenamos la estructura con una expiracion de 10 segundos&lt;br /&gt;&lt;span class="default"&gt;$memcache&lt;/span&gt;&lt;span class="keyword"&gt;-&gt;&lt;/span&gt;&lt;span class="default"&gt;set&lt;/span&gt;&lt;span class="keyword"&gt;(&lt;/span&gt;&lt;span class="string"&gt;“pichongol”&lt;/span&gt;&lt;span class="keyword"&gt;, &lt;/span&gt;&lt;span class="default"&gt;$pichongol&lt;/span&gt;&lt;span class="keyword"&gt;, &lt;/span&gt;&lt;span class="default"&gt;false&lt;/span&gt;&lt;span class="keyword"&gt;, &lt;/span&gt;&lt;span class="default"&gt;10&lt;/span&gt;&lt;span class="keyword"&gt;) or die (&lt;/span&gt;&lt;span class="string"&gt;"No podemos guardar la estructura"&lt;/span&gt;&lt;span class="keyword"&gt;);&lt;/span&gt;  &lt;!--[if !supportLineBreakNewLine]--&gt;  &lt;!--[endif]--&gt;&lt;span class="keyword"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  lang="ES-AR" &gt;// Recuperamos la estructura&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  lang="ES-AR" &gt;&lt;br /&gt;&lt;span class="default"&gt;$result &lt;/span&gt;&lt;span class="keyword"&gt;= &lt;/span&gt;&lt;span class="default"&gt;$memcache&lt;/span&gt;&lt;span class="keyword"&gt;-&gt;&lt;/span&gt;&lt;span class="default"&gt;get&lt;/span&gt;&lt;span class="keyword"&gt;(&lt;/span&gt;&lt;span class="string"&gt;“pichongol”&lt;/span&gt;&lt;span class="keyword"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;echo &lt;/span&gt;&lt;span class="string"&gt;"Estructura recuperada:&lt;br /&gt;\n"&lt;/span&gt;&lt;span class="keyword"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="default"&gt;print_r&lt;/span&gt;&lt;span class="keyword"&gt;(&lt;/span&gt;&lt;span class="default"&gt;$result&lt;/span&gt;&lt;span class="keyword"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="default"&gt;?&gt;&lt;/span&gt;&lt;span class="html"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;¿Quienes usan Memcached?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;El desarrollo inicial y sus posteriores mejoras nacen como una necesidad de incrementar velocidades de respuesta para las peticiones Web, en sitios de trafico masivo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Actualmente, su uso continúa expandiéndose, a medida que el proyecto toma mayor fuerza con la ayuda de varios desarrolladores de la comunidad Open Source que revisan y agregan nuevas capacidades al proyecto.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;La siguiente es una lista acotada de sitios que actualmente utilizan Memcached para resolver cuestiones de escalabilidad:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="EN-US" &gt;LiveJournal&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="EN-US" &gt; { &lt;/span&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;a href="http://www.livejournal.com/"&gt;&lt;span style="" lang="EN-US"&gt;http://www.livejournal.com/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="EN-US" &gt; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style="margin-left: 18pt;"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="EN-US" &gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Memcached nace como un desarrollo para el backend de LiveJournal, y como tal, es el primer sitio que lo implementa.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="EN-US" &gt;Slashdot &lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="EN-US" &gt;&lt;span style=""&gt; &lt;/span&gt;{ &lt;/span&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;a href="http://www.slashdot.org/"&gt;&lt;span style="" lang="EN-US"&gt;http://www.slashdot.org/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="EN-US" &gt; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Wikipedia &lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;{ &lt;a href="http://www.wikipedia.org/"&gt;http://www.wikipedia.org/&lt;/a&gt; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Fotolog &lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;{ &lt;a href="http://www.fotolog.com/"&gt;http://www.fotolog.com/&lt;/a&gt; &lt;span style=""&gt; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style="margin-left: 18pt;"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;span style=""&gt;      &lt;/span&gt;Luego de tener ciertas falencias de performance (producto de tener que manejar en promedio, de &lt;st1:metricconverter productid="35 a" st="on"&gt;35 a&lt;/st1:metricconverter&gt; 40 millones de page views diarios) implementaron Memcached, logrando una gran mejoría en la prestación del servicio.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="EN-US" &gt;Hi5&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="EN-US" &gt; { &lt;a href="http://www.hi5.com/"&gt;http://www.hi5.com&lt;/a&gt; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="EN-US" &gt;Facebook&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="EN-US" &gt; { &lt;a href="http://www.facebook.com/"&gt;http://www.facebook.com&lt;/a&gt; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style="margin-left: 18pt;"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;span style=""&gt;      &lt;/span&gt;Contribuyó al proyecto, aportando muchas mejoras relacionadas con el manejo de memoria y los algoritmos de hashing, principalmente. Es actualmente la mayor implementación conocida, compuesta de alrededor de 200 servers de 1GB de memoria cada uno.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;      &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;Monitoreando su funcionamiento&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt;&lt;/o:p&gt;En estado natural, a medida que el tiempo transcurre, se incrementa la cantidad de ítems almacenados:&lt;b style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_Vw80fvSSNOY/RpCD2GEbEKI/AAAAAAAAAAw/wJtG8nyenYY/s1600-h/clip_image002.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_Vw80fvSSNOY/RpCD2GEbEKI/AAAAAAAAAAw/wJtG8nyenYY/s320/clip_image002.gif" alt="" id="BLOGGER_PHOTO_ID_5084708944666628258" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;En el anterior ejemplo, podemos ver como la cantidad de ítems se va incrementando hasta la hora 8, momento en el cual se realizó un “restart” del Memcached Server. Luego de ese instante, los ítems vuelven a almacenarse progresivamente.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;El “Hits Ratio” es el índice que nos indica la relacion de éxito entre las veces que solicitamos un item, y las veces que efectivamente esta cacheado y por ende recuperado.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Estadísticamente, y dependiendo del proyecto, es muy comun que el Hits Ratio se ubique en la franja del 85% - 98%. Claramente podemos imaginarnos la mejora al rendimiento general que esto representa, si tenemos en cuenta la merma en la carga de las Bases de datos, como así también el tiempo de respuesta de los Web servers.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;El siguiente grafico nos demuestra lo anteriormente dicho.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Obviamente, en algún momento de “restart” del Memcached Server, todos los objetos cacheados se pierden, y por ende cae el Hit Ratio, para en poco tiempo ubicarse dentro de los niveles normales.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_Vw80fvSSNOY/RpCD2WEbELI/AAAAAAAAAA4/ISA-GuMuql8/s1600-h/clip_image003.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_Vw80fvSSNOY/RpCD2WEbELI/AAAAAAAAAA4/ISA-GuMuql8/s320/clip_image003.gif" alt="" id="BLOGGER_PHOTO_ID_5084708948961595570" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Conclusión&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Memcached y escalabilidad van de la mano, y todos podemos sacar jugo de esta interesante herramienta.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;span style=";font-family:Arial;font-size:11;"  lang="ES-AR" &gt;Nuevamente se demuestra que las ideas brillantes son simples por naturaleza.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-2207459038793889810?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/2207459038793889810/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=2207459038793889810' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/2207459038793889810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/2207459038793889810'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2007/07/memcached-un-alivio-para-las-bases-de.html' title='Memcached: Un alivio para las bases de datos'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_Vw80fvSSNOY/RpCD2GEbEKI/AAAAAAAAAAw/wJtG8nyenYY/s72-c/clip_image002.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-1352744449743716098</id><published>2007-06-02T19:37:00.000-03:00</published><updated>2007-06-02T19:49:40.241-03:00</updated><title type='text'>Mi Weblog Personal</title><content type='html'>En esta oportunidad escribo para darle un poco de publicidad a mi weblog personal -&gt; &lt;a href="http://pichongol.wordpress.com"&gt;http://pichongol.wordpress.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No dejen de visitarlo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-1352744449743716098?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://pichongol.wordpress.com/' title='Mi Weblog Personal'/><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/1352744449743716098/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=1352744449743716098' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/1352744449743716098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/1352744449743716098'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2007/06/mi-weblog-personal.html' title='Mi Weblog Personal'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-116442706435792612</id><published>2006-11-25T00:45:00.000-03:00</published><updated>2006-11-26T19:21:44.480-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zend engine'/><category scheme='http://www.blogger.com/atom/ns#' term='zval'/><category scheme='http://www.blogger.com/atom/ns#' term='php5'/><category scheme='http://www.blogger.com/atom/ns#' term='zvalue'/><category scheme='http://www.blogger.com/atom/ns#' term='php6'/><title type='text'>Una variable en PHP</title><content type='html'>&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;A la hora de enumerar bondades de PHP como lenguaje de programación, no creo que a nadie se le ocurra pasar por alto el beneficio que el manejo de variables sin tipos explicitos nos proporciona.&lt;br /&gt;Para el que esté descolocado con esto de "variables sin tipo explicito", o mejor dicho...con tipo dinamico, me refiero a que no debemos especificar el tipo de variable a la hora de declararla.&lt;br /&gt;El motor se encargará de convertirla al tipo necesario según la operación que sobre ella quiera realizarse.&lt;br /&gt;&lt;br /&gt;Por ejemplo, en C:&lt;br /&gt;&lt;br /&gt;int numero = 100;&lt;br /&gt;char *nombre = "Pichongol";&lt;br /&gt;char *valor = "150";&lt;br /&gt;char letra = 'A';&lt;br /&gt;&lt;br /&gt;Luego no puedo hacer valor+numero, ya que tienen tipos distintos.&lt;br /&gt;&lt;br /&gt;Sin embargo en PHP, como sabemos, podemos hacer:&lt;br /&gt;$numero=100;&lt;br /&gt;$valor="150";&lt;br /&gt;&lt;br /&gt;y perfectamente podemos hacer $numero+$valor, ya que el operador "+" produce un casting implícito de $valor a entero, cuestión de desarrollar la operación suma con dos operandos enteros.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ok, todo muy lindo, pero como lo logra???&lt;/span&gt;&lt;br /&gt;La respuesta no es sencilla, y para eso debemos nuevamente sumergirnos en las inmensidades del código fuente.&lt;br /&gt;Antes que nada es necesario aclarar que es una variable para PHP.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Variables en PHP&lt;/span&gt;&lt;br /&gt;Una variable en PHP se compone de un identificador y de un valor.&lt;br /&gt;Dicho identificador funciona como clave para acceder al valor correspondiente en una tabla de hash interna para las variables. Intentaré aclarar un poco más este concepto.&lt;br /&gt;&lt;br /&gt;Supongamos que inicializamos una variable $nombre con el texto "Pichongol" y otra $edad con el entero 24:&lt;br /&gt;&lt;br /&gt;$nombre="Pichongol";&lt;br /&gt;$edad=24;&lt;br /&gt;&lt;br /&gt;Tendremos 2 identificadores (nombre y edad) y dos valores (Pichongol de tipo String y 24 de tipo entero).  El concepto idenficador está claro...ahora, que es un valor para PHP. Bueno, aqui tenemos un ejemplo de lo que un verdadero lenguaje de alto nivel debe hacer con los datos del userspace. PHP "encapsula" el valor junto con la información necesaria para su gestión.  La clave está en una estructura interna llamada "&lt;span style="font-weight: bold;"&gt;zval&lt;/span&gt;", ubicada en Zend/zend.h&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;typedef struct _zval_struct zval;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;struct _zval_struct {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;/* Variable information */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;zvalue_value value;        /* value */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;zend_uint refcount;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;zend_uchar type;    /* active type */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;zend_uchar is_ref;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esta estructura, compuesta de 4 campos, es el container por excelencia de toda variable que puede ser accedida desde el userspace (o sea, desde el script php)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;zvalue_value value;&lt;/span&gt;&lt;br /&gt;Es una estructura union, donde realmente reside el valor de la variable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;typedef union _zvalue_value {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    long lval;                    /* long value */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    double dval;                /* double value */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    struct {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        char *val;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        int len;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    } str;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    HashTable *ht;                /* hash table value */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    zend_object_value obj;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;} zvalue_value;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;zend_uint refcount;&lt;/span&gt;&lt;br /&gt;unsigned int utilizado por el ZendMM (Zend Memory Manager), para conocer la cantidad de referencias que se están haciendo en un momento X a ese zval.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;zend_uchar type;&lt;br /&gt;&lt;/span&gt;El verdadero tipo de variable, y que PHP utilizará para hacer las operaciones sobre dicho zval.&lt;br /&gt;Existen 8 tipos posibles para PHP5 y algunos más se agregan para PHP6.&lt;br /&gt;Los 8 tipos en realidad son constantes que representan un entero por cada una de ellas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;IS_NULL&lt;/li&gt;&lt;li&gt;IS_BOOL&lt;/li&gt;&lt;li&gt;IS_LONG&lt;/li&gt;&lt;li&gt;IS_DOUBLE&lt;/li&gt;&lt;li&gt;IS_STRING&lt;/li&gt;&lt;li&gt;IS_ARRAY&lt;/li&gt;&lt;li&gt;IS_OBJECT&lt;/li&gt;&lt;li&gt;IS_RESOURCE&lt;/li&gt;&lt;/ul&gt;Repasando campo a campo esta estructura nos podemos dar cuenta a grandes rasgos, el gran dinamismo que un zval puede tener en cuanto al tipo de dato que almacena.&lt;br /&gt;En verdad, cuando se produce un casting implícito, lo que sucede principalmente es una actualizacion del nuevo tipo en el campo &lt;span style="font-style: italic;"&gt;type, &lt;/span&gt;y el almacenamiento del valor en el campo &lt;span style="font-style: italic;"&gt;value.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En alguna entrada posterior en este blog, voy a meterme a fondo con los estos tipos, como se gestionan y cuales se agregan en PHP6.&lt;br /&gt;&lt;br /&gt;Aclarado esto, entonces en nuestra tabla de hash tendriamos algo de este estilo:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;table style="border: 1px solid ; width: 173px; height: 133px;"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;nombre&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;zval #1&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;edad&lt;/td&gt;&lt;br /&gt;&lt;td&gt;zval #2&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;Como hemos visto, y como seguiremos descubriendo, PHP tiene una complejidad extra a bajo nivel, y usa una serie importante de estructuras para gestionar los datos y facilitarnos las cosas como programadores.&lt;br /&gt;&lt;br /&gt;De este post se desprenden muchos temas interesantes a tocar en futuros posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Que es esto de la tabla de hash para las variables? Profundizar sobre ella.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Manejo de tipos, como se setean, como se gestionan a bajo nivel.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Diferencias entre tipos de datos PHP5 y tipos de datos PHP6.&lt;/li&gt;&lt;li&gt;El campo refcount del zval, para que sirve?? Que utilidad tiene?&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-116442706435792612?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/116442706435792612/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=116442706435792612' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/116442706435792612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/116442706435792612'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2006/11/una-variable-en-php.html' title='Una variable en PHP'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-116372729868021197</id><published>2006-11-16T22:23:00.000-03:00</published><updated>2006-11-26T18:51:13.610-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='php5'/><title type='text'>Un articulo polémico?</title><content type='html'>En el día de hoy ha sido publicado &lt;a href="http://www.maestrosdelweb.com/editorial/rorphp/" title="Ruby on Rails vs PHP: una falsa comparación"&gt;Ruby on Rails vs PHP: una falsa comparación.&lt;/a&gt;&lt;br /&gt;Es mi cuarto artículo publicado en &lt;a href="http://www.maestrosdelweb.com/"&gt;MaestrosdelWeb&lt;/a&gt;, y le ha parecido bueno a muchos de los lectores. Si si...es cierto, mostré la hilacha de PHPero ;-), pero intenté ser lo más imparcial posible.&lt;br /&gt;Ambas herramientas tienen pros y contras, y a veces afloran los sentimientos "extremistas" defendiendo una u otra tecnología.&lt;br /&gt;A decir verdad, está bueno generar un poco de polémica...de ella se aprende y mucho.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-116372729868021197?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.maestrosdelweb.com/editorial/rorphp/' title='Un articulo polémico?'/><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/116372729868021197/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=116372729868021197' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/116372729868021197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/116372729868021197'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2006/11/un-articulo-polmico.html' title='Un articulo polémico?'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-116320371642503903</id><published>2006-11-10T20:59:00.000-03:00</published><updated>2006-11-26T18:51:50.375-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zend engine'/><category scheme='http://www.blogger.com/atom/ns#' term='Sara Golemon'/><title type='text'>Oro en mis manos</title><content type='html'>Desde hace algunas horas tengo en mi posesión un fantastico libro sobre Php:&lt;br /&gt;Extending and Embedding PHP, de &lt;a href="http://blog.libssh2.org/"&gt;Sara Golemon.&lt;/a&gt;&lt;br /&gt;A mi entender, uno de los libros más avanzados de Php que han sido publicados al momento, pero no desde el punto de vista de PHP como lenguaje (Patrones, Frameworks, best practices, States of arts), sino desde el punto de vista de su arquitectura, funcionamiento, detalles internos, etc.&lt;br /&gt;Está orientado a la creación de extensiones en C, y explica detalladamente como utilizar nuestras funciones C convirtiendolas a funciones PHP a través de las extensiones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-116320371642503903?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/116320371642503903/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=116320371642503903' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/116320371642503903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/116320371642503903'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2006/11/oro-en-mis-manos.html' title='Oro en mis manos'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-115997758384224814</id><published>2006-10-04T12:49:00.000-03:00</published><updated>2006-11-26T18:52:47.247-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zend engine'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP source code'/><title type='text'>Navegando por el Source code</title><content type='html'>No puedo dejar de mencionar una herramienta de utilidad para todo aquel que le interese "navegar por aguas profundas".&lt;br /&gt;Estoy hablando de &lt;a href="http://lxr.php.net/"&gt;http://lxr.php.net/&lt;/a&gt;, un sitio que forma parte del Php Project, que permite browsear a través del código fuente utilizando una interfaz web, con link a todo tipo de simbolo C (funciones, estructuras, macros, variables, etc.).&lt;br /&gt;En realidad, es un script cgi, escrito para trabajar inicialmente con el source code de Linux -&gt; &lt;a href="http://lxr.linux.no/"&gt;http://lxr.linux.no/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Otro ejemplo: &lt;a href="http://lxr.mozilla.org/"&gt;Mozilla Cross-Reference&lt;/a&gt;.&lt;br /&gt;Sitio oficial: &lt;a href="http://lxr.linux.no/"&gt;http://lxr.linux.no/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-115997758384224814?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/115997758384224814/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=115997758384224814' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/115997758384224814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/115997758384224814'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2006/10/navegando-por-el-source-code.html' title='Navegando por el Source code'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-115955100870718979</id><published>2006-09-29T14:25:00.000-03:00</published><updated>2006-11-26T18:53:28.130-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zend engine'/><category scheme='http://www.blogger.com/atom/ns#' term='diferencias'/><category scheme='http://www.blogger.com/atom/ns#' term='php4'/><category scheme='http://www.blogger.com/atom/ns#' term='php5'/><category scheme='http://www.blogger.com/atom/ns#' term='php6'/><title type='text'>PHP4 y PHP5: ¿Cual elegir? ¿Migrar o no Migrar?</title><content type='html'>&lt;p&gt;Parte I&lt;br /&gt;A más de dos años de la llegada de la versión 5 de PHP, aún la comunidad de desarrolladores de PHP se plantea el interrogante. Las dudas básicamente circulan siempre el mismo camino, y ambas elecciones tienen sus ventajas y desventajas. Intentaremos en este informe orientar a los desarrolladores a decidirse por una u otra alternativa.&lt;br /&gt;&lt;br /&gt;Es importante remarcar antes de ubicarse de lleno en el análisis de las ventajas y desventajas de una u otra opción, las principales diferencias existentes entre ambas versiones, cuales son los cambios que repercuten más fuertemente en la compatibilidad de los scripts, y que es lo que nos depara el futuro en toda esta historia.&lt;br /&gt;&lt;br /&gt;Cambios profundos&lt;br /&gt;La llegada de PHP5 vino emparejada de una reestructuración del Core de PHP, lo que los creadores de PHP llama Zend Engine.&lt;br /&gt;Así como el lejano PHP3 incluye su Zend Engine 0.5, y PHP4 el Zend Engine 1.0, tenemos Zend Engine 2.0 en PHP5. El cambio de versión no fue trivial; incluye la reescritura casi total del modelo de objetos, entre sus cambios más sustanciales.&lt;br /&gt;Esto repercute directamente en los scripts de PHP4 que utilizan clases, tanto en la compatibilidad como en performance de ejecución. Posteriormente en este artículo nos referiremos nuevamente a este tema.&lt;br /&gt;&lt;br /&gt;Veamos un ejemplo que nos muestra un cambio sustancial en la implementación del modelo de objetos:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;class Persona {&lt;br /&gt;   function setNombre($nombre) {&lt;br /&gt;       $this-&gt;nombre = $nombre;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; function getNombre() {&lt;br /&gt;      return $this-&gt;nombre;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;function Algo($p) {&lt;br /&gt;    $persona-&gt;setNombre(?Daniel?);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;1 $persona = new Persona();&lt;br /&gt;2 $persona-&gt;setNombre(?Pichongol?);&lt;br /&gt;3 Algo($persona);&lt;br /&gt;4 echo $persona-&gt;getNombre();&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;¿Cuál es el problema en este código corriendo en PHP4?&lt;br /&gt;En la línea 1 instanciamos un objeto de la clase Persona.&lt;br /&gt;Luego le decimos que se llama Daniel.&lt;br /&gt;El error de implementación viene con la línea 3. El argumento $p que recibe Algo, no es mas que una copia de $persona, y eso esta MAL. ¿Porque?, mínimamente por 2 razones.&lt;br /&gt;La primera razón es que esta estrategia es POO-No compatible. Claramente cuando hablamos del Paradigma Orientado a Objetos, estamos casi descartando que cada objeto sea referenciado por su Identificador.&lt;br /&gt;Sin embargo, el Zend Engine 1.0 no está preparado para dicha acción:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;function ejemplo($val){&lt;br /&gt;     echo $val;&lt;br /&gt;}&lt;br /&gt;$cadena = ?texto?;&lt;br /&gt;ejemplo($cadena);&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;La variable $cadena pasada como argumento a la función ejemplo, es copiada para su uso local dentro de dicha función. Es lo que se conoce como paso de parámetros por valor.&lt;br /&gt;El Zend Engine 1.0 hace exactamente esto para todas las funciones, inclusive para las que están dentro de una clase, las cuales en ese caso actúan como métodos:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;function Algo($p) {&lt;br /&gt;$persona-&gt;setNombre(?Daniel?);&lt;br /&gt;}&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Volviendo al ejemplo inicial de la clase persona, el método Algo recibe una copia (un clon) del objeto Persona.&lt;br /&gt;&lt;br /&gt;La segunda razón viene emparejada con la primera, siendo consecuencia de esta.&lt;br /&gt;Cualquier modificación del objeto Persona que se produzca dentro del método Algo, solo tendrá alcance local, y no se verá reflejado cuando la función retorne.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;Algo($persona);&lt;br /&gt;echo $persona-&gt;getNombre();&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;En ese caso la modificación del nombre que hace la función Algo al objeto Persona no se ve reflejada cuando hacemos echo $persona-&gt;getNombre().&lt;br /&gt;En nuestro browser veremos ?Pichongol?.&lt;br /&gt;&lt;br /&gt;Este es solo un ejemplo del porque de la reestructuración tan importante en el Core de PHP. Es claro que toda reestructuración barre con cuestiones de compatibilidad, para ganar en otros skills; en este caso claramente estamos ganando en performance, al liberarnos del overhead que implica la constante copia de objetos que son argumentos de métodos y funciones.&lt;br /&gt;En artículos posteriores trataremos en mayor detalle y profundidad los distintos aspectos que fueron modificados, haciendo una comparativa entre como se logran en PHP4 y como se logran en PHP5. Además de explicar profundamente las diferencias en el modelo de objetos nos quedan temas pendientes como Opciones de configuración (php.ini), Conexión a MySQL (mysqli), cambios en los módulos, etc.&lt;br /&gt;&lt;br /&gt;Hecha esta introducción, estamos en condiciones de definir las distintas situaciones en las que se puede encontrar el desarrollador, y que aspectos juegan a su favor o en contra según la situación en la que se encuentre.&lt;br /&gt;&lt;br /&gt;¿Cual es mi escenario?&lt;br /&gt;En el momento de plantearse la pregunta, el desarrollador seguramente se ubicará en alguno de los dos escenarios posibles:&lt;br /&gt;&lt;/p&gt;&lt;li&gt;Newbie (Iniciación en PHP).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Experimentado.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Newbie&lt;br /&gt;En el planteo de esta discusión, podríamos decir que es la situación ideal, o por lo menos la más beneficiosa. Si eres una persona que quiere arrancar en PHP, no lo dudes, PHP5 es para ti. Tus aplicaciones gozaran de las nuevas capacidades en OOP, obtendrás el beneficio de una mejor performance de ejecución (esta comprobado experimentalmente que PHP5 corre un 25% más rápido que PHP4) y tu código estará muy bien acondicionado en cuanto a la compatibilidad con el nuevo hijo que asoma: PHP6.&lt;br /&gt;Por cierto, no todo es color de rosas. Una de los mayores beneficios a la hora de elegir PHP para trabajar en nuestro proyecto es la gran cantidad de código que podemos encontrar en Internet, y utilizarlo para nuestros trabajos. Tenemos una gran probabilidad de que ante alguna tarea que se nos plantea, podamos encontrar algún script que nos solucione la vida, obviamente adaptándolo a nuestras necesidades.&lt;br /&gt;Ahora bien, no todo el código que vamos a encontrar es compatible con PHP5. De hecho la gran mayoría todavía no se ha adaptado. Es cierto que con algún setting en nuestro php.ini podemos ayudar a darle mayor compatibilidad, pero como contrapartida muchas de estas settings se eliminaran en PHP6.&lt;br /&gt;¿Qué queda? Hacerlo compatible modificando el código, una tarea que para un desarrollador que se inicia no siempre es sencillo. De todas formas a no alarmarse, que los grandes proyectos (PHPNuke, PHPBB, etc.) ofrecen compatibilidad.&lt;br /&gt;&lt;br /&gt;Experimentado&lt;br /&gt;En este caso, el optar por quedarse con PHP4 o pasar a PHP5 depende de nuestra aplicación.&lt;br /&gt;Las interrogantes que el desarrollador se puede plantear podrían ser:&lt;br /&gt;&lt;li&gt;¿Mi aplicación usa clases y objetos?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;¿Mi motor de Base de datos es MySQL?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;¿Utilizo un hosting externo?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;¿Mi aplicación sufre modificaciones en cuanto a los requerimientos y lógica de negocios?&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Pasemos a discutir ventajas y desventajas en cada uno de los interrogantes:&lt;br /&gt;&lt;br /&gt;¿Mi aplicación usa clases y objetos?&lt;br /&gt;Como pudimos comprender al comienzo de este articulo, uno de los principales esfuerzos de los diseñadores del Zend Engine radicó en el mejoramiento del modelo de objetos, basándose claramente en un referente indiscutible en esta materia como lo es Sun. Salvando las diferencias, se han tomado muchas cosas de Java, desde convenciones de nomenclaturas hasta estrategias de implementación.&lt;br /&gt;Seria un desperdicio no utilizar dicho esfuerzo, sobre todo si nuestra aplicación hace un uso exhaustivo de clases y objetos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Mi motor de Base de datos es MySQL?&lt;br /&gt;A diferencia de la estrategia de PHP4 para la conectividad PHP/MySQL, en la que el Core de PHP nos provee de un set de funciones para dicha interacción, en PHP5 MySQL nos provee de un API externo.&lt;br /&gt;Básicamente, la razón de este cambio fue una modificación de licencia de MySQL, que obligo a PHP a hacer de MySQL una base de datos más, y no ?LA? base de datos, como venia siendo en PHP3 y PHP4.&lt;br /&gt;De todas formas, esto no repercute en nuestro código, sino en la performance de nuestra aplicación.&lt;br /&gt;El hecho de que una extensión no forme parte del Core de PHP y pase a ser externa nos genera un overhead, una sobrecarga de ejecución en detrimento de la performance.&lt;br /&gt;Como contrapartida, PHP5 nos da la posibilidad de sacarle el mayor jugo posible a las muchas mejoras incorporadas en MySQL 4.1.3 o superior, a través del API mysqli.&lt;br /&gt;Esto implica hacer uso de otras funciones, modificando nuestro código.&lt;br /&gt;Ahora bien, ¿que tan costosa es esta reescritura? Dependerá de nuestra estrategia de conexión a base de datos. ¿Utilizamos una capa de abstracción del estilo ADOdb? Si la utilizamos estaremos mucho mejor parados frente a tal reescritura. En caso contrario el tiempo invertido será sensiblemente mayor.&lt;br /&gt;&lt;br /&gt;¿Utilizo un hosting externo?&lt;br /&gt;En caso de no disponer de un hosting propio, y tener que depender de un hosting externo que nos provea de PHP, seguramente el hecho de pensar en migrar a PHP5 puede ser un problema. De hecho, estadísticas de principio de 2006 nos indican que solo alrededor del 5% de los hosting que proporcionan PHP, tienen PHP5.&lt;br /&gt;Esto no hace mas que reflejar la lentitud con la que se esta moviendo el proceso de traspaso de PHP4 hacia PHP5.&lt;br /&gt;Una pregunta que surge directamente sobre este tema es ¿Por qué?&lt;br /&gt;Bueno, si uno tomo una distribución de Linux, es poco probable que la versión de PHP5 sea la incluida.&lt;br /&gt;La conformidad de los programadores con PHP4 es grande, y mucha de la documentación existente esta escrita para PHP4.&lt;br /&gt;De todas formas, a no dormirse con PHP4. Un tema que se trata en la segunda parte de este artículo es lo nuevo que nos trae PHP6. Veremos que PHP5 en muchos aspectos es una transición mientras que la confirmación se llama PHP6.&lt;br /&gt;&lt;br /&gt;¿Mi aplicación sufre modificaciones en cuanto a los requerimientos y lógica de negocios?&lt;br /&gt;Cuando las aplicaciones tienen requerimientos de cliente bastante cambiantes, y se emplean recursos para su mantenimiento, o utilizamos una metodología de desarrollo incremental (software versionado), lo ideal es utilizar lo último que nos proporciona nuestra plataforma de programación. Generalmente lo que se busca es un cambio gradual, modular, y sostenido.&lt;br /&gt;Por otro lado, si nuestras aplicaciones residen en producción sin mayores modificaciones (algún proceso batch, alguna aplicación depurada, algún algoritmo estable) y estamos conformes con su funcionamiento, quizás no sea de nuestro interés migrar hacia una nueva versión.&lt;br /&gt;&lt;br /&gt;Nos queda analizar que hay de nuevo en PHP6 y que cosas deberíamos ir teniendo en cuenta si utilizamos PHP4 o PHP5. Eso será la segunda parte de nuestro artículo. &lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-115955100870718979?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/115955100870718979/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=115955100870718979' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/115955100870718979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/115955100870718979'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2006/09/php4-y-php5-cual-elegir-migrar-o-no.html' title='PHP4 y PHP5: ¿Cual elegir? ¿Migrar o no Migrar?'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-115937059543854765</id><published>2006-09-27T11:33:00.000-03:00</published><updated>2006-11-26T18:54:32.497-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP source code'/><category scheme='http://www.blogger.com/atom/ns#' term='gdb'/><title type='text'>Debugueando libphp5_module</title><content type='html'>A la hora de investigar el codigo fuente de cualquier pieza software, es muy interesante tener otras herramientas de apoyo en cuenta. Tal es el caso de &lt;a href="http://www.gnu.org/software/gdb/"&gt;gdb&lt;/a&gt;, una herramienta de excepción, simplemente excelente.&lt;br /&gt;&lt;br /&gt;Nuestro interés aquí pasa por el modulo sapi de apache2 apache2handler, para cargar el módulo libphp5.so.&lt;br /&gt;&lt;br /&gt;Teniendo en cuenta que estamos parados en el directorio home de Apache, vamos al bin, y cargamos los simbolos de httpd sobre gdb:&lt;br /&gt;&lt;br /&gt;#cd bin&lt;br /&gt;#gdb httpd&lt;br /&gt;&lt;br /&gt;Este es el punto de setear un breakpoint. Mi consejo, arrancar con la función php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_modules, uint num_additional_modules), ubicada dentro del source code de php-5.1.6 en /main/main.c:1366 .&lt;br /&gt;Básicamente, esta función es disparada por apache, cuando intenta cargar libphp5.so,&lt;br /&gt;y tiene como misión cosas tan importantes como inicializar el Zend Engine definiendo las funciones de utilidad (output, execute, etc.), inicializar hash tables internas, opcodes, etc.&lt;br /&gt;&lt;br /&gt;#b php_module_startup&lt;br /&gt;&lt;br /&gt;Luego correr httpd con -X, opción utilizada para indicarle al apache que corra como single process, situación necesaria para capturar request desde el debugger.&lt;br /&gt;&lt;br /&gt;#run -X&lt;br /&gt;&lt;br /&gt;Tendría que aparecer algo como esto.&lt;br /&gt;Yo estoy utilizando gdb 6.3.&lt;br /&gt;&lt;br /&gt;#(gdb) run -X&lt;br /&gt;Starting program: /home/dlopez/bin/httpd -X&lt;br /&gt;[Thread debugging using libthread_db enabled]&lt;br /&gt;[New Thread 1075886304 (LWP 10288)]&lt;br /&gt;warning: Temporarily disabling breakpoints for unloaded shared library "/home/dlopez/modules/libphp5.so"&lt;br /&gt;[Switching to Thread 1075886304 (LWP 10288)]&lt;br /&gt;&lt;br /&gt;Breakpoint 1, php_module_startup (sf=0x40514ec0, additional_modules=0x40514f60, num_additional_modules=1)&lt;br /&gt;   at /home/dlopez/php-5.1.5/main/main.c:1401&lt;br /&gt;1401            module_shutdown = 0;&lt;br /&gt;#(gdb) _&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahora es cuestion de jugar un rato: comandos next, step, backtrace, trace, stack, etc.&lt;br /&gt;Para mas info, la &lt;a href="http://www.gnu.org/software/gdb/documentation/%20"&gt;documentación&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-115937059543854765?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/115937059543854765/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=115937059543854765' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/115937059543854765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/115937059543854765'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2006/09/debugueando-libphp5module.html' title='Debugueando libphp5_module'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-115928093533796723</id><published>2006-09-26T11:23:00.000-03:00</published><updated>2006-11-26T18:55:21.321-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zend engine'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP source code'/><title type='text'>Hack PHP</title><content type='html'>El realmente interesante la idea del open source. No creo descubrir nada nuevo con este statement, pero la realidad es que uno se da cuenta del verdadero potencial cuando lo vive en carne propia.&lt;br /&gt;Tengo un objetivo, no puedo vivir sin ellos. Actualmente estoy interesado en la construccion de extensiones para php, escritas en C. Para comprender como hacerlas, quizas hace falta algo mas que la documentacion oficial, algo como el mismo source code.&lt;br /&gt;Un buen dia no muy lejano decidí­ sentarme a estudiar como es que trabaja &lt;a href="http://www.zend.com/php5/zend-engine2.php"&gt;Zend Engine2&lt;/a&gt;, en php-5.1.6.&lt;br /&gt;Como idea previa, hay que tener muy en claro como es que se expanden las macros, el uso de punteros a funciones, y estructuras, incluyendo uniones, para la implementación de listas, tablas de hash y otras yerbas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-115928093533796723?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/115928093533796723/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=115928093533796723' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/115928093533796723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/115928093533796723'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2006/09/hack-php.html' title='Hack PHP'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-109899065343815450</id><published>2004-10-28T16:07:00.000-03:00</published><updated>2004-10-28T16:10:53.436-03:00</updated><title type='text'>algunos misterios se van develando</title><content type='html'>Makefiles....&lt;br /&gt;&lt;br /&gt;que significa esto? me dio algunos dolores de cabeza:&lt;br /&gt;&lt;br /&gt;cpp.obj:&lt;br /&gt;	cl /c /W3 /O1syg /GAF3 /Fo$@ $&lt;&lt;br /&gt;&lt;br /&gt;Primero...&lt;br /&gt;cpp.obj es una manera vieja de representar %.obj : %.cpp&lt;br /&gt;Ahora esto esta un poquito mas claro.&lt;br /&gt;&lt;br /&gt;Segundo...&lt;br /&gt;	cl /c /W3 /O1syg /GAF3 /Fo$@ $&lt;&lt;br /&gt;&lt;br /&gt;Viejo... cl es el compilador de MSVC!,...&lt;br /&gt;iba a estar jodido tratar de compilar esto...el tema es que tiene muchas opciones pasadas al cl,..tengo que tratar de emularlo para el gcc.&lt;br /&gt;Ya estoy buscado info del compi de Stallman.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-109899065343815450?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/109899065343815450/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=109899065343815450' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109899065343815450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109899065343815450'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2004/10/algunos-misterios-se-van-develando.html' title='algunos misterios se van develando'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-109898549622013318</id><published>2004-10-28T14:41:00.000-03:00</published><updated>2006-09-27T12:57:14.946-03:00</updated><title type='text'>virus y bacterias....</title><content type='html'>ayer fue un dia con mucho de genética...&lt;br /&gt;ya arranque con la parte de adn.&lt;br /&gt;Comentario al margen, (que bueno el capitulo de virus y bacterias), realmente apasionante.&lt;br /&gt;El tema es que es necesario comprender la naturaleza de estos (organismos?), para poder comprender luego las pruebas realizadas para determinar definitivamente al ADN como trasmisor de la información genética.&lt;br /&gt;&lt;br /&gt;Quiero tener un microscopiooooo ! electrónico!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-109898549622013318?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/109898549622013318/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=109898549622013318' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109898549622013318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109898549622013318'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2004/10/virus-y-bacterias.html' title='virus y bacterias....'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-109890097444597818</id><published>2004-10-27T15:13:00.000-03:00</published><updated>2004-10-28T16:12:57.860-03:00</updated><title type='text'>Makefile...ya te voy a descular</title><content type='html'>OBJS = xproxy.obj&lt;br /&gt;LIBS = wsock32.lib user32.lib kernel32.lib advapi32.lib libc.lib&lt;br /&gt;EXE  = xproxy.dll&lt;br /&gt;all: $(EXE) client.exe&lt;br /&gt;$(EXE): $(OBJS) makefile&lt;br /&gt;	link /out:$(EXE) /nodefaultlib /base:0x7E1A0000 /dll $(OBJS) $(LIBS) /nodefaultlib /entry:DllMain /ignore:4078 /merge:.rdata=.text &lt;br /&gt;/merge:.data=.text /section:.text,erwx /filealign:512 /subsystem:windows,4.00 &lt;br /&gt;/nologo /opt:ref /stub:../work/stub.exe&lt;br /&gt;	-..\work\cleanpe $(EXE)&lt;br /&gt;#	-upx -9 $(EXE)&lt;br /&gt;.c.obj:&lt;br /&gt;	cl /c /W3 /O1syg /GAF3 /Fo$@ $&lt;&lt;br /&gt;.cpp.obj:&lt;br /&gt;	cl /c /W3 /O1syg /GAF3 /Fo$@ $&lt;&lt;br /&gt;clean:&lt;br /&gt;	-del *.obj&lt;br /&gt;	-del $(EXE)&lt;br /&gt;	-del *.inc&lt;br /&gt;&lt;br /&gt;client.exe: client.c&lt;br /&gt;	cl /Ox client.c&lt;br /&gt;	-upx -9 client.exe&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El bendito xproxy.obj...de donde lo saca???&lt;br /&gt;&lt;br /&gt;Esto me llama algo la atencion...:&lt;br /&gt;.c.obj:&lt;br /&gt;	cl /c /W3 /O1syg /GAF3 /Fo$@ $&lt;&lt;br /&gt;&lt;br /&gt;Voy a investigar un poco sobre eso.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-109890097444597818?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/109890097444597818/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=109890097444597818' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109890097444597818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109890097444597818'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2004/10/makefileya-te-voy-descular.html' title='Makefile...ya te voy a descular'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-109882345181652141</id><published>2004-10-26T17:40:00.000-03:00</published><updated>2004-11-04T17:47:06.100-03:00</updated><title type='text'>opciones del linker</title><content type='html'>siguiendo con mi estudio del makefile, me llamaban la atencion una serie de opciones que se le pasaban a linker...&lt;br /&gt;&lt;br /&gt;link /out:$(EXE) $(OBJS) $(LIBS)$(RSRC) /nologo /nodefaultlib /base:0x004A0000 &lt;br /&gt;/opt:ref /stub:work\stub.exe /ignore:4078 /merge:.rdata=.text /merge:.data=.text&lt;br /&gt;/section:.text,erwx /filealign:512 /entry:WinMain /subsystem:windows,4.00&lt;br /&gt;&lt;br /&gt;Bueno, encontre la solucion en el msdn de microsoft...por suerte ahi estan detalladas todas las opciones que se le pueden pasar al linker...una verdadera pegada&lt;br /&gt;&lt;br /&gt;cosas interesantes: &lt;br /&gt;&lt;br /&gt;base: la direccion de carga del .exe, algo extraordinario&lt;br /&gt;entry: punto de entrada de la ejecucion&lt;br /&gt;stub: programa ms-dos atachado al programa win32 al correr&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-109882345181652141?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/109882345181652141/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=109882345181652141' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109882345181652141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109882345181652141'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2004/10/opciones-del-linker.html' title='opciones del linker'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-109881456490884459</id><published>2004-10-26T15:14:00.000-03:00</published><updated>2004-10-26T15:16:04.920-03:00</updated><title type='text'>Opera Rulez</title><content type='html'>Me acabo de cambiar el nick que por tanto tiempo tuve en el msn...&lt;br /&gt;&lt;br /&gt;Last: Daniel, Bloguero&lt;br /&gt;New: W32/blogger.A.worm /* Opera Rulez */ Peligrosidad: Undefined&lt;br /&gt;&lt;br /&gt;Muy buen nick, a mi criterio...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-109881456490884459?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/109881456490884459/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=109881456490884459' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109881456490884459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109881456490884459'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2004/10/opera-rulez.html' title='Opera Rulez'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-109879861513738662</id><published>2004-10-26T10:44:00.001-03:00</published><updated>2004-10-26T10:50:15.136-03:00</updated><title type='text'>De makefiles y otra yerbas</title><content type='html'>y aqui estamos, siguiendo con nuestra lectura de makefiles.&lt;br /&gt;Me esta quedando todo bastante mas claro como genera todos los archivos el MyDoom.A...&lt;br /&gt;el tema por el cual me trabe, estaba aca:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;#include "xproxy/xproxy.inc"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Este archivo no existe en dicha carpeta...pero relojeando el makefile me di cuenta que lo genera en dicho script:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;xproxy\xproxy.inc: work\crypt1.exe xproxy\xproxy.dll xproxy\xproxy.tmp work\bin2c.exe xproxy\xproxy.tmp xproxy_data &gt;xproxy\xproxy.inc del xproxy\xproxy.tmp&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Seguimos avanzando...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-109879861513738662?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.ubiobio.cl/~gpoo/documentos/make/makefile.html' title='De makefiles y otra yerbas'/><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/109879861513738662/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=109879861513738662' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109879861513738662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109879861513738662'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2004/10/de-makefiles-y-otra-yerbas.html' title='De makefiles y otra yerbas'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-109879823476412383</id><published>2004-10-26T10:40:00.000-03:00</published><updated>2004-10-26T10:52:01.386-03:00</updated><title type='text'>Veremos que pasa</title><content type='html'>el examen de economia fue un tanto mas difucil de lo pensado, pero bue, seguramente es por la posibilidad de promociÃ³n. En fin veremos como me fue.&lt;br /&gt;Por lo prnto, me queda el camino libre luego de aprobar el primer parcial de analisis matematico II, y hacer los parciales de probabilidad (seguramente me dan la nota maÃ±ana) y el de economia, para seguir con mi avances en el libro de genÃ©tica.&lt;br /&gt;Ya me acordÃ© de quien es el libro. De Beadle...son dos en realidad. Un libro de la hostia.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-109879823476412383?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/109879823476412383/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=109879823476412383' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109879823476412383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109879823476412383'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2004/10/veremos-que-pasa.html' title='Veremos que pasa'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-109871752908836514</id><published>2004-10-25T13:16:00.000-03:00</published><updated>2006-11-26T18:56:25.757-03:00</updated><title type='text'>Seguro que si</title><content type='html'>estos weblogs seguramente son indexados por google, ...me lo sospecho que si, por lo visto en la estructura de código y de enlaces, estan todas las condiciones dadas para que lo indexe el googlebot...&lt;br /&gt;jejej blogger.com, otro plan macabro de brin y page para conquistar the microsoft world?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-109871752908836514?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/109871752908836514/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=109871752908836514' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109871752908836514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109871752908836514'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2004/10/seguro-que-si.html' title='Seguro que si'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-109871719422576601</id><published>2004-10-25T13:11:00.000-03:00</published><updated>2006-09-27T12:30:17.946-03:00</updated><title type='text'>Tengo examen de economí­a</title><content type='html'>Hice lo que pude, .... pretendí­a estudiar un poco más economí­a para ver si promocionaba, pero bue, las cartas estan echadas....&lt;br /&gt;De todos modos hoy me voy un rato antes del laburo, por lo que tengo un rat mas para repasar, veremos que pasa...&lt;br /&gt;che, esto del blog esta bueno, espero no aburrirme&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-109871719422576601?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/109871719422576601/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=109871719422576601' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109871719422576601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109871719422576601'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2004/10/tengo-examen-de-economa.html' title='Tengo examen de economí­a'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-109871702136140368</id><published>2004-10-25T13:06:00.000-03:00</published><updated>2004-10-25T12:10:21.360-03:00</updated><title type='text'>MyDoom.A</title><content type='html'>Dije, y porque no un virus argentino?&lt;br /&gt;Es cuestion de investigar un poco. Antes que nada quiero decir que mi virus no pretende ser daÃ±ino, simplemente pretende apropiarse del procesador de sus maquinas por breves intantes amigos :-).&lt;br /&gt;No lo tomen a mal, es solo con fines educativos :-)&lt;br /&gt;&lt;br /&gt;Navegando un poco por internet encontre los fuentes del MyDom.A....&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-109871702136140368?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/109871702136140368/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=109871702136140368' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109871702136140368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109871702136140368'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2004/10/mydooma.html' title='MyDoom.A'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8870498.post-109871589366664086</id><published>2004-10-25T11:43:00.000-03:00</published><updated>2006-09-27T12:33:05.013-03:00</updated><title type='text'>Leyendo algo de genÃ©tica</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Siempre fue algo que me gusto, pero bue, por x motivos nunca me habia puesto.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Por fin me decidi. Mi primera inversion en genetica. $4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;el libro es "Introducción a la nueva genética" de... ya me voy a acordar&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Lo cierto es que enganchó mucho, hoy cosas muy interesantes.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Pensar que todo nació con una molécula de ácido nucléico es algo maravilloso... algo asombroso.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Leer acerca del experimento de Mendel resultó muy constructivo...(comentario al margen), que suerte tuvo para justo analizar caracteristicas de la arveja que son independientes a nivel  genético. Por ahi lei que la chance de agarrar 4 caracteristicas independientes es de 1 en 200, o una cosa asi. Mucha suerte, pero un fin , una gran experiencia.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8870498-109871589366664086?l=pichongol.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichongol.blogspot.com/feeds/109871589366664086/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8870498&amp;postID=109871589366664086' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109871589366664086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8870498/posts/default/109871589366664086'/><link rel='alternate' type='text/html' href='http://pichongol.blogspot.com/2004/10/leyendo-algo-de-gentica.html' title='Leyendo algo de genÃ©tica'/><author><name>Pichongol</name><uri>http://www.blogger.com/profile/14684398824127776739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
