Manifiesto del desarrollador

Un excelente amigo me paso este manifiesto que comparto con ustedes. Es un documento extraído de la página de bussines objects que me di a la tarea de traducir.

Espero les guste. Abajo dejo la liga original para darle honor a quien honor merece.

Nosotros hacemos lo difícil, fácil.

Nosotros hacemos que lo imposible, sea posible.

Miramos cosas diferentes.

Y miramos de manera diferente las mismas cosas.

Nosotros hablamos al menos tres lenguajes.

Código, negocio y nuestra lengua nativa.

Conocemos todo sobre algunas cosas.

Conocemos algo sobre otras muchas.

Y siempre queremos saber más.

Le damos valor a la lógica.

Apreciamos las abstracciones.

Y disfrutamos la lógica dentro de la abstracción.

Nos preocupamos sobre lo que construimos.

Y valoramos nuestro impacto en el éxito de nuestros clientes.

Nosotros impulsamos la innovación y aprendemos de nuestros errores.

Cambiamos la forma de pensar de las personas.

Cambiamos la forma en la que los negocios trabajan.

Y en algunas ocasiones, nosotros cambiamos el mundo.

http://www.businessobjects.com/jump/xi/manifesto.asp

Como hacer funcionar el AJAX AutoCompleteExtender

Muchos amigos me han preguntado cual es la razón por la cual dejo de funcionar en su código el AutoCompleteExtender al utilizar la ultima versión que salio de AJAX .NET y despues de investigar he aqui la respuesta.

Esta funcionalidad consume la información de un servicio web que exponemos para tal efecto el cual tiene un metodo que devuelve un arreglo de strings y recibe dos parametros. El primero es el string a buscar y el segundo es un entro que representa el numero de respuestas a emitir.

Pues bueno para que funcione deberas agregar a tu web service un atributo llamado [ScriptService] el cual permitira que pueda ser accedido desde el AutoCompleteExtender. Y con esto seguramente sera suficiente para que tu control vuelva a la vida.

Saludos

Yo quiero este ratón

Y no me refiero a los ratones que surgen de las coladeras de esta gran Ciudad de México, tampoco a las ratas de 2 patas a las que se refiere en sus canciones Paquita la del Barrio. Si no al Wireless Notebook Presenter Mouse 8000 de Microsoft.

Entre otras chuladas lo que hace este ratón es lo siguiente:

1.- Tiene un Control de presentaciones que te permitirá domar a tu Power Point.

2.- Tiene un control remoto de multimedios que te permite navegar tus presentaciones multimedia o tus reproductores musicales.

3.- Indicador de tiempo de vida de la batería.

4.- Se comunica por medio de Bluetooth a tu maquina por lo cual ya no tendrás que batallar con otros ratones inalámbricos que estén cerca del tuyo.

5.- Tiene un láser mas potente de alta definición para que no batalles con las superficies en la que usas el ratón.

6.- Y si te faltaba algo, tiene un maravilloso apuntador láser para indicarle a los presentes algún punto.

Digamos que es justo lo que yo necesito. Así que si en estas fiestas navideñas no encuentras que regalarme ya sabes por donde empezar.

Si, si, ya se que es mucho pedir, pero al menos déjenme soñar.

Saludos

Desarrollando un Windows Service

Durante muchos proyectos en mi vida me encontrado con la necesidad de desarrollar un programa que funcione al arrancar Windows sin la necesidad de iniciar sesión y eso es presisamente lo que es un Windows Service.

Y también en el pasado trate de lidiar con el desarrollo de este tipo de aplicaciones en el FrameWork 1.1, y si bien era mucho mas sencillo de hacer de lo que fue por mucho tiempo ahora es mucho mas que eso con el FrameWork 2.0. Lo primero que tendrias que hacer es abrir el Visual Studio 2005 y crear un nuevo proyecto utilizando el template llamado Windows Service que esta entre los proyectos de Tipo Windows.

Esto creara todo el código que necesitas para empezar a desarrollar un servicio windows.

Como podras darte cuenta te creo una clase llamada Service1 por default. Aqui lo importante es darse cuenta que la misma hereda de la clase ServiceBase, la cual provee las caracteristicas de una aplicación de este tipo.
Ahora lo que tendrias que hacer es agregar el codigo qe deseas se este ejecutando en el metodo OnStart.

Lo siguiente que deberas hacer es sobre el dessigner de Service1.cs (si estas viendo el codigo presiona boton derecho sobre el mismo y selecciona la opción de ver dessigner) deberas presionar boton derecho y seleccionar la opción de Add Installer lo cual agrega dos clases sobre un archivo que se llama ProjectInstaller.cs aqui deberas configurar las propiedades de dichos objetos para indicar el como funcionara tu servicio.

El primero el serviceInstaller tiene 2 propiedades en las que deberas prestar inicialmente atención en una que se llama ServiceName y la otra que se llama StartType. ServiceName indicara como sera nombrado tu servicio para que pueda ser identificado en el administrador de servicios. Y el segundo indica como iniciara su ejecución. Si esta debera ser arrancada manualmente o arrancara de manera automativa e inclusive la podras marcar como deshabilitada.

En el serviceProccessInstaler deberas fijarte en la propiedad Account que indica que usuario utilizara para ejecutarse.

Lo siguiente que deberias hacer es agregar un proyecto de instalacion el cual agregara desde el menu File->Add->New Project y sobre el Tipo de Proyectollamado Otros Tipos de Proyectos se encuentra una opción llamada Setup and Deployment ahi deberas escojer el Template de Setup Wizard(Asistente de Configuración).

En la segunda ventana deberas escojer la primera opcion qie dice Crear una aplicacion de setup para una aplicación de windows.

Y en la tercera deberas marcar la opción de Primary output form WindowsService2.

Deberas darle siguiente, siguiente y finalizar.

Por ultimo deberas seleccionar el Proyecto de Setup que te creo el Instalador y sobre el solution explorer (Explorador de Soluciones) deberas encontrar un icono que se llama Custom Actions (Acciones personalizadas) y presionarlo.

Posteriormente deberas presionar boton derecho sobre la raiz que te mostrara y seleccionaras la opción de add custom action (agregar acción presonalizada) despues presionaras sobre Application Folder (Folder de la Aplicación) y por ultimo seleccionaras la opción Primary Output from NombreDelProyectoDelServicio (Active) (Salida primaria de NombreDelProyectoDelServicio(Activo), no estoy tan seguro de esta traducción pero es algo por el estilo) y presionas Ok.

Para finalizar ejecutas el Build (Compilar) sobre la solución y apartir de ese momento puedes instalar y probar el servicio.

Debes recordar que una vez instalado tu servicio no se ejecutara automaticamente así que deberas de ir al Panel de Control y despues a las herramientas administrativas y por ultimo a servicios. Buscar el nuevo servicio y darle iniciar.

En el caso que en la clase serviceInstaler le indicaste la propiedad StartType con el valor de Automatico tu servicio se arrancara automaticamente al iniciar Windows.

Espero este articulo les sea de utilidad.

Saludos. P.D. Una disculpa por estar traduciendo las opciones pero actualmente utilizo el Visual Studio en Ingles.

Conectandonos a nuestras Maquinas Virtuales utilizando el LoopBack Adapter

En cuantas ocasiones se han encontrado en la necesidad de poder compartir archivos y recursos con sus maquinas virtuales y por una razón u otra no tienen la posibilidad de conectarse a la red. Yo al menos por mis actividades es cosa de todos los días y por esa razón me di a la tarea de encontrar las solución a este problema. Mismo que resolví hace tiempo pero en este momento he encontrado suficiente información para compartirlo con ustedes de manera suficiente.

Lo primero que necesitamos es crear un adaptador de red que pueda ver la maquina virtual. Y muchos pensaran que actualmente ya ven sus adaptadores de red. Pero estos necesitas de la conexión para funcionar.

Entonces lo que vamos a hacer es agregar el Adaptador que Microsoft nos provee para realizar esta tarea y es llamado Microsoft Loop Back Adapter.

PASO 1 – AGREGAR EL MICROSOFT LOOP BACK ADAPTER

1. Haga clic en Inicio y, a continuación, haga clic en Panel de control.

2. Si está en la vista Clásica, haga clic en Cambiar a Vista por categorías bajo Panel de control en el panel izquierdo.

3. Haga doble clic en Impresoras y otro hardware y, después, haga clic en Siguiente.

4. En el panel izquierdo, en Vea también, haga clic en Agregar hardware y, después, haga clic en Siguiente.

5. Haga clic en Sí, ya he conectado el hardware y, después, haga clic en Siguiente.

6. En la parte inferior de la lista, haga clic en Agregar un nuevo dispositivo de hardware y, después, haga clic en Siguiente.

7. Haga clic en Instalar el hardware seleccionándolo manualmente de una lista (avanzado) y, a continuación, haga clic en Siguiente.

8. Haga clic en Adaptadores de red y, después, haga clic en Siguiente.

9. En el cuadro Fabricante, haga clic en Microsoft.

10. En el cuadro Adaptador de red, haga clic en Microsoft LoopBack Adapter y, a continuación, haga clic en Siguiente.

11. Haga clic en Finalizar.

[Cómo instalar el adaptador de bucle invertido de Microsoft en Windows XP — Extraído de la página de soporte de Microsoft]

PASO 2 – CONFIGURAR UNA RED VIRTUAL.

1. Dentro de las configuraciones de nuestra maquina virtual (en este caso estoy utilizando Microsoft Virtual Server) en el administrador se encuentra una sección llamada Virtual Network y ahí vamos a presionar para crear una nueva red.

2. Deberás ponerle un nombre a la nueva red virtual que acabas de crear.

3. En el adaptador de red seleccionaras el Microsoft LoopBack Adapter que acabas de crear.

4. Una vez creada la red virtual deberás configurar tu Maquina Virtual para que use esta nueva red virtual que acabas de crear como Adaptador de Red.
[To create a virtual network — Extraído de Microsoft TechNet]

PASO 3 – CONFIGURA LAS DIRECCIONES IP PARA EL HOST Y PARA LA MAQUINA VIRTUAL

Si bien puedes aprovechar la configuración que un DHCP como el que te brinda la maquina vitual te ofrece en algunas ocasiones se batalla con este tema si no definimos nuestras propias direcciones.

Como tal puedes utilizar cualquier dirección de TCP/IP pero la mejor opción sería que selecciones un rango no ruteable de TCP/IP como los es el caso de 192.168.x.z donde x es un valor entre 0 y 255, y z es un valor entre 1 y 254. El valor que escojas para x deberá ser el mismo en ambos sistemas operativos mientras que z deberá ser diferente entre uno y otro.

[Using Microsoft Loopback Adapter]
Creo que con este material y las ligas es mas que suficiente.

Así que tengan un excelente día.

Saludos

C# menos código mayor productividad

Hace no mucho que en el podcast de superneurona he estado hablando de mi experiencia al migrar de Visual Basic .Net a C# y al inicio solo fue un reto para conocer las diferencias entre un lenguaje y otro pero mi intención no era en lo absoluto cambiarme de lenguaje. Es más aquellos que me conocen saben perfectamente el cariño que le profeso a este lenguaje.

Pero ha llegado el momento de decir a los cuatro vientos que me encanta C#. Y esto no significa que quiera obligar a todo aquel que me rodea a migrarse.

Es mas sigo con mi idea de que a la hora de desarrollar debemos hacerlo en el lenguaje que nos haga más productivos.

Pero les voy a dar 3 razones que me hacen actualmente trabajar casi el 100% del día en ese lenguaje.

1.- C# es menos rollero. Por lo cual escribes menos para hacer prácticamente lo mismo en Visual Basic. Si no me creen un pequeño ejemplo.

Para declarar una variable privada a nivel de clase en VB tendrias que hacer lo siguiente:

Private xVariable As Integer
1234567890123456789012345678

28 Caracteres

Para hacer lo mismo en C# escribirías lo siguiente:

private int xVariable;
1234567890123456789012

22 Caracteres

21% menos caracteres.

Que podrías hacer en tu vida con ese 21 por ciento más de tiempo.

Se que muchos me dirán que no es así en todos los casos y mi respuesta es que tienen la razón pero en la mayoría se repite este patrón.

Y a menos que adores escribir mas C# se vuelve una buena opción.

2.- Mayor cantidad de herramientas integradas. Principalmente relacionadas con refactorización y snippets (recortes de código). Que aunque también existen para VB, no vienen instalados en Visual Studio por default. O en el caso de los snippets no son tan fáciles de aprovechar.

Si no me crees crea dos clases una en VB y otra en C# y en el lugar donde pondrías las propiedades escribe prop y presiona en dos ocasiones el tabulador. Veras que en VB no sucede nada mientras que en C# te crea la estructura de la propiedad.

3.- Mayor cantidad de ejemplos complejos. La mayoría de los sitios diferentes a MSDN que hablan sobre desarrollo con .NET cuentan con más ejemplos en C# que en Visual Basic .NET. Se que no es en todos los casos. Pero si en la mayoría.

Pero aun así insisto. No te migres de un lenguaje a otro porque lo leíste en SuperNeurona. Prueba estos ejercicios que te comento. Y simplemente quédate con el que te sientas más cómodo. Y en el camino dame tus maravillosos comentarios.

Saludos.

Reunión de la Comunidad .NET del mes de diciembre

Fecha: Martes 19 de Diciembre

Horario: 7:00 a 9:50 p.m.
Lugar: Intersoftware Training
World Trade Center – Piso 35
Mexico D.F.
Agenda:
Por Confirmar Tema – Héctor Obregón
Utilizando Delegados – Octavio Telis
Por Confirmar Tema – Misael Monterroca
Serialización de Objetos – Raúl Guerrero

Y se aprovechara esta Reunión para darnos el abrazo de fin de navidad y fin de año.

*Esta por confirmarse la disponibilidad de la Sala pero al parecer ya es un hecho, saludos.

Probando Windows Live Writer

Ultimamente me he dado a la tarea de buscar herramientas que me parmitan descargar los blogs de mis amigos.

Pero en todo este tiempo no habia buscado una herramienta que me facilitara la vida a la hora de postear.

Hasta que mi buen amigo Gerson me recomendo que utilizara Windows Live Writer. La verdad es que haste este momento la herramienta ha resultado ser mas interesante de lo que esperaba. Inicialmente reconocio perfectamente mi configuración de blogger y lo que es mejor. A la hora de escribir puedo ver perfectamente como quedaran mis mensajes en el blog.

Suena cool no. Pero solo falta que lo intentes.

Bueno te envio muchos saludos. Y que tengas felices trazos.

Manteniendo el estado de nuestros objetos en un archivo en Disco Duro

En cuantas ocasiones nos hemos encontrado con la necesidad de guardar la información presente en la interface de usuario de nuestras aplicaciones para que el usuario pueda continuar sus actividades el día siguiente.

Cuando esto nos sucede nos vemos batallando con la idea de generar archivos de texto separado por comas y otras ideas que creemos geniales, pero que en muchas ocasiones nos llevarían varios días enteros en crearlos. Y por lo tanto una idea que sonaba genial termina en la lista de nice to have que tu aplicación nunca tendrá.

Pues a esto en .NET se le llama serialización y dentro del framework existen 2 espacios de nombres que te permitirán aprovechar esta característica sin necesidad de pasar varias horas para guardar la información al disco.

Lo primero que tendrías que hacer es crear una clase que represente la información en la pantalla. Posteriormente a dicha clase le deberás agregar el atributo [Serializable]. Algo que deberás tener en cuenta es que a partir de ese momento tu podrás serializar dicho objeto. Lo cual significa que se generara una representación binaria o en Xml de los campos contenidos dentro de tu objeto. Entiéndase por campos las variables públicas y privadas contenidas dentro de tu clase.

Por lo tanto deberás tener cuidado que cada una de esas propiedades, públicas o privadas sean serializables a su vez ya que en caso contrario podría arrojarte la aplicación una excepción en tiempo de ejecución.

Pero bueno esto solo debería preocuparte si tus campos son en realidad de un tipo por referencia y no en los casos en el que el tipo de tus campos sea por valor. Como es el caso de (int, bool, etc…)

Una vez que has marcado tu clase como serializable puedes elegir ciertos campos que no desees que puedan ser serializados. Como puede ser el campo sueldo o algún campo que contenga una definición a una clase no serializable. Una vez que encuentres este tipo de campos deberás marcarlos con el atributo [NonSerialized].

Así se vería una clase llamada Persona en código.



[Serializable]
class Persona
{
private int idPersona;

public int IdPersona
{get { return idPersona; }
set { idPersona = value; }}

private string apellidoPaterno;
public string ApellidoPaterno
{get { return apellidoPaterno; }
set { apellidoPaterno = value; }}

private string apellidoMaterno;
public string ApellidoMaterno
{get { return apellidoMaterno; }
set { apellidoMaterno = value; }}

private string nombres;
public string Nombres
{get { return nombres; }
set { nombres = value; }}

[NonSerialized]
private float sueldo;
public float Sueldo
{get { return sueldo; }
set { sueldo = value; }}
}

Una vez que has realizado lo anterior deberías poder serializar
la información para poder guardarla en el disco duro y luego
deserializarla para cargar la clase en memoria.

Lo primero que deberías hacer es agregar los siguientes using



using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

Y posteriormente dos botones que realizen la serializacion
y la deserialización



private void cmdBinarySerialization_Click(
object sender, EventArgs e)
{
Persona xPersona = new Persona();
xPersona.IdPersona = 5;
xPersona.ApellidoPaterno="Lopez";
xPersona.ApellidoMaterno="Perez";
xPersona.Nombres ="Ivan";
xPersona.Sueldo =float.Parse("20.00");

BinaryFormatter sf = new BinaryFormatter();
FileStream stream =
new FileStream(
@"c:\xPersona.dat",FileMode.OpenOrCreate);
sf.Serialize (stream,xPersona);
stream.Close();
}

private void cmdBinaryDeserialization_Click(
object sender, EventArgs e)
{
BinaryFormatter sf = new BinaryFormatter();
FileStream stream = new FileStream(
@"c:\xPersona.dat", FileMode.Open);
Persona xPersona =(Persona) sf.Deserialize(stream);
stream.Close();
MessageBox.Show(
string.Format ("{0} {1} {2}",
xPersona.ApellidoPaterno,
xPersona.ApellidoMaterno,
xPersona.Nombres));
}

Si posteriormente en lugar de utilizar una serialización binaria quisieras
utilizar una serialización XML basada utilizando SOAP deberías agregar el
siguiente using:



using System.Runtime.Serialization.Formatters.Soap;

y posteriormente deberías cambiar en el código de los botones de
BinaryFormatter a SoapFormatter. Y eso sería todo.

Espero este ejemplo les resulte tan fascinante como a mí me pareció.

Saludos