Archive for the '5633' Category

Twitter para todo: TweetMyPC (y TweetMyMac también)

Tuesday, September 1st, 2009

Una idea que quería explorar es crear un pequeño estándar de cómo usar mensajes cortos para enviar comandos y recibir respuestas de una aplicación cualquiera. Un paso hacia eso, muy ingenioso, es la de TweetMyPc (http://tweetmypc.codeplex.com/). El autor principal es Shoban, Microsoft MVP de la India.

La aplicación es chica, y cuando la ejecutamos en nuestra máquina, ingresamos los datos de nuestra cuenta de Twitter:

Una vez que arranca la aplicación, comienza a leer nuestros tweets cada 1 minuto. Es conveniente usar una cuenta para cada PC. Desde esa cuenta, desde cualquier otro lugar, podemos enviar comandos como: Shutdown, Hibernate, Lock, y hasta Download, que comienza a bajar un archivo. Una lista parcial de comandos la pueden ver en:

http://www.codegeeks.net/tweetmypc-what-next

Si uno saca un Screenshot remoto, la aplicación responde enviando un comando con una URL de la imagen tomada. Este es el tipo de respuesta que tenía en mente en el primer párrafo de este post: una forma de enviar algo más grande que un mensaje, es mediante una URL.

La aplicación está escrita en .NET. No vi el código todavía, pero está originalmente escrita en VB.Net y hay versión en C#.

Tienen también aplicación para

Otra aplicación del mismo autor:

http://www.codeplex.com/jata 

Jata is a Google Talk like Twitter Application which was developed using VB.net and Twiteroo Twitter API framework.
jata automatically checks for new messages periodically. You can post your status right from jata post message screen.
You can also reply to tweets using jata.

Habría que seguir explorando la idea de manejar aplicaciones con mensajes cortos, desde Twitter u otros.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Ejemplos de ASP.NET, capas y Linq

Thursday, July 23rd, 2009

Hace dos semanas, terminé de dar un curso de ASP.NET, con máquinas, en el laboratorio del Microsoft User Group de Argentina, en Buenos Aires, contando con diez asistentes, con los que tuvimos 30 horas explorando el desarrollo de sitios dinámicos con .NET. Los ejemplos que fuimos desarrollando y otros que bajamos de ejemplos míos, están disponibles para bajarse desde:

Material del Curso de ASP.NET en el MUG

(Siempre pueden bajar lo que tratamos en mis cursos, desde

Materiales de Cursos

ya sea ASP.NET, .NET, arquitectura, Java, JSP, Spring, Struts, etc… así como las presentaciones que se usaron)

Hay varios ejemplos para estudiar, que podría explicar más en detalle en algún post, pero vaya ahora una introducción:

AjFirstExample

En este ejemplo

tenemos una base de datos, que pueden instalar usando cualquiera de los dos directorios Sql, y dos soluciones, una en VB.NET y otra en C#.

En el directorio Sql, tenemos:

 

Podemos lanzar la creación de la base con el comando ExecuteAll.cmd, que contiene

 

@REM  -------------------------------------------------------------

@REM  You can change server.

@REM  -------------------------------------------------------------

SET sqlServer=%1%

if "%1%"=="" set sqlServer=(local)

 

call CreateDatabase %sqlServer%

 

rem TBD:

rem call LinkData %sqlServer%

rem call InsertData %sqlServer%

 

goto end

 

:end

Si lo invocamos sin parámetros, va a conectarse con nuestro MS SQL Server (local). Si queremos ir contra otra instancia, por ejemplo, contra .\SQLEXPRESS, hay que invocarlo como:

ExecuteAll.cmd .\SQLEXPRESS

Crea una base simple, AjFirstExample, con dos tablas, clientes y proveedores, y procedimientos almacenados:

 

El ejemplo sigue algunos linemamientos de Patterns & Practices, de Microsoft, como tener separados Business Entities de Business Components. La solución tiene varios proyectos:

 

WebClient es el sitio web. AjFirstExample.Services es una capa de servicios lógicos (no tecnológicos, como podría ser un Web Service), que es un .DLL que se invoca directamente de el sitio web. Es lo que en patrones llamamos una Service Layer. AjFirstExample.Entities contiene entidadas simples, con datos, sin conducta ni persistencia. Está muy orientada al ejemplo, que apenas es un CRUD (Create Read Update Delete) de entidades, fragmento:

Imports System.Collections.Generic

 

Imports AjFirstExample.Entities

Imports AjFirstExample.Business

 

Imports AjFramework.Data

 

Public Class SupplierService

    Private Shared mSupplierComponent as new SupplierComponent

 

    Public Shared Sub Insert(entity as Supplier)

        mSupplierComponent.Insert(entity)

    End Sub

 

    Public Shared Sub Update(entity as Supplier)

        mSupplierComponent.Update(entity)

    End Sub

 

    Public Shared Sub Delete(id as Integer)

        mSupplierComponent.Delete(id)

    End Sub

 

    Public Shared Function GetById(id as Integer) as Supplier

        return mSupplierComponent.GetById(id)

    End Function

AjFirstExample.BusinessComponents tiene lógica de validación antes de grabar o insertar una entidad, y AjFirstExample.Data termina encargándose de la persistencia, usando un DataService, que yo había codificado dentro de algo que uso en mis cursos, AjFramework.

En las páginas web, es común conversar con el servicio, para tomar y enviar datos a ese proyecto:

Public Partial Class Admin_CustomersPage

    Inherits System.Web.UI.Page

 

    Protected Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load

        'Put user code to initialize the page here

        If Not IsPostBack Then

            gvwData.DataSource = CustomerService.GetList

            gvwData.DataBind()

        End If

    End Sub

 

End Class

Este ejemplo lo tienen también en ese mismo .zip implementada en C#. Van a ver que ha sido generada directamente por AjGenesis, el generador de código que uso para armar gran parte de mis ejemplos y del desarrollo del día a día que emprendo:

'

' File generated using AjGenesis

' http://www.ajlopez.com/ajgenesis

' http://www.ajlopez.net/ajgenesis

' Open Source Code Generation Engine

'

 

Si tienen que cambiar el string de conexión, deben modificar el web.config del proyecto web, en el sector:

<AjFramework>

    <Parameters>

        <Parameter Name="ConnectionString" Value="server=.\SQLEXPRESS;database=AjFirstExample;Integrated Security=true"/>

    </Parameters>

</AjFramework>

Hay otro ejemplo para bajarse e instalar de la misma manera:

AjTest

Con las mismas ideas:

 

pero con más entidades:

 

Cada departamento contiene empleados. Los proyectos contienen tareas, y las tareas se pueden asigna a empleados. Cada empleado tiene "Skills”, competencias, y cada competencia tiene empleados. Desde las páginas de administración, pueden ingresar los datos de estas entidades.

Sin embargo, la relación entre estas entidades, no está en la entidad misma, sino en cómo recuperamos los datos necesarios desde el servicio. En vez de tener dentro de Department una lista de Employee, los empleados de un departamento se obtienen desde código, ejemplo:

protected void Page_Load(object sender, System.EventArgs e)

{

    // Put user code to initialize the page here

    if (!IsPostBack) {

        IdEntity = Convert.ToInt32(Request["Id"]);

        Entity = DepartmentService.GetById(IdEntity);

        dtgDataEmployees.DataSource = EmployeeService.GetByDepartmentEx(IdEntity);

           DataBind();

    }

}

Un ejemplo, donde usamos una base similar, pero en el código establecemos las relaciones, está en:

AjTestCSharp3Linq.zip

Acá usamos Linq2Sql

 

donde las entidades, generadas por el wizard de Linq2Sql, ya tienen las relaciones incorporadas. Entonces, una vez obtenido un Deparment, podemos pasar a Employees en una simple propiedad que tiene el objecto departamento:

protected void Page_Load(object sender, System.EventArgs e)

{

    // Put user code to initialize the page here

    if (!IsPostBack) {

        LinqDepartmentsService service = new LinqDepartmentsService();

        IdEntity = new Guid(Request["Id"]);

        Entity = service.GetDepartment(IdEntity);

        dtgDataEmployees.DataSource = Entity.Employees;

           DataBind();

    }

}

Un último ejemplo más, para este post rápido:

AjFirstExampleWcfCSharp3.zip

En este caso, seguimos usando Linq, lo que viaja a la presentación, son mensajes Windows Communication Foundation, hay un sitio web que expone servicios WCF, y de la parte del cliente, código de gateway para llegar a esos servicios:

 

En vez de llegar a la presentación las entidades de .Data, de Linq, pasamos mensajes de Data Contract de WCF:

namespace AjFirstExample.Services.Contracts

{

    using System;

    using System.Runtime.Serialization;

 

    [DataContract]

    public class Customer

    {

    

        [DataMember]

       public Guid Id { get; set; }

    

        [DataMember]

       public string Name { get; set; }

    

        [DataMember]

       public string Address { get; set; }

    

        [DataMember]

       public string Notes { get; set; }

    }

}

Bueno, espero que puedan sacar algo útil de estos ejemplo, vean también los archivos de ejemplos que fuimos desarrollando en cada clase.

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

Ejemplo ASP.NET usando Mere Mortals Framework

Wednesday, July 15th, 2009

Estuve trabajando, como un spike dentro del proyecto Medusa, para reproducir el ejemplo ASP.NET que viene descripto en el Mere Mortals Framework Developer’s Guide, que usa la base de datos MS SQL Northwind. Lo escribí usando VB.NET como lenguaje (en la guía de Mere Mortals, que pueden bajar del sitio del framework, se describe también en C#).

El sitio del framework es

Oak Leaf Products

Pueden bajar la guía de:

DOWNLOAD the MM .NET Developer’s Guide

Lo que escribí pueden bajarlo de mi Skydrive:

MMNorthwind.zip

Pueden cargar la solución en VS 2008 (tienen que tener las DLLs del Mere Mortals framework en su máquina).

La página que busca las órdenes de compra por código de cliente es CustomerOrders.aspx:

The first column is a link, that points to OrderEdit.aspx, where you can edit

Si necesitan cambiar la conexión a la base, pueden modificar el web.config:

Diferencias: no estoy usando procedimientos almacenados para todos los Business Objects, como hace el ejemplo original, sólo en los lugares que necesito. Se puso entonces que el tipo de comando asumido a enviar al framework es .Text, en vez de .StoredProcedures. Tampoco puse la misma master page del ejemplo.

En el proyecto Medusa, el equipo está trabajando para mejorar la validación de campos y reglas de negocios, y mensajes de error, generando una aplicación web completa, usando AjGenesis, partiendo de un modelo que nace de la base de datos.

Espero poder escribir y publicar templates y tareas de AjGenesis, para generar algo como el ejemplo de arriba: una aplicación web, pero desde un modelo como el que uso en mis otros ejemplos de AjGenesis. Keep tuned! 🙂

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez

Test-driven development en acción, usando Visual Studio

Wednesday, March 18th, 2009

Estoy preparando una charla para el jueves de la semana que viene, 26 de Marzo, en el Microsoft User Group de Argentina. Pueden inscribirse en:

MEDIA JORNADA “Test-driven development en acción, usando Visual Studio”.

El horario es de 18:30 a 21:30. La idea es ir armando ejemplos usando los principios de TDD, con código que muestre:

  • Documentar el código con tests, en vez de en papel
  • Usar listas de test para generar requerimientos explícitos
  • Refactorear y mejorar el diseño del código
  • Test bajo una UI delgada
  • Test para cambios incrementales, minimizando la depuración
  • Entregar software que sea verificable y robusto

Lo que veremos estará basado en .NET y Visual Studio, pero se puede aplicar a otros entornos, lenguajes y tecnologías. Las ideas de base son las mismas.

Como siempre, preparar una charla sirve para aclarar los puntos que uno va aplicando en el día a día. Explicar algo, nos permite entenderlo mejor.

Es gratis PARA LOS SOCIOS DEL MUG. Los demás, ¿qué esperan para asociarse? 😉

Como en otras ocasiones, publicaré en mi sitio el material que utilice en el curso, y probablemente, aparecerán posts por este blog, explicando algunos puntos.

¿Sugerencias a incluir en el temario? ¿Otros temas interesantes para armar una charla-serie de posts?

(Gracias a la gente del MUG, en especial a Gustavo Bachrach, que me han pedido un post para publicar en la revista que entregan a los socios).

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez

Libro Foundation of Programming, listo para bajar

Wednesday, June 25th, 2008

Gracias a Cladio M.E. Bastos Iorio de http://www.blumer.com.ar me entero de la aparición de este libro. Claudio posteó la información en una lista pública del MUG de Argentina (http://www.mug.org.ar/ ):

Foundations of Programming Ebook

 

I’m excitted to finally release the official, and completely free, Foundations of Programming EBook. This essentially contains all 9 Foundation parts including a conclusion and some typical book fluff (table of content, acknowledgement and so on). A number of spelling errors were corrected, along with some small technical changes and clarifications – largely based on feedback, so thanks for everyone who provided it! Otherwise it’s exactly the same as what’s been posted here over the past several months.

Download it from http://codebetter.com/files/folders/codebetter_downloads/entry179694.aspx

If the above link fails, you can also get it from http://www.openmymind.net/FoundationsOfProgramming.pdf

Acabo de leer el índice, y de leer algunos capítulos rápidamente. Es muy interesante los temas que toca, y parece bien encarados. El bueno de Karl Seguin ha hecho un magnífico trabajo, colocando en un solo libro temas que nos tocan en el desarrollo de software de todos los días. Si bien está algo orientado a .NET, es totalmente aprovechable en otras tecnologías, como Java. El texto había ido apareciendo en los últimos meses, en forma de posts, y revisado por colegas, en general dentro del movimiento ALT.NET, así que el trabajo de Seguin se ha enriquecido con los comentarios de la comunidad de desarrollo.

Sobre el autor

Karl Seguin is a developer at Fuel Industries, a former Microsoft MVP, a member of the influential CodeBetter.com community and an editor for DotNetSlackers. He has written numerous articles and is an active member of various Microsoft public newsgroups. He lives in Ottawa, Ontario Canada.

His personal webpage is: http://www.openmymind.net/

His blog, along with that of a number of distinguished professionals, is located at: http://www.codebetter.com/

Enumero algunos temas tratados:

– El movimiento ALT.NET, enumerando y desarrollando sus pilares, algo confrontados con la visión MSDN

– Domain-Driven Design, explicando los términos, y justamente, explicando cuándo usarlo y cuándo no, cuál es el contraste con una aproximación Data-Centric.

– Persistencia, algo con lo que lidiamos en prácticamente cada proyecto.

– Dependency Injection, una de las mejores técnicas inventadas, desde que alguien dijo que el pan tenía que venir en rebanadas.

– Unit Testing, indispensable en el bolso de la desarrolladora y en el bolsillo del caballero desarrollador. Hay días en los que pienso que hasta el Hello World de Kernighan y Ritchie debería tener su Unit Test.

– Object Relational Mappers, todo un capítulo explicando la idea y algunas implementaciones, usando NHibernate.

– Manejo de memoria, un back to basics que veo necesario, como comento en mis cursos.

– Excepciones, otro back to basics que se debe explicar.

– Proxy, tengo que ver en detalle este capítulo, para ver hasta dónde llega la idea del autor.

El libro también viene acompañado de código, con ejemplos de los temas tratados, por ejemplo, las formas de usar NHibernate, documentando sus características. Lo pueden bajar desde:

http://openmymind.net/CodeBetter.Foundations.zip

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com/

"Ver la luz" con generación de código y AjGenesis

Tuesday, June 10th, 2008

Ayer dí una charla gratuita sobre generación de código, usando AjGenesis. Espero haber transmitido la idea de que es más que generación de código, y que va más allá de la tecnología actual.

Quisiera enumerar algunos posts relacionados con el tema, y comentarlos, así como enumerar enlaces y recursos.

Posts sobre generación de código

Sobre la generación de código

Este es el primer post a leer. Vemos ahí que el cambio de tecnología es una constante en la historia de desarrollo de software, y que no se ve en el horizonte una unificación de nada, ni de lenguajes ni de plataformas. Cada año que pasa, sabemos más de hacer sistemas, pero curiosamente, cada sistema nuevo necesita más codigo que el anterior, en general. Aún usando tecnologías que nos alivian el trabajo, por ejemplo, algún ORM (Object Relational Mapper), si la tecnología triunfa, el propio mercado nos lleva a hacer sistemas más complejos y grandes, y lo que ahorramos en código a escribir, luego lo perdemos en la mayor complejidad de lo sistemas que tenemos a nuestro alcance construir.

También se enumeran otras alternativas a la generación de código, y sus problemas. Las herramientas CASE son muy rígidas, o generales o abarcativas, así como UML y otras iniciativas. Lo que necesitamos son modelos específicos de nuestro dominio, y poder generar lo que querramos, de la forma que nos convenga. De ahí la necesidad de contar con un generador de código que no esté orientado a una tecnología a generar en particular, que sea de código abierto, y que genere lo que nosotros le indicamos, no lo que los autores de la herramienta quieren o pensaron inicialmente.

El usar frameworks propietarios, quedarse en una sola tecnología, tratar de generar todo en runtime apelando a metadata, o generar código desde XML aplicando transformaciones XSLT, son alternativas que creo que son inferiores o más complejas, como se explica en ese post.

Generando Código- Hello World con AjGenesis

Esta es la “prueba ácida” de todo generador de código. Si una herramienta de ese tipo no nos ayuda a crear programas “Hola mundo”, con variantes, en distintas tecnologías, entonces no es lo bastante flexible. AjGenesis hace hincapié en la flexibilidad, la adaptibilidad a lo que Uds quieran producir, sin atarlos a una forma o metadata en particular.

Generando aplicaciones con AjGenesis

Un post algo viejo, pero que muestra cómo se pueden generar aplicaciones no triviales con esta herramienta.

AjGenesis- Modelo generado desde los assemblies
AjGenesis- Modelo desde la Base de Datos

Posts sobre cómo el modelo puede partir de otras fuentes, cualquiera que Uds. vean que sea conveniente. Luego, la propia herramienta puede mejorar, completar el modelo, hacer inferencias, o Uds. mismos completarlos, por ejemplo, si el modelo de base de datos no es lo bastante rico para darnos algo de semántica sobre el sistema que tenemos entre manos.

Generando código para NHibernate (Parte 3)
Generando código para NHibernate (Parte 2)
Generando código para NHibernate (Parte 1)

Para ver que pueden usar AjGenesis para facilitar el desarrollo usando alguna librería reconocida por la comunidad, pueden leer esta serie de enlaces, donde gracias a una idea de Omar del valle Rodríguez, se desarrollaron templates para usar NHibernate, y generar hasta una capa de presentación web para probar lo generado.

Hacia el AjGenesis Recipes

Es un trabajo en progreso, para incorporar interacción con el usuario durante el proceso de generación de código.

Usando AjGenesis y NAnt

Explicación y enlaces para usar AjGenesis desde NAnt. Si alguien necesita una interfaz gráfica NAnt-GUI, pueden bajarla desde NAnt-GUI (preparado por Carlos Marcelo Santos, del grupo de generación de código)

Genesis Studio- una IDE para AjGenesis

No todo lo tienen que hacer desde la línea de comando, o desde el NAnt/NAnt-GUI. El bueno de Jonathan Cisneros desarrolló esta herramienta WinForm, con sintaxis de color y muchas mejoras en la experiencia de usuario, que pueden bajar desde:

http://www.codeplex.com/ajgenesisstudio

Preservando código en AjGenesis

Si necesitan generar código, pero luego modificarlo, pueden usar algunas capacidades de AjGenesis para delimitar qué parte regenerar y cuales conservan.

Code Generation as a Service

La última adición al AjGenesis: ahora pueden generar código usando una interfaz web. Esto permite que ya sea en Internet, o desde la intranet de su empresa, puedan generar código controlado, que cumpla con los estándares que se hayan adoptado.

Más posts sobre AjGenesis en

AjGenesis

Si necesitan pasarle información a alguien que no maneja el español, pueden probar con mis artículos en “Anglish” (Angel’s English):

http://ajlopez.wordpress.com/category/ajgenesis

Enlaces

EL sitio sobre generación de código es

http://www.codegeneration.net

Ahí encontraran comentarios, herramientas, preguntas frecuentes sobre generación de código en general. Tienen una base de datos de herramientas publicadas. Hay enlaces sobre generación de código para distintas tecnologías, como Java, .NET, PHP y también temas de MDA (Model-Driven Architecture).

Otros enlaces que tratamos en las charlas son:

CodeSmith Tools

MyGeneration Software

AndroMDA.org – Home

Mantengo todo tipo de enlaces relativos a generación de código en

http://del.icio.us/ajlopez/codegeneration

 

Lista de correo sobre generación de código

Existe un Google Group que se puede consultar por email, en español, dedicado a la generación de código. Ahí, además de otros temas, se trata de generación de código con AjGenesis, la generación de templates. En los archivos del grupo se publican ejemplos armados por los miembros.

Pueden ver los mensajes y suscribirse, en:

http://groups.google.com/group/codegeneration

Conclusión

Espero que quede claro que lo importante es usar generación de código como solución pragmática, pero basado en la abstracción de un modelo. Hacer el ejercicio de abstracción de generar un modelo adecuado para lo que necesitemos, es un “must” que me parece el primer paso para separarnos de los problemas de cambios en las tecnologías, herramientas y plataformas.

Luego, el modelo debe ser de libre definición. Y el texto o código generado, también: debe ser el tipo de texto o código que hubiéramos generado nosotros mismos. Finalmente, la herramienta de generación de código tiene que estar disponible en código totalmente abierto, para que se pueda extender, entender o usar de la forma que querramos.

Tengo que escribir más sobre la importancia del modelo, y que pueden hacer el suyo propio: no hay modelo fijo, pueden partir desde la base de datos, desde los archivos XML de los ejemplos, o desde donde quieran. También tengo que escribir sobre la posibilidad de hacer modelos que se deriven de otros modelos. Y escribir haciendo énfasis en que lo que construimos, en realidad, es un sistema experto. De ahí, que desde el principio, incorporé un lenguaje de programación que puede tomar decisiones, completar y modificar el modelo.

Como ven, con AjGenesis, ¡sky is the limit! 🙂

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com/

Presentando Visual Studio 2008

Wednesday, June 4th, 2008

Ayer tuve el gusto de presentar algunas características de la nueva versión, Visual Studio 2008, en Rosario, provincia de Santa Fé, gracias a la organización del Microsoft User Group de Argentina. Mi charla fue al final de una serie de charlas que ocuparon toda la tarde, desde las 14hs hasta entrada la noche, cerca de las 22hs.

Pueden ver el detalle en

Rosario – Jornada de Actualización Profesional Microsoft 2008

Quisiera exponer en este post, los enlaces y recursos que utilicé. En principio, la presentación fue “inspirada” (un eufemismo por “robada”… 😉 del

Download details- Visual Studio 2008 Training Kit

que contiene información, “hand-ons labs” (algunos los escribimos en equipo de Southworks el año pasado), y presentaciones con notas adicionales.

Para una introducción general a lo nuevo de VS 2008 y .NET 3.5, pueden ver

Pro VB 2008 and the .NET 3.5 Platform

Be the first to put .NET 3.5 and VB 2008 to work, with expert tuition and guidance from esteemed author, Andrew Troelsen. In Pro VB 2008 and the .NET 3.5 Platform, you’ll find complete coverage of .NET 3.5, including WPF, WCF, and WF, guided by a deep understanding of the .NET platform and appreciation of the subtleties of VB that could only come from this award-winning author’s invaluable experience.

Source Code

 

 

Para el tema de Windows Presentation Foundation, me basé en concepto de:

Pro WPF with VB 2008- Windows Presentation Foundation with .NET 3.5

Find out how WPF really works with .NET expert and author Matthew MacDonald. No–nonsense, practical advice will get you building high–quality WPF applications quickly and easily, while a thorough investigation of the more advanced aspects of WPF, and its relation to other elements of the WinFX stack and the .NET Framework 3.5, will complete your understanding of WPF and VB 2008.

Source Code

 

 

Aunque usé como ejemplos los de C# del mismo autor:

Pro WPF in C# 2008: Windows Presentation Foundation with .NET 3.5, Second Edition

  • WPF basics: XAML, layout, control essentials, and data flow
  • WPF applications: Navigation, commands, localization, and deployment
  • Advanced controls: Custom controls, menus, toolbars, and trees
  • WPF documents: Text layout, printing, and document packaging
  • Graphics and multimedia: Drawing shapes, sound and video, animation, geometric transformations, and imaging.

Source Code

 

 

No llegué a usarlo, pero me pareció interesante:

Pro ASP.NET 3.5 Server Controls and AJAX Components

  • Covers the new features in ASP.NET 3.5 and ASP.NET AJAX technology
  • Describes the ASP.NET server control architecture in Visual Studio 2008/ASP.NET 3.5 covering state management, events, rendering, cross-platform support, control life cycle, localization, and deployment.
  • Demonstrates how to integrate client–side development technologies such as DHTML and JavaScript with server control technology to create powerful interactive controls

 

Table of Contents
Source Code

 

Sobre el tema de Linq, utilicé el libro de Scott Klein

Professional Linq
Download Code

 

Professional LINQ introduces experienced programmers and database developers to LINQ database queries in their native VB and C# languages. Some of the topics covered include:

  • LINQ Queries
  • LINQ and the Standard Query Operators
  • Programming with XLinq
  • Querying XML with XLinq
  • Mixing XML and other data models
  • DLinq and Queries
  • LINQ over datasets
  • Interoperating with ADO.NET
  • LINQ and ASP.NET

Hacia el final de la charla, presenté algún ejemplo que usa Linq/VS 2008, generado desde dos modelos de proyectos (AjFirstExample y AjTest) con AjGenesis. Tengo que pulir los templates y publicarlos en breve.

Enlaces sobre estos temas, los mantengo en:

http://del.icio.us/ajlopez/vs2008
http://del.icio.us/ajlopez/linq
http://del.icio.us/ajlopez/wpf
http://del.icio.us/ajlopez/wwf
http://del.icio.us/ajlopez/wcf

Agradezco desde acá a la gente del MUG, a Oscar Turquets en especial, por haberme facilitado todo para que pudiera participar del evento, y la gente de Rosario, que me trató muy bien, terminando en una cena en el mítico El Cairo.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com/

Generando código para NHibernate (Parte 3)

Monday, October 29th, 2007

Siguiendo con la serie


Generando código para NHibernate (Parte 1)
Generando código para NHibernate (Parte 2)


del ejemplo de Omar del valle Rodriguez, tengo una nueva versión del ejemplo, que genera aplicaciones con AjGenesis. Gracias desde acá, a las sugerencias de Omar, y de Fabio Maulo. He incorporado algunas características, como:


– Uso de NHibernate 1.2


– Manejo de mapeo de subclases en .hbm por separado


– Propiedades virtuales en las entidades


– Dos nuevas aplicaciones generadas


Pueden bajar el ejemplo AjOmar Versión 1.1 (es el archivo AjOmar-v1.1.zip) desde la página de ejemplos de AjGenesis.


El modelo


Como siempre, la idea de AjGenesis es basarse en un modelo libre, donde uno especifica lo que le interesa modelar. En el caso de este ejemplo, se modelan entidades, y a partir de esa información se generan aplicaciones completas. El modelo prácticamente no cambió desde la anterior versión (ver Parte 2), en el archivo Projects/AjOmar/Project.xml:


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

Como había pedido Omar, Company y User heredan de Client. En la base de datos se usan tres tablas, y el NHibernate hace la magia del mapeo en este dominio con entidades relacionadas por herencia.


Como antes, también se especifican los elementos de tecnología, como la base de datos a usar, el usuario y contraseña a usar en los strings de conección, y otros detalles. Esto permite cambiar la tecnología, sin cambiar el modelo de arriba. Un ejemplo en el archivo Projects/AjOmar/Technologies/VbNet2Nh.xml:


<Technology>
<Programming>
<Dialect>VbNet2Nh</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>

Deberá adaptar este archivo si necesita ajustar esos datos.


Siguiendo algunas recomendaciones de Fabio Maulo, ahora hay un .hbm por entidad. Ejemplo generado en Build/AjOmar/VbNet2Nh/Src/AjOmar.Data/Company.hbm.xml:


<?xml version=”1.0″ encoding=”utf-8″ ?>
<hibernate-mapping xmlns=”urn:nhibernate-mapping-2.2″
assembly
=”AjOmar.Entities”
namespace
=”AjOmar.Entities”
>
<joined-subclass name=”Company” table=”ajom_companies” extends=”Client”>
<key column=”Id” />
<property name=”CompanyName” type=”String”/>
<property name=”ContactName” type=”String”/>
</joined-subclass>
</hibernate-mapping>

Las aplicaciones


Se pueden generar aplicaciones completas, con proyectos y solución web. La generación se invoca con comando de línea, como se explica en la Parte 2. Hay que agregar el directorio bin del AjGenesis en el path de ejecución para que funcionen.


Ahora están habilitados cuatro generaciones de soluciones:


GenerateProject AjOmar VbNet2Nh
GenerateProject AjOmar CSharp2Nh
GenerateProject AjOmar VbNet2DDDNh
GenerateProject AjOmar CSharp2DDDNh


Los dos primeros generan aplicaciones VB.NET y C Sharp, con ASP.NET 2.x, y acceso a datos usando DAOs que usan NHibernate.


Los dos nuevos comandos generan aplicaciones con VB.NET y C Sharp, que utilizan algunas ideas de Domain-Driven Design.


Generando DDD


Las nuevas soluciones generadas, tienen 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.Domain: contiene las Entities, Services, y Repositories, a la Evans. No hay conceptos de Value Objects, o Aggregates. Los servicios se llaman Manager, para distinguirlos de la fachada de servicio que uso en Application.
  • AjOmar.Application: la capa que coordina las llamadas al Dominio, desde la presentación.


Y como antes, hay una aplicación web AjOmar.WebClient.



Próximos pasos


Tengo que generar aplicaciones similares para Hibernate, Java, y MySql. La idea es que sirva como prueba de concepto: desde un mismo modelo, se pueden generar aplicaciones implementadas con distintas tecnologías.


Habrá que estudiar e implementar el manejo de nulos, restricciones por tamaño de campo, y mejorar la apariencia de las aplicaciones generadas.


Hay que mejorar (y probar) el manejo de relaciones uno a varios, o varios a uno. Lo tengo implementado en los ejemplos AjGenesisExamples3, pero debería pasar ese código de plantillas y adaptarlo para este ejemplo.


Nos leemos!


Angel “Java” Lopez
http://www.ajlopez.com/

Lo nuevo en Visual Basic.NET (Parte 2)

Saturday, September 29th, 2007

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/

Lo nuevo en Visual Basic .NET (Parte 1)

Thursday, September 27th, 2007

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/