tag:blogger.com,1999:blog-30335484148316373552024-03-05T06:39:03.171-03:00zPodEl blog amigo del Nerd modernoZaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.comBlogger113125tag:blogger.com,1999:blog-3033548414831637355.post-8640302546778739882011-05-16T00:58:00.001-03:002011-05-16T00:58:06.572-03:00Update para el archivo de hosts<p style="clear: both">Para quienes deseen seguir teniendo una internet mas feliz, les dejo un update de mi archivo de hosts redirigiendo las urls de muchos adservers a 127.0.0.1:</p><p style="clear: both">127.0.0.1 ads.e-planning.net<br />127.0.0.1 ads.us.e-planning.net<br />127.0.0.1 codenew.impresionesweb.com<br />127.0.0.1 ads.doubleclick.net<br />127.0.0.1 ad.doubleclick.net<br />127.0.0.1 pubads.g.doubleclick.net<br />127.0.0.1 googleads.g.doubleclick.net<br />127.0.0.1 pagead2.googlesyndication.com<br />127.0.0.1 api.ad.ly<br />127.0.0.1 api.140proof.com<br />127.0.0.1 api.ads.oneriot.com<br />127.0.0.1 echofonads.appspot.com<br />127.0.0.1 ds.clickexperts.net<br />127.0.0.1 ad.metanetwork.com<br />127.0.0.1 d2.zedo.com<br />127.0.0.1 ad.harrenmedianetwork.com<br />127.0.0.1 ads.intextual.net<br />127.0.0.1 s0.2mdn.net<br />127.0.0.1 content.yieldmanager.edgesuite.net<br />127.0.0.1 adserving.cpxinteractive.com<br />127.0.0.1 deMR.opt.fimserve.com<br />127.0.0.1 bs.serving-sys.com</p><p style="clear: both">Hasta la próxima!<br /><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-13209346148287088642011-04-10T21:44:00.001-03:002011-04-10T21:44:35.980-03:00Material de la última charla de C# 4 y .NET 4<p style="clear: both">Les dejo el material de la última charla que dimos con RodolfoF en el MUG sobre C# 4, .NET 4 y unos pequeños avances de la próxima versión de C#!</p><p style="clear: both">Lo pueden bajar de <a href="http://prototypes.shockbyte.com.ar/misc/MUG_CSharp.zip" target="_blank">aca</a>.<u><br /></u></p><p style="clear: both">Hasta la próxima!</p><p style="clear: both"><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com1tag:blogger.com,1999:blog-3033548414831637355.post-6097287859200020502011-03-21T10:50:00.001-03:002011-03-21T10:50:49.793-03:00Material de la charla del Run WebCamp 2011<p style="clear: both">Les dejo el material que usamos con RodoF durante la charla del Run WebCamp 2011.</p><p style="clear: both">Link: <a href="http://www.mediafire.com/file/jue4b8cij5hn997/MaterialWebcamp.zip" target="_blank">Material WebCamp</a><u><br /></u></p><p style="clear: both">Saludos!</p><p style="clear: both"><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-73719978370005389512011-01-09T15:35:00.001-03:002011-01-09T15:35:01.408-03:00Como usar Netflix desde afuera de USA<p style="clear: both">Desde hace mas o menos un mes, estoy subscripto a <em>Netflix</em>, el servicio de streaming <em>legal</em> de películas mas popular de Estados Unidos. El único inconveniente es que, pese a ser un excelente servicio y tener un muy buen precio (8 US$ al mes, cantidad de películas ilimitadas por streaming), solo está disponible accediéndolo desde USA o Canada.<br />Por suerte, la forma para verificar la ubicación de cada cliente no es ta <em>estricta</em> como debería, y los chequeos solo se hacen en ciertos momentos de la navegación por el sitio.</p><p style="clear: both">A continuación les cuento como hacer para poder suscribirse a Netflix desde Argentina (o cualquier otro lugar fuera de los Estados Unidos) y poder utilizarlo sin problemas:</p><p style="clear: both">Primero que todo debemos poder saltear la verificación de ubicación geográfica. Para esto, registramos una cuenta en <a href="http://www.overplay.net" target="_blank">OverPlay</a>. OverPlay es un servicio pago que provee VPNs de alta velocidad por todo el mundo y - atentos a esto - <em>una VPN de baja velocidad gratuita a USA</em>.<br />Con la cuenta de OverPlay, bajamos de la página el cliente correspondiente a nuestro sistema operativo para conectarse a las VPNs de OverPlay, lo abrimos y elegimos la que diga <em>USA-Free</em>. Nos conectamos ingresando el usuario y contraseña recién registrados y listo: toda navegación que hagamos de acá en adelante pasará por la VPN y los servidores a los que nos conectemos creerán que tenemos una conexión de aproximadamente 1Mbps.</p><p style="clear: both">Una vez conectados a la VPN, deben crear una nueva cuenta en <a href="http://www.netflix.com" target="_blank">http://www.netflix.com</a>. Para poder hacerlo deberán pagar con tarjeta de crédito e indicar alguna dirección dentro de USA. Pueden buscar cualquier dirección en las páginas amarillas o similar, ya que solamente es necesaria para el plan de envío de DVDs a casa, que no vamos a usar por razones obvias.</p><p style="clear: both">El plan a elegir es, como comenté antes, el de películas únicamente por streaming, a 8 US$ por mes, con el primer mes gratis.</p><p style="clear: both">Con la VPN activa y la cuenta de Netflix ya creada, solamente nos resta ver nuestra primer película. Pero acá aparece otro problema: ¿Cómo vamos a ver bien una película por streaming si, como mucho, tenemos 1 Mbps de conexión?</p><p style="clear: both">En este momento van a comprender por que dije que la verificación de ubicación geográfica no es tan estricta como debería: en el momento que hacemos click en el botón de <em>Play</em> para ver la película se cargará el player Silverlight de Netflix y empezará a mostrar información de status sobre la carga de la película. La clave de todo este método es, en el momento que aparezca el mensaje <em>Downloading movie information</em>, desconectarnos lo mas rápido posible de la VPN y de esta manera, el proceso de streaming se hará directamente por nuestra conexión, sin pasar por la VPN.</p><p style="clear: both">Listo! Espero que esto les sirva a todos los que quieran utilizar un servicio de primer mundo, a 10000Km de distancia.</p><p style="clear: both">Hasta la próxima!<br /><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com6tag:blogger.com,1999:blog-3033548414831637355.post-52852414448173643152011-01-08T13:59:00.001-03:002011-01-08T13:59:46.911-03:00Nuevo chiche y una mejor forma de ver la Internet<p style="clear: both">Buenas! Este post tiene dos partes:</p><ol style="clear: both"><li><strong>Tengo chiche nuevo!</strong> <br />Cambié la MacBook Pro de 13 pulgadas que tenía por la nueva MacBook Air de 11. Por ahora muy contento, así que después de darle un poco mas de uso escribiré alguna mini-reseña para compradores indecisos.<br /></li><li>Dejo acá una nueva actualización para el archivo de hosts de sus computadores, para que puedan evitar todo tipo de publicidad dentro de los sitios web que visiten, independientemente de la plataforma o browser que usen. <br />Para el que no sepa mucho de que estoy hablando, peguen las lineas que dejo a continuación en el archivo <em>/etc/hosts</em> en OS X o cualquier variante de Unix, Linux, BSD o similar, o en <em>C:\Windows\System32\Drivers\etc\hosts</em> en cualquier versión de Windows.<br /></li></ol><p style="clear: both">Archivo de hosts:</p><blockquote style="clear: both"><p>127.0.0.1 ads.e-planning.net<br />127.0.0.1 codenew.impresionesweb.com<br />127.0.0.1 ads.doubleclick.net<br />127.0.0.1 pubads.g.doubleclick.net<br />127.0.0.1 googleads.g.doubleclick.net<br />127.0.0.1 pagead2.googlesyndication.com<br />127.0.0.1 api.ad.ly<br />127.0.0.1 api.140proof.com<br />127.0.0.1 api.ads.oneriot.com<br />127.0.0.1 ds.clickexperts.net<br />127.0.0.1 ad.metanetwork.com<br />127.0.0.1 d2.zedo.com</p></blockquote><p style="clear: both">Hasta la próxima!<br /><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-30993687382300106632010-11-15T15:29:00.001-03:002010-11-15T15:29:56.605-03:00Material de la charla de Azure Worker RolesA pesar de la tardanza, les dejo para bajar el material del bootcamp que dimos junto a mi <em>baticompañero</em> <a href="http://weblogs.shockbyte.com.ar/rodolfof" target="_blank">Rodolfo Finochietti</a> sobre Azure Worker Roles.<br /><div><br /><a href="http://prototypes.shockbyte.com.ar/misc/Azure_Worker_Role.zip" target="_blank">Material para bajar</a></div><div><br />Saludos!<br /><strong>Zaiden</strong></div><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-64021655623557043802010-09-08T17:45:00.001-03:002010-09-11T10:14:56.348-03:00Ejemplos y slides del Codecamp 2010<p style="clear: both">Lo prometido es deuda: dejo acá para que bajen los slides y ejemplos de las charlas que di en el CodeCamp 2010 junto a <em>Rodolfo Finochietti</em> y <em>Ariel "Fuera de Pista" Krakovsky.</em><br /><br />"Como hacer sitios a-la-Facebook con ASP.NET MVC": <a href="http://www.mediafire.com/file/rk8z94kcb92h8mu/SitiosALaFacebookMVC.zip" target="_blank">slides y ejemplos</a>.<br /> "Patos y abogados trabajando en paralelo" (Nuevos features de .NET 4 y C# 4): <a href="http://www.mediafire.com/file/yimdzqjnwtz/Net4Samples.zip" target="_blank">ejemplos</a> y <a href="http://www.mediafire.com/file/axbb2fdddgxv5dx/Presentacion%20VS2010.pptx" target="_blank">slides</a>.</p><p style="clear: both">"ASP.NET MVC 2 (y 3!)": <a href="http://prototypes.shockbyte.com.ar/misc/CodeCamp2010_ASP_NET_MVC.zip" target="_blank">ejemplos y slides</a>.</p><p style="clear: both">Hasta la próxima!<br /><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-88603484872912168102010-08-16T10:51:00.001-03:002010-08-16T10:51:12.529-03:00Ejemplos y presentación de la charla: NextWeb - La web está cambiando, ASP.NET también<p style="clear: both">Les dejo para bajar los ejemplos de ASP.NET MVC, Comet y Razor que estuvimos mostrando en la charla del 11 de agosto con mis compañeros de <a href="http://www.lagash.com" target="_blank">Lagash</a> <a href="http://weblogs.shockbyte.com.ar/rodolfof" target="_blank">Rodolfo Finochietti</a> y Diego Gonzalez y <a href="http://blogs.msdn.com/b/masaez/" target="_blank">Miguel Angel Saez</a> por parte de Microsoft</p><p style="clear: both">Presentación: <a href="http://www.mediafire.com/file/b3bayl9flv5r23c/nextWeb%20ASP.NET%20MVC%203.pptx" target="_blank">acá</a>.<br />Ejemplos: <a href="http://www.mediafire.com/file/4al4akc9068dzc3/nextWebSamples.zip" target="_blank">acá</a>.</p><p style="clear: both">Hasta la próxima!<br /><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-52052289566534746162010-07-07T00:56:00.003-03:002010-07-07T01:05:17.302-03:00Nuevo chiche: iPad!Después de estar todo un día jugando con este chiche nuevo, debo decir tres cosas:<br /><br />1. Steve tenía razón, es mágico<br />2. Es increíble el esfruezo y dedicación que le pone la gente que hace toda la hackatoneria (Nota del autor: no se debe usar la palabra pirata en estos casos. Un pirata es un tipo que roba barcos, tiene loros y le falta una pata) para los iDevices. Pocas apps funcionan tan bien como las relacionadas con este mundillo!<br />3. Escribir en esta porquería es bastante mas cómodo de lo que pensaba!!<br /><br />Hasta la próxima!<br /><span style="font-weight:bold;">Zaiden</span>Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com2tag:blogger.com,1999:blog-3033548414831637355.post-77523290391430203582010-06-23T15:33:00.001-03:002010-06-23T15:33:13.323-03:00StringWriter y con distintos Encodings<p style="clear: both">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.</p> <p style="clear: both">El problema fue que yo me encargaba de bajar el stream del archivo, lo retocaba un poco y luego lo pasaba desde un <em>XDocument</em> a un string utilizando un <em>StringWriter</em>, entonces al escribir el string, lo hacía agregando el header de XML de <em>encoding="utf-16"</em>. 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 <em>StreamWriter</em>, utilizando los constructores mas simples, sin tener que especificar encodings.</p> <p style="clear: both">Dado que StringWriter no permite modificar el encoding que utiliza, la solución fue crear una subclase de <em>StringWriter</em> y hacer <em>override</em> de la propiedad <em>Encoding</em>.</p> <p style="clear: both">La pequeña clase quedó asi:</p> <pre><br />class UTF8StringWriter : StringWriter<br />{<br /> public override System.Text.Encoding Encoding<br /> {<br /> get<br /> {<br /> return System.Text.Encoding.UTF8;<br /> }<br /> }<br />}<br /></pre> <p style="clear: both">Espero que les sea útil!</p> <p style="clear: both"><strong>Zaiden</strong></p> <p style="clear: both"></p> <br class="final-break" style="clear: both" />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com1tag:blogger.com,1999:blog-3033548414831637355.post-80230695369884597252010-06-21T16:42:00.001-03:002010-06-21T16:42:40.153-03:00Problemas al querer cargar un XML de un string Unicode<p style="clear: both">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".</p><p style="clear: both">El string obtenido provenía de un stream, el cual se iba leyendo de a partes.</p><p style="clear: both">Luego de varias idas y vueltas, encontré finalmente la casua del problema: al escribirse el stream original, se estaba haciendo lo siguiente:</p><pre style="clear: both">var writer = new StreamWriter(stream, Encoding.Unicode);<br />writer.Write(text);<br /></pre><p style="clear: both">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.</p><p style="clear: both">Para poder solucionar esto, bastó con reemplazar las lineas en la que se crea y usa el StreamWriter, por la siguiente:</p><pre style="clear: both">var writer = new StreamWriter(stream, new UnicodeEncoding(false, false));<br />writer.Write(text);<br /></pre><p style="clear: both">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</p><p style="clear: both">Espero poder ayudar a alguien con esto. <br />Saludos!</p><p style="clear: both"><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-87618967712358607762010-06-07T11:45:00.001-03:002010-06-07T11:45:46.420-03:00Uso de certificados emitidos por Windows 2008 R2 desde .NET Framework<p style="clear: both">Si tienen la suerte de tener que utilizar certificados con un template <em>v3</em> desde <em>Windows Vista o superior</em>, y los mismos fueron emitidos por un <em>Windows Server 2008 R2</em>, se encontrarán con una feliz excepción (<em>Invalid provider type specified.</em>) al intentar obtener la propiedad PrivateKey de una instancia de X509Certificate.</p><p style="clear: both">Esto ocurre, como bien se explica en <a href="http://blogs.msdn.com/b/alejacma/archive/2009/12/22/invalid-provider-type-specified-error-when-accessing-x509certificate2-privatekey.aspx" target="_blank">este post</a> debido a que la forma en que <em>Windows Vista y Seven</em> almacenan este tipo de certificado - utilizando <em>Microsoft Software Key Storage Provider</em> - solamente está soportado por <em>CryptoAPI</em>, pero no por las librerías provistas por <em>.NET Framework 4.0</em> o anterior.</p><p style="clear: both">La forma de solucionar esto es utilizando las librerías provistas por los amigos del equipo de <a href="http://www.codeplex.com/clrsecurity" target="_blank">CLR Security</a>:</p><p style="clear: both"><ul style="clear: both"><li>Incluir "<em>using Security.Cryptography.X509Certificates;</em>" en el archivo que utilizará los certificados para traer los extension methods para la clase <em>X509Certificate2</em><br /></li><li>Preguntar por <em>HasCngKey()</em> en la instancia de <em>X509Certificate2</em> para saber si la clave esta almacenada de esta forma. En caso afirmativo, crear una nueva instancia de <em>RSACng</em> utilizando el método <em>GetCngPrivateKey()</em> como parámetro.<br /></li></ul>Hasta la próxima!</p><p style="clear: both"><strong>Zaiden</strong> <br /><br /></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-21186671788022889872010-05-28T23:23:00.001-03:002010-05-28T23:23:55.632-03:00Indignado<p style="clear: both">Acabo de leer <a href="http://www.osnews.com/story/23376/FSF_Apple_s_iTunes_Store_Terms_of_Service_at_Odds_with_GPL" target="_blank">este</a> articulo en OSNews y quedé completamente indignado.</p><p style="clear: both">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 <em>libertad distinta</em>, por lo que por incompatibilidades de licencia no se pueden usar.</p><p style="clear: both">Estamos todos locos acaso???</p><p style="clear: both">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:</p><blockquote style="clear: both"><p>Diga NO al uso de licencias como la GPL y SI a la WTFPL, también conocida como <strong>Do What The Fuck You Want To Public Licence</strong> (<a href="http://en.wikipedia.org/wiki/WTFPL" target="_blank">http://en.wikipedia.org/wiki/WTFPL</a>)<br /></p></blockquote><p style="clear: both">Básicamente, esta licencia dice que cualquiera puede hacer <em>lo que quiera</em> con el código.</p><p style="clear: both"><em>ESO</em> es libertad. <br /><em>Ma' que GPL ni ocho cuartos...<br /></em></p><p style="clear: both">He dicho.</p><p style="clear: both"><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-89615153862677885622010-05-28T18:13:00.001-03:002010-05-28T18:13:52.969-03:00Presentación de Visual Studio 2010El jueves estuvimos haciendo la presentación de Visual Studio 2010 en el aula magna de la UAI junto con <a href="http://weblogs.shockbyte.com.ar/" target="_blank">Rodolfo Finochietti</a>, <a href="http://blog.salias.com.ar/" target="_blank">Martín Salías</a>, <a href="http://blogs.msdn.com/b/masaez/" target="_blank">Miguel Saez</a>, Victor Passador y la gente del <a href="http://www.mug.org.ar/" target="_blank">MUG</a><br /><div><br />Dejo aca para que bajen la <a href="http://www.mediafire.com/?tgurfbzjloz" target="_blank">presentación</a> y los <a href="http://www.mediafire.com/file/yimdzqjnwtz/Net4Samples.zip" target="_blank">ejemplos de código</a>.<br /></div><div><br />Saludos!<br /><strong>Zaiden</strong> </div><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-14891557506143916862010-04-11T03:00:00.001-03:002010-04-11T03:00:25.620-03:00iTip: Velocidad en el iPhonePaso 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.<br /><div>Después de hacerlo pude notar una mejora considerable en la performance del teléfono.<br /></div><div><br />Gracias <a href="http://blogs.southworks.net/jhalife/" target="_blank">Johnny</a> por la data!<br /></div><div><br /><strong>Zaiden</strong></div><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-175318385183229232010-03-22T18:53:00.001-03:002010-03-22T18:53:25.641-03:00Ya no funciona el boton de los auriculares del iPhone? No estés tan seguro...<p style="clear: both">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.</p><p style="clear: both">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 <em>La Porongonia Rebelde</em> - 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ó.</p><p style="clear: both">Mentiras!</p><p style="clear: both">Resulta que el iPhone tiene su propio ombligo, y el mismo - como buen ombligo - se llena de pelusa.</p><p style="clear: both">Si llegan a tener este problema, existe una buena chance de que <em>revolviendo</em> 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.</p><p style="clear: both">Bueno, espero que les sirva esto antes de ir corriendo a comprar auriculares nuevos.</p><p style="clear: both">Saludos!<br /><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com21tag:blogger.com,1999:blog-3033548414831637355.post-51673744380580488772010-03-17T09:38:00.001-03:002010-03-21T18:40:50.023-03:00Slides de la charla: .NET 4 a Fondo!<p style="clear: both">El último lunes, junto a <a href="http://weblogs.shockbyte.com.ar/" target="_blank">Rodo</a> y Max, dimos la charla ".NET 4 a Fondo!" en el aula magna de la UAI, auspiciada por el MUG.</p><p style="clear: both">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.</p><p style="clear: both">Aca les dejo los <a href="http://www.mediafire.com/file/ny2kjinemzg/Net4AFondo.pptx.zip" target="_blank">slides</a> y <a href="http://www.mediafire.com/file/yimdzqjnwtz/Net4Samples.zip" target="_blank">ejemplos</a> de la charla para bajarlos.<br /><br />Saludos!<br /><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-25900948153504541762009-12-31T11:46:00.001-03:002009-12-31T11:46:44.166-03:00Nueva (y por ahora última) versión de TweetMyFace<p style="clear: both">Ya está la versión Release (1.1) de <strong>TweetMyFace</strong>.</p><p style="clear: both">La pueden bajar de acá: <a href="http://tweetmyface.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37990" target="_blank">http://tweetmyface.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37990</a><u><br /></u></p><p style="clear: both">Saludos!<br /><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-39670056521295676052009-12-23T12:15:00.001-03:002009-12-23T12:15:51.970-03:00Recibí tus notificaciones de Facebook por Twitter: TweetMyFaceEn estos días quise hacer un pequeño experimento con el API de Facebook para C# y el resultado fue <strong>TweetMyFace</strong><strong><br /></strong><div><br />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.<br /></div><div><br />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.<br /></div><div><br />Si, ya se... no tiene mucha utilidad, pero fue lo que salió.<br /></div><div><br />Lo pueden bajar de: <a href="http://tweetmyface.codeplex.com" title="TweetMyFace" target="_blank">http://tweetmyface.codeplex.com</a><u><br /></u></div><div><br style="text-decoration: underline;" />Saludos!<br /><strong>Zaiden</strong></div><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-13485944445645255842009-12-15T21:20:00.001-03:002009-12-16T22:23:20.522-03:00Un pequeño paso para el hombre, un gran paso para el Mono!<p style="clear: both">Como bien dice el título, hoy es un gran día para Mono!<br />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)</p><p style="clear: both">Dentro de la extensa lista de features - la cual pueden ver en <a href="http://www.go-mono.com" title="GoMono!" target="_blank">www.go-mono.com</a> - dos de ellas llamaron poderosamente mi atención:</p><ul style="clear: both"><li>Soporte e integración del debugger en MonoDevelop en las tres plataformas principales (si, si: esto incluye <strong>Mac OS X</strong>!)<br /></li><li>Soporte básico para LINQ-2-SQL gracias al proyecto DBLinq<br /></li></ul><p style="clear: both">Esto quiere decir que la factibilidad de realizar proyectos importantes en .NET abstrayéndose de la plataforma acaba de dos pasos gigantescos!<br /> <br />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.</p><p style="clear: both">Los ejemplos básicos que pude probar de LINQ-2-SQL funcionaron perfectamente e incluso proyectos como <strong>NerdDinner</strong> se pueden ejecutar sin problemas con un simple <em>click</em> en el botón de <em>Debug</em> de MonoDevelop (siempre y cuando tengamos acceso a una base SQL Server, obviamente).</p><p style="clear: both">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 <em>DataLoadOptions</em> en el <em>DataContext</em> de SQL, por lo que eso tendrá que esperar un tiempo más.</p><p style="clear: both">Igualmente, muchas felicitaciones al equipo de Mono por el gran trabajo que hacen día a día!</p><p style="clear: both">Tanto Mono Framework como MonoDevelop pueden ser descargados desde el sitio oficial de mono: <a href="http://www.go-mono.com" title="GoMono!" target="_blank">http://www.go-mono.com</a><u><br /></u></p><p style="clear: both">Saludos!<br /><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-79418509810889865172009-11-25T00:29:00.000-03:002009-11-25T14:22:06.728-03:00Run Reloaded - Ejemplos<p style="clear: both">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 <em>Microsoft</em> <strong>Run Reloaded</strong>.</p><p style="clear: both"><div>Dejo para poder bajar, retocar e investigar los ejemplos de código que utilizamos durante la sesión.</div></p><p style="clear: both"><div><br /><a href="http://www.mediafire.com/?5dz4bmwr3mx" title="Code Contracts" target="_blank">Code Contracts</a><br style="text-decoration: underline;" /><a href="http://www.mediafire.com/?mzjdwtjtjmi" title="DynamicObject" target="_blank">DynamicObject</a><br style="text-decoration: underline;" /><a href="http://www.mediafire.com/?tzj2nmn2qtn" title="Tasks y DLR" target="_blank">Tasks y DLR</a></div></p><p style="clear: both">La presentación la pueden bajar <a href="http://www.mediafire.com/?mdnfmwq3wyw" title=".NET 4.0" target="_blank">aca</a></p><p style="clear: both"></p><p style="clear: both"><div>Un saludo!<br /><strong>Zaiden</strong></div></p><p style="clear: both"></p><p style="clear: both"></p><p style="clear: both"></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-79757648795855712009-10-14T23:28:00.001-03:002009-10-14T23:31:10.477-03:00Nuevo proyecto: zInject, o "Cómo hacer Inyección de Código para cualquier hijo de vecino"<p style="clear: both">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</p><p style="clear: both">Les presento <strong>zInject</strong>!</p><p style="clear: both">Cual es la idea detrás de esto? Simple...<br />Supongamos que yo tengo un proyecto <em>hecho y derecho</em>, con una clase cuyos métodos son M1, M2 y M3.</p><pre style="clear: both"><br />public class M<br />{<br /> public void M1()<br /> {<br /> ...<br /> }<br /> <br /> public void M2()<br /> {<br /> ...<br /> }<br /> <br /> public void M3()<br /> {<br /> ...<br /> }<br />}<br /></pre><p style="clear: both"><br /> 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.<br />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.<br /><br /></p><pre style="clear: both"><br />public class M<br />{<br /> public void M1()<br /> {<br /> Empezo("M1");<br /> ...<br /> Termino("M1");<br /> }<br /> <br /> public void M2()<br /> {<br /> Empezo("M2");<br /> ...<br /> Termino("M2");<br /> }<br /></pre><pre style="clear: both"> public void M3()<br /> {<br /> Empezo("M3");<br /> ...<br /> Termino("M3");<br /> }<br />}<br /></pre><p style="clear: both">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...</p><p style="clear: both">Para solucionar llega <strong>zInject</strong>. <br />Para usarlo, definimos un atributo que hereda de <em>InjectionBaseAttribute</em><em><br /></em></p><p style="clear: both"><em><br /></em></p><pre style="clear: both"> <br />public class TiempoAttribute : InjectionBaseAttribute<br /> {<br /> public TiempoAttribute() <br /> { <br /> }<br /></pre><pre style="clear: both"> public override void BeforeExecute(string method, object target)<br /> {<br /> Empezo(method);<br /> }<br /></pre><pre style="clear: both"> public override void AfterExecute(string method, object target) <br /> {<br /> Termino(method); <br /> }<br /> }<br /><br /></pre><p style="clear: both">Después, simplemente agregamos el atributo a los métodos que se desea:</p><pre style="clear: both"><br />public class M<br />{<br /> [Tiempo]<br /> public void M1()<br /> {<br /> ...<br /> }<br /> <br /> [Tiempo]<br /> public void M2()<br /> {<br /> ...<br /> }<br /> <br /> [Tiempo]<br /> public void M3()<br /> {<br /> ...<br /> }<br />}<br /><br /></pre><p style="clear: both">Ahora, dirán... Todo muy lindo, pero... ¿Cómo se ejecuta el código del atributo?<br /><br />Para poder hacer esto hay que ejecutar el <em>injector</em> 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<br /><br /></p><p style="clear: both">To Do:</p><ul style="clear: both"><li>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.</li><li>Poder customizar cuales atributos aplicar y cuales no<br /></li><li>UI para Windows/OS X/Linux<br /></li><li>Quitar dependencias contra librerías externas</li></ul><p style="clear: both">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.</p><p style="clear: both"><a href="http://zInject.codeplex.com" title="zInject" target="_blank">http://zInject.codeplex.com</a></p><p style="clear: both">Cualquier sugerencia es bienvenida!</p><p style="clear: both">Saludos!<br /><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com1tag:blogger.com,1999:blog-3033548414831637355.post-79620176193308925152009-10-08T15:17:00.001-03:002009-10-08T15:17:32.456-03:00Interoperabilidad de WebServices con certificados entre .NET con WSE y Java<p style="clear: both">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.</p><p style="clear: both">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.</p><p style="clear: both">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 <em>supuestamente</em> el Subject Key Identifier del certificado necesario para desencriptar el mensaje.</p><p style="clear: both">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 <em>gran problema gran</em> era que los hashes eran calculados de forma distinta!</p><p style="clear: both">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).</p><p style="clear: both">Para mas información: <a href="http://support.microsoft.com/kb/922779/en-us" target="_blank">http://support.microsoft.com/kb/922779/en-us</a> (el problema no es <em>exactamente</em> el mismo, pero el approach para solucionarlo es muy similar).</p><p style="clear: both">Saludos!</p><p style="clear: both"><strong>Zaiden</strong></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com2tag:blogger.com,1999:blog-3033548414831637355.post-43154938862980045912009-10-04T19:24:00.001-03:002009-10-04T19:24:58.291-03:00WPF y VMWare Fusion<p style="clear: both">Si alguna vez tratan de usar WPF desde una maquina virtual en VMWare Fusion, notarán que la aplicación se torna inusable.<br />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:<br />HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration<br />y seteando su valor a 1.</p><p style="clear: both">Fuente: <a href="http://blog.joachim.at/?p=19" target="_blank">http://blog.joachim.at/?p=19</a><br /><br /></p><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0tag:blogger.com,1999:blog-3033548414831637355.post-84539352026963811142009-09-27T23:17:00.001-03:002009-09-27T23:17:56.111-03:00Extensiones para MonobjcAca 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.<br /><div><br /><a href="http://www.mediafire.com/download.php?00izmomfwnn" target="_blank">Fuentes de zPod.Objc</a></div><div><br />Saludos!<br />Z</div><br class='final-break' style='clear: both' />Zaidenhttp://www.blogger.com/profile/09059359984662336924noreply@blogger.com0