miércoles, 5 de marzo de 2008

de bombardeos y discos duros

¿Realmente cree el presidente de Colombia Alvaro Uribe que puede someter un disco duro al escrutinio internacional para acusar al Presidente Rafael Correa de tener estrechas relaciones con la insurgencia colombiana sin la mínima tarea de contrastar la información con los hechos?.

Colombia bombardeó territorio ecuatoriano el pasado primero de marzo a pretexto de defenderse, pero mientras transcurren las horas se van aclarando lo ocurrido hasta comprobarse la masacre de insurgentes y el ultraje a la soberanía ecuatoriana. El presidente Correa reacciona y expulsa al embajador colombiano, el gobierno de Uribe responde presentando supuestas pruebas, almacenadas en un disco duro, de la estrecha relación del gobierno ecuatoriano con los insurgentes colombianos.

Los discos duros son como algunos medios que aguantan todo. Para los informáticos lo más importante es contrastar la información almacenada por nuestros sistemas con la realidad, por la simple y sencilla razón de que toda información almacenada es alterable al cien por ciento si una mano irresponsable lo quiere hacer (por ejemplo un hacker, un funcionario corrupto o un presidente tramposo). Someter un disco duro al análisis técnico internacional resulta inútil en este caso y por decir lo menos.

Contrastemos entonces la realidad del presidente Correa: a buscado desde el inicio de su gobierbo acercamientos con el gobierno de Alvaro Urive quien incluso estuvo presente en la inauguración de la Asamblea Constituyente en Montecristi. Ha sabido mantener bien definido y separado de otros aspectos bilaterales las consecuencias del otro bombardeo: el del glifosato. A seguido la tradición de mantenernos alejados del conflicto interno de Colombia. El presidente y el país entero está preocupado por las inundaciones en las provincias costeras. Otra preocupación nacional es el proceso de reformas que se cocina en Montecristi. El Departamento de Estado Norteamericano dice que Ecuador combate bien al narcotráfico que viene desde Colombia y Perú. También hemos visto al presidente Correa mejorando relaciones con países como Malasia, Indonesia y China con el objeto de abrir nuevos mercados.

¿Algo de esto consta en el disco duro o afecta a los Colombianos al punto en que podría acusarse al Presidente Correa de atentar contra la seguridad interna del vecino del norte de la misma manera que la maquinaria bélica bombardeó territorio ecuatoriano?

Para ser justos deberíamos contrastar la realidad del presidente Uribe que empieza por la sus contactos con los paramilitares y el “recordado” Pablito Escobar, pero eso le dejo a la propia prensa de Colombia. De lo que no cabe duda es su adicción al Power Point.

sábado, 1 de marzo de 2008

La estética del “Webmaster”

Siempre me fijo en los la estética de los portales web nacionales (de los de acá, de la República del Ecuador – que ya es de todos) y siempre me termino preguntando lo mismo: ¿Es que tal o cual empresa no tenían para pagar un buen diseñador gráfico, un buen fotógrafo? alguien que al menos sepa equilibrar colores, después de todo las artes en este país han sido bien cultivadas.

Tenemos buenos arquitectos, diseñadores industriales, expertos en calidad, procesos y las facultades de arquitectura han dado saltos al campo del diseño gráfico; entonces ¿por qué esos profesionales no participan a la hora de construir un portal web corporativo?

El caso más patético debe ser el del periódico HOY cuyo formato muy elegante en papel es similar al del periódico norteamericano USA TODAY, sin embargo la calidad del diseño de su portal deja mucho que desear.

Otros casos de ediciones digitales: la estructura del portal de El Comercio de Quito (http://www.elcomercio.com) es excelente pero su tonalidad azul celeste le hace muy monótono, mientras que el de Ecuador Inmediato me resulta de alto contraste. El portal de “La Hora” (http://www.lahora.com.ec) en cambio tiene un diseño muy ordinario. Aclaro que soy muy asiduo lector de dichos portales, me mantuvieron conectado al país durante muchos años que viví fuera.

Ni hablar de ciertos diseños corporativos que como “front page” colocan una pesada presentación en flash.

Como programador de aplicaciones de vez en cuando me toca hacer portales web y los resultados estéticos sueles ser deplorables aunque siempre me preocupo de lograr toda la funcionalidad requerida. En esto debo ser honesto, la calidad de programador la juzgan aquellos para quienes trabajo pero soy un pésimo diseñador gráfico y creo que eso le ocurre a todo aquel que hace páginas web, algunos de los cuales se hacen llamar “webmaster”.

Tampoco creo que las avanzadas herramientas gráficas como Gimp o fotoshop hagan de cualquier cevichómano o webmaster un artista.

La tecnología por si sola no trae la estética, para ello son necesario artistas que construyan una capa de arte sobre la la capa tecnológica.

sábado, 23 de febrero de 2008

Pantallas en VB6 ...

sigue siendo la iniciativa de la Industria de Software ecuatoriana al mercado mundial en momentos en que el mundo regresa a ver a América del Sur como una importante fuente de iniciativa e imaginación para el desarrrollo de software.

Por América del Sur, europeos y norteamericanos vinculados a la industria IT, "entienden" principalmente a Brasil y Argentina, donde el potencial humano y creativo renace sobre la base de la retro-alimentación mutua entre la comunidad y el software libre y código abierto. La razón competitiva es simple: en Brasil los ingenieros y tecnólogos de software saben y les gusta programar, y lo más importante son pagados por ello con sueldos dignos de técnicos. El diseño y la programación orientada a objetos, los entornos de trabajo y los nuevos conceptos alrededor de servicios como ESB y SOA no son extraños a la industria.

Acá en la República del Ecuador mientras tanto, el técnico programador sigue siendo un sugeto explotable al mismo nivel de una trabajadora doméstica. Instituciones financieras contratan secretarias por 350 dólares mensuales e ingenieros de sistemas por 200, mientras que los grandes contratos informáticos tienen más de amarre, corrupción y engaño que de tecnología.

El “efecto pantalla” generado por gran parte de la industria local con Visual Basic como su herramienta estratégica ha dañado el mercado y es muy poco lo que puede ofrecer. Peor aún si los abundante ingenieros de sistemas generados por las abundantes universidades creen que nos es necesario saber programar para hacer software... absurdo !

viernes, 25 de enero de 2008

¿Qué paso con Java en el 2007?

Se afianzó la máquina virtual (JVM) sin duda y la versión 6.0 nos trajo algunas mejoras como aquella de permitir la ejecución de scripts en otros lenguajes dentro de su código, lo que le permitirá a los fabricantes de software construir grandes aplicaciones con soporte de “macros” y “plugins”. Por supuesto para hacerlo necesitamos un poco mas de teoría.

Algunos desarrolladores han comenzado a sentir como que las cosas se quedan con el lenguaje (no con JVM), para Bruce Ekcel (autor del memorable “Thinking on Java”) nos plantea en un artículo que Java sigue atado al pasado y por lo tanto eso detiene su evolución, y nos recomienda un nuevo lenguaje (otro !) llamado Scala.

El avance real de la tecnología Java se dio el año anterior se basa en la implementación de lenguajes dinámicos (muy dinámicos) sobre JVM, JRuby y Groovy son un buen ejemplo de ello, también han evolucionado los frameworks desde los ya clásicos Spring y Hibernate, hasta los pujantes Grails y JRuby/Rails. Además fue el año de NetBeans, el super IDE construido por Sun.

La manera como otras tecnologías, como Ruby y Rails, pudieron agarrar el tranco de la tecnología Java, fue por que Sun las migró y las recostó sobre JVM y las hizo parte de NetBeans en un matrimonio perfecto. Ruby y Ruby on Rails son excelentes y para sobrevivir necesitaban estar sobre JVM.

sábado, 15 de diciembre de 2007

Java 1.5/1.6 es Multi-core, ejemplo

Se dijo anteriormente que Java es multi-core, para probar esta aseveración primeramente vamos a definir una tarea que pueda se corrida en paralelo, el siguiente código es simplemente la definición de esta tarea que no tiene nada de extraño en cuanto a la programación multi-thread:

  1  package multicore;
  2  
  3  public class ParallelTask implements Runnable {
  4  
  5     double result = 0 ;
  6  
  7     double taskNo = Math.random()*100 ;
  8  
  9     public void run() {
 10         System.out.println("Starting task No " + Math.floor(taskNo)) ;
 11        
 12         for(int i=0;i<20000000;i++)
 13             result = Math.sin(i) ;
 14         System.out.println("finishing task No " + Math.floor(taskNo)) ;
 15     }
 16  }

Al ser ejecutada la tarea (run) se efectuará la operación trigonométrica seno, unos 20 millones de veces. La idea es esta tarea sea lo suficientemente larga para detectar varias instancias de esta clase ejecutándose en paralelo.

El siguiente código, nuevo para las versiones 1.5 y posteriores, efectivamente crea 6 tareas (pt1, pt2, ...) y las ejecuta en paralelo.

  1  package multicore;
  2 
  3  import java.util.concurrent.Executors ;
  4  import java.util.concurrent.ExecutorService ;
  5 
  6  public class Main {
  7  
  8     public static void main(String[] args) {
  9  
 10         ParallelTask pt1 =new ParallelTask() ;
 11         ParallelTask pt2 =new ParallelTask() ;
 12         ParallelTask pt3 =new ParallelTask() ;
 13         ParallelTask pt4 =new ParallelTask() ;
 14         ParallelTask pt5 =new ParallelTask() ;
 15         ParallelTask pt6 =new ParallelTask() ;
 16 
 17         ExecutorService es =  Executors.newFixedThreadPool(4) ;
 18 
 19         es.execute(pt1) ;
 20         es.execute(pt2) ;
 21         es.execute(pt3) ;
 22         es.execute(pt4) ;
 23         es.execute(pt5) ;
 24         es.execute(pt6) ;
 25 
 26         es.shutdown() ;
 27     } 
 28  
 29  }

Para ejecutar en paralelo primeramente se define el número de cores (newFixedThreadPool(4)), en este caso estamos definiendo 4 cores, si se definen menos cores entonces la aplicación se ejecutará únicamente es ese número de cores quedando los restantes disponibles. Si se definen más de los existentes, algunas tareas simularán multiprocesamiento.

En este caso se han definidos más tareas que cores, en tal caso las tares que “no alcancen en la camioneta” esperarán a que uno de los cores quede dispoble.

La pregunta natural es: ¿como me aseguro que utilizo todos los cores?, yo prefiero utilizar el utilitario “no oficial” de unix/linux “mpstat”. El siguiente es un ejemplo de utilización

$ mpstat -P ALL 10 3

Este comando dará un resumen del desempeño de cada core (CPU), 3 veces cada 10 segundos.

viernes, 7 de diciembre de 2007

Java 1.5/1.6 es Multi-core

SI, definitivamente Java escala con el número de “cores” y lo hace bien. No Había tenido tiempo de revisar, si no hasta ahora, si tenía o no la capacidad de escalar, sabiendo que los procesadores multi-core son populares... o mejor dicho “ya son de todos”.

Cumplo mi tarea en desarrollo de software sobre una estación de trabajo Sun Ultra 40 con SuseLinux 10.3, lo que me permite observar muy detalladamente que ocurre con Java, pues más de un foro señalaba la imposibilidad de escalamiento debido al modelo de memoria de JVM (noticia que parece confirmarse para versiones anteriores a la 1.5).

El problema me resultaba relativamente nuevo. Si bien he hecho programación multi-thread desde hace algunos años, no me había preocupado del tema hasta que debí evaluar el desempeño de un modelo matemático en C/C++/Fortran sobre plataformas Linux/Unix.

Los threads en Java o C# simulan procesamiento en paralelo en un solo procesador. ¿Qué pasa si realmente tenemos más de un CPU en la máquina? ¿dejará de simular y distribuirá el trabajo entre diferentes procesadores? Esto es lo deseable. La primera aplicación que probé hace algunos meses era en C# sobre plataforma Mono.net en que cada thread maneja un sistema independiente de matrices, es decir: no necesito sincronizar datos. Al correr en la estación de trabajo con cuatro cores la plataforma Mono.net reconoció todos y cada unos de ellos y escaló la aplicación en forma prácticamente ideal (insisto: no necesitaba sincronización, caso contrario el escalamiento ya no hubiese resultado tan perfecto), los procesadores eran Opteron dual core de 3 Ghz. Llevé la misma prueba a una máquina con dos cores Xeón de 3 Ghz y el escalamiento fue igual de bueno.

Un artículo de Javalobby, “Java: Multi-core Ready or not?” de Jim Falgout, que plantea que todo está listo en Java para multi-core, me animó a hacer unas cuantas pruebas con Java 1.6 y con Groovy 1.1 RC3 que resultaron exitosas y muy alentadoras. Pude también comprobar que Groovy es el doble de lento que Java y no 30 veces mas como se afirman en algunos foros.

Mas detalles con código en mis próximas entradas de blog.

sábado, 1 de diciembre de 2007

Disculpen mi ignorancia. . .

. . . quisiera hacer las siguientes preguntas:

¿Sabe alguien cuál es la diferencia entre "software gratis" y "software libre"?

¿Y cuál es la relación "software libre" y "código abierto"?

¿Cómo influyen los tipos de licencias en el desarrollo de software?

En algún momento me perdí de los detalles y de pronto todo el mundo comenzó a hablar del asunto, hasta los Presidentes Chávez, Correa y el Evo. (¿Qué tiene que ver el software libre con socialismo?)

Mi preocupación diaria es que el software con el que trabajo se abierto (open source), que por lo general también es gratis (dependiendo de la licencia)...

sábado, 24 de noviembre de 2007

Migrando Stored Procedures a Groovy

Confiezo uno de mis mayores pecados: fui fanático de los Procedimientos Almacenados (stored procedures) en entornos de base de datos, eso fue hasta el año 2001 debido a las críticas no solamente de los autores sino de los gerentes de sistemas con los que trabajaba. De hecho abandonar dicha técnica fue una obligación, ya que un sistema que tube que mantener por 18 meses no los utilizaba (había una prohibición expresa) y tampoco utilizaba vistas !!!.

Había una razón muy importante para ello, el software funcionaba con tres sistemas bases de datos diferentes: Oracle, SqlServer e Interbase según las disponibilidad de cada una de los 43 empresas donde funcionaba el sistema. En tal caso como programador me tocó desempolvar mis conocimientos de estructuras de datos y familiarizarme con UML.

Hoy no voy a detallar los pros y contras de desarrollar con Procedimientos almacenados. Pero si les voy a contar que hace unos meses tube que migrar rápidamente una base de datos a estructuras en memoria construídas con C#. Habían algunos miles de líneas en TransactSql, las que debían ser analizadas cuidadosamente unas veces para mantener la misma lógica y otras para corregirla.

La manera más rápido de hacerlo fue analizar los Cursores, pero no con SQL Server, sino con Groovy.

Los cursores son la razón de ser los lenguajes almacenados.

Miremos la porción de código en TransactSql:

  1  .
  2  .
  3  .
  4  set @anio = 2007
  5  
  6  declare MICURSOR cursor for
  7      select
  8          p.PVEHAMOD as anio_modelo,
  9          c.CVEHCATV as cod_categoria_v,
 10          p.PVEHFECO as fe_co
 11      from
 12          CVEH c,
 13          PVEH p
 14      where
 15              c.CVEHCATV = p.CVEHCATV
 16          and p.PVEHANIO = @anio
 17  
 18  for each row in MICURSOR {
 19      // ...
 20      // manejar cada registro del cursor
 21      // ...
 22  }
 23  .
 24  .
 25  .

Y ahora analicemos el equivalente en Groovy ...

  1  .
  2  .
  3  .
  4  int anio = 2007
  5  
  6  String mainSql = """
  7      select
  8          p.PVEHAMOD as anio_modelo,
  9          c.CVEHCATV as cod_categoria_v,
 10          p.PVEHFECO as fe_co
 11      from
 12          CVEH c,
 13          PVEH p
 14      where
 15           c.CVEHCATV = p.CVEHCATV
 16          and p.PVEHANIO = $anio """
 17  
 18  db.eachRow(mainSql) { rec ->
 19      // ...
 20      // manejar cada registro en la variable rec
 21      // ...
 22  }
 23  .
 24  .
 25  .

Esta estructura simple me permitió extraer la lógica desde unos fuentes en SQL Server para colocarla con mejoras en lenguaje C# y trabajar sobre eficientes tablas texto. Al final de cuentas el problema era matemático y no transaccional sobre base de datos.