<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://php.apsique.com" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>Php y otras yerbas - 3AM, con Mi Primer PC de Verdad - Comentarios</title>
 <link>http://php.apsique.com/contenido/3am_con_mi_primer_pc_verdad</link>
 <description>Comentarios para &quot;3AM, con Mi Primer PC de Verdad&quot;</description>
 <language>es</language>
<item>
 <title>Hola a todo el mundo soy muy</title>
 <link>http://php.apsique.com/contenido/3am_con_mi_primer_pc_verdad#comment-47949</link>
 <description>&lt;p&gt;Hola a todo el mundo soy muy nuevo en esta materia y necesito de vuestra ayuda. Ya se ocupar toda el area de diseño de flash. gif para mi pagina pero ahora necesito crear una pagina para un colegio y este desea que yo le agregue un link donde pida rut del alumno y muestre sus datos y pueda generar certificados via internet. para mi a sido un caos puesto que no se nada de programacion ahora si ustedes me pueden enfocar un poco se los agradeceria&lt;/p&gt;
</description>
 <pubDate>Fri, 08 Sep 2006 06:32:42 -0700</pubDate>
 <dc:creator>Ivan Castro</dc:creator>
 <guid isPermaLink="false">comment 47949 at http://php.apsique.com</guid>
</item>
<item>
 <title>Me anoto con un mojito.</title>
 <link>http://php.apsique.com/contenido/3am_con_mi_primer_pc_verdad#comment-7409</link>
 <description>&lt;p&gt;Me anoto con un mojito.&lt;/p&gt;
</description>
 <pubDate>Sun, 28 Aug 2005 13:55:09 -0700</pubDate>
 <dc:creator>aguayoki</dc:creator>
 <guid isPermaLink="false">comment 7409 at http://php.apsique.com</guid>
</item>
<item>
 <title>Ja</title>
 <link>http://php.apsique.com/contenido/3am_con_mi_primer_pc_verdad#comment-7363</link>
 <description>&lt;p&gt;Con seco me refiero a que tienes un estilo un tanto ejecutivo. Los psicólogos tendemos a ser un tanto más &quot;húmedos&quot;: comenzamos a hablar de la familia, el tiempo y esas cosas.&lt;br /&gt;
Pero es mejor así, se conversa de temas interesantes de una.&lt;br /&gt;
Ah, y claro que hay que repetir la junta. Un buen ron no estaría mal :)&lt;/p&gt;
</description>
 <pubDate>Sun, 28 Aug 2005 11:47:05 -0700</pubDate>
 <dc:creator>clbustos</dc:creator>
 <guid isPermaLink="false">comment 7363 at http://php.apsique.com</guid>
</item>
<item>
 <title>Interesante texto, joven...</title>
 <link>http://php.apsique.com/contenido/3am_con_mi_primer_pc_verdad#comment-7360</link>
 <description>&lt;p&gt;Interesante texto, joven... Bastante instructivo, le diré.&lt;/p&gt;
&lt;p&gt;Ahora, confirmo lo dicho: un gustazo haberlo conocido. Creo que faltó tiempo para tocar más temas geeks... Habrá que repetirla.&lt;/p&gt;
&lt;p&gt;Seco??? Yo?? A ver?? No entiendo...&lt;/p&gt;
&lt;p&gt;En fin, saludos...&lt;/p&gt;
</description>
 <pubDate>Sun, 28 Aug 2005 01:28:53 -0700</pubDate>
 <dc:creator>aguayoki</dc:creator>
 <guid isPermaLink="false">comment 7360 at http://php.apsique.com</guid>
</item>
<item>
 <title>3AM, con Mi Primer PC de Verdad</title>
 <link>http://php.apsique.com/contenido/3am_con_mi_primer_pc_verdad</link>
 <description>&lt;h2&gt;La junta&lt;/h2&gt;
&lt;p&gt;El viernes en la noche, tras descubir que vivía en San Pedro, me junté con uno de los chicos de &lt;a href=&#039;http://miprimerpc.perodeverdad.cl&#039;&gt;MPPCDV&lt;/a&gt;, &lt;a href=&#039;http://www.aguayoki.cl/eduardo/&#039;&gt;Eduardo&lt;/a&gt;, o aguayoki, en el &quot;espacio virtual&quot;. &lt;/p&gt;
&lt;p&gt;Simpático cabro. Un tanto seco, pero con mucho entusiasmo y gusto por lo que hace. Nos quedamos como 2 horas y media hablando de la campaña, de Linux, de Ubuntu, de las milas de distribuciones que ha instalado en su pobre Pentium II (claro, el que sirve sus páginas), de anime, de... bueno, de muchas cosas.&lt;/p&gt;
&lt;p&gt;Un gusto conocerlo en persona, caballero. Me saco el sombrero&lt;/p&gt;
&lt;h2&gt;La máquina tras MPPCDV&lt;/h2&gt;
&lt;p&gt;Creo que no me he detenido ha hablar de como se desarrolló el código de la página.&lt;/p&gt;
&lt;p&gt;Como al principio no creímos que la campaña fuese a crecer tanto, decidí ocupar un estilo KISS de trabajo. O, en otras palabras, lo más sencillo sin ser simplón.&lt;/p&gt;
&lt;p&gt;Primero, un archivo de configuración se encarga de conectarse a la base de datos con Adodb y de contener las funciones de uso común a todos los módulos. Cada funcionalidad es implementada por un archivo php, el cual llama &lt;strong&gt;siempre&lt;/strong&gt; a un archivo html encargado del diseño. La vieja separación código-presentación. El código para traer el html es deprimente&lt;/p&gt;

&lt;div class=&#039;code&#039;&gt;&lt;div class=&quot;hl-main&quot;&gt;&lt;ol class=&quot;hl-main&quot;&gt;&lt;li&gt;&amp;nbsp;&lt;span class=&quot;hl-code&quot;&gt;function template($sTemplate, $aVars) &lt;/li&gt;
&lt;li&gt;&amp;nbsp;{&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    ob_start();&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    extract($aVars);&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    include_once (dirname(__FILE__) .&#039;/&#039;.$sTemplate);&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    $sTexto = ob_get_contents();&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    ob_clean();&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    return $sTexto;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;}&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Nada del otro mundo, ¿cierto? Para los que tengan buena memoria, se darán cuenta que es el mismo código que presente al hablar sobre plantillas. La gran gracia que tiene hacer esto, trabajar con html con php &quot;vanilla&quot;, es que &lt;a href=&#039;http://www.virtualityinblack.com/wp/&#039;&gt;Alberto&lt;/a&gt; puede modificar los archivos tranquilamente en Dreamweaver o en lo que quiera,  vía FTP, teniendo el cuidado de no tocar el php. Todo está codificado en UTF-8, para evitar problemas de codificaciones y demases. Y, como corresponde, con Subversion como controlador de versiones por si algo falla.&lt;/p&gt;
&lt;p&gt;El código de verificación de RUT es el mismo que se puede conseguir &lt;a href=&#039;http://php.apsique.com/taxonomy/term/450&#039;&gt;aquí&lt;/a&gt;, con algunas pequeñas adaptaciones&lt;/p&gt;
&lt;p&gt;Otro detalle interesante es el método de traducción. Primero, me basé en el campo &lt;a href=&#039;http://www.google.cl/url?sa=t&amp;ct=res&amp;cd=1&amp;url=http%3A//www.w3.org/Protocols/rfc2616/rfc2616-sec14.html&#039;&gt;Accept Charset&lt;/a&gt;, que es parte del protocolo HTTP. Al castellano, todos los navegadores al pedir una página al servidor dicen también que lenguajes prefieren aceptar. Si bien la idea es impecable en teoría, muchos navegadores acá en Chile vienen por defecto en Inglés, así que tuve que poner el sistema en manual&lt;/p&gt;
&lt;p&gt;Para hacer las traducciones de las páginas, cree una función que trae los textos desde una carpeta u otra dependiendo del lenguaje. Para los mensajes pequeños, ocupé la librería gettext que viene con php. En PHP4 no hubo caso que funcionara, pero como en el servidor de tardis tienen PHP5, la cosa corre como una seda. Para hacer las traducciones, ocupo &lt;a href=&#039;http://www.google.cl/url?sa=t&amp;ct=res&amp;cd=1&amp;url=http%3A//www.poedit.org&#039;&gt;poedit&lt;/a&gt;. Tengo que preguntales a &lt;a href=&#039;http://cdp.blogsome.com/&#039;&gt;Carlos&lt;/a&gt; que programa ocupa él. Me lo dijo, pero para variar se me olvidó. &lt;strong&gt;Actualización:&lt;/strong&gt; Ocupa &lt;a href=&#039;http://gtranslator.sourceforge.net/&#039;&gt;gtranslator&lt;/a&gt;, y pareciera que tiene problemas para compilar los .mo, tanto en su debian como en mi gentoo&lt;/p&gt;
&lt;p&gt;La función que ocupo para los paginadores tiene una implementación bastante cómoda&lt;/p&gt;
&lt;div class=&#039;code&#039;&gt;&lt;div class=&quot;hl-main&quot;&gt;&lt;ol class=&quot;hl-main&quot;&gt;&lt;li&gt;&amp;nbsp;&lt;span class=&quot;hl-code&quot;&gt;/**&lt;/li&gt;
&lt;li&gt;&amp;nbsp;* Paginador&lt;/li&gt;
&lt;li&gt;&amp;nbsp;* @param int numero de registro a partir del cual hay que partir&lt;/li&gt;
&lt;li&gt;&amp;nbsp;* @param int número de registros por página&lt;/li&gt;
&lt;li&gt;&amp;nbsp;* @param int número máximo de registros&lt;/li&gt;
&lt;li&gt;&amp;nbsp;* @param string url de la página en la cual está el pager&lt;/li&gt;
&lt;li&gt;&amp;nbsp;*/&lt;/li&gt;
&lt;li&gt;&amp;nbsp;function pager($iOffset, $iPag, $iMax, $sUrl) &lt;/li&gt;
&lt;li&gt;&amp;nbsp;{&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    if ($iMax&amp;lt;$iPag) {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;        return &amp;quot;&amp;quot;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    }&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    if ($iOffset&amp;lt;0) {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;        $iOffset = 0;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    } elseif ($iOffset%$iPag != 0) {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;        $iOffset = $iOffset-($iOffset%$iPag);&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    }&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    $sHtml = &amp;quot;&amp;lt;div class=&#039;pager&#039;&amp;gt;&amp;quot;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    if ($iOffset) {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;        $sHtml.= &amp;quot;&amp;lt;a href=&#039;$sUrl?offset=&amp;quot;.($iOffset-20) .&amp;quot;&#039;&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;lt;/a&amp;gt; &amp;quot;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    } else {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;        $sHtml.= &amp;quot;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; &amp;quot;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    }&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    for ($x = 0;($x*$iPag) &amp;lt;$iMax;$x++) {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;        $iOsa = $x*$iPag;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;        if ($iOffset != $iOsa) {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;            $sHtml.= &amp;quot;&amp;lt;a href=&#039;$sUrl?offset=&amp;quot;.($x*$iPag) .&amp;quot;&#039;&amp;gt;&amp;quot;.($x+1) .&amp;quot;&amp;lt;/a&amp;gt; &amp;quot;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;        } else {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;            $sHtml.= &amp;quot; &amp;lt;strong&amp;gt;&amp;quot;.($x+1) .&amp;quot;&amp;lt;/strong&amp;gt; &amp;quot;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;        }&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    }&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    if ($iOffset+$iPag&amp;lt;$iMax) {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;        $sHtml.= &amp;quot; &amp;lt;a href=&#039;$sUrl?offset=&amp;quot;.($iOffset+20) .&amp;quot;&#039;&amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    } else {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;        $sHtml.= &amp;quot; &amp;amp;gt;&amp;amp;gt;&amp;amp;gt; &amp;quot;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    }&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    $sHtml.= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    return $sHtml;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;}&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;En la cabecera del sitio hay un contador de firmas, el cual se actualiza cada minuto con ajax. El motor javascript es el de &lt;a href=&#039;http://php.apsique.com/project/nicechat&#039;&gt;Nicechat&lt;/a&gt;. Para el resto de las funciones javascript, como el logo con contador o la banda, ocupe la siguiente función, que permite escribir cualquier código javascript sin andar preocupado de escapar las comillas y esas cosas&lt;/p&gt;
&lt;div class=&#039;code&#039;&gt;&lt;div class=&quot;hl-main&quot;&gt;&lt;ol class=&quot;hl-main&quot;&gt;&lt;li&gt;&amp;nbsp;&lt;span class=&quot;hl-code&quot;&gt;function js_doc_write($sTexto) {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    $aPartes=explode(&amp;quot;\n&amp;quot;,$sTexto);&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    $sOut=&amp;quot;&amp;quot;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    foreach($aPartes as $sParte) {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    $sOut.=&amp;quot;document.write(\&amp;quot;&amp;quot;.str_replace(&amp;quot;\&amp;quot;&amp;quot;,&amp;quot;\\\&amp;quot;&amp;quot;,trim($sParte)).&amp;quot;\&amp;quot;)\n&amp;quot;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    }&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    return $sOut;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;}&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Sencillo y natural&lt;/p&gt;
&lt;h2&gt;Como evitar el spam&lt;/h2&gt;
&lt;p&gt;Una de las cosas que me tiene más contento es que, en general, el sitio ha estado a salvo del spam. El método que propongo, si bien no es el mejor, es tremendamente simple y previene bastantes  problemas.&lt;/p&gt;
&lt;p&gt;Lo primero es crear, antes de mostrar el formulario, una variable de sesión con un valor aleatorio, el cual es puesto en el formulario pasado por md5. Al recibir el formulario (por POST, como corresponde), se verifica que la variable de sesión con md5 sea igual al valor recibido del formulario. &lt;/p&gt;
&lt;p&gt;Esta simple medida impide, primero, que se reenvíe un formulario al refrescar con POST. Segundo, también impide que se lance un ataque masivo con un bot, ya que cada vez que se genera el formulario el código de verificación cambia. La forma más simple de romperlo es teniendo un lector del HTML, que recogiera el código y creara el formulario considerando el dígito verificador. Aquí es donde entra la capa humana, ya que todos los envíos son verificados antes por nosotros. Con la alta visita y la baja cantidad de spam recibido, debo reconocer que es un buen método de trabajo&lt;/p&gt;
&lt;h2&gt;La administración&lt;/h2&gt;
&lt;p&gt;Si bien no se puede mostrar en vivo, la administración también ha sido un pequeño bicho que ha ido creciendo de a poco&lt;/p&gt;
&lt;p&gt;Al principio, cuando el sitio estaba en mi serv, tenía un archivo htpasswd para controlar todo. Al pasar a &lt;a href=&#039;http://www.tardis.cl&#039;&gt;Tardis&lt;/a&gt;, tuve que simular la funcionalidad de la autenficación por archivo con php: 
&lt;div class=&#039;code&#039;&gt;&lt;div class=&quot;hl-main&quot;&gt;&lt;ol class=&quot;hl-main&quot;&gt;&lt;li&gt;&amp;nbsp;&lt;span class=&quot;hl-code&quot;&gt;function enviar_header()&lt;/li&gt;
&lt;li&gt;&amp;nbsp;{&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    header(&#039;WWW-Authenticate: Basic realm=&amp;quot;Administracion Mppc&amp;quot;&#039;);&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    header(&#039;HTTP/1.0 401 Unauthorized&#039;);&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    echo &#039;Su acceso no fue autorizado, sorry&#039;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    exit;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;}&lt;/li&gt;
&lt;li&gt;&amp;nbsp;if (!isset($_SERVER[&#039;PHP_AUTH_USER&#039;]) or !(verificar_auth($_SERVER[&#039;PHP_AUTH_USER&#039;],$_SERVER[&#039;PHP_AUTH_PW&#039;]))) {&lt;/li&gt;
&lt;li&gt;&amp;nbsp;   enviar_header();&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    exit;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;}&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Como supondrán, ustedes deben definir verificar_auth llamando a una base de datos u otra manera&lt;/p&gt;
&lt;p&gt;El sistema de permisos interno es muy similar al de drupal. Cada usuario tiene una serie de permisos asignados, los cuales son verificados con una función que se llama &lt;code&gt;autorizado&lt;/code&gt;. El truco sucio está en que autorizado, si no encuentra en la tabla el código del permiso, lo agrega de forma automática, evitándose la lata de estar actualizando la tabla cada 5 minutos cuando se debe crear un módulo nuevo. &lt;/p&gt;
&lt;p&gt;Creo que con eso es suficiente para que entiendan un poquito más como funciona el sitio. Cualquier consulta es absolutamente bienvenida&lt;p&gt; </description>
 <comments>http://php.apsique.com/contenido/3am_con_mi_primer_pc_verdad#comments</comments>
 <category domain="http://php.apsique.com/categoria/temas_generales/autoreferencia">Autoreferencia</category>
 <category domain="http://php.apsique.com/lenguajes/javascript">JavaScript</category>
 <category domain="http://php.apsique.com/lenguajes/php">PHP</category>
 <category domain="http://php.apsique.com/categoria/temas_generales/programacion">Programación</category>
 <pubDate>Sat, 27 Aug 2005 23:42:57 -0700</pubDate>
 <dc:creator>clbustos</dc:creator>
 <guid isPermaLink="false">504 at http://php.apsique.com</guid>
</item>
</channel>
</rss>
