Regreso a las bases: Memoria (Parte 2)
Tue, Dec 15 2009 21:00

Lo que sigue es una traducción de una sección del ebook gratuito Foundations of Programming de Karl Seguin.

Apuntadores

Para muchos desarrolladores, aprender sobre apuntadores en la escuela fue una experiencia dolorosa. Representan la verdaderamente real indirección que existe entre código y hardware. Muchos más desarrolladores nunca tuvieron la experiencia de aprender sobre ellos  - saltaron directamente a programar en un lenguaje que no los expone directamente. La verdad sin embargo es que cualquiera que diga que C# o Java son lenguajes sin apuntadores es simplemente un error. Como los apuntadores son el mecanismo con el cual todos los lenguajes almacenan valores en el heap, es más bien tonto no entender como son usados.

Los apuntadores representan el nexus del modelo de memoria de un sistema – esto es, los apuntadores son el mecanismo donde el stack y el heap trabajan juntos para proveer el subsistema de memoria requerido por su programa. Como discutimos anteriormente, cuando instancia un objeto new, .NET asigna un bloque de memoria al heap y regresa un apuntador al inicio de este bloque de memoria. Esto es todo lo que un apuntador es: la dirección de inicio para el bloque de memoria que contiene un objeto. La dirección no es nada más que un número único, generalmente representado en formato hexadecimal. Por lo tanto, un apuntador no es nada más que un número único que le dice a .NET donde está el objeto mismo en memoria. Esta indirección es transparente en Java o .NET, pero no en C o C++ donde se puede manipular la dirección de memoria directamente con un apuntador aritmético. En C o C++ se puede tomar un apuntador y agregar 1 a él, y así arbitrariamente cambiar a donde está apuntando (y seguramente hacer tronar el programa debido a esto).

Donde se pone interesante es donde el apuntador está realmente almacenado. Ellos en realidad siguen las mismas reglas descritas arriba: como enteros son almacenados en el stack – al menos, claro, que ellos formen parte de una referencia a un objeto y entonces estarán en el heap con el resto del objeto. Puede no ser claro aún, pero esto significa que ultimadamente, todos los objetos heap están enraizados al stack (posiblemente a través de numerosos niveles de referencias). Veamos primero este ejemplo simple:

static void Main(string[] args)

{

  int x = 5;

  string y = "codebetter.com";

}

Del código de arriba, terminaremos con 2 valores en el stack, el entero 5 y el apuntador a nuestra cadena, así como también precisamente el valor en el heap. Aquí una representación gráfica:

Cuando salimos de nuestra function main (olvidémonos del hecho de que el programa se parará), nuestro stack liberará todos los valores locales, lo que significa que tanto el valor de x como de y se perderán. Esto es significativo porque la memoria asignada en el heap todavía contiene nuestra cadena, pero hemos perdido toda referencia a ella (no hay algún apuntador apuntándola). En C o C++ esto resulta en una fuga de memoria – sin una referencia a nuestra dirección en el heap no podemos liberarla de la memoria). En C# o Java, nuestro confiable recolector de basura detectará el objeto sin referencia y lo liberará.

Veremos ejemplos más complejos, que aparte de tener más flechas apuntando, es básicamente el mismo.

public class Empleado

{

  private int _empleadoId;

  private Empleado _gerente;

  public int EmpleadoId

  {

    get { return _empleadoId; }

    set { _empleadoId = value; }

  }

  public Empleado Gerente

  {

    get { return _gerente; }

    set { _gerente = value; }

  } 

  public Empleado(int empleadoId)

  {

    _empleadoId = empleadoId;

  }

}

public class Prueba

{

  private Empleado _subordinado;

  void HacerAlgo()

  {

    Empleado jefe = new Empleado(1);
    _subordinado = new Empleado(2);

    _subordinado.Gerente = _jefe;

  }

}

Interesantemente, cuando salimos de nuestro método, la variable jefe se liberará del stack, pero el subordinado, que está definido por el alcance padre, no. Esto significa que el recolector de basura no tendrá nada que limpiar porque los dos valores del heap seguirán siendo referenciados (uno directamente del stack, y el otro indirectamente del stack a través del objeto referenciado.

Como puede ver, los apuntadores definitivamente juegan una parte importante tanto en C# como en VB.NET. Como el apuntador aritmético no está disponible en ninguno de estos lenguajes, los apuntadores son grandemente simplificados y con suerte fácilmente entendidos.

 

by Gabriel Flores | with no comments
Filed under: , ,
Regreso a las bases: Memoria
Mon, Dec 14 2009 9:08

Lo que sigue es una traducción de una sección del ebook gratuito Foundations of Programming de Karl Seguin.

Regreso a las bases: Memoria

Por más que se intente, los lenguajes modernos de programación no pueden abstraer completamente los aspectos fundamentales de los sistemas computacionales. Por ejemplo, podemos asumir que usted se ha encontrado con las siguientes excepciones .NET: NullReferneceException, OutOfMemoryException, StackOverflowException y ThreadAbortException. Tan importante como es para desarrolladores adopter varios patrones y técnicas de alto nivel, es igualmente importante comprender el ecosistema en el cual su programa se ejecuta. Mirando por encima de las capas proveídas por el compilar de C# (o VB.NET), el CLR y el sistema operativo, nos encontramos con la memoria. Todos los programas hacen uso extensivo de la memoria del sistema e interaccionan con ella en maravillas maneras, es difícil ser un buen programador sin comprender esta interacción fundamental.
Mucha de la confusión sobre la memoria nace del hecho de que tanto C# y VB.NET son lenguajes administrados y que el CLR provee la recolección automática de basura. Esto ha causado que muchos desarrolladores asuman erróneamente que no necesitan preocuparse por la memoria.

Asignación de Memoria

En .NET, como en muchos otros lenguajes, cada variable que se defina está almacenada en el stack  o en el heap . Estos son dos espacios separados asignados en la memoria de sistema que sirven un propósito distinto, aunque complementario. Lo que va donde está predeterminado: valores de tipos van en el stack, mientras que la referencia a tipos va en el heap. En otras palabras, todos los tipos de sistema, como char, int, long, byte, enum y cualquier estructura (ya sean definidas por.NET o por usted) van en el stack. La única excepción a esta regla son los valores de tipos que pertenecen a referencias de tipos – por ejemplo la propiedad Id de una clase User va en el heap junto con la instancia de la clase User misma.

El Stack

Aunque estamos acostumbrados al mágico colector de basura, los valores en el stack son automáticamente administrados aún en un mundo sin colector de basura (como en C). Esto es porque cuando sea que entramos a un nuevo alcance (como un método o una sentencia If) los valores son empujados al stack y cuando salen del stack los valores son liberados. Esta es la razón por la que un stack es sinónimo a LIFO - last-in first-out (último en entrar primero en salir). Puede pensarlo en este modo: cuando se crea un nuevo alcance, por ejemplo un método, un marcador es puesto en el stack y los valores son añadidos como se necesiten. Cuando se deja ese alcance, todos los valores son liberados incluyendo el marcador del método. Esto funciona en cualquier nivel de anidado.
Hasta que veamos la interacción entre el heap y el stack, la única manera real de meterse en problemas con el stack es con StackOverflowException. Esto significa que ha usado todo el espacio disponible del stack. 99.9% del tiempo, esto indica una llamada recursiva interminable (una función que se llama a sí misma ad infinitum). En teoría esto puede ser causado por un muy muy mal diseño de sistema, aunque nunca he visto una llamada  no recursiva usando todo el espacio del stack.

El Heap

La asignación de memoria en el heap no es tan simple como el stack. La mayoría de la asignación de memoria basada en el heap ocurre cuando creamos un objeto new. El compilador averigua cuanta memoria necesitaremos (lo cual no es tan difícil, aún con objetos con referencias anidadas), toma un apropiado montón de memoria y regresa el apuntador a la memoria asignada (más acerca de esto en un momento). El ejemplo más sencillo es una cadena, si cada carácter en una cadena toma 2 bytes, y creamos una nueva cadena con el valor de “Hola Mundo”, entonces el CLR necesitará asignar 22 bytes (11x2) más cualquier adicional necesitado.
Hablando de cadenas, seguramente ha oído que las cadenas son inmutables – esto es, una vez que ha sido declarada una cadena y asignado un valor, si se modifica esa cadena (cambiando el valor o concatenando otra cadena a ella), entonces una nueva cadena se crea. Esto realmente puede tener implicaciones de rendimiento negativas, y por ello la recomendación general es usar un StringBuilder para cualquier manipulación de cadenas significativa. La verdad es que cualquier objeto almacenado en el heap es inmutable con respecto a la asignación de tamaño, y cualquier cambio en el tamaño subyacente requerirá una nueva asignación. El StringBuilder, junto con algunas colecciones, parcialmente pueden sacar la vuelta a esto usando buffers internos. Una vez que el buffer se llena, la misma reasignación ocurre y algún tipo de algoritmo de crecimiento es usado para determinar el nuevo tamaño (el más simple siendo antiguoTamaño * 2). Siempre que sea posible es buena idea especificar la capacidad inicial de dichos objetos para evitar este tipo de reasignación (el constructor para tanto el StringBuilder y el  ArrayList (entre muchas otras colecciones) le permiten especificar capacidad inicial).
Recolectar basura del heap es una tarea no trivial. A diferencia del stack donde el último alcance puede simplemente liberarlo, los objetos del heap no son locales a un determinado alcance. En lugar de ello, la mayoría son referencias profundamente anidadas de otros objetos referenciados. En lenguajes como en C, cuando un programador causa que la memoria sea asignada al heap, debe asegurarse también de remover del heap cuando ha terminado con él. En lenguajes administrados, el motor en tiempo de ejecución se encarga de limpiar los recursos (.NET usa un Recolector de Basura Generacional que está brevemente descrito en la Wikipedia).
Hay muchos incidentes horribles que pueden molestar a los desarrolladores mientras trabajan con el heap. Fugas de memoria no solo son posibles sino muy comunes, la fragmentación de memoria puede causar todo tipo de caos, y varios problemas de rendimiento pueden generarse gracias a comportamiento de asignación extraño o interacción con código sin administrar (lo cual .NET hace mucho debajo del agua).

Screencasts sobre ADO.NET Entity Framework con C#
Tue, Sep 15 2009 6:13

En esta serie de screencasts vemos como hacer cosas sencillas con ADO.NET Entity Framework, para un primer contacto con esta tecnología.

Introducción

Northwind y pubs

Northwind y pubs:
Para saber como tener instaladas las bases de datos de prueba Northwind y pubs, proveídas por Microsoft

Usando C# en ASP.NET con ADO.NET Entity Framework

Usando C# en ASP.NET con ADO.NET Entity Framework
Un ejemplo rápido para ver como es el contexto de uso del ADO.NET Entity Framework

 

Tareas específicas

Búsqueda en ADO.NET Entity Framework con C#
Búsqueda en ADO.NET Entity Framework con C#
Paso inicial para el resto de las tareas

Alta de registros con ADO.NET Entity Framework con C#
Alta de registros con ADO.NET Entity Framework con C#
Como agregar registros

Baja de registros con ADO.NET Entity Framework con C#

Baja de registros con ADO.NET Entity Framework con C#

Como eliminar registros

Cambios a registros en ADO.NET Entity Framework con C#
Cambios a registros en ADO.NET Entity Framework con C#
Como hacer modificaciones

No abre http://localhost Visual Studio
Mon, Jun 8 2009 20:57

Hace unos días unos compañeros de la universidad me advirtieron de un problema que les ocurría en común a máquinas donde tuvieran Visual Studio 2008 y particularmente en sistema operativo Windows Vista. Se trata de que al intentar correr alguna aplicación ASP.NET desde el entorno de desarrollo les salía Internet Explorer con la infame “Internet Explorer cannot display the webpage” y pues, estaban sin poder continuar con sus trabajos.

iecannot

Al principio me imaginaba que era algo que tenía que ver con el archivo de hosts y después de investigar un poco más, me dieron la razón.

Lo que debes hacer es usar un editor de texto (como Notepad o Notepad++) y abrir desde el directorio C:\Windows\System32\Drivers\Etc\ un archivo que se llama hosts (sin extensión) y remover la línea que dice algo de localhost. Te puede aparecer así:


::1             localhost

o así

127.0.0.1       www.localhost.com

Ahora nada más graba este archivo otra vez, cuidando que no se anexe la extensión txt (y si se anexa, se la quitas). Parece medio absurdo, pero puede ser que si te ocurre este problema, quizás sea por esto.

Comunidades Virtuales
Thu, May 21 2009 8:19

De la Facultad de Contaduría, Administración e Informática de la UABC, me invitaron a dar una plática acerca de Comunidades Virtuales en la cual les comenté acerca de como los foros, sitios de redes sociales y otros conforman lo que a todas luces es comunidad que aunque virtuales, llevan un gran sentido de pertenencia y participación, además como la Comunidad .NET Tijuana en particular hace uso de estas herramientas para complementar esta comunidad presencial. Aquí algunas fotos y la presentación misma:

 

 

 

Por cierto, un agradecimiento a Sergio Quijada y su equipo por la invitación.

by Gabriel Flores | with no comments
Filed under: ,
ADO.NET Entity Framework y llaves foráneas
Thu, Apr 30 2009 9:37

Es algo muy normal trabajar con tablas que están relacionadas con otras por medio de llaves foráneas. Si has usado ADO.NET Framework para hacer algunas operaciones con la BD y para mostrar datos en una página ASP.NET, quizás te hayas encontrado con el dilema de mostrar los campos relacionados de la tabla externa a la que estás mostrando.

Por ejemplo, tomando como ejemplo la clásica base de datos de Northwind, y teniendo las tablas de Products y Categories, y si definimos nuestro modelo de Entidades de esta forma:

modelo

Podemos mostrar en un GridView el contenido de Products haciendo la referencia correspondiente:

        NorthwindModel.NorthwindEntities ne = 
            new NorthwindModel.NorthwindEntities();

        var products = from p in ne.Products
                       select p;

        grdProductos.DataSource = products;
        grdProductos.DataBind();

 grid

Pero ¿qué tal si quiero mostrar en el mismo GridView la descripción de la categoría? Basta incluir en la declaración del campo la propiedad Include para que se pueda cargar ese dato.

        NorthwindModel.NorthwindEntities ne = 
            new NorthwindModel.NorthwindEntities();

        var products = from p in ne.Products
                       .Include("Categories")
                       select p;

        grdProductos.DataSource = products;
        grdProductos.DataBind();

Y con esto tenemos acceso a los campos de la segunda tabla para de esa manera mostrar como fuente de datos de alguna columna del grid algún campo. En este caso, con un Template Field hacemos un Bind usando simplemente Categories.Description que sería la manera de ligar desde Products a ese campo:

    <asp:TemplateField HeaderText="Category">
        <EditItemTemplate>
            <asp:TextBox ID="TextBox1" runat="server" 
                Text='<%# Bind("Categories.Description") %>'>
                </asp:TextBox>
        </EditItemTemplate>
        <ItemTemplate>
            <asp:Label ID="Label1" runat="server" 
                Text='<%# Bind("Categories.Description") %>'>
            </asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

gridconcategoria

Por supuesto que en lugar de esto pudiéramos usar Vistas desde el servidor SQL Server con todos los campos que ocupemos, pero esta sería una de las formas de resolver como mostrar los campos en tablas mediante llaves foráneas usando código de ADO.NET Entity Framework.

Formato de fecha en Gridview
Fri, Apr 3 2009 15:01

No está de más recordar que cuando tienes un GridView con un campo tipo fecha, puedes definir el formato de la cadena a lo que tú gustes, en lugar de los valores por default de fecha completa:

fechafull

Para definir el formato de salida de la cadena en campos ligados, es sencillo, usando la propiedad DataFormatString:

 

<asp:BoundField DataField="Fecha" DataFormatString="{0:d}" />

 

Pero ¿qué pasa si tenemos TemplateFields, sencillo, usando la misma función Bind donde especificamos en el enlace al campo de datos para agregarle el formato que necesitamos:

 

<asp:TemplateField HeaderText="Fecha">
  <EditItemTemplate>
    <asp:TextBox ID="TextBox1" runat="server" 
             Text='<%# Bind("Fecha","{0:d}") %>'>
    </asp:TextBox>
  </EditItemTemplate>
  <ItemTemplate>
    <asp:Label ID="Label1" runat="server" 
              Text='<%# Bind("Fecha","{0:d}") %>'>
     </asp:Label>
  </ItemTemplate>
</asp:TemplateField>

 

De esta manera podemos mostrar a nuestra conveniencia el formato de los datos que mostramos en un gridview:

fecha

by Gabriel Flores | with no comments
Filed under: ,
Algunas funciones Javascript útiles para ASP.NET (en C#)
Thu, Mar 5 2009 16:28

Nunca está de más conocer algunas funciones útiles para hacer más efectiva la programación web en ASP.NET, entre los que uso bastante son:

Ventana de Confirmación (Messagebox del lado del cliente)

Muy útil para pedirle confirmación al usuario cuando se va a hacer algún proceso del cual se puede arrepentir, por ejemplo, pedirle confirmación para borrar algún registro. En el botón donde se va a agregar la lógica para hacerlo, se le agrega el detalle para abrir una ventana y pedir confirmación. En el evento Load de la página es un buen lugar para hacerlo:

    protected void Page_Load(object sender, EventArgs e)
{
btnEliminar.Attributes.Add("onclick",
"return confirm('¿Eliminar registro?');"
);
}

Si el usuario presiona Ok, se ejecutará el código para borrar el registro, si no, es como si nunca hubiera tocado el botón.

Mostrar una ventana con tamaño determinado

A veces necesitamos mostrar una ventana extra independiente del área de trabajo del usuario para información, algún proceso pequeño o algo que para demostrar atención no puedes abrir en un nuevo tab o en otra ventana del navegador. De esta forma incluso podemos dimensionar la ventana emergente con el tamaño adecuado para nuestros fines.

    protected void Page_Load(object sender, EventArgs e)
{
btnNueva.Attributes.Add("OnClick",
"window.open('Nueva.aspx',null,'height=220,width=480');"
);
}

A tomar en cuenta es que el usuario puede tener bloqueadas las ventanas emergentes, así que una buena idea es mostrar en algún lado de la aplicación que desactive para tu sitio este bloqueo.

Cerrar una ventana

Para casos como el anterior donde después de abrir una ventana donde se espera generar trabajo pero no se puede confiar o resultaría muy engorroso para el usuario cerrar manualmente la ventana, conviene usar este método. En el ejemplo está en el evento Click de un botón pero bien puede figurar después de terminado alguna función.

    protected void btnCerrar_Click(object sender, EventArgs e)
{
Response.Write("<script>window.close();</script>");
}

Estas son algunas funciones donde es necesario hacer trabajo del lado del cliente para determinado comportamiento, por lo mismo no es para todas las situaciones y eventos posibles. Lo único es preguntarse si son cosas que no se pueden hacer del lado del servidor o que serían más rápidas y sencillas que se hicieran del lado del cliente.

El valor de la capacitación en tiempos de crisis
Mon, Feb 9 2009 12:02

En estas fechas donde es común encontrarte o saber de personas que han perdido su empleo es común también encontrar que esa misma situación va para profesionistas del sector TI, desarrolladores de software y directivos que por la razón que sea, no tienen más su empleo.

Un tip que había leido en la extinta Visual Basic Programmers Journal (ahora Visual Studio Magazine) era que uno puede aprovechar este tiempo "entre trabajos" para ayudarte a capacitarte más. Si tienes un buen manejo del presupuesto personal, y tienes apartado un monto para comprar el nuevo XBox o un iPod, creo que es mejor idea invertirlo en tu propia capacitación. Y me refiero a capacitaciones de calidad y que te dejen un real valor a tu desempeño profesional. Hay instituciones donde se ofrecen incluso talleres más personalizados y acorde a tus necesidades, aunque un poco más caros. Lo importante es encontrar un curso con el nivel adecuado a tus conocimientos que ya tienes, pero con la tecnología o áreas que te hace falta especializarte. Me refiero a que si eres un desarrollador web, quizás te convenga ir viendo como sería desarrollo con Silverlight, por ejemplo. Si eres desarrollador Windows, te conviene capacitarte en desarrollo con WPF o para móviles. Si ya dominas Windows Server 2003, ve viendo y aplicando lo nuevo con Windows Server 2008. Y similar para otras tecnologías que tal vez requieras en tu posible nuevo empleo como algo de PHP, Flash, herramientas de diseño y otras que nunca está de más por lo menos conocer para que no te agarren en blanco si te preguntan.

MVAAhora, no todo tienes porque pagarlo. Hay muchas maneras de adquirir estos conocimientos en línea con tutoriales, presentaciones, webcasts y ejemplos prácticos de lo que se te ocurra. Si optas por esta opción, te convendrá seguir un plan estructurado para no perderte en la nube y poder ir viendo como vas desarrollándote y aplicando tus nuevas habilidades. Una de ellas es con Desarrollador Cinco Estrellas que te lleva de la mano desde fundamentos que realmente necesitas como Programación Orientada a Objetos y bases de .NET Framework hasta cosas más especializadas como WCF, WPF y otros. Microsoft Rampup son una serie de cursos autodidácticos en inglés de tecnologías específicas que quizás consideres mejor opción si ya tienes tiempo desarrollando, sobre todo porque tiene una manera de enfocar los tutoriales y presentaciones si ya tienes experiencia en Java o VB6; se trata pues, de nivelarte a las tecnologías actuales. Por último Microsoft Virtual Academy agrupa y presenta sus capacitaciones en un formato que te permite elegir una "carrera" y conforme avances en la misma tienes acceso a derechos como una credencial de membresía, descuentos y más.

Lo interesante de estos cursos es que son una punta de lanza de lo que puedes hacer con los conocimientos adquiridos, lo importante es experimentar, jugar con lo aprendido y ponerlo en práctica. Una vez que ya estés más familiarizado con ellos ya podrás poner con toda seguridad esa nueva habilidad en tu curriculum y no quedar mal para la siguiente entrevista que tengas.

BizSpark
Fri, Nov 7 2008 15:58

Este es un excelente programa de Microsoft para tí que tienes una compañía de software con la siguiente gran idea que cautivará el mercado. Se trata de un ofrecimiento de software, soporte y visibilidad a empresas de reciente nacimiento que ayuda a que desarrollen su potencial.

Entre lo que engloba la oferta encontramos:

  • Visual Studio Team Suite
  • MSDN Premium
  • Expression Studio 2
  • VSTS Team Foundation Server Standard Edition
  • Licencias de:
    • Windows Server
    • SQL Server
    • BizTAlk Server
    • Office Sharepoint Server
    • Systems Center
  • Soporte, guía y recursos por un Network Partner
  • Newsgroups administrados, librería en línea, etc. de MSDN Premium
  • Dos incidentes de soporte técnico
  • Disponibilidad global en el catálogo de Startups de Microsoft
  • Posibilidad de figurar como la Empresa BizSpark de la semana en el Microsoft Startup Zone

La empresa de desarrollo de software sólo debe cumplir las siguientes características:

  • Que desarrolle un producto de software o servicio que forme parte crucial de su plan de negocios
  • Empresa privada
  • Con antigüedad menor a 3 años
  • Ingresos anuales menores a 1 millón de dólares

Para enrolarse en el programa, no se requiere ninguna inversión monetaria. Sin embargo, al salir del programa se debe hacer un pago de 100 dólares. Después de hacer más de un millón, esta cantidad será ridícula ;)

Así que sólo falta ingresar al sitio de BizSpark y aprovechar este nuevo programa para impulsar nacientes empresas de desarrollo.

Windows Azure
Mon, Oct 27 2008 17:41

La espera por fin terminó y Windows Azure vió la luz este lunes 27 de octubre de 2008 en el Professional Developers Conference de Los Angeles. ¿Y porqué es tan importante? Pues son los servicios de internet que proveé Microsoft en sus Datacenters (que por ahí se dice que son visibles desde el espacio exterior por lo enormes que son). Todos ellos basados en un esfuerzo de interoperabilidad y flexibilidad que permitirán a tus aplicaciones coexistir en la red en lo denominado Computación en la Nube (cloud computing) donde se ven más los desarrollos como algo que es aprovechable a través de la red y no importando los dispositivos que uses para accederlos.

 

Hay bastantes cosas interesantes en la Plataforma de Servicios Azure además de aquellas que ya eran aprovechables (como Live Services para consumir y explotar la plataforma Windows Live), me refiero a .NET Services con servicios para manejo de Workflows y Bus de servicios y otros, así como SQL Services que no es más que SQL Data Services para poder tener todos tus datos en tiempo real para terceros y para el resto de tus aplicaciones.

Habrá mucho más que aventurar en aprender sobre Windows Azure, pero una cosa es cierta, los desarrollos de software ya deben considerar el consumo de su funcionalidad en un ámbito global y de uso en cualquier dispositivo.

Más info:

Windows Azure

Opinión de Jaime Sánchez de Microsoft

Haarón González tiene algo que decir también

Preguntas contestadas sobre Azure de Luis Daniel Soto

Descargas:

Windows Azure SDK
Windows Azure Tools for Microsoft Visual Studio
Microsoft .NET Services SDK
Microsoft SQL Data Services SDK

Bonus:

.NET tiene un nuevo logo:

Verifica tus nulos
Wed, Sep 24 2008 7:29

Es muy sencillo verificar si una variable tiene referencia a null:

 

if (dFecha == null) 

 

Pero ¿y si los datos que quieres evaluar vienen de una base de datos? Cuando se trata de un campo de tipo fecha no es suficiente evaluarlo contra null, y asignarlo a una variable DateTime te requiere hacer un cast para que te permita usarla, pero si está en null, no te permite hacer esta asignación:

 

//Si es null el campo, no permite hacer este cast
dFecha = (DateTime)miDataReader["Fecha"];

 

La solución está en evaluarla contra DBNull, que contiene precisamente el valor null a nivel de base de datos:

 

if ( miDataReader["Fecha"] == DBNull.Value )

 

Evaluando de esta forma nuestros campos de la base de datos, podremos tener mejor código y más probado.

Software para la gente
Sat, Sep 13 2008 1:47

Ahora que trabajo en el sector público me toca toparme con muchas situaciones en donde definitivamente hay muchas cosas que mejorar. Esto puede pasar en cualquier lado pero décadas de no poner en su lugar las Tecnologías de Información dan pie a que quienes lo iniciaron, quizás no tuvieron en mente más que poder implementar lo mejor posible una solución a algún problema lo más rápido posible sin importar mucho la usabilidad o calidad.

Y es que tratando de simplemente cumplir con los requerimientos exclusivamente provoca dejar de lado muchos aspectos importantes en el desarrollo de software. A veces uno no se da cuenta que dar un click primero y después tener que capturar un dato para luego con el mouse (¡y sólo con el mouse!) poder seleccionar una opción de un combobox y por fin poder presionar el bendito botón de imprimir se puede mejorar de muchas formas. En este ejemplo por supuesto está el de agregar atajos de teclado (poniendo en los textos de los botones generalmente & antes de la letra que queramos usar en conjunto con ALT para accionarlo), agrupar en funciones comunes tareas repetitivas, no esconder en menúes funciones críticas entre muchas otras.

Lo importante a darse cuenta es que cualquier mejora en los procesos dentro del sistema ayuda a las personas que lo usan a hacer su trabajo mejor. De lo que se trata es de poner en sus manos las herramientas con las que logren cumplir sus labores y atender sus asuntos, y mientras más rápido y eficiente sean, ellos podrán tener la satisfacción de un trabajo bien hecho y ¿porqué no? hasta ser reconocidos como aquellos que tuvieron mejor productividad que nadie. Tiene que ver mucho el nivel de aceptación y familiaridad con la tecnología del usuario, pero vuelvo a lo mismo, para muchos de ellos, el sistema, la computadora, la página web con la que trabaja a diario no es más importante que su engrapadora, teléfono o calculadora de escritorio, son sólo sus herramientas de trabajo.

Algo que ayuda mucho es ver directamente al usuario usar el sistema. En la recopilación de requerimientos, en la planeación e implementación de técnicas y prácticas de usabilidad siempre se tratan de poner lo mejor al alcance del usuario. Pero verlo en persona y notar como está usando el sistema, ver como aprovecha o no los atajos de teclado, o que tal vez esa característica de usabilidad en la que se invirtió mucho tiempo quizás le parece más tedioso que la solución más simple, abre mucho los ojos. Esto va más allá que hacer caso a lo que su gerente ideó pues quien usará el sistema todos los días no será él. Conversar, hacer caso a las observaciones del usuario y que vea el punto de vista del equipo de desarrollo siempre será benéfico para su productividad, tu satisfacción como quien le brindó las mejoras y una relación de provecho a futuro.

Photobucket

En esta imagen se puede ver como unas simples mejoras de usabilidad hacen más efectiva la interacción del usuario y más entendible para él lo que se está haciendo. Caso muy diferente al estado original de la aplicación que se puede ver a la izquierda. Esta imagen se puede ver más a detalle en el Innovation Tour 2008 que ya está por todo México en marcha. Este tipo de mejoras simples aportan un gran valor a las aplicaciones que creamos y tendremos más clientes satisfechos. Si hacemos nuestro trabajo con esta cultura de servicio sin perder de vista que nuestro software lo usarán personas de carne y hueso que sólo quieren hacer bien su trabajo, también nosotros estaremos mejor.

Parámetros en aplicaciones
Thu, Jul 17 2008 13:49

Muchas veces necesitas llamar o recuperar los parámetros en la aplicación en C# que estés desarrollando. Lo más sencillo es usar el Environment.GetCommandLineArgs() que nos regresa un arreglo con los parámetros que están mandándonos.

Lo que es importante tomar en cuenta es que si se está enviando una cadena que contiene espacios, por ello mismo nos coloca cada parámetro en distinta posición del arreglo y sólo es suficiente armando de nuevo ese argumento:

static void Main()
{
   string[] args =  Environment.GetCommandLineArgs();
   if (args.GetUpperBound()  > 1)
   {
      string sArg = args[1] + " " + args[2] + " " + args[3] + " " + args[4];
   }
}

by Gabriel Flores | with no comments
Filed under: , ,
MVP Global Summit 2008
Wed, Apr 23 2008 12:35

Como siempre es un placer compartir experiencias e ideas con compañeros MVPs y que mejor que sean de otras latitudes donde a pesar de la distancia son notorias las similitudes en cuanto a ánimos y deseos de hacer las cosas.

Japan and Mexico MVPsEl primer día estuvo estupendo, el formato de las conversaciones Open Space permitían precisamente eso, aportar e intercambiar ideas con MVPs de todo el mundo en las tecnologías de las que somos apasionados. En este mismo formato tuvimos una reunión donde por fin alguien más hablaba español y pudimos comentar de lo que en Hispanoamérica acontece y como hacemos frente a los retos en nuestras comunidades.

Los siguientes días resultaron muy provechosas en el sentido de poder intercambiar impresiones con los Product Managers de los productos que usamos a diario. Estas sesiones se daban en el Microsoft Corporate Campus y resultaba bastante curioso oir a otros MVPs realmente quejarse de cierta característica o denunciando la falta de respuesta de Microsoft en otras áreas, y es que el espacio daba para ello y más.

El último día fue una conversación donde MVPs formulaban preguntas a Ray Ozzie y a Steve Ballmer, una oportunidad única. En la que por supuesto se habló de Open Source, Yahoo! y la visión de Microsoft. Steve Ballmer es todo un personaje, sin pelos en la lengua mencionaba y reconocía los aciertos y fallos de la compañía y se dejó ver muy comprometido con las demandas y peticiones de los MVPs.

Steve Ballmer

Y eso fue el MVP Global Summit 2008, esperamos vernos el próximo año.

El anuncio sobre interoperabilidad de Microsoft
Fri, Feb 22 2008 18:23

Quería darme el tiempo de digerir la noticia del jueves 21 de febrero de 2008 por la mañana, donde Steve Ballmer, CEO de Microsoft y Ray Ozzie, Chief Software Architect, anunciaron un nuevo enfoque al que Microsoft apuesta a partir de ese día, la interoperabilidad. Esto es dar poder a los usuarios de sus productos de alto volumen (como lo llaman ellos, a Windows Vista, .NET Framework, Windows Server 2008, SQL Server 2008, Office 2007, Exchange 2007 y Sharepoint Server 2007) de poder usar y manipular a su antojo la información contenida en ellos.

Esta iniciativa de interoperabilidad se describe en estos principios:

I: Conexiones abiertas en productos de alto volumen Microsoft se asegurará de mantener protocolos y APIs abiertos de sus productos ¿cómo se asegurarán de ello?
Los protocolos y APIs usados en los productos mencionados serán ofrecidos de manera abierta a la comunidad de desarrolladres publicando su documentación para beneficio de todos.

II: Soporte a Estándares
Microsoft soportará los estándares asegurando así interoperabilidad. Esto se logra participando en los órganos rectores de estándares contribuyendo en el desarrollo de los mismos y mejorando los existentes. Se guiará en su base de usuarios y la comunidad actual para priorizar estándares a soportar en cada liberación. Publicando la manera en como se soportan estos estándares de la industria, es como se pretende tener mayor compatibilidad en sus productos. En los casos donde algún estandar implementado donde se haya requerido hacer algún tipo de extensión, Microsoft publicará las especificaciones de estas extensiones y en su momento las ingresará a las organizaciones de estándares para su consideración.

III: Portabilidad de datos
Los usuarios de los productos de software que almacenan sus datos deben poder acceder a esos datos en la forma que se le permita su uso en otros productos de software. Microsoft diseñará sus productos de alto voluemen para propiciar esta portabilidad de datos y proveerá la documentación necesaria. Se logrará esto usando formatos estandar de acuerdo al principio II, propiciando formatos abiertos (ya sea admitidos por órganos de revisión de estándares o liberados publicamente para su implementación), proveerá la importación y exportación de datos, y permitará a los usuarios la selección de los formatos por defecto a utilizar en sus productos. Esto último no sólo implica poder guardar en Office 2007 en formato 2003 por default, sino también permitir la inclusión de otros formatos a manera de plugins. Para ello se hará valer de la Iniciativa de Interoperabilidad de Documento para informar y entrenar la implementación de estos formatos

IV: Compromiso abierto
Microsoft incrementará sus comunicaciones con las comunidades de clientes, T.I. y de código abierto. Esto se logrará con foros de interoperabilidad donde se fomenten el diálogo y discusión en los temas de importancia para usuarios y compañías de tecnologías de información y con la Iniciativa de Interoperabilidad con Código Abierto donde se busca el acercamiento con la comunidad Open Source para incrementar interoperabilidad y facilitar oportunidades de participación en desarrollo cooperativo.

Cabe destacar que en los casos en los que los protocolos, formatos o especificaciones que sean patentes de Microsoft, se indicará apropiadamente junto con sus términos y tarifas de uso. A notar es que Microsoft se compromete explícitamente a no demandar a desarrolladores de código abierto por desarollos o implementaciones no comerciales de estos protocolos o formatos abiertos y de hecho no implicará un pago de regalías o de algún otro tipo.

No, no es Open Source, es abrir los formatos y protocolos de sus productos para consumo de terceros. A final de cuentas, como alguna vez lo discutió Mario Alberto Chávez, la información que uno alimenta a los sistemas es propiedad de los usuarios, no del creador del sistema. Lo veo más como una oportunidad más de entrar al juego de una creciente demanda por incluir plataformas de trabajo más abiertas. Es una delicia para los desarrolladores poder saber exactamente los protocolos y formatos utilizados en los llamados productos de alto volumen y poder consumir sus datos y explotarlos. Esto a final de cuentas es un beneficio para todos, para tí como desarrollador de soluciones, para tus clientes que buscan mayor integración en sus aplicaciones y para sus otros desarrolladores que quieren aprovechar esta interoperabilidad con sus datos.

Mario Alberto Chávez adivina que podría pasar en la comunidad Open Source

Antonio Ortiz tiene un punto de vista interesante sobre las razones

Mariano Amartino cree que la culpa la tiene Ray Ozzie

Enrique Dans piensa que el infierno se ha congelado

El anuncio de prensa con el anuncio (en inglés)

El sitio oficial de interoperabilidad de Microsoft

Visual Studio Express 2008 liberado
Mon, Nov 19 2007 12:39

Ya están disponibles las versiones Express de Visual C#, Visual Basic .NET, Visual C++ y Visual WebDeveloper 2008. Y tiene de interesante bastantes mejoras que puedes encontrar en Visual Studio 2008 (que también liberó su RTM), como son:

Y mucho más. Descarga la versión que más te guste, aprende lo nuevo y empieza a crear tus mejores aplicaciones.

Tour Tecnológico 2007
Fri, Nov 16 2007 7:35

Con un buen sabor de boca concluyó la participación de la Comunidad .NET Tijuana en el Tour Tecnológico 2007 celebrado el 15 de noviembre en CESUN Universidad. Las condiciones del día quizás no fueron las mejores para que la pantalla pudiera ser apreciada correctamente pero realmente agradezco a los asistentes la paciencia, el interés y el entusiasmo mostrado a lo largo del evento.

Al rededor de unas 120 personas (a quienes se les entregó Reconocimiento firmado por personal de Microsoft) fueron las asistentes. Una pequeña parte eran estudiantes con quien tuve oportunidad de platicar con ellos y me comentaban sus inquietudes con la carrera que eligieron y con quienes pude aprovechar el vínculo para lograr mayores cosas. También coordinadores de carrera como Cynthia Rentería de UNIVER quien también desde temprano estuvo acompañándonos. Y algo que fue bastante agradable fue saludar a colegas que ahora están en la industria trabajando muy duro y compartiendo sus experiencias con la plataforma de desarrollo de Visual Studio como Jehu Hernández. Por ahí también me comentaron que entre los directivos de empresas, desarrolladores independientes y empleados de diversas empresas quienes sus patrones les permitieron asistir al evento surgieron oportunidades de negocio que aunque no es un fin primordial de la Comunidad .NET Tijuana, sí son bienvenidas.

Muchas gracias a todos los asistentes, al equipo de colaboradores de CESUN universidad que aunque no les gustaba salir en la foto estuvieron al pie del cañón en todo momento, a Eduardo Kórnegay de CESUN, a Johnathan de APC, a Mario Alberto Chávez, Haarón González y Román Lozano por su estupenda participación. También cabe señalar que no pudo haber sido posible el evento sin el apoyo de Jahdiel Vargas del Cluster de Tecnologías de Información de Baja California quien se encargó de la logística, enlace con CESUN Universidad, renta de equipo y soporte con las llamadas que hacía cada media hora. Aprovecho también para agradecer a todos los que se acercaron a mí con la inquietud de participar en la comunidad y hacerla más grande. 

 

 


by Gabriel Flores | 6 comment(s)
Filed under:
Gráficas fáciles para web
Tue, Aug 28 2007 10:20

Una necesidad recurrente en cualquier tipo de proyecto es darle presentación a datos de una manera que rápidamente sea aprovechable y útil para quien toma decisiones. La presentación en gráficas comparativas es algo a lo que ya está acostumbrada la mayoría de las personas aunque para generarlas no siempre se cuenta con la herramienta adecuada.

Carlos Aguilar creó hace unos años un control gratuito para ello, el WebChart. Y usarlo es tan sencillo como ponerlo en tu Toolbox de Visual Studio y arrastrárlo a la página que estás creando. En tu código de la página aparecerá así:

<%@ Page Language="C#" %>
<%@ Register tagPrefix="Web" Namespace="WebChart" Assembly="WebChart" %>
<%@ Import Namespace="System.Drawing" %>
<html>
<head><title>WebChart Sample</title></head>
<body>
      <Web:ChartControl Width="500" Height="350" id="ChartControl1" runat="Server" />
</body>
</html>

Para darle funcionalidad es tan simple como cargar un dataset:

    //en CrearDataSet está la funcionalidad de conexión a BD
    
DataSet dsPrioridades CrearDataSet();
        
    
PieChart priorityChart = new PieChart();
    
priorityChart.DataSource dsPrioridades.Tables[0].DefaultView;

Y asignarle cuales campos comprenderán tu eje Y y tu eje X, además de cargarlo en el control:

    priorityChart.DataXValueField "Prioridad";
    
priorityChart.DataYValueField "Proyectos";
    
priorityChart.DataBind();
    
ChartControl1.Charts.Add(priorityChart);
    
ChartControl1.RedrawChart();

El resultado es una buena gráfica:

 Gráfica

En la misma página de WebChart puedes descargar el archivo de ayuda que te permitirá saber como manipular todas las propiedades y métodos que tiene para lograr resultados más acordes a lo que necesitas. También hay bastantes ejemplos y código de mejoras a las gráficas que puedes generar.

Technorati tags: , ,
Pronet CodeCamp
Wed, May 16 2007 12:10

Después de unos días de enfermedad regreso con nuevos bríos. El pasado 2 de mayo por parte de la Comunidad .NET Tijuana con apoyos de Microsoft se llevó a cabo el evento Pronet CodeCamp en la que se vieron los temas:

  • Windows Presentation Foundation, impartido por El Guille
  • Desarrollando para Ajax, por el Ing. Leopoldo Uribe
  • Windows Workflow Foundation, por un servidor
  • Windows Communication Foundation, brindada por Octavio Telis
  • Cardspace, por el Ing. Eduardo Arredondo

Photo Sharing and Video Hosting at Photobucket

A pesar de unos problemas técnicos me agradó que tenía enfrente a Octavio Telis y a Guillermo Som, además de varias preguntas que se hicieron y que me dieron a entender que hubo interés en el tema. Mi presentación favorita fue la de El Guille, donde nos presentó quizás cosas que ya sabemos de WPF pero viendo como interactúa en vivo con Blend y la siguiente versión de Visual Studio fue un extra muy bueno. Un agradecimiento a Octavio por aportarnos su conocimiento con la presentación de WCF y a su comitiva que vinieron desde la Ciudad de México nerviosos por estar en Tijuana pero deseosos de ver una vez más a Guillermo Som.

Las instalaciones de la UABC en Tijuana fueron muy funcionales y el apoyo logístico de parte de la célula académica UABC Live.NET con el apoyo del profesor Jesús Reyes estuvo excelente. Así, nos veremos en la próxima ocasión.

by Gabriel Flores | 3 comment(s)
Filed under:
More Posts Next page »