HardBit
Inno Setup Unicode con ISSkin
Noviembre 25th, 2009
Los que usan Inno Setup, sabran que hay una actualización de Inno Setup 5.3.6 y tambien que existe una version Unicode de este generador de instaladores, para ponerle skins (pieles!!) a nuestro instalador pueden hacer uso de una extension gratuita que ofrece CodeJock llamada ISSkin, bien el punto de este post es que la version que ofrece en el sitio solo funciona con la version ANSI y no la Unicode de Inno Setup, asi que les dejo la DLL para que funcione en Unicode ISSkin Unicode
Es todo.
» Leer más, comentarios, etc...
Fetishcode...Thinking in objects
Revisión de la demo de ADF 11g, FOD.
Noviembre 25th, 2009
A
» Leer más, comentarios, etc...
xailer.info (esp)
Los asistentes de Xailer 2
Noviembre 24th, 2009
Estimados usuarios de Xailer,
La versión definitiva de Xailer 2 incorpora un gestor de asistentes que facilita enormemente la creación de formularios rutinarios y/o repetitivos. Un ejemplo típico de un formulario de este tipo sería aquel que creamos cada vez que queremos realizar la edición de todos los campos de una tabla en cualquier tipo de mantenimiento.
Primero vamos a ver lo fácil que resulta utilizar cualquier asistente, para luego adentrarnos en la modificación o creación de nuestros propios asistentes, que es igualmente fácil.
Para acceder a la opción de Asistentes utilizaremos la opción de menú Componentes->Asistentes y se nos mostrará el siguiente diálogo:

Observe que todos los asistentes están incluidos de alguna forma dentro de una DLL. Dicha DLL ha sido creada por el propio Xailer, y de hecho podrá incluso analizar su código fuente en el directorio \samples\Wizards. Por supuesto también podrá modificarla y reconstruirla para que los asistentes se adapten a su forma de trabajo.
Las DLL de los asistentes deben de estar ubicadas necesariamente en los directorio \Xailer\Template o \Xailer\User.
Una vez seleccionado un asistente en concreto entra en funcionamiento el código interno del mismo que o bien puede directamente realizar el trabajo requerido o es posible que le muestre algún diálogo para pedirle algún dato adicional.
Si selecciona el asistente DBF table assistant que permite crear un formulario de mantenimiento de tablas DBF, se le mostrará el siguiente diálogo:
/>
Simplemente indique como quiere que se comporte el asistente para cada tipo de datos que pueda tener el fichero DBF y pulse el botón Run y podrá observar como de forma instantánea el formulario es creado por usted
La creación o modificación de asistentes es igualmente sencilla, y si le echa un vistazo al ejemplo \samples\wizards\Basic se dará cuenta inmediatamente de ello. Básicamente todo el trabajo consiste en crear una clase descendente de TWizard que tan sólo necesita sobrecargar el método Run(). Eso es todo.
Lo más sencillo es ver un pequeño ejemplo:
-
CLASS TWzdSample FROM TWizard
-
-
METHOD Run()
-
-
END CLASS
-
-
METHOD Run() CLASS TWzdSample
-
-
LOCAL oForm
-
LOCAL oObj
-
-
oForm := ::AddForm()
-
-
oForm:SetBounds( 246, 223, 307, 137 )
-
oForm:SetClientSize( 299, 103 )
-
-
WITH OBJECT oObj := TLabel():New( oForm )
-
:SetBounds( 12, 12, 26, 14 )
-
:cText := "User:"
-
END
-
-
::AddComponent( oObj, oForm )
-
-
RETURN Nil
Este pequeño ejemplo lo único que hace es crear un nuevo formulario en el IDE y añadir un objeto TLabel. Observe las llamadas a AddForm() y AddComponent() que son métodos de la propia clase TWizard.
Para que el IDE sea capaz de reonocer ese código dentro de la DLL es necesario indicarle su existencia en un INIT PROCEDURE dentro de la propia DLL y utilizando la función RegisterWizard. Como suele ocurrir, un ejemplo es lo más descriptivo para entenderlo:
-
INIT PROCEDURE WzdInit()
-
-
RegisterWizard( "A sample",;
-
{|| TWzdSample():New() },;
-
"comments",;
-
cBitmap )
-
-
RETURN
A continuación os dejo el prototipado de la clase TWizard cuya documentación se encontrará en la ayuda del propio IDE para que veáis todos los miembros de dicha clase cuyo uso es prácticamente auto explicativo.
-
CLASS TWizard FROM TComponent
-
-
PROPERTY aForms
-
PROPERTY oActiveForm
-
-
METHOD SetActiveModule( cModule ) // –> Nil
-
METHOD AddForm( lShow ) // –> oForm
-
METHOD AddModule( cType ) // –> cModule
-
METHOD AddComponent( oObject, oParent ) // –> lSuccess
-
METHOD AddCode( cCode ) // –> lSuccess
-
METHOD AddMethod( cMethod, cParams, cBody, cReturn ) // –> lSuccess
-
METHOD AddFunction( cMethod, cParams, cBody, cReturn, lStatic ) // –> lSuccess
-
METHOD AddProcedure( cMethod, cParams, cBody, lStatic ) // –> lSuccess
-
METHOD AddProperty( cName, cClauses ) // –> lSuccess
-
METHOD AddEvent( cName, cParams ) // –> lSuccess
-
-
METHOD TabWidth() // –> nTabWidth
-
METHOD ProjectDir() // –> cDir
-
-
METHOD Run() VIRTUAL
-
-
ENDCLASS
Un cordial saludo,
[El equipo de Xailer]
» Leer más, comentarios, etc...
Cerebro en la Sombra » Técnico
HTPC (Home Theater PC)
Noviembre 24th, 2009
Si hace unas semanas os hablaba del DVD grabador de mis padres, hoy voy a enseñaros uno de mis juguetes, la evolución natural de esos cacharros, el HTPC.
Los HTPC son ordenadores cuya principal función es servir de plataforma de ocio y entretenimiento: televisión, dvd, reproductor de vídeos, música, fotos… todo lo hace él solito y con una gran ventaja: en cualquier momento puedes actualizar las partes de hardware que se hayan quedado obsoletas y tener tu aparato actualizado permanentemente.
El mío tiene ahora dos años y medio y en líneas generales es esto:
- Caja Thermaltake Mozart SX
- 2Gb de memoria RAM
- Micro AMD 64 X2 Dual Core 3600+ y placa base Gigabyte (no recuerdo el modelo)
- Disco duro 200gb IDE (sistema) y 500gb Serial Ata (librería multimedia) y grabadora de DVD
- Sintonizadora dual TDT Lifeview LV32T
- Tarjeta gráfica Pointofview Geforce 8400GS PCIE 512MB
- Windows 7
- DVBLink for IPTV para integrar los canales de Imagenio en Windows Media Center
El aparato se complementa con un receptor A/V Denon AVR-2802, 7 cajas acústicas (JBL e Infinity), un subwoofer Yamaha, un televisor LCD Samsung de 32” y un mando a distancia Logitech Harmony 555.
La caja
Es el punto más crítico e importante de un aparato de este tipo ya que normalmente querremos colocarlo en el salón de casa y no nos gustaría que desentonase, que se viese la típica caja de ordenador. Desde el principio tenía claro que buscaba una caja que no fuese excesivamente grande, a ser posible del tamaño de un DVD o similar. La mayoría de modelos son, en cuanto a tamaño, como una minitorre de ordenador tradicional en horizontal, muy altos, cosa que no me convencía. Buscando encontré la que terminé comprando, Thermaltake Mozart SX, buen precio, mando a distancia, buena disipación, dos ventiladores incorporados… me pareció perfecta y que era lo que yo buscaba, sin embargo no es oro todo lo que reluce.
Seguramente el sitio más completo donde puedes buscar componentes de este tipo es Sistemas Ibertrónica.
Los componentes
Cuando comencé a montar el aparato me di cuenta de que la escasa altura de la caja penalizaba las opciones de ampliación del aparato con tarjetas PCI ya que no se pueden poner tal cual, son más grandes que la caja. Para solucionarlo viene de serie con un adaptador que expande la ranura PCIe y dos PCI de la placa en horizontal tal y como podéis ver en la imagen de abajo. En general debiera ser más que suficiente, pero no tiene por qué ser así. Otro detalle importante a tener en cuenta es que la placa hay que escogerla cuidadosamente ya que, para poder utilizar el adaptador que os he comentado, la ranura PCIe tiene que estar situada en la posición exacta donde se sitúa el adaptador, de otro modo no podremos pincharla.
En mi caso tengo pinchadas la tarjeta gráfica y la sintonizadora de TV como podéis ver. En la ranura de abajo de todo tengo el adaptador de la placa para sacar la salida de audio digital y no puedo poner nada más que eso, la ranura PCI en sí queda totalmente inutilizada ya que la tarjeta gráfica es más “gorda” de lo habitual y se come el espacio disponible. En mi caso no he tenido problemas, todo lo que necesitaba está ahí, pero si necesitas algo más no tendrás donde ponerlo. De hecho una de las razones de poner la sintonizadora dual fue precisamente la imposibilidad de poner dos sencillas.
La gráfica se conecta al televisor a través de un cable DVI-HDMI con lo que la visualización es increíblemente perfecta. Hasta hace un par de meses tenía otra gráfica, pero se estropeó
, en realidad la estropeé yo. Traía uno de esos pequeños ventiladores que traen las gráficas y al poco tiempo comenzó a hacer un ruido muy molesto, con lo que decidí desconectarlo y que aguantase con el disipador lo que pudiese. Al final fueron más de dos años, no está mal. Para la nueva tenía claro que la quería silenciosa, sin ventilador, pensáoslo bien antes de comprar una con ventilador, los de estas tarjetas suelen ser de muy baja calidad.
Aquí os muestro una panorámica del equipo montado, queda todo muy limpio y accesible, la verdad. Una de las ventajas que tiene es que la fuente de alimentación es de tamaño normal, no tienes que preocuparte si se estropea. En aparatos tipo barebone tienes un grave problema si se estropea la fuente, y tarde o temprano se estropeará. El disco IDE que tengo es porque ya lo tenía
, tengo ganas de quitar el cable IDE amarillo que se ve y que abulta muchísimo y sustituirlo por los sencillos Serial ATA, pero mientras funcione tampoco lo vamos a jubilar
.
He pensado más de una vez en ponerle un lector Blu Ray y aprovechar la calidad de imagen que ofrece, pero después pienso, ¿para qué si no alquilo una película desde 2001?.
El software
Hasta hace un par de semanas estaba con Windows XP Media Center Edition 2005, pero lo actualicé a Windows7 viendo las buenas referencias y creedme, es un lujazo verlo funcionar ahora, el buen rendimiento que tiene se une a las prestaciones del nuevo Media Center dando como resultado una plataforma de ocio multimedia que roza la perfección, aunque siempre hay cosas que te gustaría cambiar
. En su día probé otros programas media center, el mejor y más completo es, sin duda, Media Portal, también probé soluciones bajo Linux, MythTV y Freevo, pero no acabaron de convencerme, quizás les de otra oportunidad un día de estos.
Hace mucho tiempo que quiero integrar Imagenio en el Media Center y tenerlo todo centralizado, pero no había manera de hacerlo hasta que apareció DVBLink for IPTV, un pequeño pero gran software que crea sintonizadoras virtuales para importar en Media Center los canales de televisión IP de forma que quedan integrados como cualquier otro canal de TV, pudiendo programar las grabaciones o verlos con un sólo click en el mando. DVBLink for IPTV cuesta unos 20 euros, un precio más que asequible para las ventajas que aporta, al menos yo lo veo así.
La prueba de fuego que le hice es grabar tres programas simultáneamente (uno en cada sintonizador TDT y otro desde Imagenio) y, mientras tanto, reproducir una película. Todo perfecto, no se puede pedir más.
El mando a distancia
Posiblemente el elemento más importante y el que más desapercibido pasa de todo el sistema si no quieres tener varios mandos a la vez entre tus manos.
Hasta hace un par de meses tenía un One-for-All Kamaleon que compré allá por 2002, pero también se estropeó
, así que me decidí por un Logitech Harmony 555, muy buena relación calidad-precio y, sobre todo, con soporte directamente para el mando de las cajas Thermaltake.
La verdad es que la curva de aprendizaje del mando y el tiempo de puesta en marcha completa son muy elevados, una vez tienes claro como funciona llega el momento de ir ajustando cada botón para que haga lo que tu quieres. Aunque tiene el clásico modo de funcionamiento de todos los mandos basado en dispositivos, es decir, funcionar como cada mando por separado, el funcionamiento principal se basa en actividades, lo que despista mucho al principio. Por ejemplo:
- Actividad Ver TV: Encender la TV, ponerla en modo TDT, mantener el resto de aparatos apagados.
- Actividad Media Center: Encenter la TV, ponerla en modo HDMI, encender el receptor A/V, ponerlo en modo DVD, encender el Media Center.
De esta manera con un sólo botón preparas el ambiente que vas a utilizar. El modo de actividades permite, además, combinar en el teclado del mando funciones de distintos aparatos, por ejemplo, que el volumen maneje el receptor A/V, otro botón el cambio de fuente en la TV, los de play/stop el Media Center, etc. En el modo dispositivo, cada mando simula ser el mando original completo sin posibilidad de intercalar funciones de otros mandos.
Conclusiones
Como casi todo en la vida, tiene sus pros y sus contras.
A favor, sin duda, la versatilidad, la sencillez de manejo y la centralización de todo tu ocio multimedia en un sólo aparato…
En contra… quieras o no, es un ordenador con todos los inconvenientes que conlleva también eso para la gente no técnica. Si estás cansado de que familiares y amigos te llamen cada vez que tienen un problema con su ordenador, ni se te ocurra recomendarles que se pongan un cacharro de estos. Son muy apetecibles para todo el mundo pero dado que son tan abiertos a poder hacer casi de todo, la cantidad de problemas que pueden surgir son muy elevados. Sólo aptos para usuarios muy avanzados.
En cuando al hardware, lo más importante en este tipo de aparatos es la caja, yo he contado mi experiencia. Quizás hoy me hubiese comprado una más normal en cuanto a tamaño de manera que pudiese utilizar las tarjetas PCI en su forma habitual, no lo sé, pero aún así estoy muy contento con la que tengo, es amplia y está muy bien refrigerada. Con este tipo de cajas hay que tener mucho ojo con la placa que compras, no sirve cualquiera ya que hay que hacer coincidir la ranura PCIe con el hueco adecuado para el adaptador horizontal. De igual modo cuando veas cajas mira una que venga con el display y el mando incorporados, comprarlos después te saldrá más caro y posiblemente no se integren a la perfección.
Para los demás componentes no creo que haya que irse a componentes de última generación, ya veis mi equipo, normalito y se mueve a la perfección.
Finalmente gástate algo de dinero en un buen mando universal que te permita tener todo unificado en un solo aparato, a la larga lo agradecerás, no tengo más que decir, creo que no haya que pensar mucho para darse cuenta de las ventajas
.
» Leer más, comentarios, etc...
Fetishcode...Thinking in objects
JSF y su valor añadido
Noviembre 24th, 2009
A
» Leer más, comentarios, etc...
Buayacorp
Archivos de WordPress útiles y efectivos
Noviembre 24th, 2009
Cómo crear una página de archivos de WordPress útil y efectiva.
» Leer más, comentarios, etc...
4 bits blog
Cómo proteger las contraseñas de los usuarios
Noviembre 22nd, 2009
Voy a recuperar otro de mis documentos perdidos en Google Docs (el anterior fue el de las autotools), esta vez se trata de un pequeño manual sobre cómo proteger las contraseñas de lo usuarios de cualquier aplicación que se programe, el manual es una traducción al español del artículo How to encrypt user passwords de Daniel Fernandez.
1. Visión general
Casi todas las aplicaciones web modernas necesitan, de un modo u otro, cifrar las contraseñas de sus usuarios. Se podría decir que, desde el momento en que la aplicación tiene usuarios, y los usuarios se identifican usando una contraseña, esas contraseñas se deben guardar usando algún tipo de cifrado.
Hay muchas razones básicas para esto: las bases de datos pueden estar comprometidas, y por tanto también las comunicaciones. Pero la razón más importante es que se tiene que pensar que las contraseñas de los usuarios son datos personales. Sus contraseñas son sus claves para su privacidad, por tanto son personales, y nadie tiene el derecho de conocerlas. Y se debe cumplir esto si se quiere ganar la confianza de los usuarios.
2. El algoritmo
Ahora que se quieren cifrar las contraseñas, se debe saber cómo. Aquí entra la primera regla:
I. Cifrar las contraseñas usando técnicas de un sentido, es decir, funciones resumen (o hash).
Esto se debe a que, excepto para algunos escenarios específicos, no hay ninguna razón para que una contraseña sea descifrada. Si se cifran las contraseñas usando cifrados basados en claves (una técnica de dos sentidos) y un atacante consigue saber la clave de cifrado, se revelarán todas las contraseñas. Si no se tiene una clave para el cifrado, el riesgo desaparece, y el atacante tendrá que confiar en el uso de técnicas de fuerza bruta o similares.
Pero, ¿qué ocurre si un usuario pierde su contraseña? ¿No podrá recuperarla? La respuesta es NO. No sólo no se puede recuperar, si no que ni siquiera existe una manera de leer/conocer/ver las contraseñas de los usuarios, no importa si se es el administrador del sistema. Si un usuario pierde su contraseña, sólo se podrá reiniciarla a un nuevo valor y enviárselo por algún canal seguro al usuario, y pidiéndole que la cambie lo más pronto que pueda.
Ahora que está claro que las funciones resumen son necesarias en las contraseñas, ¿cuál algoritmo se debería usar? Hay bastantes, y dependen de las necesidades de cada uno. Los más usados son:
- Algoritmo MD5.
- Familia SHA: SHA-1 y la variantes de SHA-2 (SHA-224, SHA-256, SHA-384 y SHA-512)
En la mayoría de los casos, MD5 o SHA-1 serán elecciones adecuadas para los resúmenes de contraseñas, aunque aplicar estos algoritmos no será suficiente, como se verá a continuación.
Cuando se dice que se deberían usar funciones resumen para los cifrados de las contraseñas, y dado que estas funciones resumen son técnicas de un sentido, la siguiente pregunta es: «Si no se pueden descifrar las contraseñas, ¿cómo se comprueba que un usuario tiene una contraseña correcta?»
Hay una respuesta muy simple a esta cuestión, que será la segunda regla:
II. La entrada y las contraseñas guardadas se comparan usando los resultados de las funciones resumen, no usando cadenas sin cifrar.
Lo que significa que, una vez los usuarios han introducido sus contraseñas en la identificación, se realizará la función resumen sobre la contraseña introducida con el mismo algoritmo que se ha usado con las contraseñas guardadas, y se compararán ambos resultados. Como estas funciones garantizan que dos entradas iguales obtienen el mismo resultado (lo que no es cierto en el sentido contrario), si los resultados coinciden se considerará que la contraseña introducida por el usuario es correcta.
3. Mejorando la seguridad de los resúmenes
Todos los algoritmos de funciones resumen mencionados anteriormente comparten una característica: son públicos. Son algoritmos muy conocidos y ampliamente implementados, por lo que cualquiera puede usarlos.
Si cualquiera puede usar el mismo algoritmo que la aplicación, y por alguna razón los atacantes pueden ver la base de datos de los resúmenes de las contraseñas, ¿cómo se puede estar seguro que los atacantes no serán capaces de conseguir alguna contraseña de los usuarios probando todas las posibilidades hasta que encuentren algún resumen que coincida con uno de los guardados?
La respuesta es que no se puede. Pero se puede hacer que todo eso sea una tarea enorme y con un gran tiempo de realización, de modo que no resulte útil, a menos que puedan esperar toda la eternidad. Para lograr esto, se van a explicar dos conceptos: «salt» y el contador de iteración.
3.1. «Salt»
«Salt» es una secuencia de bytes que se añaden a la contraseña antes de conseguir su resumen. Esto hace que estos resúmenes sean diferentes a los que deberían ser usando sólo la contraseña, y como resultado se consigue protección contra los ataques de diccionario. Se pueden seguir dos estrategias para usar «salt»:
- Usar un «salt» fijo, una secuencia de bytes que se utilizarán para resumir cualquier contraseña. Se puede guardar oculto el «salt» y considerarlo un valor añadido de seguridad, pero esto puede hacer que el sistema se vuelva más vulnerable a ataques de cumpleaños y, en general, a ataques dirigidos contra la base de datos de contraseñas.
- Usar un «salt» variable, que normalmente es una opción segura (especialmente si es aleatorio). Este se genera independientemente para cada contraseña a resumir, y permite que cada contraseña guardada esté desacoplada de las demás, creando una gran protección general y un alta seguridad contra ataques dirigidos contra la base de datos de contraseñas.
En la práctica, un «salt» aleatorio (o variable) es la mejor idea porque, aunque al generarse aleatoriamente tendrá que guardarse junto al resumen de la contraseña (por lo que cualquiera podrá recuperarlo) y esto hará que sea trivial para un atacante conocerlo, permitirá que cada contraseña de usuario sea independiente del resto, por lo que tendrán que atacarse una por una.
Se tiene que pensar que, si se usa un «salt» fijo y el atacante consigue saberlo, la seguridad de toda la base de datos de contraseñas será nula. Y hay muchos métodos para que el atacante pueda conocer este «salt», como aplicar fuerza bruta en sus contraseñas o en contraseñas que tenga de algún usuario válido. En un escenario de un «salt» fijo, una contraseña débil podría hacer que el sistema de contraseñas fuera débil.
Sin embargo, si se quiere mantener una parte del «salt» en secreto, se puede usar una técnica que mezcle las otras dos, usando un «salt» compuesto de una parte fija y otra aleatoria, guardando los bytes aleatorios junto al resumen de la contraseña.
El tamaño mínimo de un «salt» es de 8 bytes. Si se usa una opción mixta, al menos 8 bytes deberían ser aleatorios.
Así, se puede definir la tercera regla:
III. Se debe usar un «salt» que contenga al menos 8 bytes aleatorios, y añadir esos bytes junto al resumen de la contraseña.
3.2. El contador de iteración
El contador de iteración es el número de veces que la función hash que realiza el resumen se aplica a sus propios resultados.
Esto significa que, una vez se ha seleccionado un «salt» y concatenado con la contraseña, se deberá aplicar la función hash (por ejemplo, MD5), conseguir el resultado, y pasarlo de nuevo como entrada a la misma función, y hacer lo mismo las veces que indique el contador de iteración.
El número mínimo recomendado de iteraciones es 1.000, y esto proporcionará una buena seguridad extra. Hay que pensar que, cuando se crea un único resumen de una contraseña para un nuevo usuario, la diferencia entre aplicar la función hash una vez o 1.000 veces no será un problema, tal vez doscientos milisegundos, pero los atacantes deberán tener que generar una enorme cantidad de intentos de resumen mediante fuerza bruta y, para un atacante, la diferencia entre aplicar la función hash una vez y aplicarla mil veces para cada intento será un gran problema computacional.
Así, se obtiene la cuarta regla:
IV. Iterar la función hash al menos 1.000 veces.
4. Secuencia de traducción de caracteres a secuencia de bytes
Antes de poder guardar correctamente los resúmenes de las contraseñas, hay algo que se debería tener en cuenta, que es la diferencia entre cadenas de caracteres y secuencias de bytes: dos cadenas de caracteres se pueden representar con diferentes secuencias de bytes dependiendo de la codificación empleada (ISO-8859-1, UTF-8, …)
Esto afecta, ya que las contraseñas suelen ser cadenas de caracteres, pero las funciones hash trabajan a nivel de byte.
4.1. Problemas codificando la contraseña introducida
En el supuesto de que un nuevo usuario se identifique con una contraseña que no contiene caracteres ASCII, y que la aplicación de identificación, que se está ejecutándo en Windows 2000 en Europa Occidental, convierta la cadena de caracteres a bytes sin elegir una codificación específica para la operación, e incluso usando la que haya de forma predeterminada, en Windows suele ser ISO-8859-1. De modo que el resumen se realice sobre esa secuencia de bytes y quede almacenado.
Entonces, este usuario vuelve de nuevo y esta vez no visita la aplicación de identificación anterior, en vez de eso usa cualquier otra aplicación con la misma base de datos de contraseñas pero en Linux. El usuario introduce correctamente su contraseña y … ¡no coincide!
¿Por qué? Porque la mayoría de los sistemas Linux, usan UTF-8 como codificación predeterminada, y las contraseñas que ha introducido el usuario en ambos casos se han codificado en diferentes secuencias de bytes, afectando a la correcta concordancia de las contraseñas.
Cómo se puede resolver esto, pues utilizando una codificación fija para las codificaciones de las cadena de caracteres a secuencia de bytes. Así se enuncia la quinta regla:
V. Antes de resumir, realizar una codificación de cadena de caracteres a secuencia de bytes usando una codificación fija, preferiblemente UTF-8.
Si se usa Java, donde las cadenas de caracteres (clases String) se codifican independientemente (aunque usan de fondo UTF-16), no habrá que preocuparse de si la aplicación usa ISO-8859-1 o alguna otra codificación en lugar de UTF-8 para su interfaz de usuario, al igual que no será necesario que la codificación para los resúmenes de las contraseñas coincidan con las de la interfaz de usuario. Sólo será necesario que la codificación sea una fija, y UTF-8 proporciona un buen equilibrio entre tamaño y conjunto de caracteres.
4.2. Problemas codificando en el almacenamiento del resumen
Normalmente se quiere gestionar y almacenar el resumen de contraseñas como una cadena de caracteres, pero la función hash dará como resultado una secuencia de bytes que no necesariamente representará un carácter válido en alguna codificación. Por esto, la secuencia de bytes del resumen no se puede codificar en una cadena de caracteres, habiendo peligro de pérdidas de datos si se realizase.
Aquí es donde entra al rescate la codificación BASE64. Codificando la secuencia de bytes del resumen en BASE64, se asegura que la secuencia de bytes de salida representa una cadena de caracteres US-ASCII válida. Por lo que se podrá codificar una secuencia de bytes en BASE64 en una cadena de caracteres US-ASCII.
VI. Finalmente, se debe aplicar la codificación BASE64 y guardar el resumen como una cadena de caracteres US-ASCII.
5. Resumen de las reglas para el cifrado de contraseñas
La lista completa de reglas a aplicar:
- Cifrar las contraseñas usando técnicas de un sentido, es decir, funciones resumen (o hash).
- La entrada y las contraseñas guardadas se comparan usando los resultados de las funciones resumen, no usando cadenas sin cifrar.
- Se debe usar un «salt» que contenga al menos 8 bytes aleatorios, y añadir esos bytes junto al resumen de la contraseña.
- Iterar la función hash al menos 1.000 veces.
- Antes de resumir, realizar una codificación de cadena de caracteres a secuencia de bytes usando una codificación fija, preferiblemente UTF-8.
- Finalmente, se debe aplicar la codificación BASE64 y guardar el resumen como una cadena de caracteres US-ASCII.
6. Realizándolo en Java
La forma más sencilla de cifrar contraseñas en Java, mediante las técnicas explicadas es usar Jasypt.
Si no se puede usar jasypt, o si por alguna razón se quiere desarrollar alguna característica de cifrado propia, se necesitarán:
- La clase
java.security.MessageDigestpara crear resúmenes. Esta clase permite especificar el algoritmo que se va a usar. - La clase
java.security.SecureRandompara generar «salt» aleatorios de una manera segura, usando algoritmos comoSHA1PRNG. - El método
java.lang.String.getBytes (String charsetName), para obtener una secuencia de bytes desde una cadena de caracteres, especificando una codificación fija (UTF-8). - La clase
org.apache.commons.codec.binary.Base64, parte de la biblioteca Apache Commons-Codec, para realizar codificaciones BASE64 en la salida de la función hash.
También, se puede utilizar el código fuente para las clases org.jasypt.digest.StandardByteDigester y org.jasypt.digest.StandardStringDigester, disponible en el repositorio de jasypt.
7. Defensa frente a los típicos ataques
7.1. Ataques de fuerza bruta
Realizado sobre: Una única contraseña.
Descripción: El atacante intenta conseguir la contraseña del usuario generando todas las contraseñas posibles, resumiéndolas y probando si coinciden con el resumen de la contraseña del usuario.
Defensa: La iteración de la función hash un número de veces, como 1.000 (mínimo recomendado), el coste de la creación del resumen de la contraseña en el tiempo de identificación del usuario no es significante, pero el coste de un ataque de fuerza bruta por parte de un atacante que genera millones de resúmenes será muy grande. Hay que recordar que una de las mejores maneras de proteger los datos cifrados es haciendo que el coste de romper la seguridad sea más alto de lo que cuesta el esfuerzo.
7.2. Ataques de diccionario
Realizado sobre: Cada contraseña o una base de datos de contraseñas
Descripción: El atacante intenta conseguir la contraseña de un usuario comparando sus resúmenes contra un conjunto de resúmenes de contraseñas más probables, normalmente se generan desde una lista de palabras de un diccionario. Este ataque explota una debilidad actual de las aplicaciones, ya que muchos usuarios usan palabras del diccionario como contraseña.
Defensa: Añadiendo un «salt» aleatorio, la debilidad de las contraseñas basadas en diccionario se reduce, y la posibilidad de de que el resumen aparezca en un conjunto de resúmenes previamente creados por el atacante es mínima.
7.3. Ataques de cumpleaños
Realizado sobre: La base de datos de las contraseñas.
Descripción: Este ataque explota la paradoja del cumpleaños, la cual en resumen consiste en, teniendo un gran conjunto de resúmenes de contraseñas, las posibilidades de generar una contraseña cuyo resumen coincida con al menos uno de los resúmenes en el conjunto es mucho más alto que lo esperado. Y estas posibilidades aumentan bastante cuando el tamaño del conjunto (el número de usuarios) aumenta.
Defensa: Añadiendo un «salt» aleatorio las posibilidades de que un ataque de cumpleaños tenga éxito son mínimas, porque el atacante tendría que atacar cada contraseña por separado, y no el conjunto de contraseñas, para encontrar una coincidencia. Esto es porque se tendría que encontrar una contraseña que crease el mismo resumen que el del atacante usando el mismo «salt» que se usó para el resumen, y que es diferente para cada contraseña haciendo que el ataque pase a ser de fuerza bruta.
Espero que este pequeño manual os sea de utilidad, a mí me sirvió para mi PFC.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
Microsoft Project Admin Blog
Noviembre 21st, 2009
Con gusto recibo el post donde se anuncia el nuevo blog para administradores de Project Server y para muestra un excelente post el cual menciona los requerimientos de instalación.
» Leer más, comentarios, etc...
4 bits blog
Primeros pasos con django
Noviembre 20th, 2009
Hace tiempo estuve aprendiendo a programar en Python porque me apeteció y porque me tocó lidiar en el trabajo con una aplicación web, la cual realicé en django.
¿Qué es django?
Django es un entorno de desarrollo (lo que en inglés se denomina framework) para la creación rápida de aplicaciones web, basándose en el MVC (Modelo-Vista-Controlador).
Entre todas las posibilidades que ofrece están que permite trabajar con las bases de datos como si no existieran, la creación de URL bonitas sin tener que tocar nada del servidor web, el uso de plantillas en (X)HTML para la creación de las diferentes páginas, y muchas cosas más, todas ellas estupendas y supongo que todas ellas también las tendrán otros entornos similares que utilicen otros lenguajes de programación.
Iniciando un nuevo proyecto
Lo primero que se debe hacer en django es crear lo que se denomina un proyecto, éste a su vez contendrá aplicaciones que serán las que contengan el código utilizado en la aplicación web. Por poner un ejemplo: el proyecto sería un CMS y las aplicaciones las diferentes funcionalidades de dicho CMS.
Para ello se deberá ejecutar:
$ django-admin.py startproject nombre_del_proyecto
Esto creará un directorio, llamado «nombre_del_proyecto», con los archivos básicos de todo proyecto de django:
__init__.pyes el archivo de inicialización de cualquier paquete de python.manage.pypermitirá la gestión del proyecto de django, como: crear las aplicaciones del proyecto, crear las bases de datos, ejecutar un servidor web para probar el proyecto, …settings.pycontiene la configuración del proyecto, básicamente contiene un montón de variables que utilizará django para la configuración.urls.pycontiene los patrones de las direcciones de las diferentes vistas del proyecto de django.
Lo malo es que sólo con esto no se va a poder hacer nada más que cambiar unos cuantos valores de la configuración, para que un proyecto haga algo deberá tener al menos una aplicación que contendrá el código necesario.
Iniciando una nueva aplicación
Para crear una aplicación se debe usar el archivo «manage.py» del proyecto del siguiente modo:
$ manage.py startapp nombre_de_la_aplicación
Esto creará un directorio, llamado «nombre_de_la_aplicación», con los archivos básicos de toda aplicación de django:
__init__.pyigual que antes, es el archivo de inicialización de cualquier paquete de python.models.pycontendrá los modelos de la aplicación, estos modelos son clases de python que se traducirán en tablas en la base de datos.tests.pycontendrá tests de la aplicación. Nota: Este archivo sólo se crea a partir de la versión 1.1 de django.views.pycontendrá las vistas de la aplicación, estas vistas son funciones de python que realizarán las tareas necesarias para mostrar el resultado como una página web.
Para que esta aplicación esté disponible en el proyecto, hay que añadirla a la lista de aplicaciones del proyecto que está en el archivo «settings.py».
INSTALLED_APPS = (
'hello_world.hello_app',
)
Nota: Cuando se crea un nuevo proyecto django crea una lista de aplicaciones predeterminada, que en este caso daría lo mismo borrarlas.
Creando un «hola mundo»
Lo primero será crear un proyecto («hello_world») y una aplicación («hello_app») para dicho proyecto, tal y como se ha mencionado antes. Una vez hecho, se deberá crear una vista para la página web.
Creando una vista
Para la creación de una vista, se debe editar el archivo «views.py» de la aplicación creada del siguiente modo:
# views.py
# -*- coding: utf-8 -*-
# Views used in hello world application.
from django.shortcuts import get_object_or_404, render_to_response
def hello:
"""Hello view function."""
return render_to_response ('hello.htm', { 'hello_msg' : '¡Hola mundo!' })
La función render_to_response usa una plantilla (que ahora se explicará) para crear la página web de la vista.
Creando una plantilla
Django dispone de un lenguaje propio para la creación de plantillas, básicamente son archivos HTML con unas etiquetas especiales, que se marcan con llaves dobles, que django se encargará de rellenar.
De este modo, crear una plantilla es tan sencillo como crear un archivo html en un directorio llamado «templates» dentro del directorio del proyecto o de la aplicación. En este caso valdría crear un archivo llamado «hello.htm» (es el que se usa en la función hello) en el directorio «templates» de la aplicación «hello_app».
{{ hello_msg }}
{{ hello_msg }}
Esta es una plantilla muy sencilla, el lenguaje de las plantillas de django permite realizar muchas más cosas, como herencia entre plantillas, definir bloques, bucles, …
Definiendo una dirección para la vista
Una vez creada la vista y su plantilla, habrá que definir una dirección para poder acceder a la vista. Como se mencionó al principio, para eso está el archivo «urls.py» del proyecto. Este archivo contiene una lista de direcciones a las que se les asignará unas vistas, de modo que cuando se abra esa dirección la vista asignada se encargue de crear su correspondiente página web.
En este caso, el archivo «urls.py» quedaría del siguiente modo:
# urls.py
# -*- coding: utf-8 -*-
# Django URL patterns for hello world project.
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'', 'hello_world.hello_app.views.hello'),
)
Como se puede ver, lo único que se hace es añadir un patrón (una expresión regular) con una vista asociada. En este caso se trata de una dirección vacía (r''), la raíz del dominio, a la que se asocia la función hello que se definió en las vistas de la aplicación.
Probando la aplicación web
Una vez llegado a este punto, ya se puede probar la aplicación web, para ello no hace falta tener ningún servidor web instalado, ya que django dispone de uno para realizar pruebas. Para ejecutarlo, desde el directorio del proyecto:
$ python manage.py runserver
Y aquí concluye esta introducción básica, pero larga, próximamente más. Si os ha gustado y queréis ir aprendiendo por vuestra cuenta, siempre podéis leer la documentación oficial de django.
» Leer más, comentarios, etc...
Arragonán
Testeando respuestas JSON con Grails
Noviembre 20th, 2009
Aunque en la documentación de Grails aparece un ejemplo de como escribir un test para una acción que recibe una petición en formato XML o JSON, no lo hace de como escribir un test de una acción que genera el JSON, que tampoco es que sea precisamente complicado.
Si lo único que quisieramos probar es que, en una cadena JSON, se está devolviendo algún valor que estuvieramos esperando, podríamos utilizar el contenido que devuelve la response como una cadena(con contentAsString) y hacer alguna comprobación sobre el texto:
def response = controller.response.contentAsString
assertTrue response.contains('"name":"Gustavo Poyet"')
assertTrue response.contains('"goals":63')
Pero claro, este test es un muy ligero y no prueba demasiado. Si quisieramos probar más a fondo la respuesta(estructura, un elemento concreto de un array, etc), podríamos usar contains sobre la cadena devuelta, convertir tipos… vamos, que sería más que posible que el código del test terminara siendo infumable. Pero está disponible out of the box el converter JSON de Grails, que permite testear más a fondo fácilmente y con un código mucho más claro.
Es muy posible que si alguien se ve en la necesidad de escribir un test para una acción que devuelve un JSON, ya conozca el converter, por que es una de las alternativas que hay para hacerlo:
render object as JSON
Pues esa misma clase, tiene el paso contrario, pasar una cadena a un objeto groovy/java(JSONElement). De esta forma ya nos ahorraremos trabajo sucio y el código quedará bastante claro:
def response = controller.response.contentAsString
def responseJSON = grails.converters.JSON.parse(response)
assertNotNull responseJSON.players
assertEquals 5, responseJSON.players.size()
assertEquals 63, responseJSON.players[0].goals
assertEquals "Gustavo Poyet", responseJSON.players[0].name
» Leer más, comentarios, etc...
Fetishcode...Thinking in objects
Nueva demo de ADF Faces 11g
Noviembre 19th, 2009
A
» Leer más, comentarios, etc...
Buayacorp
Chuleta para hacer temas en Drupal
Noviembre 17th, 2009
Un interesante cheatsheet o chuleta para hacer temas en Drupal.
» Leer más, comentarios, etc...
Developing my life » desarrollo
GNOME Perú
Noviembre 17th, 2009
El dia sabado 14 de noviembre se hizo la presentacion oficial de la comunidad de GNOME Perú en el III FESOLI de la Universidad Inca Garcilazo de la Vega, en el stand estuvimos Marco Villegas, Sergio Infante, Diego Escalante, Cinthia Chavez y yo, la pared de amor y odio (bueno es este caso fue mesa
), asi como los stickers que ofrecimos se acabaron todo, nosotros pensabamos que nos iban a sobrar, al final fue un exito total \o/.
Tambien te puede interesar
» Leer más, comentarios, etc...
MadeInFlex
Disponibles las betas de AIR 2 y Flash Player 10.1
Noviembre 17th, 2009
Esta noche se han hecho públicas las betas de AIR 2 y de Flash Player 10.1 en Adobe Labs. Es la primera vez que simultáneamente se publica una versión de runtime para Desktop (AIR) y para browser (Flash Player), además disponible para las tres plataformas (Mac, Windows y Linux) .
Comentemos un poco las mejoras en ambos productos:
Flash player 10.1
Se han añadido nuevas APIs y optimizaciones que nos aportan muchos beneficios. Destacamos entre otras:
- Handler global de errores
- Soporte globalizado
- Soporte para text inputs no físicos (dispositivos móbiles)
- Multi-touch y gestures
- Soporte para sensores de tipo accelerometer
- Control optimizado de los SWF para móbiles
- Sleep mode para reducir el consumo de la bateria en los dispositivos móbiles
- Aceleración gráfica por hardware
- Decodificación del formato H.264
- Frame rate adaptativo
- Mejor integración del browser
- HTTP streaming
- Acceso al micrófono
Para mitad del 2010 se esperan otras mejoras que ya iremos comentando.
Otra particularidad de Flash Player 10.1 es la optimización. Según Adobe es muy importante, ya que sin tener que añadir código extra, se experimenta un mejor rendimiento. En la imagen siguiente podemos ver una comparativa con la versión anterior de Flash Player:

AIR 2.0
Muchas mejoras aporta esta nueva versión del runtime. Podemos destacar:
- Multi-touch y gestures
- Apertura de ficheros con la aplicación por defecto
- Detección de volúmenes de almazenaje
- Comunicación con procesos nativos
- Drag and Drop de ficheros no existentes que se generan on demand
- Server Sockets: tenemos Datagram Sockets, Encrypted Sockets, soporte IPv6 y acceso a la información de la red a bajo nivel.
- Resolución DNS
- Encoding local de audio
- Handler global de errores
- Optimizaciones de CPU y memory
No están citadas todas las características de ambos productos, si quereis verlas todas, podeis ir a Adobe Labs donde podreis consultarlas y descargar los runtimes y SDK's.
Iremos informando al respecto.
» Leer más, comentarios, etc...
Cerebro en la Sombra » Técnico
Liberar modem 3G Huawei E220 de Vodafone
Noviembre 16th, 2009
Facilísimo. Y de paso, al actualizar el firmware, lo dejamos preparado para soportar 7,2Mbps. Este es un proceso delicado ya que si se corta a mitad la instalación del firmware se pierde el modem para siempre, hazlo bajo tu responsabilidad. Hay muchos sitios por ahí donde lo cuentan, yo os lo resumo
.
Desinstalamos completamente el software de Vodafone (o de cualquier otra operadora) y descargamos dos paquetes de actualización, el del firmware en sí mismo y el del software del del modem, ya que no queremos que siga cargando los de Vodafone.
- El firmware te lo doy yo
. - Para el software vas aquí y escoges el que prefieras:
- El primero, HOSTB107D05SP00C03…, instala el Mobile Connect.
- El último, UTPSB002D03SP16C03…, el Mobile Partner.
Yo me quedo con el Partner, me parece más sencillo e intuitivo.
Además necesitarás el Qmat (QC Mobile Analysis Tool) y esto otro.
El procedimiento es muy simple. Conectas el modem y cancelas la instalación de los drivers. A continuación ejecutas los dos archivos de actualización, firmware y software. Entre uno y otro (y al terminar el segundo también) conviene desconectarlo y volver a conectarlo (cancelando nuevamente la instalación de los drivers de Vodafone). Ya casi hemos terminado
.
Instala ahora el Qmat y ejecútalo. En el menú superior ve a Hardware Forensics y Use Mobile Ports.
En la ventana que aparece seleccionas, en el primer combo, el puerto donde está tu modem, no tiene pérdida, pondrá algo parecido a COMxx – HUAWEI Mobile Connect – 3G PC UI Interface (COMxx). Pulsas en “Send” y deberían salir unos números en la caja de texto de abajo, eso quiere decir que se comunica correctamente con el modem.
En el combo que muestro desplegado en la imagen de abajo seleccionas “Display NVItem” y a la izquierda, en “Item” introduces 1156 y pinchas en “Let’s go“. Si todo va bien en la ventana de texto aparecerán unos números y, al final de todo, un código de 6 a 8 cifras, ése es tu código de desbloqueo. Cópialo. Si tienes algún problema prueba a desconectar el modem y volver a conectarlo o, incluso, a instalar los drivers nuevos cerrando el programa cuando arranque.
Ahora vamos a la última utilidad, al CardLock_UnLock. Lo abres y te identificará el IMEI de tu teléfono. Pegas en la caja de texto el código que obtuviste en el paso anterior y voilà, el modem está liberado.
Lo he probado hoy mismo con SIM’s de Orange y Movistar, aunque la idea es utilizarlo con la de Simyo
. La configuración que hay que utilizar en este último caso es la siguiente:
APN: gprs-service.com
Usuario: (vacío)
Clave: (vacío)
Número: *99***1#
Ya podemos utilizar el modem con la operadora que nos venga en gana.
Como última curiosidad veremos cómo dejar el software en castellano ya que la actualización lo deja en inglés y no podemos modificar los archivos de la memoria del modem. Editamos el archivo C:\Program Files\Mobile Partner\RunInfo.ini de manera que donde pone:
[language] active=_en-us
ponga
[language] active=_es-es
Listo!
» Leer más, comentarios, etc...
Developing my life » desarrollo
Encuentro Linux y Dia GNOME 2009
Noviembre 16th, 2009
Este 21de octubre pasado tuve la oportunidad de viajar a Chile auspiciado por la fundacion GNOME al Encuentro Linux 2009 para participar en el Dia GNOME 2009 y dar una charla con Sergio Infante sobre “Como volverse un Hacker Feliz de GNOME”, donde dariamos diversos medios con que se cuenta para colaborar con el proyecto GNOME y volverse un desarrollador activo.

Participantes auspiciados por la Fundacion GNOME
Desde que llegamos a Chile nos atendieron muy bien y pude conocer a gente muy entusiasta y sobre todo activa con el software libre, gente muy divertida y amiga, los nerds tambien somos divertidos
; personas como Miguel Ruiz, Chistian Barahona, Sven von Brand, Alvaro Olivares, Naty Espinoza, Priscilla Cruz, Juan Carlos Hinostrosa, Ivan Frade, Pedro Villavicencio, German Poo, Fernando San Martin, Alejandro Valdez, Jorge Bustos, Ricardo Fuentes,Fabian Aria, Felipe Besoain y Carlos Rios Vera … disculpen si me olvide algun nombre

Gigantografia GNOME
En el Dia GNOME todos los nomos pusimos el hombro para que los asistentes al evento estuvieran los mas felices posible y se logro el objetivo \o/. Ademas estoy muy contento con lo que pude ver y aprender de todos los nomos que conoci, esto me ha entusiamado mucho para seguir trabajando y convertirme en desarrollador oficial de GNOME y tener mi @gnome.org
, muchas gracias a todos los nuevos amigos que conocí =)

Asistentes Dia GNOME 2009
Es todo por este post, nos leemos! ![]()
Tambien te puede interesar
» Leer más, comentarios, etc...
avemundi, blog de un micro-isv » Desarrollo de software
my tools of the trade - windows edition
Noviembre 15th, 2009
Vía Joel on Software llegué al blog de UCOSP donde me llamó la atención el post My tools of the trade. Es una lista de aplicaciones preferidas a la hora de programar, y hay varios enlaces a otros blogs de programadores donde dan cuenta de sus preferencias, entre ellos Mike Gunderloy que es un antiguo evangelista de .Net que se ha pasado al bando de Ruby on Rails, haciendo una pirueta realmente espectacular. Estas listas de aplicaciones favoritas me gustan porque siempre aparece alguna aplicación cuya existencia desconoces y que te puede resultar interesante utilizar.
Como la lista de aplicaciones se hace en un entorno de desarrollo profesional, voy a hacer la mia para entorno Windows. Realmente en Mac todavía no he hecho nada serio, y reconozco que la programación en entorno Mac es mi asignatura pendiente. Aqui va mi lista de herramientas.
En cuanto a hardware, utilizo un iMac de 17″, el modelo de principios de 2007, con 2GB de RAM y disco de 250GB. El teclado que venía con el iMac no me gustaba y tuve la suerte de que me regalaron un teclado de aluminio, y puedo decir que es el teclado más cómodo que he usado en mi vida. El ratón es el Mighty Mouse de cable que venía de serie. Además uso un disco duro externo Lacie para hacer copias de seguridad y un lapiz USB de 4GB. Tengo Windows XP instalado en una partición del disco mediante BootCamp y me va de cine. Intento no instalar aplicaciones para probar en este Windows, sino que uso una máquina virtual con VirtualBox con otro XP donde hago todas los experimentos que no me atrevo con el de trabajar.
Software de desarrollo xBase:
- xharbour, fivewin harbour y las clases de CanalFive.
- PellesC como editor de recursos.
- HippoEdit mi editor preferido, ya no uso otro.
- Free UPX para comprimir los ejecutables.
- OZS WinDbu para editar ficheros DBF
- Inno setup para montar los paquetes de instalación.
Otro software:
- SyncBackup mi programa de backup, recomendado al 100%. Nopodría vivir sin él.
- CCleaner para limpiar de vez en cuando el sistema.
- FastStone Capture para realizar capturas de pantalla.
- Paint.Net como editor gráfico.
- OpenOffice como paquete ofimático.
- Mozilla Thunderbird como gestor de correo.
- Microsoft Security Essentials como antivirus
Cada vez uso menos programas. Antes me pasaba el día probando aplicaciones, pero cada vez hago esto menos. Hace mucho tiempo que no instalo nuevo software en Windows, simplemente no lo necesito y me apaño con lo que tengo. Cosas del decluttering.
Hasta aquí el software que uso en Windows. A ver si los lectores del blog os animais a hacer un post similar y publicais el enlace en los comentarios.
» Leer más, comentarios, etc...
Fetishcode...Thinking in objects
Planes sobre el catalogo de productos de Sun
Noviembre 13th, 2009
A
» Leer más, comentarios, etc...
Buayacorp
Wordpress 2.8.6
Noviembre 13th, 2009
Liberada una nueva actualización de WordPress la 2.8.6 que soluciona dos problemas de seguridad.
» Leer más, comentarios, etc...
xailer.info (esp)
Xailer 2 RC2
Noviembre 13th, 2009
Estimados usuarios de Xailer,
Ya está disponible la segunda RC (release candidate) de Xailer 2, en la cual básicamente se han corregido pequeños errores encontrados en la RC1.
Para más información acerca de Xailer RC consulte el artículo siguiente:
Podéis encontrar la nueva versión de Xailer 2 RC2 en el siguiente enlace:
http://www.xailer.com/files/xailer20rc2.exe
También deberéis descargar una nueva versión de los binarios de xHarbour, que ha cambiado desde la anterior publicación, desde la siguiente dirección:
http://www.xailer.com/files/xharboursetup2.exe
Os recordamos que está versión de Xailer sólo está disponible para usuarios con suscripción activa. Leer el artículo Novedades de Xailer 2.0 para más información.
Nota Importante:
Hemos decidido prorrogar el periodo de soporte y actualizaciones de forma completamente gratuita hasta 30 días después de la publicación definitiva de Xailer 2.0 a todos aquellos usuarios que hayan comprado o renovado Xailer después del día 10 de Agosto de 2008, fecha en la que se publicó en nuestro Blog el acceso a Xailer 2.0 Beta por parte de los usuarios con suscripción activa.
Si este es su caso, póngase en contacto con sales@xailer.com para que se le amplíe la fecha de soporte.
Un cordial saludo,
[El equipo de Xailer]
» Leer más, comentarios, etc...
4 bits blog
Autotools
Noviembre 13th, 2009
Si alguien sabe lo que son las autotools, seguramente haya sufrido para saber cómo funcionan. Hacía mucho tiempo que no me peleaba con ellas, hasta que hace unos días leí un pequeño manual sobre cómo configurar los diferentes archivos necesarios y me acordé de un pequeño manual que hice cuando me tocó pegarme con ellas, que voy a recuperar.
¿Qué son las autotools?
Las autotools, son programas que se usan para crear un paquete de código fuente que se pueda distribuir y compilar de una manera sencilla (configure, make y make install). Los programas que forman las autotools son los siguientes:
aclocalautoconfautomake
Estos programas son la base para crear el paquete de código fuente, para ello se tendrán que generar unos archivos concretos.
Estructura del código fuente a distribuir
Las autotools se usan para generar el paquete «tar.gz» que contiene el código fuente del programa que se va a distribuir, normalmente estos paquetes siguen una estructura estándar. La estructura básica es:
src: Directorio del código fuente.AUTHORS: Indica los autores del programa.ChangeLog: Indica los cambios que se han ido produciendo.COPYING: Indica la licencia de distribución que tiene el programa. (Autogenerado)INSTALL: Explica cómo instalar el programa. (Autogenerado)NEWS: Indica las noticias relacionadas con el programa.README: Un pequeño documento en el que se describe el programa y se explican temas concretos de éste.THANKS: Indica los agradecimientos que tenga el autor/es.TODO: Indica una pequeña lista de cosas por hacer.
De este modo, si se van a utilizar las autotools sería aconsejable seguir la estructura anterior, y crear todos los archivos menos los como «autogenerado» que, obviamente, se generarán automáticamente, aunque siempre se pueden crear a mano ya que puede que no se quiera tener el contenido autogenerado.
El archivo «configure.ac»
Sobre este archivo gira toda la generación del programa para su distribución. En él se escriben las macros para los diferentes programas que se ejecutarán: aclocal, autoconf y automake.
AC_PREREQ(2.52) AC_INIT([hola mundo], [0.1]) AM_INIT_AUTOMAKE([]) AC_PROG_CC AC_CONFIG_FILES([Makefile src/Makefile]) AC_OUTPUT
- Programa aclocal: Sirve para generar el archivo «aclocal.m4». ¡Sólo se generará si en el archivo «configure.ac» hay macros de
automake! - Macros de autoconf: Empiezan por
AC_*, y se buscan en el archivo «configure.ac» y en el «aclocal.m4» si existe. Sirven para la configuración correcta del programa. AC_PREREQ(versión)indica la versión deautoconfnecesaria.AC_INIT([aplicación], [versión])inicializaautoconf, recibe como parámetros el nombre del programa y su versión.AC_PROG_CCindica que realizará una compilación de código escrito en C.AC_CONFIG_FILES([Makefile src/Makefile])indica los archivos «Makefile» que se van a generar a partir de sus respectivos «Makefile.am».AC_OUTPUTindica los archivos que finalmente debe generar el script «configure».- Macros de automake: Empiezan por
AM_*, y sirven para la generación de los diferentes «Makefile». AM_INIT_AUTOMAKE([])inicializaautomake, se le puede pasar un parámetro que la verdad no sé lo que indica, para mi ejemplo no hace falta pasárselo.
Aviso: Las macros no pueden llevar un espacio entre su nombre y el paréntesis de inicio.
Los archivos «Makefile.am»
Los archivos «Makefile.am» contienen las reglas para generar los archivos «Makefile» correspondientes a los directorios dónde se encuentran, por lo que habrá un archivo por directorio en el que se tenga que realizar alguna operación con make.
De este modo, siempre se debe tener un archivo «Makefile.am» en el directorio raíz del proyecto, este archivo contendrá algo similar a lo siguiente:
SUBDIRS = src EXTRA_DIST = AUTHORS ChangeLog NEWS README THANKS TODO
- SUBDIRS enumera los directorios que contienen otros archivos «Makefile.am».
- EXTRA_DIST enumera los distintos archivos que deberá tener el paquete, para distribuir el código fuente que se generará.
En este caso el directorio «src» es dónde, supuestamente, deberá estar el código fuente de nuestra aplicación y tendrá un archivo «Makefile.am», que indicará las reglas para compilar nuestro código fuente correctamente.
El archivo «Makefile.am» tendrá el siguiente contenido:
bin_PROGRAMS = hola−mundo hola_mundo_SOURCES = hola−mundo.c
- bin_PROGRAMS indica el nombre del ejecutable final.
- hola_mundo_SOURCES indica los archivos con el código fuente de la aplicación.
- Si se necesitarán bibliotecas se debería añadir hola_mundo_LDADD con las macros necesarias para dichas bibliotecas en el archivo «configure.ac».
Nota: Para generar una biblioteca, se debería usar libexec_PROGRAMS en lugar de bin_PROGRAMS.
Generación del script «configure»
Una vez creados los archivos necesarios, se deben realizar los siguientes pasos:
- Generación:
$ aclocal $ autoconf $ automake −−add−missing
- Compilación y ejecución del programa:
$ ./configure $ make $ src/hola−mundo
- Distribución del programa:
$ make distcheck
Para ampliar un poco más All you should really know about Autoconf and Automake
» Leer más, comentarios, etc...
Cerebro en la Sombra » Técnico
Google Safe Browsing API con PHP, filtra las urls potencialmente peligrosas
Noviembre 13th, 2009
Preparando un pequeño nuevo proyecto del que os hablaré en mi siguiente artículo, tuve un problema que me llevó a escribir este otro. En un momento de la aplicación el usuario debe escribir una url (el resto es secreto aún
). Pues bien, ya durante las pruebas aparecieron los típicos graciosos que utilizan url’s potencialmente peligros, de esas que no hacen cosas nada buenas. Buscando un poco dí con Google Safe Browsing API, el sistema que Google pone a nuestra disposición para comprobar contra sus sistemas si tienen una determinada url recogida dentro de su base de datos de urls peligrosas, la misma que utilizan ellos para lanzar a veces esos avisos de “¿seguro que quieres ver esto?”.
Esta API funciona de modo diferente a la mayoría de aplicaciones de Google que residen directamente en la nube y lanzamos consultas contra su API. En este caso nos provee de su base de datos de urls potencialmente peligrosas para que las guardemos localmente y hagamos las consultas directamente en nuestros sistemas, lo único que debemos hacer es actualizar periódicamente esos datos, eso sí, con algunas limitaciones que nos impone Google, como que no se pueden renovar en intervalos inferiores a 30 minutos. Actualmente esta base de datos tiene más de trescientos mil registros.
Vamos a explicar como utilizarla. Lo primero que debemos hacer es, como en todo lo que hace Google, crear una “API KEY” y una sencilla tabla en nuestro servidor MySQL donde alojaremos la información que nos envíe Google.
-
CREATE TABLE IF NOT EXISTS `malware` (
-
`malware_hash` varchar(32) NOT NULL,
-
PRIMARY KEY (`malware_hash`)
-
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Creamos ahora una tarea que se ejecutará periódicamente y que leerá, siguiendo las especificaciones adecuadas, los datos que devuelve Google y los insertará/eliminará de nuestra base de datos. Yo, como ya he comentado en otras ocasiones, utilizo Adodb para el acceso a datos.
-
-
$api_key = "TU KEY";
-
$google_url = "http://sb.google.com/safebrowsing/update";
-
-
//open the remote URL
-
$target = "$google_url?client=api&apikey=$api_key&version=goog-malware-hash:1:-1,goog-black-hash:1:-1";
-
-
if ($handle) {
-
$hash = qstr($hash); //escape
-
if ($operation == ‘+’){
-
$sql = "insert ignore into malware (malware_hash) VALUES (’".$hash."’)";
-
$conn->Execute($sql);
-
}else{
-
$sql = "delete from malware where malware_hash = ‘".$hash."’";
-
$conn->Execute($sql);
-
}
-
}
-
}
-
}
Lo que hacemos simplemente es eliminar los hash que nos indica que debemos quitar y añadir los nuevos. Vamos a probar el sistema. Utilicé varias clases y sistemas que había por ahí para utilizar con PHP pero ninguno me parecía lo suficientemente completo hasta que encontré este. Su funcionamiento es muy sencillo. De nuevo está hecho usando Adodb, cámbialo según tus requerimientos.
-
$class = new GoogleSafeBrowsing(‘tu_key’, true);
-
$safe=$class->lookupsFor("http://blog.osusnet.com");
Nos devolverá un booleano que indica si la url es segura o no. Si probamos con alguna de éstas obtendremos un bonito false
. Espero que os sirva.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
Project Server 2010 : Portfolio Analysis
Noviembre 13th, 2009
Mas de Project Server 2010 desde el Team Blog de Microsoft Project, Porrtfolio Analysis entre otras características están las siguientes;
- Resource Analysis
- Resource Plan
- Resource Constraint Analysis
http://blogs.msdn.com/project/archive/2009/11/11/project-2010-introducing-portfolio-analysis.aspx
» Leer más, comentarios, etc...
Buayacorp
Pruebas de compatibilidad en navegadores
Noviembre 12th, 2009
Probando tu diseño en todos los navegadores.
» Leer más, comentarios, etc...
MadeInFlex
Usabilidad en la interacción persona – aplicación
Noviembre 11th, 2009
Una de las últimas asignaturas que cursé en la carrera y una de las más importantes desde mi punto de vista, trataba sobre interficies de usuario. Agradezco al profesor Jordi Regencós, un experto en este ámbito, que me haya permitido usar sus apuntes para este artículo.
A los developers de aplicaciones, en especial a nosotros, los desarrolladores de RIA's, nos tiene que sonar el concepto de usabilidad, para los que no, me complace compartir con vosotros este post.
Introducción
A menudo se piensa que sólo el buen diseño de una aplicación hará que ésta sea atractiva; y no es así: si ésta no es usable, el usuario acabará por aborrecerla, por muy bueno que sea el diseñador.
La usabilidad se define en la wikipedia como la facilidad con la cual las personas pueden utilizar un objeto con el fin de alcanzar un objetivo concreto. La usabilidad también puede referirse al estudio de los principios que hay tras la eficacia percibida de un objeto.
En el ámbito de la interacción persona - aplicación, la usabilidad se refiere a la claridad y la elegancia con que se diseña la interacción con una aplicación. No debemos confundir la usabilidad con la experiencia de usuario: están relacionadas de alguna forma, pero no son lo mismo, ya que la experiencia de usuario se refiere al conjunto de factores y elementos relativos a la interacción del usuario, con un entorno o dispositivo concretos, cuyo resultado es la generación de una percepción positiva o negativa de dicho servicio.
La usabilidad tiene en cuenta estos aspectos:
- El tipo o tipos específicos de usuario/s
- La tarea o tareas para las cuales el sistema se ha diseñado
- El contexto en el que se da la interacción
Los conceptos de usabilidad y de modelo de interacción persona / aplicación están relacionados, ya que el grado de usabilidad facilitará o no esta interacción.
Interacción persona / aplicación
Hay distintos estilos de interacción entre persona y aplicación, pero todos quedan reflejados en el siguiente diagrama:

En el diagrama anterior se describe la interacción como un proceso cíclico que sigue las siguientes etapas:
1- El usuario introduce datos mediante un dispositivo de entrada.
2- El dispositivo de entrada envía datos a la aplicación para que ésta realice una acción en el sistema.
3- La aplicación da una respuesta a la acción solicitada y refleja los cambios en el dispositivo de salida, el más común es el monitor.
4- El usuario interpreta la salida como resultado a la acción solicitada.
En el diagrama se observa que hay dos conceptos que pueden sorprender, los precipicios de ejecución y de evaluación. Vamos a explicar a continuación en que consisten.
Precipicios de ejecución y evaluación
El concepto de precipicio de ejecución se define como la dificultad que tiene el usuario para traducir las intenciones en acciones sobre el sistema. Por ejemplo, en una web de compras online, sería la dificultad que encuentra para tomar cada decisión sobre el sistema que le llevará a comprar un producto.
En cambio, el precipicio de evaluación se define como la dificultad que tiene el usuario para decidir si las acciones que ha realizado sobre el sistema han servido para conseguir sus objetivos, en función de la interpretación de la respuesta que la aplicación da sobre el dispositivo de salida. Siguiendo con el ejemplo anterior, sería la dificultad que tiene el usuario para ir entendiendo los diferentes estadios del proceso de compra a partir del feedback de la aplicación.
Se considera que cuanto mayores son estos precipicios peor usabilidad tiene la aplicación; por lo tanto, uno de los objetivos de la interficie gráfica debe ser reducir al máximo estos precipicios.
Beneficios de la usabilidad
Los más destacados son:
- Reducción de los costes de aprendizaje
- Disminución de los costes de asistencia y ayuda al usuario
- Optimización de los costes de diseño, rediseño y mantenimiento
- Aumento de la tasa de conversión de visitantes a clientes de un sitio web
- Mejora la imagen y el prestigio
- Mejora la calidad de vida de los usuarios, ya que reduce su estrés, incrementa la satisfacción y la productividad
Principios básicos del diseño centrado en la usabilidad
Entre la multitud de expertos en usabilidad, me gustaría destacar a Donald A. Norman , ya que considero que los principios que difunde, son principios esenciales y universales que definen un buen diseño para conseguir una mejor usabilidad. Sus principios son:
- Visibilidad: las funcionalidades del sistema deben ser claramente visibles.
- Realimentación: Debemos mostrar el resultado de las acciones que hemos realizado sobre el sistema.
- Restricciones: Se deben determinar restricciones sobre que se puede y que no se puede hacer. Estas restricciones pueden depender de diferentes aspectos como por ejemplo de cómo la aplicación determina su uso, de qué modelo mental se ha hecho el usuario sobre el sistema o de las convenciones que el usuario tiene preconcebidas.
- Correspondencias: Norman lo define como la relación entre los controles y como afectan al sistema.
- Consistencia: Acciones similares sobre el sistema deben realizar resultados similares sobre el sistema.
- Affordances: lo podemos traducir como “pistas” sobre los atributos de los elementos en pantalla, que nos ayuden a deducir como utilizarlos.
Principios de la usabilidad
Jakob Nielsen es considerado el creador del concepto de usabilidad. Él la definió como “atributo de calidad que mide lo fáciles de usar que son las interfaces”; es decir una aplicación usable es aquella en la que los usuarios pueden interactuar de la forma más fácil, cómoda, segura e inteligentemente posible.
Jakob Nielsen dijo que es muy importante que una interfaz sea entendible, novedosa, comprensible, inteligente y atractiva.
Además definió sus propios principios de usabilidad que a continuación enumero:
- Visibilidad del estado del sistema
- Correspondencia entre el sistema i el mundo real
- El usuario debe ver consistencia entre acciones y resultados
- Ayudar a los usuarios a reconocer errores y cómo recuperarse de ellos
- Evitar errores
- Aplicar la máxima de: “reconocer es mejor que recordar”
- Flexibilizad y eficiencia
- Diseño y estética adecuados
- Ayuda disponible para el usuario
Para concluir…
Para los que no vean la importancia de la usabilidad, decir que está reconocida como un importante atributo de calidad del software, habiéndose ganado un espacio entre aspectos más tradicionales como el rendimiento y la fiabilidad. De hecho ya se habla de ingeniería de la usabilidad. En los últimos tiempos han surgido muchas consultorías sobre usabilidad debido a la importancia que ha adquirido.
Para finalizar, si os interesa el ámbito de la usabilidad, os recomiendo que leais a Nielsen y a Norman; podeis encontrar información en la página web de su consultoría de usabilidad la Nielsen Norman Group.


















