Friday, January 26, 2007

C++/CLI 2.0 Basics - Parte I

- Examen: Application Development Foundation(70-536) - Certification: MCTS - Audiencia: Desarrolladores Actuales usando C#.NET o Visual Basic.NET en .NET 2.0 Introducción: CLI es equivalente a Common Language Infrastructure. C++/CLI es la nueva implementacion de C++ de Microsoft que viene con .NET Framework 2.0 que le supersede a MC++(Managed C++) que venia con .NET Framework 1.1. Debido a que C++/CLI no es y nunca sera portado a Mono o DotGNU, este articulo se centra en programacion para Windows con CLI. Nuestro acostumbrado HelloWorld. 1) Creamos un archivo de texto llamado "Hello.cpp". Podemos usar Notepad o EDIT(yo recomiento usar Notepad++) y colocamos el siguiente codigo: using namespace System; void main(void) { Console::WriteLine("Hola mundo desde C++/CLI"); } 2) Compilamos usando el compilador C++/CLI 2.0. El nombre del compilador es "cl": cl Hello.cpp /clr:safe NOTA: No omita el argumento "/clr:safe", si lo omite el compilador no reconocera parte del codigo. El argumento dado le dice al compilador que se compilara con dependencia al .NET Framework y la ejecucion de codigo es segura. Mas adelante se explicara la diferencia entre el codigo seguro y el que no lo es. 3) Ejecutamos la aplicacion. Hello.cpp Diferencias y similitudes entre C# y Visual Basic. Al igual que C#, se necesita un metodo o funcion principal para ejecutar el codigo. A diferencia de C#, la directiva para abreviar rutas de tipos de datos en C++/CLI es "using namespace"( 2 palabras separadas por un espacio en blanco) y el operador de navegacion no es "."(punto) sino "::"(dos puntos). Aqui observamos la diferencia entre los 3 lenguages. C# using System.Collections.Generics; C++/CLI: using namespace System::Collections::Generics; Visual Basic: imports System.Collections.Generics En Visual Basic y en C# el operador "."(punto) se utiliza para separar namespaces y clases al hacer referencia a clases, metodos, constantes, enumeraciones,variables/propiedades/eventos estaticos. En C++/CLI, el operador "::"(dos puntos) se utiliza para todos estos fines antes mencionados mientras que el uso del operador "." es aplicado a ciertas referencias a objetos que seran explicadas en otro articulo que publicare. Aqui tenemos un ejemplo de como se invoca al metodo estatico "Exists" en la clase "System.IO.File": C# System.IO.File.Exists(..); C++/CLI: System::IO::File::Exists(..); Visual Basic: System.IO.File.Exists(..); Aqui tenemos otro ejemplo al usar una enumeracion en los tres lenguages: C# System.DayOfWeek.Friday C++/CLI: System::DayOfWeek::Friday Visual Basic: System.DayOfWeek.Friday Entendiendo la declaracion de variables en C++/CLI. Para usar variables en C++/CLI, minimo deben declararse. Para declarar variables de forma simple se usa el nombre de el tipo de datos seguido del nombre de la variable. Por ejemplo: int edad; edad = 21; A diferencias de otras versiones de C++, C++/CLI permite declarar variables en todo ambito de codigo(fuera o dentro de clases o metodos). Al igual que C#, se pueden declarar multiples variables de un mismo tipo de dato en una sola linea de codigo: int edadUsted,edadMia,edadOtros; A diferencia de Managed C++(la version anterior a CLI), en CLI existen 2 tipos de datos: Handle y Pointer. Un "handle" requiere un carat(^) en frente de la variable o el tipo de dato y un puntero requiere un asterisco(*). TIP: Si al igual que yo tiene la mala suerte de tener un teclado en español, no encontrara el simbolo "^" directamente en el teclado, el codigo ASCII para el simbolo es "ALT+94". Por ejemplo: String^ miHandle; String * miPointer; Basicamente la diferencias son las siguientes:
  • Handle: Microsoft .NET Garbage Collector SI interviene en la limpieza del objeto, por lo tanto es alojado en una parte de la memoria llamada "Managed Heap","CLR Heap" (o "monton administrado") en el cual el Garbage Collector administra el tiempo de vida de cada objeto. Este tipo de manejo de memoria se conoce como "Administracion de memoria verificable".
  • Pointer: Microsoft .NET Garbage Collector NO interviene en la limpieza del objeto, por lo tanto es alojado en una parte de la memoria llamada "C Runtime Heap", "CRT Heap" ( o "monton del tiempo de ejecucion de C") en el cual la limpieza de cada objeto es responsabilidad del programador. El programador tiene a su disposicion la palabra "delete" para eliminar el objeto cuando ya no es utilizado. Este tipo de manejo de memoria se conoce como "Administracion de memoria inverificable".
Cuando una aplicacion es construida usando C++/CLI solo usando Handles, se conoce como "aplicacion .NET compilada de forma segura". Cuando una aplicacion de .NET es construida usando C++/CLI usando Handles y Pointers al mismo tiempo se conoce como "aplicacion .NET compilada de forma insegura". Porque insegura? El uso de Punteros(Pointers) en el codigo compilado con C++/CLI usando librerias .NET lo convierte en "codigo inseguro" debido a que las capacidades de manejo de memoria usando punteros son ilimitadas al igual que otras versiones de C++, un mal manejo de un puntero podria corromper la memoria de un programa ya sea porque el puntero se salga del limite de la aplicacion(cosa que Windows no permite) o se intente utilizar el objeto con que el puntero esta trabajando despues que se elimino(usando la antigua instruccion "delete"). Normalmente cuando se tiene una aplicacion ya creada en Visual C++ 6 o en una version anterior de C++ Managed o C++/CLI, el codigo puede compilarse de "forma insegura" mientras se migra todo el codigo "inseguro" a "100% Administrado por el CLR".
  • Para compilar una aplicacion con codigo seguro se usa la opcion de compilacion: "/clr:safe".
  • Para compilar una aplicacion con codigo inseguro se usa la opcion de compilacion: "/clr".
Todas las aplicacion creadas con Managed C++, C++/CLI, C# y Visual Basic.NET se conocen como Managed Applications ("Aplicaciones administradas") que quiere decir que son aplicaciones cuya memoria es administrada por el CLR(.NET Common Language Runtime). Esto no quiere decir que el Garbage Collector de CLR actuara sobre toda la memoria de la aplicacion. Tanto MC++,C++/CLI y C# tienen la opcion de manejar el tiempo de vida de los objetos de forma explicita o sin la intervencion del Garbage Collector. TIP: Para usar punteros en C# vea la palabra reservada unsafe. Al hacer instancias o referencias a cualquier clase del FCL(.NET Foundation Class Library)(incluyendo el array y el String) se deben usar Handles en vez de Pointers. Manejo de Arrays y uso de gcnew En otro articulo se explicara como usar las matrices u la instanciacion de clases usando C++/CLI.

Friday, January 19, 2007

Microsoft .NET Micro Framework

Microsoft .NET Micro Framework(MF) es un framework para desarrollo de aplicaciones en codigo-administrado en dispositivos de procesamiento, memoria y energia limitadas y donde no se necesita las grandes capacidades de Microsoft Windows CE y Microsoft .NET Compact Framework, hasta se podria decir que MF es el hermano menor de Compact Framework. Por ejemplo, con MF podremos desarrollar los siguientes dispositivos:
  • Sensores Infrarojos
  • Pantallas Digitales
  • Monitores de Salud
  • Controles Remotos Infrarojos(TV,RADIO,iPOD)
  • Relojes
Hasta el momento MF esta en su Primera Beta y solo soporta procesadores ARM(7) y ARM9, u aun asi el mejor cliente de MF ha sido Msn Direct, un conjunto de servicios orientados a micro-dispositivos portatiles de Msn. Si quieren saber que dispositivos podras programar con MF estos son algunos(y les dejo mis favoritos): Adicionalmente, el SDK provee herramientas para el desarrollo y depuración de las aplicaciones antes de ser ejecutadas en algun dispositivo usando como minimo Visual Studio .NET 2005 Professional Edition(las Express no se soportan). Visita la pagina oficial de MicroFramework en www.aboutnetmf.com

Enumerando la Información de las Unidades de Almacenamiento utilizando Visual Studio 2005 y C# 2.0

Materiales: DrivesInfo-Example.cs DrivesInfo-Example.zip Namespaces: System;System.IO; Clases: System.IO.DriveInfo Ensamblados: Mscorlib.dll(Referencia no necesaria) Portabilidad para Mono: Ninguna. Mono 1.2.1 Aun no ha implementado la clase DriveInfo. - Tema para examen oficial Application Development Foundation(70-536). - Certificacion MCTS. Introducción: A menudo uno necesita crear aplicaciones que guarden archivos(XML,TXT,DAT) en el Sistema de Archivos de Windows y por supuesto necesitara saber que unidades y que espacio libre le quedara a cada unidad del usuario. En Microsoft .NET Framework 2.0 se complemento el namespace System.IO con clases y metodos que proporcionan la informacion que necesitamos: Ejemplo: 1) Obtener las instancias de DriveInfo con la informacion de cada Unidad: DriveInfo[] drives = DriveInfo.GetDrives(); 2) Iterar el Array para poder presentar la información de cada Unidad: foreach (DriveInfo info in drives) {...} (Los puntos suspensivos en el codigo dado y en los siguientes indican porciones de codigo no relevante para el paso que se esta explicando) 3) Comprobar el estado de la unidad para solicitar la informacion. Esto se hace mediante la propiedad IsReady, de otra menera si se intenta obtener la información y la unidad no esta lista se levantara una excepción de tipo System.IO.IOException. Un caso tipico de esta situación es la unidad de Diskette(que casi nunca para mi caso tiene un disco): if (info.IsReady) {...} Seguidamente podra mostrar la informacion completa de la unidad. Si se compila y ejecuta la aplicación de ejemplo obtendra un resultado similar: A:\ no tiene disco C:\:Bill gates 39070 MB 39 GB, NTFS D:\ no tiene disco E:\:WD160GB 140665 MB 140 GB, NTFS F:\:SG80GB_EMULE 78140 MB 78 GB, NTFS G:\ no tiene disco H:\:VSSD1 105 MB 0 GB, UDF

Thursday, January 18, 2007

Mono-Based MP3 Player

El primer Dispositivo de reproduccion MP3 de la casa Sandisk corre Linux y todas las aplicaciones estan creadas 100% en Mono sobre un procesador ARM El dispositivo incluye:
  • 4GB of memory.
  • SD slot for extra storage.
  • WMA, MP3 subscription WMA and PlayForSure are supported.
  • Internet Radio streaming.
  • WiFi.
  • Photo browser.
  • 2.2 TFT color screen.
La novedad comercial es que soporta Wi-FI y puedes compartir la musica y descargarla desde tus propios servidores. [Via: Blog de Migue de Icaza]

Tuesday, January 9, 2007

El nuevo Apple iPhone ya esta aqui.

Video del la presentación del iPhone, por Steve Jobs. Ver Video Cuando van a sacar el SDK?

70-620-Configuring Windows® Vista Client

Trascender ha liberado en la primera semana de enero el material de preparación para el examen 70-620 para medir los conocimientos y abilidades de los professionales para resolver problemas con respecto a conectividad de red, administracion de seguridad y aplicaciones para diferentes versiones del nuevo sistema operativo Windows Vista. Microsoft solicita que los candidatos para este examen deben tener al menos un año de experiencia en el campo IT, sobre todo trabajando en soporte telefonico(Nivel de Tier-1 a Tier-2) en un gran rango de ambientes, desde sistemas al por menor hasta empresariales. Un total de 4 examenes seran lanzados en el primer cuarto del 2007 cuyo target sera el soporte para clientes corporativos, soporte a consumidor y finalmente trabajadores a distancia que emplean el sistema operativo Vista como solución personal. El examen "70-620 Configuring Windows® Vista Client" de Trascender cuesta alrededor de unso 109$.

Sunday, January 7, 2007

Wiki-Guia para Desarrolladores Mono

En el siguiente vinculo podran encontrar una wiki-guia para desarrolladores en mono. Wiki-Guia para Desarrolladores en Mono NOTA: En la parte de desarrollo de aplicaciones de escritorio, la guia se enfoca en GTK# mas no en Windows Forms, esto debido a que Microsoft ya tiene bastante documentación acerca de "su" tema y hay poca acerca de GTK#. Hay algo que los desarrolladores nuevos con la tecnologia Mono se preguntan y es si deberia un Mono-Developer seguir lo que "dice" el MSDN o deberia hacer caso a la escasa guia oficial de Mono que esta diseminada en toda una lista de correo. La respuesta es: "Temporalmente" Normalmente sucede que los desarrolladores Microsoft ejecutan su aplicación en mono sobre Linux y se encuentran con huecos de implementación en la librerias(aunque el impacto se puede minimizar usando MoMA), entonces no se puede confiar en que todo lo que diga el MSDN se ejecutara tal y como lo hemos deseado. Miguel De Icaza ha sacado la idea de crear una libreria similar al MSDN pero para desarrolladores Mono y ha pedido que apoyemos la documentación inicial del proyecto con nuevos contenidos y me parece una excelente idea pero personalmente creo que "todos estan empeñados en desarrollar librerias para mono pero nadie quiere documentarlas".

Activación de C.A.S en Novell Mono

Desde la primera implementacion de .NET Framework de Microsoft Code Access Security ha estado activado, sin embargo no lo es asi para Mono. Solo a partir de Mono 1.2 recientemente lanzada podremos utilizar dicha caracteristica parcialmente desarrollada. Para usarla debemos utilizar el switch "--security" al ejecutar una aplicación. Ejemplo:
 mono --security helloWorld
Mas informacion acerca de CAS en Mono

Hello World en C usando GCC en Linux.

Estaremos desarrollando una aplicacion "Hello World" en linux usando el compilador de GNU llamado GCC. Tocaremos lo siguientes topicos:
  • Manejo de directorios usando los comandos mkdir y ls
  • Introduccion a programación con C
  • Compilación en linea de comando usando gcc
Primero debemos crear la carpeta donde colocaremos nuestros fuentes, para eso usaremos el comando mkdir. Ahora: Donde se crearan los directorios? Cada usuario en Linux(No solo en ubuntu) posee una carpeta personal donde de encuentran los archivos de Escritorio y configuraciones, esa carpeta es /home/{suNombreDeUsuario}. Al igual que en windows, su carpeta personal estara en C:\Documents And Settings\{suNombreDeUsuario}. Si no ha ejecutando un comando "cd" para navegar entre carpetas, usted debe estar en /home/{suNombreDeUsuario} De todas formas para confirmarlo, puede usar el siguiente comando para saber en que carpeta se encuentra en este momento:
echo $PWD
Yo ejecute el comando y me dio el siguiente resultado:
 /home/johan-root
Esto debido a que mi nombre de usuario es "johan-root". Ahora procedamos a crear nuestra carpeta para almacenar los archivos para compilar nuestra aplicacion HelloWorld.
 mkdir helloWorldC
(Si quiere comprobar si se creo la carpeta use el comando "ls") Ahora entramos en la carpeta creada usando el comando "cd":
 cd helloWorldC/
(Tip: al igual que en DOS siempre podemos usar la tecla TAB para completar el nombre de la carpeta, en este caso simplemente escribiendo "hello" y pulsando la tecla dada se completara el nombre del directorio completo) ahora utilizaremos el editor de texto de Gnome para editar nuestro archivo fuente llamado "main.c":
 gedit main.c
Ahora pegamos el siguiente codigo fuente en nuestro archivo en edición:
#include<stdio.h>

int main(int arg_count,char ** arg_values)
{
 printf("Hello World\n");
 return 0;
}
Ahora guardamos el archivo y procedemos a compilar.
 gcc -o helloWorld main.c
Cuando la compilación de un programa usando gcc es satisfactoria, el comando no arroja resultado. Si no arrojo resultado quiere decir que se compilo el programa y se encuentra en el archivo "helloWorld". Ahora solo tenemos que ejecutarlo:
 ./helloWorld
El resultado deberia ser el siguiente:
HelloWorld

Linux Basico

Aprenderemos los comandos basicos para Linux, especificamente para Ubuntu Dapper Drake 6.06 LTS y para seguirlo deberan tenerlo instalado. En mi caso yo lo he instalado en una VMWare y se ejecuta a la perfeción. Comenzemos con nuestra practica: EL Linux GNU Debian y Ubuntu se puede instalar software usando los comando apt-get y aptitude, no conozco la diferencia entre los pero personalmente siempre uso aptitude. La sintaxis es la siguiente: sudo aptitude install {nombre de la aplicacion} "sudo" es la inicial de SUPER-USER-DO. Instalar software es una tarea administrativa del sistema, asi que solo el super usuario(root) puede realizar esta tarea por defecto. Sudo nos quita el trabajo de iniciar sesion en root para poder instalar programas, asi que solo escribimos sudo seguido del comando que requiere nivel administrativo. Necesitara la contraseña de el super user(root) para poder ejecutar comandos con sudo. Demostremos la instalacion de aplicaciones + sudo instalando gEdit, gedit es un editor de texto.
sudo aptitude install gedit
introducimos la contraseña de root y nos mostrara la informacion del "paquete" que instalaremos(en nuestro caso es "gedit") y Solo debemos decirle "yes" para que se instale la aplicacion. Ahora podremos usar gedit ejecutando el siguiente comando:
gedit
para crear un nuevo archivo llamado "archivo.txt" usamos:
gedit archivo.txt
Al ejecutar gedit desde la consola, no se podra seguir usando la consola hasta cerrar gedit. Podremos listar los archivos en la carpeta actual usando el comando "ls"
ls
para listar todo(archivos ocultos, carpetas y detalles de los mismos) podemos usar el argumento "a"
ls -a
para crear un directorio usaremos "mkdir"
mkdir miNuevoDirectorio
recuerde que en linux los nombres de archivos y carpetas son "case-sensitive", es decir, se distingue las mayusculas de las minusculas. para eliminar un directorio usaremos "rm"
rm miNuevoDirectorio
para eliminar un archivo usaremos "rm -f "
rm -f archivo.txt
Por defecto, los archivos ejecutables no tiene permiso de ejecución por defecto, para darle permisos de ejecución a un archivo usaremos "chmod" (change mode)
chmod 755 miHelloWorldEnLenguageC
donde 755 es un codigo que dice que usted como usuario que aplica los permisos tiene control completo(7), al grupo donde usted esta y otros usuarios y grupos tiene menos privilegios que usted(55). Por defecto, en linux los programas no tienen extentension, asi que para ejecutar un programa usaremos el prefijo "./". (El hecho de que los programas no tengan extension no es la razon por la que tenga que usar "./") Para ejecutar programas use la siguiente sintaxis: ./MiPrograma por ejemplo:
./MiHelloWorld
MiHelloWorld es un programa que creare en una entrada siguiente usando el compilador para lenguage C (GCC) de GNU. Si tienen dudas recuerden que pueden escribirme a mi correo.

Instalación de Novell Mono 1.2 en Ubuntu 6.0 con MonoDevelop

Demostrare como instalar Novell Mono Framework 1.2 en Linux Ubuntu Dapper Drake 6.06 LTS. Necesitaremos descargar el instalador universal para mono. Url: http://www.mono-project.com/Downloads Deberan descargar "Linux Installer for x86 (All distributions)" y colocarlo en su escritorio. luego abremos una consola donde nos posicionaremos en el escritorio:
cd Desktop
luego le cambiamos los permisos de ejecución al instalador de la siguiente forma:
chmod 755 mono-1.2.2.1_1-installer.bin
ahora ejecutamos el instalador:
./mono-1.2.2.1_1-installer.bin
Se abrira un instalador en interfaz grafica al cual responderemos con Next... Next. Al finalizar la instalacion, navegamos al directorio de instalacion de los binarios donde encontraremos los programas "mono" y "monodevelop"(recuerde que el linux los binarios ejecutables no tiene extension)
cd mono-1.2.2.1/bin/
Ahora ejecutamos MonoDevelop
./monodevelop
Listo, ahora empezaremos a practicar con monodevelop. Por defecto, los proyectos en C# estaran compilando a compatilibdad con 1.1 en vez de 2.2 por lo cual no se podran usar Generics o alguas otras caracteristicas de 2.0 asi que debemos modificarlo en las propiedades del projecto manualmente.

Friday, January 5, 2007

Campos XML en SQL-2005

En SQL Server 2005 tenemos la posilibilidad de crear campos XML validados con Schema. Que ventajas tiene crear Campos XML con esquema(con tipo) a crearlo sin esquema(sin tipo)?
  1. Garantizar que los datos Xml sean documentos validos.
  2. Garantizar que los datos Xml esten conformes a un modelo y ser validados velozmente por el motor de sql para mantener la integridad de los datos Xml.
  3. Permitir la aplicacion de Indices sobre las columnas Xml para agilizar la consulta del Documento almacenado.
Dependiendo de cual sea nuestro escenario, elejiremos crear Columnas con XML con Esquema si son el mismo. Este articulo se centra en demostrar la creacion de columnas XML con Esquema. Pasos para crear columnas XML con Esquema:
  • 1) Primero debemos crear un Schema XML en la base de datos.
CREATE XML SCHEMA COLLECTION
[Messaging].[MessageModel] AS N'
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Message">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="Body" type="xsd:string"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>'
  • 2) Luego debemos crear la tabla con el campo XML donde utilizaremos el SchemaXML creado anteriormente:
CREATE TABLE [Messaging].[Message](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Content] [xml](CONTENT [Messaging].[MessageModel]) NOT NULL,
CONSTRAINT [Message_PK] PRIMARY KEY CLUSTERED ([Id] ASC))
Ahora podremos utilizar la tabla de la siguiente forma:
INSERT INTO [MESSAGING].[MESSAGE](Content) 
VALUES('<Message>
<Body>Este es el mensaje enviado</Body>
</Message>')
Alli insertariamos un registro en la tabla Message con el XML ajustado al EsquemaXML de la columna 'Content'. De esta forma podemos realizar una consulta a la tabla con nuestra columa XML y en SSMS(SQL Server Management Studio) podremos ver los datos de esta forma.