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

September 2007 - Posts

Lo nuevo en Visual Basic.NET (Parte 2)

Ya visité algunas características nuevas de VB.NET 9, que viene integrado en el Visual Studio 2008. Estoy usando una beta 2. El artículo anterior es:

Lo nuevo en Visual Basic.NET (Parte 1)

El ejemplo de hoy está para descargarse en VbNetNew2.zip

Usa la misma clase Supplier. Investiguemos dos nuevos métodos del tipo extension methods:

 

Imports System.Runtime.CompilerServices Module Extensions <Extension()> _ Public Function Append(Of T)(ByVal a As T(), ByVal b As T()) As List(Of T) Dim result = New List(Of T)(a) result.AddRange(b) Return result End Function <Extension()> _ Public Sub Show(ByVal suppliers As IEnumerable(Of Supplier)) For Each supplier As Supplier In suppliers Console.WriteLine("Supplier {0} {1} ({2})", supplier.SupplierId, supplier.Name, supplier.City) Next End Sub End Module

Recordemos: los extension methods son métodos que se pueden adosar a instancias de clases ya existentes, justamente, extendiendo su funcionalidad.

En VB.NET, se escriben como métodos de un módulo, marcados con el atributo <Extension()> . El primer parámetro indica la clase a la cual adosarle este método.

En el método Append de arriba, lo nuevo es que se puede usar generics. Es un método que se aplica a todo arreglo, de cualquier tipo T. Y devuelve una lista tipada del mismo T.

El método Show, se usa adosa a todo IEnumerable de Suppliers, no importa la clase concreta que implemente esa interfaz.

Esto demuestra la flexibilidad del concepto de extension methods.

En el Main, se usa tanto el Append, para unir dos listas, como el Show, para mostrar una lista de proveedores:

 

1 Sub Main() 2 Dim suppliers() As Supplier = New Supplier() { _ 3 New Supplier(1) With {.Name = "John Madison", .City = "Washington"}, _ 4 New Supplier(2) With {.Name = "Ann Arbor", .City = "Ohio"}, _ 5 New Supplier(3) With {.Name = "Don Johnson", .City = "Miami"}, _ 6 New Supplier(4) With {.Name = "Bill Clinton", .City = "Washington"} _ 7 } 8 9 Dim suppliers2() As Supplier = New Supplier() { _ 10 New Supplier(5) With {.Name = "John Smith", .City = "New Jersey"}, _ 11 New Supplier(6) With {.Name = "Mary Dupinsky", .City = "Los Angeles"}, _ 12 New Supplier(7) With {.Name = "Ronald Reagan", .City = "Washington"}, _ 13 New Supplier(8) With {.Name = "Brad Shapiro", .City = "Dallas"} _ 14 } 15 16 Dim allsuppliers = suppliers.Append(suppliers2) 17 18 Console.WriteLine("All Suppliers") 19 allsuppliers.Show() 20 21 Dim suppliers3 = allsuppliers.FindAll(Function(s) s.City = "Washington") 22 23 Console.WriteLine() 24 Console.WriteLine("Suppliers In Washington") 25 26 suppliers3.Show() 27 28 Dim suppliers4 = From s In suppliers _ 29 Where s.City = "Washington" _ 30 Select s 31 32 Console.WriteLine() 33 Console.WriteLine("Suppliers In Washington") 34 35 suppliers4.Show() 36 37 Console.ReadLine() 38 End Sub 39

 

En la línea 21, se aplica un método de extensión ya definido en LINQ, para aplicar ubicar todos los elementos de una lista que cumplan con un predicado. Aparece el nuevo Function para especificar un predicado ahí mismo.

En la línea 28, se ve que podemos usar también LINQ directamente en el lenguaje. Como en el caso examinado en otro post con C Sharp, el from va primero, y al final, el select. Esto le facilita a la IDE que pueda determinar qué tido de datos puede seleccionar, habiéndole primero indicado cuál es el tipo que se recupera.

Nos leemos!

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

Posted Sat, Sep 29 2007 13:11 by lopez | with no comments

Filed under: ,

Lo nuevo en Visual Basic .NET (Parte 1)

En post anteriores:

Lo nuevo de CSharp (Parte 1)
Lo nuevo de CSharp (Parte 2)

había escrito sobre algunas características nuevas que aparecen en el CSharp 3, que vendrá integrado en el Visual Studio 2008, y que estoy probando en la beta 2 de esta IDE.

Veamos ahora un ejemplo en VB.NET 9 (como se lo llama), disponible en VbNetNew1.zip

Es un simple programa de consola, que utiliza una clase Supplier:

 

Public Class Supplier Private mSupplierId As Integer Private mName As String Private mCity As String Public Sub New(ByVal id As Integer) mSupplierId = id End Sub Public Property SupplierId() As Integer Get Return mSupplierId End Get Set(ByVal value As Integer) mSupplierId = value End Set End Property Public Property Name() As String Get Return mName End Get Set(ByVal value As String) mName = value End Set End Property Public Property City() As String Get Return mCity End Get Set(ByVal value As String) mCity = value End Set End Property End Class

 

No encontré que el nuevo VB.NET tuviera propiedades automáticas, como en el nuevo CSharp. Así que en este ejemplo, el código de la clase no muestra nada nuevo.

En la rutina Main:

1 Sub Main() 2 Dim suppliers() As Supplier = New Supplier() { _ 3 New Supplier(1) With {.Name = "John Madison", .City = "Washington"}, _ 4 New Supplier(2) With {.Name = "Ann Arbor", .City = "Ohio"}, _ 5 New Supplier(3) With {.Name = "Don Johnson", .City = "Miami"} _ 6 } 7 8 For Each supplier As Supplier In suppliers 9 Console.WriteLine("{0} {1}", supplier.SupplierId, supplier.Name) 10 Next 11 12 Dim c = New With {.Name = "John Doe", .City = "Everywhere"} 13 14 Console.WriteLine("{0} lives in {1}", c.Name, c.City) 15 16 For Each supplier As Supplier In suppliers 17 supplier.Print() 18 Next 19 20 Console.ReadLine() 21 End Sub 22

comienza a aparecer algunas características nuevas. En la línea 2, vemos la creación e inicialización de un arreglo, con el uso de llaves. En la línea 3, 4 y 5, aparece la creación de objetos con uso de With. Esto permite, llamar a un constructor, como Supplier(1), y luego completar las propiedades, con punto más el nombre de la propiedad.

En la línea 12, podemos crear una variable con un tipo implícito. Vemos que el new no refiere a ninguna clase en particular, pero en el with se colocan las propiedades que va a tener ese objeto.

Automáticamente, el IDE "arma" el tipo de la variable c, y me permite usar c.Name y c.City en la línea 14. La IDE hace inferencia de tipo.

En la línea 17, Print no es un método de la clase Supplier. Está definido en otra "clase":

Imports System.Runtime.CompilerServices Module Extensions <Extension()> _ Public Sub Print(ByVal supplier As Supplier) Console.WriteLine("Supplier {0} {1}", supplier.SupplierId, supplier.Name) End Sub End Module

Es un extension method: un método que se puede definir para las instancias de una clase, fuera de la misma definición de la clase. En CSharp, vimos que se usaban clases estáticas. Acá se utilizan módulos. Para que el método fuera de extensión, en CSharp se colocaba un this adornando al primer parámetro. Acá se usa el atributo <Extension()> al método, un atributo que está en el namespace System.Runtime.CompilerServices.

Ya vendrá otro post con otras características.

Nos leemos!

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

Posted Thu, Sep 27 2007 13:30 by lopez | with no comments

Filed under: ,

Generando código para NHibernate (Parte 2)

Gracias a una iniciativa del bueno de Omar del valle Rodriguez comencé a escribir un ejemplo con AjGenesis, para generar código .NET que use NHibernate (ver Generando código para NHibernate (Parte 1)). Ya tenía ejemplos con y sin NHibernate (ver ....) pero esta vez, Omar pidió un modelo con herencia. Pueden descargar esta primera versión como AjOmar-v1.0.zip desde los ejemplos del proyecto en Codeplex.

Usé la versión 0.5 de AjGenesis, a descargar desde CodePlex. Si Ud. tiene la versión 0.4.3, debería funcionar sobre este ejemplo, pero no la he probado.

El modelo

Ahora tengo una primera versión de lo pedido por Omar. El "leit-motiv" del AjGenesis, es basarse en un modelo definible libremente, y desde ahí, ir generando código, scripts de base de datos, artefactos de textos, archivos de solución, proyectos, lo que uno quiera.

En el modelo Projects\AjOmar\Project.xml he definido:

<Project> <Name>AjOmar</Name> <Description>Example AjOmar for (N)Hibernate</Description> <Prefix>AjOm</Prefix> <Domain>com.ajomar</Domain> <CompanyName>ajomar</CompanyName> <Model> <Entities> <Entity Source="Entities/Client.xml"/> <Entity Source="Entities/Company.xml"/> <Entity Source="Entities/User.xml"/> </Entities> </Model> </Project>

Para entender algo más sobre el modelo y la generación, ver Hello World con AjGenesis.

En el modelo coloqué tres entidades: Client, Company, User, que es lo que pedía Omar. En Client, tengo:

<Entity> <Name>Client</Name> <Description>Client Entity</Description> <SetName>Clients</SetName> <Descriptor>Client</Descriptor> <SetDescriptor>Clients</SetDescriptor> <SqlTable>clients</SqlTable> <Properties> <Property> <Name>Id</Name> <Type>Id</Type> </Property> <Property> <Name>PhysicalAddress</Name> <Type>Text</Type> <SqlType>varchar(200)</SqlType> </Property> <Property> <Name>ContactEmail</Name> <Type>Text</Type> <SqlType>varchar(200)</SqlType> </Property> <Property> <Name>RegisterDate</Name> <Type>DateTime</Type> <SqlType>datetime</SqlType> </Property> <Property> <Name>Active</Name> <Type>Boolean</Type> <SqlType>bit</SqlType> </Property> </Properties> </Entity>

Los campos son los pedidos por Omar, pero todavía con tipos y nombres SQL que elegí yo. Client es la clase madre de Company y de User. En el Company.xml tenemos:

 

<Entity> <Name>Company</Name> <Description>Company Entity</Description> <SetName>Companies</SetName> <Descriptor>Company</Descriptor> <SetDescriptor>Companies</SetDescriptor> <SqlTable>companies</SqlTable> <Inherits>Client</Inherits> <Properties> <Property> <Name>CompanyName</Name> <Type>Text</Type> <SqlType>varchar(200)</SqlType> </Property> <Property> <Name>ContactName</Name> <Type>Text</Type> <SqlType>varchar(200)</SqlType> </Property> </Properties> </Entity>

Para los que vieron anteriores ejemplos, lo nuevo es el <Inherits>Client</Inherits>. Esto indica que esta entidad "hereda" de la entidad Client, en el dominio a generar. Lo mismo puse en User.xml:

<Entity> <Name>User</Name> <Description>User Entity</Description> <SetName>Users</SetName> <Descriptor>User</Descriptor> <SetDescriptor>Users</SetDescriptor> <SqlTable>users</SqlTable> <Inherits>Client</Inherits> <Properties> <Property> <Name>FirstName</Name> <Type>Text</Type> <SqlType>varchar(200)</SqlType> </Property> <Property> <Name>LastName</Name> <Type>Text</Type> <SqlType>varchar(200)</SqlType> </Property> </Properties> </Entity>

En el subdirectorio Projects\AjOmar\Technologies, encontramos los archivos CSharp2Nh.xml y VbNet2Nh.xml. Veamos el primero:

 

<Technology> <Programming> <Dialect>CSharp2Nh</Dialect> </Programming> <Database> <Dialect>MsSql</Dialect> <Name>AjOmar</Name> <Username>sa</Username> <Prefix>ajom_</Prefix> <Host>(local)</Host> </Database> <NHibernate> <Dialect>NHibernate.Dialect.MsSql2000Dialect</Dialect> </NHibernate> </Technology>

Vean que ahí se establece el usuario y contraseña para usar contra un SQL Server. Si quieren, lo modifican acá. Sino, como alternativa, pueden luego modificar el web.config de la solución generada. El ejemplo también instala base, pero esto es opcional: genera un archivo con los scripts de creación, que Uds. puede correr en cualquier momento manualmente contra el SQL Server que elijan.

Generando el código

Para generar el código, seguir los siguientes pasos:

  1. Editar los parámetros del SQL Server que están en los archivos de tecnología mostrados arriba
  2. Ir a la línea de comando.
  3. Agregar al PATH el directorio \bin del AjGenesis 0.5 bajado
  4. Ir al directorio AjOmar del ejemplo bajado
  5. Ejecutar

    GenerateProject AjOmar CSharp2Nh

    para generar el ejemplo en C Sharp 2.


  6. Ejecutar

    DeployDatabase AjOmar CSharp2Nh

    para crear la base en el SQL Server local (en caso de querer hacerlo manualmente ver el código generado para crear la base en Build\AjOmar\CSharp2Nh\Sql)
  7. Si desea generar el código para VB.NET 2, ejecutar

    GenerateProject AjOmar VbNet2Nh

La solución generada

En ambos casos, VB.NET o C Sharp, se generan directorios dentro de Build\AjOmar:

Si vemos el ejemplo C Sharp, queda un archivo de solución en Build\AjOmar\CSharp2Nh\Src, que al abrirlo en el Visual Studio 2005 queda:

Hay varios proyectos de librerías de clases:

  • AjNHibernate: contiene las clases para el manejo de las llamadas al NHibernate, como configuración, factoría y obtención de sesiones.
  • AjOmar.Data: acá están los DAO (Data Access Objects, aunque son clases con métodos estáticos) y el .hbm de mapeo, codificado como recurso embebido en el proyecto.
  • AjOmar.Entities: las entidades del dominio.
  • AjOmar.Services: simplemente una capa de servicio delgado.

Veamos como ejemplo la entidad Company en AjOmar.Entities:

 

/* * Project AjOmar * Example AjOmar for (N)Hibernate * Entity Company * Company Entity * */ using System; namespace AjOmar.Entities { public class Company : Client { // Private Fields private string companyName; private string contactName; // Default Constructor public Company() { } // Factory Methods public static Company Create( string companyname , string contactname ) { Company company; company = new Company(); company.CompanyName = companyname; company.ContactName = contactname; return company; } // Public Properties public string CompanyName { get { return companyName; } set { companyName = value; } } public string ContactName { get { return contactName; } set { contactName = value; } } } }

Gracias al ejemplo inicial que me envió Omar, pude generar un .hbm con subentidades:

 

<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"> <class name="AjOmar.Entities.Client, AjOmar.Entities" table="ajom_clients"> <id name="Id" column="Id" type="Int32" unsaved-value="0"> <generator class="native"/> </id> <property column="PhysicalAddress" type="String" name="PhysicalAddress" length="255"/> <property column="ContactEmail" type="String" name="ContactEmail" length="255"/> <property column="RegisterDate" type="DateTime" name="RegisterDate" length="255"/> <property column="Active" type="Boolean" name="Active" length="255"/> <joined-subclass name="AjOmar.Entities.Company, AjOmar.Entities" table="ajom_companies"> <key column="Id" /> <property column="CompanyName" type="String" name="CompanyName" length="255"/> <property column="ContactName" type="String" name="ContactName" length="255"/> </joined-subclass> <joined-subclass name="AjOmar.Entities.User, AjOmar.Entities" table="ajom_users"> <key column="Id" /> <property column="FirstName" type="String" name="FirstName" length="255"/> <property column="LastName" type="String" name="LastName" length="255"/> </joined-subclass> </class> </hibernate-mapping>

Hay un proyecto web AjOmar.WebClient, con una página inicial, un tema, un master page, y un directorio con páginas de navegación y actualización del modelo:

Desde el menú de administración pueden actualizarse los datos:

No es un "qué bruto, qué página", pero algo funciona... Jeje, lo mío no es el diseño gráfico. :-)

Noten que en web.config, coloqué la configuración del NHibernate:

 

<nhibernate> <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /> <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" /> <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" /> <add key="hibernate.connection.connection_string" value="server=(local);database=AjOmar;uid=sa;pwd=" /> </nhibernate>

y un HttpModule para manejar la sesión:

<httpModules> <add type="AjNHibernate.SessionHttpModule, AjNHibernate" name="NHSessionModule" /> </httpModules>

Próximos pasos

Quedan para encarar en la próxima versión

  • Utilizar la última versión de NHibernate (con esquema 2.2)
  • Ver de poner los tipos SQL que pedía Omar
  • Probar contra SQL Server 2005
  • Ver de agregar "lazy" en las joined subclasses del mapeo
  • Generar para VB.NET 1.x/CSharp 1.x
  • Generar con conceptos de Domain-Driven Design (capa Presentation+Application+Domain+Infrastructure).
  • Generar código para Java con Hibernate y MySql

Nos leemos!

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

Posted Tue, Sep 25 2007 0:12 by lopez | 6 comment(s)

GUI Gallery

El bueno de Rodolfo Finochietti me avisa de este tipo de sitios, busquen en Google GUI Gallery. Uno que aparece es:

http://toastytech.com/guis

Donde encontraran una historia de las distintas interfaces gráficas de usuario que tuvimos en la historia de la computación. Arriba unas "screenshots" de una Xerox Star.

Hay ejemplos de Xerox, Visi On, GEM, Deskmate, GEOS, Desqview/X, AmigaOS, RISC OS, BeOS, QNX, OS/2, Apple, Linux/Unix, Windows, Win Shells, otras GUIs, una "timeline" de GUIS, y enlaces a sitios sobre GUIs.

Nos leemos!

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

Posted Fri, Sep 21 2007 0:57 by lopez | with no comments

Filed under:

Curso de Introducción al diseño y construcción de microrobots moviles

Les quería avisar de un nuevo curso de robótica, por aquí, en Buenos Aires, dictado por Roberto Dhios.

Pueden ver más detalle y costos en:

http://www.clubdeprogramadores.com/cursos/CursoMuestra.php?Id=326

Extraído de ahí:

La robótica móvil es un área de la ingeniería que se caracteriza, entre otras cosas, por ser multidisciplinaria. Para construir un robot, por pequeño que sea, es necesario aplicar conocimientos de electrónica, programación y mecánica.
Este curso pretende dar una visión general de todas las áreas de conocimiento relacionadas con el diseño de pequeños robots móviles autónomos sin profundizar en ninguna pero obteniendo una visión global.
El curso está pensado con un enfoque eminentemente práctico dejando los desarrollos matemáticos complejos y las demostraciones para los cursos donde se tratan estos temas en profundidad.
En el desarrollo del curso se intentará que las clases sean participativas y se fomentará el trabajo en equipo en las diferentes actividades que se organicen.

Roberto es un profesional en sistemas con mas de 20 años de experiencia, principalmente dedicado al desarrollo de sistemas embebidos. Ha trabajado en proyectos de automatización, control automático, electro-medicina y comunicaciones.

Pueden visitar su sitio:

http://www.roboticar.com.ar/

y el de Jorge Dhios

http://www.bairesrobotics.com.ar/

para aprender más sobre robótica. Vean los enlaces:

RobotIA
Robotica educativa
Rasti
CAFR
Todo Robot
Robotic Spot
RoboLiga
Robotica en Mendoza
Azteca
Johnny 5
www.miprimerrobot.com.ar

Nos leemos!

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

Posted Mon, Sep 17 2007 23:37 by lopez | with no comments

Filed under:

Preparándose para una entrevista de trabajo

El bueno de Augusto Alvarez (una especie de jugador de la NBA, que me dobla en altura, y que cumple con el "mindset" "no sea canuto"...;-), me alcanza este enlace:

http://interviewhelper.blogspot.com/

un blog con preguntas y respuestas de entrevistas para informáticos, donde encontramos:

SQL Server Interview Questions
.NET Interview Questions
JAVA Interview Questions
Database
SQL Server
Software Testing
Basic .NET Framework
SAP Interview Questions
ABAP Interview Questions
C++ interview Questions
C Interview Questions
PHP Interview Questions
ASP.net Interview Questions
Java Interview Questions

Aparte de preguntas técnicas, me gustaron:

Points to remember
Salary Negotiation
Resume Preparation Guidelines

Yo agregaría, parafraseando a Ortega: "yo soy yo y mi blog". Gente, vayan preparando blogs, de lo que estudian, conocen, hacen. "Su blog es su CV" puede ser algo exagerado, pero no mucho.

Debe ser leído:

El currículum no, quiero ver tu blog

Cómo la revolución de la web 2.0 y los blogs abre la posibilidad de nuevas prácticas de reclutamiento y formación profesional 

Curioso:

The Bloggers Business School

Nos leemos!

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

Posted Mon, Sep 17 2007 0:24 by lopez | 1 comment(s)

Semana Sabática

Ayer, viernes 14, comencé mi segunda semana sabática del año: una semana sin cursos, visitas a clientes, dedicada a estudiar, investigar, leer, escribir, pensar, organizar y crear. Una semana donde espero plantearme algunos temas, iniciar algunos trabajos, para luego ir completándolos durante el año. Es una semana "larga": abarca hasta el lunes 24 inclusive.

Siempre me ha parecido importante dedicar un periodo a alejarse de las actividades cotidianas, y sumergirse con tiempo disponible en tópicos que nos interesan. Recomiendo que vayan pensando, si todavía no lo hacen, en tener este tipo de periodos en su año.

Dentro del ámbito del desarrollo de software, mi plan es, durante esta semana:

- Programar funcionalidad de AjGenesis, escribir ejemplos y postear sobre temas del proyecto.

- Revisar el estado de otros proyectos de código abierto que tengo en carpeta.

- Estudiar el estado actual de algunos frameworks y tecnologías, de Java, .NET, Smalltalk y más.

- Pasar en limpio y postear sobre la última reunión de Smalltalking.

- Mejorar ejemplos y material que presento en mis cursos.

- Investigar sobre concurrencia y grid computing, para un proyecto que se inicia.

Me gusta tener semanas sabáticas, y a veces, quisiera reorientar todas mis actividades para que el resto de mis semanas sean de este tipo.

Para actividades fuera del desarrollo de software, ver mi semana sabática en mi blog no técnico.

Nos leemos!

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

Posted Sat, Sep 15 2007 16:16 by lopez | with no comments

Lo nuevo de C Sharp (Parte 2)

Sigo "jugando" con algunas características del nuevo CSharp, que puedo probar desde el Beta 2 de Visual Studio 2008. En el anterior post Lo nuevo de C Sharp (Parte 1) había escrito sobre Extension Methods. Sigamos en este ejemplo, explorando alguna de las posibilidades.

El ejemplo de este "post" pueden bajarlo desde CSharpNew2.zip

Encontraran que el ejemplo de consola, tiene al comienzo:

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5

Esto no tuve que escribirlo, sino que el Visual Studio ya lo coloca al comienzo de la clase. LINQ es como que ya viene.

Recordemos que los Extension Methods se escriben dentro de clases estáticas.

En la clase estática Extensions, hay dos métodos  

 

1 static class Extensions 2 { 3 public static List<T> Append<T>(this List<T> list1, List<T> list2) 4 { 5 List<T> result = new List<T>(list1); 6 result.AddRange(list2); 7 8 return result; 9 } 10 11 public static void Show(this IEnumerable<Supplier> suppliers) 12 { 13 foreach (Supplier supplier in suppliers) 14 Console.WriteLine("Supplier {0} {1} ({2})", supplier.SupplierId, supplier.Name, supplier.City); 15 } 16 }

El método Append recibe dos listas tipada con Generics, que manejen elementos del tipo T, y devuelve una lista con la suma de las dos listas. Vemos el uso de this para indicar que el primer parámetros es en realidad, el objeto al que se le va a permitir usar el nuevo método Append.

El método Show se podrá aplicar a cualquier IEnumerable de elementos Supplier.

En la prueba, en el método Main:

 

1 class Program 2 { 3 static void Main(string[] args) 4 { 5 List<Supplier> suppliers = 6 new List<Supplier> { 7 new Supplier(1) { Name = "John Madison", City = "Washington" }, 8 new Supplier(2) { Name = "Ann Arbor", City = "Ohio" }, 9 new Supplier(3) { Name = "Don Johnson", City = "Miami" }, 10 new Supplier(4) { Name = "Bill Clinton", City = "Washington" } 11 }; 12 13 List<Supplier> suppliers2 = 14 new List<Supplier> { 15 new Supplier(5) { Name = "John Smith", City = "New Jersey" }, 16 new Supplier(6) { Name = "Mary Dupinsky", City = "Los Angeles" }, 17 new Supplier(7) { Name = "Ronald Reagan", City = "Washington" }, 18 new Supplier(8) { Name = "Brad Shapiro", City = "Dallas" } 19 }; 20 21 var suppliersall = suppliers.Append(suppliers2); 22 23 Console.WriteLine("All Suppliers"); 24 suppliersall.Show(); 25 26 var suppliers3 = suppliersall.FindAll(s => s.City == "Washington"); 27 28 Console.WriteLine(); 29 Console.WriteLine("Suppliers In Washington"); 30 31 suppliers3.Show(); 32 33 var suppliers4 = from s in suppliers 34 where s.City == "Washington" 35 select s; 36 37 Console.WriteLine(); 38 Console.WriteLine("Suppliers In Washington"); 39 40 suppliers4.Show(); 41 } 42 } 43

En la línea 21 usamos el Append sobre un List<Supplier>. En la línea 25, vemos que supplierall tiene disponible el método Show.

El método FindAll permite la especificación de un predicado anónimo s => s.City == "Washington", una función que recibe un parámetro s y devuelve un boolean, verdadero o falso, según tenga o no el proveedor sede en Washington.

En la línea 33, se usa una consulta LINQ integrada con el lenguaje, que produce el mismo resultado que el FindAll. Vemos que el from viene primero, y el select es la última sentencia: esto permite que el entorno sepa con el from, qué tipo está disponible para usar en la expresión que sigue al select. Así, al escribir el select, tenemos determinados el tipo de los elementos a seleccionar, y la IDE nos dá "intellisense" sobre el tipo supplier.

Nos leemos!

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

Posted Thu, Sep 13 2007 11:26 by lopez | 3 comment(s)

Filed under: ,

Microsoft TechNet and MSDN Briefing en Buenos Aires

El jueves 20 de septiembre tenemos un día completo con herramientas y tecnologías Microsoft en Buenos Aires:

http://www.microsoft.com/argentina/briefing2007/

Evento gratuito, ahí tienen el formulario para registrarse. Es en el complejo La Plaza, en Corrientes al 1660.

Durante la mañana habrá presentaciones orientadas a TechNet, IT, y esas cosas de la gente de IT.. ;-) . El tema desarrollo, viene a la tarde. Ahí tendremos a Martín Salías, Matías Woloski de Southworks, Diego Gonzalez y Rodolfo Finochietti de Lagash, y a Ezequiel Glinsky de Microsoft, y espero colarme para dar algún tema.

Matías presentará un Smart Client, pueden ven un adelanto de su aspecto:

MSDN Briefing, Buenos Aires, Septiembre 2007

(con diseño de Paulo Arancibia)

Copio de los apuntes de Martín Salías (que posteó en Technet and MSDN Briefing in Buenos Aies), el esquema tentativo de presentaciones de la tarde:

  • Keynote: Ezequiel Glinsky y Alejandro Ponicke
  • Smart Clients: Matias Woloski
  • Aplicaciones con OBA: Diego Gonzalez
    un "coffee break" y
  • ASP.NET Ajax: me toca a mí
  • Silverlight and a bit of DLR: Rodolfo Finochietti
  • Visual Studio 2008 and LINQ: Martín Salías

Bueno, si ven la página de los oradores, los de la tarde "zafamos" de tener que poner fotos. Sino, vean cómo quedaron Ponicke y Alberto Ortega:

Jeje... que caripelas... ;-)

Nos leemos!

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

Posted Wed, Sep 12 2007 11:52 by lopez | with no comments

WPF Contrib Project

El bueno de Ezequiel Jadib me avisa del proyecto:

http://www.codeplex.com/wpfcontrib

donde se pueden encontrar (y agregar en colaboración) controles para Windows Presentation Foundation. Una descripción del proyecto:

Project Description

WPF Contrib is a community-developed library of controls and utilities for WPF.
The goal is to create a stable, reusable library of classes that you can (and should) use in every WPF application you build.
If you're interested in contriburing, please contact aelija (via gmail) or using the CodePlex contact page.

What's New

Initial check in contains:

Consultar la fuente original:

the-wpf-contrib-project.aspx

Según el autor del proyecto:

Set up at CodePlex, WPF Contrib is mainly a library of reusable components. My goal is for it to become a true community project. Meanwhile, I invite everyone to review the code, play with the demos and send me feedback! If you want to join, the doors are open. You only need to be a WPF expert :P and have motivation to innovate and share.

Nos leemos!

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

Posted Sun, Sep 9 2007 15:54 by lopez | with no comments

Prometeus: la revolución de los medios

El bueno de Fernando Balbachán, me avisa de este video en la videoteca gigante de YouTube:

Habría tanto para comentar. Primero, es una visión que no incluye a los que hoy mismo no están "en la red". La humanidad no se termina en los que tiene dirección de email.

Luego, hay puntos interesantes. El tema copyright: bien puede suceder como en el video, bien puede que no. La difusión de conocimiento es distinta de la difusión de obras, pero lo Walter Benjamin denominó la "época de la reproductibilidad técnica", y aplicándosela al arte, es cada vez más presente en otros ámbitos. No confundir copyright, con derechos de autor.

Me fascina la aparición de la Wikipedia, los blogs, y los algoritmos de Google. Creo que han dado una "vuelta de tuerca" impresionante a lo que venía siendo la web, que ante su crecimiento parecía quedar tapada por su propio tamaño. Hoy, publicar, encontrar, y compartir, es posible gracias a esas herramientas.

Tengo muchas esperanzas en la figura del prosumidor, y en la generación de contenido en la red, para luego pasarlo a otros formatos, mediante impresión a pedido. Ya hay editoriales de libros y obras que adoptan este modo de difusión y producción. Soy más cauto en la aparición y adopción de tecnologías como la hoja de papel: creo que va a ser más simple e inmediato, tener cada vez más computadoras diminutas, no sólo para leer. La hoja de papel estará en la palm de cada uno, no la veo como un producto aparte.

Google comprando Microsoft: puede ser. La alternativa es que no la compre, y que en unos años, el sistema operativo sea un accidente, algo implementado para entrar en la red.

No apuesto al futuro de Second Life, pero parece que a la gente le gusta. A mí me gustaría, si pudiera ser yo, en vez de tener que elegir un clan o apellido. Pero parece que a los demás les gusta tener otra identidad. Confieso que me parece asombrosa esa actitud. Negar lo único que somos, es para mí, extraño.

Como escribía arriba, hay tanto para comentar. Pueden ver los comentarios en español en:

http://www.youtube.com/watch?v=aD4XtZqJu-U

y en inglés en:

http://www.youtube.com/watch?v=xj8ZadKgdC0

Nos leemos!

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

Posted Sat, Sep 8 2007 5:58 by lopez | with no comments

Filed under:

Presentación en línea sobre desarrollo con ASP.NET 2.x

Hace unos meses, filmé para un evento online de Microsoft, una presentación que contiene video, sonido, y ejemplos de capturas de pantalla, sobre temas de ASP.NET 2.0 que trato en mis cursos:

http://www.microsoft.com/conosur/tercereventoonline/presentaciones/LOPEZ/LOPEZ.htm

 

Entre los temas tratados están:

- Proyecto Web
- Primeros controles
- La gran grilla
- Editando datos
- Autenticación
- Master Pages
- Themes
- Ejemplo AjEjemplo
- Ejemplo The Beer House

Los ejemplos están en:

http://www.ajlopez.com/downloads/webday.zip

Código de ejemplo en capas CodeDotNetArch.zip. Incluye ejemplos en VB.NET 2, CSharp 2, usando Business Components/Business Entities, y ejemplos VB.NET 2 usando elementos de Domain-Driven Design.


Otros ejemplos en el libro
ASP.NET 2.0 Website Programming: Problem - Design - Solution de Marco Bellinaso. Bajar código

Libro
Professional Web Parts and Custom Controls with ASP.NET 2.0 de Peter Vogel. Bajar código

Libro
Pro ASP.NET 2.0 in C# 2005 de Matthew MacDonald, Mario Szpuszta. Bajar código

Un artículo donde recopilé información sobre ASP.NET Providers en Learning ASP.NET Providers

Para mí fue una nueva experiencia. Agradezco a la gente de Dominio Digital, a Claudio Regis que me filmó, y que hizo todo lo posible por hacerme aparecer humano... ;-). Y claro, a la gente de Microsoft de Argentina, por haberme dado esta oportunidad.

Espero que les sirva y se entienda.

 Nos leemos!

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

Posted Wed, Sep 5 2007 0:00 by lopez | with no comments

Filed under: ,

Reunión de Generación de Sistemas con AjGenesis

Ya había anunciado que el viernes pasado había desayuno de arquitectura, en el Microsoft User Group de Argentina. Agradezco desde acá a la gente del MUG por haberme dado la oportunidad de presentar este proyecto, y las ideas que me llevaron a implementarlo.

La reunión comenzó a las 9 horas y monedas, y seguimos casi hasta las 12hs, hubo charla informal post reunión, muy interesante.

Material del Desayuno de Arquitectura sobre AjGenesis

Para los que no conozcan sobre AjGenesis, mi "pet project" de generación de código, leer alguno de los "post":

Generación de aplicaciones con AjGenesis
Generando código: Hello World con AjGenesis

Presentación

Pueden bajarse del material de la reunión, la presentación que usé, ya usada en una reunión del año pasado. Esta vez, usé los primeros puntos de esa presentación, y varios de los puntos ya escritos en

Sobre la generación de código

Así que acá agregaré algunos puntos adicionales, que no había pasado por escrito:

. La adopción de una variante del AjBasic como lenguaje de templates: motivada por la necesidad de tener un lenguaje de programación, no solamente una forma de expandir variables dentro de un template, o ejecutar algún for each sobre una lista de objetos del modelo. Creo que fue una buena elección, y siempre queda abierta la posibilidad de usar otro lenguaje para los templates. Con AjBasic tengo la posibilidad de tratar el modelo como un grafo de objetos (no solo como un árbol, como sería si trabajara con XML solamente), modificable, competable (puedo tomar decisiones y agregar elementos al modelo). Pequeñas cosas como

if not Project.Title then
    Project.Title = Project.Name
end if

o compleciones del modelo como

if Entity.Reference then
    Entity.Reference = GetEntity(Entity.Reference)
end if

(donde Entity.Reference inicialmente tiene solo el NOMBRE de la entidad referida, y luego lo reemplazo por la entidad completa, para armar un grafo de objetos, desde un árbol inicial de objetos).

son posibles al haber elegido ese camino.

- El modelo libre: mostré el ejemplo del Hello World, y cómo desde ese modelo se puede generar código o artefactos de texto, llamada desde consola, la ejecución de pequeñas tareas en AjBasic, y la integración con NAnt.

- Ejemplos de modelos y templates: me basé en lo que ya estaba escrito en AjGenesisExamples3.zip y Generación de aplicaciones con AjGenesis donde se muestra un ejemplo. No es que AjGenesis se base sobre "ese modelo", sólo son ejemplos de distintos proyectos, sobre el mismo modelo, que se concentra en representar entidades, y templates que generan Java, Java con Hibernate, VB.NET 1/2, CSharp 1/2, business entities, o implementaciones con conceptos de Domain-Driven Desing.

- Uso de XML para describir el modelo: usando un XML libre, no sujeto a un esquema, que no "duela los ojos" leerlo, nos permite ir agregando elementos al modelo, sin tener que modificar una base de datos, o cambiando un esquema con el que hay que cumplir a rajatabla. Creo que ha sido una decisión que ha permitido que cada uno experimente con distintos modelos, rápidamente. Más sobre el tema más adelante en este post.

- Prototipos y semillas: mostré cómo el AjGenesis puede generar sus propios modelos, desde modelos más sencillos. El ejemplo, basado en el modelo de AjGenesisExamples2/3, pasa, de una simple lista de entidades, cada una prototípica de alguna categoría ("kantiana" la llamé ;-) como persona, documento, lugar, empresa, evento, a un modelo más completo, con armado del directorio del proyecto, el archivo que lo describe, los archivos de entidades, los archivos de tecnología, y los scripts del NAnt, listos para usar.

- Caminos a encarar: como una aplicación web que permita exponer los servicios de AjGenesis, el uso de inteligencia artifical, pasar a un modelo ASP (Application Service Provider), integración con IDEs (por ejemplo, un custom tool para Visual Studio 2005, o un plugin para el Eclipse).

- CodePlex: Ahora el proyecto está en Codeplex y ahi tenemos un foro para plantear dudas, discusiones y problemas encontrados.

- Version 0.5: En desarrollo, apenas comienza su ciclo, pueden encontrarla en AjGenesis-0.5.zip, está armada para .NET 2.x. Todavía tengo que incluir los créditos, a Marcelo Fassi y su compañero Fabián, por el código para soportar comentarios en el modelo XML, soporte de acentos en los templates. De mi parte, el mayor cambio ha sido recompilarlo a .NET 2.x, pero este fin de semana, agregué el soporte de respetar código manual (escrito por el programador) entre una y otra generación del artefacto de texto. Espero bloguear en estos días, sobre estas novedades.

Discusión

Durante la charla, se plantearon varios temas, entre los asistentes. Tuve la alegría de conocer en persona a Fabio Maulo, activo colaborador del proyecto NHibernate, al que conocía de la lista nhibernate-hispano, administrada por él y Darío Quintana. Ya estámoslo convenciendo para que dé una charla magistral sobre NHibernate en el MUG.

- Manual: fue un tema pedido, la necesidad de tener un manual. Hasta ahora, están los artículos mencionados al principio de este post, para ir entendiendo algunos puntos. Pero es necesario tener un manual, por ejemplo, del lenguaje AjBasic, o que explique algunos usos de las tareas de los ejemplos. Tengo un sistema de documentación en HTML, inspirado en el DocBook (dado un formato inicial, generar la documentación), pero sólo escritas cinco páginas. Tácticamente, para suplir esta falta, voy escribiendo artículos sobre el uso del sistema. Carlos Peix sugirió usar la implementación de la gente de Velocity: parece una interesante implementación sobre DocBook.

- Lista de Generación de Código: Me alegró ver a Luis Petek, Carlos Santos, y Alejandro Nelis, munidos de sus respectivas notebooks, trabajando con templates y generando código con AjGenesis, y estudiando el tema. Armaron una lista donde se discuten estos temas, no sólo de AjGenesis, en Google Groups:

http://groups.google.com/group/codegeneration?hl=es

Tienen armado un template para SQL Server 2005, y otro con persistencia usando Enterprise Library. Notable, muchas gracias!

Ellos plantearon el tema de tener un repositorio de templates. Siempre pienso en ese, en especial viendo a otros generadores de código. Pero no pensé que hiciera falta todavía. Pero voy viendo que puede ser la hora de exponer algo. Otro tema a meditar, para elegir un camino.

- Esquema en modelo: Fabio Maulo dejó un comentario muy amable en el post Desayuno de Arquitectura con AjGenesis. Reproduzco su tema planteado acá:

XSD?

Me parece que el tema de "XSD o no" entra poco en los objetivos de AjG. Como mucho, AjG puede tener un servicio mas que es lo de aceptar unos XSD (o el nombre del folder donde estan disponible) y chekear los XMLs ante de empezar a aplicarle los templates. Mas que eso a AjG no le veo.

Despues de la Genesis sea los animales que los hombres se organizaron en sociedades que conviven dandose algunas reglas. Los XSD lo veo como las "reglas" que se da una determinadad comunidad de utilizadores de AjG para compartir  XML de un determinado dominio o de una determinada forma de definir el dominio.

Distintas comunidades podrán eleguir distintos XSD. Por lo menos creo que eso es lo que va a pasar...

Despues es probable que la evolución sea similar a la que hubo con los lenguajes y los IDE. Yo tambien he trabajado con el "vi" pero no es que este muy entusiasmado con eso.

Usando XSD tendriamos un control "temprano" mientras escribimos el domain y hasta se podría  hacer un plug-ins para varios IDE para escribir los templates... quiero decir que si existe el XSD podríamos usar el IDE para chequear que exista un determinado tag y sobre todo que siga funcionando el intellisense para el lenguaje por el cual estamos escribiendo el template.

Ciertamente, el tema XSD o algún otro esquema, es un tema a meditar. Tengo un "spike" de un esquema expresado en... chan chan... un modelo de AjGenesis... :-). Esto permitiría expresar el esquema del modelo, y además, generar, por ejemplo, páginas web de actualización del modelo. Pero es por ahora sólo una idea.

Mantener código manual: Se discutió la necesidad de mantener código manual, dentro de una solución, o incluso, dentro del mismo artefacto de texto. En este último caso, ya pude aportar un intento de solución el fin de semana, en la versión 0.5 que mencioné arriba. También se mencionó de mantener lo manual por subclase, o en clases parciales, en el caso de .NET. Claudio Meschini comentó sus ideas sobre generar desde el código mismo, y este fin de semana, posteó sobre templates compilados. Creo que puedo implementar algo así en AjGenesis directamente, pero me parece que se complica incrustrar ciclos en esos textos. Por lo que entendí, Claudio plantea tener un código, compilable, y de ahí obtener el template. Se discutió el tema al terminar la charla, y es interesante. Me recordó lo que hacía en los 80, con mi sistema de generación de código C: a un código que compilaba, le pasaba una macros de editor, para cambiar, por ejemplo "AltaCliente(Cliente c)" por "Alta${Entity}(${Entity} c)" (me confunde el término template compilado, no sé si entendí bien a Claudio: lo que estoy describiendo, es un código que compila, que luego puede usarse para generar el template genérico). Vean también el proyecto de Claudio Quetzal: si lo tuviera que hacer en Java, apelaría al proyecto Anaxia, dentro de Velocity.

Lógica de negocio: ¿cómo expresarla en el modelo? Gran tema, discutido en parte en la charla, y en la reunión post charla. Yo creo que hay dos caminos, uno más cercano que otro:

1- Colocar código para un lenguaje, en el propio modelo (algo como

<Method... >
  <CodeImplementations>
   <CodeImplementation Language="VBNET">
... codigo VBNET...

   </CodeImplementation>
   <CodeImplementation Language="Java">
... codigo Java ...
   </CodeImplementation>
  </CodeImplementations>
</Method>

2- Definir más abstractamente la lógica, mediante:

2a)- Seudo lenguaje, podría ser un AjBasic, y trasladores de ese lenguaje al lenguaje destino

2b)- Modelo en XML, como en los sistemas de Rule Engines, que luego se vuelca al sistema (no sólo lenguaje) destino

Creo que el camino 1, es el más fácil, y pragmático. Y más aplicable en el caso de tener varios sistemas, pero con un solo lenguaje de implementación, con distintas lógicas de negocio para distintas versiones. Las distintas versiones de lógica, se podrían mantener como una parte variable del modelo: hoy generamos con la lógica A1, y mañana cargamos el modelo con la lógica A2, de manera similar a como se carga hoy en los ejemplos a la tecnología.

El camino 2a, es interesante. Pero tenemos que discutir qué es "la lógica de negocio". No necesariamente la lógica va a un método, puede ser que influya en el esquema de definición de un workflow, en un XML de definición de ese workflow, y demás. Pero si es código a incrustar, se puede pensar en el 1, y el 2a.

El camino 2b, es más abstracto. Pero hay que tener claro exactamente que le pedimos como capacidad a la implementación de la lógica de negocio.

Claudio Meschini mencionó LOP Lenguajes orientados a programación. Puede estudiar:

http://www.onboard.jetbrains.com/is1/articles/04/10/lop/index.html
Language-Oriented Programming talk with Neal Ford

Generando el modelo: Recordé en algún momento, un trabajo del bueno de Darío Quintana:

Reflexión + Generación de Código = Modelo para AjGenesis

Esa es la idea: generar el modelo pragmáticamente, desde donde sea. Fabio sugirió levantar los .hbm de un NHibernate, y usarlo como parte de modelo. No se me había ocurrido, pero es posible e interesante: debería cargar un XML cualquiera como objeto y permitirlo vivir en el modelo (eso implica una nueva forma de cargar un XML en memoria para AjGenesis: al contrario de lo que hace ahora, deberá distinguir entre atributo y elemento hijo de un nodo, pero es un cambio que puedo hacer sin afectar la forma actual de carga de modelo).

Conclusión

Excelente que la gente se haya enganchado en el tema! Creo que, de las ideas y discusiones planteadas, las prioridades serán:

- Manual: indispensable para poder explicar el uso del sistema

- Mantenimiento de código manual: algo avancé en la nueva versión 0.5

- Comunidad: ya se va formando. Creo que no hay que forzar las cosas, e ir viendo de alimentar el grupo de generación de código, y seguir paso a paso.

- Modelado de lógica de negocio: interesantísimo tema, con varios caminos a seguir.

De nuevo, gracias a la gente del MUG por haberme permitido hacer esta reunión. Y a todos los que vinieron, gracias! Espero que les haya servido, para ver alguna alternativa más sobre el fascinante tema de creación de software.

Nos leemos!

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

Posted Mon, Sep 3 2007 12:16 by lopez | 3 comment(s)