Buayacorp
7 nuevos problemas de seguridad en WordPress
Julio 31st, 2007 - [Enlace local]
Hace algunas horas acaban de reportar 7 problemas de seguridad en WordPress:
- Wordpress Persistant XSS Vulnerability in the Default Theme (v.2.2): Los parámetros para la imagen y color de la cabecera en el tema por omisión de WordPress (Kubrick) son vulnerables. Aunque no lo probé, me parece que es parecido al que reporté hace tiempo.
- Wordpress /options.php SQL Injection Vulnerability: El parámetro
page_optionsno está correctamente validado enwp-admin/options.php. Sólo los usuarios con nivel Administrador pueden explotar esta vulnerabilidad. - Wordpress /options.php Information Disclosure: Esta vulnerabilidad se deriva de la anterior, porque en
wp-admin/options.phpse asume que el nombre de las opciones son seguras. - Wordpress /edit-comments.php Database Error (Bug): Simplemente muestra un error en la consulta si el valor de la página es negativo.
- Wordpress /link-import.php XSS Vulnerability: El parámetro
cat_idno es filtrado adecuadamente, para explotarlo requiere tener un valor adecuado para el parámetro_wpnonce. - Wordpress /upload.php XSS Vulnerability: En este caso el parámetro
stylees inseguro.
La misma persona que reportó estos bugs se tomó el trabajo de realizar un gusano que se encarga de parchar los blogs vulnerables, siempre y cuando se el servidor web tenga permisos de escritura en los archivos afectados.
En cada uno de los tickets abiertos ya existen parches oficiales disponibles (4689, 4690, 4691 y 4692). Mi parche para corregir esos problemas es ligeramente diferente:
===================================================================
--- wp-admin/edit-comments.php (revision 5825)
+++ wp-admin/edit-comments.php (working copy)
@@ -76,7 +76,7 @@
endif;
if ( isset( $_GET['apage'] ) )
- $page = (int) $_GET['apage'];
+ $page = (int) abs($_GET['apage']);
else
$page = 1;
Index: wp-admin/link-import.php
===================================================================
--- wp-admin/link-import.php (revision 5825)
+++ wp-admin/link-import.php (working copy)
@@ -73,7 +73,7 @@
<h2><?php _e('Importing...') ?></h2>
<?php
- $cat_id = $_POST['cat_id'];
+ $cat_id = (int) $_POST['cat_id'];
if ( $cat_id == '' || $cat_id == 0 )
$cat_id = 1;
Index: wp-admin/options.php
===================================================================
--- wp-admin/options.php (revision 5825)
+++ wp-admin/options.php (working copy)
@@ -143,6 +143,7 @@
$options_to_update[] = $option->option_name;
$class = 'all-options';
}
+ $option->option_name = attribute_escape($option->option_name);
echo "
<tr>
<th scope='row'><label for='$option->option_name'>$option->option_name</label></th>
Index: wp-admin/upload-functions.php
===================================================================
--- wp-admin/upload-functions.php (revision 5825)
+++ wp-admin/upload-functions.php (working copy)
@@ -104,6 +104,8 @@
function wp_upload_form() {
$id = get_the_ID();
global $post_id, $tab, $style;
+ $style = attribute_escape($style);
+ $post_id = (int) $post_id;
$enctype = $id ? '' : ' enctype="multipart/form-data"';
?>
<form<?php echo $enctype; ?> id="upload-file" method="post" action="<?php echo get_option('siteurl') . "/wp-admin/upload.php?style=$style&tab=upload&post_id=$post_id"; ?>">
Index: wp-includes/functions.php
===================================================================
--- wp-includes/functions.php (revision 5825)
+++ wp-includes/functions.php (working copy)
@@ -206,6 +206,7 @@
function get_option($setting) {
global $wpdb;
+ $setting = $wpdb->escape(stripslashes($setting));
// Allow plugins to short-circuit options.
$pre = apply_filters( 'pre_option_' . $setting, false );
if ( $pre )
@@ -305,6 +306,7 @@
function update_option($option_name, $newvalue) {
global $wpdb;
+ $name = preg_replace('/[^a-z\d_-]/i', '', trim($name));
wp_protect_special_option($option_name);
if ( is_string($newvalue) )
@@ -352,6 +354,7 @@
function add_option($name, $value = '', $description = '', $autoload = 'yes') {
global $wpdb;
+ $name = preg_replace('/[^a-z\d_-]/i', '', trim($name));
wp_protect_special_option($name);
// Make sure the option doesn't already exist. We can check the 'notoptions' cache before we ask for a db query
@@ -391,6 +394,7 @@
wp_protect_special_option($name);
+ $name = $wpdb->escape(stripslashes($name));
// Get the ID, if no ID then return
$option = $wpdb->get_row("SELECT option_id, autoload FROM $wpdb->options WHERE option_name = '$name'");
if ( !$option->option_id ) return false;
Los que no sepan — o no quieran — aplicar manualmente este parche no oficial, pueden descargar el conjunto de archivos modificados para la versión 2.2.1, úsenlo bajo vuestra propia responsabilidad.
» Leer más, comentarios, etc...
Pensamientos ágiles
¿Vale la pena buscar colaboradores en sf.net?
Julio 31st, 2007 - [Enlace local]
Ahà queda esta pregunta abierta. Y es que tengo que reconcer que el servicio de recruitment de SourceForge.net me frustra. En fin, aunque hay que reconocer que SourceForge no tiene ninguna culpa; bastante hacen ofreciéndome ese servicio gratuito.
El caso es que lo que os voy a contar ya no es la primera, ni la segunda vez que me pasa. Pero iluso de mi, la semana pasada volvà a picar, y se me ocurrió publicar un trabajo buscando gente interesada en hacer algo con jLibrary. La idea era (y es) probar jLibrary, crear alguna aplicación interesante sobre la web (incluso tipo scribd, que la gente la pueda usar para probar frameworks web; en fin que es un campo de pruebas interesante, y se me ocurrió publicar un anuncio para ver si habÃa alguien interesado en el Open Source y sus oportunidades.
Durante las tres semanas que ha estado el anuncio abierto me han llegado mensajes de trece personas interesadas, cosa que me parece que está bastante bien, y se asimila a lo que ya he tenido en las otras ocasiones que he publicado un trabajo. Lo que me frustra es que la mayorÃa de las personas que se ponen en contacto conmigo:
- No tienen ni idea de que va el proyecto o,
- tienen idea pero ni siquiera se lo han descargado y/o probado o,
- no tienen los conocimientos suficientes de Java para bajarse Maven y construir el proyecto o,
- tienen los conocimientos pero en cuanto ven que les pides un poco de esfuerzo para al menos construir el proyecto, ejecutar los unit tests, etc., se les baja el subidón inicial y prefieren buscar otra cosa más sencilla o,
- (y esta es la buena) asumen que es un trabajo remunerado. Lo siento, pero en esta ocasión va a ser que no.
Uno de los últimos me mató cuando me pedÃa que le enviase la documentación de sus tareas y diagramas de diseño que especificasen lo que tenÃa que hacer. No sé si lo hizo a propósito pero vaya bajón de moral.
En fin que tras mis experiencias buscando gente en sf.net me queda claro que los canales tradicionales: amigos, usuarios de tu aplicación, empresas interesadas, son mucho más productivos.
» Leer más, comentarios, etc...
Navegapolis
Los 12 principios de la programación
Julio 31st, 2007 - [Enlace local]
Los mejores principios para proyectos de software:
- Tu principal prioridad es no tomar iniciativas que te puedan hacer responsable de algo. Lo mejor es no tomar ninguna iniciativa.
- Los cambios de requisitos son un grano en el culo, sobre todo cuanto más tarde te los dicen. Házselo saber al cliente y haz que pague caro si está pensando siempre en cambios.
» Leer más, comentarios, etc...
fetishcode
Drupalcon Barcelona 2007
Julio 31st, 2007 - [Enlace local]
Del 19 al 22 de Septiembre se celebra en Barcelona(España) la conferencia Europea de Drupal.
La subscripción al evento cuesta 50€ pero quiza es una buena oportunidad para todos aquellos desarrolladores que esten adentrandose en el mundo de Drupal y quieran conocer mas a fondo la herramienta y hacia donde va dirigida.
Mas información en DrupalCon Barcelona 2007
En fetishcode inaguramos esta nueva sección, Drupal, donde se ira posteando informacion muy particular sobre este CMS ya que para tutoriales e informacion detallada ya existen otro tipo de portales dedicados exclusivamente a dicha herramienta.
» Leer más, comentarios, etc...
soft·in·spain
Ultimos dominios registrados
Julio 31st, 2007 - [Enlace local]
No tengo la actividad domainer de mi amigo Félix, pero de vez en cuando también registro dominios.
Suelo optar por dominios en los que pueda desarrollar algo, básicamente contenido que luego los buscadores puedan indexar y traer visitas, no únicamente por el nombre. Aunque ésto es complicado, sobre todo por la endémica falta de tiempo.
Últimos dominios registrados:
» Leer más, comentarios, etc...
niko's mini factory
Links for 2007-07-30 [del.icio.us]
Julio 31st, 2007 - [Enlace local]
- How to document use cases
Como documentar casos de uso - Why Good Developers are Promoted into Unhappiness
Porqué los buenos desarrolladores son promovidos a la infelicidad
» Leer más, comentarios, etc...
soft·in·spain
Google Earth
Julio 30th, 2007 - [Enlace local]
Es curioso como llega la gente a tu blog, en mi caso además de por el asunto del SPAM real, llegan buscando “curiosidades google heart“, porque en un comentario una persona se equivocó escribiendo google earth y parece que mucha gente también lo escribe mal.
Hoy he leÃdo que gearthblog, un blog dedicado en exclusiva a los mapas de google, ha sacado una versión en español: es.gearthblog.com
Asà que si has llegado a este blog buscando cosas sobre google earth, ya sabes que hay otros blogs que SI que hablan del tema. Que aproveche!!!
» Leer más, comentarios, etc...
Variable not found, 0:1
O todo el mundo está de vacaciones, o Google Analytics está hundido ;-D
Julio 30th, 2007 - [Enlace local]
El pasado miércoles 25 en el blog oficial de Google Analytics publicaban "Notice of Brief Processing Delay", un post donde comentaban que durante el dÃa habrÃa algunos retrasos. No sé si tendrá que ver con esto o con el jolgorio prevacacional, pero me encuentro en mi blog un total de cero visitantes desde hace un par de dÃas... ¡como en los viejos tiempos! :-D
Y aunque sé que es consuelo de tontos, alegra saber que le ocurre a más gente:
- http://groups.google.com/group/analytics-help-troubleshoot/browse_thread/thread/94acb7f4f84fe168/
- http://www.slicksurface.com/blog/2007/07/google-analytics-down-for-nearly-two.html
- http://groups.google.com/group/analytics-help-troubleshoot/browse_thread/thread/e660e578964bfbbe
- http://groups.google.com/group/analytics-help-basics/browse_thread/thread/3f312ea50966a39d
- http://groups.google.com/group/analytics-help-troubleshoot/browse_thread/thread/105dea7423696537/d1649dd6cdbb8c79#d1649dd6cdbb8c79
- etc.

En fin, espero al menos que no borren los datos...
Actualización, martes 31 de Julio: ya hay noticias oficiales por parte de Google sobre este retraso:
- http://analytics.blogspot.com/2007/07/update-temporary-reporting-delay-since.html
- http://analytics.blogspot.com/2007/07/reporting-delay-update.html
» Leer más, comentarios, etc...
Programación, literatura y otras artes menores » Programación
La programación y la literatura II
Julio 30th, 2007 - [Enlace local]
Desde hace un tiempo en España hay una fuerte polémica sobre el “intrusismoâ€? en la informática, lo pongo entre comillas porque pienso que no existe tal cosa. No niego que hayan profesionales de otras carreras en puestos que deberÃan desempeñar los ingenieros informáticos, eso es real, y es real en el mundo entero, llevo dos [...]
» Leer más, comentarios, etc...
soft·in·spain
Conclusiones B&B CampusParty
Julio 30th, 2007 - [Enlace local]
Ya muchos de los partÃcipes han dado su opinión, relacionando a todos los que fuimos, mostrando fotos, etc.
Uno, que no es famoso ni lo pretende y si muy inocente a pesar (o por) la edad, piensa que los bloggers más populares son como semidioses. En estos encuentros los ves de carne y hueso, humanos, cercanos, casi que se desmitifican. Lo cual no se si es bueno o malo.
Mi conclusión: que sirve para poner caras a los blogs que lees, crea relaciones personales que de otra forma es más complicado que ocurran, pueden surgir colaboraciones muy interesantes.
Recomiendo asistir a un B&B a todo aquel interesado en el asunto blog o, más ampliamente, en lo relacionado con internet.
» Leer más, comentarios, etc...
Buayacorp
Herramientas de automatización de BLIND SQL INJECTION (I de III)
Julio 30th, 2007 - [Enlace local]
Para aquellos que conozcan las técnicas de inyección de código a ciegas sabrán el divertido calvario que hay que pasar para realizar buenas cadenas de inyección (tipo comparando los resultados con valores ASCII, hexadecimales…).
Voy a hablaros sobre algunas herramientas de automatización de estas tareas - algunas de las herramientas usadas fueron mencionadas por alex en las 15 herramientas gratuitas para detectar inyección SQL -.
# Mysql_Bftools

Herramienta de pen-test implementada y escrita en C. Mediante fuerza bruta prueba miles de combinaciones (en modo de peticiones/inyecciones) al servidor/aplicación. Se interactúa desde linea de comandos y la estructura es la siguiente
[1] Función que queramos adivinar… soporta system_user(), version()….
[2] Palabra que haya en la página para saber si nos encontramos ante una página distinta o estamos en la página original.
Aparte mysqbftools viene acompañado por dos herramientas más: mysqlget y mysqlst.
Mysqlget te permite bajar archivos de la aplicación vulnerable y mysqlst es una herramientas usada para leer y parsear tablas sin necesidad de bajarse toda la base de datos.
En la próxima veremos y explicaremos el funcionamiento de Sqlninja.
» Leer más, comentarios, etc...
programania
5 razones para no utilizar Spring
Julio 30th, 2007 - [Enlace local]
Hace tiempo Luis me envÃo este artÃculo y la verdad es que me dejó bastante mal ya que soy un fiel defensor de Spring, pero por otro lado me atrajo ya que es de los pocos que se atrevÃa a criticar a Spring. Lo tenÃa en el tintero ya que el inglés utilizado me ha resultado bastante complicado de entender.
El autor da 5 razones para no utilizar Spring:
- La primera dice que la configuración de Spring está inflada y que si se tienen 100 acciones que trabajan con 100 servicios hace falta configurar cada uno de ellos.
- Es una crÃtica a los archivos XML de configuración en sà mismos.
- Perdida de las ventajas del tipado fuerte, ya que al injectar objetos los fallos sólo pueden dectarse en tiempo de ejecución.
- El container de Spring no es ligero.
- Spring promete un software poco acoplado, pero en realidad (según la opinión del autor) , no se preocupa mucho por ello y cree que una vez introducido en la aplicación ésta no puede vivir sin él.
Mi opinión al respecto de estas cuestiones es la siguiente:
- Es verdad que la configuración de Spring es un poco inflada, pero si se utiliza un archivo XML de configuración siempre vamos a tener este problema. El de Spring, en concreto, no es de los peores. Yo abogo por utilizar en Java Conventions como Ruby on Rails, pero todavÃa no hay ningún framework que ofrezca inyección de dependencias por Conventions.De paso también contesto al punto 2.
- Es verdad que no se puede evaluar si un objeto ha sido bien inyectado, más que en tiempo de ejecución, pero hoy por hoy no hay otra forma de inyectar objetos y Spring proporciona otra serie de ventajas que tambÃen tienen que ver con la inyección de dependencias muy interesantes como las plantillas para los frameworks ORM u otras plantillas para otros servicios, yo creo que merece la pena pagar el precio.
- Tiene razón que el container de Spring no es ligero, pero Spring está pensado para ser utilizado en aplicaciones en las que te lo puedas permitir, no tiene sentido utilizar Spring en una aplicación de tiempo real o en una aplicación para un móvil.
- En cuanto a lo de que no sea desacoplado no estoy de acuerdo, ya si Spring obliga a programar contra Interfaces, si un dÃa se decide no utilizar Spring basta con reimplementar esas interfaces y listo. Por otro, lado Spring no tiene los problemas que tenÃan los EJB ya que sólo eran ejecutables dentro del Container de EJB, Spring se puede ejecutar dentro de un Container Web o fuera de él en una aplicación Swing normal y corriente. Si se refiere a la implentación de las interfaces claro que queda ligada a Spring, ya que no se puede implementar algo con un framework sin que quede ligado a él, pero me parece una solución mucho mejor a EJB 2.0. El grado de desacoplamiento me parece bueno.
Estas son mis opiniones, pero no tengo tanto bagaje en la informática como para hablar ex cathedra, asà que, me gustarÃa conocer que pensaÃs vosotros.
» Leer más, comentarios, etc...
Pensamientos ágiles
Blogs de emprendedores
Julio 30th, 2007 - [Enlace local]
Javier Martin está recogiendo en Loogic una lista con los blogs de 100 emprendedores cuya mayorÃa desarrollan proyectos para Internet y hablan sobre ello en su blog.
La idea me parece muy buena. Eso sÃ, la mayorÃa parece estar relacionada con el mundo de los blogs, portales de noticias y cosas por el estilo, aunque hay más de una excepción muy interesante.
Si alguno se echa en falta, podéis darle un toque.
» Leer más, comentarios, etc...
Syntax Error
PuTTY: Una consola Linux en una ventana Windows
Julio 30th, 2007 - [Enlace local]
Continuando con la presentación de mis herramientas, le toca el turno al archiconocido PuTTY, un programita superliviano y superpotente, capaz de realizar una conexión SSH o Telnet a un servidor Linux (o cualquiera que lo acepte) y presentar la consola en una ventana redimensionable…
Se trata de un programa open source (ver Licencia) disponible para todas las versiones de Windows superiores a la 95 (actualmente la versión 0.60) y para entornos Unix.
Una de las mejores cosas de este programa es que no requiere ni instalación ni nada. Es un simple EXE que podemos ejecutar directamente. Al ejecutarlo nos aparece una pantalla como la siguiente:
La estructura de árbol de la izquierda se usa para definir las opciones del programa, a nivel de ventana, de conexión, y hasta para definir el buffer que el programa mantendrá.
En la zona de la derecha contamos con una caja de texto dónde especificaremos el host a conectar, ya sea una IP, un nombre o hasta algo como usuario@host.com, otra caja de texto con el puerto (22 para el SSH por defecto) que cabiará el valor si seleccionamos los radiobuttons que tenemos justo debajo. Sólo con ésto ya podrÃamos establecer una conexión presionando el botón Open.
Pero además podemos guardar los datos de conexión introducidos (ojo, antes de logarnos!). Para ello, con los datos de conexión puestos, vamos a la caja de texto llamada Saved Sessions e introducimos un nombre a nuestro gusto. Luego presionamos el botón Save y nos lo insertará en la lista inferior. Más adelante sólo deberemos seleccionarla y presionar el botón Load para que autocomplete las cajas de texto de conexión. Si en algun momento queremos eliminar una entrada de la lista, basta con seleccionarla y presionar el botón Delete.
Justo debajo tenemos unos radiobuttons para especificar que debe hacer el programa al finalizar una conexión. La primera opción Always cerrará la ventana al cerrar la conexión, la segunda Never dejará la ventana abierta, y la tercera sólo la cerrará si se cierra la conexión de forma normal (si se produce algún error quedara abierta con el mensaje (Inactive) en la barra de tÃtulo).
Cuando le damos al botón Open, nos intentará establecer una conexión con el host. Si es correcta, se nos presentará una ventana como la siguiente:
Donde ya tendremos la conexión establecida con el servidor. Asà que introducimos el usuario y la contraseña y a trabajar como si estuviéramos en una terminal directa.
Podremos usar todas las instrucciones y programas del sistema de la misma forma que en una consola directa del sistema siempre que sean en modo texto, incluidos programas que pinten pantallas completas como asistentes, configuradores, …
Para cerrar el programa de forma correcta, lo haremos como si saliéramos de una conexion normal, con exit o con Control+D.
Verdaderamente, ésta es una de las mini-aplicaciones más conocidas y mas usadas en el mundillo, mucho más explotables de lo que describo en este artÃculo. En definitiva, un imprescindible!
Salud.
» Leer más, comentarios, etc...
Ideas + IngenierÃa del Software
Fechas
Julio 30th, 2007 - [Enlace local]
Dilbert, real como la vida misma, como siempre.
» Leer más, comentarios, etc...
Pensamientos ágiles
La web de ahora dentro de 10 años
Julio 29th, 2007 - [Enlace local]
En Think Vitamin le han preguntado a 16 importantes desarrolladores, diseñadores y emprendedores, qué es lo que creen que dentro de 10 años estaremos viendo como la tecnologÃa clave en estos dÃas cuando miremos hacia atrás.
Lo que me parece más interesante es que prácticamente no hay consenso entre las dieciséis personas. Dos piensan que los microformatos, otros apuntan a Applet, su iPhone y el múndo de los móviles, hay quien simplemente dice YouTube, Safari, la agregación de información, el aspecto social, o el aspecto de publicación. Yo no sigo demasiado el mundo del diseño/desarrollo web pero la verdad es que me esperaba mucho más consenso, algo como que el 50% dijese que la web social ha sido lo más grande, o que la mitad pensase que los microformatos han cambiado la web. No sé, me ha quedado un poco la impresión de que está todo muy difuso todavÃa.
Quizás tenga razón Jeffrey Kalmikoff de SkinnyCorp cuando dice que todo el enfasis en lo web 2.0 y en buscar locamente el encajar productos dentro de lo que se ha convertido ya en una marca comercial está enlenteciendo el mundo del desarrollo web. Se está llegando a un punto en que no importa la funcionalidad sino que lo importante es que todo tenga bordes redondeados, muchos colores y que se integre con Facebook (por poner un ejemplo).
» Leer más, comentarios, etc...
Variable not found, 0:1
Leyes epónimas relacionadas con el desarrollo de software (y II)
Julio 29th, 2007 - [Enlace local]
Hoy seguimos con la serie inspirada por Phil Haack en su post "19 Eponymous Laws Of Software Development" donde estoy recogiendo leyes que se aplican en el mundo del desarrollo del software y muchos otros ámbitos. La particularidad de estas leyes y principios es que han hecho famosos a sus autores, pues tienen el mismo nombre que ellos.
Ley de Conway
Cualquier software refleja la estructura organizacional de quien lo produjoA pesar de que suena a guasa, la ley de Melvin Conway no puede ser más cierta. Una empresa con tres grupos de desarrollo tenderá a generar software distribuido en tres subsistemas, reflejo fiel de las relaciones entre los grupos participantes. Y por cierto, ¿habéis pensado alguna vez que el software que se hace en vuestra empresa es un desastre? ¿creéis que con esta ley podrÃais obtener alguna conclusión? ;-D
Principio de Kerchkhoff
En términos de criptografÃa, un sistema deberÃa ser seguro incluso si todo sobre el mismo se conoce públicamente, salvo una pequeña porción de informaciónEs increÃble que Auguste Kerckhoffs critógrafo alemán, enunciara en el siglo XIX este principio, base de todos los sistemas de criptografÃa de clave pública actuales.
Ley de Linus
Dados suficientes ojos, todos los errores son obviosPues sÃ, Linus Torvalds, uno de los más famosos artÃfices de Linux tal y como es conocido hoy en dÃa, no sólo desarrollaba software, también emitÃa este tipo de aseveraciones. Aunque la frase fue cosa de Linus, fue Eric S. Raymond, un hacker a la antigua usanza, el que la popularizó y le dio el nombre de su creador.
Ley de Reed
La utilidad de grandes redes, y en particular las sociales, crecen exponencialmente con el tamaño de la redDavid P. Reed, cientÃfico americano, enunció esto que parece obvio en los tiempos actuales dado el tamaño y utilización de este tipo de redes. En esta entrada de la wikipedia podéis encontrar una introducción del soporte teórico en el que se basa.
Ley de Moore
La potencia de los ordenadores se duplica cada dos años, reduciendo además su costeRepetida hasta la saciedad en revistas de cacharreo, y constatada desde hace décadas, fue promulgada por Gordon Earl Moore quien, por cierto, es co-fundador de Intel, fijaos si lo tenÃa claro el muchacho, en 1965 (!). No sé si entonces utilizó la bola de cristal o es simplemente un genio, pero desde luego su ley es una referencia de la medida del avance en los ordenadores y demás dispositivos basados en tecnologÃa similar, y un objetivo mÃnimo a cumplir.
Ley de Wirth
El software se ralentiza más deprisa de lo que se acelera el hardwareBrillante la frase de Niklaus Wirth, que allá por el año 1995, aún sin conocer Windows Vista, observó su entorno y predijo la situación actual: cada vez el software es más lento y pesado, a pesar de que según la Ley de Moore tendrÃa que ser al contrario. Este señor, una eminencia, es conocido sobre todo por haber dirigido la creación de los lenguajes Pascal, Modula y algunos otros menos difundidos.
Ley de Zawinski
Todo programa intenta expandirse hasta que pueda leer emails. Aquél que no pueda ser expandido hasta ese punto, será sustituido por otro que sà tenga esa capacidadLo que más me ha llamado la atención de Jamie Zawinski aparte de su metafórica ley, es su página web personal. No os la perdáis, pues es bastante indicativa del tipo de individuo de que se trata, todo un friki. También es curioso que es propietario de un club nocturno en San Francisco, este sà que sabe.
Enlaces relacionados: leyes epónimas relacionadas con el desarrollo de software (I)
» Leer más, comentarios, etc...
Php y otras yerbas, por Clbustos - Programación
¿Cuántos elementos HTML recuerdas?
Julio 29th, 2007 - [Enlace local]
Viendo Planet webdev, me picó el bicho por ver cuantos elementos HTML recordaba. Resultado: patético:
Aquà va el listado de lo que norecordé
ABBR, ACRONYM, ADDRESS, APPLET, AREA, BASE, BASEFONT, BDO, BIG, BLOCKQUOTE, CITE, CODE, COLGROUP, DEL, DFN, DIR, FIELDSET, FRAME, FRAMESET, IFRAME, INS, ISINDEX, KBD, LABEL, LEGEND, LINK, MAP, MENU, NOFRAMES, NOSCRIPT, OPTGROUP, OPTION, PARAM, PRE, SAMP, SELECT, SMALL, STRIKE, SUB, SUP, TEXTAREA, TFOOT, TH, TT, UL, VAR
Y lo que sÃ
A, B, BODY, BR, BUTTON, CAPTION, CENTER, COL, DD, DIV, DL, DT, EM, FONT, FORM, H1, H2, H3, H4, H5, H6, HEAD, HR, HTML, I, IMG, INPUT, LI, META, OBJECT, OL, P, Q, S, SCRIPT, SPAN, STRONG, STYLE, TABLE, TBODY, TD, THEAD, TITLE, TR, U,
Penoso fue el olvido de applet, blockquote, cite, code, pre, frame, noscript, select, textarea y ul, que son elementos que siempre ocupo.
.» Leer más, comentarios, etc...
Navegapolis
Component Reuse in Software Engineering
Julio 29th, 2007 - [Enlace local]
La reutilización del software depende del uso sistemático de procesos y herramientas, o dicho con otras palabras: no se puede esperar que la reutilización se produzca de forma accidental.
Esta es la conclusión general del libro "Component Reuse in Software Engineering" que ha publicado y se puede distribuir gratuitamente con licencia Creative Commons un equipo del Reuse in Software Engineering (RiSE) Group.
» Leer más, comentarios, etc...
Una sinfonÃa en C#
[Video] ¿Cómo crear un Custom Trace Listener?
Julio 28th, 2007 - [Enlace local]
Les dejo un video de cómo crear un Custom Trace Listener para EntLib 3.1.
Código del ejemplo
» Leer más, comentarios, etc...
.NET o no .NET, esa es la cuestión
ILIAD: Primera impresión
Julio 28th, 2007 - [Enlace local]
Bueno, llevo ya dos tardes con sus noches jugando con el aparatito, y la verdad es que la satisfacción sobre el mismo no es muy alta si se toma en conjunto.
Ya hay gente que ha hablado del aparato, asà que voy a asumir que primero vas a leer lo que nuestro amigo de tinta-e nos escribe aquà y aquÃ, asà me voy a ahorrar de dar prolijas explicaciones.
Una vez vistas sus opiniones, que comparto en casi toda su extensión, voy a dar las mÃas.
El software es más bien mierdosillo, es decir, tiene muy pocas opciones, aunque las que trae son fácilmente configurables y se entiende su funcionalidad sin problemas. Hay que entender que es un programa para leer libros, no para navegar por internet o para escuchar música.
Eso me lleva al tema de por qué han implementado conexión WiFi y Ethernet si ésta sólo sirve para actualizar el equipo. Imagino que en futuras versiones tengan previsto sacar un navegador y todo eso, porque si no, no entiendo el por qué lo han hecho. Para actualizar el aparato sólo hubiera sido necesaria la conexión USB y un software en el PC, y 200 euracos menos de precio.
El libro está basado en la lectura de PDF y HTML. El PDF lo he probado y la verdad es que tampoco se han quemado las cejas en el tema, ya que no existe el modo reflujo ni nada parecido. Si el fichero original está en A4, eso es lo que verás en la pantalla, pudiendo hacer zoom para agrandar el texto. Comentar que un A4 se ve bastante bien y se puede leer sin problemas, asà que podremos leer nuestros libros técnicos.
Por otro lado, si queremos tener una experiencia de lectura óptima, tenemos que seguir las normas marcadas en la documentación y hacernos nuestros propios PDF…
También trae una versión hecha en Java del Mobipocket Reader, que la versión 2.10.2 del firmware actualiza para poder hacer búsquedas en diccionarios encriptados (y supongo que también será capaz de leer libros encriptados).
Pero si el paso de hojas en un PDF es aceptable (no tarda más de lo que tú mismo tardarÃas en pasar la hoja de un libro), en el Mobipocket no lo es ni de lejos; es de una lentitud desesperante, tanto que debo pulsar la orden de avance de página dos lÃneas antes del final en los textos en castellano y una en los en inglés si quiero que el cambio de hoja no me haga perder el hilo de lo leÃdo. Esto sà que es un problema inaceptable para el aparato, y espero que lo solucionen. Además, mientras que podemos apaisar los PDF, el Mobipocket apenas trae opciones por no decir que no trae ninguna… Solamente podemos buscar en el diccionario (que resulta una operación bastante lenta) y cambiar el tamaño de la fuente (y serÃa de desear un ajuste de márgenes, posibilidad de leer en columnas y de apaisar el texto).
En su afán por conseguir un formato libro, el aparato no es muy ergonómico que digamos. El paso de hoja se debe hacer siempre con la mano izquierda sobre una barra lateral vertical, con lo que te obliga prácticamente a usar dicha mano para sujetar el aparato. Pero si lo sujetas con esa mano para poder pasar hoja fácilmente, entonces tienes que apretar mucho y terminas cansándote, por lo que deberÃan haber implementado algún tipo de asa para poder meter los dedos y que el iLiad se apoye en ellos.
En la parte inferior trae cuatro botones de acceso rápido para "Noticias" (es un formato xml/html que el propio fabricante ha especificado y que de momento absolutamente nadie usa y no creo que se use nunca jamás), libros (con los PDF en acceso directo y los de Mobipocket en una carpeta), Documentos (que son varios manuales que trae) y el de notas, que nos sirve para pintar y hacer nuestras cosas a partir de varias plantillas.
Desde mi punto de vista, la barra de avance de página deberÃa haber estado en lugar de los botones, y éstos en el lateral. También habrÃa puesto botones nuevos configurables para lanzar, por ejemplo, un libro favorito, o el último libro abierto, etc.
Poniendo la barra de avance en la parte inferior hubiera posibilitado sujetar el aparato con cualquier mano desde su parte inferior (ya que el centro de gravedad está casi abajo del todo –ya sabemos dónde anda la baterÃa) y hacer avanzar y retroceder las hojas también con cualquier mano. Desde mi punto de vista, esto supone un suspenso absoluto en cuanto a diseño y ergonomÃa.
Otro tema del hardware que no me gusta nada es la forma de recargar y de conectar al PC, mediante un anexo que se inserta en la parte inferior con un conector de muchos pines muy parecido al de los teléfonos móviles. Este anexo por un lado lleva la conexión al cargador y por el otro los conectores de red y USB. Es una gran idea, aligerando el aparato de varios componentes… pero no se puede leer mientras se está cargando porque corres el riesgo de cargarte el delicado conector…
En la parte de arriba tenemos los zócalos para la tarjeta MMC (que no SD, y es una cosa que no entiendo), CF (me reconoce sin problemas una de 4 GB) y pincho USB (que todavÃa no he probado)… Extendiendo el tema de la modularidad, también podrÃan haber hecho insertable un cajoncillo con esos elementos, y seguro que eliminamos unos cuantos gramos del aparato si no vamos a insertar nada.
De la duración de la baterÃa todavÃa no puedo hablar, porque estoy en la segunda recarga. La primera me duró unas siete horas, pero hay que tener en cuenta que estuve trasteando largo y tendido con el Ethernet, WiFi y demás. Y esta segunda no la puedo medir porque he ido usando el aparato a ratos.
El aparato, una vez conectado por USB al PC, se queda autista, mientras que en el PC aparece como una unidad de disco extraÃble más, con toda la estructura de ficheros (no la del sistema) a la vista.
El programa del PC (Companion Sofware, lo llaman), es una castaña pilonga con apenas funcionalidad y que encima de todo no funciona en Vista, ni siquiera en modo administrador. Y para más inri, el Mobipocket de escritorio tampoco detecta el iLiad y no es posible conjuntarlo con él.
Otra cosa que no he podido hacer es que el aparato se conecte al PC mediante Ethernet, aunque la actualización de firmware funciona tanto por WiFi como por Ethernet.
Estas tres últimas cuestiones las he enviado al servicio técnico a ver qué me dicen, pero ya adelanto que se deben a una programación muy chapucera del Companion Software…
Entre lo bueno –no todo ha de ser malo-, está la calidad del texto. Mejor que la de un libro impreso, con diferencia absoluta. Y se puede leer a plenÃsmo sol, de hecho, cuanta más luz incida, mejor se lee (apenas existe un mÃnimo reflejo quizás originado por la tableta digitalizadora). El ángulo de visión es exactamente el de un libro, por lo que puedes poner el aparato horizontalmente sobre la cama, tumbarte al lado con la cabeza apoyada en la almohada y leer perfectamente.
Otro elemento que me gusta mucho es que la estructura lógica está completamente abierta. Tu dejas un PDF en la carpeta de libros, y cuando vuelves a mirarlo, el aparato ha metido el documento en una carpeta con el mismo nombre, ha asociado un archivo XML que contiene la descripción del libro y más datos, asà como otro más para las anotaciones…
Asà mismo, y pese a estar desarrollado en Linux (o quizás por eso), el usuario puede programar el aparato sin problemas, de hecho en la web del fabricante tenemos acceso a un SDK y a un repositorio de software… Hasta disponemos del código fuente de todo el firmware, aunque el fabricante te recomienda que no toques nada ya que de momento no existe una forma segura de actualizar el kernel o de recuperarlo (Y considerando el sistema de boot de los Intel PX, que parece diseñado por un borracho en una frÃa madrugada –absurdamente complejo, estrambótico y adoleciendo de diez mil chuminadas indocumentadas y repajoleramente tiquismiquies-, mejor no tocarlo y hacerle caso, por una vez, al fabricante).
En fin, que se trata de un producto útil pero muy verde, que adolece de algunos errores ergonómicos, y cuyo firmware necesita de varios –muchos- hervores más (aunque lo que funciona, funciona bien).
» Leer más, comentarios, etc...
niko's mini factory
Links for 2007-07-27 [del.icio.us]
Julio 28th, 2007 - [Enlace local]
- Cluster a standalone Spring app to calculate Mandelbrot set
Utilizar un cluster en una aplicación Spring para calcular un conjunto de Mandelbrot - Easing configuration
Facilitando la configuraci
» Leer más, comentarios, etc...
design-nation.blog/es
Hello World con AIR y Aptana
Julio 27th, 2007 - [Enlace local]
Abrimos nueva categorÃa en el blog, dedicada a AIR, con un post sencillo, en el que vamos a instalar todo lo necesario para comenzar a desarrollar aplicaciones AIR basadas en html y javascript.
Por "todo lo necesario" se entiende las siguientes tres cosas:
Una vez descargados tanto el runtime como el SDK se debe proceder a su instalación. La instalación del runtime la realiza un instalador
Mientras que la del SDK ha de hacerse a mano. En mi caso particular, he copiado los archivos que se encontraban en el dmg, en una carpeta dentro de mi estructura de directorios dedicada al código fuente. En concreto, la ruta del SDK será: /Users/ctarda/Subversion/airSDK
Una vez instalados el runtime y el sdk, es el momento de instalar y arrancar Aptana. Al terminar de arrancar, se presenta una pantalla de bienvenida, con enlaces directos a las descargas del runtime y el sdk, enlaces que ya no son necesarios.
Sin embargo, sà hay que instalar el plugin de AIR para Aptana. Al hacer clic en el paso rotulado con un 3 en la pantalla de bienvenida, se pasa a la tÃpica pantalla de descarga e instalación de plugins de Eclipse.
Una vez seleccionado el plugin de AIR, no hay más que hacer clic en siguiente, y seguir las instrucciones. Tras la instalación, será necesario reiniciar el workspace de Aptana.
Tras el reinicio, hay que configurar el entorno para indicarle la localización del SDK. Se puede conseguir haciendo clic en la opción correspondiente de la pantalla de bienvenida, o en el menú Ventana-Preferencias, seleccionando en la ventana que se abre Aptana-Air SDKs. Debe añadirse la ruta del SDK previamente instalado.
Ya ha llegado el momento de crear un nuevo proyecto. En este caso, el nombre del proyecto ha sido HelloWorld, y el framework JS seleccionado ha sido prototype
A continuación, Aptana genera los ficheros necesarios para que el proyecto pueda ser ejecutado en el runtime AIR. Si se hace una pequeña modificación en el código fuente:
Y se ejecuta el proyecto:
Se puede comprobar cómo todo funciona como se espera.
Ahora es cuando ya se puede empezar a trabajar.
» Leer más, comentarios, etc...
design-nation.blog/es
Modelo-Vista-Controlador en AS3
Julio 27th, 2007 - [Enlace local]
El objetivo:
Mi objetivo es mostrar un ejemplo de implementación del modelo-vista-controlador, que sirva para ilustrar algunas de las novedades más importantes en la última revisión (aunque en este caso casi deberÃa hablarse de reinvención) de ActionScript.
Para ello, voy a implementar uno de las dos aplicaciones de ejemplo que solemos utilizar habitualmente: un reloj. En este caso, un reloj muy sencillo, que va a mostrar una cuenta creciente de segundos, pero que también va a proveer un botón para poder pausar su operación. Por favor, tómese la aplicación como una prueba de concepto, como un vehÃculo, una herramienta para intentar facilitar la comprensión de lo verdaderamente importante, el idiom.
Como puede verse en la imagen, el desarrollo de interfaces no es el punto fuerte de los aquà presentes.
La arquitectura
El modelo-vista-controlador se ha revisado por aquà con anterioridad. Para no repetirme demasiado, simplemente me voy a permitir mostrar el siguiente gráfico que permite comprender en su totalidad la arquitectura:
El concepto es sencillo. Se divide la aplicación en tres capas. Una de ellas (la vista) será la encargada de gestionar la interfaz y todo lo relacionado con la interacción entre la aplicación y el usuario, otra (el modelo) será la encargada de hacer el trabajo real de la aplicación, y la última (el controlador) sirve para desacoplar ambas, de forma que, si fuera necesario, una vista pueda ser actualizada por varios modelos, o un modelo pueda proveer de datos varias vistas.
La comunicación entre el controlador y la vista se hace por push en ambos sentidos. Entre el modelo y el controlador, sin embargo, se hace por push cuando es el controlador el que necesita del modelo, y por eventos cuando es el modelo el que quiere notificar algo a la(s) vistas.
Se puede discutir sobre si ésta implementación es la canónica del mvc o no, pero, sinceramente, eso es, por un lado, tema para otro post diferente, y por otro, una discusión similar a la del sexo de los ángeles. Mi opinión personal es que los patrones, como prácticamente todo en esta vida, desde la ropa al sillÃn de la bicicleta, deben adaptarse a las necesidades y gustos del que los utiliza. En mi caso, ésta es la implementación que más me satisface, la que mejores resultados me da, la que más fácilmente puedo implementar en diversos lenguajes, y por tanto, la que yo utilizo.
Los detalles de implementación
De la arquitectura anterior puede desprenderse que la cadena de eventos de la aplicación será la siguiente:
- Creación del controlador
- Creación de la vista, y paso de una referencia de la misma al controlador
- Creación del modelo desde el controlador
- Inicialización del sistema de eventos para las notificaciones emitidas por el modelo
- Arranque del modelo.
El controlador, por tanto, dada su función de capa de abstracción entre el modelo y la vista, deberá mantener una referencia a ambos. Además, deberá ser capaz de escuchar los eventos emitidos por el modelo.
La gestión de eventos
Una de las novedades de AS3 es la forma en la que se gestionan los eventos. Por fin, se ha racionalizado y estandarizado, y ya no hace necesario escribir a mano un sistema propio y racional de gestión de eventos, como ocurrÃa hasta la fecha.
Básicamente, todo evento que se quiera emitir, debe extender de la clase flash.events.Event
La clase en la que especialice el evento a emitir simplemente debe llamar al construcor de su superclase, pasándole como parámetro una cadena de texto con el nombre por el que se quiera reconocer al evento creado.
Por tanto, en el ejemplo del reloj que estoy construyendo, si quisiera que se emitiera un evento desde el modelo, con el valor del tiempo transcurrido en el reloj hasta ese momento, lo podrÃa hacer de la siguiente manera:
En el constructor de mi evento, paso dos valores como parámetro: el nombre del evento para el que voy a utilizar la instancia concreta de la clase, y el valor que quiero encapsular en dicho evento. Para facilitar en lo posible ese encapsulamiento, también proporciono un método público (getValue( ) ) que me permitirá utilizar ese valor en otros ámbitos de mi aplicación.
Paso el nombre del evento como parámetro, para, fundamentalmente, ilustrar mi ejemplo. En cualquier caso, al arrancar el modelo de la aplicación, voy a emitir un evento con un nombre distinto al que emitiré con cada pulsación del reloj. ¿Por qué? Básicamente porque me apetece, porque no me parece deban manejarse la inicialización del reloj y las pulsaciones del mismo con el mismo evento, porque no son la misma cosa.
Por eso, en el modelo voy a declarar dos constantes diferentes que voy a utilizar para crear los dos eventos. Puede no ser el mejor lugar para hacerlo, ciertamente, pero creo que para un ejemplo como éste, con sólo dos eventos, no es necesario complicarse más:
En la implementación del método start( ) (el que se manda ejecutar desde el controlador cuando se arranca la aplicación) puede verse la forma en la que se crea el evento llamado onStartEvent, que puedo construir de dos maneras: utilizando una instancia de la clase TickEvent, y pasando a esa clase el valor de counter en ese momento (que al iniciarse el reloj es cero), o simplemente como un evento genérico, sin más especialización de su nombre. En este caso, sigo el segundo camino, y hago que sea la vista la que presente un cero como valor inicial. ¿Mal hecho? SÃ. Pero como soy consciente de haberlo hecho mal, siempre lo puedo refactorizar...
En las dos últimas lÃneas de la captura anterior se pude observar cómo funciona el mecanismo de escucha de eventos, que puede verse como una mezcla de las delegaciones y de la escucha de eventos utilizada en AS2. Al registrarse a un emisor de eventos, se elige el nombre del evento a escuchar (en este caso, el declarado en la clase flash.utils.Timer con la constante TIMER) y se elige el callback que escuchará el evento (en este caso el método onTimeTick).
Al recibirse la notificación del evento, que es del tipo TimerEvent, el modelo de la aplicación emite otro evento, hacia aquellos que se hayan registrado para escucharle, que es una instancia de TickEvent, esta vez, con nombre onTimeTick.
Para que el modelo pueda emitir eventos, debe extender de flash.events.EventDispatcher, como asà ocurre.
El controlador, que ha sido el responsable de crear el modelo, está registrado a los eventos que éste emite:
Eventos a los que se registra, utilizando para identificarlos las constantes que contienen sus nombres, y que fueron declaradas en el modelo.
El resto del flujo de eventos de la aplicación es sencillo. Con cada pulsación del reloj agregado al modelo (la instancia de flash.utils.Timer), se emite un evento que recibe el controlador, evento del que se extrae el valor del temporizador, para ser trasladado a la vista, que es la que lo presenta en pantalla:
La vista dibuja un gráfico para ser utilizado como botón. Como ese gráfico sólo se va a utilizar para capturar los clics que se hagan sobre él, no tiene sentido que sea un movieclip, sino que basta con que sea una instancia de Sprite:
Como puede verse, la forma de gestionar los eventos de ratón es la misma que con el resto de eventos. Una vez creados el Sprite y un campo de texto para presentar el valor del temporizador, se añaden al dom, y listo.
¿Qué se ha conseguido con esta arquitectura? Aislar la funcionalidad real de la aplicación (el temporizador) en una sola capa, en la que no se maneja nada relacionado con la interfaz ni con la interacción con el usuario. De esa forma, se tiene bien encapsulada esa funcionalidad, y se gana en modularidad, portabilidad y cohesión mientras que se reduce el acoplamiento con el interfaz. ¿Que se quiere cambiar completamente al interfaz para hacer que parezca un reloj de manecillas? Ningún problema, se cambia la vista y solucionado.
El código completo del ejemplo puede descargarse en este enlace. DeberÃa compilar sin problemas con Flash CS3. Trastea con él, léelo, verás que no es tan complicado como lo he hecho sonar.
» Leer más, comentarios, etc...
Javier Perez
menéame preview (userscript greasemonkey): preview en tiempo real al escribir comentario en menéame
Julio 27th, 2007 - [Enlace local]
Estoy trabajando en un clon de menéame, y es divertido, pero más aún es juguetear con el mismísimo meneame.net. De una tontería surgió menéame signature, un script greasemonkey para Firefox que añade una firma a todos los comentarios que se envíen en meneame.net. Pero al parecer los asiduos de menéame no ven con buenos ojos eso de poner firmas en los comentarios (spam attack! huid malditos!).
Así que le he dado otra vuelta de tuerca, y he creado menéame preview. Este script muestra una preview en tiempo real del comentario que estemos escribiendo, con sus smileys, negritas, cursivas y enlaces, tal y como se vería una vez publicado.
Además, menéame preview da la opción de enviar junto con el comentario una firma. Opcional, para los karma-wore (karma-wore: dícese de aquellos insensatos a los que se la pela el karma).
menéame preview :: install script
Propongo al equipo de menéame que lo incluya en el propio sistema.



