tag:blogger.com,1999:blog-383992452024-02-08T16:54:06.994+01:00Joaquin FerreroReflexiones de un PerleroJoaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.comBlogger12125tag:blogger.com,1999:blog-38399245.post-22850457733976810792021-03-31T21:59:00.007+02:002021-04-26T01:03:29.369+02:00<p style="text-align: left;"> <br />
</p><h2 style="text-align: left;">
Recuperación del Lenovo/Iomega ix2-ng</h2>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;"><a href="https://www.myhacklog.com/wp-content/uploads/2015/12/ix2-dl-300x246.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="246" data-original-width="300" src="https://www.myhacklog.com/wp-content/uploads/2015/12/ix2-dl-300x246.jpg" /></a></div></div>
<h2 style="text-align: left;">
</h2><p style="text-align: left;">Partimos de un <b>Lenovo/Iomega ix2-ng</b> que después de arrancar se queda con el piloto de alimentación fijado en color rojo. El dispositivo parece que no responde ni da servicio de ninguna clase.</p><p style="text-align: left;">El objetivo es instalar una versión de recuperación del <i>firmware</i> que permita recuperar el dispositivo.</p><p style="text-align: left;"> </p><h3 style="text-align: left;">Resumen<br /></h3><p style="text-align: left;">Se van a seguir los pasos indicados en esta página:</p><p style="text-align: left;">https://web.archive.org/web/20190427155514/http://iomega.nas-central.org/wiki/Install_firmware_on_a_fresh_disk_(EZ_Media_%26_ix2-ng)<br /></p><p style="text-align: left;">más los pasos indicados en esta página:</p><p style="text-align: left;">https://www.myhacklog.com/restore-an-iomega-lenovo-storcenter-ix2-ng/</p><p style="text-align: left;"> </p><style type="text/css">
p, li { white-space: pre-wrap; }
</style><h3 style="text-align: left;">Material necesario</h3><ul style="text-align: left;"><li>un pincho USB de 1 GB mínimo de capacidad, formateado en FAT32(vfat)</li><li>los siguientes archivos:</li><ul><li>de la última página indicada, el archivo <b>Restore-an-iomega-lenovo-storcenter-ix2-ng.zip</b></li><li>de la página de Lenovo, la última actualización del <i>firmware</i>: http://download.lenovo.com/lenovoemc/eu/en/app/answers/detail/a_id/31178.html <b>ix2-ng-4.1.408.34845.tgz</b> (en el archivo anterior está la versión <b>ix2-ng-4.1.114.33421.tgz</b> que puede servir de paso intermedio a la última versión)</li><li>de la página de Lenovo, la última actualización del software LifeLine: http://download.lenovo.com/lenovoemc/eu/en/app/answers/detail/a_id/34437.html <b>lenovoemc-lifeline-fosskit-4.1.414.34909.tar.gz</b><br /></li></ul><li>disco duro, al menos uno, para que el sistema pueda arrancar desde él</li><li>una carpeta de trabajo en un ordenador aparte <br /></li></ul><h3 style="text-align: left;"> Instalación del <i>firmware</i><br /></h3><ol style="text-align: left;"><li>Descomprimir el archivo <b>Restore-an-....zip</b> en una carpeta de trabajo de nuestro ordenador</li><li>de los archivos extraídos, descomprimimos el archivo <b>ix2-ng-4.0.2.9960-recovery.zip</b><style type="text/css">
p, li { white-space: pre-wrap; }
</style></li><li>copiamos la carpeta <b>emctools/</b> al pincho USB</li><li>descomprimir el archivo <b>lenovoemc-lifeline-fosskit-4.1.414.34909.tar.gz</b> en la carpeta de trabajo</li><li>copiamos los archivos <b>Lenovoemc-lifeline-fosskit...tar.gz</b> y <b>Debian7.tar.gz</b> al pincho USB, al directorio raíz</li><li>si el disco duro está vacío, hay que seguir el procedimiento de grabar unos archivos de forma directa sobre él:</li><ol><li>enchufamos el disco a nuestro ordenador de trabajo, bien de forma directa dentro del ordenador, o usando una bahía o con un adaptador de USB de disco externo</li><li>hay que prestar atención al nombre de la unidad con la que aparece ese disco en nuestro sistema <b>PELIGRO: podemos perder la información de los otros discos del ordenador si nos equivocamos en este paso</b></li><li>en Linux, supongamos que es la unidad <span style="font-family: courier;"><b>/dev/sdd</b></span></li><li>inicializamos el disco con el formato de particiones <b>GPT</b> (importante); le podemos asignar todo el espacio a una partición (/dev/sdd1) con formato de archivos <b>ext4</b><br /></li><li>dentro de la carpeta <b>emctools/</b> descomprimida antes, hay un archivo llamado <b>imager.tgz</b>; lo descomprimimos en la carpeta de trabajo los archivos <b>zImage</b> e <b>initrd</b></li><li>necesitamos copiar estos archivos al disco duro, en unas determinadas posiciones, por lo que hay que utilizar un programa de copia que permita indicar el bloque de sectores donde queremos hacer la copia; en el caso de Linux, se va a usar el comando <b>dd</b></li><li>ejecutamos los siguientes comandos: (<b>ATENCIÓN</b>: cambiar <b>sdd</b> por el nombre correcto de la unidad de disco. En caso de equivocación, se destruirá la información de otro disco del ordenador)</li><ol><li><b><span style="font-family: courier;">dd if=/ruta/a/zImage of=/dev/sdd seek=2048</span></b></li><li><b><span style="font-family: courier;">dd if=/ruta/a/initrd of=/dev/sdd seek=8192</span></b></li></ol><li><span style="font-family: courier;"></span><span style="font-family: times;">esperamos unos segundos, y podremos desconectar el disco duro de nuestro ordenador y ponerlo dentro del Lenovo/Iomega (consultar el manual de usuario del ix2)</span> </li></ol><li>con el ix2 apagado, desenchufamos el cable de red y enchufamos el pincho USB</li><li>si el disco contenía un <i>firmware</i>, debemos realizar un arranque con el botón de RESET pulsado</li><ol><li>encendemos el ix2 mientras mantenemos pulsado el botón de RESET</li><li>después de aproximadamente 1 minuto, veremos que el indicador del USB parpadea</li><li>soltamos el botón de RESET y esperamos</li></ol><li>si el disco duro estaba vacío y le hemos instalado los archivos <b>zImage</b> e <b>initrd</b>, hacemos un arranque normal:</li><ol><li>encendemos el ix2. No hace falta pulsar el botón de RESET</li></ol><li>dependiendo de la velocidad del USB, tardará unos 3-10 minutos hasta que el propio dispositivo se apague. Sabemos que el proceso va bien porque el indicador de alimentación está parpadeando al igual que el indicador de actividad del disco duro y del USB</li><li>desenchufamos el pincho, enchufamos el cable de red y arrancamos de nuevo (pulsando el botón de encendido)</li><li>debemos esperar bastante, el sistema está inicializando el disco y luego instalará el sistema (unos 10 minutos)</li><li>cuando el indicador de alimentación quede fijo en color blanco, ya podemos intentar conectarnos a la IP del dispositivo con un navegador web (usar <b>ipscan</b>) para saber la IP del dispositivo o mirarlo en el enrutador de la red local)</li><li>desde el icono de <b>Sistema > Actualizaciones de software</b> podremos verificar que el <i>firmware</i> instalado es el <b>4.0.2.9960</b></li></ol><p> </p><h3 style="text-align: left;">Actualización del <i>firmware</i></h3><p>Desde el menú <b>Sistema > Actualizaciones de software </b>actualizamos el <i>firmware</i> con el archivo <b>ix2-ng-4.1.408.34845.tgz</b></p><p>Puede tardar unos 7 minutos en descargarse al ix2, y luego de pulsar el botón <b>Aplicar</b> para instalarlo, otros 7 minutos.</p><p><br /></p><h3 style="text-align: left;">Activación del acceso por SSH</h3><p>Entrar en http://<IP>/manage/diagnostics.html</p><p>Poner contraseña. Recordar que la contraseña real será "soho"+contraseña. Por ejemplo, si la contraseña se pone a "1234", será "soho1234".<br /></p><p> </p><h3 style="text-align: left;">Enlaces</h3><ul style="text-align: left;"><li><a href="http://download.lenovo.com/lenovoemc/eu/en/app/cust_alp/p/1189%2c1199.html" target="_blank">Lenovo ix2</a></li><li><a href="http://download.lenovo.com/nasupdate/manuals/ix2/ix2-4.1-en.pdf" target="_blank">Manual</a></li></ul>Joaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.com1tag:blogger.com,1999:blog-38399245.post-52771368119734649072019-09-14T18:22:00.001+02:002021-04-24T20:59:57.089+02:00Desbloquear Lenovo ix4-300d usando pincho USB<br />
<h2>
Operaciones básicas con el Lenovo ix4-300d</h2>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://download.lenovo.com/lenovoemc/na/en/euf/assets/images/support/lne-ix4-300d.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="132" data-original-width="184" src="http://download.lenovo.com/lenovoemc/na/en/euf/assets/images/support/lne-ix4-300d.jpg" /></a></div>
<h3>
Desbloquear ix4-300d </h3>
Material necesario: Un pincho USB v2.0 1 GB mínimo de capacidad. <br />
<ol>
<li>descargar en la computadora el archivo con la imagen de arranque por USB ofrecida por Lenovo (<b><a href="https://drive.google.com/drive/folders/1NeNQQPxbwFHj_ga4n0vVaHbH3P7tRK5B" rel="nofollow" target="_blank">aquí</a></b>, una copia)</li>
<li>descomprimir el archivo rar a un directorio, y copiar todos los archivos al pincho</li>
<li>mientras tanto, apagar y desenchufar el aparato</li>
<li>desenroscar los dos tiradores traseros y quitar la tapa</li>
<li>sacar todos los discos según como indica el manual, <b>IMPORTANTE: </b>recordando la posición que ocupan (de 1 a 4)</li>
<li>una vez terminada la copia de los archivos en el pincho, desenchufarlo de la computadora y enchufarlo en el PRIMER conector USB (parte superior) de la parte TRASERA del ix4</li>
<li>pulsar el botón de RESET de la parte trasera y mantenerlo pulsado</li>
<li>encender el ix4-300d, manteniendo pulsado el botón de RESET durante 30 segundos hasta que aparezca el mensaje "<b>Booting USB...</b>"</li>
<li>esperar unos minutos... si sale la imagen de un pincho al lado de un símbolo de red, todo va bien</li>
<li>esperar a que el aparato se reinicie, o salgan instrucciones en pantalla (tardará unos minutos). <b>PACIENCIA</b></li>
<li>cuando salga el aviso de que faltan los discos, pulsar el botón de apagado y esperar a que se apague (recordar que existe la posibilidad de apagado forzado pulsando el botón durante 4 segundos) <b>ALTERNATIVA</b>: dependiendo del tipo de disco se pueden enchufar "en caliente": metemos los discos uno a uno, pulsamos el botón de la pantalla correspondiente a la "x" para cancelar los mensajes de error, y esperamos a que salga la dirección IP en pantalla</li>
<li>introducir los discos respetando la posición en la que estaban antes de sacarlos. COMPROBAR que están bien conectados (oiremos un clic cuando lleguen al final del recorrido y encajen en los conectores de alimentación y datos)</li>
<li>pulsar el botón de inicio (antes de encender podemos quitar el pincho USB, ya no es necesario)</li>
<li>al cabo de unos segundos debería salir la barra de progreso de arranque en la pantalla; esperar a que termine</li>
<li>cuando salga la dirección IP en pantalla, podremos usar un navegador web desde la computadora para acceder al panel de control. Los primeros pasos serán de configuración básica</li>
<li>el ix4 comenzará con el proceso de sincronización de los discos en caso de inconsistencias en la información, pero se podrá empezar a usar de forma normal</li>
<li>se puede volver a poner la tapa y cerrar.</li>
</ol>
<h3>
Procedimiento para poner una contraseña nueva</h3>
En caso de que no nos deje entrar (inicio de sesión, nombre de usuario/contraseña), el procedimiento es:<br />
<ol>
<li>pulsar el botón de RESET durante 4 segundos (<a href="http://download.lenovo.com/nasupdate/manuals/ix4-300d/ix4-300d-4.1-en.pdf" rel="nofollow" target="_blank">página 5 del manual</a>)</li>
<li>mirar la IP que aparece en la pantalla (si es que el ix4 ha solicitado una nueva IP al servidor DHCP de la red)</li>
<li>entrar en el panel de control (http://<ip aparato="" del="">)</ip></li>
<li>inmediatamente nos pedirá que pongamos un nuevo nombre de usuario/contraseña para iniciar la sesión.</li>
</ol>
<h3>
Procedimiento para actualizar el <i>firmware</i></h3>
<ol>
<li>desde el panel de control (navegador web en la computadora), entrar en Todas las funciones->Actualizaciones de software</li>
<li>en el apartado de <i>Firmware</i>, intentará conectarse a Lenovo para averiguar si hay una nueva versión</li>
<li>desde la computadora, <a href="http://download.lenovo.com/lenovoemc/na/en/app/cust_alp/p/1189%2c1193.html" rel="nofollow" target="_blank"><b>entrar</b></a> y descargar el archivo de <a href="http://download.lenovo.com/lenovoemc/na/en/app/answers/detail/a_id/32096.html" rel="nofollow" target="_blank"><b>último firmware </b></a>(sección <i>Download Instructions</i>)</li>
<li>en el panel de control, pulsar en el icono de la derecha para cargar el nuevo <i>firmware</i></li>
<li>en el diálogo siguiente, seleccionar el archivo que hemos bajado antes</li>
<li>esperar a que cargue</li>
<li>cuando en el panel de control salga el aviso de que está pendiente iniciar la actualización, pulsar en Actualizar</li>
<li>esperar a que el <i>firmware</i> se instale, el propio ix4 se reiniciará; el panel de control se cerrará, al volver a entrar veremos que ya tiene la nueva versión del <i>firmware.</i></li>
</ol>
<h3>
Recomendaciones</h3>
<ul>
<li> Apagar el ix4 siempre con el botón de encendido frontal, y esperar a que se apague. NO usar el apagado forzado (pulsación de 4 segundos) mas que en situaciones límite.</li>
<li>Seguir las recomendaciones del fabricante en cuanto a tipo de discos compatibles y procedimiento de cambio de discos.</li>
</ul>Joaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.com0tag:blogger.com,1999:blog-38399245.post-60631492767518959312014-09-01T12:01:00.000+02:002014-09-01T12:01:32.728+02:00<h2>
Recarga automática de página HTML en Firefox</h2>
<h3>
Dos métodos para que Firefox nos ayude en el desarrollo</h3>
Supongamos que necesitamos editar HTML o CSS de forma remota, o quizás de forma local pero sin utilizar ningún editor tipo Dreamweaver o similar.<br />
<br />
Es decir, que queremos realizar la edición como se hacía tiempo atrás: a puro golpe de teclado.<br />
<br />
Hoy en día, podríamos hacerlo de forma cómoda con la consola web del propio Firefox del código HTML, JavaScript y CSS, con lo que vemos el resultado de forma inmediata.<br />
<br />
Otra forma es como se hacía hace años: crear el código, ir al navegador y solicitar la recarga de la página para ver los cambios.<br />
<br />
Pero esta forma de trabajar consume tiempo: el que pasa desde que dejamos el editor y solicitamos al navegador que recargue la página. Pueden ser unas décimas de segundo mientras pulsamos la combinación de teclas de cambio de aplicación, pero al cabo del día, suman muchos segundos.<br />
<br />
Lo ideal es que no tuviéramos que dejar el editor, y que el navegador hiciera la recarga por sí solo.<br />
<br />
Aquí comentaré dos soluciones.<br />
<hr />
<h4>
ReloadEvery</h4>
<a href="https://addons.mozilla.org/en-US/firefox/addon/reloadevery/" rel="nofollow" target="_blank">Este complemento</a> agrega un menú secundario al ratón, con el que podemos mandar recargar la página cada cierto tiempo, de forma automática.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://addons.cdn.mozilla.net/user-media/previews/full/53/53869.png?modified=1297393298" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://addons.cdn.mozilla.net/user-media/previews/full/53/53869.png?modified=1297393298" width="320" /></a></div>
<br />
Y con es ya tenemos resuelto el problema: le ponemos un tiempo de refresco de 5 segundos o menos, y ya podemos trabajar con el código HTML/CSS. En cuanto grabemos el código, pasará un breve espacio de tiempo, y ya veremos los cambios en el navegador.<br />
<br />
Esta solución es la más sencilla, pero tiene un problema: si ponemos un tiempo de refresco, digamos de 5 s, entonces tendremos que esperar un tiempo entre 1 s y 5 s para ver el resultado. Y al cabo de unos minutos de trabajo, nos cansará esa imprecisión.<br />
<br />
Podríamos configurar el complemento para que haga un tiempo de refresco más corto, pero entonces veremos que el navegador no responderá bien, ya que las peticiones de recarga podrían solaparse, y hacer que la página no salga bien, o incluso que el navegador se quede bloqueado. Y naturalmente, la carga se traslada al resto del sistema (sistema operativo y CPU).<br />
<hr />
<h4>
MozRepl</h4>
<a href="https://addons.mozilla.org/en-US/firefox/addon/mozrepl/" rel="nofollow" target="_blank">Este complemento</a> incorpora la facilidad de dialogar con Firefox, <a href="https://github.com/bard/mozrepl/wiki" rel="nofollow" target="_blank">desde dentro del propio Firefox</a>.<br />
<br />
Después de instalarlo, vamos al menú Herramientas, MozRepl, y lo iniciamos.<br />
<br />
El complemento crea un servidor en el puerto 4242, y permanece a la escucha. Podemos enviarle comandos para controlar a Firefox.<br />
<br />
A continuación preparamos el siguiente programa:<br />
<br />
<b><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">#!/bin/bash<br /><br />while inotifywait -e modify /home/user/Documentos/Proyecto/<br />do<br /> sleep 1<br /> echo "BrowserReload();" | nc -w 3 localhost 4242 > /dev/null<br />done</span></span></b><br />
<span style="font-size: small;"><span style="font-family: inherit;">Este guión hace uso de dos programas: inotifywait (incluido en la distribución inotify-tools) y de nc (netcat).</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: inherit;">El primero esperará a que se produzca un evento de modificación en el directorio que indiquemos, que será en donde estamos trabajando con el código de la página.</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span><b><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"></span></span></b>
<span style="font-size: small;"><span style="font-family: inherit;">Una vez que ocurra el evento, programamos una espera de 1 s. Esto es necesario por que los comandos que siguen pueden ejecutarse tan rápido que el navegador puede leer la versión anterior a la que acabamos de modificar (se puede hacer la prueba de comentar esa línea, y comprobar si la recarga se realiza con los últimos cambios o no).</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span><b><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"></span></span></b>
<span style="font-size: small;"><span style="font-family: inherit;">Finalmente, enviamos el comando de recarga al navegador, usando netcat (nc), por el puerto 4242 de la máquina local. Programamos un tiempo de 3 s de <i>timeout</i> por si MozRepl no cierra correctamente la comunicación.</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span><b><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"></span></span></b>
<span style="font-size: small;"><span style="font-family: inherit;">Arrancamos el programa en una terminal aparte, y ya podemos empezar a editar el código de la página HTML/CSS. En cuanto mandemos grabar los cambios, al segundo siguiente, el navegador los presentará.</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span><b><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"></span></span></b>
<span style="font-size: small;"><span style="font-family: inherit;">Sacado y modificado <a href="http://tuxdna.in/blog/2014/06/18/auto-refresh-firefox-on-each-change-after-editing-your-source-code/" rel="nofollow" target="_blank">desde aquí</a>.</span></span><b><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"></span></span></b>Joaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.com0tag:blogger.com,1999:blog-38399245.post-41886885789707999462010-04-29T22:34:00.009+02:002021-04-24T21:00:30.392+02:00Informar a los cpantesters desde una dirección privadaTest::Reporter permite enviar un mensaje al grupo de los <a style="font-weight: bold;" href="http://static.cpantesters.org/">cpantesters</a> con el resultado de la instalación de un módulo de Perl, en el sistema. Lo normal es que ese mensaje vaya por medio del módulo Net::SMTP (opción por defecto).<br /><br />El problema ocurre cuando estamos en un ordenador particular, detrás de una línea ADSL privada o residencial. La mayor parte de las veces no podremos enviar el correo, porque el servidor de destino nos rechazará la conexión, precisamente porque el correo sale de una dirección IP reservada al entorno residencial.<br /><br />La solución pasa por configurar y modificar CPANPLUS para que el correo se envíe por medio del servidor SMTP de nuestro proveedor de Internet.<br /><br />Primero, hay que editar el fichero /root/.cpanplus/lib/CPANPLUS/Config/User.pm. Esto lo podemos hacer de forma cómoda desde el propio entorno de CPANPLUS, entrando en <span style="font-weight: bold;">cpanp</span> y ejecutando <span style="font-weight: bold;">s edit user</span>. Se arrancará el editor por defecto junto con una copia del fichero, donde podremos modificarlo.<br /><br />Los valores que debemos poner son los siguientes:<br /><ul><li>cpantest => 1</li><li>cpantest_mx => 'correo.nuestroservidordecorreo.com'</li><li>email => 'nosotros@nuestrocorreo.com'</li><li>debug => 1 (si queremos ver los mensajes de actividad en la conexión)<br /></li></ul>Lo más seguro es que nuestro servidor de correo exija nuestra autenticación, por lo que deberíamos indicar por algún lado, nuestro nombre de usuario y contraseña... pero... no se encuentra ningún lugar dónde hacerlo. O no he sabido buscarlo.<br /><br />La solución que he encontrado es editar CPANPLUS/Internals/Report.pm, en la función _send_report(), justo después de crearse el objeto my $reporter = Test::Reporter->new(), podemos agregar unas líneas como estas:<br /><br /><span style="font-weight: bold;font-family:courier new;" >$reporter->transport(<br /> 'Net::SMTP::TLS',<br /> User => 'usuario',<br /> Password => 'contraseña'<br />);</span><br /><br />De esa manera, el transporte del correo electrónico, desde nuestro ordenador hacia nuestro servidor de correo en Internet, usará el módulo Net::SMTP::TLS, que nos permitirá autenticarnos con un nombre de usuario y contraseña, que también indicamos.<br /><br />Es posible que no sea necesaria tanta historia, pero al menos, esto funciona.<br /><br /><span style="font-weight: bold;">Actualización:</span> indicado mejor el fichero a modificar.<br /><br /><span style="font-weight: bold;">Actualización:</span> En la nueva versión de CPANPLUS v0.9004, Internals/Report.pm ya está modificado para que admita un nuevo atributo en el fichero de configuración:<br /><br /><span style="font-family:courier new;">cpantest_reporter_args => {</span><br /><span style="font-family:courier new;"> from => 'correo@electronico_del_que_envia.com',</span><br /><span style="font-family:courier new;"> transport => 'Net::SMTP::TLS',</span><br /><span style="font-family:courier new;"> transport_args => [ User => 'usuario', Password => 'contraseña'],</span><br /><span style="font-family:courier new;">}</span><br /><br />por lo que ya no es necesario hacer ninguna otra modificación para el envío de correos.<br /><br /><span style="font-weight: bold;">Actualización:</span> desde el 1 de septiembre de 2010 ya no es necesaria esta operación, pues el proceso ha cambiado (de correo a HTTP) y se ha simplificado la instalación. <a style="font-weight: bold;" href="http://perlenespanol.com/foro/nuevo-sistema-de-informacion-para-los-cpan-testers-t5498.html">Más detalles</a>.Joaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.com1tag:blogger.com,1999:blog-38399245.post-25513550342203246922010-02-19T02:18:00.003+01:002010-02-19T02:35:58.862+01:00Nueva versión del medallero olímpico en WikipediaPues debido al éxito de mi programa que actualizaba el medallero de los Juegos Olímpicos de Pekín 2008 en la Wikipedia española, algunos editores me han pedido que hiciera lo mismo para los <a href="http://es.wikipedia.org/wiki/Juegos_Ol%C3%ADmpicos_de_Vancouver_2010"><b>juegos de Vancouver 2010</b></a>. Y <a ref="http://es.wikipedia.org/wiki/Anexo:Medallero_de_los_Juegos_Ol%C3%ADmpicos_de_Vancouver_2010"><b>ya está funcionando</b></a> desde hace unos días. Cada 5 minutos, coloca las nuevas medallas.<br /><br /><a href="http://es.wikipedia.org/wiki/Usuario:JoaquinFerrero/Medallero2010"><b>El programa</b></a> está escrito para Perl v5.10. Y los módulos que he usado son:<ul><br /><li> <a href="http://search.cpan.org/perldoc?LWP::Simple"><b>LWP::Simple</b></a>, para hacer un simple get() de la página oficial del medallero de los Juegos<br /><br /></li><li> <a href="http://search.cpan.org/perldoc?MediaWiki::API"><b>MediaWiki::API</b></a>, para dialogar con la API de Wikipedia<br /><br /></li><li> <a href="http://search.cpan.org/perldoc?common::sense"><b>common::sense</b></a>, un módulo que me ha sorprendido por <a href="http://perlenespanol.com/foro/nueva-version-del-programa-de-actualizacion-del-medallero-t4843.html"><b>lo bien que funciona</b></a>.<br /></li></ul>Joaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.com0tag:blogger.com,1999:blog-38399245.post-48712491820832020802009-09-20T20:03:00.004+02:002009-09-20T21:01:21.409+02:00Problemas de espacio en el Asus Eee PCDespués de un tiempo de trabajar con el <span style="font-weight: bold;">Asus Eee PC</span>, quieres instalarle más y más programas o, sencillamente, instalarle las actualizaciones que el sistema te va pidiendo que vayas poniendo.<br /><br /><span style="font-size:130%;">Antecedentes</span><br />Bueno, pues resulta que los de Asus, en el momento del diseño, decidieron que la forma de particionar este aparato debiera ser algo más particular que la del resto.<br /><br />Por defecto, la disposición es algo así:<br /><pre>S.ficheros Tamaño Usado Disp Uso% Montado en<br />rootfs 695716 532132 128244 81% /<br />/dev/sda1 695716 532132 128244 81% /<br />none 695716 532132 128244 81% /<br />tmpfs 514084 20 514064 1% /dev/shm<br />tmpfs 131072 28 131044 1% /tmp<br />/dev/sdb1 15512328 335624 14388720 3% /home<br />/dev/sda1 3161695 2896624 265071 92% /ro<br /><br /></pre>Se observa que la mayor parte del pastel se la lleva el usuario, en el directorio /home, lo cual es lógico porque se supone que va a necesitar la mayor cantidad posible de espacio para guardar sus documentos.<br /><br />Observemos que, además, el sistema está diseñado para protegerse de los usuarios manazas: hay una partición de solo lectura (la sda1), donde reside el sistema operativo y la configuración básica. Esto es necesario por si el usuario desea hacer una recuperación "desde fábrica" de su sistema.<br /><br /><span style="font-size:130%;">El problema</span><br />Pero claro, a lo largo de la vida de un sistema, hay que hacerle modificaciones. Y no se pueden guardar en una partición de solo lectura. Por eso, el Linux monta la partición de solo lectura con el sistema <span style="font-weight: bold;">aufs</span>, que permite guardar los ficheros modificados en otra partición. De esta manera, tenemos un sistema utilizable y recuperable: la partición de solo lectura volverá a tomar las riendas del equipo cuando el usuario quiera recuperar la configuración de fábrica, mientras que también, en el trabajo diario, se puede ir añadiendo y actualizando el sistema.<br /><br />Y aquí empiezan los problemas: la partición donde se guardan esas pequeñas variaciones de los ficheros de la partición de solo lectura, es muy pequeña (unos cientos de megabytes). La consecuencia es que hay un límite en el número de aplicaciones que podemos instalar; incluso de las propias actualizaciones del sistema.<br /><br /><span style="font-size:130%;">La(s) solución(es)</span><br /><ol><li>Instalar otro sistema operativo, como el EeeUbuntu, Xubuntu, Debian for EeePC o cualquiera de las distribuciones posibles para esta máquina,<br /><br /></li><li>Entrar en la partición donde se guardan las particiones y borrar los ficheros que guardan las diferencias (algo peligroso, pero factible), como se comenta en este <a style="font-weight: bold;" href="http://marto.lazarov.org/linux/2009/eee-pc-no-space-left-on-device.html">blog</a> ruso,<br /><br /></li><li>Modificar el sistema para la partición donde se guarden las modificaciones y diferencias, sea la del usuario (la grande).</li></ol>Para esto último, basta con hacer lo siguiente (tomado de <a style="font-weight: bold;" href="http://forum.eeeuser.com/viewtopic.php?id=54435">este foro</a>): abrimos la terminal (Ctrl+Alt+t) y ejecutamos lo siguiente<br /><pre>sudo su - # Nos hacemos superusuarios<br />mkdir /home/aufs # Creamos un directorio, en el home:<br />df -aH # Comprobamos el espacio libre que tenemos<br /># Ahora hacemos el montaje del nuevo espacio<br />mount -o remount,prepend:/home/aufs=rw,create=mfs /<br />df -aH # Volvemos a comprobar el espacio libre, para ver las diferencias</pre><br />Si hemos notado el cambio (la partición raíz / toma el espacio prestado del /home) entonces es que todo ha ido bien.<br /><br />Esto solo funcionará mientras tengamos la máquina encendida. Al volver a encenderla, solo tendremos que ejecutar el comando <span style="font-weight: bold;">mount</span> anterior.<br /><br />Si queremos que esto se haga de forma automática, en el arranque, solo hay que editar el fichero <span style="font-weight: bold;">/usr/sbin/services.sh</span> e incorporar la línea del <span style="font-weight: bold;">mount</span> justo después de la primera línea del <span style="font-weight: bold;">PATH=</span>...<br /><br />Ahora ya podemos agregar varias fuentes a <span style="font-weight: bold;">apt</span> e instalar el software que queramos.<br /><br />De todas maneras, la opción de instalar un nuevo sistema, es mucho mejor.Joaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.com0tag:blogger.com,1999:blog-38399245.post-56005631995278634912009-06-26T10:52:00.006+02:002009-06-29T14:46:41.559+02:00Darse de baja de VodafoneSí, amigo, debes admitirlo... todo tiene su fin... incluso hasta la relación de amor y odio con tu compañía telefónica.<br /><br />Pero no es tan fácil como decir un "hasta luego". No, no, y no.<br /><br />Ella se resistirá. Hará la posible, lo imposible, lo legal y... no hará lo ilegal porque no puede, pero sí hará lo más estúpido, kafkiano y burocrático posible, todo lo que esté en su mano, para impedir que te marches...<br /><br />Y una vez que ya estés fuera, se vengará de ti. ¿Por qué? Pues porque eres un mierda, un sinvergüenza, un presunto delincuente, un hijo puta, un cabrón, por dejarla sola.<br /><br />Así que no te extrañe que tenga un comportamiento muy diferente de cuando aquellos gloriosos días te llamaba, a ti, que, por ser su amante preferido, se acordaba, te añoraba, y te decía que tenía una sorpresa para ti... a veces 1000 mensajes cortos... otras veces, tarifas bajas... teléfonos baratos...<br /><br />Nada... mentiras a medias... porque un día descubres el concepto "letra pequeña". Sí, ella me adora, pero... es solo por el sucio dinero de mi bolsillo.<br /><br />Pues nada... se acabó.<br /><br />Proceso: llamar a otra compañía y darle tus datos. Vodafone intentará darte una oferta, que naturalmente, rechazarás. Como verá que no puede hacer nada, empezarán las amenazas: "<span style="font-style: italic;">Tiene un teléfono con contrato de permanencia, y el plazo acaba en dos semanas. Si quiere liberarlo antes, tendrá que abonar 70€</span>".<br /><br />Bueno, pienso... puedo esperar esas dos semanas y llamar para desbloquear el teléfono más tarde, pero mientras tanto, sigo con el proceso de baja. Así me saldrá el proceso de liberación gratis.<br /><br />Craso error...<br /><br />Vodafone hará lo siguiente:<br /><ol><li>Un día, sin previo aviso, hará el cambio de portabilidad de tu número, desconectando el servicio: te quedarás sin servicio telefónico. Afortunadamente, la nueva compañía te habrá enviado las nuevas tarjetas, así que sí que tienes servicio de telefonía... pero...<br /><br /></li><li>no puedes usar tu teléfono porque no está liberado. Y el plazo acaba en unos días. Bueno... te buscas un teléfono viejo que sabes que esté libre y lo usas mientras dejas pasar los días. Otro error que has cometido...<br /><br /></li><li>Vodafone, sin previo aviso (ni factura emitida), pasará un cargo por los servicios telefónicos consumidos hasta la fecha (lo cual es lógico), Y... <span style="font-weight: bold;">un cargo de 100€ por liberación del móvil</span>...</li></ol>¡Qué divertido! Cobran por la liberación "<span style="font-style: italic;">porque la línea se ha dado de baja</span>".<br /><br />Menos mal que... les llamas y pides explicaciones, que, amablemente, te dan. Y también, muy amablemente, "<span style="font-style: italic;">se dan cuenta</span>" de que no son 100€ si no los 70€ comentados unos días antes. Así que te devolverán la diferencia... <span style="font-weight: bold;">dentro de 20 días</span>... <span style="font-style: italic;">o así</span>(*).<br /><br />Vale, acepto que esta compañía empieza a hacer cosas absurdas y comienzo a entender que su política es de las de cobrar primero y preguntar después.<br /><br />La lógica implica que, a pesar de que me quedan <span style="font-size:130%;">HORAS</span> para terminar el plazo de liberación del móvil, ya puedo hacerlo porque a) Ya no estoy en la compañía y, b) He pagado la "mordida" de la penalización.<br /><br />Pues no...<br /><br />Los de Vodafone, una vez más... demuestran su incompetencia, su mala bilis, su mala gestión, su cabezonería, su mal estar, su ...<br /><br />-- <span style="font-style: italic;">Oiga, mire, señorita... que he pagado un montón de pasta por el teléfono, que ha pasado el plazo... el IMEI del teléfono es este... que me tengo que ir de viaje en 5 días...</span><br /><br />-- <span style="font-style: italic;">Pues no... lo siento caballero, pero ese teléfono, por haber sido comprado en una tienda, no tengo su IMEI, por lo que necesito que me envíe por FAX la factura de compra del teléfono. Envíelo al teléfono 607132423. Cuando lo tengamos, en unos díez días le responderemos. Adios y buenos días.<br /><span style="font-style: italic;"><br /></span></span>¡Oh, sí! Su venganza final... destrozarte tu primer viaje de vacaciones... destrozarte la estupenda visión que tenías de empresa en la que has estado <span style="font-weight: bold;">DOCE AÑOS</span>, y ni un problema... para acabar así, apaleado y rebuscando por cajas y archivos un papel con año y medio de existencia.<br /><br />Señores de Vodafone: por la presente les comunico que me comprometo a lo siguiente:<br /><ul><li>Le enviaré el fax mañana mismo, con la factura correspondiente, si la encuentro,<br /><br /></li><li>El lunes a primera hora presentaré una denuncia en la oficina de información al consumidor, por secuestro y fraude (pensaba ponerlo por gilipollez e incompetencia pero mi abogado diría que no sería efectivo: seguirán siendo gilipollas e incompetentes),<br /><br /></li><li>Ni yo, ni mi familia, ni mis amigos, ni mis clientes, ni mis proveedores, ni la gente que me conoce o ha conocido personalmente, ni las miles de personas que me conocen por Internet, volveremos a ser clientes de Vodafone. Nunca más. Ya me encargaré de ello.<br /></li></ul>Qué forma más estúpida de perder clientes...<br /><br />Y vosotros que estáis leyendo esto, ya sabéis lo que os espera, si sois "<span style="font-style: italic;">malos</span>" con vuestra telefónica.<br /><br />(*) <span style="font-weight: bold;">Actualización:</span> me acaban de llamar para confirmarme que la devolución tardará entre 10 y 15 días... <span style="font-style: italic;">Xtupendo</span>. <ironic>Qué alegría me han dado</ironic><br /><br /><span style="font-weight: bold;">Actualización:</span> después de enviar el fax con la factura y esperar un par de días, he llamado para intentar, otra vez, liberar el móvil. Sorpresa... me dice la señorita que, debido a que la línea ya está portada a otra empresa, y ha pasado el plazo de liberación (?) del teléfono, ellos ya no pueden liberármelo (!!!!). Hago entonces la pregunta mágica: <span style="font-style: italic; font-weight: bold;">¿Y quien puede?</span> Después de veinte minutos (20) de estar llamando, por fin me hacen caso, y me dan el código de liberación. ¡Por fin! Ya vendrá después la factura con <span style="font-style: italic;">todo lo gastado en estas llamadas</span>, ya.Joaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.com13tag:blogger.com,1999:blog-38399245.post-19508392012921997752009-04-15T14:57:00.004+02:002009-06-29T14:59:02.858+02:00Impedir que el Exim cambie la codificación del AsuntoBueno, les cuento lo descubierto...<br /><br />El proceso que ocurría era el siguiente:<br /><br />* El emisor mandaba un mensaje de correo con el asunto puesto en codificación utf8<br /><br />Por ejemplo: el emisor escribe esto:<br /><br /> Subject: Prueba de acentos: áéíóúñÑ<br /><br />y su programa de correo lo transforma en:<br /><br /> Subject: Prueba de acentos: =?UTF-8?B?w6HDqcOtw7PDusOxw5E=?=<br /><br />que es una forma de transmitir caracteres "extraños para los anglosajones". Fijaros que pone UTF-8 en medio, para indicar que lo que sigue es una codificación especial.<br /><br />* Al llegar el correo a nuestro servidor de correo, nuestro programa gestor de correo QUITABA la codificación de los caracteres acentuados que había en el asunto, PORQUE está contemplado en el protocolo estándar de correo: en las cabeceras se permite poner los acentos de forma directa, sin codificación ninguna.<br /><br />Por ello, nuestro programa de correo, al recibir:<br /><br /> Subject: Prueba de acentos: =?UTF-8?B?w6HDqcOtw7PDusOxw5E=?=<br /><br />Lo dejaba así:<br /><br /> Subject: Prueba de acentos: áéíóúñÑ<br /><br />y se esperaba que el programa de correo entendiese esos acentos, PORQUE en el resto del mensaje, sí que está indicada la codificación:<br /><br /> Content-Type: text/plain; charset=UTF-8<br /> Content-Transfer-Encoding: 8bit<br /><br />y por esa razón se ve perfectamente en los programas de correo más modernos.<br /><br />El problema está ahí: no todo el mundo usa un programa de correo moderno, como es el caso de los Microsoft Outlook. En esos programas, al encontrarse con el asunto<br /><br /> Subject: Prueba de acentos: áéíóúñÑ<br /><br />lo saca tal cual en pantalla (lo cual es lógico), PERO resulta que el usuario, seguramente, NO ESTÁ TRABAJANDO con la misma codificación que los caracteres mostrados. La consecuencia es que el usuario ve<br /><br /> Subject: Prueba de acentos: áéÃóúñÃ<br /><br />Esos caracteres extraños, juntos, siguen siendo los mismos acentos de antes. Lo que varía es la forma en que el usuario los ve.<br /><br /><br />Este problema es derivado de que cada ordenador trabaja con una codificación distinta.<br /><br />La tendencia tecnológica actual es usar SIEMPRE la codificación UTF-8, tanto a la hora de crear como de leer documentos/correos.<br /><br />Pero, mientras tanto, los programas antiguos nos darán estos dolores de cabeza.<br /><br />La solución fue editar exim4.conf y donde pone $h_subject, cambiarlo por <span style="font-weight: bold;">$bh_subject</span>, según lo indicado en <a href="http://www.exim.org/exim-html-current/doc/html/spec_html/ch11.html#SECTexpansionitems">http://www.exim.org/exim-html-current/doc/html/spec_html/ch11.html#SECTexpansionitems</a><br /><br /><span style="font-weight: bold;">Actualización:</span> Por alguna extraña razón, algunos clientes emiten un retorno de carro y/o avance de línea después del Subject. Cambio la opción de <span style="font-weight: bold;">$rh_subject</span> a <span style="font-weight: bold;">$bh_subject</span>.Joaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.com1tag:blogger.com,1999:blog-38399245.post-82743079585887058742009-03-13T10:52:00.005+01:002009-03-14T00:05:18.185+01:00Sincronización de contactos y calendariosEl tema de la sincronización es tan compleja como lo de la torre de Babel...<br /><br />Yo he tardado años en encontrar una solución... y no es segura que se mantenga en el futuro porque cada vez que cambias de ordenador, sistema operativo y/o teléfono, te la juegas y puede que quede algo sin sincronizar.<br /><br />Bueno... te cuento mi situación y luego mi solución. No tiene porqué ser la mejor solución, pero...<br /><br /><br />Yo tengo 5 ordenadores que manejo al día (dos en dos oficinas distintas, y 3 ordenadores en casa) más un teléfono móvil.<br /><br /><br /><span style="font-weight: bold;">Correo electrónico</span><br /><br /><br />No hay problema en leer y mandar el correo desde cualquiera de ellas, gracias al uso del protocolo IMAP. Pero sí lo hay en el tema de los contactos. Poseo 4 buzones de correo básicos (dos de dos empresas y otros dos personales). Uno de los buzones personales es de Gmail.<br /><br />Bueno, la idea es cómo tener todos los contactos en todas las máquinas. Y que cuando agregues un contacto, puedas tener acceso a él.<br /><br />Dejemos un momento aparte al teléfono móvil y a Gmail. El problema se reduce bastante: en todas las máquinas uso entonces Mozilla Thunderbird. A este programa se le puede añadir complementos. Uno de ellos es <a href="https://addons.mozilla.org/es-ES/thunderbird/addon/2533"><span style="font-weight: bold;">Addressbooks Synchronizer</span></a>.<br /><br />Este complemento permite poner la libreta de direcciones en una carpeta IMAP, en el servidor, así que de esa manera, y de un plumazo, tengo resuelto el tema de sincronizar contactos entre todos los ordenadores. Y como a Thunderbird le puedes decir que agregue de forma automática los nuevos destinatarios en la libreta, toda la sincronización es invisible.<br /><br />El problema que queda aparte es Gmail y el teléfono.<br /><br />Entre los dos, había resuelto el problema de esta manera: Google tiene un servicio que se llama <a href="http://www.google.com/mobile/default/sync.html">Google Sync</a>, así que me lo bajé al móvil, y perfecto: los contactos entre los dos se sincronizaron y ya está. Bueno, algunos contactos aparecieron duplicados porque los nombres de los contactos diferían un poco.<br /><br />Y ahora queda lo más difícil... cómo sincronizar entre Gmail (alias, teléfono), y entre la libreta de direcciones IMAP de Thunderbird.<br /><br />La solución la encontré esta mañana, en la web de <a href="http://www.zindus.com/download-extension/">Zindus.com</a>. Allí te puedes bajar un complemento para Thunderbird, que permite sincronizar los contactos entre los dos.<br /><br />Y ahora viene lo malo... de repente me he encontrado con más de 500 contactos, 300 de ellos duplicados debido a que, es claro: la información que tenía de un contacto en Gmail no coincidía con el que tenía en Thunderbird. Así que ahora, con un poco de calma, hacer limpieza.<br /><br />Aún queda por hacer unas cuantas pruebas más... para ver qué tal queda.<br /><br />Eso sí, hay un detalle que no está bien: en Thunderbird, cada contacto tiene un montón de campos, pero Google no: los mete todos en un solo campo.<br /><br /><br /><span style="font-weight: bold;">Calendarios</span><br /><br /><br />Yo uso tres tipos de calendarios:<br /><ul><li>El del teléfono, y del que todavía no he encontrado forma de sincronizar, pero hay herramientas</li><li>Los muy personales (el propio de cada ordenador -uno por máquina-, los cumpleaños y el personal -estos dos, compartidos-)</li><li>Los menos personales y los públicos, que los tengo en Google Calendar.<br /></li></ul><br />La herramienta que uso para ver los calendarios en los ordenadores es, dentro de Thunderbird, con el complemento <a href="https://addons.mozilla.org/es-ES/thunderbird/addon/2313"><span style="font-weight: bold;">Lightning</span></a>.<br /><br />Este complemento permite tener el servicio de calendario y tareas. Si no lo queremos usar dentro de Thunderbird, Mozilla te lo ofrece como programa separado, que se llama SeaMonkey.<br /><br />Además de crear calendarios locales, este complemento permite ver los calendarios que tengamos en Google Calendar (¡ojo!, he dicho ver, solo ver). Más complicación es para los calendarios que queramos compartir entre las máquinas.<br /><br />Para esto, he hecho lo siguiente: en el servidor de Internet he creado un directorio protegido con contraseña y he configurado el acceso web para que se utilice el protocolo WebDAV -necesario para poder bajar y subir ficheros en nuestro directorio personal en el servidor-.<br /><br />En el trabajo diario, como tengo siempre abierto el Firefox y el Thunderbird, digamos que tengo entonces todos los calendarios disponibles. Y en todas las máquinas (excepto el teléfono) tengo los mismos calendarios.<br /><br />Bueno, esto es un resumen. Me he comido, por ejemplo, cómo configurar los calendarios remotos, pero no quería hacerlo muy largo :)<br /><br /><br />Problemas de usar Google Calendar:<br /><ul><li>Es necesario que cada participante tenga un correo de Gmail (me parece que esto último ya no es necesario)</li><li>Google "leerá" vuestro calendario para sacar estadísticas, lo cual no es de gusto de todos.<br /></li></ul><br /><br />Ventajas de usar Thunderbird+Lightning o SeaMonkey con un servicio WebDAV:<br /><ul><li>El formato del calendario es estándar (ICS) con lo que llevarlo al teléfono móvil no debería ser problemático (por ejemplo, iPhone)</li><li>Nadie verá vuestro calendario, a diferencia del de Google Calendar</li><li>Como añadido, nos da la visión de Tareas, cosa que no tiene Google Calendar.<br /></li></ul><br />Problemas:<br /><ul><li>El número de personas a actualizar y meter nuevos eventos debe ser reducido (no he probado a ver qué pasa si hay muchas personas actualizando datos a la vez). Para un uso normal, no hay problemas, pero no tengo una cifra exacta. Digamos que para una empresa de tipo medio no habría problemas</li><li>El tiempo de refresco del calendario no es tan instantáneo como el Google Calendar. De hecho, pueden pasar minutos hasta que aparezcan cambios (o hasta que solicitemos un refresco manual).</li></ul>Joaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.com3tag:blogger.com,1999:blog-38399245.post-69506125342992203412008-05-12T01:02:00.005+02:002009-03-14T00:03:11.086+01:00Lo nuevo de Perl 5.10. 3: El operador smart matchEl operador de coincidencia universal, <span style="font-weight: bold;">~~.</span> El sueño hecho realidad del programador que quiere tener un código corto, limpio, claro.<br /><br />Para los programadores de Perl, se nos convirtió en costumbre pensar la forma en la cual tenemos que saber cómo comparar dos elementos. Estamos acostumbrados a pensar en las múltiples formas, operadores y posibilidades de comparación entre elementos, comprobación y existencia de elementos dentro unos de otros, valores de retorno de las funciones, existencia de un elemento dentro de un <span style="font-style: italic;">array</span> o <span style="font-style: italic;">hash</span>.<br /><br />Pero a su vez, esto es un problema para los que empiezan, que se sienten abrumados por la cantidad de operadores y nueva sintaxis que deben aprender.<br /><br />Ahora no. Casi todas de estas operaciones se pueden realizar con el mismo operador.<br /><br />Un ejemplo:<br /><pre> if ( $a ~~ @b ) {</pre><br />hará lo que sospechamos: devolverá verdadero si el elemento $a está dentro de @b, es decir, que alguno de los elementos de @b es igual a $a. Ya no hay que escribir un bucle para recorrer el array, en busca de ese elemento.<br /><br />La siguiente tabla es un resumen de las combinaciones posibles:<br /><br /><pre> $a $b Tipo de coincidencia Código similar<br /> ====== ===== ==================== ==============<br /><br /> Codigo[+] Codigo[+] igualdad referencial $a == $b<br /> Cualquiera Código[+] test escalar de sub $b->($a)<br /><br /> Hash Hash claves hash idénticas [sort keys %$a]~~[sort keys %$b]<br /> Hash Array existencia hash slice grep {exists $a->{$_}} @$b<br /> Hash Regex filtrado claves hash grep /$b/, keys %$a<br /> Hash Cualquiera existencia item hash exists $a->{$b}<br /><br /> Array Array arrays son idénticos[*]<br /> Array Regex filtrado array grep /$b/, @$a<br /> Array Número array contiene número grep $_ == $b, @$a<br /> Array Cualquiera array contiene string grep $_ eq $b, @$a<br /><br /> Cualquiera undef indefinido !defined $a<br /> Cualquiera Regex búsqueda del patrón $a =~ /$b/<br /> Código() Código() resultados son iguales $a->() eq $b->()<br /> Cualquiera Código() simple closure truth $b->() # ignoring $a<br /> Número valor[!] igualdad numérica $a == $b<br /> Cualquiera string igualdad de cadena $a eq $b<br /> Cualquiera Número igualdad numérica $a == $b<br /><br /> Cualquiera Cualquiera igualdad de cadena $a eq $b<br /><br />+ - debe ser una referencia a un código cuyo prototipo (si está presente) no sea ""<br /> (sub con un prototipo "" son tratados en la entrada 'Código()' que está más abajo).<br />* - es decir, cada elemento coincide con el elemento del mismo índice en el otro<br /> array. Si aparece una referencia circular, volvemos a la igualdad referencial.<br />! - Cualquier cosa, sea un número real o un string que parezca un número.<br /><br /><br /></pre>Joaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.com0tag:blogger.com,1999:blog-38399245.post-10982733567899328032008-05-04T11:33:00.004+02:002008-05-04T19:04:48.558+02:00Lo nuevo de Perl 5.10. 2: El operador de definiciónSe trata del operador <tt>//</tt>. La expresión<pre>$a // $b</pre>es equivalente a<pre>defined $a ? $a : $b</pre><br />Su uso principal será en la entrada de parámetros, en la que necesitamos saber si se le ha pasado un parámetro al programa o debemos tomar un valor por defecto.<br /><pre>my $parametro1 = $argumento1 // $valor_por_defecto1;</pre><br />Como nota curiosa, decir que en algunas raras situaciones se podría confundir con una expresión regular vacía. Lo normal es que no nos encontremos nunca en esas situaciones. Para evitar confusiones, lo ideal es prefijar las expresiones regulares con <span style="font-weight:bold;">m</span>. Además, es una regla básica de las buenas prácticas de programación en Perl, así que entonces, no hay problemas.Joaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.com0tag:blogger.com,1999:blog-38399245.post-11611431875536444152008-05-03T03:16:00.005+02:002008-05-03T17:04:08.651+02:00Lo nuevo de Perl 5.10. 1: El pragma featureComenzamos aquí una serie de artículos sobre las novedades que trae la última versión estable de Perl, la v5.10, publicada en diciembre de 2007. Estarán basados en el documento perl5100delta.pod de la actual documentación de Perl v5.10.<br /><br /><br /><span style="font-weight: bold;">El <span style="font-style: italic;">pragma feature</span></span><br /><br />Este <span style="font-style: italic;">pragma</span> se usa para activar la nueva sintaxis de esta versión. Se usa así para evitar problemas de compatibilidad con programas hechos para versiones de Perl anteriores.<br /><br />Las nuevas <span style="font-style: italic;">features</span> disponibles son <span style="font-weight: bold;">say</span>, <span style="font-weight: bold;">switch</span> y <span style="font-weight: bold;">state</span> que veremos próximamente.<br /><br />Como otros <span style="font-style: italic;">pragmas</span>, el efecto de las <span style="font-style: italic;">features</span> solo estarán disponibles en el contexto o bloque en que se definen:<br /><pre>{<br /> use feature 'say';<br /> say "say está disponible aquí";<br />}<br />print "Pero no aquí.\n";</pre><br />También se puede activar solicitando que el intérprete de Perl sea de una versión superior a la 5.9.5:<br /><pre>use 5.010;</pre>que es, además, la forma recomendada para activar la nueva sintaxis.<br /><br />Desde la línea de comandos, se podrá activar con la opción <span style="font-weight: bold;">-E</span>, en lugar de la anterior <span style="font-weight: bold;">-e</span>.<br /><br />Más información en <a href="http://search.cpan.org/perldoc?feature">feature</a>.Joaquin Ferrerohttp://www.blogger.com/profile/15956059841296454874noreply@blogger.com0