AjaxTrans
Diciembre 31st, 2005 - [Enlace local]
Curioso el "front-end" que Joel Parish ha desarrollado con Ajax para servicios de traducción on-line. Especialmente interesante es la segunda versión que acaba de publicar, que incluye un algoritmo "Ads" para presentar publicidad referente a las palabras traducidas. Merece la pena echarle un vistazo.
.
» Leer más, comentarios, etc...
The AMA Handbook of Projetc Management
Diciembre 30th, 2005 - [Enlace local]
Desde hoy está disponible la segunda edición de "The AMA Handbook of Project Management", una colección de 41 ensayos de otros tantos expertos y profesionales notables en la gestión de proyectos, distribuidos con sobre el siguiente esquema expositivo:
I.- Conceptos y metodologías de la gestión de proyectos.
- Introducción
- Estrategias de gestión para proyectos con éxito
- Estructuras de proyectos y de organizaciones
» Leer más, comentarios, etc...
Workshops
Diciembre 30th, 2005 - [Enlace local]
No es que en Linking Paths lo sepamos todo, ni que yo sea un profesional más reconocido que otros, simplemente la creación de una serie de workshops itinerantes es una idea que hemos barajado en el pasado, y que vuelve recurrentemente al enlazarse con nuestra actividad formativa.
Continua leyendo “Workshops”
» Leer más, comentarios, etc...
¿Anti-spam? ¡¡WP-Morph 1.5!!
Diciembre 30th, 2005 - [Enlace local]
Al actualizar a WordPress 2 me di cuenta que empezaron a llegar correo spam. Me di cuenta entonces de que hay que cambiar WP-Morph mÃnimamente. También ahora WP-Morph sólo actúa en comentarios, no en pingbacks ni en trackbacks. He aquà la nueva versión 1.5 con sus instrucciones de instalación:
When updated to WordPress I started receiving spam again. I realized I had to change WP-Morph a little bit to cope with this new version. Also, WP-Morph now only checks comments, neither pingbacks nor trackbacks. Here is version 1.5:
» Leer más, comentarios, etc...
Un poco de “estandar� nunca viene mal
Diciembre 29th, 2005 - [Enlace local]
He recopilado algunos enlaces sobre ejemplos de implementaciones en CSS, AJAX, y XHTML, con javascript involucrado en algunos casos:
EsLoMas.com
Es un sitio con bastantes ejemplos y muy completos sobre buenas implementaciones y “best practices” en css, xhtml y javascript:
xhtml
css
javascript
CssPlay
Es un sitio con muchos ejemplos en CSS, de casos interactivos, que sólo podÃamos pensar en hacerlos conjuntamente […]
» Leer más, comentarios, etc...
Mi gozo en un pozo
Diciembre 29th, 2005 - [Enlace local]
Un par de tardes buceando en google y en el foro de desarrolladores de Nokia me ha costado averiguar que J2ME y su especificación midp 2.0 no son todo lo buenas que en estos tiempos que corren se espera de la plataforma con más futuro de Java
El caso es que estaba yo enfrascado en una pequeña aplicación que hiciera uso del puerto infrarojos de mi Nokia 6230 y despues de mucho investigar he llegado a la conclusión de que la implementación midp 2.0 que tiene mi teléfono y la mayorÃa de aparatos de Nokia no soporta esta caracterÃstica. Sin embargo el Nokia 5140 sà lo soporta, pero con un API propietario de Nokia.
AsÃ, si el API midp 2.0 establece que para abrir el enlace IrCOMM hay que hacerlo asÃ: Connector.open(”comm:IR0…..”, en el Nokia 5140 habrÃa que hacerlo asÃ: Connector.open(”nokiacomm:IR0…..”). Lamentablemente ninguna de estas formas funciona en mi Nokia 6230, asà que me quedo con las ganas …
Es curioso las pegas que tenemos los desarrolladores para poder sacar provecho de todas las caracterÃsticas de los terminales, parece que los fabricantes se han orientado al usuario final y se han olvidado de facilitar la vida a los programadores. Además la especificación midp 2.0 al parecer no obliga a incorporar un api de acceso al puerto infrarojos, con lo que se junta el hambre con las ganas de comer … Por cierto, ¿alguien conoce teléfonos que permitan acceso IR mediante java? (he oido que algunos Siemens y Motorola lo permiten).
» Leer más, comentarios, etc...
Null Pointer Exception
Mi gozo en un pozo
Diciembre 29th, 2005 - [Enlace local]
Un par de tardes buceando en google y en el foro de desarrolladores de Nokia me ha costado averiguar que J2ME y su especificación midp 2.0 no son todo lo buenas que en estos tiempos que corren se espera de la plataforma con más futuro de Java
El caso es que estaba yo enfrascado en una pequeña aplicación que hiciera uso del puerto infrarojos de mi Nokia 6230 y despues de mucho investigar he llegado a la conclusión de que la implementación midp 2.0 que tiene mi teléfono y la mayorÃa de aparatos de Nokia no soporta esta caracterÃstica. Sin embargo el Nokia 5140 sà lo soporta, pero con un API propietario de Nokia.
AsÃ, si el API midp 2.0 establece que para abrir el enlace IrCOMM hay que hacerlo asÃ: Connector.open("comm:IR0.....", en el Nokia 5140 habrÃa que hacerlo asÃ: Connector.open("nokiacomm:IR0....."). Lamentablemente ninguna de estas formas funciona en mi Nokia 6230, asà que me quedo con las ganas ...
Es curioso las pegas que tenemos los desarrolladores para poder sacar provecho de todas las caracterÃsticas de los terminales, parece que los fabricantes se han orientado al usuario final y se han olvidado de facilitar la vida a los programadores. Además la especificación midp 2.0 al parecer no obliga a incorporar un api de acceso al puerto infrarojos, con lo que se junta el hambre con las ganas de comer ... Por cierto, ¿alguien conoce teléfonos que permitan acceso IR mediante java? (he oido que algunos Siemens y Motorola lo permiten).
» Leer más, comentarios, etc...
Yet Another Programming Weblog
Diseño de APIs (II)
Diciembre 29th, 2005 - [Enlace local]
En un weblog de Artima, Eamonn McManus ha publicado una interesante entrada sobre el diseño de APIs en Java mucho más completa que la de Martin Fowler (que referencié en su dÃa) Para él una buena API deberÃa ser correcta, fácil de usar, fácil de aprender, rápida y pequeña. Y el mejor consejo: sé minimalista. Muchas de las pautas aconsejadas son exportables a otros lenguajes OO.
La misma entrada en BP
» Leer más, comentarios, etc...
Yet Another Programming Weblog
Diseño de APIs (II)
Diciembre 29th, 2005 - [Enlace local]
La misma entrada en BP
» Leer más, comentarios, etc...
SÃmbolos en Ruby
Diciembre 29th, 2005 - [Enlace local]
Se han publicado recientemente tres artÃculos interesantes que versan sobre los sÃmbolos en Ruby (esas curiosas entidades sintácticas que empiezan por dos puntos y que tan frecuentemente nos encontramos al programar en Rails).
Mi imagen mental sobre los sÃmbolos era pensar en ellos como si fuesen cadenas globales e inmutables, pero Jim Weirich se encarga de arrojar algo de luz sobre el tema, e incluso Austin Ziegler responde con más detalle
Por último, hoy me encuentro con este otro artÃculo de Steve Yegge que no sólo sugiere otros usos futuros posibles de los sÃmbolos, sino que además lo hace aplicando técnicas de metaprogramación que vendrán muy bien para retorcer las mentes de quienes, como yo, venimos de C++ (o Java).
» Leer más, comentarios, etc...
Calidad de la Información: El efecto dominó
Diciembre 28th, 2005 - [Enlace local]
“Si una mentira se repite las suficientes veces, acaba convirtiéndose en la verdad”
Básicamente consiste en lo siguiente:
Alguien, llamemosle trollA, en determinado momento lanza una sentencia fatÃdica y solemne en un foro técnico: “X es lento” ¿respecto a qué?, “el lenguaje X no se usa para nada” ¿?, “X no es nada productivo” defÃname productividad…etc. Creo que los lectores de este blog tienen claro a qué tipo de sentencias nos referimos.
Continua leyendo “Calidad de la Información: El efecto dominó”
» Leer más, comentarios, etc...
Validando imagenes en PHP
Diciembre 28th, 2005 - [Enlace local]
A raiz de un proyecto web para una empresa que cayo en mis manos, he estado aprendiendo en estos dias PHP, ya que no sabia nada de este lenguaje
. Por lo que he visto, PHP es sumamente facil de aprender, bueno tal vez me sirvio de base mis conocimientos en C/C++/C#
, pero para cualquier impetuoso habido de aprender PHP, no debe ser nada dificil de asimilar. Y ahora estoy aqui para compartir un poco de lo que aprendido
.
Bueno al asunto, si se tiene un formulario en donde se le pide un usuario que suba una imagen, ya sea para copiarla en una carpeta del server o guardarla en un base de datos, es necesario validar dicho archivo antes de realizar cualquier accion con este.
Para el caso de archivos, PHP nos ofrece una serie de variables a las que podemos acceder con la información del archivo enviado. Puedes usar $_HTTP_POST_FILES o $_FILES, como gustes, yo prefiero el segundo
.
- $_FILES[’userfile’][’name’]. El nombre original del fichero en la máquina cliente.
- $_FILES[’userfile’][’type’]. El tipo mime del fichero (si el navegador lo proporciona). Un ejemplo podrÃa ser “image/gif”.
- $_FILES[’userfile’][’size’]. El tamaño en bytes del fichero recibido.
- $_FILES[’userfile’][’tmp_name’]. El nombre del fichero temporal que se utiliza para almacenar en el servidor el archivo recibido.
Primero que nada un archivo no puede tener 0 bytes y si le puede limitar a un tamaño para que el usuario no pueda subir un archivo muy grande y nos eche a perder el dia
. Luego hay que verificar que el archivo sea una imagen. Vamos al codigo :
Si se quiere aceptar cualquier tipo de imagen.
<?php
$filesize = $_FILES[’userfile’][’size’];
$filetype = $_FILES[’userfile’][’type’];
if ( $filesize > 0 && $filesize <= 100000 && strpos($filetype,”image”) != false ) {
//realizar acciones
}
else
echo “imagen no valida!.”;
?>
En este codigo estamos limitando que la imagen no pese mas de 100kb, con strpos(filetype,”image”) validamos que el tipo de archivo sea una imagen ya que este filetype puede contener: image/gif, image/png, etc. Si vamos a utilizar las imagenes subidas, por ejemplo en una galeria de imagenes, no es muy recomendable que el usuario pueda subir cualquier tipo de imagen, ya que hay imagenes que no son aptas para web. Ahora vamos a restringir que solo pueda subir los de tipo jpeg, gif y png:
<?php
$filesize = $_FILES[’userfile’][’size’];
$filetype = $_FILES[’userfile’][’type’];
$type = substr($filetype, (strpos($filetype,”/”))+1);
$types=array(”jpeg”,”gif”,”png”);
if ( $filesize > 0 && $filesize <= 100000 && in_array($type, $types) ) {
// realizar acciones
}
else
echo “Imagen no valida!.”;
?>
Como vemos tenemos un array donde especificamos los tipos de imagen que son aceptados, y luego con la funcion in_array buscamos si tipo ($type) de la imagen proporcionada por el usuario se encuentra en el array devolviendonos true si esta y false sino. Este codigo no solo nos sirve para imagenes sino para cualquier tipo de archivo que nosotros queremos validar.
Nota: PHP saca el tipo del archivo segun su MimeType, esto quiere decir que si a un archivo de texto con extension TXT lo cambio la extension a JPG, php no lo toma como imagen (image/jpeg) sino como texto (text/txt) . Recordarles que recien empiezo con PHP, asi que cualquier sugerencia será bienvenida
.
Ahi los vidrios
.
» Leer más, comentarios, etc...
Error en el algoritmo de detección de UTF-8…. ¿cúal será?
Diciembre 28th, 2005 - [Enlace local]
En mi serie de “Detectando UTF-8 en…”, aparte de faltarme Perl y Python, existe un error potencial, que permitirÃa que textos UTF-8 mal formados fueran reconocidos como adecuados. ¿A donde estará el problema?. Se los dejo como ejercicio
Les recomiendo revisar el código en Ruby, porque es el más sencillo de leer.
Ah, y gracias Rino, por acordarme de poner la fuente de los códigos en monoespaciado. HacÃa falta
» Leer más, comentarios, etc...
más que código - articulo - programacion
Versión Cero, versión dos
Diciembre 27th, 2005 - [Enlace local]
Pues finalmente he avanzado un poco con la web Versión Cero. Como ya dije, querÃa darle un pequeño giro ya que la sección de noticias se estaba quedando un poco coja (no doy a basto para recopilar noticias).
PodrÃamos decir que hoy estreno la versión dos de Versión Cero (vaya juego de palabras) con las novedades:
- Weblog – Una sección de weblog en el sentido clásico de la palabra: Opinión, experiencias, enlaces, etc (por supuesto, siempre con el tema del desarrollo de software). Probablemente, a partir de ahora escriba más por allà algunos temas de programación que hasta ahora estaba escribiendo aquÃ. Pero no os preocupéis ;), seguiré escribiendo por aquà sobre otros temas (no en vano este weblog se llama “más que código”).
- Cambio de diseño – Un pequeño cambio de diseño para acomodar la nueva sección.
Estáis invitados a visitar y a opinar.
» Leer más, comentarios, etc...
Versión Cero, versión dos
Diciembre 27th, 2005 - [Enlace local]
Pues finalmente he avanzado un poco con la web Versión Cero. Como ya dije, quería darle un pequeño giro ya que la sección de noticias se estaba quedando un poco coja (no doy a basto para recopilar noticias).
Podríamos decir que hoy estreno la versión dos de Versión Cero (vaya juego de palabras) con las novedades:
- Weblog - Una sección de weblog en el sentido clásico de la palabra: Opinión, experiencias, enlaces, etc (por supuesto, siempre con el tema del desarrollo de software). Probablemente, a partir de ahora escriba más por allí algunos temas de programación que hasta ahora estaba escribiendo aquí. Pero no os preocupéis
, seguiré escribiendo por aquí sobre otros temas (no en vano este weblog se llama “más que código”). - Cambio de diseño - Un pequeño cambio de diseño para acomodar la nueva sección.
Estáis invitados a visitar y a opinar.
» Leer más, comentarios, etc...
La luna ilumina por igual a culpables e inocentes
Utilizando Drools II. Caso práctico 2/2
Diciembre 27th, 2005 - [Enlace local]
Como ya hemos visto, Drools es un motor de reglas de negocio. ¿Cuándo podemos utilizar Drools?. Pues,por ejemplo:
- Cuando la lógica de negocio sea compleja pero se pueda expresar mediante cláusulas IF-THEN.
- Cuando vaya a haber muhcos cambios.
- Cuando el cliente no tiene clara su lógica de negocio.
- Cuando el cliente se exprese de manera natural mediante IF-THEN.
Básicamente, al utilizar Drools tendremos que escribir dos elementos: las reglas de negocio y el sistema que utilizará dichas reglas (a a través de Drools). Drools permite escribir reglas en lenguaje Java, Python o Groovy. En este ejemplo vamos a escribir las reglas utilizando Java. Las reglas se almacenan en un archivo DRL, que no es más que un archivo XML con la definición de las reglas. La estructura (simplificada) de un archivo DRL se muestra a continuación
- Imports de elementos de paquetes.
- Declaración de funciones auxiliares.
- Nombre del conjunto de reglas.
- Reglas
Para cada regla podemos indicar:
- Nombre de la regla.
- Parámetros (los nombres son importantes).
- Conciones para que la regla se dispare.
- Consecuencias.
A continuación se muestra un ejemplo de un archivo DRL completo para el ejemplo que expusimos en el post aterior. Concretamente este archivo DRL incluye una regla por la que, si el precido de un pedido es superior a 100, le descuenta el 5%.
<?xml version="1.0"?>
<rule-set name="BusinessRulesSample"
xmlns="http://drools.org/rules"
xmlns:java="http://drools.org/semantics/java"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="http://drools.org/rules rules.xsd
http://drools.org/semantics/java java.xsd">
<java:import> java.lang.Object </java:import>
<java:import> java.lang.String </java:import>
<java:import> ebr.beans.Pedido </java:import>
<rule name="Calculo del total del pedido">
<parameter identifier="pedido">
<class>ebr.beans.Pedido</class>
<java:condition>
pedido.getCalculoTotalOriginal() >= 100.0
</java:condition>
<java:consequence>
pedido.setTotalFinal(pedido.getCalculoTotalOriginal() * 0.95);
</java:consequence>
</rule>
Para disparar esta regla vamos a escribir, en prime lugar, los beans que van a guardar la información
del workspace y un sencillo programa que utilice el motor. Uno de los beans guardará información sobre cada producto (nombre cantidad y precio) y el otro guardará la lista de productos. El sgeundo bean se muestra a continuación.
import java.util.*;
public class Pedido {private List entradas;
private double totalFinal;
public Pedido() {
entradas = new ArrayList();
this.totalFinal = -1.0;
} public void addEntrada (Entrada e) {
this.entradas.add(e);
}
public List getEntradas() {
return this.entradas;
}
public void getEntradas(List entradas) {
this.entradas = entradas;
}
public double getCalculoTotalOriginal() {
Entrada e;
double total = .0;
Iterator it = this.entradas.iterator();
while(it.hasNext()) {
e = (Entrada) it.next();
total += e.getCantidad();
}
return total;
}
public void setTotalFinal(double total) {
this.totalFinal = total;
}
Para trabajar con Drools necesitamos importar los sigientes elementos:
import java.io.IOException;
import org.drools.DroolsException;
import org.drools.RuleBase;
import org.drools.WorkingMemory;
import org.drools.event.DebugWorkingMemoryEventListener;
import org.drools.io.RuleBaseLoader;
import org.xml.sax.SAXException;
Lo primero que tenemos que hacer es crear un nuevo pedido:
Entrada e1 = new Entrada("A", 10, 5);
Entrada e2 = new Entrada("B", 6, 6);
Pedido pedido = new Pedido();
pedido.addEntrada (e1);En este pedido tenemos 10 unidades del producto A cada una a un precio de 5 y 6 unidades del B a un
precio de 6. A continuación creamos nuestro motor de reglas para que procese el archivo de reglas visto más arriba:
BREngine br = new BREngine();
RuleBase businessRules = RuleBaseLoader.loadFromUrl(
BREngine.class.getResource( "rules01.drl" ) );
Limpiamos el espacio de trabajo e instalamos un listener que será avisado cada vez que Drools ejecute una regla. Este listener mostrará un mnesaje por la salida estándar.
WorkingMemory workingMemory = businessRules.newWorkingMemory();
workingMemory.addEventListener(new DebugWorkingMemoryEventListener());
A continuación añadimos el pedido:
workingMemory.assertObject(fact);
Y a trabajar:
workingMemory.fireAllRules();
Nota, los try / catch de todas las pisbles excepciones han sido omitios.
» Leer más, comentarios, etc...
La luna ilumina por igual a culpables e inocentes
Utilizando Drools II. Caso práctico 2/2
Diciembre 27th, 2005 - [Enlace local]
Como ya hemos visto, Drools es un motor de reglas de negocio. ¿Cuándo podemos utilizar Drools?. Pues,por ejemplo:
- Cuando la lógica de negocio sea compleja pero se pueda expresar mediante cláusulas IF-THEN.
- Cuando vaya a haber muhcos cambios.
- Cuando el cliente no tiene clara su lógica de negocio.
- Cuando el cliente se exprese de manera natural mediante IF-THEN.
Básicamente, al utilizar Drools tendremos que escribir dos elementos: las reglas de negocio y el sistema que utilizará dichas reglas (a a través de Drools). Drools permite escribir reglas en lenguaje Java, Python o Groovy. En este ejemplo vamos a escribir las reglas utilizando Java. Las reglas se almacenan en un archivo DRL, que no es más que un archivo XML con la definición de las reglas. La estructura (simplificada) de un archivo DRL se muestra a continuación
- Imports de elementos de paquetes.
- Declaración de funciones auxiliares.
- Nombre del conjunto de reglas.
- Reglas
Para cada regla podemos indicar:
- Nombre de la regla.
- Parámetros (los nombres son importantes).
- Conciones para que la regla se dispare.
- Consecuencias.
A continuación se muestra un ejemplo de un archivo DRL completo para el ejemplo que expusimos en el post aterior. Concretamente este archivo DRL incluye una regla por la que, si el precido de un pedido es superior a 100, le descuenta el 5%.
<?xml version="1.0"?>
<rule-set name="BusinessRulesSample"
xmlns="http://drools.org/rules"
xmlns:java="http://drools.org/semantics/java"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="http://drools.org/rules rules.xsd
http://drools.org/semantics/java java.xsd">
<java:import> java.lang.Object </java:import>
<java:import> java.lang.String </java:import>
<java:import> ebr.beans.Pedido </java:import>
<rule name="Calculo del total del pedido">
<parameter identifier="pedido">
<class>ebr.beans.Pedido</class>
<java:condition>
pedido.getCalculoTotalOriginal() >= 100.0
</java:condition>
<java:consequence>
pedido.setTotalFinal(pedido.getCalculoTotalOriginal() * 0.95);
</java:consequence>
</rule>
Para disparar esta regla vamos a escribir, en prime lugar, los beans que van a guardar la información
del workspace y un sencillo programa que utilice el motor. Uno de los beans guardará información sobre cada producto (nombre cantidad y precio) y el otro guardará la lista de productos. El sgeundo bean se muestra a continuación.
import java.util.*;
public class Pedido {private List entradas;
private double totalFinal;
public Pedido() {
entradas = new ArrayList();
this.totalFinal = -1.0;
} public void addEntrada (Entrada e) {
this.entradas.add(e);
}
public List getEntradas() {
return this.entradas;
}
public void getEntradas(List entradas) {
this.entradas = entradas;
}
public double getCalculoTotalOriginal() {
Entrada e;
double total = .0;
Iterator it = this.entradas.iterator();
while(it.hasNext()) {
e = (Entrada) it.next();
total += e.getCantidad();
}
return total;
}
public void setTotalFinal(double total) {
this.totalFinal = total;
}
Para trabajar con Drools necesitamos importar los sigientes elementos:
import java.io.IOException;
import org.drools.DroolsException;
import org.drools.RuleBase;
import org.drools.WorkingMemory;
import org.drools.event.DebugWorkingMemoryEventListener;
import org.drools.io.RuleBaseLoader;
import org.xml.sax.SAXException;
Lo primero que tenemos que hacer es crear un nuevo pedido:
Entrada e1 = new Entrada("A", 10, 5);
Entrada e2 = new Entrada("B", 6, 6);
Pedido pedido = new Pedido();
pedido.addEntrada (e1);En este pedido tenemos 10 unidades del producto A cada una a un precio de 5 y 6 unidades del B a un
precio de 6. A continuación creamos nuestro motor de reglas para que procese el archivo de reglas visto más arriba:
BREngine br = new BREngine();
RuleBase businessRules = RuleBaseLoader.loadFromUrl(
BREngine.class.getResource( "rules01.drl" ) );
Limpiamos el espacio de trabajo e instalamos un listener que será avisado cada vez que Drools ejecute una regla. Este listener mostrará un mnesaje por la salida estándar.
WorkingMemory workingMemory = businessRules.newWorkingMemory();
workingMemory.addEventListener(new DebugWorkingMemoryEventListener());
A continuación añadimos el pedido:
workingMemory.assertObject(fact);
Y a trabajar:
workingMemory.fireAllRules();
Nota, los try / catch de todas las pisbles excepciones han sido omitios.
» Leer más, comentarios, etc...
Null Pointer Exception
Los 50 mejores robots de siempre
Diciembre 27th, 2005 - [Enlace local]
La revista wired ha publicado un curioso artÃÂculo en el que clasifica a los mejores 50 robots de la historia, reales o de ficción, en el que podemos encontrar sorpresas como estas:
En el puesto 48 está situado el entrañable KITT, de la serie "El coche fantástico", inseparable compañero de aventuras de Michael Knight, aunque este último prefirió la compañÃa de rubias siliconadas que la de su fiel robot. No obstante nos hizo pasar agradables momentos en nuestra infancia (sé que algunos también pasásteis una agradable adolescencia con las mencionadas rubias). En el puesto 46 se encuentra el robot-aspirador de iRobot Corporation, la empresa que más éxito tuvo llevando la robótica a nuestros hogares. Esta misma empresa ha colocado en el puesto 36 del ranking a PackBot, un robot militar que está operando en los conflictos de Afganistán e Irak.
En el puesto 20, justo por detrás del mÃÂtico R2-D2, se encuentra Mindstorms, el juguete para niños y mayores creado por Lego y con el que muchÃÂsima gente se ha introducido en el maravilloso mundo de la robótica (entre ellos el que suscribe). Seguramente con un poco más de apoyo por parte de Lego a este producto, estarÃÂa situado mucho más arriba en el ranking, aunque parece que hay rumores de que Lego va a impulsar Mindstorms proximamente (¿tendremos un nuevo RCX en el 2006?). En fin, como aficionado a Lego Mindstorms, me alegra muchÃÂsimo verlo en esta clasificación.
Como he dicho, el ranking es cuanto menos "curioso", y aunque es entretenido, su resultado es dificil de comprender muchas veces: mezcla demasiado robots reales con robots de ficción, algunos robots no son demasiado conocidos en España, etc.... Pero me gustarÃÂa reseñar los robots que han quedado en 3º y 1º lugar: la medalla de bronce se la han llevado los robots Spirit y Opportunity, que a pesar de estar preparados para una misión de tres meses explorando el planeta rojo, llevan dos años enviando valiosÃÂsima información. En el primer puesto del ranking está el ya famoso Stanley, vencedor de la Darpa Grand Challenge
Personalmente me hubiera gustado más un ranking "serio" sin tantas referencias a la ficción. Además me ha parecido ver cierta minusvaloración a los robots japoneses. También hay poquitos robots europeos. ¿Echáis en falta algún robot?
» Leer más, comentarios, etc...
Generación dinámica de libros Excel
Diciembre 27th, 2005 - [Enlace local]
Muchas veces debemos ser capaces de exportaciones a Excel que contengan datos de nuestra aplicación.
El problema es que los libros de Excel con extensión .xls son archivos binarios. Si tenemos suerte y la máquina es Windows, y tiene instalado Microsoft Excel, podremos usar los controles ActiveX de éste para generar los archivos.
Si no, tendremos que implementar, o utilizar algunas de la librerÃa que permiten acceder a archivos binarios de Excel. Lo que nos dará bastantes quebraderos de cabeza; o bien conformarnos con una exportación a CSV.
El caso es que de casualidad, viendo la exportación a Excel de phpMyAdmin, he visto que se pueden generar hojas de Excel, utilizando XML con una DTD concreta. Lo que facilita muchÃsimo la programación.
La cosas serÃa más o menos asÃ:
<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<style id="Classeur1_16681_Styles"></style>
</head>
<body>
<div id="Classeur1_16681" align=center x:publishsource="Excel">
<table x:str border=0 cellpadding=0 cellspacing=0 style='border-collapse: collapse'>
<tr>
<td>Celda A1</td>
<td>Celda B1</td>
<td>Celda C1</td>
</tr>
<tr>
<td>Celda A2</td>
<td>Celda B2</td>
<td>Celda C2</td>
</tr>
<tr>
<td>Celda A3</td>
<td>Celda B3</td>
<td>Celda C3</td>
</tr>
</table>
</div>
</body>
</html>
Los archivos asà generados, funcionan sin problemas con Excel 2000 y superiores.
Puedes descargar el ejemplo (2 Kb. en formato XLS), y visualizarlo con cualquier editor de textos, para hacerte una idea de como funciona este enfoque.
El principal problema de esta solución, es que los libros asà creados, no funcionan con normalidad en OpenOffice. Al menos no con la versión 2.0.
» Leer más, comentarios, etc...
Generación dinámica de libros Excel
Diciembre 27th, 2005 - [Enlace local]
Muchas veces debemos ser capaces de exportaciones a Excel que contengan datos de nuestra aplicación.
El problema es que los libros de Excel con extensión .xls son archivos binarios. Si tenemos suerte y la máquina es Windows, y tiene instalado Microsoft Excel, podremos usar los controles ActiveX de éste para generar los archivos.
Si no, tendremos que implementar, o utilizar algunas de la librerÃa que permiten acceder a archivos binarios de Excel. Lo que nos dará bastantes quebraderos de cabeza; o bien conformarnos con una exportación a CSV.
El caso es que de casualidad, viendo la exportación a Excel de phpMyAdmin, he visto que se pueden generar hojas de Excel, utilizando XML con una DTD concreta. Lo que facilita muchÃsimo la programación.
La cosas serÃa más o menos asÃ:
<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<style id="Classeur1_16681_Styles"></style>
</head>
<body>
<div id="Classeur1_16681" align=center x:publishsource="Excel">
<table x:str border=0 cellpadding=0 cellspacing=0 style='border-collapse: collapse'>
<tr>
<td>Celda A1</td>
<td>Celda B1</td>
<td>Celda C1</td>
</tr>
<tr>
<td>Celda A2</td>
<td>Celda B2</td>
<td>Celda C2</td>
</tr>
<tr>
<td>Celda A3</td>
<td>Celda B3</td>
<td>Celda C3</td>
</tr>
</table>
</div>
</body>
</html>
Los archivos asà generados, funcionan sin problemas con Excel 2000 y superiores.
Puedes descargar el ejemplo (2 Kb. en formato XLS), y visualizarlo con cualquier editor de textos, para hacerte una idea de como funciona este enfoque.
El principal problema de esta solución, es que los libros asà creados, no funcionan con normalidad en OpenOffice. Al menos no con la versión 2.0.
» Leer más, comentarios, etc...
Detectando UTF8 en C
Diciembre 27th, 2005 - [Enlace local]
Como no tengo ganas de seguir haciendo informes de Zulliger, acabo de terminar mi detector de UTF-8 en C. Demoré 5 minutos en captar que la variable que almacena cada byte debÃa ser un unsigned char en vez de un char para realizar las comprobaciones correspondientes. El código es muy similar al de PHP; me di cuenta que la comprobación por bit es más rápida que la por valor (mayor a 128), asà que corregiré la entrada correspondiente en el artÃculo de PHP.
Utilizo iconv para realizar la transformación de ISO-8859-1 en UTF-8. La forma de realizar el traspaso la tome de The GNU C Library: A complete iconv example, asà que disculpen las brutalidades
- #include <string.h>
- #include <iconv.h>
- #define UTF_8 1
- #define ASCII 2
- #define ISO_8859_1 3
- #define TRUE 1
- #define FALSE 0
- #define BUFFER 255
- typedef short int t_encoding;
- typedef short int bool;
- t_encoding codificacion(const char *texto);
- t_encoding
- codificacion(const char *texto)
- {
- int c = 0,
- i = 0;
- unsigned char byte = 0;
- bool ascii = TRUE;
- for (i = 0; byte = texto[i]; i++) {
- if (c > 0) {
- if ((byte >> 6) != 0×2) {
- return ISO_8859_1;
- } else {
- c–;
- }
- } else if (byte & 0×80) {
- ascii = FALSE;
- if ((byte >> 5) == 0×6) {
- c = 1;
- } else if ((byte >> 4) == 0xE) {
- c = 2;
- } else if ((byte >> 3) == 0×14) {
- c = 3;
- } else {
- return ISO_8859_1;
- }
- }
- }
- return (ascii) ? ASCII : UTF_8;
- }
- int
- main(int argc, char **argv)
- {
- iconv_t cd;
- size_t in = 0;
- size_t out = 0;
- cd = iconv_open("utf-8", "iso-8859-1");
- char *a = "ASCII";
- char *iso = "ISO: áéÃóú";
- char *b = "UTF-8: áéÃóú";
- char c[BUFFER]="";
- char *cp = c;
- in = strlen(b);
- out = BUFFER;
- iconv(cd, &b, &in, &cp, &out);
- printf("ASCII: %s %d\n", a,codificacion(a));
- printf("ISO-8859-1: %s %d\n", iso,codificacion(iso));
- printf("UTF-8: %s %d\n", c,codificacion(c));
- iconv_close(cd);
- }
Ahora, lo único que falta es crear la extensión correspondiente en Ruby, para ahorrar tiempo en catori
» Leer más, comentarios, etc...
Detectando UTF8 en PHP
Diciembre 27th, 2005 - [Enlace local]
No resistà la tentación de hacer lo mismo que hice en Detectando UTF-8 en Ruby, pero en PHP. El resultado es el siguiente:
- define("UTF_8", 1);
- define("ASCII", 2);
- define("ISO_8859_1", 3);
- function codificacion($texto)
- {
- $c = 0;
- $ascii = true;
- for ($i = 0;$i<strlen($texto);$i++) {
- $byte = ord($texto[$i]);
- if ($c>0) {
- if (($byte>>6) != 0×2) {
- return ISO_8859_1;
- } else {
- $c–;
- }
- } elseif ($byte&0×80) {
- $ascii = false;
- if (($byte>>5) == 0×6) {
- $c = 1;
- } elseif (($byte>>4) == 0xE) {
- $c = 2;
- } elseif (($byte>>3) == 0×14) {
- $c = 3;
- } else {
- return ISO_8859_1;
- }
- }
- }
- return ($ascii) ? ASCII : UTF_8;
- }
- function utf8_encode_seguro($texto)
- {
- return (codificacion($texto)==ISO_8859_1) ? utf8_encode($texto) : $texto;
- }
Lo pueden probar con
- $a="Ascii";
- $b="ISO-8859-1: áéÃóú";
- $c=utf8_encode($b);
- echo utf8_encode_seguro($a)."\n";
- echo utf8_encode_seguro($b)."\n";
- echo utf8_encode_seguro($c)."\n";
Si me da el ánimo, haré lo mismo en C. No creo que sea nada tan terrible…
» Leer más, comentarios, etc...
Detectando UTF8 en ruby
Diciembre 27th, 2005 - [Enlace local]
Trabajando en catori, me di cuenta que era muy conveniente transformar todos los datos de los archivos, tales como el nombre del artista y ese tipo de cosas, en UTF-8. El problema, claro está, es saber si el string ya está en el código citado.
La siguiente adición a la clase String permite, de forma muy bruta, determinar si estamos ante ascii, utf8 o iso-8859-1. Para convertir a utf8, se requiere tener la extensión ‘iconv’ de ruby.
Cuando tenga un poco de tiempo, voy a portar a C esta adición, ya que la utilizo mucho y en el lenguaje de la letrita podrÃa ganar algunos valiosos segundos
- require "iconv"
- class String
- def encoding
- cuenta=0
- ascii=true
- self.each_byte{|byte|
- if cuenta>0
- if (byte >> 6) != 0b10
- return "iso8859"
- else
- cuenta-=1
- end
- elsif(byte & 0×80)
- ascii=false
- if (byte >> 5) == 0b110
- cuenta=1
- elsif (byte >> 4) == 0b1110
- cuenta=2
- elsif (byte >> 3) == 0b11110
- cuenta=3
- else
- return "iso8859"
- end
- end
- }
- return ascii ? "ascii":"utf8"
- end
- def to_utf8
- (self.encoding==‘iso8859‘) ? Iconv.new("utf-8","iso-8859-1").iconv(self.to_s) : self
- end
- end
» Leer más, comentarios, etc...
Y WiMax??
Diciembre 27th, 2005 - [Enlace local]
Que es lo que ha pasado, esta tednologia se anuncia con bombos y platillos, pero hasta el dia de hoy no veo producto ni para desktop ni para laptop, si alguien conoce algun producto, y claro que sea a un precio razonablemente para una empresa o una casa.
Busque en google, pero no aparece nada y lo poco que aparece es casos de exitos y algunos de los pocos productos que aparecieron son de empresas que realmente su costo esta muy por encima de cualquier tecnologia del mercado comparable.
Si alguien conoce algun producto por favor deje un comentario.
» Leer más, comentarios, etc...
vnsjava
Y WiMax??
Diciembre 27th, 2005 - [Enlace local]
Que es lo que ha pasado, esta tednologia se anuncia con bombos y platillos, pero hasta el dia de hoy no veo producto ni para desktop ni para laptop, si alguien conoce algun producto, y claro que sea a un precio razonablemente para una empresa o una casa.
Busque en google, pero no aparece nada y lo poco que aparece es casos de exitos y algunos de los pocos productos que aparecieron son de empresas que realmente su costo esta muy por encima de cualquier tecnologia del mercado comparable.
Si alguien conoce algun producto por favor deje un comentario.