The New Cult of Dead Cow » desarrollo
Problemas de visualizacion en nuestras paginas web
Febrero 28th, 2009 - [Enlace local]
En los albores de la informatica la representacion de texto corria a cargo de los famosos caracteres ASCII que nos permitian representan de manera sencilla la mayoria de letras basicas del alfabeto occidental.
Esta era una representacion universal y simple … un caracter, un byte.
Sin embargo, con el paso del tiempo se hizo necesario agregar mas caracteres al alfabeto disponible volviendose insuficientes los 7 bits del ASCII.
Es ahi donde aparecen las codificaciones como la ISO 8859-1 o la UTF-8, en busca de facilitarnos la representacion de caracteres. Sin embargo, al proliferar gran variedad de ENCODINGs muchas veces la informacion no se muestra correctamente.
Por ejemplo, si yo estoy esperando leer un texto en chino, y me lo pasan en japones … lo mas seguro es que entienda una cosa totalmente distinta de lo que se pretendia comunicar. Eso mismo sucede en la web, cuando recibimos un texto Latin1 y nosotros esperabamos un UTF-8, por ejemplo, algunos caracteres se muestran de manera incorrecta.
La solucion es bastante sencilla aunque no tan visible, indicar al navegador en que ENCONDIG se va a mostrar el texto.
Sin embargo, y aca viene la dificultad para los nuevos, el texto de viene de una sola fuente … o si ?
El texto mostrado en nuestro navegador, por lo general proviene de dos fuentes:
- Los archivos php, html, etc
- La base de datos.
Entonces debemos asegurarnos que ambos elementos son guardados en el mismo encondig. Y a la vez, indicarle que encoding es ese al navegador.
Para indicarle el encondig correcto al navegador debemos incluir este tag en nuestro HEAD
<meta http-equiv=”content-type” content=”application/xhtml+xml; charset=UTF-8” />
Luego debemos asegurarnos que nuestro editor de texto favorito guarda el archivo en el encoding adecuado. Esta operacion varia de editor en editor, pero podria estar en Guardar como o sino en Opciones.
Luego debemos configurar nuestra base de datos para que tambien guarde la informacion con dicho encondig, para el ejemplo voy a usar phpmyadmin.
Ahi podemos ver como se establece un encoding generico para el motor de base de datos en MySQL charset y MySQL collation.Asi tambien podemos definir un encoding para cada base de datos, asignandole uno al momento de crearla. O cambiarla luego de crearla, accediendo al menu opciones de la base de datos
» Leer más, comentarios, etc...
Cerebro en la Sombra » Técnico
Actualizado a Wordpress 2.7.1
Febrero 28th, 2009 - [Enlace local]
Por fin, ya era hora. He pasado de la versión 2.3 a la 2.7.1 directamente, sin pasar por la casilla de salida que se dice. La verdad es que ha sido todo muy cómodo y no me ha dado ningún problema, todo ha funcionado a la primera y en media hora tenía todo funcionando.
¿Lo peor? Los cambios, muchos, tendré que esperar a acostumbrarme a la nueva interfaz para criticar algo
. Me pierdo por todas partes y encima me queda menos espacio para todo.
Lo primero que me ha resultado raro e incómodo respecto a cómo solía trabajar es la nueva interfaz de subida de imágenes. Antes podía estar subiendo y escribiendo simultáneamente, ahora no, si subo no escribo y viceversa. Sin embargo se ha ganado comodidad al poder subir varios archivos de golpe. Veremos dentro de un par de semanas qué opino.
» Leer más, comentarios, etc...
The New Cult of Dead Cow » desarrollo
NOIE6 … Day ?
Febrero 27th, 2009 - [Enlace local]
Leyendo la iniciativa de aNieto2K, o mejor dicho la reinicitiva porque en esto de batallar con el ie6 ya vamos varias veces, me cuestiono si realmente hace falta un dia de soporte para que uno actualize su navegador.
Asi es que propongo replantearla, y dejar sin estilos de los navegadores IE6 pero ya no solo un dia, sin a perpetuidad hasta que logren actualizarce.
» Leer más, comentarios, etc...
MadeInFlex
Nueva Release de Adobe AIR 1.5.1
Febrero 27th, 2009 - [Enlace local]
Queridos compañeros:
La nueva release de Adobe AIR está en las calles.
Si bien es cierto que esta actualización no representa una gran mejora en lo que respecta a nuevas funcionalidades, si que soluciona una buena lista de bugs , con los que estoy seguro mas de uno os habéis encontrado alguna vez.
» Leer más, comentarios, etc...
Cerebro en la Sombra » Técnico
Usuarios de ftp virtuales con vsftpd y MySQL
Febrero 27th, 2009 - [Enlace local]
Un problema que se me ha presentado más de una vez es dar acceso FTP a determinadas carpetas a usuarios que necesitan actualizar archivos en ellas. Por regla general habría que crear un usuario del sistema que tuviese su “home” en esa carpeta o un enlace simbólico desde otra, pero nunca me ha gustado la idea de crear usuarios a diestro y siniestro, aunque sean sin privilegios. Buscando un día, empecé a encontrar información sobre cómo crear usuarios “virtuales” en vsftpd y me gustó mucho la idea, combinando esto con la gestión de usuarios en MySQL podría tener un sistema bastante sencillo de dar acceso FTP a unos cuantos usuarios sin incrementar los del sistema y, por tanto, sin abrir agujeros de seguridad.
Lo primero será instalar los módulos necesarios, asumiendo que ya tienes el servidor MySQL funcionando. Nos hará falta el paquete vsftpd y el pam_mysql que permitirá hacer autentificaciones contra una base de datos de este tipo.
-
yum install pam_mysql vsftpd
Ahora configuramos el archivo /etc/pam.d/vsftpd para que quede así;
-
[osus@servidor vsftpd]# cat /etc/pam.d/vsftpd
-
auth required /lib/security/pam_mysql.so user=vsftpd passwd=clave host=localhost db=basedatos table=usuarios usercolumn=usuario passwdcolumn=pass crypt=0
-
account required /lib/security/pam_mysql.so user=vsftpd passwd=clave host=localhost db=basedatos table=usuarios usercolumn=usuario passwdcolumn=pass crypt=0
-
session required /lib/security/pam_mysql.so user=vsftpd passwd=clave host=localhost db=basedatos table=usuarios usercolumn=usuario passwdcolumn=pass crypt=0
Esto indica a vsftpd que debe autenticarse contra “basedatos” en “localhost” con el usuario “vsftpd” y la clave “clave” y que debe buscar en la tabla “usuarios” con las columnas “usuario” y “pass“. Qué evidente es todo
.
El último parámetro, “crypt“, indica el modo en que se guardarán las claves:
- 0 para claves en texto plano sin encriptar
- 1 para claves encriptadas con la función crypt()
- 2 para claves generadas con la función PASSWORD() de MySQL
- 3 para claves en md5
Escoge el sistema que prefieras. Dejaremos ahora el archivo de configuración principal de este modo:
-
[osus@servidor vsftpd]# cat /etc/vsftpd/vsftpd.conf
-
ftpd_banner= "Servidor FTP"
-
anonymous_enable=NO
-
chroot_local_user=YES
-
guest_enable=YES
-
guest_username=ftpoculto
-
hide_ids=YES
-
listen=yes
-
listen_address=192.168.3.254
-
listen_port=21
-
local_enable=YES
-
max_clients=100
-
max_per_ip=5
-
pam_service_name=vsftpd
-
use_localtime=YES
-
user_config_dir=/etc/vsftpd/usuarios
-
userlist_enable=YES
-
userlist_file=/etc/vsftpd/denied_users
-
virtual_use_local_privs=YES
-
xferlog_enable=YES
-
async_abor_enable=YES
-
connect_from_port_20=YES
-
dirlist_enable=NO
-
download_enable=NO
-
local_umask=000
Con esto le estamos diciendo que no permitiremos el acceso anónimo y que el usuario real que se utilizará será “ftpoculto“, los usuarios virtuales se comportarán como este usuario. Le indicamos, además, que busque los usuarios virtuales en /etc/vsftpd/usuarios y que no deje entrar a ningún usuario real, sólo a los virtuales. Para esto último haremos lo siguiente:
-
cat /etc/passwd | cut -d ":" -f 1 | sort > /etc/vsftpd/denied_users
Así añadimos a la lista de usuarios denegados a todos los usuarios del sistema, no hay que ponerlos a mano uno a uno
.
Ahora debemos configurar el acceso para cada usuario dentro de la carpeta “usuarios“. El nombre del archivo debe ser el mismo que el del usuario que se ha añadido a la base de datos, el que utilizará el cliente para conectarse. Yo, por ejemplo, suelo utilizar como nombres el dominio del cliente, así se quién es quién.
-
[osus@servidor usuarios]# cat tudominio.com
-
dirlist_enable=YES
-
download_enable=YES
-
local_root=/var/www/tudominio.com/
-
write_enable=YES
-
anon_world_readable_only=NO
Tendremos que configurar el directorio de este usuario para que pueda escribir en él. Para conseguirlo recordamos que vsftpd utilizaría el usuario real “ftpoculto“. Debemos, por tanto, dar permisos sobre los directorios de los usuarios virtuales a ese usuario:
-
chown -R ftpoculto.users /var/www/tudominio.com
Con esto, el usuario “tudominio.com” podrá moverse en /var/www/tudominio.com a sus anchas
.
La verdad es que me ha funcionado muy bien siempre. Si se combina con un sistema de acceso VPN sencillo, de manera que el puerto FTP no tenga que estar abierto púclibamente, queda todo muy robusto y seguro además de que es muy sencillo añadir nuevos usuarios, incluso lo puedes automatizar con un script ya que solamente hay que añadir un registro en la base de datos y crear el archivo de configuración en /etc/vsftpd/usuarios.
Es una buena idea en pequeños entornos ISP no dedicados o especializados, entornos donde los usuarios no van a necesitar habitualmente acceso FTP (cms, blogs, webs corporativas…).
Hay muchos más parámetros en vsftpd, desde limitar el ancho de banda por usuario hasta utilizar SSL en las conexiones, sólo hay que leer un poco la documentación
.
» Leer más, comentarios, etc...
Najaraba.com: Software libre, negocios y más.
Lean: Crear Conocimiento
Febrero 26th, 2009 - [Enlace local]
Este principio -verdad subyacente que no cambia con el tiempo o el espacio- trata sobre la importancia del aprendizaje. El desarrollo de software es radicalmente distinto a los procesos de producción. La creación de software es un ejercicio de descubrimiento, mientras que la producción intenta limitar las variaciones entre elementos. Para mejorar este ejercicio debemos maximizar el aprendizaje en
» Leer más, comentarios, etc...
Yet Another Programming Weblog
Lo que Paul Graham ha aprendido con Hacker News
Febrero 26th, 2009 - [Enlace local]
Hacker news es un sitio de envío y comentario de noticias muy al modo de reddit (o digg o menéame), pero con temática muy definida (temática técnica, hacker en el sentido MIT ), con editores estrictos y con políticas severas de ontopic. Pues Paul Graham, su creador ha escrito What I've Learned from Hacker News, o sea, lo que ha aprendido con el sitio. Se puede estar de acuerdo o en desacuerdo en algunas cosas, pero es sin duda interesante. Extracto, lo que me ha llamado la atención:
Recuerda, la motivación original pata Hacker News fue testear un lenguaje nuevo, uno centrado en experimentar con el diseño de lenguajes, no en el rendimiento. Cada vez que el sitio se vuelve lento, me refuerzo a mi mismo recordando la famosa cita de McIlroy y Bentley:La clave del rendimiento es la elegancia, no un batallón de casos especiales.
Y busco los cuellos de botella que puedo eliminar con menos código. Así he sido capaz de mantener un rendimiento mediocre a pesar de que el crecimiento se ha multiplicado por catorce.
Probablemente lo más importante que he aprendido acerca de la "disolución" es que se mide más por comportamiento que por usuarios. Es el mal comportamiento lo que hay que mantener alejado más que a las malas personas. El comportamiento de los usuarios es sorprendentemente maleable. Si se espera de la gente que se comporte bien tiende a hacerlo. Y viceversa.
Lo más peligroso de la portada son las que es demasiado fácil votar positivo. Si alguien prueba un nuevo teorema, le lleva tiempo al lector decidir si vota positivo o no.Un cómic divertido cuesta menos. Una crítica con un slogan como título cuesta cero, porque la gente lo vota sin ni siquiera visitar el enlace.
La forma más peligrosa de de comentario estúpido no es el argumento largo pero equivocado sino el chiste tonto. Los argumentos largos pero equivocados son bastante raros. Hay una gran correlación entre la calidad y la longitud del comentario.
[...]Visitar un foro online sólo cuesta un clic y se parece mucho superficialmente a trabajar. Puedes estar gastando tu tiempo, pero no estás parado. Alguien esta equivocado en Internet, y tú estás arreglando el problema.
Digg es conocido por su falta de trasparencia. La raíz del problema no son los tipos que llevan Digg sean especialmente furtivos, sino que usan un algoritmo equivocado para generar la portada. En lugar de subir conforme van teniendo más votos, como en Reddit, las historias empiezan arriba y las nuevas que van llegando las van empujando hacia abajo.
La razón de la diferencia es que Digg deriva de Slashdot mientras que Reddit de delicious/popular. Digg es Slashdot con votos en lugar de editores y Reddit es delicious/popular con votos en lugar de agregar a favoritos (Aún se pueden ver los fósiles de sus orígenes en sus diseños gráficos.)
Otra cosa que he aprendido de este experimento es que si vas a distinguir a las personas, hazlo bien. Este es uno de esos problemas en los que no funciona al prototipado rápido.Yo particularmente estoy de acuerdo en casi todo. Sólo puntualizaría que hay honrosas excepciones en la correlación entre longitud y calidad. Un enlace relevante, una cita, a veces es breve pero muy relevante en la discusión. De todos modos por eso habla de correlación :)
De hecho este es el argumento intelectualmente honrado para no discriminar a varios tipos de personas. La razón no es que todo el mundo es igual, sino que es malo hacerlo de modo incorrecto y es difícil hacerlo bien.
La misma entrada y más comentarios en Lo que Paul Graham ha aprendido con Hacker News en barrapunto
» Leer más, comentarios, etc...
Blog de Julio César Pérez Arques
Tip Eclipse: Generar metodos hashCode() y equals()
Febrero 26th, 2009 - [Enlace local]
Hoy toca un tip más sobre Eclipse de los varios que llevo ya en el blog. Se trata de cómo generar los métodos hashCode() y equals() de forma automática.
Abre la clase Java a la que quieras añadirle los métodos y desde el menú Source (Alt+May+S), selecciona la opción Generate hashCode() and equals() (h). Dentro de la pantalla podrás seleccionar los atributos que quieras que participen en la implementación, la localización dentro del fichero Java, si generar comentarios y si usar instanceOf para comprar los tipos.
El código generado es limpio y eficaz. La única pega que le veo es que en los bloques if de 1 línea no usa llaves. Afortunadamente ésto se ha corregido a partir de la versión 3.5 de Eclipse. Otra opción es usar la funcionalidad de realizar acciones al guardar ficheros Java en Eclipse.
También echo de menos poder elegir que use el método get correspondiente en lugar del atributo directamente, me viene a la memoria algún problemilla con Hibernate...
» Leer más, comentarios, etc...
Cerebro en la Sombra » Técnico
Adobe AIR V - Trabajando con bases de datos locales sqlite
Febrero 25th, 2009 - [Enlace local]
Llegamos al penúltimo capítulo de esta serie acerca de Adobe AIR. Hoy veremos como trabajar en local con datos persistentes de manera que podamos recuperarlos en otras sesiones. Al decir en local me refiero a que no se necesita conexión a Internet para salvaguardarlos, no se utilizará una base de datos remota sino el propio ordenador del cliente.
A diferencia de las aplicaciones Flash embebidas en un navegador, AIR permite el acceso completo al sistema de archivos del sistema operativo, no tiene las limitaciones de la máquina virtual Flash ni las políticas de seguridad, así que podemos crear, abrir, modificar y guardar cualquier archivo.
Si unimos todo esto con sqlite obtenemos lo que buscamos ya que AIR trae soporte nativo para sqlite con lo que guardar y consultar datos con sentencias sql no será un problema, más sencillo imposible.
AIR permite dos modos de trabajo con sqlite, síncrono y asíncrono. La diferencia es obvia, en el primer tipo se espera a que la ejecución de las instrucciones sql termine para continuar la ejecución de la aplicación, mientras que en el modo asíncrono se utilizan eventos que se disparan cuando se da por finalizada la consulta. En modo sincrono debemos ejecutar todo enjaulado en estructuras try/catch para prevenir errores y excepciones.
Aunque puedes crear la base de datos directamente desde la propia aplicación con sentencias CREATE TABLE, yo prefiero distribuir la aplicación con la base de datos ya creada, es mucho más cómodo. Para crearlas suelo usar dos utilidades:
- Sqlite Database Browser. Sencilla y freeware.
- SQLite2008 Pro Enterprise Manager. También freeware pero mucho más potente. En el link que he puesto está al final de la página.
También puedes hacer tu propia aplicación AIR para gestionar bases de datos sqlite, no conozco ninguna pero sería muy útil. ¿Quién se atreve?
Con cualquiera de ellas podremos crear la estructura de nuestra base de datos que copiaremos en el directorio del código fuente, para que al compilarla y empaquetarla se distribuya con ella.
Como no todos los sistemas operativos permiten a cualquier usuario escribir en la ruta de instalación de las aplicaciones, lo mejor y más recomendable es copiar la base de datos “base” en la carpeta de usuario del cliente que está ejecutándola ya que ahí siempre tiene permisos. Para hacerlo AIR nos provee de todos los mecanismos necesarios.
Con los métodos userDirectory y applicationDirectory de la clase File accedemos a las rutas de usuario y de la aplicación respectivamente independientemente del sistema operativo sobre el que está corriendo la aplicación, con lo cual hacemos el proceso completamente transparente.
-
var a:File=File.userDirectory.resolvePath("basedatos.db");
-
if(!a.exists){
-
var b:File=File.applicationStorageDirectory.resolvePath("basededatos.db");
-
b.copyTo(a, true);
-
}
Sencillo y evidente, sobran más explicaciones. Sabiendo esto es ya muy fácil conectar a la base de datos. Utilicemos el método síncrono antes comentado.
-
private var dbFile:File;
-
private var conn:SQLConnection;
-
private var q:SQLStatement;
-
-
private function iniciaDB():void {
-
var dbFile:File=File.userDirectory.resolvePath("basededatos.db");
-
if(!dbFile.exists){
-
var b:File=File.applicationStorageDirectory.resolvePath("basededatos.db");
-
b.copyTo(dbFile, true);
-
}
-
conn = new SQLConnection();
-
try{
-
conn.open(dbFile);
-
}catch (error:SQLError){
-
Alert.show("ERROR ABRIENDO BBDD "+error.message+" "+error.details);
-
}
-
}
¡Ya estamos dentro de la base de datos! Sólo nos queda ejecutar consultas y recuperar los resultados. No tiene mucha ciencia. Veamos un ejemplo para que queda bien claro.
-
var q:SQLStatement;
-
var result:SQLResult;
-
-
q.text = "SELECT campo1, campo2 FROM tabla";
-
-
try{
-
q.execute();
-
result=q.getResult();
-
if(result.data){
-
var numResults:int = result.data.length;
-
for (var i:int = 0; i < numResults; i++){
-
var r:Object = result.data[i];
-
//accedemos a los campos desde el objeto, r.campo1, r.campo2
-
}
-
}
-
}catch (error:SQLError){
-
//la consulta nos ha devuelto un error
-
}
Eso es todo como iniciación sqlite desde AIR. Del mismo modo se pueden ejecutar instrucciones INSERT, DELETE…
A partir de aquí puede seguir cualquiera
.
En el próximo y último capítulo veremos como hacer ventanas de notificación instantáneas y no intrusivas, del estilo de los avisos de conexión del Messenger
.
» Leer más, comentarios, etc...
PROGRAMANDO EN .NET
Recursos Silverlight
Febrero 25th, 2009 - [Enlace local]
Estoy empezando un proyecto personal con Silverlight (sí, es que no me llega con el trabajo, necesito más :P) y como siempre que se empieza con una nueva tecnología es bueno tener buen material para aprender, así que iré poniendo los tutoriales que vaya encontrando y todo lo que vea interesante para comenzar a trastear con Silverlight :)Por supuesto, se agradecerá cualquier aportación a "la causa
» Leer más, comentarios, etc...
phpleo.Blog
Dailymotion creado con Symfony framework
Febrero 25th, 2009 - [Enlace local]
Así es y se me había pasado publicar esta gran noticia, el sitio http://www.dailymotion.com/ ha sido desarrollado con el framework Symfony. Pueden ver el resto de las notas en el sitio oficial: Dailymotion, powered by symfony, y en español aqui: Dailymotion también utiliza Symfony.
» Leer más, comentarios, etc...
PHPBSD.net » webmaster
Nueva edición de la PHP UK Conference
Febrero 24th, 2009 - [Enlace local]
Este Viernes 27 de Febrero nuestros amigos de phpLondon organizan su conferencia anual de PHP, la PHP UK Conference 2009, sin duda una de las conferencias de PHP con más renombre y una de las que cae relativamente cerca (si vives en España).
Este año pinta realmente interesante con presentaciones muy variadas, puedes revisar la agenda completa en la web del evento. Entre otros temas se hablará sobre como vivir (o sobrevivir) con los frameworks PHP, mitos sobre symfony, un poco de REST, Flex y AIR, Drizzle, PHP 5.3 y 6.0 (namespaces, funciones lambda, etc.)… incluso uno de Microsoft nos “intentará” descubrir Windows como servidor para aplicaciones PHP (esto no me lo pierdo).
Aunque entre viaje, estancia y entrada asistir tiene un coste considerable es una pequeña aventura PHP que merece la pena. Como siempre en este tipo de eventos a parte de los nuevos conocimientos que se puedan adquirir se ha de valorar la posibilidad de networking con un buen número de gurus en la materia.
PS: y si el presupuesto no te lo permite (o en tu empresa no quieren pagártelo) siempre puedes esperar a la siguiente edición de la PHP Barcelona Conference :)
Entradas relacionadas:
- Falta poco para la International PHP Conference 2006 El 5 de Noviembre se celebrará en Frankfurt la sexta...
- Primera edición de la Barcelona PHP Workshop Con los del grupo de programadores PHP de Barcelona ya...
- Conferencia internacional de PHP en Barcelona El próximo 27 de Setiembre los de grupo de programadores...
» Leer más, comentarios, etc...
Buayacorp
Gmail is dead
Febrero 24th, 2009 - [Enlace local]
Al parecer Gmail lleva caido por un buen tiempo.
2/24/2009
We’re aware of a problem with Gmail affecting a number of users. This problem occurred at approximately 1.30AM Pacific Time. We’re working hard to resolve this problem and will post updates as we have them. We apologize for any inconvenience that this has caused.
Es bastante frustrante no poder leer los correos cuando realmente necesitas hacerlo. Creo que es tiempo de replicar los mails en otros servidores.
» Leer más, comentarios, etc...
Picando Código
Mario Galaxy y Queen: Don’t stop me now
Febrero 24th, 2009 - [Enlace local]
Miré este video en PixFans que su vez lo vió en Ecetia, y tuve que re publicarlo. Es excelente. Muestra escenas y gameplay de Mario Galaxy para Nintendo Wii, editadas con el tema “Don’t stop me now” de Queen. Por más que no les guste Mario o los videojuegos, es recomendable:
» Leer más, comentarios, etc...
Cerebro en la Sombra » Técnico
Sindicado en Planet Webdev
Febrero 24th, 2009 - [Enlace local]
Si el verano pasado añadía mi blog (o más bien me lo aceptaban
) en Planeta Código, ahora comienzo a aparecer en Planet Webdev. Creo que es una buena manera de que gente que habitualmente no lee tus artículos pueda llegar a ellos indirectamente y, si de paso, les sirven de algo, mejor que mejor.
Comencé a escribir para compartir mis experiencias de los últimos años como técnico aunque la realidad es que me ha servido para recordar cosas y conceptos que hace tiempo tenía olvidados. El objetivo es, sencillamente, aprender escribiendo.
A lo largo de este año posiblemente se vea un cambio de orientación reduciendo los artículos más técnicos y enfocándome más hacia la opinión, gestión de proyectos, management… espero que a todos os siga interesando igual.
Un abrazo a todos.
» Leer más, comentarios, etc...
Picando Código
QWERTY vs. DVORAK: Estudio práctico
Febrero 23rd, 2009 - [Enlace local]

DVORAK vs. QWERTY
Respecto al post:
Mito desmitificado: Qwerty vs. Dvorak
Hoy me encontré en el blog de fcr un estudio bastante más práctico sobre el flame de Qwerty vs. Dvorak. En él presenta una comparación de Qwerty y Dvorak de una forma bien práctica usando sus habilidades en procesamiento de texto con Grep, Awk y Sed.
Lo bueno de la programación es que la única forma de tener razón es teniendo razón. Y simplemente hay que probarlo. En este post en particular de fcr, en la forma en que plantea que Dvorak es superior, no queda otra que decir que tiene razón.
Lo prueba calculando la cantidad de palabras que se pueden escribir con la fila del medio del teclado, el porcentaje de las veces hay que mover el mismo dedo al escribir dos teclas sucesivas, e incluso compara qwerty con teclados al azar. Los resultados son innegables.
Todo esto lo demuestra mediante scripts, y llegando a la conclusión de que hay que ser vagos por no querer volver a aprender, o necios al negar la superioridad de dvorak. Yo soy lo primero
De todas formas no descarto que algun día me ponga a aprender a usar Dvorak.
Visiten su blog y busquen la entrada, muy bueno:
¿Cómo puede haber gente usando dvorak?
Dedicado a Gonzalo que usa Dvorak y tiene que sufrir la discriminación de algunos compañeros de trabajo…
» Leer más, comentarios, etc...
Picando Código
Las mascotas de Mozilla Firefox
Febrero 23rd, 2009 - [Enlace local]

Mozilla Firefox
La mayoría de los navegantes en Internet reconocen el logo de Mozilla Firefox. A pesar de las confusiones (por un zorro por el significado de “Fox”), se sabe hoy en día que se trata de un Ailurus fulgens, o “panda rojo”.Firefox es uno de los nombres que recibe el panda rojo en inglés.
Pero aquellos familiarizados con la historia de Mozilla recordarán que no siempre fue esta la mascota de dicho navegador. En un principio, el nombre era Mozilla Phoenix/Firebird (pájaro de fuego). Debió ser cambiado ya que descubrieron la existencia de otro proyecto Open Source: Firebird - un servidor de base de datos.
El cambio se llevó a cabo, así como el cambio de logo. Seguramente estarán de acuerdo conmigo que le vino bastante bien el cambio de logo, aunque a lo mejor la mascota anterior tenía un carisma distinto (épico si se quiere…). El logo:

Mozilla Firebird
¿Porqué “Firefox”? Según los desarrolladores: Es similar a Firebird. Es fácil de recordar. Suena bien. Es único. Nos gusta. Y no pudimos encontrar otro proyecto o compañía siquiera remotamente similar a un navegador web que use el mismo nombre.
Además del conocido panda rojo abrazado al planeta, Mozilla Firefox cuenta con mascotas localizadas en distintas partes del mundo.
Kit

Mascotas Firefox - Kit
Se presentó a los desarrolladores web como un nuevo aliado en la lucha por estándares abiertos en la red. Nació en el Developer’s Summit de Firefox en 2006 con el nombre de Renardo. Fue ideado por Chris Beard e ilustrado con un trackpad y Adobe Illustrator por Sean Martell. Lo llamaron Kit, por “Developer Kit”.
Fue usado en una campaña por mantener los estándares web bajo el lema “Don’t hurt the web” (no lastimes a la red).
Se publicaron varios fondos de escritorio bajo licencia Creative Commons Attributions-Non Comercial cubiertos por la política de marca registrada de Mozilla. También se publicaron posters y avatares para foros, blogs, etc.
Pueden encontrar los fondos de escritorio en varias resoluciones en este enlace, y una remera con el mismo diseño en la Tienda Mozilla.
Foxmosa

Foxmosa es a mascota taiwanesa de Firefox. Fue creada por Tatit, un ilustrador de la comunidad Mozilla en Taiwan hace unos años para promover Firefox 2. Desde entonces también fue usada para promover fiestas del Download Day de Firefox y Firefox 3.
También se está usando para promocionar Firefox en una gira por Taiwan, donde se sacan fotos de la mascota al rededor de la isla. Pueden ver fotos de la gira en Mozilla Links - Taiwanese Edition.
La isla principal de Taiwan es conocida como Formosa (del portugués (Ilha) Formosa, que significa “isla hermosa”). El nombre Foxmosa es un juego de palabras con Formosa. Además escrito en Chino: ???? es un juego de palabras con Formosa en Chino: ???? donde ?? significa orejas de zorro.
Fuente mozillalinks.org.
G-Fox
China no se queda atrás y cuenta también con su propia mascota para Firefox: G-Fox. En la página de Mozilla Links que presenta a G-Fox dicen que la G significa cualquier cosa positiva como bueno, genial, entre otras palabras… Se pueden descargar imágenes temáticas de las olimpíadas, banners y botones web, y cuatro fondos de escritorio de G-Fox, incluso un tema para Firefox 3 en esta página.
G-Fox sigue la estética de ojos grandes y saltones de muchos personajes animados asiáticos:

G-Fox

Foxkeh
Foxkeh
Por último, Japón no podía quedarse atrás. Y ellos también crearon una mascota propia para Firefox.
Foxkeh es más conocido, ya que muchos lo vimos en campañas de publicidad para el lanzamiento de Firefox 3.
Cuenta con su propio sitio web donde mensualmente se publican fondos de escritorio en forma de calendario (y sin calendario) con imágenes de Foxkeh. Además pueden descargarse imágenes, un tema para Firefox, e incluso un PDF bastante interesante con la historia de Mozilla Firefox.
Muchos lo recordarán como la mascota del Firefox 3 Download Day.
Forks
El hecho de ser Software Libre, permite que Firefox cuente con “forks“, bifurcaciones en el desarrollo permitiendo la creación de otros proyectos con el mismo código fuente. Así es que existen Debian IceWeasel y GNU IceCat. Estos dos navegadores cuentan con sus respectivas mascotas: un gato de hielo y una comadreja de hielo:

GNU IceCat

Iceweasel
Obviamente, no podemos dejar afuera a quien empezó todo esto:

» Leer más, comentarios, etc...
más que código - Articulo - Programación
Crear una versión para móviles
Febrero 23rd, 2009 - [Enlace local]
La semana pasada preparé la versión para móviles de Libro de Notas. La versión para móviles se puede ver aquí: Libro de Notas – Versión Movil.
Recuerdo que hace años, la creación de un sitio para móviles tenía su complicación, porque se utilizaba toda una pila de protocolos y lenguajes propios. La verdad es que hoy en día resulta sencillo. Para crear una versión móvil:
- Utiliza HTML sencillo que cualquier dispositivo móvil es capaz de interpretar. Olvídate de capas, de efectos javascript y demás florituras.
- Lo importante es reducir la complejidad de la información que se muestra. Piensa en cual va a ser el uso que se le va a dar a la versión móvil y elimina el resto. Por ejemplo, en este caso la función principal de la versión móvil es que alguien pueda leer los artículos de producción propia, por lo que se han eliminado de la versión móvil las demás opciones (páginas de info, otros artículos, comentarios, etc)
- Cuando te quedes con la información básica a mostrar, simplifica esta también. Cuanto menos texto se cargue, mejor, tanto por comodidad de lectura, como para reducir los kb de cada página (algunos dispositivos tienen problemas con páginas muy “pesadas”). Por ejemplo, se muestran solo 10 artículos por página, y solo la entradilla de los mismos.
» Leer más, comentarios, etc...
The New Cult of Dead Cow » desarrollo
Algo para considerar
Febrero 23rd, 2009 - [Enlace local]
Todo valor introducido por el usuario es tonto o malicioso, a menos que se demuestre lo contrario.
Michael Howard
Experto en seguridad de Microsoft
Writting Secure Code (ISBN 0-7356-1722-8)
Via: ExeBlog
» Leer más, comentarios, etc...
Cerebro en la Sombra » Técnico
Adobe AIR IV - Detectando el estado de la conexión
Febrero 23rd, 2009 - [Enlace local]
Continuamos con la serie de artíulos sobre Adobe Air. Hoy trataremos un tema curioso como es detectar si el cliente dispone de conexión a Internet. ¿Qué utilidad puede tener saberlo? Sencillo, permitir que la aplicación trabaje en modos offline y online.
Esta parte viene bastante bien explicada en el manual. Existe un evento “NETWORK_CHANGE” que no sirve para nuestro propósito
. ¿Para qué sirve entonces? Para detectar cambios en las interfaces de red en general. Este evento se dispara cada vez que se producen modificaciones en alguna de las interfaces de red de la máquina que ejecuta la aplicación, lo que no quiere decir que cambie el estado de la conexión a Internet ya que este evento no sabe si hay o no salida a Internet ni a través de cual de las interfaces se sale. ¿Qué utilidad puede tener entonces? No lo sé
, pero ahí está el evento por si lo quieres utilizar para algo…
-
NativeApplication.nativeApplication.addEventListener(Event.NETWORK_CHANGE, onNetworkChange);
-
function onNetworkChange(event:Event)
-
{
-
//Check resource availability
-
}
Para nuestro propósito debemos utilizar la clase URLMonitor que, como su propio nombre indica, sirve para monitorizar una URL. En efecto, así es como AIR detecta el estado de la conexión, conectando periódicamente a la URL que le indiquemos. Si no puede alcanzarla asume que te has quedado sin salida a Internet. Vamos, que si estábais esperando algo superavanzado y chulo, podéis seguir esperando, es el método más tradicional que existe: leches, no puedo conectar con Google, habré perdido la wifi. Es lo mismo
.
-
import air.net.URLMonitor;
-
import flash.net.URLRequest;
-
import flash.events.StatusEvent;
-
-
var monitor:URLMonitor;
-
monitor = new URLMonitor(new URLRequest(‘http://www.adobe.com’));
-
monitor.addEventListener(StatusEvent.STATUS, announceStatus);
-
monitor.start();
-
-
function announceStatus(e:StatusEvent):void {
-
trace("Status change. Current status: " + monitor.available);
-
}
Dentro de la función, lo que nos interesa es el valor de monitor.available, true ó false, lo que nos indicará si podemos o no conectar con la URL. Éste es, en realidad, el concepto de URLMonitor, determinar si una URL es alcanzable o no. Que una URL no sea alcanzable no quiere decir que no tengas acceso a Internet, sólo que no tienes con aquella URL. La comprobación, por tanto, debería hacerse con la URL del backend de nuestra aplicación y no con cualquier URL en general ya que de quien depende nuestra aplicación es de nuestro backend, no de Google
.
El mismo sistema se puede utilizar para comprobar el estado de cualquier aplicación que escuche en un puerto distinto al 80. La explicación sería exactamente la misma y lo haríamos de este modo:
-
import air.net.ServiceMonitor;
-
import flash.events.StatusEvent;
-
-
socketMonitor = new SocketMonitor(‘www.adobe.com’,6667);
-
socketMonitor.addEventListener(StatusEvent.STATUS, socketStatusChange);
-
socketMonitor.start();
-
-
function announceStatus(e:StatusEvent):void {
-
trace("Status change. Current status: " + socketMonitor.available);
-
}
En el próximo capítulo veremos cómo añadir potencia a nuestras aplicaciones utilizando sqllite para guardar datos offline. Si combinamos la posibilidad de guardar datos en la aplicación con la de comprobar el estado de red contra el backend podremos hacer que nuestra aplicación funcione en modo offline guardando lo que necesitase enviar y procesándolo cuando tenga conexión. Creo que no se ha entendido bien, pongamos un ejemplo práctico.
Tengo una aplicación que permite enviar SMS a móviles a través de una pasarela HTTP que será quien haga los envíos. Mi aplicación pide el número de destino y el texto a enviar, conecta con la pasarela y le pasa el mensaje que quiero enviar. Como es lógico, si en el momento de enviar no tengo conexión con la pasarela, no podré enviar el SMS. Tengamos ahora presente lo que acabamos de ver en este artículo… ¡puedo saber en cada momento si la pasarela HTTP es alcanzable! Si cuando voy a hacer el envío no tengo conexión, los guardo en mi base de datos sqllite y cuando cambie el estado de la conexión (URLMonitor me avisará) lanzo todos los envíos pendientes.
Seguro que si lo piensas un poco tú también le encuentras alguna utilidad
. Lo dicho, en el próximo capítulo… sqllite.
» Leer más, comentarios, etc...
Blog de Julio César Pérez Arques
Participación en el podcast Servicios Web de javaHispano
Febrero 22nd, 2009 - [Enlace local]
La semana pasada fue publicado el podcast sobre SOA y Servicios Web (SOAP/REST) de javaHispano en el que tuve el privilegio de participar junto a Leonardo de Seta, Alfredo Casado y Jorge Rubira, como conductor y productor del podcast.
La experiencia me encantó. En cuanto pasaron los típicos primeros minutos de nerviosismo escénico, me sentí muy cómodo y disfruté mucho charlando durante más de una hora con estos 3 fenómenos de nuestro sector.
El podcast dió para mucho, sin duda el tema lo merecía. Lejos del debate fanático SOAP vs REST que recorre internet, el mensaje que intentamos transmitir es que ambas son tecnologías perfectamente válidas para integrar sistemas, y más que enfrentarse vienen a cubrir un ámbito diferente cada una, con un amplio solapamiento entre ambas. La dificultad radica, por tanto, en saber elegir cúal se adapta mejor a una situación particular.
Por tanto, en realidad la problemática de la integración de sistemas no es sólo una cuestión sobre tecnología (implementación) sino que cobra mucha más importancia la pericia de las personas que deben analizar y diseñar inteligentemente los servicios que poblarán la SOA de una organización.
» Leer más, comentarios, etc...
PHPBSD.net » webmaster
Administrar servidores web vía SSH sin contraseña
Febrero 22nd, 2009 - [Enlace local]
Desde hace muchos años y por mucho que evolucione el desarrollo web e internet el SSH, al igual que el CVS/SVN, sigue siendo una de las herramientas más usada para administrar aplicaciones web y sus respectivos servidores.
Una de las funciones que para mi resulta más útil del SSH a parte de lo evidente que es poder iniciar sesión en nuestro servidor, es poder ejecutar comandos remotamente y así fácilmente poder escribir scripts (PHP y/o de shell) que interactúen entre máquinas. Por ejemplo para subir la última release de nuestra web a producción, borrar cachés de disco, reiniciar algún que otro Apache que se ha quedado tonto, etc.
Algo que resulta muy útil en estos casos es poder usar SSH entre distintas máquinas sin necesidad de ir introduciendo la contraseña. Para conseguirlo, y entendiendo bien el riesgo de seguridad que puede suponer, hemos de seguir los siguientes pasos:
[1] Iniciamos sesión en el servidor A con el usuario que queremos dejar libre de contraseña y ejecutamos:
$ ssh-keygen -t rsa
[2] Añadimos la clave publica generada (.ssh/id_rsa.pub) al archivo de claves aceptadas del servidor B, por ejemplo vía SCP:
$ scp .ssh/id_rsa.pub usuario@B:.ssh/authorized_keys
Se ha de tener en cuenta que el anterior comando sobreescribe el archivo y podemos tener más de una clave aceptada en authorized_keys.
[3] Listos! Desde el servidor A ya podemos entrar en B sin contraseña. Si estamos logueados con el usuario correcto sólo será necesario ejecutar:
$ ssh B
Al programar en PHP por supuesto que siempre tienes la alternativa de realizarlo todo vía peticiones HTTP aunque para determinadas tareas y situaciones los scripts CLI son una gran alternativa (y los puedes hacer muy chulos usando ncurses).
Entradas relacionadas:
- Instalación del APC (Alternative PHP Cache) sobre FreeBSD Como prometía en el post dedicado a la optimización de...
- Instalar clases PEAR en un hosting compartido En muchas ocasiones disponemos de un servicio de hosting compartido...
» Leer más, comentarios, etc...
EsLoMas.com
Copias de seguridad de MySQL
Febrero 22nd, 2009 - [Enlace local]
Durante bastante tiempo he estado realizando copias de seguridad de las bases de datos con las que trabajo utilizando únicamente un proceso periódico que hacía un dump del contenido de las bases de datos existentes, mediante crontab
y mysqldump
.
Hace poco, a raíz de que tuve que hacer un cambio de servidor me dio por investigar si había alguna herramienta que permitiera hacer esto de una forma un poco mejor, y encontré una utilidad llamada AutoMySQLBackup.
» Leer más, comentarios, etc...
The New Cult of Dead Cow » desarrollo
Sabado 25 de Abril, Flisol en la SIPAN
Febrero 21st, 2009 - [Enlace local]
El sabado 25 de Abril, se llevara a cabo una vez mas el Festival Latinoamericano de Software Libre. Esta vez estare en la Universidad Señor de Sipan hablando de acceso a datos en php, especificamente de mi modelo de acceso a datos phpORM.
Tambien estaran Ernesto Quiñones ( kami ) quien como ya es costumbre nos mostrara las bondades de Postgresql y JuanPE, un chiclayano alimeñado, con su ponencia sobre desarrollo de aplicaciones Web con P4A.
» Leer más, comentarios, etc...
PHPBSD.net » webmaster
Actualizar un WordPress a la última versión
Febrero 21st, 2009 - [Enlace local]
Es un procedimiento muy sencillo que está perfectamente detallado en la documentación de Wordpress aunque quizás faltan un par de puntos por explicar un poco mejor.
Si nuestra intención es hacer borrón y cuenta nueva con nuestro blog eliminando todos los archivos pero conservando la base de datos los pasos a seguir son los siguientes:
1) Como siempre antes de empezar cualquier tarea parecida backup de todo. Incluso es buena idea montar el blog entero en otro sitio para después poder comparar el viejo con el nuevo.
2) Desactivamos todos los plugins y seleccionamos el tema por defecto. Aunque en nuestro caso como tenemos intención de borrar todos los archivos el nuevo Wordpress desactivará todo lo que no encuentre.
3) Borramos todos los archivos anteriores. Si tenemos el wordpress mezclado con otras cosas el comando en cuestión es algo como:
$ rm -rf index.php license.txt readme.html wp-* xmlrpc.php
4) Descomprimimos la última versión de Wordpress en el mismo sitio donde teníamos la anterior.
5) Editamos el nuevo wp-config.php y añadimos los datos de conexión y nombre de la BD.
6) Comprobamos en qué codificación está trabajando nuestro Wordpress. Por ejemplo con:
mysql> show create table wp_posts;
Nos fijamos en el CHARSET utilizado y definimos DB_CHARSET con el mismo valor. En el caso de ser "utf8" no tenemos que tocar nada pero si estamos con "latin1" es necesario indicarlo en wp-config.php con:
7) Iniciamos el programa de actualización apuntando el navegador a la URL habitual del dashborad (p.e. http://tublog.es/wp-admin/)
8) Automáticamente aparecerá un mensaje diciendo que debemos proceder con la actualización de la BD. Hacemos clic en "Siguiente" y cruzamos los dedos... si todo va bien te aparecerá algo como "Update successful".
9) Wordpress casi actualizado!
Digo casi porque casi seguro vamos a necesitar realizar alguno de lo siguientes pasos adicionales:
- Si habíamos subido archivos al Wordpress utilizando su dashboard hemos de copiar la anterior carpeta wp-content/uploads a la nueva instalación.
- Si trabajábamos con algún plugin para los tags debemos lanzar la importación manualmente desde el dashboard, por ejemplo en el caso del UTW desde "Herramientas" -> "Importar" -> "Ultimate Tag Warrior".
- Si ha pasado mucho tiempo desde la última actualización no es mala idea repasarse las opciones de configuración de Wordpress y comprobar que todo está ok, especialmente la sección de Permalinks.
- Como hemos empezado de nuevo en lo que a código PHP se refiere es necesario volver a instalar los plugins que echemos en falta y un tema que nos guste. Por supuesto descargando las últimas versiones de todo y no aprovechando nada del anterior WP para así sacar el máximo partido de las nuevas funcionalidades (en parte uno de los objetivos del procedimiento descrito en este post).
Entradas relacionadas:
- Internacionalización de temas en WordPress usando gettext WordPress está disponible en varios idiomas gracias al sistema de...
- Títulos un poco más SEO y en español para WordPress Los títulos de las páginas son uno de los factores...
- Usando mod_rewrite y FeedBurner para las feeds de un blog con Wordpress Los feeds son una de las formas más prácticas de...


