Noticias Weblogs Foros Wiki Código

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

AjaxTrans

Diciembre 31st, 2005 - [Enlace local]

LogoCurioso 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]

PortadaDesde 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.

.

» Leer más, comentarios, etc...

Workshops

Diciembre 30th, 2005 - [Enlace local]

Aunque algunos me dirán que existen varios en España, la verdad es que no lo tengo tan claro. Quizás existen eventos comerciales que utilizan la palabra Workshop, pero no creo que estemos hablando de lo mismo (aunque alguno ha habido, lo reconozco). Yo hablo de los workshops que tienen lugar en otros países, por ejemplo Estados Unidos, dónde bien una empresa, bien un profesional reconocido, ofrece sesiones de entre 4 horas y 3 días para aprender en profundidad “xxx”.





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]

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...

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]

Siguiendo con las ideas sobre herramientas para medir la calidad de la información, hay un efecto curioso que se ve repetido en multitud de foros técnicos (y no tan técnicos). Le llamamos el efecto dominó, y se basa en la filosofía que Goebbels, ministro de propaganda nazi, utilizaba para convencer de sus atrocidades al pueblo:

“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 :P . Por lo que he visto, PHP es sumamente facil de aprender, bueno tal vez me sirvio de base mis conocimientos en C/C++/C# :D , 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 :P .

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 :P . 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 :D .

» 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 :P

» 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:

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:

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:



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



Para cada regla podemos indicar:



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:



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



Para cada regla podemos indicar:



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

  1.  #include <string.h>
  2.  #include <iconv.h>
  3.  
  4.  #define UTF_8 1
  5.  #define ASCII 2
  6.  #define ISO_8859_1 3
  7.  
  8.  #define TRUE 1
  9.  #define FALSE 0
  10.  #define BUFFER 255
  11.  
  12.  typedef short int t_encoding;
  13.  typedef short int bool;
  14.  t_encoding      codificacion(const char *texto);
  15.  
  16.  t_encoding
  17.  codificacion(const char *texto)
  18.  {
  19.      int            c = 0,
  20.      i = 0;
  21.      unsigned char  byte = 0;
  22.      bool            ascii = TRUE;
  23.      for (i = 0; byte = texto[i]; i++) {
  24.      if (c > 0) {
  25.          if ((byte >> 6) != 0×2) {
  26.          return ISO_8859_1;
  27.          } else {
  28.          c–;
  29.          }
  30.      } else if (byte & 0×80) {
  31.          ascii = FALSE;
  32.          if ((byte >> 5) == 0×6) {
  33.          c = 1;
  34.          } else if ((byte >> 4) == 0xE) {
  35.          c = 2;
  36.          } else if ((byte >> 3) == 0×14) {
  37.          c = 3;
  38.          } else {
  39.          return ISO_8859_1;
  40.          }
  41.      }
  42.      }
  43.      return (ascii) ? ASCII : UTF_8;
  44.  }
  45.  
  46.  
  47.  int
  48.  main(int argc, char **argv)
  49.  {
  50.      iconv_t        cd;
  51.      size_t          in = 0;
  52.      size_t          out = 0;
  53.      cd = iconv_open("utf-8", "iso-8859-1");
  54.      char          *a = "ASCII";
  55.      char          *iso = "ISO: áéíóú";
  56.      char          *b = "UTF-8: áéíóú";
  57.      char            c[BUFFER]="";
  58.      char          *cp = c;
  59.      in = strlen(b);
  60.      out = BUFFER;
  61.      iconv(cd, &b, &in, &cp, &out);
  62.      printf("ASCII: %s %d\n", a,codificacion(a));
  63.      printf("ISO-8859-1: %s %d\n", iso,codificacion(iso));
  64.      printf("UTF-8: %s %d\n", c,codificacion(c));
  65.      iconv_close(cd);
  66.  }

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:

  1.  <?php
  2.  define("UTF_8", 1);
  3.  define("ASCII", 2);
  4.  define("ISO_8859_1", 3);
  5.  function codificacion($texto)
  6.  {
  7.      $c = 0;
  8.      $ascii = true;
  9.      for ($i = 0;$i<strlen($texto);$i++) {
  10.          $byte = ord($texto[$i]);
  11.          if ($c>0) {
  12.              if (($byte>>6) != 0×2) {
  13.                  return ISO_8859_1;
  14.              } else {
  15.                  $c–;
  16.              }
  17.          } elseif ($byte&0×80) {
  18.              $ascii = false;
  19.              if (($byte>>5) == 0×6) {
  20.                  $c = 1;
  21.              } elseif (($byte>>4) == 0xE) {
  22.                  $c = 2;
  23.              } elseif (($byte>>3) == 0×14) {
  24.                  $c = 3;
  25.              } else {
  26.                  return ISO_8859_1;
  27.              }
  28.          }
  29.      }
  30.      return ($ascii) ? ASCII : UTF_8;
  31.  }
  32.  
  33.  function utf8_encode_seguro($texto)
  34.  {
  35.      return (codificacion($texto)==ISO_8859_1) ? utf8_encode($texto) : $texto;
  36.  }
  37.  ?>

Lo pueden probar con

  1.  <?php
  2.  $a="Ascii";
  3.  $b="ISO-8859-1: áéíóú";
  4.  $c=utf8_encode($b);
  5.  echo utf8_encode_seguro($a)."\n";
  6.  echo utf8_encode_seguro($b)."\n";
  7.  echo utf8_encode_seguro($c)."\n";
  8.  ?>

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

  1.  require "iconv"
  2.  class String
  3.      def encoding
  4.      cuenta=0
  5.      ascii=true
  6.      self.each_byte{|byte|
  7.          if cuenta>0
  8.              if (byte >> 6) != 0b10
  9.                  return "iso8859"
  10.              else
  11.                  cuenta-=1
  12.              end
  13.          elsif(byte & 0×80)
  14.              ascii=false
  15.              if (byte >> 5) == 0b110
  16.                  cuenta=1
  17.              elsif (byte >> 4) == 0b1110
  18.                  cuenta=2
  19.              elsif (byte >> 3) == 0b11110
  20.                  cuenta=3
  21.              else
  22.                  return "iso8859"
  23.              end
  24.          end
  25.      }
  26.      return ascii ? "ascii":"utf8"
  27.      end
  28.      def to_utf8
  29.          (self.encoding==iso8859) ? Iconv.new("utf-8","iso-8859-1").iconv(self.to_s) : self
  30.      end
  31.  end

» Leer más, comentarios, etc...

Y WiMax??

Diciembre 27th, 2005 - [Enlace local]

Hace 12 meses que conoci la nueva tecnologia Wimax, pero al dia de hoy no veo productos para esta tecnologia, intel que es una de las sonadas solo la he visto en en chips, donde estan los productos de para el consumo tanto para la empresa como para la casa, donde me pregunto?




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]

Hace 12 meses que conoci la nueva tecnologia Wimax, pero al dia de hoy no veo productos para esta tecnologia, intel que es una de las sonadas solo la he visto en en chips, donde estan los productos de para el consumo tanto para la empresa como para la casa, donde me pregunto?

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...

Información legal y técnica