ponte
el problema CREATE DATABASE permission denied in database 'master'
Fri, Jan 4 2013 15:44

Me encontraba haciendo ejercicios de programación usando database migrations cuando al hacer un update-database me ocurre el error:

CREATE DATABASE permission denied in database 'master'

Algo raro pues uso Visual Studio con mi cuenta con derechos de Administrador, además de ejecutarlo con el "Run as Administrator" e investigando un poco di con problemas al querer migrar de ambiente de desarrollo a producción la aplicación, cosa que no es mi caso. Al final di con el problema, y no caí en cuenta de que en este equipo mi cuenta fue creada después de tener instalado SQL Server Express, por lo que mi cuenta de usuario no figuraba con derechos de administración sobre la instancia de SQL Server actual. Es algo más o menos sencillo de hacer pero siguiendo la filosofía de "si alguien más ya batalló con esto" encontré un script para agregar al usuario de sistema actual con derechos de sysadmin de la instancia de SQL Server. Este fue publicada en los anales de MSDN por lo que su uso me pareció lo suficientemente seguro, además de que me resolvió el problema.

Recursos:

Script to add the current user to the SQL Server 'sysadmin' role

by Gabriel Flores | with no comments
Filed under: , ,
dev3cast
Tue, Dec 13 2011 11:06

Con la Comunidad .NET Tijuana y junto con Mario Cornejo he venido participando en podcast tecnológicos para desarrolladores con temática general para cualquiera que trabaje desarrollando software. Son entrevistas y discusiones con especialistas en los temas donde se aclaran y se someten a consideración puntos de vista en episodios de aproximadamente 30 minutos para hacer más conciso lo discutido y haya menor tiempo de distracciones.  Algunos de los temas más populares en el 2011 han sido:

Cualquiera de ellos los puedes descargar o suscribirte para oirlos a tu tiempo en tu lector de RSS favorito.

 

 

by Gabriel Flores | with no comments
Filed under: ,
La versión de SQL Server no soporta el tipo de dato datetime2
Fri, Jul 22 2011 9:16

Estás trabajando en tu aplicación web con Entity Framework y C# en tu máquina de desarrollo usando la versión más reciente de SQL Server 2008 feliz de la vida. Pero al momento de hacer la implementación en el servidor de producción, te encuentras con este error:

The version of SQL Server in use does not support datatype 'datetime2

Y entonces te acuerdas, en el servidor de producción tienen instalado SQL Server 2005. No hay problema, solo ubica el archivo EDMX de tu modelo y con el click derecho del mouse selecciona la opción del menú emergente "Abrir con..."

Hay que ubicar la etiqueta Schema y en el atributo ProviderManifestToken colocar 2005 en lugar de 2008. De esta manera le indicas a Entity Framework que trabaje en modo de compatibilidad de 2005 y así trata apropiadamente los tipos de dato de fecha.

<Schema Namespace="SAOModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" >

 

* Este código fuente ha sido resaltado con Source Code Highlighter.

 

Usando WHERE IN de SQL en Entity Framework (y Linq) con C#
Sun, Feb 20 2011 18:07

A veces necesitas hacer una consulta basándote en datos que no estarás seguro tener porque simplemente es tu usuario quien los eligirá y pues, no eres adivino ¿verdad?

Vamos a basarnos en la base de datos de Northwind para el siguiente ejemplo (si no la tienes, checa el video de como obtener las bases de datos de pruebas Northwind y pubs). En esta base de datos tenemos Proveedores (Suppliers) que ofrecen Productos (Products). ¿Qué pasaría si necesitaramos saber los productos de un proveedor en específico? Si ese proveedor específico fuera Exotic Liquids el código Transact-SQL sería algo tan simple como esto:

SELECT *
FROM   products
WHERE  supplierid = (SELECT supplierid
                     FROM   suppliers
                     WHERE  companyname = 'Exotic Liquids') 

Ya se que también lo podemos poner con INNER JOIN pero estoy tratando de demostrar un punto, aguarda un poco.

Si la interfaz gráfica lo permite, y si el usuario quiere saber productos de más de un proveedor podemos hacer algo igual de sencillo usando WHERE IN. Imagínate un ListBox donde el usuario selecciona más de un proveedor de cual escoger productos, o una caja de texto con autocompletado. En este caso estamos obteniendo los productos de los proveedores que empiezan con la letra E:

SELECT *
FROM   products
WHERE  supplierid IN (SELECT supplierid
                      FROM   suppliers
                      WHERE  companyname LIKE 'E%') 

Donde usamos un campo de la tabla para que encuentre todos los valores que cumplan lo que tenemos entre paréntesis. Básico ¿no? pero ¿como hacemos para llevar esta sentencia SQL a Entity Framework?

Si estás usando Entity Framework 4.0, es muy similar a Linq2SQL, donde puedes usar el método Contains de un arreglo y podrás usar los IDs que ocupas para hacer el filtrado de elementos:

  //Si usamos Linq2SQL usar
  //NorthwindDataContext nc = new NorthwindDataContext();
  NorthwindEntities ne = new NorthwindEntities();

  int[] supplierIDs = { 1, 27 };

  var products = from p in ne.Products
          where (supplierIDs.Contains((int)p.SupplierID))
          select p;

Aquí dos cosas que aclarar, primero, se hace un cast al tipo de dato int para asegurar que los SupplierID coincidan. La otra es que habíamos quedado que no podemos saber cuales proveedores pudiera escojer el usuario, aunque aquí se forzó al proveedor con supplierID 1 y 27 (que son los de Exotic Liquids y Escargots Nouveaux, sí, ambos empiezan con E).

Entonces, ¿cómo hacerlo más dinámico usando Linq to Entities o Linq2SQL? Vaciamos en una variable la consulta, pero exclusivamente con las llaves primarias que nos interesan, y ese resultado lo convertimos a un arreglo, que sería el que finalmente usamos para la consulta final:

  //Si usamos Linq2SQL usar
  //NorthwindDataContext nc = new NorthwindDataContext();
  NorthwindEntities ne = new NorthwindEntities();

  var suppliers = from s in ne.Suppliers
          where (s.CompanyName.StartsWith("E"))
          select s.SupplierID;

  int[] supplierIDs = suppliers.ToArray();

  var products = from p in ne.Products
          where (supplierIDs.Contains((int)p.SupplierID))
          select p;

La clave aquí es usar en la consulta solo el campo que nos interesa (SupplierID) y convertir el resultado en arreglo para poder pasarlo a la segunda consulta ya que con el Contains lo tendremos resuelto. El ejemplo es con proveedores cuyo nombre empiece con E, pero puedes hacerlo aún más dinámico obteniendo ese dato de una caja de texto, un dropdownlist o lo que se te ocurra.

Consideraciones:

En Entity Framework 3.5 no podemos usar Contains, para hacerlo puedes usar el workaround propuesto por Shimmy en StackOverflow.

Puedes repasar como preparar tu ambiente de desarrollo con Entity Framework con el video Búsqueda en ADO.NET Entity Framework con C#.

La otra es que siempre son bienvenidos los comentarios para mejorar el código o ver que otras aplicaciones tendrían para esta manera de consultar datos que aunque muy común si trabajamos con Transact-SQL en Linq no es del todo clara.

Fuentes:

* El código fuente fue coloreado con Source Code Highlighter.

No hay excusas para no programar para Windows Phone 7
Mon, Feb 7 2011 9:26

Aunque ya lo había mencionado en Twitter hace casi un mes, es necesario elaborar un poco sobre el magnífico recurso que comparte Rob Miles sobre programación para Windows Phone 7. Rob Miles (en twitter @RobMiles) ya antes conocía su magnífico C# Yellow Book, pues bien, en Windows Phone Programming in C# nos regala:

  • Un ebook de 152 páginas con todos los detalles que necesitas para programar en Windows Phone
  • Presentaciones de PowerPoint para dar un seguimiento a grandes razgos
  • Demos de las técnicas y funcionalidades presentadas
  • Laboratorios prácticas para que desarrolles tus aplicaciones

Los temas abordados son los precisos para que aprendas a programar ya mismo:

  1. Información General de la plataforma
  2. Introducción a Silverlight
  3. Introducción a Visual Studio 2010
  4. Diseñando la interfaz de usuario con Silverlight
  5. Consumiendo servicios de datos
  6. Información general de XNA
  7. Creando aplicaciones Windows Phone
  8. Usando el Marketplace para vender soluciones

Entonces, ¿qué esperas? Descarga ya mismo (completamente gratis) desde Microsoft Faculty Connection: Windows Phone Programming in C#

 

 

¿Quieres programar para Windows Phone 7 y no tienes uno? Participa haciendo 3 soluciones antes del 6 de mayo y ¡gánate uno gratis! Consulta las bases aquí.

by Gabriel Flores | with no comments
Filed under: ,
Ebooks gratuitos
Fri, Nov 19 2010 9:36

Aprovecha los días libres en las fiestas de fin de año para prepararte en tu carrera:


Foundations of Programming por por Karl Seguin, donde el colaborador de www.codebetter.com nos da un punto de vista de lo que tú como programador debes saber ahora mismo si quieres ser mejor en tu trabajo.


Fundamentos de programación por Karl Seguin (traducción al español realizada por miembros de las comunidades tecnológicas Microsoft en México)


Programming Windows Phone 7: Con este ebook gratuito podrás conocer de primera mano como programar para la siguiente plataforma de dispositivos móviles. Aquí puedes ver el contenido de este libro y conocer las novedades. Descarga ya en versión PDF, versión XPS y ejemplos en código.


Own your future: En este libro se te ofrece un panorama de como actualizar tus habilidades y tomar control de tu futuro en tu carrera tecnológica. Aunque enfocado a el trabajo que se hace en Microsoft, puede ser perfectamente aplicable a cualquiera que quiera tener un futuro brillante basado en el esfuerzo y trabajo en su carrera.

Otros títulos dedicados a la programación y C#
Microsoft Application Architecture Guide, 2nd Edition
Rob Miles C# Yellow Book 2010
Threading in C#
Improving .NET Application Performance and Scalability
Applying Design Patterns

Otros ebooks de MSPress
Como parte del evento de lanzamiento de Office 2010 Microsoft Press hace disponible el ebook First Look Office 2010 de manera gratuita. Sólo tienes que acceder a este enlace para iniciar la descarga (PDF directo 10.5MB).

Pero no es el único, a lo largo del tiempo se han hecho disponibles distintos títulos para ser aprovechados por quienes se interesan por estar al día en distintos tipos de tecnología. Puedes descargarlos en cada una de las ligas:
Free ebook: Moving to Microsoft Visual Studio 2010 (DRAFT Preview)
Free ebook: Moving to Microsoft Visual Studio 2010 (DRAFT Preview II)
Code for "Moving to Microsoft Visual Studio 2010" DRAFT ebooks
Free ebook: Introducing Microsoft SQL Server 2008 R2
Free ebook: Understanding Microsoft Virtualization Solutions (Second Edition)
Free ebook: First Look Microsoft Office 2010
Free ebook: Windows 7 troubleshooting tips
Free ebook: Introducing Windows Server 2008 R2
Free ebook: Deploying Windows 7, Essential Guidance

by Gabriel Flores | with no comments
Filed under: ,
Importante: Vulnerabilidad en ASP.NET (todas las versiones)
Mon, Oct 4 2010 6:00

Quienes me siguen en twitter (twitter.com/gabo) se habrán enterado sobre la vulnerabilidad en ASP.NET que me hizo decir algunas maldiciones en días pasados. Es una vulnerabilidad importante que Microsoft comentó en un Security Advisory y se trata básicamente de que un atacante pueda hacer peticiones al servidor web y verificando los mensajes de error que este arroje, descifrar el contenido de algunos archivos que no están expuestos por default por IIS, como el archivo web.config, donde algunos almacenan por ejemplo información de conexión a servidores SQL Server y algunos otros (malamente) también usuarios y passwords.

¿Qué hay que hacer? Afortunadamente Microsoft ha lanzado ya actualizaciones por Windows Update, si no lo has hecho o por alguna razón no lo puedes ejecutar, aquí lo puedes descargar directamente:

Windows Server 2008 R2 and Windows 7

 

.NET Framework Version

KB Article

Patch

.NET Framework 3.5.1 (Default install)

KB2416471

Download

.NET Framework 4

KB2416472

Download

 

Windows Server 2008 SP2, Windows Vista SP2

 

.NET Framework Version

KB Article

Patch

.NET Framework 2.0 SP2 (default install)

KB2416470

Download

.NET Framework 4

KB2416472

Download

.NET Framework 3.5 SP1

KB2416470, KB2416473

Download, Download*

.NET Framework 3.5

KB2416470, KB2418240

Download, Download*

.NET Framework 1.1 SP1

KB2416447

Download

*Si se listan varias descargas sobre una versión de .NET (por ejemplo en .NET 3.5 SP1 y .NET 3.5) entonces todos los parches deben ser instalados (sin importar el orden).

Windows Server 2008, Windows Vista SP1

 

.NET Framework Version

KB Article

Patch

.NET Framework 2.0 SP1 (default install)

KB2416469

Download

.NET Framework 4

KB2416472

Download

.NET Framework 3.5 SP1

KB2416474, KB2416473

Download, Download*

.NET Framework 2.0 SP2

KB2416474

Download

.NET Framework 3.5

KB2416469, KB2418240

Download, Download*

.NET Framework 1.1 SP1

KB2416447

Download

*Si se listan varias descargas sobre una versión de .NET (por ejemplo en .NET 3.5 SP1 y .NET 3.5) entonces todos los parches deben ser instalados (sin importar el orden).

Windows Server 2003 SP2 32-bit

 

.NET Framework Version

KB Article

Patch

.NET Framework 1.1 SP1 (default install)

KB2416451

Download

.NET Framework 4

KB2416472

Download

.NET Framework 3.5 SP1

KB2418241, KB2416473

Download, Download*

.NET Framework 2.0 SP2

KB2418241

Download

.NET Framework 3.5

KB2416468, KB2418240

Download, Download*

*Si se listan varias descargas sobre una versión de .NET (por ejemplo en .NET 3.5 SP1 y .NET 3.5) entonces todos los parches deben ser instalados (sin importar el orden).

Windows Server 2003 64-bit

 

.NET Framework Version/SP

KB Article

Patch

Default OS Configuration

NA

NA

.NET Framework 4

KB2416472

Download

.NET Framework 3.5 SP1

KB2418241, KB2416473

Download, Download*

.NET Framework 2.0 SP2

KB2418241

Download

.NET Framework 3.5

KB2416468, KB2418240

Download, Download*

.NET Framework 1.1 SP1

KB2416447

Download

*Si se listan varias descargas sobre una versión de .NET (por ejemplo en .NET 3.5 SP1 y .NET 3.5) entonces todos los parches deben ser instalados (sin importar el orden).

Windows XP SP3 32-bit and 64-bit

 

.NET Framework Version/SP

KB Article

Patch

Default OS Configuration

NA

NA

.NET Framework 4

KB2416472

Download

.NET Framework 3.5 SP1

KB2418241, KB2416473

Download, Download*

.NET Framework 2.0 SP2

KB2418241

Download

.NET Framework 3.5

KB2416468, KB2418240

Download, Download*

.NET Framework 1.1 SP1

KB2416447

Download

*Si se listan varias descargas sobre una versión de .NET (por ejemplo en .NET 3.5 SP1 y .NET 3.5) entonces todos los parches deben ser instalados (sin importar el orden).

Consideraciones

Fue muy hábil el equipo de expertos que descubrió esta vulnerabilidad, y fue una bastante importante pues afectaba todas las versiones de ASP.NET, pero afortunadamente la respuesta de Microsoft fue casi inmediata con la publicación de un workaround que evitaba ser expuestos por esta. Lo más importante es que si mantienes un sitio ASP.NET te asegures no caer en prácticas comunes y poco confiables como dejar los usuarios y contraseñas en texto plano en ningún archivo del sitio web. Velo así, es una carpeta expuesta a la internet para todos, aún con restricciones de IIS ¿dejarías la contraseña de tu coreo electrónico en un archivo .PPTX expuesto? Sólo es cuestión de sentido común.

Con información de los posts de ScottGu:


by Gabriel Flores | 2 comment(s)
Filed under:
Fundamentos de Programación
Wed, Jun 23 2010 17:59

Traducción al español del Foundations of Programming de Karl Seguin de www.codebetter.com licenciado bajo Creative Commons licencia Attribution-NonCommercial -Share-Alike 3.0 Unported.

Fundamentos de Programación Traducido

Jaime Sánchez nos comentó a varios miembros de comunidades tecnológicas acerca de traducir al español este libro, y varios nos apuntamos a ello. Pues bien, este es el esfuerzo de Francisco Flamenco, Emilio Reyes, Antonio Ortiz, Gabriel Oliva, Jaime del Palacio, Gabriel Flores y Haarón González.

Es una traducción que no por provenir de nosotros esté libre de fallas, así que cualquier problema, imprecisión o falta agradeceríamos nos lo notifiquen para actualizar el documento.

La certificación no es una pérdida de tiempo
Thu, Apr 29 2010 10:48

Estoy totalmente de acuerdo en las razones que marca Uncle Bob del porque certificarse sí es una pérdida de tiempo:

  • Si tratas de impresionar a alguien
  • Si lo quieres usar para conseguir trabajo
  • Si solo quieres contratar personal certificado

    
Sin embargo, hay un error común en muchas personas que desvirtúan las certificaciones, y es que certificarse no es atender un curso y obtener un reconocimiento de que participaste en ese curso.  Déjame explicarlo, ese "certificado de participación" en el curso XYZ-1234 *NO* es una certificación. Es más, para estar certificado en algo ni siquiera necesitas haber tomado esos cursos, necesariamente. Lo que ayuda más para aprobar los exámenes de certificación es como dije anteriormente en "Certificaciones, perder el miedo" es la experiencia personal en la tecnología que estás certificándote.

Como también dije en ese post, personalmente que yo sepa que estás certificado en algo me da a entender que comprendes lo mínimo de esa tecnología, que no tengo que perder tiempo en enseñarte desde el principio, pero realmente es muy debatible que demuestre que tan experto seas en ella. Para estar certificado en algo me sirve para demostrarme a mí mismo antes que a cualquier otra persona un hito personal en mi carrera profesional. Como dije antes, tu trabajo habla más que cualquier papelito que traigas adjunto a tu CV.

 

Cambiar usuario y password de la cadena de conexión en EF
Tue, Mar 9 2010 13:27

En una aplicación donde usas ADO.NET Entity Framework como acceso a datos, en el paso donde se agrega una entidad nueva en el proyecto y se usa autenticación de SQL Server, siempre se nos pregunta si almacenaremos la información de conexión en el archivo de configuración o si la pasaremos por medio de la aplicación:

click para ver más grande

Esta es la mejor práctica, seleccionar "No, exclude sensitive data from the connection string. I will set it in my application" que palabras más, palabras menos, significa algo así como "No, excluir datos sensibles de la cadena de conexión. La asignaré desde mi aplicación". Y es que en un mundo ideal tu aplicación se ejecutará desde un entorno donde la máquina pertenezca a un directorio activo (Active Directory) con todas las credenciales dadas desde Windows para evitar errores y malentendidos. Pero en el mundo real esto no siempre es así y quizás en la misma PC donde se ejecutará la aplicación varios usuarios con distintos tipos de perfil usarán la aplicación por lo que debes pedir sus nombres de usuario y contraseña de SQL Server para acceder al programa. Entonces ¿cómo cambiamos los datos de la cadena de conexión?

Supongamos que tenemos una forma de Login con dos cajas de texto para el usuario y contraseña y estos se leen en unas variables sUser y sPass respectivamente, vamos a tener esto:

 

NorthwindEntities ne = new NorthwindEntities();

SqlConnectionStringBuilder sb =
new SqlConnectionStringBuilder(
((EntityConnection)ne.Connection).StoreConnection.ConnectionString
);
sb.IntegratedSecurity = false;
sb.UserID = sUser;
sb.Password = sPass;

((EntityConnection)ne.Connection).StoreConnection.ConnectionString = sb.ConnectionString;

 

NorthwindEntities es como nombramos el modelo de datos desde el Entity Data Model Wizard. Y aquí inicializamos la conexión auxiliándonos de la clase SqlConnectionStringBuilder para mayor comodidad. Después de eso, simplemente lo asignamos por medio del ConnectionString. Toma en cuenta los castings de los que hacemos uso con (EntityConnection) para poder tener acceso a la propiedad StoreConnection que es donde la propiedad ConnectionString está disponible y que podemos actualizar.

Basado en ADO.NET Entity Framework: Modify EntityConnection connection string values at runtime

by Gabriel Flores | with no comments
Filed under: , ,
ADO.NET Entity Framework en unos cuantos pasos
Tue, Mar 9 2010 11:31

Gracias a una invitación de Jesús Bosch de la Universitat Oberta de Catalunya tuve el privilegio de presentarles este tema. Desgraciadamente una metida de pata mía impidió que la plática fuera en vivo, pero aquí lo que pude rescatar de esa memorable mañana de sábado lluvioso.

 

ADO.NET Entity Framework en pocos pasos from Gabriel Flores on Vimeo.

Presentación para la UOC.

http://uoc.dotnetclubs.com

 

by Gabriel Flores | 3 comment(s)
Filed under: ,
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.

More Posts Next page »