Angel "Java" Lopez

NET, Java, PHP y Desarrollo de Software

This Blog

Syndication

Search

Tags

Community

Email Notifications

Archives

.NET

ASP.NET

Windows Form

VB.NET

C#

Sitios

Blogs

January 2008 - Posts

Seminarios gratuitos de NHibernate, en Buenos Aires

El mes de febrero, se viene interesante. El Microsoft User Group de Argentina presenta a Fabio Maulo y Darío Quintana, activos miembros del equipo de desarrollo del proyecto de código abierto NHibernate, en dos charlas, miércoles 20 y jueves 21 de Febrero, de 18:30 a 21:30hs.

Veremos a Fabio y Darío tratando los temas:

 

SEMINARIO 20/02/08 "NHibernate: ORM Persistence Framework"

- Quick Start
- Entorno de test de entities

- Manejo de Session de NHibernate: Qué cosas hacer y qué no.
- Parent-Child
- Overview Lazy-Loading

- Ejemplo de como cambiar base de datos usando los ejemplos generado
en toda la charla.
- Overview NHibernate.Validator

SEMINARIO 21/02/08 "NHibernate Advanced"

- Introducción a NHibernate
- Manejo de Sesiones.

- Conceptos y ejemplos: EntityName, SQL nativa para CRUD, Transformers, StoredProcedure, Named-Queries, Event-Listeners, Filters, MultiQuery, StatelessSession, UserType, UserCollectionType, Batch-size entre otros.
- Queries: HQL, Criteria, SQL Nativo.

- NHibernate.Shards: Estado del arte

- Tunning

Detalle, inscripción, datos adicionales, en la página del MUG:

Seminarios Gratuitos de NHibernate

Como siempre, la referencia para consultas sobre NHibernate, en español, es:

NHibernate-Hispano

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/

Posted Thursday, January 31, 2008 7:14 AM by lopez | with no comments

Filed under: , ,

Controlando la cantidad de usuarios en una aplicación web

Supongamos que que necesitemos controlar la cantidad de usuarios que puedan estar usando nuestra aplicación web, ya sea en Java/JSP/JSF, ASP.NET, PHP y variantes. Por ejemplo, por una cuestión de licencias, no queremos que haya más de N usuarios logueados.

Propongo acá una posible solución, algo así implementé alguna vez, pero no ha sido probada exhaustivamente.

Antes, alguna discusión de otras soluciones:

- Se puede tener control de la cantidad de usuarios logueados, si incrementamos un contador en el proceso de login, decrementamos el contador en el proceso de logout, o controlamos el fin de la sesión.

Hay algunos problemas a resolver:

- Puede que no tengamos un evento de fin de sesión, como pasa en PHP

- Puede que no tengamos un evento de fin de sesión, porque estamos en una granja de servidores, y nuestra tecnología (p.ej., ASP.NET) no registra el evento de fin de sesión de una forma adecuada en ese escenario

Alguien podría sugerir que pongamos algo en el browser cliente, un código javascript (o el más "cool", una llamada Ajax), para que cada página envíe un "ping" al servidor, diciendo "Estoy aquí, el usuario está vivo....". Pero eso implica colocar ese código en cada página, confiar en que el cliente tenga javascript habilitado, y quizás exija que algunos planetas esten dispuestos en línea.

Entonces, ¿qué hacemos? ¿nos entregamos a la desesperación? ¿dejamos la programación y nos dedicamos a manejar gente? o peor aún ¿nos ponemos a dibujar UML? ¡¡No!! ;-)

Podemos implementar lo siguiente:

El control debe hacerse en el login de usuario. Ahí lo dejamos pasar al usuario o no, dependiendo de un cálculo de usuarios activos que hacemos. ¿Cómo?

Para conocer los usuarios activos, en memoria (si es una aplicación corriendo en un solo servidor) o en una base de datos central (en caso de estar en una granja web), grabamos, por cada actividad de usuario (pedir una página, por ejemplo), un registro donde grabamos:

- Usuario
- Workstation (como podamos, número de IP, etc...)
- Fecha/Hora del último evento

Noten que no es un registro por evento: es un registro por Usuario+Workstation, se actualiza siempre ahi la fecha/hora de último evento. No hace falta mantener la historia de los eventos. Si el usuario pepe desde workstation1 esta pidiendo algo al sistema, actualizamos el registro que le corresponde, o lo creamos si no existe. Registros viejos, de más de una hora, o un día, se pueden borrar, periódicamente (ejecutando un store, por ejemplo, 1 de cada M actualizaciones de evento).

En el caso de ASP.NET, este registro se puede hacer en un HttpModule, sin necesidad de tocar otras partes de la aplicación. Sino, un lugar potable es colocar ese código en algún control, include o parecido, que se ejecute en el render de cada página (es muy común hoy en día, tener un componente así).

En caso de desloguearse un usuario, se borra el registro correspondiente.

Supongamos que T es el tiempo de duración de una sesión, y N la cantidad máxima de licencias. Entonces, cuando un usuario se loguea, se controla que:

- Si existe un registro para su Usuario/Workstation con fecha/hora >= hora actual - T, se lo deja pasar. Seguramente, no registramos su logout (por ejemplo, se cortó la luz) y ahora quiere entrar de nuevo.

sino

- Si existen más de N registros con fecha/hora >= hora actual - T, no se lo deja pasar

Debe haber otras soluciones, pero me parece ésta interesante, relativamente sencilla, y adoptable por distintas tecnologías. Algo similar se puede adoptar para aplicaciones en el cliente (no browser, sino una aplicación de formularios, ventanas, cliente rico).

Problemas: Hay que evaluar el impacto de tener que acceder a la base, si se decide almacenar esos registros en forma centralizada.

¿Comentarios?

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/

Posted Wednesday, January 30, 2008 8:48 AM by lopez | 3 comment(s)

Filed under: , ,

Proyecto Euler

Hace unos meses, encontré este sitio del Proyecto Euler:

http://projecteuler.net/

El nombre hace referencia a Leonard Euler, uno de los semidioses de la historia de la matemática. Euler ha dejado su impronta en varias ramas de las matemáticas, desde el análisis al álgebra, de la teoría de números, a la topología (que prácticamente fundó con su problema de los puentes de Konigsberg). Vean por ejemplo, la lista de temas en matemáticas que llevan su nombre.

El Proyecto Euler es una serie de problemas, desafíos a resolver con programación. Algunos problemas matemáticos necesitan más esfuerzo que una demostración. Son generalmente problemas de ubicar números o estructuras que cumplan con alguna condición.

Para resolver los problemas planteados, se necesita:

- Habilidades de programación

- Habilidades matemáticas, para no encarar todo por fuerza

 

Tomemos como ejemplo, el problema 108:

En la ecuación:

1/x + 1/y = 1/n

x, y, n son números enteros. Con n = 4 hay tres soluciones distintas. ¿Cuál es el menor valor de n para el que hay mil soluciones distintas?

Claro, despues tenemos el problema 110, donde se pide ubicar el menor n que tenga CUATRO MILLONES de soluciones. Creo que la Commodore 64 nos va a quedar chica... ;-)

Bueno, no tan así. La gente del proyecto nos asegura que si bien podemos tardar días en encontrar una solución adecuada de programación, el programa resultante no necesita horas de ejecución. Siguen la regla que llaman "de un minuto": si bien encontrar el algoritmo correcto puede llevar horas, todo problema puede encontrar solución con un programa bien escrito en menos de un minuto, con una computadora modesta.

Eso es lo interesante. El encontrar "el programa" implica pensar matemáticamente, más allá de nuestras habilidades de programación.

Los distintos usuarios del sitio "compiten" por ver quién resuelve más problemas. Pueden ver los 1000 top:

http://projecteuler.net/index.php?section=top

y la lista de problemas en:

http://projecteuler.net/index.php?section=problems

El más difícil parece ser:

Integer angled Quadrilaterals

Hay una sección de estadísticas, interesantísima, con la cantidad de participantes por país, y la cantidad de usuarios por lenguaje de programación:

http://projecteuler.net/index.php?section=statistics

(el lenguaje más usado es C/C++)

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/

Posted Friday, January 25, 2008 9:25 AM by lopez | with no comments

Cambiando ajlopez.com

Hace unos días, cambié la portada de mi sitio

http://www.ajlopez.com/
http://www.ajlopez.net/

Para mí, que no me dedico al diseño gráfico ni conozco mucho del tema, ha sido todo un trabajo. Creo que quedó más claro qué secciones tiene:

 

Desarrollo de Software y otros temas

Desde el comienzo de este sitio, he ido publicando enlaces, artículos y recursos en la web de los temas de desarrollo de software.
Programación, Java, .NET, XML, UML, Visual Basic, PHP, Desarrollo Web, Inteligencia Artificial, Computer Go, Patrones, Smalltalk, COBOL, y más...
También he ido coleccionando enlaces en mi nube Delicious y publicado recursos interesantes en mis blogs

 

 

 

Materiales de Cursos

 Durante más de diez años, he dado seminarios y cursos sobre temas de desarrollo de software: Java, .NET, PHP, ASP.NET, desarrollo web en general, Ajax, Hibernate, NHibernate, Spring, y otras tecnologías, librerías y frameworks.
Aquí encontraran material de esos cursos: presentaciones, ejemplos, enlaces, recursos, listos para bajar.

 

 

 

Cursos y Seminarios

  Información sobre cursos y seminarios que dicto en instituciones, grupos de usuarios, universidades y empresas.
Algunos de los temas: Arquitectura de Software, Java, JSP, J2EE, .NET, ASP.NET, PHP, Desarrollo Web, Patrones...

 

 

Proyectos

  Proyectos de código abierto que he desarrollado. En especial, mi preferido, el generador de código AjGenesis.

 

 

 

 

Blogs

  Soy un "blogger" compulsivo. Escribo diariamente en mis blogs, sobre desarrollo de software, ciencia, filosofía y temas en general

 

 

 

Sitios

  Sitios y aplicaciones web que estoy desarrollando, como el "sitio hermano" de éste, www.todocontenidos.com.

 

 

 

Go

  Juego milenario: fascinante y hermoso. Lo recomiendo a cualquiera que le gusten los juegos inteligentes. Y para los desarrolladores de software, el Go es un juego desafío de la inteligencia artificial: no hay programa de software que se acerque mínimamente al juego de un profesional.
Estos son mis enlaces sobre Go, que mantengo en mi sitio www.todocontenidos.com.

 

 

Matemáticas

Uno de mis temas preferidos. Tanto la historia como las distintas ramas de las matemáticas son tópicos interesantísimos y fascinantes. Aquí algunos enlaces que visito.

 

 

 

 

Ciencia

Estoy comenzando a escribir sobre algunos temas, tanto de historia como de fundamentos de la ciencia.

 

 

 

Tengo que mejorar algunas páginas interiores, actualizar enlaces, poner temario detallado de cursos, terminar lo de cursos en línea, pero creo que va quedando mejor. Espero les resulte útil el cambio!

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/

Posted Wednesday, January 23, 2008 7:58 AM by lopez | 1 comment(s)

La chica Dattatec

El año pasado dí una charla ante más de mil personas, convocadas para una jornada de todo un día por Microsoft de Argentina y el proveedor de hosting y servicios Dattatec.

Pueden ver detalles de esa jornada en:

Una jornada donde aprendimos y nos conocimos

Y ahora, buscando información para mi sitio http://www.ajlopez.com (revamped, apenas, pero para mí es un avance), me encuentro con la chica Dattatec:

http://www.dattatec.com/nicole.php

Pasen y vean, a esta chica Nicole y sus videos. Si contestan bien las preguntas, va quitándose la ropa!!! Lo que es el marketing... :-)... Lleguen al final, vean el backstage....

Yo le hubiera agregado un par de preguntas, sobre Web 2.0 y Software as a Service ... ;-)

Para los que tienen mi edad y vivieron en Argentina: esto me recuerda la frase del inefable Roberto Galan: "Que rrrriiiiiiccaaa que esta la mocosa.... " ... ;-)

Como verán, mi búsqueda de información interesante para todos uds, ya es un sacerdocio, un apostolado.... ;-)

Comentarios?

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/

Posted Monday, January 21, 2008 11:23 AM by lopez | 26 comment(s)

La nueva Macbook Air

Recuerdo cuando había Apple II acá en Argentina. También recuerdo el lanzamiento de Lisa, las primeras Mac, y que para programar en esas máquinas había que estar autorizado por Apple o ser descendiente directo de alguien que haya desembarcado en el Mayflower.

Por eso, nunca me dediqué a las Apple/Mac, cuando con las PC tenía todo más accesible. No sé ahora, pero entonces, y por muchos años, para comprar una máquina de Apple había que hipotecar dos litros de sangre.

Hoy las cosas cambiaron: parecen estar más accesibles, la oferta de herramientas de programación es amplia, y al fin, hace unos años, vieron la luz, y se abrieron a otros procesadores y sistemas operativos.

El bueno de Juan Pablo García me avisa del lanzamiento de la nueva Macbook Air:

La notebook más delgada del mundo.

Multitouch trackpad, 5 horas de batería, USB 2, Micro DVI, 2 Gigas, 80 G en disco, con opción a un disco estado sólido de 64g, cámara de video, procesador Intel Core 2 Duo...
Más información en
http://www.apple.com/macbookair/features.html

Si quieren regalarme una, no hay problema! ;-)

Otro video en

http://www.ubergizmo.com/es/2008/01/apple/probando_la_macbook_air_video/

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/

Posted Sunday, January 20, 2008 1:47 PM by lopez | with no comments

Filed under:

Don't be a canuto

Desde hace unos años, caí en cuenta que la información y el conocimiento deben compartirse. En el ámbito de la informática, la adopción de esa postura ha sido acelerada desde la adopción de Internet. Hace un tiempo, nos manejábamos con BBSs y FidoNet, luego listas de correo, tal vez algún foro en línea. Con la aparición de los blogs, los dominios accesibles, los sistemas de albergue de proyectos como SourceForge, han hecho que en nuestra profesión, podamos recurrir a toneladas de información, ejemplos, recursos, disponibles en línea.

Ante tanta información y conocimiento, uno podría preguntar: ¿qué puedo aportar? Todo suma, y me parece importante destacar este "mindset", que trato de inculcar en cada lugar que visito:

Don't be a canuto

No se encanute información, compártala. No sé si se entiende la expresión "canuto", "encanutar", fuera de mi pais Argentina. Significa guardarse algo, sin mostrarlo, para tenerlo o usarlo uno mismo, sin compartir. En resumen, no encanute lo que sabe.

Hasta arriesgo acá un "Don't be a canuto" Maturity Model:

Don't be a "canuto" Nivel 1: comparte su conocimiento

Don't be a "canuto" Nivel 2: comparte su conocimiento y menciona sus fuentes

Don't be a "canuto" Nivel 3: comparte su conocimiento, menciona sus fuentes, y lo publica en la web

Don't be a "canuto" Nivel 4: comparte su conocimiento, menciona sus fuentes, lo publica en la web, agregando enlaces a recursos, otras oponiones, temas relacionados

Don't be a "canuto" Nivel 5: comparte su conocimiento, menciona sus fuentes, lo publica en la web, agregando enlaces a recursos, otras oponiones, temas relacionados, publica libro digital o en papel, y proporciona ejemplos

Y Ud. ¿En qué nivel se encuentra?

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/

Posted Tuesday, January 15, 2008 2:33 PM by lopez | 3 comment(s)

Self-sustaining Systems, Cola, Pepsi, Coke y Mate

En la reunión del grupo Smalltalking del 13 de enero, estuve reunido con Alejandro Reimondo y Leonardo De Marco. El bueno de Leonardo ofició de anfitrión, como lo había hecho el año pasado, pero ahora con el agregado de tener WiFi, así que los tres estuvimos muy entretenidos visitando sitios y bajando papers de los temas que tratamos. Uno de esos temas fue el de sistemas auto-sustentables. ¿A qué se refiere este término? De acuerdo al bueno de Alejandro:

Lo de sistemas sustentables, es relativamente reciente, y tengo pocas referencias. Me entusiasma que alguien trata de avanzar en el desarrollo de sistema basados en instancias de sistema, que sean sustentables en el tiempo, y que viva en el tiempo. Eso era para mi la gema de Smalltalk. Uno se encontraba construyendo un sistema, no declarandolo, jugabas en el tiempo pero estabas comprometido con él.

En la implementación natural de Smalltalk, la máquina virtual es algo que queda por debajo: algo más allá de nuestro sistema. Exploremos el tema.

Eso llevo a pensar a que cambios en la maquina virtual, era cambiar Smalltalk. Si le modificamos la máquina virtual, lo llamamos otra cosa, como pasa con el lenguaje Self, sin clases. Pero podemos verlo de otra forma: se estaba revelando la rigidez que tenía Smalltalk, y de alguna forma también Self y otros lenguajes, si tienen embutida la máquina virtual, como algo más allá del alcance del desarrollador. Este no puede cambiar las reglas básicas, por ejemplo, las políticas de garbage collection.

Yo creo igual que con la aparición de máquinas virtuales de código abierto, hasta estos temas quedarán al alcance del propio desarrollador. Pero sigamos con el tema.

¿Por qué existe una máquina virtual para estos lenguajes? Porque la máquina real, el hardware, no soporta objetos. De ahí que necesitemos una máquina de virtualización de objetos. Igualmente, recordemos que hay máquinas virtuales que más que virtualizar todo, en algún momento pasan a nativo, usando algún Just In Time compiler, como en Java y en .NET.

Sistemas Auto-Sustentables

Alejandro presentó en la reunión, el tema de Sistemas Auto-Sustentables. Se viene un

Workshop on Self-Sustaining Systems (S3) 2008

a realizarse en Potsdam, Alemania (Alejandro visitó el lugar el año pasado).

Leemos en su Call for papers:

The Workshop on Self-sustaining Systems (S3) is a forum for discussion of topics relating to computer systems and languages that are able to bootstrap, implement, modify, and maintain themselves. One property of these systems is that their implementation is based on small but powerful abstractions; examples include (amongst others) Squeak/Smalltalk, COLA, Klein/Self, PyPy/Python, Rubinius/Ruby, and Lisp. Such systems are the engines of their own replacement, giving researchers and developers great power to experiment with, and explore future directions from within, their own small language kernels.

Interesante el tema. Vean el Klein en:

Klein Metacircular Virtual Machine Kit 0.1 Release Notes

Una máquina virtual para Self escrita enteramente en Self.

Yo recuerdo mis tiempos en los ochenta, donde leí sobre intérpretes Lisp escritos en Lisp (uno de los lenguajes del Workshop de Potsdam).

Y por qué no, una nostalgia por el BCPL, cuyo compilador estaba escrito en BCPL. El bueno de Martin Richards lo podía portar a otra máquina, simplemente usando como bootstrap el compilador que tenía en otra máquina, y cambiando su salida para las instrucciones de la máquina destino. Yo lo usaba en la Facultad de Ingeniería de la Universidad de Buenos Aires.

También interesante el PyPy:

PyPy Project

donde leemos:

The PyPy project aims at producing a flexible and fast Python implementation. The guiding idea is to translate a Python-level description of the Python language itself to lower level languages. Rumors have it that the secret goal is being faster-than-C which is nonsense, isn't it?

COLA, Coke y Pepsi

Alejandro nos presentó el trabajo de Ian Piumarta. Pueden ver que ya en sus inicios, Piumarta estaba interesado en la compilación de lenguajes como Smalltalk:

Delayed Code Generation in a Smalltalk-80 Compiler (su tesis)

Pueden leer la biografía del bueno de Ian:

Ian Piumarta

(esta foto es de su CV, bueno, ya pasaron algunos años de esos tiempos...;-)

Ahora, el hijo de la señora Piumarta está trabajando en la implementación de lo que llama COLA (Combined Object-Lambda Architecture). Una COLA es un par de abstracciones que se sostienen entre sí. Una provee representación y otra provee conducta (¿les recuerda algo de objetos? :-). Traduzco algunos conceptos de los escritos de Ian.

La representación es provista por objetos prototípicos que intercambian mensajes, organizados en familias de clones (algo intermedio entre clases livianas y conducta específica de instancia). La semántica del envío de mensajes es provista por los propios objetos. Utiliza estructuras similares a las expresiones simbólicas (las viejas SExpr) del cálculo lambda para la conducta, que pueden ser transformadas (por lo que entendí, hasta llegar a código de un lenguaje de implementación).

El lenguaje de implementación y las abstracciones del sistema son precisamente el lenguaje y las abstracciones que el sistema implementa. El tener un modelo de ejecución dinámica, para el que se puede producir código estático y dinámico, elimina la necesidad de un intérprete central o un agente máquina virtual.

Bajemos a tierra estos conceptos. Pueden leer:

cola — combined lambda/object architecture

Por un lado, tiene un lenguaje funcional, con reminiscencias de Lisp:

Coke programming guid

Por otro lado, tiene un lenguaje de objetos

Pepsi -- not quite The Real Thing

que le sirve para ir investigando sintaxis e ideas para el proyecto. Lo llama Pepsi, por que no es "la cosa real", que debería ser Coke en la instancia final de lo que quiere hacer.

Interesante el modelo de objeto que propone

Open, extensible object models

basado en asignar una VTable a cada objeto, para decidir por fuera cómo procesa cada mensaje

(Tiene algunos puntos de contacto con lo que predico: integrar un underlying language con lo que querramos hacer por arriba, como en AjBasic, que aprovecha .NET, o AjTalk, que también aprovechará .NET por debajo. Por ejemplo, en AjTalk, los objetos de este lenguaje tienen una conducta definida para procesar los mensajes, pero también se puede enviar mensajes a otros objetos, por ejemplo, nativos de .NET y hay una conducta asociada para tratarlos, generalmente mapearlos por reflection).

Hay más para leer, como

Leiberman prototypes

y algo de UI

Canvas abstraction

Para el que llegado a este punto no pueda más de curioso, hay una lista de correo.

Tengo el código del proyecto. Es bastante interesante, algo largo para comentar acá. Pero veamos un ejemplo. En una implementación que hace de Smalltalk 80, en COLA se define un archivo _object.st, con definiciones como:

_object doesNotUnderstand: aSelector [ self _typeName: self _debugName doesNotUnderstand: aSelector _string ]

y como

 

_object _typeName: _cName doesNotUnderstand: _cSelector { fprintf(stderr, "%s does not understand '%s'\n", (char *)v__cName, (char *)v__cSelector); abort(); }

Lo que hace un compilador llamado Id, en este sistema, es tomar esta definición y producir código de lenguaje C. Vemos que lo que definimos en [ ] está en un lenguaje tipo Smalltalk, mientras que lo que está en { } es lenguaje C. Con un compilador llamado idc, se pasa de todos los archivos .st (Piumarta se escribió una implementación de ST80), a archivos .c que pueden compilarse.

El proyecto es casi incompilable en herramientas Microsoft, no pudimos compilar, está todo orientado a trabajar con makes y compiladores C de Unix/Linux.

Piumarta trabaja actualmente en el Viewpoints Research Institute. Vean que el COLA es parte del proyecto más grande:

Inventing Fundamental New Computing Technologies

donde leemos

An excruciating example of an area that needs more than incremental improvements is programming, both in the large and in the small. Code is too: large, complex, costly, buggy, insecure, segregated, and inexpressive. We have plans to attempt a qualitative reinvention of programming and to start one of the subprojects this year: to make a practical working mathematical model of a complete personal computer system.

El VPRI tiene como presidente a Alan Kay, y el board of advisors tiene a variada gente como Gordon Bell, Richard Dawkins, Adele Goldberg, Quincy Jones, Vint Cerf, Nicholas Negroponte. No, che, a mí no me invitaron... ;-)

El Mate

Alejandro, ante tanta Cola, Coke, Pepsi (bebidas que usan alguna yerba en sus componentes), propone que en Smalltalking estudiemos el tema y veamos que podemos hacer con COLA. Propone un proyecto Mate, veremos en las semanas que vienen, antes de la próxima reunión.

Yo propongo desde acá estudiar la posibilidad de implementar las ideas de Piumarta en .NET (o en Java). Podría usar algo de lo que estoy escribiendo para AjTalk (mínima VM para un Smalltalk-like language, debo un post y código, ayer vimos algo de código andando en la reunión). Creo que los puntos esenciales son:

- Tener un lenguaje como Pepsi o Coke

- Tener un lenguaje de implementación, como C# o Java

- Implementar algo similar a las VTable

- Implementar el compilador, basado en la transformación de las expresiones del Pepsi o Coke en código del lenguaje de implementación, e insertando código del lenguaje de implementación en cualquier parte del código (como en el ejemplo de más arriba).

Bueno, ya sé, tengo que tomarme la píldora verde, no la roja... ;-)

Nos leemos!

Angel "Java" Lopez
http:/www.ajlopez.com/

Posted Monday, January 14, 2008 11:28 AM by lopez | with no comments

Introducción a ASP.NET MVC

El viernes próximo, 18 de Enero, en Microsoft de Argentina, aquí en Buenos Aires, Miguel Angel Saez y Edgardo Rosetto darán una charla sobre el nuevo framework MVC (Model View Controller) incluído en las extensiones de ASP.NET 3.5.

Veremos cómo ahora hay URLs que se definen mediantes Routes, que pueden ser definidas programáticamente. Es interesante que cada parte del framework (el ruteador por ejemplo), puede ser accedido por código. Creo que hay varias posibilidades interesantes, especialemente para Sofware as a Service, y sitios dinámicos de contenidos, para tomar provecho de "generar en el aire" nuevas URLs, que se traten por el ruteador de MVC.

Edgardo nos promete mostrar una aplicación paso a paso, usando cada característica del framework.

La información de inscripción en:

TechNight: Introducción a ASP.NET MVC

Espero que se cumple la tradición de los TechNights: al final, cerveza y papas fritas! :-)

Más información sobre ASP.NET MVC en:

http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx

y por supuesto, para ir viendo todo lo que viene en ASP.NET 3.5, visitar los blogs de los buenos de Scott Guthrie, Scott Hanselman, y David Hayden entre otros:

http://weblogs.asp.net/scottgu/

http://www.hanselman.com/blog/

http://codebetter.com/blogs/david.hayden/

Yo ya había posteado algo sobre el tema en:

MVC en ASP.NET

Model View Controller en ASP.NET, a la Microsoft

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/

Posted Saturday, January 12, 2008 10:06 AM by lopez | 1 comment(s)

Filed under: ,

Jornadas Agiles 2008

Se está organizando las primeras Jornadas Agiles de Latinoamérica, a realizarse en Buenos Aires:

http://jornadasagileslatam2008.wetpaint.com/

La iniciativa se está organizando a partir del esfuerzo de varios participantes y entusiastas de las metodologías ágiles, como mi compañero de curso de Scrum Master, maese Juan Gabardini (para cuando un blog, Juan... :-), y maese Martín Salías.

Se puede colaborar tanto con sugerencias, actualizando el wiki del proyecto, como con difusión (bloguear sobre el tema, difusión en listas), ofrecer charlas, material, lugares tentativos, ideas, y bueno, si quieren, ser sponsor de estas jornadas.

Con el grupo de gente que inició esto, con su experiencia, no dudo que serán un éxito (excepto por algún miembro, un tal ajlopez2000 que está participando en el wiki, no se para qué , con la "zapan" que tiene, poco de ágil aporta ... bueno, ya lo van a bannear... ;-)

Keep alive, keep agile!

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/

Posted Friday, January 04, 2008 8:58 AM by lopez | with no comments

Aprendiendo de Jason Bourne

Hace un tiempo, el bueno de Alejandro Jack había planteado en una reunión de desarrollo en Southworks, que un desarrollador de software debe fijarse en el personaje de Jason Bourne. Y ahora, me encuentro con el excelente blog de {codesqueeze} y el artículo:

7 Things Developers Can Learn From Jason Bourne

Como ven, Alejandro no es de escribir mucho, así que voy a tomar la posta y comentar los puntos de ese post de Max Pool acá:

1. Always be ultra aware

Estar "aware" es una de mis frase favoritas, especialmente en los temas filosóficos de mi blog no técnico. Creo que siempre tenemos que estar advertidos de lo que pasa, de lo que pensamos, de lo que los demás hacen, de lo que hacemos, de por qué lo hacen y por qué lo hacemos. No ser una persona solamente encerrado en lo suyo, o que funciona en automático.

Y claro, estar "aware" de cómo va nuestro proyecto: no sólo sentarse y ocuparse de la parte que nos toca. El no estar "aware", el no estar al tanto de la visión general, del estado de avance, es contraproducente. Es como manejar un auto leyendo un libro: vamos a tener problemas en algún momento.

Sea conciente de lo que hace, y de cómo está todo.

Vea también más allá de su proyecto o trabajo: esté al tanto de la industria, de lo que pasa, de las tendencias, de las causas de esas tendencias. Que no lo agarre la lluvia de sopa con un tenedor en la mano.

2. Always ruthlessly execute

No sólo hay que pensar, hay que ejecutar. Y ejecutar, ejecutar, ejecutar. Y ejecutar a fondo. Si tenemos un problema, veámoslo como una oportunidad y ataquemos su raíz: no lo hagamos a medias.

3. Be resourceful

Bueno, algunos de Uds recordaran a McGyver. Esto lo aprendí de ese personaje, hace más de dos décadas: sea una persona llena de recursos. Cuanto más trucos y fundamentos conozca, cuando más cómodo se sienta con patrones, librerías, y conceptos (no olvidarse nunca de pensar, de saber por qué está el patrón, o cuál es el objetivo de la librería que usemos), cuanto más haya aprendido de los conocimientos y experiencias de otros (libros, libros, libros.... diría imitando a Ballmer), cuanto más "palabras mágicas" y "encantamientosHarryPotter" conozca, más confianza tendrá en su trabajo. No siempre la solución a un problema es complicada o rebuscada. Cuanto más recursos maneje, más perspectiva podrá usar para encontrar una solución. Si sólo conoce XML, todo tratará de hacerlo con XSLT (conocido por aquí como "el camino del diablo"). No se encierre en un lenguaje o tecnología. No se quede en una sola cosa.

4. Always make calculated decisions

Siempre tome decisiones calculadas. No tiene que ser la mejor decisión: debemos saber cuándo adoptar una solución super adecuado y cuándo no, por razones de tiempo o de objetivos del proyecto y del cliente. Si se decide por una solución no tan óptima en términos de diseño, sea consciente, esté "aware" de las razones por las que toma esa decisión, y comuníquela a su equipo. Y cada vez que haga algo, tenga en claro por qué lo hace. No tarde tiempo optimizando, si no es el objetivo de lo que está haciendo. No se ponga a usar librerías o tecnologías sólo por que sí: adóptelas o déjelas, por una decisión conciente. Tantas veces veo que en un proyecto usan tal o tal cosa, más porque está de moda, o porque simplemente lo aprendieron en un curso, o en un libro, pero no se tomó el tiempo de analizar la necesidad de usar o hacer eso.

Pregunta: esto que estoy haciendo, sirve para mis objetivos?

5. React quickly (do not stop, inaction is death)

Si hay una nueva situación, un nuevo problema, no se quede paralizado. Reaccione. Claro, piense, tome una decisión, pero haga algo. No se quede en el medio de la calle mientras el camión sigue avanzando. Tal vez tenga que tomar una decisión no en las mejores circunstancia, y se equivoque. No importa: se habrá movido, aprendió algo, y puede seguramente corregir más adelante. Pero si se queda donde está, puede que el camión le pase por encima.

6. Stay strong

Ya sé. Está ocupado, todo el día en el trabajo, luego quiere irse a casa. Igual, aproveche el tiempo y lea sobre su profesión. Manténgase al día con las tecnologías y conocimientos. Lea blogs, artículos en Internet. No deje de aprender algo cada día. Debe convertirse en hábito.

Aprenda un nuevo lenguaje, aunque no lo use. Vea un nuevo paradigma. Estudie programación funcional, bases de objetos, robótica, o matemáticas. Adopte más recursos para su mochila. Mantenga la neurona activa, y fuerte.

Y cuide su salud (algo que tengo que hacer).

7. Learn to work alone

No es que tenga que trabajar solo. Pero en estos tiempos de trabajo en grupo, se corre el peligro de olvidarse de las capacidades propias. No todo podemos hacerlo solos, pero tenemos que estar preparados, en algún momento, para encarar un trabajo por nuestra cuenta. Esto es un test de las propias habilidades, de los recursos que ha puesto en la mochila de sus conocimientos. Si trabajó en grupo, espero que haya aprendido algo de sus compañeros, y les haya enseñado algo. Y que ahora pueda hacer algo más solo de lo que hacía a comienzos del año pasado.

Trabajar solo en algún momento, le hará aprender disciplina. Insisto: es la prueba de lo que ha crecido profesionalmente. También, recuerde, que a largo plazo, la única persona que lo acompañará siempre es Ud mismo. Siempre deberá contar con sí mismo. Me recuerda la anécdota de Ringo Bonavena, boxeador argentino, que supo pelear con Mohammed Alí por el título mundial. Contaba el bueno de Ringo: "Todos te dan consejos, todos te ayudan, pero cuando subís al ring, te quitan el banquito, y te quedás solo con el negro".

Ud. debe estar preparado para cuando le quiten el banquito.

Gracias al blog en inglés de Martín Salías:

http://msalias.blogdrive.com/

donde encontré la referencia:

My favorite new blog of 2007 de Jeremy Miller

Vean cómo Martín ahora aprendió español (jeje, siguiendo su ejemplo, yo ahora escribo en un simil inglés), y está escribiendo en ese idioma. Vean cómo la está pasando en Japón:

http://blog.salias.com.ar/

Be smart, be Bourne.

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/

Posted Wednesday, January 02, 2008 10:25 AM by lopez | 4 comment(s)

Mi primer robot, con XLogo y Rasti

El bueno de Marcelo Duschkin tuvo una participación en el programa virtual RastiTV, veamos lo que preparó con Rasti y XLogo, una implementación del lenguaje Logo en Java (Marcelo es un participante activo en el proyecto XLogo):

Vean el programa completo en:

http://rastitv.blogspot.com/2007/12/rastitv-programa-03-diciembre-de-2007.html

Ya había comentado por acá su trabajo:

Mi primer robot

Visiten su sitio y blog para más información, donde tendrán todo para reproducir el sistema.

Me gustó que se pueda hacer algo de robótica apelando al venerable Rasti, que este año ha vuelto a mi pais, Argentina (extraño mi Matchbox 1000...;-). Vean como Marcelo nos da herramientas para que cualquiera (por ejemplo, en una escuela), con elementos conseguibles por aquí, pueda comenzar a experimentar, jugar y divertirse, usando la neurona.

Para los programadores, vean en el video cómo usa una función recursiva, que seguramente está implementada con "tail recursion".

Aguante el Logo!

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/

Posted Tuesday, January 01, 2008 6:24 PM by lopez | 3 comment(s)