Readers’ Choice Awards 2011

Y salieron los premios anuales de la revista Linux Journal, me topé con algunas sorpresas y otras no tanto, y puedo resaltar los ganadores de algunas categorías que me interesan:

  • Mejor distribución de Linux: Ubuntu (faltaba mas)
  • Mejor entorno de escritorio: Gnome 3 (de verdad no esta tan mal)
  • Mejor navegador: Firefox  :/
  • Mejor gestor de base de datos: MySQL (seguido muy de cerca por PostgreSQL)
  • Mejor lenguaje de programación: Python? (creo que es hora de empezar con «esa nota»)
  • Mejor juego: World of Goo (creo que vale la pena las 20 fichas que cuesta)

La lista es larga, son 45 categorías, les sugiero que le hechen un vistazo:

http://www.linuxjournal.com/slideshow/readers-choice-2011

 

Y pronto (abril 2012) Percona Live: MySQL Conference And Expo 2012

Pueden ver y descargar las conferencias del evento 2011 ahi mismo!

 

Eliminar numeros de linea con Vim

¿Quién no ha buscado código fuente en la red? Algunos sitios comparten segmentos de codigo fuente incluyendo el numero de línea, sé que lo hacen intencionalmente por que disfruntan sabiendo que debemos darnos el trabajo de eliminar las numeraciones de linea para poder compilar el codigo brindado, ademas de fijarnos en otros detalles.

Aqui una muestra clásica de un copy paste desde una pagina web hacia Vim (u otro editor):

Codigo fuente con numeros de linea

Para un segmento de codigo de unas cuantas lineas no hay ningun problema, pero si se tratan de cientos de lineas, nos tomaría varios minutos… me da pereza de solo pensarlo.

Solucion rápida: Vim nos ofrece una manera facil de reemplazar texto usando expresiones regulares. Para este caso es muy fácil armar una expresión que reconozca:

  1. Espacios en blanco al inicio ^\s*
  2. Al menos un digito (numero de línea) [0-9]\+
  3. Unos espacios mas, 0 ó 3 espacios. \s\{0,3}

La expresión regular quedaría así: ^\s*[0-9]\+\s\{0,3}, luego aplicamos la busqueda y reemplazo en todo el documento con el siguiente comando: 
:%s/^\s*[0-9]\+\s\{0,3}//g

el resultado es el siguiente:

VIM: Despues de aplicar el reemplazo grep

Las expresiones regulares son mucho mas poderosas, este es sólo un caso trivial que nos hace ganar un poco mas de tiempo.

Probando UDFs para MySQL: Title Case

Conocemos «de sobra» lo que hacen las funciones LCASE y UCASE en MySQL, otros gestores también la implementan con alguna variación en el nombre pero con el mismo resultado.

Pero que pasa si queremos una función que convierta un texto al tipo Titulo, conocido también como title case, es decir convertir «un texto arbitrario» en «Un Texto Arbitrario«, para este caso no existe la función mágica que haga esa conversión y tenemos que escribir una propia.

No es necesario «reinventar la rueda» (aunque podría hacerlo), buscando encontré un repositorio de funciones UDF para MySQL: http://www.mysqludf.org/ , hay varias funciones agrupadas según el objetivo/funcionalidad, solo tienen que descargar el código fuente, compilarlo y agregarlo como funciones nuevas en vuestros servidores MySQL.

He aislado la función str_ucwords (que convierte un texto a «Title Case») en un archivo separado para mostrarles como es que podemos compilar una UDF para MySQL.Pero he modificado el archivo por que solo funcionaba con parámetros constantes, ahora la función acepta nombres de columnas como parámetros.

Pueden descargar el archivo fuente: ucwords.c

Para compilarlo necesitan unas tres instrucciones:

#Compilamos el programa
ivancp@ubuntu$ gcc ucwords.c -o ucwords.so -shared -lmysqlclient -I/usr/include/mysql

#Copiamos el archivo de salida en la carpeta de plugins de mysql
ivancp@ubuntu$ sudo cp ucwords.so /usr/lib/mysql/plugin

#Quitamos el permiso de ejecución del archivo
#para que pueda cargarlo correctamente
ivancp@ubuntu$ sudo chmod -x  /usr/lib/mysql/plugin/ucwords.so

 

  • La opción -shared compila el archivo para que pueda ser usado como librería.
  • La descripción del resto de parámetros van a encontrarla en la entrada: Leer datos de MySQL desde C

Ahora debemos agregar la función a MySQL:

mysql> create function str_ucwords returns string soname 'ucwords.so';
Query OK, 0 rows affected (0.00 sec)

mysql>

 

Ahora veamos algunas pruebas, esta es una consulta común (los datos están almacenados en mayúsculas o Upper Case):

mysql>select nombres from tabla;
+----------------------------------+
| nombres                          |
+----------------------------------+
| AGUILAR PALACIOS RICARDO         |
| ANDIA MARQUEZ LUIS MELITON       |
| CUYUBAMBA RAMOS VICTOR ALEJANDRO |
| FELICIANO VELAZCO VICTORIA       |
| FLORIDA EVANGELISTA LILA REYNA   |
| LEON LAULATE FERNANDO            |
| PALACIOS LOPEZ ROXANA BEATRIZ    |
| REATEGUI RAMIREZ CARLOS          |
| REINOSO MORI JORGE WILLY         |
| SALAZAR VALDIVIA WALTER          |
| SANCHEZ TUTUSIMA CARMEN ROSA     |
| VELAZCO BERROA PETRONA           |
+----------------------------------+
12 rows in set (0.00 sec)

 

Aquí esta lo que queremos ver, la consulta primero convierte a minúsculas todo el campo y luego convierte éste resultado a Title Case, vean:

mysql>select str_ucwords(lcase(nombres)) from tabla;
+----------------------------------+
| str_ucwords(lcase(nombres))      |
+----------------------------------+
| Aguilar Palacios Ricardo         |
| Andia Marquez Luis Meliton       |
| Cuyubamba Ramos Victor Alejandro |
| Feliciano Velazco Victoria       |
| Florida Evangelista Lila Reyna   |
| Leon Laulate Fernando            |
| Palacios Lopez Roxana Beatriz    |
| Reategui Ramirez Carlos          |
| Reinoso Mori Jorge Willy         |
| Salazar Valdivia Walter          |
| Sanchez Tutusima Carmen Rosa     |
| Velazco Berroa Petrona           |
+----------------------------------+
12 rows in set (0.00 sec)

 

Funciona a la perfección!

Por favor revisen la documentación, en otro post explicaré que deben tener en cuenta para elaborar sus propios UDF:

http://dev.mysql.com/doc/refman/5.0/en/adding-udf.html

Mis bugs reportados de MySQL-Workbench

Hace algunos meses, mientras usaba MySQL Workbench 3.2.33, noté varios bugs los cuales reporté inmediatamente, Oracle ya publicó la versión 3.2.35 y está apunto de publicar la versión 3.2.36, no había recibido noticias acerca de mis reportes.

Siempre es bueno colaborar a la mejora de herramientas libres, en este caso me dí cuenta de algunos detalles, incluso algunos de ellos pasarían desapercibidos. Pasado el tiempo ya, quise saber sobre mis bugs reportados y resulta que todos ya habían sido resueltos, y éstos son:

60354    Workbench can’t open a stored procedure
60557    Workbench closes without ask to save modified file
60562    The action pane won’t checks the selected database.
60576    Workbench adds a extra quote
60610    Don’t assign a correct tab name when open a sql script

Son solamente 5 de cientos de reportes, el equipo que desarrolla MySQL Workbench se encarga de ir resolviendo de a pocos los bugs y van soltando las versiones según les parezca, llegará el día en que los bugs sean solamente unos cuantos por versión, ese día Workbench habrá madurado y será mucho mas estable que hasta ahora.

Cualquiera puede reportar un bug, solo debes ir a la pagina de bugs: http://bugs.mysql.com/report.php detallar lo mejor posible las condiciones donde se genera el «horror». Puede que sea necesario buscar un error similar ya reportado.

Problema al emitir recibos de honorarios SUNAT

Hace unas horas me he afiliado a la emisión por recibos de honorarios de la SUNAT, y me he dado con la sorpresa que no se pueden emitir los recibos de honorarios y me imagino que también para otros casos.

Sé que llamando a la misma SUNAT o enviando una queja puede demorar una eternidad, y busque una solución mientras el genio que ha programado esto lo solucione.

Este es el punto donde se estanca, desde aquí no es posible avanzar mas:

Sunat - Recibo Honorarios Electrónicos

Deben usar Firefox (con firebug plugin) o Chrome para que puedan seguir adelante, con los siguientes pasos (a prueba de tontos), lo voy a decir una vez mas Internet Explorer No Sirve!!!

Paso 1: Inspeccionar el campo (Click derecho sobre) Nombre o Razon social del usuario, después  de haber validado/consultado el número de RUC:

Inspeccionar Elemento

Paso 2: Editar el HTML (que debería estar seleccionado) haciendo click derecho:

Editar HTML

 

Paso 3: Agregar el texto id=»nombrecliente» y cerrar la ventana de edicón:

Agregar texto HTML

Paso 4: Seguir adelante!

Seguramente este metodo sirva unas cuantas horas hasta que se den cuenta del horror, espero les sirva para salir de este apuro.

 

 

 

¿Donde comprar libros baratos?

Mientras sitios como Amazon ofrecen una variedad de libros única en la red, también existen los otros donde podemos encontrar libros usados a bajo costo y finalmente podamos tener el gusto de leer el libro original. Algunos dirán que es una tontería comprar libros antiguos sobre computación, bueno… cada quien con sus gustos.

Por ejemplo siempre he querido tener los cuatro tomos de la documentación de Visual C++ 6.0 edición impresa de mas de 1200 paginas cada uno, o los libros de David Kruglinski, Jeff Prosise o Herbert Schildt… una delicia para quienes aman coleccionar verdaderos clásicos.

En Amazon también podemos comprar libros usados a menor precio, pero hay sitios dedicados a vender libros usados (aunque ahora también venden nuevos), les dejo una lista de sitios en los que he comprado (y compro periódicamente) gran cantidad de libros nuevos y usados.

www.thriftbooks.com
Costos de envío por libro: $4.99
Libros desde $3.95

www.betterworldbooks.com
Costos de envío por libro: Gratis!
Libros desde $7.48

www.thriftbooks.com
Costos de envío por libro: $5.99
Libros desde $3.39

www.alibris.com
Costos de envío por libro: $12.99
Libros desde $1.00

Como han visto los costos de envío varían, en todos los casos los tiempos de envío pueden dejarlos paranoicos, solo hay que ser pacientes, los libros llegarán de todos modos.

Activar el motor FEDERATED en MySQL

El motor FEDERATED de MySQL, aunque no es muy versátil, puede resultar útil, por ejemplo, para conectarnos directamente a una tabla en otro servidor MySQL sin necesidad de un intermediario, como un script PHP que copie/verifique/vea datos de otro servidor.

El motor FEDERATED no esta habilitado por defecto en instalaciones estándares sobre Linux, no hay que compilar nada, solo agregarle el parametro --federated en el archivo /etc/init/mysql.conf:

#Busquen esta linea en el archivo /etc/init/mysql.conf
exec /usr/sbin/mysqld --federated

Luego de reiniciar el servicio mysql, verán los resultados:

ivancp@ubuntu$ sudo service mysql restart

 

Para ver que motores están disponibles ejecuten SHOW ENGINES en la linea de comando MySQL:

mysql> show engines;
+------------+---------+-----------+--------------+------+------------+
| Engine     | Support | Comment   | Transactions | XA   | Savepoints |
+------------+---------+-----------+--------------+------+------------+
| InnoDB     | YES     | Supports t| YES          | YES  | YES        |
| MRG_MYISAM | YES     | Collection| NO           | NO   | NO         |
| BLACKHOLE  | YES     | /dev/null | NO           | NO   | NO         |
| CSV        | YES     | CSV storag| NO           | NO   | NO         |
| MEMORY     | YES     | Hash based| NO           | NO   | NO         |
| FEDERATED  | YES     | Federated | NO           | MO   | NO         |
| ARCHIVE    | YES     | Archive st| NO           | NO   | NO         |
| MyISAM     | DEFAULT | Default en| NO           | NO   | NO         |
+------------+---------+-----------+--------------+------+------------+
8 rows in set (0.00 sec)

 

Para conectarnos a una tabla remota y consultar que datos contiene, tenemos que crear la tabla, debe ser muy similar a la tabla remota, pueden ayudarse con el comando SHOW CREATE TABLE para ahorrar tiempo y agregar el parámetro CONNECTION al final.

-- Tabla con conexion a una base de datos remota
CREATE TABLE tabla_remota
(
    id     INT NOT NULL AUTO_INCREMENT,
    campo1  VARCHAR(32),
    campo2  INT,
    PRIMARY KEY  (id),
    INDEX campo1 (campo1)
)
ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://usuario:contraseña@1952.168.6.5/base_datos/tabla';

 

Recomendaciones:

  • El único problema es que la consulta puede demorar un poco mas de lo debido, así es que traten de no hacer consultas cuyos resultados sean realmente grandes.
  • Es una pena que aun no esté disponible la posibilidad de conectarse a otros gestores de datos como PostgreSQL o SQL Server, eso sí que sería útil.
  • Deben crear un usuario sin contraseña en la base de datos de destino, para evitar poner la contraseña en la conexión, ya que es fácil de averiguar (con SHOW CREATE TABLE).
  • Las conexiones son permitidas incluso hacia servidores MySQL mas antiguos.
  • Leer la documentación para mas detalles:
    http://dev.mysql.com/doc/refman/5.1/en/federated-storage-engine.html
  • Pueden ayudarse con un Stored Procedure para crear estas tablas FEDERATED.

Espero les sirva.

WordPress ahora acepta sentencias LaTeX

Gracias a un plugin para WordPress incluido en Jetpack podemos incluir expresiones matemáticas en los posts fácilmente. Solo necesitan instalar Jeckpack en su WordPress para habilitar esta opción.

Esto es especialmente útil al momento de explicar un algoritmo, que incluya expresiones matemáticas, o para quienes tengan un blog y sean profesores/físicos/matemáticos/etc

Solamente tienen que escribir la expresión matemática en sintaxis  entre los signos de dolar:

[expresion] 

Aquí algunos ejemplos:

x = a_0 + \frac{1}{\displaystyle a_1  + \frac{1}{\displaystyle a_2  + \frac{1}{\displaystyle a_3 + a_4}}}

x = a_0 + \frac{1}{a_1 + \frac{1}{a_2 + \frac{1}{a_3 + a_4}}}

z \left( 1 \ +\ \sqrt{\omega_{i+1} + \zeta -\frac{x+1}{\Theta +1} y + 1}  \ \right)  \ \ \ =\ \ \ 1

El código fuente de los ejemplos anteriores es:

x = a_0 + \frac{1}{\displaystyle a_1  + \frac{1}{\displaystyle a_2  + \frac{1}{\displaystyle a_3 + a_4}}}

x = a_0 + \frac{1}{a_1 + \frac{1}{a_2 + \frac{1}{a_3 + a_4}}} 

z \left( 1 \ +\ \sqrt{\omega_{i+1} + \zeta -\frac{x+1}{\Theta +1} y + 1}  \ \right)  \ \ \ =\ \ \ 1 

Thunderbird: proteger nuestro perfil

Nuestro correo electrónico es, quizá, lo mas importante que tenemos en la red, por muchísimas razones es una buena idea gestionar nuestro correo desde Thunderbird, ¿pero que tan seguro está?

Siempre he revisado mi correo en un equipo mio y no he tenido problemas al respecto, pero en algunos casos existe la posibilidad de que estemos usando un equipo compartido o Thunderbird esta configurado con diferentes perfiles, ¿cómo podemos proteger nuestro correo?

Fácil!, instalando el plugin ProfilePassword, éste plugin no esta disponible desde el repositorio de Thunderbird pero es una maravilla, una vez instalado estará disponible desde el menú Herramientas -> Profile Password y podremos establecer la contraseña de Thunderbird al inicio del programa (no se trata de la contraseña maestra)

Configurar ProfilePassword para Thunderbird

Aunque no es una protección contra todo riesgo, es una piedra mas en el camino de quienes quieren husmear nuestros correos electrónicos sin autorización. Existe la opción de bloquear Thunderbird mientras estamos fuera.

Al iniciar Thunderbird veremos una ventana donde nos pedirá nuestra clave.

Ventana de inicio ThunderbirdEl complemento no depende del sistema operativo, así es que funciona perfectamente con Windows, Mac y Linux.

WordPress: agregar mas tamaños de imágenes

WordPress crea por defecto 3 copias de tamaños diferentes de los archivos de imágenes, estos pueden ser utilizados para mejorar la disposición de un post. Sin embargo esos tamaños no son siempre los que necesitamos.

Redimensionar las imágenes es un trabajo adicional, que puede tomar varios minutos, pero yano, por que existe un plugin que nos permite crear los tamaños que necesitemos, se llama: Additional image sizes (zui).

Una vez instalado tendremos más para elegir:

Si ya tenemos un blog con muchas entradas e imágenes, hay la opción de volver a crear los archivos de las imágenes adicionales.

El pluging se puede instalar fácilmente desde el repositorio, solo búsquenlo con el nombre de zui.