Feb 26 2010

Bash completion for symfony (autocomplete)

tatai

I have just pushed into GitHub a bash autocomplete script for symfony.

This script allows to autocomplete your first level option when calling to symfony script. It is easy to install (just copy one and call it manually if you do not have access rights). All steps and working issues are in the wiki. It also accepts custom actions.

This is a working example once script is corretly installed and invoked:

Assuming symfony is in current folder and [tab] y tab key press action, this is an example of how symfony_complete works:

$ ./symfony con[tab]figure:[tab][tab]
author    database
$ ./symfony doctrine:a[tab]uthor

We are pleased to know what you think and any issue you have. You can find us on GitHub.

Related links:


Feb 25 2010

Para que Movistar no te vuelva loco con la conexión de datos

tatai

Este post está destinado a todos aquellos usuarios que se han dado de alta en el módulo de datos GPRS de Movistar, para que no tengan que pasar por lo que he pasado yo, 3 llamadas de teléfono, más de media hora hablando (menos mal que el teléfono es gratuito), tener que seguir paso a paso (de +20 pasos) un how-to vía telefónica y encima tener que decirle al operador lo que tiene que hacer para que funcione la conexión en tu teléfono.

Sólo necesitas estos dos sencillos pasos:

  1. Llamar a Movistar y activar el módulo de datos (conexión a internet desde el móvil). Mira los planes de antemano, aunque no suele haber sorpresas, no positivas ni negativas de momento.
  2. Si te han podido configurar de forma automática el móvil, genial, ya hemos terminado, pero si no, lo único que tienes que hacer es ir a tu móvil, a la parte de conexión de datos y crear un nuevo APN. Tienes que configurar los siguientes datos (cuando no pongo nada, hay que dejarlo vacío):
    1. Nombre: Movistar Internet
    2. APN: movistar.es
    3. Proxy:
    4. Puerto:
    5. Nombre de usuario: MOVISTAR
    6. Contraseña: MOVISTAR
    7. Servidor:
    8. MMSC:
    9. Proxy de MMS:
    10. Puerto MMS
    11. MCC: 214
    12. MNC: 07
    13. Tipo de APN:

Como recomendación, comprueba que estos datos son los vigentes. No me hago responsable si han cambiado.

Ahora os voy a contar por qué, siendo unas explicaciones tan sencillas, yo tuve que estar tanto tiempo al teléfono.

Tras decidirme (no tienen, ni mucho menos, las mejores condiciones, pero de momento no puedo hacer otra cosa), llamé para llevarlo para contratar el módulo. Rápidamente me lo activaron y me dijeron que apagase el móvil al menos 5 minutos y que lo encendiese entonces; ya dispondría de internet.

Bien, las instrucciones eran sencillas, aunque me quedé un poco mosqueado no tener que configurar nada en el móvil. Ilusionado encendí el móvil y, nada, no había conexión.

Volví a llamar y le expliqué al operador lo ocurrido. Me hizo esperar un poco, obtuvo el modelo de mi móvil sin yo decírselo (algo que me gustó) y me dijo que ya lo había configurado todo. De nuevo tenía que terminar la llamada, apagar el móvil al menos 5 minutos y encenderlo.

En fin, hice lo mismo, pero nada. Mirando la configuración del móvil vi que no había definido ningún APN, con lo que evidentemente, era bastante improbable que me conectase a ningún sitio. El APN son los datos que necesita el móvil para tener acceso a la red de datos.

Volví a llamar. Me cogió otra persona y le expliqué lo ocurrido. Miró a ver qué había hecho su compañero y me dijo que sólo había reseteado la velocidad de conexión. Bien, gran trabajo, apagar y volver a encender, se ve que el otro tenía la lección bien aprendida. Cuando me empezó que iba a mirar no-se-qué cosa, le paré y le dije, “oiga, creo que es necesario configurar el APN, no?” y me dijo, sí claro (super-evidente… tan evidente como que ni a ti ni a tu compañero se os había ocurrido y os dedicais a dar soporte, ains).

Ahora llegó lo mejor de todo. Tuve que seguir dos how-to, paso a paso, por teléfono de cómo configurar dos APNs distintos. Uno que no me servía de nada y otro que fue el que finalmente me funcionó. Menos mal que disponía de teclado físico y manos libres, que si no… Fue horrible, más de 20 pasos cada uno de ellos. No disponían de configuración automática para el HTC Magic (teléfono que está en su catálogo).

Y bueno, por fin, tras colgar la llamada, la conexión llegó. Último consejo, cuando llaméis con una incidencia de datos, no llaméis con ese mismo teléfono, hacerlo con otro ya que no se pueden poner las dos cosas a la vez.


Feb 24 2010

Generar passwords aleatorios desde la consola

tatai

Seguro que alguna vez has necesitado una contraseña de estas complicadas y no sabías que poner. Pues bien, de las millones de posibilidades que tienes para generar una, yo tengo esta que la verdad, me parece sencilla y rápida:

cat /dev/urandom | tr -dc "a-zA-Z0-9-_\.\!\$\?" | fold -w 10 | head -n 1

Ok, explicación:

  • /dev/urandom: fuente aleatorio de información
  • tr -dc “a-zA-Z0-9-_\.\!\$\?”: elimina cualquier caracter que no sea una letra, un dígito o alguno de los símbolos – _ . ! $ ?
  • fold -w 10: obliga a que el tamaño sea de 10 caracteres
  • head -n 1: mostrar una contraseña

Así pues, si quieres que tu contraseña tenga x caracteres, cambia el 10 del comando fold por ese valor y si quieres obtener más de una contraseña, indicalo cambiando el 1 de head por tantas como quieras. Por supuesto, si quieres cambiar los caracteres válidos, modifica la expresión de tr.


Feb 23 2010

Crear un DOMDocument de un DOMNode en PHP5

tatai

Tengo que reconocer que DOMDocument (del Document Object Model de PHP) me gusta muy muy poco. Lo he usado por necesidad un par de veces en versiones tempranas de PHP5 donde SimpleXML todavía no tenía tanta potencia y con el problema de no poder usar por ejemplo YAML u otro tipo de formatos que no me daban la potencia y flexibilidad de XML para ciertos casos.

Bueno, una de los últimos problemas que me he encontrado ha sido cómo obtener un DOMDocument de un DOMNode ya que quería usar XPath a partir de dicho DOMNode, algo que no es posible si no es DOMDocument.

La verdad es que no he encontrado mucha información ni algo bonito para presentar. Sólo tengo esto, que por lo menos me ha servido (he preferido no pararme a medir el consumo de memoria o de proceso por miedo a querer descartar la idea y perder todavía más tiempo, jeje):

$doc = new DOMDocument();
$doc->loadXML($node->ownerDocument->saveXML($node))

El “truco” es tan sencillo como como crear un nuevo DOMDocument en el que importamos (vía método loadXML) el nodo a través del código XML que genera. Este código se obtiene con la propiedad ownerDocument del DOMNode (que nos retorna el DOMDocument) y sobre el que podemos llamar a saveXML, método que expulsa el XML del elemento que le indiquemos, en este caso, nuestro DOMNode.


Feb 23 2010

Buscando ejecutables en el path

tatai

No es la primera vez que me encuentro con una cara de alegría cuando enseño uno de estos comandos con lo que lo voy a dejar por aquí escrito, por si puedo alegrar unas cuantas caras más.

Básicamente consiste en sacar el path completo donde se encuentra un ejecutable en nuestro sistema. Si queremos, por ejemplo, buscar donde está el comando ls, escribimos:

$ which ls

o bien

$ whereis ls

El resultado de ambos es muy parecido: /bin/ls

¿Dónde está la diferencia? Pues which acepta por ejemplo el parámetro -a con el que se muestran todas las coincidencias (no únicamente la primera) o el parámetro -p que retorna 1 si ha encontrado el ejecutable o 0 si no (útil para scripts).

Mucho ojo, estos dos comandos únicamente buscan en aquellos paths definidos en $PATH. Si necesitas buscar fuera de los paths las dos opciones más comunes son:

$ locate ls

O más “a lo bruto”:

$ find / -name 'ls' -type f

Hay que tener en cuenta que locate requiere que se haya indexado el contenido en el disco duro. Por esto, es posible que alguna vez os haya ocurrido que el ejecutable no aparecía, quizás ejecutásteis el comando demasiado pronto.


Feb 11 2010

XHP: una extensión para escribir PHP de forma distinta

tatai

Una de las noticias de esta semana en el mundo PHP es sin duda toda la información acerca de HipHop for PHP por parte del equipo de desarrollo de Facebook. Una de las extensiones que ha salido a la luz por parte del equipo de front-end es la que han llamado XHP y, como ellos mismos rezan, “a new way to write PHP” (una nueva forma de escribir PHP).

La explicación de cómo funciona es muy sencilla. Intentan evitar que al desarrollar la parte de frontal, cuando nos “pegamos” con el XHTML, tengamos que unir código XHTML y PHP. En el ejemplo que muestran se ve más claramente.

De un código como:

<?php
if ($_POST['name']) {
?>
    <span>Hello, <?=$_POST['name']?>.</span>
<?php
} else {
?>
    <form method="post">
    What is your name?<br>
    <input type="text" name="name">
    <input type="submit">
    </form>
<?php
}

Nos da como opción generar este otro:

<?php
// note: includes omitted
if ($_POST['name']) {
  echo <span>Hello, {$_POST['name']}</span>;
} else {
  echo
    <form method="post">
      What is your name?<br />
      <input type="text" name="name" />
      <input type="submit" />
    </form>;
}

No voy a negar que, de primeras, XHP parece más sencillo de seguir y de generar. Eliminar los tags de apertura y cierra de PHP aligera el código en gran medida. Además, eliminamos problemas con el XSS así como detectar problemas por malformación de XHTML en tiempo de parsing.

A mi personalmente me sigue gustando bastante más usar un motor de plantillas. Un motor real como XTemplates (sí, he dicho XTemplates, no smarty o similares). Separar el código PHP del HTML me parece bastante importante y necesito verlo con más claridad.

No obstante, hay que seguir el tema de cerca. Si es algo que la gente de Facebook ha visto que es necesario ya que aumenta el rendimiento, es evidente que en este tipo de entornos será uno de los puntos de referencia. Sin embargo, XHP como técnica para el resto de las webs donde no se reciban tantas peticiones como Facebook (si no recuerdo mal, sirven más doscientas mil millones de páginas al mes, sí, sí, 200.000.000.000), es posible que un objetivo que cumpla a primera vista es juntar el PHP con el HTML, algo que, repito, me parece bastante “sucio” si no hay una justificación clara. Pos supuesto, un motor de plantillas tiene sus desventajas, no vamos a negarlo :)

Lo dicho, XHP de momento me parece algo que puede provocar que el código sea más rápido pero a costa de hacerlo más guarro. Habrá que seguirle la pista para ver por dónde avanza, no lo descarto de primeras porque el objetivo de aumentar el rendimiento es muy importante, pero analizando el coste (ni monetario ni de recursos en este caso, jeje).

Enlaces:

Update: Muy muy muy interesante lo que comenta Rasmus en su web. Importante verlo.


Feb 7 2010

Montaje Velleman k8061

tatai

Algunos que se quedaron un poco mosca por algunos twitts que estuve haciendo sobre soldaduras el 6 de enero. Bien, aunque un poco tarde, voy a explicar a qué venían esos twitts y como invertimos una parte del Dia de Reyes. Lo que pasó fue que @miritxu y yo estuvimos un buen rato (creo que fueron en total algo más de 4 horas) montando el kit Velleman k8061.

Este kit te permite montar una placa interfaz que tiene 33 entradas/salidas (8 entradas analógicas, 8 salidas analógicas de colector abierto, 8 entradas digitales, 8 salidas digitales y 1 salida PWM a 15,6 kHz) y que se pueden leer en el ordenador mediante USB. Además, la gran ventaja que tiene esta placa es que tiene drivers para entorno Linux, algo que era totalmente necesario para nosotros. Además es extensible ya que se pueden conectar hasta 8 de estas tarjetas simultáneamente al mismo ordenador, multiplicando así su capacidad.

Es un kit que montas de cero ya que tienes todos los componentes por separado como se puede ver en las siguientes fotos. Algo que me gustó mucho de este kit es que los componentes venían ordenados, así no era necesario ir mirando o midiendo cada una de las resistencias, diodos y condensadores, haciendo la tarea algo más fácil.

¡Todo preparado!

Algunos de los componentes

La placa, todavía "virgen" :)

Teníamos por delante 578 soldadura así que… adelante! Algunas fotos del proceso.

Primeras resistencias (avance: 15%)

Así queda por detrás (antes de cortar los sobrantes)

Avanzamos con las resistencias

¡Avanzamos! Ya tiene mejor pinta ;)

¡Y por fin, el resultado final!

Así queda la placa finalmente

Tras conectarla al ordenador y con el programa de prueba que trae (sólo para Windows desgraciadamente), comprobamos como funcionaban todas las entradas y salidas :) ¡Buen trabajo, todo 100% funcional a la primera!

Ahora toca investigar como hacerlo funcionar en Linux y programarla para nuestras necesidades.

Update: parece que las primeras pruebas con Linux están dando buenos resultados!


Feb 5 2010

Mis promesas/objetivos para el 2010

tatai

La verdad es que ya iba siendo hora que los pusiese. Los tengo apuntados y nos los toco desde el 6 de enero, pero en fin (debería añadir no procastinar a la lista? jeje)

Bueno, ahí van:

  • Twittear más y de más calidad. Dar más enlaces interesantes.
    • Llegar a los 4750 twitts
  • Postear al menos una vez cada 3 días
    • Esto hace unas 2 veces por semana, 10 veces al mes y 122 al año
  • Aumentar en un 25% el número de visitas y de páginas vistas (según Google Analytics)
    • Comparando el período 01/01 – 31/12
  • Llevar al día las clases y la corrección de prácticas
    • Nunca más de dos semanas en corregir una sesión de prácticas
  • Leer 5 libros de lectura (no valen temas técnicos)
  • Sigue habiendo kilos de sobra. ¡Más deporte!
  • Jugar a un juego y pasarmelo (¡que es bueno jugar, leñe!)
  • Aprender Android (se valorará positivamente iPhone/iPod, pero como segundo objetivo ;) )
  • Montar definitivamente mi emisora, bien en el coche (con las antenas móviles) o en casa (por ejemplo con una vertical)
  • Desconectar de todo: internet, móvil, etc durante al menos 7 días seguidos

Yo creo que la lista es buena… ¡a ver en qué queda!


Ene 31 2010

UBA DX Contest SSB 2010 desde la URDE

tatai

Como cada finales de enero, es hora del UBA contest, uno de los grandes de 24 horas de duración llevado a cabo desde la Belgium Amateur Radio Society.

Como todas las veces que la URDE se reune para realizar concursos hubo mucha gente, mucha radio y un gran ambiente, todo lo que nos permitía La Romaleta, jeje.

Yo hice mi aportación de contactos nada más llegar, más de 40 contactos en 40 metros con Roxana que se portó de maravilla, ayudado por Félix EA2PLN al teclado. Dos o tres belgas y mucho italiano.

Félix EA2PLN y Fran EA2DJM al aparato

En ese momento me añadí a uno de los varios corrillos de buenos amigos disponibles, Roberto EA2DHA como siempre contando los chistes y las anecdotas acompañado por Amaia EA2OSA, Miriam EA2CWX, Tito EA2HGG y Ana. Por otro lado Felipe EA2MQ y Evaristo EA2BSR preparando las migas para la cena acompañados por los José Mari EA2DDG y EA2ATU.

Contamos además con la presencia de compañeros que se acercaron desde Ejea con los que compartimos una velada muy agradable

La tarde-noche dio para mucho. Vimos como Joaquín EA2CCG se pegaba el gustazo gracias a Roxana de contactar en 40 metros con Indonesia y Japón, todo un hito.

La cena, unas excelentes migas de Felipe EA2MQ que había mucho tiempo ya que no cataba y tortilla de patata casera de Ana. Para finalizar, todos pensando que eso era todo, llegaros LOS POSTRES. Sí, con mayúsculas: bizcocho de nueces casero y las tartas aportadas por la URDE y por los compañeros de Ejea especialmente dedicada como se puede ver en la siguiente foto:

Tarta del UBA Contest 2010

La cena fue muy animada y la radio sólo paró durante ese rato.

Parte de la mesa

La radio tuvo poco descanso

Hasta pudimos contar con la presencia, algo tardía de David EA2CTM y la tan esperada XYL Rebeca, ¡presentación que se estaba haciendo de rogar ya! Yo creo que se lo pasó en grande, como no puede ser menos.

En fin, gran tarde-noche en buena compañía que dejó muchas risas y buenos momentos. Y algo más de 400 contactos a las 2 de la mañana que seguro que en estos momentos en los que el concurso está finalizando ha crecido. Con ganas de que llegue el próximo concurso para repetir experiencia.

Y aunque algunos se empeñen en cambiar y tergiversar, aquí se vive la radio y gozamos de gente amigable y compañera. Nada más lejano de la realidad, nos desvivimos por la radio y no por intereses personales como hacen otros, sacudiendo hacia fuera para que manche a los demás. Todos los presentes lo disfrutaron y así será, aunque otros se empeñen en intentar evitarlo. Nos gusta la radio, nos gusta hacer bien las cosas, no podéis evitarlo a pesar de vuestros tongos, ansias de poder, dinero y manipulación. Ahí queda.

UPDATE: ya hay más resumenes de la jornada. Blog de Miriam EA2CWX, blog de Joaquín EA2CCG, blog de la URDE y unas cuantas fotos!


Ene 3 2010

Trabajar con ficheros a partir de una fecha y hora

tatai

Al hilo del post de ayer sobre date, hace poco tuve que realizar un sencillo script que borrase todos aquellos ficheros más viejos que una determinada fecha (en particular, ayer a las 6.30h).

Seguramente habrás pensado que la mejor opción es un find con -atime (o -mtime o -amin o -cmin, etc) y posteriormente con un -exec. Bien, es una buena idea aunque yo quería que fuese a partir de un determinado momento exactamente, sin calcular. Para esto, también usé find, pero me apoyé en date y en touch y quedó algo así:

#!/bin/bash
# La fecha y hora de ayer a las 6.30h
FECHA=$( date +-d "06:30 yesterday" +"%Y/%m/%d %H:%M:%S" )
# Fichero temporal
POINT=$( tempfile -p "point" )
# Cambiamos la fecha del fichero temporal
touch -d "${FECHA}" ${POINT}
# Buscamos ficheros más viejos que ${POINT} y los borramos
find /path/al/destino -not -newer ${POINT} -exec rm {} \;
# Borramos basura
rm ${POINT}

Es posible que sea algo más lioso, pero sin tener que calcular nada (por ejemplo la diferencia de tiempo entre cuando ejecutemos el fichero y nuestra hora objetivo), hacemos el trabajo rápidamente. Y también podemos cambiar la hora de una forma muy cómoda.

Más info

Este “más info” va a ser un claro RTFM ;)

  • man find
  • man date
  • man touch