:: vaLar ::

Bitácora personal.

Archivo para la categoría "Programacion"

Análisis personal del navegador web de google chrome

con 2 comentarios

Como se que para estas horas de la mañana, después de que a marchas forzadas, google hiciera posible la descarga de Chrome, su navegador web, pues muchos ya lo habrán probado, muchos habrán publicado sus impresiones profundas o vanales (como la mía) pero quizás existan dos o tres que coincidan conmigo: La primera impresión es favorable, el estilo del software sigue la misma tendencia de todos los desarrollos de google: Sencillo, minimalista, funcional pero, sí: ¡pero! esta lejos de ser un buen sustituto para Firefox.

Hagamos memoria, cuando Firefox liberó sus primeras versiones, (beta) ya era propositivo en la forma de manejar el historial, de limpiar la información personal, de bloquear ventanas emergentes, la navegación por pestañas y la ventana para la gestión de descargas.

Chrome tiene eso y un poco más, pero veamos lo siguiente:


Firefox tiene un pequeño pero útil botón [naranja] para suscribirse a fuentes RSS en su barra de direcciones, a un clic de distancia


Me parece algo tonto que los desarrolladores de google Chrome hayan pasado por alto agregar un botoncito para agregar fuentes RSS. ¿hoy en día quien no usa RSS?

En fin, Chrome es como lo dije al inicio: Sencillo, minimalista y funcional (en ciertos aspectos) pero ¡Es nada lo suficientemente notable que me haga cambiar a mi firefox!

Y no hay excusas del tipo “Es una versión beta, por favor, no compares” ya que Google tiene desarrolladores que hacen su trabajo y cobran por ello, google es una empresa con nivel de capital superior que la fundación mozilla y por ende, debería (en términos lógicos) sacar un producto superior al de la competencia.

Conclusión: Chrome es el boom del momento, como suele pasar con cada producto que presenta google, pero la verdad, es un producto bastante gris.

Escrito por Javier B. Camacho Martínez

3 Septiembre 2008 a 10:16 am

Escrito en Internet, Programacion

Códigos de barras con php

con 9 comentarios

código de barras con PHP Ayer por la tarde fue la revisión final (por la dirección general y por los jefes de coordinaciones) del Servicio Web que programé para el registro de asistencias mediante códigos de barras en los gafetes de identificación.

Si bien, la revisión fue en términos generales buena, nunca falta el disconforme aunque sus argumentos no fueron suficientes para opacar el proyecto debido a que el logro obtenido fue un trabajo de equipo y de las valiosas aportaciones de la dirección (Alfredo) así como el de otros departamentos (Ricardo, René, Rosario, Rachel, Paco) que lograron darle el impulso suficiente para ser contundente y propositivo.

Por último, creo que será buena idea publicar el código php para la generación de códigos de barras como el que está en este post.

En el archivo .zip, va un ejemplo en html de cómo se puede utilizar el código (solo es necesario pasar el codigo EAN12/EAN13 como argumento para generar la imágen); y por otra parte, sólo hay que tocar el archivo de configuración para definir ciertos parámetros:


<?php
// Archivo de configuracion para encode_bars.php & php-barcode.php
// Created by vaLar ( 07-Jun-2008 )
// Tipo de archivo a generar (jpg | jpeg | png | gif)?
define(mode,"jpg");
// Tipo de codificacion (EAN | ISBN)?
define(encoding,"EAN");
// Se requiere una imagen transparente?
define(barcodeTransparent,"false");
// Altura de la imagen en pixeles
define(barcodeHeight,80);
// Se debe mostrar la cadena numerica en el codigo?
define(showNumbersInBarCode,"true");
// Auto-alineacion de las barras con los numeros (No es necesario cambiar aqui)
(showNumbersInBarCode == "true") ? define(alignedBarsBottom,11) : define(alignedBarsBottom,2);
// Color de las barras (R,G,B)
$bar_color = Array(0,0,0);
// Color de fondo del codigo de barras (R,G,B)
$bg_color = Array(255,255,255);
//Color de la cadena numerica (R,G,B)
$text_color= Array(0,0,0);
?>

Escrito por Javier B. Camacho Martínez

2 Julio 2008 a 8:00 am

El verificador

sin comentarios

El siguiente evento organizado por la DGB son las 4as Jornadas Bibliotecarias.

Para este evento, he desarrollado un Servicio Web para el registro de asistencias mediante un código de barras insertado en los gafetes de identificación.

En realidad el concepto es muy sencillo, a los asistentes del evento se les entrega un gafete con su nombre y un código de barras; al inicio de cada actividad, pasan su identificación frente a un lector de códigos de barras y con eso verifican su asistencia.

Lo repito: El concepto fue muy sencillo pero la realización no lo fue tanto, comenzando por la asignación de códigos de barras [CB] a cada asistente; según el estándar EAN12 y EAN13 dice lo siguiente

  1. Los primeros dígitos corresponden al código del país, (para México es: 750)
  2. Los 4 siguientes dígitos corresponden al código de manufactura (interno de la organización)
  3. Los 5 siguientes, corresponden al código del producto
  4. El último dígito es el verificador que se obtiene de la siguiente manera:
    1. El número menos significante del código se considera Impar, el antecesor Par, y se continúa alternadamente. Ejemplo para el código 750951324799 => 7:P 5:I 0:P 9:I 5:P 1:I 3:P 2:I 4:P 7:I 9:P 9:I
    2. Se suman los números marcados como impares => 5+9+1+2+7+9 = 33
    3. Se multiplica el resultado por × 3 => 33 × 3 = 99
    4. Se suman los números marcados como pares => 7+0+5+3+4+9 = 28
    5. Se hace la suma total => 99 + 28 = 127
    6. Se calcula la diferencia a la decena inmediatamente superior => 130 – 127 = 3
    7. El dígito verificador sería => 3
  5. Finalmente, una cadena numérica para generar el un código EAN13 válido sería: 7509513247993

Todo lo anterior, aplica para un código de barras en términos formales, lo que yo he realizado es la construcción de una cadena númerica de longitud 13, siguiendo parte del estándar EAN13 mediante php:


<?php
// Prefijo para el codigo de barras (México: 750 : EAN12)
$prefixBarCode = "750";
// Longitud del hash para el código de barras
$hashLenght = 9;
// Array con los elementos que se emplean para crear un HASH ALEATORIO
$tokensArray = array("0","1","2","3","4","5","6","7","8","9");
// Función para generar una cadena pseudo-aleatoria con semilla de tiempo
function createhash($tokens,$length){
 $hashcode = "";
 for($c = 0; $c < $length; $c++){
  srand((double)microtime() * 100000000000);
  $pass = $tokens[rand(0,count($tokens) - 1)];
  $hashcode = $hashcode.$pass;
 }
 return $hashcode;
}
function getVerifyNumber($code){
 // Separa los 12 dígitos en elementos de un arreglo
 $arrayBarCode = str_split($code);
 // Invertir el arreglo (El ultimo elemento ahora es el primero)
  $arrayBarCodeReverse = array_reverse($arrayBarCode);
 // Consecutivamente, el primer elemento del arreglo es ”impar”, el segundo ”par”
 for ($i=0; $i<(count($arrayBarCodeReverse) / 2); $i++){
  // Sumar los elementos ”impares”
  // [0*2],[1*2],[2*2]…[i*2] => [0],[2],[4]…[i*2]
  $addOdd += $arrayBarCodeReverse[$i*2];
  // Sumar los elementos ”pares”
  // [(0*2)+1],[(1*2)+1],[(2*2)+1]…[(i*2)+1] => [1],[3],[5]…[]
  $addEven += $arrayBarCodeReverse[($i*2)+1];
 }
 // Suma total
 $addTotal = ($addOdd * 3) + $addEven;
 // Regresa el dígito que complementa la decena mas cercana en la suma total
 return(substr(10 - substr($addTotal,-1,1),-1,1));
}

// Crear los 12 dígitos aleatorios para el código de barras
$barCode = $prefixBarCode . createhash($tokensArray,$hashLenght);
// Crear el dígito verificador del código de barras
$verifyNumber = getVerifyNumber($barCode);
// El codigo EAN13
$ean13barCode = $barCode . $verifyNumber;
echo $ean13barCode;
?>

Y al final, todo eso simplemente para obtener 13 dígitos; jajajaja que rollo.

Lo siguiente a realizar fue, tomando como argumento una cadena de 13 dígitos, crear el código de barras; en el siguiente sitio web se muestran las especificaciones del estándar EAN13 para crear las barras y espacios correlacionados a la serie numérica.

Al final de todo el proyecto, he podido notar como de un concepto tan sencillo (sencillo no es lo mismo que simple) se desencadenan una serie de conceptos más profundos. Por este tipo de cosas… ¡me gusta mi trabajo!

Por último: el próximo 3 y 4 de Julio se utilizará mi servicio Web dentro del marco de las 4as Jornadas Bibliotecarias con poco más de 230 usuarios… esto me emociona.

Escrito por Javier B. Camacho Martínez

1 Julio 2008 a 1:20 pm

Día difícil

con un comentario

Martes, 10:34 pm, llego a casa, Miércoles, 3:45am, me voy a dormir, 7:30am, despierto, me baño y me visto algo casual, salgo de casa, me subo a la moto, inicio el recorrido, a medio trayecto la moto comienza a ponerse extrañamente lenta y a “brincar”, me orillo, el neumático trasero se ha quedado sin aire, ¿sigo o me regreso?, estoy a la mitad y ningún talachero cerca, decido, camino hasta el trabajo, del cielo caen gotas de lluvia, llego empapado al trabajo, comienzo a trabajar, me duelen los pies por la humedad, junta breve en mi departamento laboral, me cambian la estrategia del proyecto, nuevos requerimientos, ya pensaré, el estomago vacío no ayuda, me voy a desayunar, voy a comprar el plástico para parchear la cámara del neumático, a medio trayecto me encuentro a una persona especial que no puedo saludar bien porque va acompañada (grrrr siento celos), regreso a la oficina, desmonto el neumático del rin, parcheo la cámara, intento montar el neumático: diablos… ya no es tan sencillo, los desarmadores no ayudan tanto, no es igual de fácil que con una bicicleta. Dejo todo, me voy al escritorio, Rachel me muestra una variación en los códigos de barras generados con php, compilo nuevamente php 5.2.6 e incluyo las banderas que faltan, instalo php, reinicio apache, todo bien, trabajo en el proyecto, me mandan a traer a la oficina del director, junta de asignación de labores, evento en puerta para el 19 y 20 de Junio, más responsabilidades, equipos de trabajo, es interesante, fin de la reunión, regreso a la oficina, no puedo más, salgo a comer, la comida es buena, regreso a la oficina, trabajo en el proyecto, un par de usuarios que no recuerdan su clave me interrumpen, asignación de nuevas claves, corrijo un aspecto en el desarrollo del proyecto actual, trabajo más, leo un par de correos, no respondo por falta de tiempo y ganas, es la hora de salida, viaje en microbús (después de casi un año de ya no pisar uno), olores desagradables, llego a casa, agarro el juego de llaves y los dados, regreso a la oficina, desmonto la llanta trasera, guardo las piezas en la oficina, esto apesta a grasa y mis manos están negras totalmente, pregunto si habrá un talachero cerca, me dicen que a 7 calles está el más cercano, no quiero pagar un taxi, camino, el rin pesa más de lo imaginado, el rin pesa más, cambio de mano izquierda a la derecha el peso del rin, rin mucho más pesado, al fin, encuentro al talachero, desarma el neumático en dos minutos, le quita el parche que le puse, le pone uno nuevo y mejor que ni se nota, monta el neumático en el rin en tres minutos, infla con aire la cámara, calibra la presión, listo, 40 pesos menos de mi bolsillo, camino 7 calles de regreso, el rin pesa toneladas, dentro a la oficina, saco el juego de llaves, los dados y las piezas, coloco la llanta en su lugar, ajusto, atornillo, aprieto, ajusto, atornillo, aprieto, listo, just in time, comienza a llover, regreso a la oficina, mi compañero de equipo me llama al teléfono, ya me está esperando en la biblioteca de contaduría según lo acordado, le digo que llueve y que no puedo ir, noto la seriedad en su voz, quedamos de trabajar por Internet, en otra llamada escucho la frase “me dio mucho gusto verte”, respondo “a mi también, pero no pude saludarte, ibas acompañada”, me dice que le llame a su casa mas tarde, le digo que no tengo su número, lo borré hace tiempo, se molesta, se despide, recibo un mensaje, lo que faltaba: se molestó conmigo por decirle la verdad: borré tu número, afuera llueve torrencialmente, son las 8:12, 8:30, 9:05, 9:15pm, no importa que llueva, me voy; antes de ir a casa, paso a una tienda, compro dos chocolates tin-larin, no hay nada que un chocolate no resuelva, llego a su casa, me ve, se sorprende mucho, le regalo un chocolate tin-larin, se sorprende el doble, se pone contenta, me explica porque la molestia por los numeros eliminados, reímos, charlamos, me presta discos de buena música, yo le regalo mp3’s de jazz, mi compañero de equipo me llama, ya está conectado, ya voy, ya voy, dame cinco minutos, nos despedimos, me voy en moto a 80km/hra. llego a casa mojado pero de muy buen humor, enciendo la computadora, no hay señal de Internet inalámbrica, joder, me conecto vía telefónica (es lo malo de colgarse de señales Wi-Fi ajenas), afinamos y complementamos la presentación para la exposición de la escuela neohumano relacionalista, para la materia de Administración, debemos terminar porque nos presentamos el Jueves 12, miro el reloj, ya es Jueves, son las 12:40am, escribo esto. Es hora de dormir.

Escrito por Javier B. Camacho Martínez

11 Junio 2008 a 11:41 pm

Tema para GDM de Gnome

sin comentarios

Antes de hoy, ya había hecho la personalización de GDM (Gnome Desktop Manager [Gestor de entrada de GNOME]) instalando temas que había bajado de Internet. Pero a veces, es bueno proponer algo y no solo utilizar lo ya existente, así que me he pasado las horas haciendo un tema para GDM aunque el tema en su totalidad es la suma de varias fuentes de inspiración.

Está diseñado en tonos fríos, cyan y magenta; para el fondo me he inspirado en el wallpaper ‘Crunchy Branch’.

El pequeño Tux sentado, es un trabajo artístico en 3D por Nicolas Rougier, que amablemente ha proporcionado a la comunidad Linux; en el sitio de gnu.org aparecen ésta versión del bebé Tux sentado, incluyendo otras más; todas ellas se pueden utilizar libremente gracias a su licencia GNU.

Si alguien desea bajar este tema azul para GDM puede hacerlo desde la siguiente página: http://gnome-look.org/content/show.php?content=81177

Nota técnica: para sacar la captura de pantalla de GDM utilicé los siguientes comandos:
1) Para probar el tema en una ventana, como si se tratase de una aplicación más dentro de mi sesión de trabajo ejecuté en una consola el siguiente comando: gdmflexiserver --xnest

2) Para sacar la captura de pantalla se puede usar ksnapshot, gimp o cualquier otra aplicación o si están chapados a la antigua como yo, pues nada como hacerlo igual que en los viejos tiempos, a través de una consola con el comando: import --window screenshot.png y dando doble clic sobre la ventana que se desea capturar.

Para instalar el tema azul abstracto lo primero es descargarlo desde Internet y luego abrir la configuración del Gestor de Entrada de Gnome; una manera rápida es ejecutando en la consola: gdmsetup

Una vez abierta la aplicación para cambiar las “Preferencias de la ventana de entrada” en la pestaña “Local” se da clic al botón “Añadir”; se elige el tema (previamente descargado) que está dentro de un archivo .tar.gz; se activa la casilla para utilizar el tema y eso es todo, como se muestra en la imagen siguiente:

Por último, creo que el tema para GDM se puede complementar con el wallpaper azul abstracto, el cual puede ser descargado gratuitamente.

Es todo por hoy… ¿comentarios?.

Escrito por Javier B. Camacho Martínez

16 Mayo 2008 a 4:00 pm

SSH DenyHosts

sin comentarios

En Febrero de este año, después de leer una publicación de José Luis (h4773r) en su blog, me decidí a instalar ssh DenyHost siguiendo las instrucciónes del INSTALL tanto del software como del post de h4773r dedicado a ssh DenyHosts

En menos de dos meses, en el servidor ya se han agregado 50 hosts a la lista negra, denegando la conexión y la posibilidad de automatizar un ataque a menos que cambien su ip continuamente, cosa que requiere de mayores habilidades aunque no deja de ser posible.

Gracias al análisis del log o registro de errores, he logrado sacar las siguientes estadísticas

  • Numero total de intentos fallidos: 1579
  • Nombres de usuario empleados antes de instalar denyHost:
  1. identd (202)
  2. clamav (202)
  3. proftpd (128 )
  4. server (105)
  5. vsftp (66)
  6. guest (39)
  7. shoutcast (35)
  8. icecast (35)
  9. download (35)
  10. gameserver (35)
  11. customer (35)
  12. demo (35)
  13. doctor (35)
  14. gast (35)
  15. access (35)
  16. sslwrap (35)
  17. office (35)
  18. vmail (35)
  19. sendmail (35)
  20. webalizer (35)
  21. bind (35)
  22. etsrv2 (35)
  23. php (35)
  24. java (35)
  25. etsrv (35)
  26. ircserver (35)
  27. mythtv (35)
  28. prueba (35)
  29. cpanel (25)
  30. admin (7)
  31. lab1 (7)
  32. lab2 (7)
  33. lab3 (7)
  • Nombres de usuario empleados después de instalar denyHost:
  1. patrick (1)
  2. info (1)
  3. samba (1)
  4. info (1)
  5. shell (1)
  6. linux (1)
  7. unix (1)
  8. yasumoto (1)
  9. takahiro (1)
  10. tane (1)
  11. daemon (1)
  12. webmaster (1)
  13. fluffy (1)
  14. webadmin (1)

Con la configuración apropiada, DennyHost bloquea al primer intento fallido el host desde el cual se pretende hacer una conexión empleando un nombre de usuario inexistente en mi sistema, o al quinto intento fallido de un usuario registrado.

Creo que todo administrador de sistemas, debe considerar muy seriamente protegerse ante ataques porque nunca faltan los listillos que quieren probar suerte y en uno de esos intentos, puede lograrlo si es que existe una política muy frágil en cuestiones de seguridad…

Para protegerse de ataques por ssh, solo hay que bajar DenyHosts desde la página oficial y leer el archivo INSTALL o en su defecto, la guía de h4773r para instalar DenyHosts que explica a grandes rasgos como configurar este magnífico script.

Escrito por Javier B. Camacho Martínez

24 Abril 2008 a 9:15 am

Error: Assertion `c->xlib.lock’ failed con CmapTools

sin comentarios

splash-cmapstoolsvExiste una herramienta creada con Java [nunca llegaré a escribir que Java es el mejor lenguaje de programación pero si he de reconocer que hay muy buenos desarrollos en ese lenguaje].

Esta herramienta la describo como genial y útil. Sirve para crear mapas conceptuales mediante cajas y conectores; me agrada mucho por la flexibilidad y sencillez con la que permite definir aspectos conceptuales.

El programa se llama CmapTools y desde la página oficial puede descargarse gratuitamente, hay versiones para Linux, Mac y Windows.

Lo que me ha ocurrido precisamente hoy, es que al bajar la versión 4.1.6 de CmapTools para Linux y tratar de instalar la aplicación, no logré hacerlo porque mostraba el siguiente mensaje de error:

java: xcb_xlib.c:52: xcb_xlib_unlock: Assertion `c->xlib.lock' failed.

La solución para el problema que provoca Java es una propuesta de S. Correia mediante un script de bash y es la siguiente:
#!/bin/sh
# S. Correia
# 2007 11 21
# A simple script to patch the java library in order
# to solve the problem with "Assertion 'c->xlib.lock' failed."
# see bug at:
# http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6532373
LIB_TO_PATCH=libmawt.so
for f in `find /usr/lib/jvm -name
"$LIB_TO_PATCH"`
do
echo
"Patching library $f"
sudo sed -i 's/XINERAMA/FAKEEXTN/g' "$f"
done

Solo hay que poner el código dentro de un archivo con extensión .sh (de preferencia, aunque puede ser sin extensión ya que es indistinto) en mi caso fue: parche.sh

Luego, desde una consola se otorgan permisos de ejecución al script:
chmod 755 parche.sh

Se ejecuta el script:
./parche.sh

Después de aplicar el parche, es necesario exportar una variable de entorno y su valor puesto en verdadero:
export LIBXCB_ALLOW_SLOPPY_LOCK=1

Con eso ha sido suficiente para resolver el problema; una vez hecho eso, es posible instalar CmapTools en Linux y por ende: utilizarlo para generar mapas conceptuales (como este a cerca de la investigación científica):

cmaptools-on-linux

Escrito por Javier B. Camacho Martínez

10 Abril 2008 a 12:00 am