2010-06-23

StringWriter y con distintos Encodings

Recientemente me topé con un pequeño problema al armar una consigna de un trabajo práctico del colegio: La idea era armar un helper para que los chicos puedan bajar facilmente archivos XML.

El problema fue que yo me encargaba de bajar el stream del archivo, lo retocaba un poco y luego lo pasaba desde un XDocument a un string utilizando un StringWriter, entonces al escribir el string, lo hacía agregando el header de XML de encoding="utf-16". Todo esto no sería un problema si no fuese porque, la idea detrás de esto era que asi como les llegaba el string, lo pudiesen guardar a disco con StreamWriter, utilizando los constructores mas simples, sin tener que especificar encodings.

Dado que StringWriter no permite modificar el encoding que utiliza, la solución fue crear una subclase de StringWriter y hacer override de la propiedad Encoding.

La pequeña clase quedó asi:


class UTF8StringWriter : StringWriter
{
public override System.Text.Encoding Encoding
{
get
{
return System.Text.Encoding.UTF8;
}
}
}

Espero que les sea útil!

Zaiden


2010-06-21

Problemas al querer cargar un XML de un string Unicode

Hace poco, por cierta necesidad me encontré con un error bastante extraño. Al intentar leer un XML con un XmlDocument obtenía el siguiente error: "Data at the root level is invalid. Line 1, position 1".

El string obtenido provenía de un stream, el cual se iba leyendo de a partes.

Luego de varias idas y vueltas, encontré finalmente la casua del problema: al escribirse el stream original, se estaba haciendo lo siguiente:

var writer = new StreamWriter(stream, Encoding.Unicode);
writer.Write(text);

El problema que traía esto es que, por la forma en la que se estaba leyendo el stream del otro lado (codigo externo, revisado gracias al amigo Lutz!) se estaba interpretando mal la marca de uso de Unicode, al comienzo del string.

Para poder solucionar esto, bastó con reemplazar las lineas en la que se crea y usa el StreamWriter, por la siguiente:

var writer = new StreamWriter(stream, new UnicodeEncoding(false, false));
writer.Write(text);

Esta forma de crear el encoding, le indica que no se deberá incluir la marca de Unicode al comienzo del string, solucionando el problema antes mencionado

Espero poder ayudar a alguien con esto.
Saludos!

Zaiden


2010-06-07

Uso de certificados emitidos por Windows 2008 R2 desde .NET Framework

Si tienen la suerte de tener que utilizar certificados con un template v3 desde Windows Vista o superior, y los mismos fueron emitidos por un Windows Server 2008 R2, se encontrarán con una feliz excepción (Invalid provider type specified.) al intentar obtener la propiedad PrivateKey de una instancia de X509Certificate.

Esto ocurre, como bien se explica en este post debido a que la forma en que Windows Vista y Seven almacenan este tipo de certificado - utilizando Microsoft Software Key Storage Provider - solamente está soportado por CryptoAPI, pero no por las librerías provistas por .NET Framework 4.0 o anterior.

La forma de solucionar esto es utilizando las librerías provistas por los amigos del equipo de CLR Security:

  • Incluir "using Security.Cryptography.X509Certificates;" en el archivo que utilizará los certificados para traer los extension methods para la clase X509Certificate2
  • Preguntar por HasCngKey() en la instancia de X509Certificate2 para saber si la clave esta almacenada de esta forma. En caso afirmativo, crear una nueva instancia de RSACng utilizando el método GetCngPrivateKey() como parámetro.
Hasta la próxima!

Zaiden


2010-05-28

Indignado

Acabo de leer este articulo en OSNews y quedé completamente indignado.

Como puede ser que haya gente cuyo único motivo para vivir sea molestar a otros porque tal o cual código fue creado bajo una licencia que - supuestamente - le da libertades, pero resulta que el programa o código no puede ser publicado en tal o cual lugar o, por ejemplo, no puede hacer linkeo a código propietario o - peor aún - otro código supuestamente tambien libre, pero con libertad distinta, por lo que por incompatibilidades de licencia no se pueden usar.

Estamos todos locos acaso???

Por este motivo decidí hacer explícito algo que di por sentado todo este tiempo con respecto al código publicado aca, y por el cual comenzaré a hacer campaña a favor:

Diga NO al uso de licencias como la GPL y SI a la WTFPL, también conocida como Do What The Fuck You Want To Public Licence (http://en.wikipedia.org/wiki/WTFPL)

Básicamente, esta licencia dice que cualquiera puede hacer lo que quiera con el código.

ESO es libertad.
Ma' que GPL ni ocho cuartos...

He dicho.

Zaiden


Presentación de Visual Studio 2010

El jueves estuvimos haciendo la presentación de Visual Studio 2010 en el aula magna de la UAI junto con Rodolfo Finochietti, Martín Salías, Miguel Saez, Victor Passador y la gente del MUG

Dejo aca para que bajen la presentación y los ejemplos de código.

Saludos!
Zaiden

2010-04-11

iTip: Velocidad en el iPhone

Paso un pequeño tip para aumentar la velocidad general del iPhone (al menos, en el 3G). Vaciar de forma regular las llamadas y SMSs recientes.
Después de hacerlo pude notar una mejora considerable en la performance del teléfono.

Gracias Johnny por la data!

Zaiden

2010-03-22

Ya no funciona el boton de los auriculares del iPhone? No estés tan seguro...

Después de unos seis meses de estar usando sin problema los auriculares con micrófono y "click-control" del iPhone, de un día para el otro dejaron de funcionar para atender llamadas y pasar los temas la iPod app.

Mucha gente me había comentado que después de un tiempo empezaron a tener este problema y como en nuestro amado país argentino - también conocido como La Porongonia Rebelde - los Apple Resellers no se pueden hacer cargo del service de los iPhones, ya que eso es tarea de la compañía de celulares que lo vendió, pero Claro insiste en que no pueden hacer nada, la gente en general decide que la "vida útil" del botón caducó.

Mentiras!

Resulta que el iPhone tiene su propio ombligo, y el mismo - como buen ombligo - se llena de pelusa.

Si llegan a tener este problema, existe una buena chance de que revolviendo con un clip por el agujero de los auriculares saquen una gran bola de mugre acumulada, la cual parece ser inofensiva para el uso normal de los auriculares y, sin embargo, letal para su boton mágico.

Bueno, espero que les sirva esto antes de ir corriendo a comprar auriculares nuevos.

Saludos!
Zaiden


2010-03-17

Slides de la charla: .NET 4 a Fondo!

El último lunes, junto a Rodo y Max, dimos la charla ".NET 4 a Fondo!" en el aula magna de la UAI, auspiciada por el MUG.

En la misma hicimos una repasada por las principales características de la próxima versión de .NET Framework, mostrando la versión RC de Visual Studio 2010 (la cual, debo decir, mejoró muchísimo desde las betas... sobre todo en la velocidad) y explicando con mas detenimiento las nuevas características relacionadas a programación dinámica dentro de C# 4, programación en paralelo y Code Contracts.

Aca les dejo los slides y ejemplos de la charla para bajarlos.

Saludos!
Zaiden


2009-12-31

Nueva (y por ahora última) versión de TweetMyFace

Ya está la versión Release (1.1) de TweetMyFace.

La pueden bajar de acá: http://tweetmyface.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37990

Saludos!
Zaiden


2009-12-23

Recibí tus notificaciones de Facebook por Twitter: TweetMyFace

En estos días quise hacer un pequeño experimento con el API de Facebook para C# y el resultado fue TweetMyFace

La idea de esta aplicación crear un nuevo usuario de Twitter que se utilizará para publicar las notificaciones que recibe un usuario de Facebook.

Idealmente, el único seguidor de este usuario de Twitter será el mismo dueño de la cuenta de Facebook que se está monitoreando, por lo que podrá recibir en su cliente de Twitter favorito todas las notificaciones de Facebook al instante.

Si, ya se... no tiene mucha utilidad, pero fue lo que salió.

Saludos!
Zaiden

2009-12-15

Un pequeño paso para el hombre, un gran paso para el Mono!

Como bien dice el título, hoy es un gran día para Mono!
Aca de publicarse la versión 2.6 del Mono Framework (implementación libre y multiplataforma de .NET) junto con la versión 2.2 de MonoDevelop (IDE)

Dentro de la extensa lista de features - la cual pueden ver en www.go-mono.com - dos de ellas llamaron poderosamente mi atención:

  • Soporte e integración del debugger en MonoDevelop en las tres plataformas principales (si, si: esto incluye Mac OS X!)
  • Soporte básico para LINQ-2-SQL gracias al proyecto DBLinq

Esto quiere decir que la factibilidad de realizar proyectos importantes en .NET abstrayéndose de la plataforma acaba de dos pasos gigantescos!

Por lo poco que probé el debugger funcionó bastante bien, llevando al olvido mis incontables horas de PRINTF-Oriented-Debugging sobre .NET en OS X.

Los ejemplos básicos que pude probar de LINQ-2-SQL funcionaron perfectamente e incluso proyectos como NerdDinner se pueden ejecutar sin problemas con un simple click en el botón de Debug de MonoDevelop (siempre y cuando tengamos acceso a una base SQL Server, obviamente).

Intenté llevar un paso mas adelante el funcionamiento de la nueva implementación de esta API al intentar ejecutar el proyecto en el cual estoy trabajando actualmente, solo para encontrarme que aún no está implementado el uso de DataLoadOptions en el DataContext de SQL, por lo que eso tendrá que esperar un tiempo más.

Igualmente, muchas felicitaciones al equipo de Mono por el gran trabajo que hacen día a día!

Tanto Mono Framework como MonoDevelop pueden ser descargados desde el sitio oficial de mono: http://www.go-mono.com

Saludos!
Zaiden


2009-11-25

Run Reloaded - Ejemplos

Durante el día de hoy estuve dando una charla junto a Diego Gonzalez sobre las novedades de C# 4.0, .NET 4.0 Visual Studio 2010 en el marco del evento de Microsoft Run Reloaded.

Dejo para poder bajar, retocar e investigar los ejemplos de código que utilizamos durante la sesión.

La presentación la pueden bajar aca

Un saludo!
Zaiden


2009-10-14

Nuevo proyecto: zInject, o "Cómo hacer Inyección de Código para cualquier hijo de vecino"

Hace tiempo que tenía la idea de hacer un programa para poder inyectar código sobre assemblies ya compiladas dando vueltas por la cabeza. Finalmente, hoy fue el día de crear su versión 0.1

Les presento zInject!

Cual es la idea detrás de esto? Simple...
Supongamos que yo tengo un proyecto hecho y derecho, con una clase cuyos métodos son M1, M2 y M3.


public class M
{
public void M1()
{
...
}

public void M2()
{
...
}

public void M3()
{
...
}
}


Un día viene el jefe y me dice: "De ahora en mas, tenemos que verificar cuanto demora la ejecución de los siguientes métodos: M1, M2 y M3.
En ese momento uno piensa: "Bien, tendría que hacer nuevos métodos que se ejecuten antes y después de M1, M2 y M3 y que los mismos calcules cuanto tardó cada ejecución.


public class M
{
public void M1()
{
Empezo("M1");
...
Termino("M1");
}

public void M2()
{
Empezo("M2");
...
Termino("M2");
}
    public void M3()
{
Empezo("M3");
...
Termino("M3");
}
}

Esto trae una serie de problemas. Agregar esto ensucia el código de M1, M2 y M3 por las llamadas a los nuevos métodos al principio y al final. Peor aún, si tengo que agregar nuevos "comportamientos" al principio o al final del método, el código termina siendo incomprensible! Ni hablar en caso de que cada comportamiento (como seguridad o auditoria) a agregar implique mas de una sola linea de código...

Para solucionar llega zInject.
Para usarlo, definimos un atributo que hereda de InjectionBaseAttribute


    
public class TiempoAttribute : InjectionBaseAttribute
{
public TiempoAttribute()
{
}
        public override void BeforeExecute(string method, object target)
{
Empezo(method);
}
        public override void AfterExecute(string method, object target)  
{
Termino(method);
}
}

Después, simplemente agregamos el atributo a los métodos que se desea:


public class M
{
[Tiempo]
public void M1()
{
...
}

[Tiempo]
public void M2()
{
...
}

[Tiempo]
public void M3()
{
...
}
}

Ahora, dirán... Todo muy lindo, pero... ¿Cómo se ejecuta el código del atributo?

Para poder hacer esto hay que ejecutar el injector propiamente dicho. Esto se puede hacer tanto ejecutándolo desde linea de comandos una vez compilado el assembly, como usando una Post Build Action dentro de Visual Studio. Esta utilidad agregará dentro del IL del assembly las llamadas necesarias a los metodos ExecuteBefore y ExecuteAfter

To Do:

  • Evitar totalmente el uso de Reflection. Actualmente, el código inyectado utiliza reflection para ejecutar las acciones de los atributos, simplemente por simplicidad del desarrollo. A futuro, se inyectará directamente la llamda al atributo concreto.
  • Poder customizar cuales atributos aplicar y cuales no
  • UI para Windows/OS X/Linux
  • Quitar dependencias contra librerías externas

Les dejo la dirección del proyecto en CodePlex para bajar los binarios compilados y el código completo para bajarlo con sus tests para bajarlo y ver como se usa.

http://zInject.codeplex.com

Cualquier sugerencia es bienvenida!

Saludos!
Zaiden


2009-10-08

Interoperabilidad de WebServices con certificados entre .NET con WSE y Java

Pese a que el "espíritu" del standard de WebServices, WS-Security, y demas yerbas planteadas en las RFC supondrían una facilidad para la interoperabilidad ente diferentes plataformas, al intentar llevarlas a la realidad las asperezas surgen... y explotan en nuestra cara.

Hace un tiempo, en Lagash tuvimos que implementar un TokenManager (entre otras cosas) para poder traducir los llamados hechos desde WSE 3 a Java, utilizando certificados de seguridad.

Luego de estar funcionando sin problemas por casi dos años, el servicio comenzó a fallar al momento de recibir la respuesta de un pedido, con un mensaje que decía "WSE590: Failed to resolve the following key info"... y mostraba uno de los nodos de Key Info, conteniendo supuestamente el Subject Key Identifier del certificado necesario para desencriptar el mensaje.

El problema resultó ser que, dado que el nuevo certificado que comenzaron a usar no contenía la extensión de Subject Key Identifier, para poder identificarlo, tanto Java como WSE generaban un hash del certificado. El gran problema gran era que los hashes eran calculados de forma distinta!

Para poder solucionarlo, dentro del input filter de los mensajes hubo que reemplazar la porción de SOAP que indica el certificado a utilizar por una creada a mano que indique el certificado concreto (que, de hecho, siempre es el mismo que se utiliza al enviar el mensaje original).

Para mas información: http://support.microsoft.com/kb/922779/en-us (el problema no es exactamente el mismo, pero el approach para solucionarlo es muy similar).

Saludos!

Zaiden


2009-10-04

WPF y VMWare Fusion

Si alguna vez tratan de usar WPF desde una maquina virtual en VMWare Fusion, notarán que la aplicación se torna inusable.
Para poder solucionar esto hay que desactivar la aceleración por hardware de WPF dentro de la VM. Esto se hacer creando el siguiente DWORD dentro del registro de windows:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration
y seteando su valor a 1.

Fuente: http://blog.joachim.at/?p=19


2009-09-27

Extensiones para Monobjc

Aca dejo para bajar los fuentes de zPod.Objc.dll, librería que contiene la implementación de la clase KVCBase y algunos helpers para trabajar con Monobjc en la Mac.

Saludos!
Z

2009-09-26

Yapa

Como yapa, dejo también la presentación de la charla introductoria a ASP.NET MVC que dimos con RodoF en la UTN de Rosario el viernes

ASP.NET MVC


CodeCamp 2009

Para quienes no pudieron ir a alguna de las charlas del CodeCamp 2009 en las que participe, o quieren repasar el contenido, dejo disponible lo mostrado en el evento.

Saludos!

Monos y Manzanas - Programando para Mac en .NET

Conociendo al Dúo Dinámico: C# 4 y VS2010


2009-08-07

NerdDinnerBA: conclusión 2

El beber es perjudicial para la salud

NerdDinnerBA: conclusión 1

Definición de JavaScript:
- lenguaje de los conejos
- madriguera

Z